import 'dart:convert'; import 'package:stream_chatter/data/stream_api_repository.dart'; import 'package:stream_chatter/domain/models/chat_user.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:http/http.dart' as http; class StreamApiImpl extends StreamApiRepository { StreamApiImpl(this._client); final StreamChatClient _client; @override Future connectUser(ChatUser user, String token) async { Map extraData = {}; if (user.image != null) { extraData['image'] = user.image; } if (user.name != null) { extraData['name'] = user.name; } await _client.disconnect(); await _client.connectUser( User(id: user.id, extraData: extraData), token, ); return user; } @override Future> getChatUsers() async { final result = await _client.queryUsers(); final chatUsers = result.users .where((element) => element.id != _client.state.user.id) .map( (e) => ChatUser( id: e.id, name: e.name, image: e.extraData['image'], ), ) .toList(); return chatUsers; } @override Future getToken(String userId) async { //TODO: use your own implementation in Production final response = await http.post( 'your_backend_url', body: jsonEncode({'id': userId}), headers: { 'Content-Type': 'application/json; charset=UTF-8', }, ); final token = jsonDecode(response.body)['token']; //In Development mode you can just use : // _client.devToken(userId); return token; } @override Future createGroupChat(String id, String name, List members, {String image}) async { final channel = _client.channel('messaging', id: id, extraData: { 'name': name, 'image': image, 'members': [_client.state.user.id, ...members], }); await channel.watch(); return channel; } @override Future createSimpleChat(String friendId) async { final channel = _client.channel('messaging', id: '${_client.state.user.id.hashCode}${friendId.hashCode}', extraData: { 'members': [ friendId, _client.state.user.id, ], }); await channel.watch(); return channel; } @override Future logout() async { return _client.disconnect(); } @override Future connectIfExist(String userId) async { final token = await getToken(userId); await _client.connectUser( User(id: userId), token, ); return _client.state.user.name != null && _client.state.user.name != userId; } }