diff --git a/lib/src/class/supabase_chat_core.dart b/lib/src/class/supabase_chat_core.dart index d9b17c4..588ff2e 100644 --- a/lib/src/class/supabase_chat_core.dart +++ b/lib/src/class/supabase_chat_core.dart @@ -13,9 +13,7 @@ class SupabaseChatCore { SupabaseChatCore._privateConstructor() { Supabase.instance.client.auth.onAuthStateChange.listen((data) { supabaseUser = data.session?.user; - _currentUserOnlineStatusChannel = supabaseUser != null - ? getUserOnlineStatusChannel(supabaseUser!.id) - : null; + _currentUserOnlineStatusChannel = supabaseUser != null ? getUserOnlineStatusChannel(supabaseUser!.id) : null; }); } @@ -34,8 +32,7 @@ class SupabaseChatCore { User? supabaseUser = Supabase.instance.client.auth.currentUser; /// Returns user online status realtime channel . - RealtimeChannel getUserOnlineStatusChannel(String uid) => - client.channel('${config.realtimeOnlineUserPrefixChannel}$uid'); + RealtimeChannel getUserOnlineStatusChannel(String uid) => client.channel('${config.realtimeOnlineUserPrefixChannel}$uid'); /// Returns a current user online status realtime channel . RealtimeChannel? _currentUserOnlineStatusChannel; @@ -79,8 +76,7 @@ class SupabaseChatCore { } /// Singleton instance. - static final SupabaseChatCore instance = - SupabaseChatCore._privateConstructor(); + static final SupabaseChatCore instance = SupabaseChatCore._privateConstructor(); /// Gets proper [SupabaseClient] instance. SupabaseClient get client => Supabase.instance.client; @@ -114,8 +110,7 @@ class SupabaseChatCore { final roomUsers = [types.User.fromJson(currentUser)] + users; - final room = - await client.schema(config.schema).from(config.roomsTableName).insert({ + final room = await client.schema(config.schema).from(config.roomsTableName).insert({ 'createdAt': DateTime.now().millisecondsSinceEpoch, 'imageUrl': imageUrl, 'metadata': metadata, @@ -156,13 +151,7 @@ class SupabaseChatCore { // this will make it easy to find the room if exist and make one read only. final userIds = [su.id, otherUser.id]..sort(); - final roomQuery = await client - .schema(config.schema) - .from(config.roomsTableName) - .select() - .eq('type', types.RoomType.direct.toShortString()) - .eq('userIds', userIds) - .limit(1); + final roomQuery = await client.schema(config.schema).from(config.roomsTableName).select().eq('type', types.RoomType.direct.toShortString()).eq('userIds', userIds).limit(1); // Check if room already exist. if (roomQuery.isNotEmpty) { final room = (await processRoomsRows( @@ -187,8 +176,7 @@ class SupabaseChatCore { final users = [types.User.fromJson(currentUser), otherUser]; // Create new room with sorted user ids array. - final room = - await client.schema(config.schema).from(config.roomsTableName).insert({ + final room = await client.schema(config.schema).from(config.roomsTableName).insert({ 'createdAt': DateTime.now().millisecondsSinceEpoch, 'imageUrl': null, 'metadata': metadata, @@ -221,31 +209,17 @@ class SupabaseChatCore { /// Removes message. Future deleteMessage(String roomId, String messageId) async { - await client - .schema(config.schema) - .from(config.messagesTableName) - .delete() - .eq('roomId', roomId) - .eq('id', messageId); + await client.schema(config.schema).from(config.messagesTableName).delete().eq('roomId', roomId).eq('id', messageId); } /// Removes room. Future deleteRoom(String roomId) async { - await client - .schema(config.schema) - .from(config.roomsTableName) - .delete() - .eq('id', roomId); + await client.schema(config.schema).from(config.roomsTableName).delete().eq('id', roomId); } /// Returns a stream of messages from Supabase for a given room. Stream> messages(types.Room room) { - final query = client - .schema(config.schema) - .from(config.messagesTableName) - .stream(primaryKey: ['id']) - .eq('roomId', int.parse(room.id)) - .order('createdAt', ascending: false); + final query = client.schema(config.schema).from(config.messagesTableName).stream(primaryKey: ['id']).eq('roomId', int.parse(room.id)).order('createdAt', ascending: false); return query.map( (snapshot) => snapshot.fold>( [], @@ -258,8 +232,7 @@ class SupabaseChatCore { data['id'] = data['id'].toString(); data['roomId'] = data['roomId'].toString(); final newMessage = types.Message.fromJson(data); - final index = - previousMessages.indexWhere((msg) => msg.id == newMessage.id); + final index = previousMessages.indexWhere((msg) => msg.id == newMessage.id); if (index != -1) { previousMessages[index] = newMessage; } else { @@ -275,12 +248,7 @@ class SupabaseChatCore { Stream room(String roomId) { final fu = supabaseUser; if (fu == null) return const Stream.empty(); - return client - .schema(config.schema) - .from(config.roomsTableName) - .stream(primaryKey: ['id']) - .eq('id', roomId) - .asyncMap( + return client.schema(config.schema).from(config.roomsTableName).stream(primaryKey: ['id']).eq('id', roomId).asyncMap( (doc) => processRoomRow( doc.first, fu, @@ -294,10 +262,7 @@ class SupabaseChatCore { /// Returns a stream of online user state from Supabase Realtime. Stream userOnlineStatus(String uid) { final controller = StreamController(); - UserOnlineStatus userStatus(List presences, String uid) => - presences.map((e) => e.payload['uid']).contains(uid) - ? UserOnlineStatus.online - : UserOnlineStatus.offline; + UserOnlineStatus userStatus(List presences, String uid) => presences.map((e) => e.payload['uid']).contains(uid) ? UserOnlineStatus.online : UserOnlineStatus.offline; getUserOnlineStatusChannel(uid).onPresenceJoin((payload) { controller.sink.add(userStatus(payload.newPresences, uid)); }).onPresenceLeave((payload) { @@ -346,23 +311,10 @@ class SupabaseChatCore { controller.sink.add(roomsList); } - final collection = orderByUpdatedAt - ? client - .schema(config.schema) - .from(config.roomsTableName) - .select() - .order('updatedAt', ascending: false) - : client.schema(config.schema).from(config.roomsTableName).select(); + final collection = orderByUpdatedAt ? client.schema(config.schema).from(config.roomsTableName).select().order('updatedAt', ascending: false) : client.schema(config.schema).from(config.roomsTableName).select(); collection.then(onData); - client - .channel('${config.schema}:${config.roomsTableName}') - .onPostgresChanges( - event: PostgresChangeEvent.all, - schema: config.schema, - table: config.roomsTableName, - callback: (payload) => onData([payload.newRecord])) - .subscribe(); + client.channel('${config.schema}:${config.roomsTableName}').onPostgresChanges(event: PostgresChangeEvent.all, schema: config.schema, table: config.roomsTableName, callback: (payload) => onData([payload.newRecord])).subscribe(); return controller.stream; } @@ -408,16 +360,9 @@ class SupabaseChatCore { messageMap['createdAt'] = DateTime.now().millisecondsSinceEpoch; messageMap['updatedAt'] = DateTime.now().millisecondsSinceEpoch; - await client - .schema(config.schema) - .from(config.messagesTableName) - .insert(messageMap); + await client.schema(config.schema).from(config.messagesTableName).insert(messageMap); - await client - .schema(config.schema) - .from(config.roomsTableName) - .update({'updatedAt': DateTime.now().millisecondsSinceEpoch}).eq( - 'id', roomId); + await client.schema(config.schema).from(config.roomsTableName).update({'updatedAt': DateTime.now().millisecondsSinceEpoch}).eq('id', roomId); } } @@ -434,12 +379,7 @@ class SupabaseChatCore { //messageMap['authorId'] = message.author.id; messageMap['updatedAt'] = DateTime.now().millisecondsSinceEpoch; - await client - .schema(config.schema) - .from(config.messagesTableName) - .update(messageMap) - .eq('roomId', roomId) - .eq('id', message.id); + await client.schema(config.schema).from(config.messagesTableName).update(messageMap).eq('roomId', roomId).eq('id', message.id); } /// Updates a room in the Supabase. Accepts any room. @@ -448,11 +388,7 @@ class SupabaseChatCore { if (supabaseUser == null) return; final roomMap = room.toJson(); - roomMap.removeWhere((key, value) => - key == 'createdAt' || - key == 'id' || - key == 'lastMessages' || - key == 'users'); + roomMap.removeWhere((key, value) => key == 'createdAt' || key == 'id' || key == 'lastMessages' || key == 'users'); if (room.type == types.RoomType.direct) { roomMap['imageUrl'] = null; @@ -462,33 +398,22 @@ class SupabaseChatCore { roomMap['lastMessages'] = room.lastMessages?.map((m) { final messageMap = m.toJson(); - messageMap.removeWhere((key, value) => - key == 'author' || - key == 'createdAt' || - key == 'id' || - key == 'updatedAt'); + messageMap.removeWhere((key, value) => key == 'author' || key == 'createdAt' || key == 'id' || key == 'updatedAt'); messageMap['authorId'] = m.author.id; return messageMap; }).toList(); - roomMap['updatedAt'] = DateTime.now(); + roomMap['updatedAt'] = DateTime.now().millisecondsSinceEpoch; roomMap['userIds'] = room.users.map((u) => u.id).toList(); - await client - .schema(config.schema) - .from(config.roomsTableName) - .update(roomMap) - .eq('id', room.id); + await client.schema(config.schema).from(config.roomsTableName).update(roomMap).eq('id', room.id); } /// Returns a stream of all users from Supabase. Stream> users() { if (supabaseUser == null) return const Stream.empty(); - return client - .schema(config.schema) - .from(config.usersTableName) - .stream(primaryKey: ['id']).map( + return client.schema(config.schema).from(config.usersTableName).stream(primaryKey: ['id']).map( (snapshot) => snapshot.fold>( [], (previousValue, data) {