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