diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 62cf63381..96cfaef12 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -1030,7 +1030,6 @@ export async function getMessagesTable( ): Promise<{ rows: Array; columns: Array; - sessions: Array; }> { const config = {}; if (id) { @@ -1045,7 +1044,7 @@ export async function getMessagesTable( rows.data.forEach((row) => { sessions.add(row.session_id); }); - return { rows: rows.data, columns, sessions: Array.from(sessions) }; + return { rows: rows.data, columns }; } export async function deleteMessagesFn(ids: number[]) { diff --git a/src/frontend/src/modals/IOModal/components/SessionView/hooks/index.tsx b/src/frontend/src/modals/IOModal/components/SessionView/hooks/index.tsx new file mode 100644 index 000000000..e8e638def --- /dev/null +++ b/src/frontend/src/modals/IOModal/components/SessionView/hooks/index.tsx @@ -0,0 +1,29 @@ +import { deleteMessagesFn } from "../../../../../controllers/API"; +import { useMessagesStore } from "../../../../../stores/messagesStore"; + +const useRemoveSession = (setSuccessData, setErrorData) => { + const deleteSession = useMessagesStore((state) => state.deleteSession); + const messages = useMessagesStore((state) => state.messages); + + const handleRemoveSession = async (session_id: string) => { + try { + await deleteMessagesFn( + messages + .filter((msg) => msg.session_id === session_id) + .map((msg) => msg.index), + ); + deleteSession(session_id); + setSuccessData({ + title: "Session deleted successfully.", + }); + } catch (error) { + setErrorData({ + title: "Error deleting Session.", + }); + } + }; + + return { handleRemoveSession }; +}; + +export default useRemoveSession; diff --git a/src/frontend/src/modals/IOModal/components/SessionView/index.tsx b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx index 273766889..b21a786a1 100644 --- a/src/frontend/src/modals/IOModal/components/SessionView/index.tsx +++ b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx @@ -11,17 +11,13 @@ import useAlertStore from "../../../../stores/alertStore"; import { useMessagesStore } from "../../../../stores/messagesStore"; import useUpdateMessage from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-updateMessage"; import useRemoveMessages from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-remove-messages"; -import useMessagesTable from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-messages-table"; import HeaderMessagesComponent from "../../../../pages/SettingsPage/pages/messagesPage/components/headerMessages"; +import { Button } from "../../../../components/ui/button"; +import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import { cn } from "../../../../utils/utils"; -export default function SessionView({ - session, - columns, -}: { - session: string; - columns: Array; -}) { - const messages = useMessagesStore((state) => state.messages); +export default function SessionView({ rows }: { rows: Array }) { + const columns = useMessagesStore((state) => state.columns); const setErrorData = useAlertStore((state) => state.setErrorData); const setSuccessData = useAlertStore((state) => state.setSuccessData); @@ -48,21 +44,43 @@ export default function SessionView({ } return ( - { - handleUpdateMessage(event); - }} - editable={["Sender Name", "Message"]} - overlayNoRowsTemplate="No data available" - onSelectionChanged={(event: SelectionChangedEvent) => { - setSelectedRows(event.api.getSelectedRows().map((row) => row.index)); - }} - rowSelection="multiple" - suppressRowClickSelection={true} - pagination={true} - columnDefs={columns} - rowData={messages.filter((message) => message.session_id === session)} - /> +
+ <> +
+
+ +
+
+ + { + handleUpdateMessage(event); + }} + editable={["Sender Name", "Message"]} + overlayNoRowsTemplate="No data available" + onSelectionChanged={(event: SelectionChangedEvent) => { + setSelectedRows(event.api.getSelectedRows().map((row) => row.index)); + }} + rowSelection="multiple" + suppressRowClickSelection={true} + pagination={true} + columnDefs={columns} + rowData={rows} + /> +
); } diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index bf60384d2..725c5be72 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -27,8 +27,9 @@ import IOFieldView from "./components/IOFieldView"; import ChatView from "./components/chatView"; import { getMessagesTable } from "../../controllers/API"; import { useMessagesStore } from "../../stores/messagesStore"; -import { ColDef, ColGroupDef } from "ag-grid-community"; import SessionView from "./components/SessionView"; +import useRemoveSession from "./components/SessionView/hooks"; +import useAlertStore from "../../stores/alertStore"; export default function IOModal({ children, @@ -59,6 +60,8 @@ export default function IOModal({ const [selectedTab, setSelectedTab] = useState( inputs.length > 0 ? 1 : outputs.length > 0 ? 2 : 0, ); + const setErrorData = useAlertStore((state) => state.setErrorData); + const setSuccessData = useAlertStore((state) => state.setSuccessData); function startView() { if (!chatInput && !chatOutput) { @@ -84,8 +87,8 @@ export default function IOModal({ const currentFlow = useFlowsManagerStore((state) => state.currentFlow); const setNode = useFlowStore((state) => state.setNode); const [sessions, setSessions] = useState([]); - const [columns, setColumns] = useState>([]); - + const messages = useMessagesStore((state) => state.messages); + const setColumns = useMessagesStore((state) => state.setColumns); async function updateVertices() { return updateVerticesOrder(currentFlow!.id, null); } @@ -114,6 +117,11 @@ export default function IOModal({ } } + const { handleRemoveSession } = useRemoveSession( + setSuccessData, + setErrorData, + ); + useEffect(() => { setSelectedTab(inputs.length > 0 ? 1 : outputs.length > 0 ? 2 : 0); }, [allNodes.length]); @@ -131,14 +139,22 @@ export default function IOModal({ useEffect(() => { setSelectedViewField(startView()); if (haveChat) { - getMessagesTable("union").then(({ sessions, rows, columns }) => { - setSessions(sessions); + getMessagesTable("union").then(({ rows, columns }) => { setMessages(rows); setColumns(columns); }); } }, [open]); + useEffect(() => { + const sessions = new Set(); + messages.forEach((row) => { + sessions.add(row.session_id); + }); + setSessions(Array.from(sessions)); + sessions; + }, [messages]); + return ( {children} @@ -322,7 +338,16 @@ export default function IOModal({ {session}
-
diff --git a/src/frontend/src/stores/messagesStore.ts b/src/frontend/src/stores/messagesStore.ts index df1a3c15c..349a1c447 100644 --- a/src/frontend/src/stores/messagesStore.ts +++ b/src/frontend/src/stores/messagesStore.ts @@ -2,6 +2,18 @@ import { create } from "zustand"; import { MessagesStoreType } from "../types/zustand/messages"; export const useMessagesStore = create((set, get) => ({ + deleteSession: (id) => { + set((state) => { + const updatedMessages = state.messages.filter( + (msg) => msg.session_id !== id, + ); + return { messages: updatedMessages }; + }); + }, + columns: [], + setColumns: (columns) => { + set(() => ({ columns: columns })); + }, messages: [], setMessages: (messages) => { set(() => ({ messages: messages })); diff --git a/src/frontend/src/types/zustand/messages/index.ts b/src/frontend/src/types/zustand/messages/index.ts index 44915d2c3..b3ebd50d1 100644 --- a/src/frontend/src/types/zustand/messages/index.ts +++ b/src/frontend/src/types/zustand/messages/index.ts @@ -1,3 +1,4 @@ +import { ColDef, ColGroupDef } from "ag-grid-community"; import { Message } from "../../messages"; export type MessagesStoreType = { @@ -8,4 +9,7 @@ export type MessagesStoreType = { updateMessage: (message: Message) => void; clearMessages: () => void; removeMessages: (ids: number[]) => void; + columns: Array; + setColumns: (columns: Array) => void; + deleteSession: (id: string) => void; };