this repo has no description
1<script lang="ts">
2 import { getCurrentPath, navigate } from './lib/router.svelte'
3 import { initAuth, getAuthState } from './lib/auth.svelte'
4 import { initServerConfig } from './lib/serverConfig.svelte'
5 import { initI18n, _ } from './lib/i18n'
6 import { isLoading as i18nLoading } from 'svelte-i18n'
7 import Login from './routes/Login.svelte'
8 import Register from './routes/Register.svelte'
9 import RegisterPasskey from './routes/RegisterPasskey.svelte'
10 import Verify from './routes/Verify.svelte'
11 import ResetPassword from './routes/ResetPassword.svelte'
12 import RecoverPasskey from './routes/RecoverPasskey.svelte'
13 import RequestPasskeyRecovery from './routes/RequestPasskeyRecovery.svelte'
14 import Dashboard from './routes/Dashboard.svelte'
15 import AppPasswords from './routes/AppPasswords.svelte'
16 import InviteCodes from './routes/InviteCodes.svelte'
17 import Settings from './routes/Settings.svelte'
18 import Sessions from './routes/Sessions.svelte'
19 import Comms from './routes/Comms.svelte'
20 import RepoExplorer from './routes/RepoExplorer.svelte'
21 import Admin from './routes/Admin.svelte'
22 import OAuthConsent from './routes/OAuthConsent.svelte'
23 import OAuthLogin from './routes/OAuthLogin.svelte'
24 import OAuthAccounts from './routes/OAuthAccounts.svelte'
25 import OAuth2FA from './routes/OAuth2FA.svelte'
26 import OAuthTotp from './routes/OAuthTotp.svelte'
27 import OAuthPasskey from './routes/OAuthPasskey.svelte'
28 import OAuthDelegation from './routes/OAuthDelegation.svelte'
29 import OAuthError from './routes/OAuthError.svelte'
30 import Security from './routes/Security.svelte'
31 import TrustedDevices from './routes/TrustedDevices.svelte'
32 import Controllers from './routes/Controllers.svelte'
33 import DelegationAudit from './routes/DelegationAudit.svelte'
34 import ActAs from './routes/ActAs.svelte'
35 import Home from './routes/Home.svelte'
36
37 initI18n()
38
39 const auth = getAuthState()
40
41 let oauthCallbackPending = $state(hasOAuthCallback())
42
43 function hasOAuthCallback(): boolean {
44 const params = new URLSearchParams(window.location.search)
45 return !!(params.get('code') && params.get('state'))
46 }
47
48 $effect(() => {
49 initServerConfig()
50 initAuth().then(({ oauthLoginCompleted }) => {
51 if (oauthLoginCompleted) {
52 navigate('/dashboard')
53 }
54 oauthCallbackPending = false
55 })
56 })
57
58 function getComponent(path: string) {
59 switch (path) {
60 case '/login':
61 return Login
62 case '/register':
63 return Register
64 case '/register-passkey':
65 return RegisterPasskey
66 case '/verify':
67 return Verify
68 case '/reset-password':
69 return ResetPassword
70 case '/recover-passkey':
71 return RecoverPasskey
72 case '/request-passkey-recovery':
73 return RequestPasskeyRecovery
74 case '/dashboard':
75 return Dashboard
76 case '/app-passwords':
77 return AppPasswords
78 case '/invite-codes':
79 return InviteCodes
80 case '/settings':
81 return Settings
82 case '/sessions':
83 return Sessions
84 case '/comms':
85 return Comms
86 case '/repo':
87 return RepoExplorer
88 case '/admin':
89 return Admin
90 case '/oauth/consent':
91 return OAuthConsent
92 case '/oauth/login':
93 return OAuthLogin
94 case '/oauth/accounts':
95 return OAuthAccounts
96 case '/oauth/2fa':
97 return OAuth2FA
98 case '/oauth/totp':
99 return OAuthTotp
100 case '/oauth/passkey':
101 return OAuthPasskey
102 case '/oauth/delegation':
103 return OAuthDelegation
104 case '/oauth/error':
105 return OAuthError
106 case '/security':
107 return Security
108 case '/trusted-devices':
109 return TrustedDevices
110 case '/controllers':
111 return Controllers
112 case '/delegation-audit':
113 return DelegationAudit
114 case '/act-as':
115 return ActAs
116 default:
117 return Home
118 }
119 }
120
121 let currentPath = $derived(getCurrentPath())
122 let CurrentComponent = $derived(getComponent(currentPath))
123</script>
124
125<main>
126 {#if auth.loading || $i18nLoading || oauthCallbackPending}
127 <div class="loading">
128 <p>Loading...</p>
129 </div>
130 {:else}
131 <CurrentComponent />
132 {/if}
133</main>
134
135<style>
136 main {
137 min-height: 100vh;
138 }
139
140 .loading {
141 display: flex;
142 align-items: center;
143 justify-content: center;
144 min-height: 100vh;
145 color: var(--text-secondary);
146 }
147</style>