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>