diff --git a/advanced/dapps/chat-demo-agent/src/app/api/send-message/request-validation.ts b/advanced/dapps/chat-demo-agent/src/app/api/send-message/request-validation.ts index 9478387cf..460b5eddb 100644 --- a/advanced/dapps/chat-demo-agent/src/app/api/send-message/request-validation.ts +++ b/advanced/dapps/chat-demo-agent/src/app/api/send-message/request-validation.ts @@ -10,7 +10,7 @@ const MAX_MESSAGE_LENGTH = 300; /** * Maximum allowed number of messages in history to prevent memory issues */ -const MAX_HISTORY_LENGTH = 6; +const MAX_HISTORY_LENGTH = 20; /** * Type guard to validate the structure and content of message history diff --git a/advanced/dapps/chat-demo-agent/src/app/api/send-message/route.ts b/advanced/dapps/chat-demo-agent/src/app/api/send-message/route.ts index ad89a74ab..1c18bdf89 100644 --- a/advanced/dapps/chat-demo-agent/src/app/api/send-message/route.ts +++ b/advanced/dapps/chat-demo-agent/src/app/api/send-message/route.ts @@ -134,7 +134,7 @@ async function handlePost(request: Request) { return NextResponse.json( { status: 'error', - message: `Internal error occurred [${errorCode}]` + message: `Unable to process the request [${errorCode}]` }, { status: 500 } ); diff --git a/advanced/dapps/chat-demo-agent/src/context/ChatContext.tsx b/advanced/dapps/chat-demo-agent/src/context/ChatContext.tsx index 1654d8e27..5e3554cb0 100644 --- a/advanced/dapps/chat-demo-agent/src/context/ChatContext.tsx +++ b/advanced/dapps/chat-demo-agent/src/context/ChatContext.tsx @@ -83,7 +83,7 @@ export const ChatProvider: React.FC<{ children: React.ReactNode }> = ({ children dispatch({ type: 'ADD_MESSAGE', payload: botResponse }); } catch (error) { const errorMessage = createMessage( - `Error: ${error instanceof Error ? error.message : 'Some error occurred'}`, + `Error: ${error instanceof Error ? error.message : 'Unable to process the request'}`, 'system', 'error' ); diff --git a/advanced/dapps/chat-demo-agent/src/lib/chatApi.ts b/advanced/dapps/chat-demo-agent/src/lib/chatApi.ts index 1c4e7f828..43d7d4cc9 100644 --- a/advanced/dapps/chat-demo-agent/src/lib/chatApi.ts +++ b/advanced/dapps/chat-demo-agent/src/lib/chatApi.ts @@ -19,51 +19,35 @@ interface BasicResponse { type SendMessageApiResponse = SwapResponse | BasicResponse; -export const sendChatMessageToApi = async ( - messageWithContext: MessageWithContext -): Promise<{ message: string }> => { - try { - const API_URL = '/api/send-message'; - const response = await fetch(API_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(messageWithContext), - }); - - if (!response.ok) { - const errorData = await response.json(); - const errorMessage = errorData.message || `Failed to get response from server: ${response.status}`; - throw new Error(errorMessage); - } +// Generic function to fetch API with type-safe body +const fetchApi = async ( + url: string, + body: T +): Promise => { + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); - const data: SendMessageApiResponse = await response.json(); - - // Handle response with a transaction link - if ('txLink' in data) { - const statusMessage = data.txLink && data.userOpHash - ? `\n${hiddenTruncateUserOpHash(data.userOpHash)}View details: ${formatLink('Transaction Link', data.txLink)}` - : data.status === 'pending' && data.userOpHash - ? `\nYou can check the status later using the purchase id: ${truncateUserOpHash(data.userOpHash)}` - : ''; - - return { - message: `${data.message}${statusMessage}` - }; - } + if (!response.ok) { + throw new Error(await parseErrorResponse(response)); + } - // Handle basic response - return { - message: data.message - }; + return response; +}; - } catch (error) { - throw new Error( - error instanceof Error - ? error.message - : 'Failed to send message: Unknown error' - ); +const parseErrorResponse = async (response: Response): Promise => { + const errorMessage = `Failed to get response from server: ${response.status}`; + + try { + const errorData = await response.json(); + return errorData.message || errorMessage; + } catch { + const errorText = await response.text(); + return errorText || errorMessage; } }; @@ -75,3 +59,35 @@ const truncateUserOpHash = (hash: string) => `${hash}`; + +const formatApiResponse = (data: SendMessageApiResponse): { message: string } => { + let statusMessage = ''; + + if ('txLink' in data) { + statusMessage = data.txLink && data.userOpHash + ? `\n${hiddenTruncateUserOpHash(data.userOpHash)}View details: ${formatLink('Transaction Link', data.txLink)}` + : data.status === 'pending' && data.userOpHash + ? `\nYou can check the status later using the purchase id: ${truncateUserOpHash(data.userOpHash)}` + : ''; + } + + return { message: `${data.message}${statusMessage}` }; +}; + + +// Main function to send chat message to the API +export const sendChatMessageToApi = async ( + messageWithContext: MessageWithContext +): Promise<{ message: string }> => { + const API_URL = '/api/send-message'; + + try { + const response = await fetchApi(API_URL, messageWithContext); + const data: SendMessageApiResponse = await response.json(); + return formatApiResponse(data); + } catch (error) { + throw new Error( + error instanceof Error ? error.message : 'Failed to send message: Unknown error' + ); + } +}; \ No newline at end of file