80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
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]);
|
|
}
|