Spaces:
Paused
Paused
| import { useEffect, useMemo, useRef } from "react"; | |
| import { useLocation, useNavigate } from "@/lib/router"; | |
| import { useCompany } from "../context/CompanyContext"; | |
| import { toCompanyRelativePath } from "../lib/company-routes"; | |
| import { | |
| getRememberedPathOwnerCompanyId, | |
| isRememberableCompanyPath, | |
| sanitizeRememberedPathForCompany, | |
| } from "../lib/company-page-memory"; | |
| const STORAGE_KEY = "paperclip.companyPaths"; | |
| function getCompanyPaths(): Record<string, string> { | |
| try { | |
| const raw = localStorage.getItem(STORAGE_KEY); | |
| if (raw) return JSON.parse(raw); | |
| } catch { | |
| /* ignore */ | |
| } | |
| return {}; | |
| } | |
| function saveCompanyPath(companyId: string, path: string) { | |
| const paths = getCompanyPaths(); | |
| paths[companyId] = path; | |
| localStorage.setItem(STORAGE_KEY, JSON.stringify(paths)); | |
| } | |
| /** | |
| * Remembers the last visited page per company and navigates to it on company switch. | |
| * Falls back to /dashboard if no page was previously visited for a company. | |
| */ | |
| export function useCompanyPageMemory() { | |
| const { companies, selectedCompanyId, selectedCompany, selectionSource } = useCompany(); | |
| const location = useLocation(); | |
| const navigate = useNavigate(); | |
| const prevCompanyId = useRef<string | null>(selectedCompanyId); | |
| const rememberedPathOwnerCompanyId = useMemo( | |
| () => | |
| getRememberedPathOwnerCompanyId({ | |
| companies, | |
| pathname: location.pathname, | |
| fallbackCompanyId: prevCompanyId.current, | |
| }), | |
| [companies, location.pathname], | |
| ); | |
| // Save current path for current company on every location change. | |
| // Uses prevCompanyId ref so we save under the correct company even | |
| // during the render where selectedCompanyId has already changed. | |
| const fullPath = location.pathname + location.search; | |
| useEffect(() => { | |
| const companyId = rememberedPathOwnerCompanyId; | |
| const relativePath = toCompanyRelativePath(fullPath); | |
| if (companyId && isRememberableCompanyPath(relativePath)) { | |
| saveCompanyPath(companyId, relativePath); | |
| } | |
| }, [fullPath, rememberedPathOwnerCompanyId]); | |
| // Navigate to saved path when company changes | |
| useEffect(() => { | |
| if (!selectedCompanyId) return; | |
| if ( | |
| prevCompanyId.current !== null && | |
| selectedCompanyId !== prevCompanyId.current | |
| ) { | |
| if (selectionSource !== "route_sync" && selectedCompany) { | |
| const paths = getCompanyPaths(); | |
| const targetPath = sanitizeRememberedPathForCompany({ | |
| path: paths[selectedCompanyId], | |
| companyPrefix: selectedCompany.issuePrefix, | |
| }); | |
| navigate(`/${selectedCompany.issuePrefix}${targetPath}`, { replace: true }); | |
| } | |
| } | |
| prevCompanyId.current = selectedCompanyId; | |
| }, [selectedCompany, selectedCompanyId, selectionSource, navigate]); | |
| } | |