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