From 9fd705b9b84f66ccd8592c5f18208391efade367 Mon Sep 17 00:00:00 2001 From: Hassan El Mghari Date: Wed, 17 Jan 2024 16:38:38 -0800 Subject: [PATCH] design changes to pdf page --- README.md | 8 +- app/document/[id]/document-client.tsx | 132 ++++++++++++-------------- app/document/[id]/page.tsx | 2 +- next.config.js | 10 ++ public/bot-icon.png | Bin 0 -> 6481 bytes public/bot-image.png | Bin 9184 -> 0 bytes public/profile-icon.png | Bin 0 -> 1811 bytes 7 files changed, 78 insertions(+), 74 deletions(-) create mode 100644 public/bot-icon.png delete mode 100644 public/bot-image.png create mode 100644 public/profile-icon.png diff --git a/README.md b/README.md index f645b99..dcbe366 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ ## Todos v1.5 -- [ ] Implement design changes on the pdf page: avatars + chatbox scroll -- [ ] Add header to the pdf page to be able to go back to the dashboard -- [ ] Add my own google cloud project to Clerk and create a production instance +- [ ] Implement design changes on the pdf page: chatbot scroll - [ ] Make sure it's fully responsive on mobile +- [ ] Implement sources like perplexity with more info +- [ ] Make some changes to the default tailwind `prose` +- [ ] Add my own google cloud project to Clerk and create a production instance - [ ] Spin up good README + tweet ## Future Todos @@ -13,6 +14,7 @@ - [ ] Add an initial message with sample questions or just add them as bubbles - [ ] Add a trash icon for folks to delete PDFs and implement delete functionality - [ ] Add an option to get answers as lists or paragraphs +- [ ] Save chats for each user to get back to later - [ ] Use an observability tool to better understand how people are using the site - [ ] Clean up and customize how the PDF viewer looks - [ ] Bring up a message to compress PDFs if they're beyond 10MB or accept more diff --git a/app/document/[id]/document-client.tsx b/app/document/[id]/document-client.tsx index 37134ad..14ef07d 100644 --- a/app/document/[id]/document-client.tsx +++ b/app/document/[id]/document-client.tsx @@ -18,8 +18,10 @@ import { useChat } from 'ai/react'; export default function DocumentClient({ currentDoc, + userImage, }: { currentDoc: Document; + userImage?: string; }) { const toolbarPluginInstance = toolbarPlugin(); const pageNavigationPluginInstance = pageNavigationPlugin(); @@ -82,6 +84,8 @@ export default function DocumentClient({ } }; + let userProfilePic = userImage ? userImage : '/profile-icon.png'; + return (
@@ -112,88 +116,76 @@ export default function DocumentClient({
+ {messages.length === 0 && ( +
+ Ask your first question below! +
+ )} {messages.map((message, index) => { const sources = sourcesForMessages[index] || undefined; const isLastMessage = !isLoading && index === messages.length - 1; const previousMessages = index !== messages.length - 1; - let icon; - let className; - if (message.role === 'assistant') { - icon = ( - AI - ); - className = 'bg-gray-100 p-6 text-black animate'; - } else { - icon = ( - Me - ); - // The latest message sent by the user will be animated while waiting for a response - className = - isLoading && index === messages.length - 1 - ? 'p-6 text-black flex animate-pulse bg-gray-100' - : 'bg-white p-6 text-black flex'; - } return (
-
- {icon} -
+
+
+ profile image {message.content} - {/* Display the sources */} - - {(isLastMessage || previousMessages) && sources && ( -
- {sources - .filter( - (source: any, index: number, self: any) => { - const pageNumber = - source.metadata['loc.pageNumber']; - // Check if the current pageNumber is the first occurrence in the array - return ( - self.findIndex( - (s: any) => - s.metadata['loc.pageNumber'] === - pageNumber, - ) === index - ); - }, - ) - .map((source: any) => ( - - ))} -
- )}
+ {/* Display the sources */} + {(isLastMessage || previousMessages) && sources && ( +
+ {sources + .filter((source: any, index: number, self: any) => { + const pageNumber = + source.metadata['loc.pageNumber']; + // Check if the current pageNumber is the first occurrence in the array + return ( + self.findIndex( + (s: any) => + s.metadata['loc.pageNumber'] === pageNumber, + ) === index + ); + }) + .map((source: any) => ( + + ))} +
+ )}
); diff --git a/app/document/[id]/page.tsx b/app/document/[id]/page.tsx index 36fd8f0..5ccb3af 100644 --- a/app/document/[id]/page.tsx +++ b/app/document/[id]/page.tsx @@ -19,7 +19,7 @@ export default async function Page({ params }: { params: { id: string } }) { return (
- +
); } diff --git a/next.config.js b/next.config.js index fc5ec08..9cefd32 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,16 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'img.clerk.com', + port: '', + pathname: '/*', + }, + ], + }, experimental: { esmExternals: 'loose', }, diff --git a/public/bot-icon.png b/public/bot-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..446f6bc4e5096cf17a81e9775bd7c70cdf5a9a6e GIT binary patch literal 6481 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 b=tG2s<`$hvb28%(=@2L@Xvmi!o(KLvM8XX$ diff --git a/public/profile-icon.png b/public/profile-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..696ab678bf7d4e8984af464baff8708756a26174 GIT binary patch literal 1811 zcmV+u2kiKXP)_Wnkj1dw?G@Ecl%&desB4))Af)_zP z2#E1QMr4qPcj_;yJmqrxXt%qn!Tm`^x9xUYeAM~6d9EN2oSmIT*rt<}Us;K=(#lFi zlpvC1B_X!oS^1Zhcvn|fl8U5)ihzmhWSdX)Q`lSQ8!LY^k>AKAt^_i1AK2zIz1B9) z&CLxZ5(&P&ySt;8mls}wNL5u8)z;SX($LUAjg5`e)YPONl3-~se_nx1-XCleV*M1i?d|PRNIGyLW+0tnLBUaLAO;RTRe{8ibmSaZ@LBF~fx>7M;!aObDa09N zb{xQiP;sIRZ5=H_Oqsj1n_4ReSy1Js?-d?hSQrTJ{ zFp52!0%vAsc;}2}TPQeodwZL|*EC8Mf#A_WL9T~4LEiI7^tO;})Y3JwXd9%$2YTD%FWZv_cz?#6Go}RSF5Vy0lLxpmD ze4HU$Kc@+-)q>pFG%+!e_PkRc=LA+Trsb(v7YNY& zo}Zsx1xGOrl3_2KSnUH

WhxTJi=IAP&+H(y}cNSnmU!KtG2`a$8$ls?U3Pc;NjZ zN-@j6QWKay&4WyK#Z~#Uwv4dBNRx zfu*>B?iQ05+{3l7M?!%f2?cs26zCD(1*&s06C<$c&&5&>={+LI3*g6{`lF+x{Qo&H z61uqqHOQYUawveL?*cKUFe%Q&=PC($5@^E6(!(=UgcOD%FbRSGVGntvLJC8vY*!E% z*PaZ?gHqYzQeYDQzNvJMAz6^g$^`LBk$jN%gW_K}LvomiJdmd}@-uS#UO;v? z!B_m?0-4D;+a%D0Ly6fzdOR@#CuFuubtN)|A21yDg_%H{Qu|U#$Wj7@(KzHO2Zjig z#Ejq76ruWB_#-PxG~=)-{{$}3eCc)7mUbUtnm~~=lvhtAAJh`GmL-@UD~T8v^t`GW z(HM~*k4waL)^eU;Yq