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