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