quivr/frontend/app/chat/[chatId]/components/DataPanel/DataPanel.tsx
Antoine Dewez ef76ffb1a3
fix(frontend): no sources repetition in data panel (#2132)
# Description

Please include a summary of the changes and the related issue. Please
also include relevant motivation and context.

## Checklist before requesting a review

Please delete options that are not relevant.

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented hard-to-understand areas
- [ ] I have ideally added tests that prove my fix is effective or that
my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged

## Screenshots (if appropriate):
2024-01-31 16:02:14 -08:00

64 lines
1.9 KiB
TypeScript

"use client";
import { useEffect, useState } from "react";
import { useChatContext } from "@/lib/context";
import { MessageMetadata, Source } from "@/lib/types/MessageMetadata";
import styles from "./DataPanel.module.scss";
import RelatedBrains from "./components/RelatedBrains/RelatedBrains";
import Sources from "./components/Sources/Sources";
import { ChatMessage } from "../../types";
const DataPanel = (): JSX.Element => {
const { messages } = useChatContext();
const [lastMessageMetadata, setLastMessageMetadata] =
useState<MessageMetadata>();
useEffect(() => {
if (messages.length > 0) {
const lastMessage: ChatMessage = messages[messages.length - 1];
const newSources: Source[] = (lastMessage.metadata?.sources ?? []).map(
(source: Source) => ({
...source,
frequency: 0,
})
);
const updatedSources: Source[] = [];
newSources.forEach((newSource) => {
console.info(newSource.source_url.length);
const existingSourceIndex = updatedSources.findIndex(
(source) => source.name.trim() === newSource.name.trim()
);
if (existingSourceIndex !== -1) {
updatedSources[existingSourceIndex] = {
...updatedSources[existingSourceIndex],
frequency: updatedSources[existingSourceIndex].frequency + 1,
};
} else {
updatedSources.push(newSource);
}
});
updatedSources.sort((a, b) => b.frequency - a.frequency);
setLastMessageMetadata({
closeBrains: lastMessage.metadata?.close_brains ?? [],
sources: updatedSources,
});
}
}, [messages]);
return (
<div className={styles.data_panel_wrapper}>
<RelatedBrains closeBrains={lastMessageMetadata?.closeBrains} />
<Sources sources={lastMessageMetadata?.sources} />
</div>
);
};
export default DataPanel;