summaryrefslogtreecommitdiff
path: root/frontend/src/lib/router.ts
blob: 3c2631a370c4b25936bb14f335e4f4ba5674b3a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
export interface Route {
  name: string;
  params: Record<string, string>;
  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}`;
}