export interface Route { name: string; params: Record; query: URLSearchParams; } export function routeFromHash(): Route { const raw = window.location.hash.replace(/^#/, '') || '/login'; const [pathPart, queryPart] = raw.split('?'); const segments = pathPart.split('/').filter(Boolean); const query = new URLSearchParams(queryPart ?? ''); if (segments[0] === 'login' || segments.length === 0) return { name: 'login', params: {}, query }; if (segments[0] === 'register') return { name: 'register', params: {}, query }; if (segments[0] === 'reset') return { name: 'reset', params: {}, query }; if (segments[0] === 'account') return { name: 'account', params: {}, query }; if (segments[0] === 'admin') return { name: 'admin', params: {}, query }; if (segments[0] === 'datasets') return { name: 'datasets', params: {}, query }; if (segments[0] === 'runs') return { name: 'runs', params: {}, query }; if (segments[0] === 'usage') return { name: 'usage', params: {}, query }; if (segments[0] === 'projects') { if (!segments[1]) return { name: 'projects', params: {}, query }; const id = segments[1]; const tab = segments[2] ?? 'data'; if (['data', 'strategy', 'backtest', 'results'].includes(tab)) { return { name: `project-${tab}`, params: { id }, query }; } return { name: 'project-data', params: { id }, query }; } return { name: 'login', params: {}, query }; } export function go(path: string) { if (!path.startsWith('#')) path = `#${path.startsWith('/') ? path : `/${path}`}`; window.location.hash = path; } export function replace(path: string) { go(path); } export function projectPath(id: string, tab: 'data' | 'strategy' | 'backtest' | 'results') { return `/projects/${id}/${tab}`; }