Skip to content
This repository was archived by the owner on Jan 29, 2026. It is now read-only.

Commit 74cf94b

Browse files
committed
migrate: get messages next token > chat message context 내 prevToken으로 마이그레이션
1 parent 2a7cb66 commit 74cf94b

File tree

4 files changed

+35
-17
lines changed

4 files changed

+35
-17
lines changed

packages/tds-widget/src/chat/chat/chat-room-messages/chat-api-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export class ChatApiService<T = UserType> {
6868
backward?: boolean
6969
lastMessageId: number | string | null
7070
}): Promise<
71-
| { messages: ChatMessageInterface<T>[]; hasNext: boolean }
71+
| { messages: ChatMessageInterface<T>[]; nextToken?: number }
7272
| ChatMessageInterface<T>[] // legacy API
7373
> {
7474
return this.fetcher(

packages/tds-widget/src/chat/chat/chat-room-messages/chat-message-context.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { ChatFetcher, ChatApiService } from './chat-api-service'
2424

2525
export interface ChatMessagesProviderProps<T = UserType> {
2626
messages?: ChatMessageInterface<T>[]
27-
hasPrevMessage?: boolean
27+
prevToken?: ChatMessageInterface<T>['id']
2828
welcomeMessages?: WelcomeMessageInterface<T>[]
2929
fetcher: ChatFetcher
3030
/**
@@ -41,6 +41,7 @@ export interface ChatMessagesContextValue<T = UserType> {
4141
pendingMessages: UnsentMessage<ChatMessageInterface<T>>[]
4242
failedMessages: UnsentMessage<ChatMessageInterface<T>>[]
4343
hasPrevMessage: boolean
44+
prevToken?: ChatMessageInterface<T>['id']
4445
dispatch: Dispatch<
4546
MessagesAction<ChatMessageInterface<T>, ChatMessageInterface<T>['id']>
4647
>
@@ -56,7 +57,7 @@ export const ChatMessagesContext =
5657
export function ChatMessagesProvider<T = UserType>({
5758
welcomeMessages = [],
5859
messages: initialMessages = [],
59-
hasPrevMessage: initialPrevMessage,
60+
prevToken: initialPrevToken,
6061
fetcher,
6162
useTripleChat = false,
6263
children,
@@ -69,7 +70,7 @@ export function ChatMessagesProvider<T = UserType>({
6970
)
7071

7172
const [
72-
{ messages, pendingMessages, failedMessages, hasPrevMessage },
73+
{ messages, pendingMessages, failedMessages, hasPrevMessage, prevToken },
7374
dispatch,
7475
] = useMessagesReducer<
7576
ChatMessageInterface<T>,
@@ -84,7 +85,7 @@ export function ChatMessagesProvider<T = UserType>({
8485
})
8586
} else {
8687
let messages = initialMessages
87-
let hasPrevMessage: boolean | undefined = initialPrevMessage
88+
let prevToken: number | undefined | null = initialPrevToken
8889

8990
if (!messages.length) {
9091
try {
@@ -95,9 +96,10 @@ export function ChatMessagesProvider<T = UserType>({
9596
})
9697
if ('messages' in result) {
9798
messages = result.messages
98-
hasPrevMessage = result.hasNext
99+
prevToken = result.nextToken
99100
} else {
100101
messages = result
102+
prevToken = null
101103
}
102104
// eslint-disable-next-line @typescript-eslint/no-unused-vars
103105
} catch (error) {}
@@ -106,7 +108,9 @@ export function ChatMessagesProvider<T = UserType>({
106108
dispatch({
107109
action: MessagesActions.INIT,
108110
messages,
109-
hasPrevMessage: hasPrevMessage ?? messages.length > 0,
111+
...(prevToken !== null && {
112+
prevToken,
113+
}),
110114
})
111115
}
112116
}
@@ -115,7 +119,8 @@ export function ChatMessagesProvider<T = UserType>({
115119
messages,
116120
pendingMessages,
117121
failedMessages,
118-
hasPrevMessage,
122+
hasPrevMessage: hasPrevMessage || !!prevToken,
123+
prevToken,
119124
dispatch,
120125
welcomeMessages,
121126
initMessages,

packages/tds-widget/src/chat/chat/chat-room-messages/use-chat-room-messages.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export function useChatMessages<T = UserType>(
6262
pendingMessages,
6363
failedMessages,
6464
hasPrevMessage,
65+
prevToken,
6566
dispatch,
6667
initMessages,
6768
welcomeMessages,
@@ -292,24 +293,24 @@ export function useChatMessages<T = UserType>(
292293
isCreatedChatRoom(room) &&
293294
isIntersecting &&
294295
!firstRenderForPrevScrollRef.current &&
295-
hasPrevMessage &&
296+
(hasPrevMessage || !!prevToken) &&
296297
messages.length > 0
297298

298299
if (scrollable) {
299300
const prevScrollY = getScrollContainerHeight()
300301
let pastMessages: ChatMessageInterface<T>[] = []
301-
let hasPrevMessage: boolean | undefined
302+
let prevToken: number | undefined | null
302303

303304
try {
304305
const result = await api.getMessages({
305306
roomId: room.id,
306-
lastMessageId: messages[0].id,
307+
lastMessageId: prevToken ?? messages[0].id,
307308
backward: true,
308309
})
309310

310311
if ('messages' in result) {
311312
pastMessages = result.messages
312-
hasPrevMessage = result.hasNext
313+
prevToken = result.nextToken
313314
} else {
314315
pastMessages = result
315316
}
@@ -320,7 +321,9 @@ export function useChatMessages<T = UserType>(
320321
dispatch({
321322
action: MessagesActions.PAST,
322323
messages: pastMessages,
323-
hasPrevMessage,
324+
...(prevToken !== null && {
325+
prevToken,
326+
}),
324327
})
325328
setScrollY(prevScrollY)
326329
} else if (isIntersecting && firstRenderForPrevScrollRef.current) {

packages/tds-widget/src/chat/chat/messages-reducer.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ export interface MessagesState<Message extends MessageBase<Id>, Id = string> {
3232
failedMessages: UnsentMessage<Message, Id>[]
3333
hasPrevMessage: boolean
3434
hasNextMessage: boolean
35+
/**
36+
* [nol-chat] 다음 페이지 요청 cursor
37+
* nol-chat에서는 hasPrevMessage 대신 prevToken을 사용
38+
*/
39+
prevToken?: Id
3540
}
3641

3742
export const initialMessagesState = {
@@ -46,12 +51,12 @@ export type MessagesAction<Message extends MessageBase<Id>, Id = string> =
4651
| {
4752
action: MessagesActions.INIT
4853
messages: Message[]
49-
hasPrevMessage?: boolean
54+
prevToken?: Id
5055
}
5156
| {
5257
action: MessagesActions.PAST
5358
messages: Message[]
54-
hasPrevMessage?: boolean
59+
prevToken?: Id
5560
}
5661
| {
5762
action: MessagesActions.NEW
@@ -95,14 +100,19 @@ function MessagesReducer<Message extends MessageBase<Id>, Id = string>(
95100
return {
96101
...state,
97102
messages: action.messages,
98-
hasPrevMessage: action.hasPrevMessage ?? state.hasPrevMessage,
103+
prevToken: action.prevToken,
104+
...('prevToken' in action && { hasPrevMessage: !!action.prevToken }),
99105
}
100106

101107
case MessagesActions.PAST:
102108
return {
103109
...state,
104110
messages: [...action.messages, ...state.messages],
105-
hasPrevMessage: action.hasPrevMessage ?? action.messages.length > 0,
111+
hasPrevMessage:
112+
'prevToken' in action
113+
? !!action.prevToken
114+
: action.messages.length > 0,
115+
prevToken: action.prevToken,
106116
}
107117

108118
case MessagesActions.NEW:

0 commit comments

Comments
 (0)