Skip to content

Commit 8094b11

Browse files
committed
refactor(Search): improve conversation handling server side
1 parent c6c4bb7 commit 8094b11

File tree

4 files changed

+76
-56
lines changed

4 files changed

+76
-56
lines changed

api/server/routes/search.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,31 @@ router.get('/', async function (req, res) {
5656

5757
if (result.convoMap[message.conversationId]) {
5858
const convo = result.convoMap[message.conversationId];
59+
5960
activeMessages.push({
6061
...message,
6162
title: convo.title,
6263
conversationId: message.conversationId,
63-
cleanedConversationId: cleanUpPrimaryKeyValue(message.conversationId),
64-
searchMetadata: {
65-
matchScore: message._score,
66-
highlightedContent: message._formatted?.text,
67-
matchedTerms: message._matchesInfo,
68-
},
64+
model: convo.model,
6965
});
7066
}
7167
}
7268

7369
const activeConversations = [];
7470
for (const convId in result.convoMap) {
7571
const convo = result.convoMap[convId];
72+
73+
if (convo.isArchived) {
74+
continue;
75+
}
76+
7677
activeConversations.push({
7778
title: convo.title,
7879
user: convo.user,
7980
conversationId: convo.conversationId,
81+
endpoint: convo.endpoint,
82+
endpointType: convo.endpointType,
83+
model: convo.model,
8084
});
8185
}
8286

client/src/components/Chat/Messages/SearchMessage.tsx

Lines changed: 53 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10,68 +10,73 @@ import SubRow from './SubRow';
1010
import { cn } from '~/utils';
1111
import store from '~/store';
1212

13+
const MessageAvatar = ({ iconData }: { iconData: TMessageIcon }) => (
14+
<div className="relative flex flex-shrink-0 flex-col items-end">
15+
<div className="pt-0.5">
16+
<div className="flex h-6 w-6 items-center justify-center overflow-hidden rounded-full">
17+
<Icon iconData={iconData} />
18+
</div>
19+
</div>
20+
</div>
21+
);
22+
23+
const MessageBody = ({ message, messageLabel, fontSize }) => (
24+
<div
25+
className={cn('relative flex w-11/12 flex-col', message.isCreatedByUser ? '' : 'agent-turn')}
26+
>
27+
<div className={cn('select-none font-semibold', fontSize)}>{messageLabel}</div>
28+
<SearchContent message={message} />
29+
<SubRow classes="text-xs">
30+
<MinimalHoverButtons message={message} />
31+
<SearchButtons message={message} />
32+
</SubRow>
33+
</div>
34+
);
35+
1336
export default function Message({ message }: Pick<TMessageProps, 'message'>) {
1437
const UsernameDisplay = useRecoilValue<boolean>(store.UsernameDisplay);
1538
const fontSize = useRecoilValue(store.fontSize);
1639
const { user } = useAuthContext();
1740
const localize = useLocalize();
1841

19-
const iconData: TMessageIcon = useMemo(
20-
() => ({
21-
endpoint: message?.endpoint,
22-
model: message?.model,
23-
iconURL: message?.iconURL ?? '',
24-
isCreatedByUser: message?.isCreatedByUser,
25-
}),
26-
[message?.model, message?.iconURL, message?.endpoint, message?.isCreatedByUser],
27-
);
28-
2942
if (!message) {
3043
return null;
3144
}
3245

33-
const { isCreatedByUser } = message;
46+
const iconData: TMessageIcon = useMemo(
47+
() => ({
48+
endpoint: message.endpoint,
49+
model: message.model,
50+
iconURL: message.iconURL ?? '',
51+
isCreatedByUser: message.isCreatedByUser,
52+
}),
53+
[message.endpoint, message.model, message.iconURL, message.isCreatedByUser],
54+
);
3455

35-
let messageLabel = '';
36-
if (isCreatedByUser) {
37-
messageLabel = UsernameDisplay
38-
? (user?.name ?? '') || (user?.username ?? '')
39-
: localize('com_user_message');
40-
} else {
41-
messageLabel = message.sender ?? '';
42-
}
56+
const messageLabel = useMemo(() => {
57+
if (message.isCreatedByUser) {
58+
return UsernameDisplay
59+
? (user?.name ?? '') || (user?.username ?? '')
60+
: localize('com_user_message');
61+
}
62+
return message.sender ?? '';
63+
}, [
64+
message.isCreatedByUser,
65+
message.sender,
66+
UsernameDisplay,
67+
user?.name,
68+
user?.username,
69+
localize,
70+
]);
4371

4472
return (
45-
<>
46-
<div className="text-token-text-primary w-full border-0 bg-transparent dark:border-0 dark:bg-transparent">
47-
<div className="m-auto justify-center p-4 py-2 md:gap-6 ">
48-
<div className="final-completion group mx-auto flex flex-1 gap-3 md:max-w-3xl md:px-5 lg:max-w-[40rem] lg:px-1 xl:max-w-[48rem] xl:px-5">
49-
<div className="relative flex flex-shrink-0 flex-col items-end">
50-
<div>
51-
<div className="pt-0.5">
52-
<div className="flex h-6 w-6 items-center justify-center overflow-hidden rounded-full">
53-
<Icon iconData={iconData} />
54-
</div>
55-
</div>
56-
</div>
57-
</div>
58-
<div
59-
className={cn('relative flex w-11/12 flex-col', isCreatedByUser ? '' : 'agent-turn')}
60-
>
61-
<div className={cn('select-none font-semibold', fontSize)}>{messageLabel}</div>
62-
<div className="flex-col gap-1 md:gap-3">
63-
<div className="flex max-w-full flex-grow flex-col gap-0">
64-
<SearchContent message={message} />
65-
</div>
66-
</div>
67-
<SubRow classes="text-xs">
68-
<MinimalHoverButtons message={message} />
69-
<SearchButtons message={message} />
70-
</SubRow>
71-
</div>
72-
</div>
73+
<div className="text-token-text-primary w-full bg-transparent">
74+
<div className="m-auto p-4 py-2 md:gap-6">
75+
<div className="final-completion group mx-auto flex flex-1 gap-3 md:max-w-3xl md:px-5 lg:max-w-[40rem] lg:px-1 xl:max-w-[48rem] xl:px-5">
76+
<MessageAvatar iconData={iconData} />
77+
<MessageBody message={message} messageLabel={messageLabel} fontSize={fontSize} />
7378
</div>
7479
</div>
75-
</>
80+
</div>
7681
);
7782
}

client/src/routes/Search.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useToastContext, useSearchContext, useFileMapContext } from '~/Provider
44
import MinimalMessagesWrapper from '~/components/Chat/Messages/MinimalMessages';
55
import SearchMessage from '~/components/Chat/Messages/SearchMessage';
66
import { useNavScrolling, useLocalize } from '~/hooks';
7+
import { Spinner } from '~/components';
78
import { buildTree } from '~/utils';
89

910
export default function Search() {
@@ -37,8 +38,17 @@ export default function Search() {
3738
return null;
3839
}
3940

40-
if (searchQueryRes.isInitialLoading) {
41-
return null;
41+
// TODO: update this
42+
if (
43+
searchQueryRes.isInitialLoading ||
44+
searchQueryRes.isLoading ||
45+
searchQueryRes.isFetchingNextPage
46+
) {
47+
return (
48+
<div className="absolute inset-0 flex items-center justify-center">
49+
<Spinner className="h-72 w-72" />
50+
</div>
51+
);
4252
}
4353

4454
return (

packages/data-provider/src/types/queries.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export type MinimalConversation = Pick<
2727

2828
export type ConversationListResponse = {
2929
conversations: MinimalConversation[];
30+
mwssages?: s.TMessage[];
3031
nextCursor: string | null;
3132
};
3233

0 commit comments

Comments
 (0)