export const readListVisit = (kind, id) => { try { return JSON.parse(sessionStorage.getItem(`list-visit:${kind}:${id ?? 'last'}`) || 'null'); } catch { return null; } }; export const rememberListVisit = (kind, id, url) => { const visit = { id: String(id), url }; try { for (const key of [String(id), 'last']) sessionStorage.setItem(`list-visit:${kind}:${key}`, JSON.stringify(visit)); } catch { /* Navigation remains available when browser storage is disabled. */ } }; export const getListReturnUrl = (kind, id) => { const visit = readListVisit(kind, id); const base = `/${kind}`; return visit?.url === base || visit?.url?.startsWith(`${base}?`) ? visit.url : base; }; export const positiveInteger = (value, fallback) => { const number = Number(value); return Number.isSafeInteger(number) && number > 0 ? number : fallback; }; export const findItemPage = async ({ id, currentPage, pageSize, count, fetchPage, isCancelled = () => false }) => { for (let page = 1; page <= Math.ceil(count / pageSize); page++) { if (isCancelled()) return null; if (page === currentPage) continue; const result = await fetchPage(page); if (isCancelled()) return null; if (result.some((item) => String(item.id) === String(id))) return page; } return null; };