Spaces:
Paused
Paused
| import type { messagingApi } from "@line/bot-sdk"; | |
| export type LineReplyMessage = messagingApi.TextMessage; | |
| export type SendLineReplyChunksParams = { | |
| to: string; | |
| chunks: string[]; | |
| quickReplies?: string[]; | |
| replyToken?: string | null; | |
| replyTokenUsed?: boolean; | |
| accountId?: string; | |
| replyMessageLine: ( | |
| replyToken: string, | |
| messages: messagingApi.Message[], | |
| opts?: { accountId?: string }, | |
| ) => Promise<unknown>; | |
| pushMessageLine: (to: string, text: string, opts?: { accountId?: string }) => Promise<unknown>; | |
| pushTextMessageWithQuickReplies: ( | |
| to: string, | |
| text: string, | |
| quickReplies: string[], | |
| opts?: { accountId?: string }, | |
| ) => Promise<unknown>; | |
| createTextMessageWithQuickReplies: (text: string, quickReplies: string[]) => LineReplyMessage; | |
| onReplyError?: (err: unknown) => void; | |
| }; | |
| export async function sendLineReplyChunks( | |
| params: SendLineReplyChunksParams, | |
| ): Promise<{ replyTokenUsed: boolean }> { | |
| const hasQuickReplies = Boolean(params.quickReplies?.length); | |
| let replyTokenUsed = Boolean(params.replyTokenUsed); | |
| if (params.chunks.length === 0) { | |
| return { replyTokenUsed }; | |
| } | |
| if (params.replyToken && !replyTokenUsed) { | |
| try { | |
| const replyBatch = params.chunks.slice(0, 5); | |
| const remaining = params.chunks.slice(replyBatch.length); | |
| const replyMessages: LineReplyMessage[] = replyBatch.map((chunk) => ({ | |
| type: "text", | |
| text: chunk, | |
| })); | |
| if (hasQuickReplies && remaining.length === 0 && replyMessages.length > 0) { | |
| const lastIndex = replyMessages.length - 1; | |
| replyMessages[lastIndex] = params.createTextMessageWithQuickReplies( | |
| replyBatch[lastIndex], | |
| params.quickReplies!, | |
| ); | |
| } | |
| await params.replyMessageLine(params.replyToken, replyMessages, { | |
| accountId: params.accountId, | |
| }); | |
| replyTokenUsed = true; | |
| for (let i = 0; i < remaining.length; i += 1) { | |
| const isLastChunk = i === remaining.length - 1; | |
| if (isLastChunk && hasQuickReplies) { | |
| await params.pushTextMessageWithQuickReplies( | |
| params.to, | |
| remaining[i], | |
| params.quickReplies!, | |
| { accountId: params.accountId }, | |
| ); | |
| } else { | |
| await params.pushMessageLine(params.to, remaining[i], { | |
| accountId: params.accountId, | |
| }); | |
| } | |
| } | |
| return { replyTokenUsed }; | |
| } catch (err) { | |
| params.onReplyError?.(err); | |
| replyTokenUsed = true; | |
| } | |
| } | |
| for (let i = 0; i < params.chunks.length; i += 1) { | |
| const isLastChunk = i === params.chunks.length - 1; | |
| if (isLastChunk && hasQuickReplies) { | |
| await params.pushTextMessageWithQuickReplies( | |
| params.to, | |
| params.chunks[i], | |
| params.quickReplies!, | |
| { accountId: params.accountId }, | |
| ); | |
| } else { | |
| await params.pushMessageLine(params.to, params.chunks[i], { | |
| accountId: params.accountId, | |
| }); | |
| } | |
| } | |
| return { replyTokenUsed }; | |
| } | |