152 | {messages.map((message, index) => {
153 | let icon;
154 | let className;
155 | if (message.type === "apiMessage") {
156 | icon = (
157 |
166 | );
167 | className = styles.apimessage;
168 | } else {
169 | icon = (
170 |
179 | );
180 | // The latest message sent by the user will be animated while waiting for a response
181 | className =
182 | loading && index === messages.length - 1
183 | ? styles.usermessagewaiting
184 | : styles.usermessage;
185 | }
186 | return (
187 | <>
188 |
189 | {icon}
190 |
191 |
196 | {message.message}
197 |
198 |
199 |
200 | {message.sourceDocs && (
201 |
202 |
207 | {message.sourceDocs.map((doc, index) => {
208 | // Extract file name from path
209 | const pathParts = doc.metadata.source.split("/");
210 | let fileName = pathParts[pathParts.length - 1];
211 | // Remove extension and replace hyphens with spaces
212 | fileName = fileName
213 | .split(".")[0]
214 | .replace(/-/g, " ");
215 |
216 | // If page number is available in metadata, append it
217 | const pageNumber = doc.metadata.pageNumber
218 | ? ` {page ${doc.metadata.pageNumber}}`
219 | : "";
220 |
221 | return (
222 |
223 |
224 |
225 | Source {index + 1}
226 |
227 |
228 |
233 | {doc.pageContent}
234 |
235 |
236 | Source: {fileName + pageNumber}
237 |
238 |
239 |
240 |
241 | );
242 | }
243 | )}
244 |
245 |
246 | )}
247 | >
248 | );
249 | })}
250 |