From 549f6aff86fe0340171f6ac210b4c5bc2d8022c7 Mon Sep 17 00:00:00 2001 From: Amirhossein Khalili Date: Sat, 6 Jun 2026 23:43:10 +0330 Subject: [PATCH] fix(workspaces): show load error before setup prompt --- src/context/WorkspaceContext.tsx | 55 +++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/context/WorkspaceContext.tsx b/src/context/WorkspaceContext.tsx index 8d57b40..621cb39 100644 --- a/src/context/WorkspaceContext.tsx +++ b/src/context/WorkspaceContext.tsx @@ -28,26 +28,32 @@ export const useOptionalWorkspace = () => useContext(WorkspaceContext) export const WorkspaceProvider = ({ children }: { children: ReactNode }) => { const { t } = useTranslation() const [workspaces, setWorkspaces] = useState([]) - const [activeWorkspace, setActiveWorkspaceState] = useState(null) - const [isLoading, setIsLoading] = useState(true) - const [newWorkspaceName, setNewWorkspaceName] = useState("") - const [isCreatingFirst, setIsCreatingFirst] = useState(false) + const [activeWorkspace, setActiveWorkspaceState] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const [hasLoadedWorkspaces, setHasLoadedWorkspaces] = useState(false) + const [workspaceLoadError, setWorkspaceLoadError] = useState(false) + const [newWorkspaceName, setNewWorkspaceName] = useState("") + const [isCreatingFirst, setIsCreatingFirst] = useState(false) const isAuthenticated = !!localStorage.getItem("accessToken") const rateLimited = isRateLimitActive() const refreshWorkspaces = async () => { if (!isAuthenticated || isRateLimitActive()) { + setHasLoadedWorkspaces(false) + setWorkspaceLoadError(false) setIsLoading(false) return } try { setIsLoading(true) + setWorkspaceLoadError(false) const response = await fetchWorkspaces() const data = Array.isArray(response) ? response : (response?.results || []) setWorkspaces(data) + setHasLoadedWorkspaces(true) if (data.length > 0) { const storedId = localStorage.getItem("activeWorkspaceId") @@ -64,6 +70,8 @@ export const WorkspaceProvider = ({ children }: { children: ReactNode }) => { } } catch (error) { console.error(error) + setWorkspaceLoadError(true) + setHasLoadedWorkspaces(false) } finally { setIsLoading(false) } @@ -71,6 +79,8 @@ export const WorkspaceProvider = ({ children }: { children: ReactNode }) => { useEffect(() => { if (!isAuthenticated || rateLimited) { + setHasLoadedWorkspaces(false) + setWorkspaceLoadError(false) setIsLoading(false) return } @@ -90,9 +100,11 @@ export const WorkspaceProvider = ({ children }: { children: ReactNode }) => { const addWorkspace = async (name: string) => { try { setIsCreatingFirst(true) - const newWs = await createWorkspace({ name, description: "" }) - setWorkspaces((prev) => [...prev, newWs]) - setActiveWorkspace(newWs) + const newWs = await createWorkspace({ name, description: "" }) + setWorkspaces((prev) => [...prev, newWs]) + setHasLoadedWorkspaces(true) + setWorkspaceLoadError(false) + setActiveWorkspace(newWs) toast.success(t.workspace?.successCreate || t.workspace?.toast?.successCreate || "Workspace created!") } catch (error) { toast.error(t.workspace?.toast?.errorCreate || "Failed to create workspace") @@ -101,10 +113,31 @@ export const WorkspaceProvider = ({ children }: { children: ReactNode }) => { setIsCreatingFirst(false) setNewWorkspaceName("") } - } - - // Force workspace creation if authenticated but none exist - if (!rateLimited && !isLoading && isAuthenticated && workspaces.length === 0) { + } + + if (!rateLimited && !isLoading && isAuthenticated && workspaceLoadError) { + return ( +
+
+

+ {t.workspace?.fetchError || "Failed to load workspace data"} +

+

+ {t.workspace?.loadErrorDescription || "The backend service may be unavailable. Please try again in a moment."} +

+ +
+
+ ) + } + + // Force workspace creation if authenticated but none exist + if (!rateLimited && !isLoading && isAuthenticated && hasLoadedWorkspaces && workspaces.length === 0) { return (