Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import 'ui/home/bloc/conversation_filter_unseen_cubit.dart';
import 'ui/home/bloc/conversation_list_bloc.dart';
import 'ui/home/bloc/multi_auth_cubit.dart';
import 'ui/home/bloc/recall_message_bloc.dart';
import 'ui/home/bloc/recent_conversation_cubit.dart';
import 'ui/home/bloc/slide_category_cubit.dart';
import 'ui/home/conversation/conversation_page.dart';
import 'ui/home/home.dart';
Expand Down Expand Up @@ -152,6 +153,9 @@ class _Providers extends StatelessWidget {
BlocProvider(
create: (BuildContext context) => ResponsiveNavigatorCubit(),
),
BlocProvider(
create: (BuildContext context) => RecentConversationCubit(),
),
BlocProvider(
create: (BuildContext context) => ConversationCubit(
accountServer: accountServer,
Expand Down
14 changes: 14 additions & 0 deletions lib/db/dao/conversation_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,20 @@ class ConversationDao extends DatabaseAccessor<MixinDatabase>
Limit(limit, null));
}

Selectable<SearchConversationItem> searchConversationItemByIn(
List<String> ids) =>
db.searchConversationItemByIn(ids, (conversation, _, __, ___) {
if (ids.isEmpty) return ignoreOrderBy;

final conversationId =
'${conversation.aliasedName}.${conversation.conversationId.$name}';

return OrderBy([
OrderingTerm.desc(CustomExpression(
'CASE $conversationId ${ids.asMap().entries.map((e) => "WHEN '${e.value}' THEN ${e.key}").join(' ')} END'))
]);
});

Selectable<String?> announcement(String conversationId) =>
(db.selectOnly(db.conversations)
..addColumns([db.conversations.announcement])
Expand Down
60 changes: 38 additions & 22 deletions lib/db/dao/user_dao.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,35 +102,51 @@ class UserDao extends DatabaseAccessor<MixinDatabase> with _$UserDaoMixin {
required String id,
required String username,
required String identityNumber,
bool isIncludeConversation = false,
SlideCategoryState? category,
}) {
if (category?.type == SlideCategoryType.circle) {
final circleId = category!.id;
return db.fuzzySearchUserInCircle(id, username, identityNumber, circleId);
return db.fuzzySearchUserInCircle((_, conversation, __) {
if (!isIncludeConversation) {
return conversation.status.isNull();
}
return const Constant(true);
}, id, username, identityNumber, circleId);
}
return db.fuzzySearchUser(
id, username.trim().escapeSql(), identityNumber.trim().escapeSql(),
(users) {
switch (category?.type) {
case null:
case SlideCategoryType.chats:
(_, conversation) {
if (!isIncludeConversation) {
return conversation.status.isNull();
}
return const Constant(true);
case SlideCategoryType.contacts:
return users.relationship.equalsValue(sdk.UserRelationship.friend) &
users.appId.isNull();
case SlideCategoryType.groups:
return const Constant(false);
case SlideCategoryType.bots:
return users.appId.isNotNull();
case SlideCategoryType.strangers:
return users.relationship.equalsValue(sdk.UserRelationship.stranger) &
users.appId.isNull();
case SlideCategoryType.circle:
case SlideCategoryType.setting:
assert(false, 'Unsupported category: $category');
return const Constant(false);
}
});
},
id,
username.trim().escapeSql(),
identityNumber.trim().escapeSql(),
(users, _) {
switch (category?.type) {
case null:
case SlideCategoryType.chats:
return const Constant(true);
case SlideCategoryType.contacts:
return users.relationship
.equalsValue(sdk.UserRelationship.friend) &
users.appId.isNull();
case SlideCategoryType.groups:
return const Constant(false);
case SlideCategoryType.bots:
return users.appId.isNotNull();
case SlideCategoryType.strangers:
return users.relationship
.equalsValue(sdk.UserRelationship.stranger) &
users.appId.isNull();
case SlideCategoryType.circle:
case SlideCategoryType.setting:
assert(false, 'Unsupported category: $category');
return const Constant(false);
}
});
}

Selectable<String?> biography(String userId) =>
Expand Down
116 changes: 104 additions & 12 deletions lib/db/mixin_database.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 32 additions & 6 deletions lib/db/moor/dao/conversation.drift
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ FROM conversations AS conversation
WHERE $where
LIMIT 1;


fuzzySearchConversation AS SearchConversationItem:
SELECT conversation.conversation_id AS conversationId,
conversation.icon_url AS groupIconUrl,
Expand All @@ -130,15 +129,17 @@ SELECT conversation.conversation_id AS conversationId,
message.user_id AS senderId,
lastMessageSender.full_name AS senderFullName
FROM conversations conversation
INNER JOIN users owner ON owner.user_id = conversation.owner_id
LEFT JOIN messages message ON conversation.last_message_id = message.message_id
LEFT JOIN users lastMessageSender ON lastMessageSender.user_id = message.user_id
WHERE ((conversation.category = 'GROUP' AND conversation.name LIKE '%' || :query || '%' ESCAPE '\') OR
INNER JOIN users owner ON owner.user_id = conversation.owner_id
LEFT JOIN messages message ON conversation.last_message_id = message.message_id
LEFT JOIN users lastMessageSender ON lastMessageSender.user_id = message.user_id
WHERE (
(
conversation.category = 'GROUP'
AND conversation.name LIKE '%' || :query || '%' ESCAPE '\') OR
(conversation.category = 'CONTACT' AND
(owner.full_name LIKE '%' || :query || '%' ESCAPE '\' OR
owner.identity_number LIKE '%' || :query || '%' ESCAPE '\'))
) AND $where

ORDER BY (conversation.category = 'GROUP' AND conversation.name = :query COLLATE NOCASE)
OR (conversation.category = 'CONTACT'
AND (owner.full_name = :query COLLATE NOCASE
Expand All @@ -147,6 +148,31 @@ ORDER BY (conversation.category = 'GROUP' AND conversation.name = :query COLLATE
message.created_at DESC
limit $limit;

searchConversationItemByIn AS SearchConversationItem:
SELECT conversation.conversation_id AS conversationId,
conversation.icon_url AS groupIconUrl,
conversation.category AS category,
conversation.name AS groupName,
conversation.pin_time AS pinTime,
conversation.mute_until AS muteUntil,
conversation.owner_id AS ownerId,
owner.mute_until AS ownerMuteUntil,
owner.identity_number AS ownerIdentityNumber,
owner.full_name AS fullName,
owner.avatar_url AS avatarUrl,
owner.is_verified AS isVerified,
owner.app_id AS appId,
message.status AS messageStatus,
message.content AS content,
message.category AS contentType,
message.user_id AS senderId,
lastMessageSender.full_name AS senderFullName
FROM conversations conversation
INNER JOIN users owner ON owner.user_id = conversation.owner_id
LEFT JOIN messages message ON conversation.last_message_id = message.message_id
LEFT JOIN users lastMessageSender ON lastMessageSender.user_id = message.user_id
WHERE conversation.conversation_id IN :ids
ORDER BY $order;

fuzzySearchConversationInCircle AS SearchConversationItem:
SELECT conversation.conversation_id AS conversationId,
Expand Down
33 changes: 21 additions & 12 deletions lib/db/moor/dao/user.drift
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,31 @@ SELECT user_id FROM users WHERE user_id IN :userIds;
fuzzySearchUser:
SELECT users.*
FROM users
WHERE user_id != :id AND relationship = 'FRIEND' AND
(full_name LIKE '%' || :username || '%' ESCAPE '\'
OR identity_number LIKE '%' || :identityNumber || '%' ESCAPE '\') AND $filter
LEFT JOIN conversations ON conversations.owner_id = user_id
WHERE $firstFilter
AND user_id != :id
AND relationship = 'FRIEND'
AND (
full_name LIKE '%' || :username || '%' ESCAPE '\'
OR identity_number LIKE ' %' || :identityNumber || ' %' ESCAPE '\') AND $lastFilter
GROUP BY user_id
ORDER BY full_name = :username COLLATE nocase
OR identity_number = :identityNumber COLLATE nocase DESC;

fuzzySearchUserInCircle:
SELECT user.*
FROM users user
LEFT JOIN conversations ON conversations.owner_id = user.user_id
LEFT JOIN circle_conversations circleConversation ON user.user_id = circleConversation.user_id
WHERE conversations.status IS NULL AND user.user_id != :id AND user.relationship = 'FRIEND' AND
(user.full_name LIKE '%' || :username || '%' ESCAPE '\'
OR user.identity_number LIKE '%' || :identityNumber || '%' ESCAPE '\') AND circleConversation.circle_id = :circleId
ORDER BY user.full_name = :username COLLATE nocase
OR user.identity_number = :identityNumber COLLATE nocase DESC;
SELECT users.*
FROM users
LEFT JOIN conversations ON conversations.owner_id = users.user_id
LEFT JOIN circle_conversations circleConversation ON circleConversation.user_id = users.user_id
WHERE $filter
AND users.user_id != :id
AND relationship = 'FRIEND'
AND (
full_name LIKE '%' || :username || '%' ESCAPE '\'
OR identity_number LIKE ' %' || :identityNumber || ' %' ESCAPE '\') AND circleConversation.circle_id = :circleId
GROUP BY users.user_id
ORDER BY full_name = :username COLLATE nocase
OR identity_number = :identityNumber COLLATE nocase DESC;

biographyByIdentityNumber:
SELECT biography FROM users WHERE user_id = :user_id;
Expand Down
Loading