diff --git a/frontend/src/components/Modals/MangeWorkspace/Documents/index.jsx b/frontend/src/components/Modals/MangeWorkspace/Documents/index.jsx index 628f22c5131b8cdd6f5df15ccf2ee3f480306d85..e5674d592a38bb3651ed107d38b8da2b45a5dd9b 100644 --- a/frontend/src/components/Modals/MangeWorkspace/Documents/index.jsx +++ b/frontend/src/components/Modals/MangeWorkspace/Documents/index.jsx @@ -6,6 +6,7 @@ import { useParams } from "react-router-dom"; import Directory from "./Directory"; import ConfirmationModal from "./ConfirmationModal"; import { AlertTriangle } from "react-feather"; +import showToast from "../../../../utils/toast"; export default function DocumentSettings({ workspace }) { const { slug } = useParams(); @@ -18,22 +19,27 @@ export default function DocumentSettings({ workspace }) { const [hasFiles, setHasFiles] = useState(true); const [canDelete, setCanDelete] = useState(false); + async function fetchKeys(refetchWorkspace = false) { + const localFiles = await System.localFiles(); + const currentWorkspace = refetchWorkspace + ? await Workspace.bySlug(slug) + : workspace; + const originalDocs = + currentWorkspace.documents.map((doc) => doc.docpath) || []; + const hasAnyFiles = localFiles.items.some( + (folder) => folder?.items?.length > 0 + ); + + const canDelete = await System.getCanDeleteWorkspaces(); + setCanDelete(canDelete); + setDirectories(localFiles); + setOriginalDocuments([...originalDocs]); + setSelectFiles([...originalDocs]); + setHasFiles(hasAnyFiles); + setLoading(false); + } + useEffect(() => { - async function fetchKeys() { - const localFiles = await System.localFiles(); - const originalDocs = workspace.documents.map((doc) => doc.docpath) || []; - const hasAnyFiles = localFiles.items.some( - (folder) => folder?.items?.length > 0 - ); - - const canDelete = await System.getCanDeleteWorkspaces(); - setCanDelete(canDelete); - setDirectories(localFiles); - setOriginalDocuments([...originalDocs]); - setSelectFiles([...originalDocs]); - setHasFiles(hasAnyFiles); - setLoading(false); - } fetchKeys(); }, []); @@ -82,11 +88,28 @@ export default function DocumentSettings({ workspace }) { const updateWorkspace = async (e) => { e.preventDefault(); setSaving(true); + showToast("Updating workspace...", "info", { autoClose: false }); setShowConfirmation(false); + const changes = docChanges(); - await Workspace.modifyEmbeddings(workspace.slug, changes); + await Workspace.modifyEmbeddings(workspace.slug, changes) + .then((res) => { + if (res && res.workspace) { + showToast("Workspace updated successfully.", "success", { + clear: true, + }); + } else { + showToast("Workspace update failed.", "error", { clear: true }); + } + }) + .catch((error) => { + showToast(`Workspace update failed: ${error}`, "error", { + clear: true, + }); + }); + setSaving(false); - window.location.reload(); + await fetchKeys(true); }; const isSelected = (filepath) => { diff --git a/frontend/src/utils/toast.js b/frontend/src/utils/toast.js index 6a39f006c9e5b082aca4a1a9830262fa56cd2516..7c12c5ea81eadae0bcb4c7d738274f87ad7b5aaa 100644 --- a/frontend/src/utils/toast.js +++ b/frontend/src/utils/toast.js @@ -1,7 +1,10 @@ import { toast } from "react-toastify"; import usePrefersDarkMode from "../hooks/usePrefersDarkMode"; -const showToast = (message, type = "default") => { +// Additional Configs (opts) +// You can also pass valid ReactToast params to override the defaults. +// clear: false, // Will dismiss all visible toasts before rendering next toast +const showToast = (message, type = "default", opts = {}) => { const prefersDarkMode = usePrefersDarkMode(); const options = { position: "bottom-center", @@ -11,8 +14,11 @@ const showToast = (message, type = "default") => { pauseOnHover: true, draggable: true, theme: prefersDarkMode ? "dark" : "light", + ...opts, }; + if (opts?.clear === true) toast.dismiss(); + switch (type) { case "success": toast.success(message, options);