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'; class StreamApiLocalImpl extends StreamApiRepository { StreamApiLocalImpl(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.disconnectUser(); await _client.connectUser( User(id: user.id!, extraData: extraData as Map), token, ); return user; } @override Future> getChatUsers() async { final result = await _client.queryUsers(); final chatUsers = result.users .where((element) => element.id != _client.state.currentUser!.id) .map( (e) => ChatUser( id: e.id, name: e.name, image: e.extraData['image'] as String?, ), ) .toList(); return chatUsers; } @override Future getToken(String userId) async { return _client.devToken(userId).rawValue; } @override Future createGroupChat( String channelId, String? name, List? members, {String? image}) async { final channel = _client.channel('messaging', id: channelId, extraData: { 'name': name!, 'image': image!, 'members': [_client.state.currentUser!.id, ...members!], }); await channel.watch(); return channel; } @override Future createSimpleChat(String? friendId) async { final channel = _client.channel('messaging', id: '${_client.state.currentUser!.id.hashCode}${friendId.hashCode}', extraData: { 'members': [ friendId, _client.state.currentUser!.id, ], }); await channel.watch(); return channel; } @override Future logout() { return _client.disconnectUser(); } @override Future connectIfExist(String userId) async { final token = await getToken(userId); await _client.connectUser( User(id: userId), token, ); return _client.state.currentUser!.name != userId; } }