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