You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.0 KiB
185 lines
5.0 KiB
<script> |
|
import { onMount } from 'svelte'; |
|
import Header from './components/Header.svelte'; |
|
import LoginModal from './LoginModal.svelte'; |
|
import Dashboard from './pages/Dashboard.svelte'; |
|
import Config from './pages/Config.svelte'; |
|
import Update from './pages/Update.svelte'; |
|
import { isLoggedIn, userPubkey, userSigner, authMethod } from './stores.js'; |
|
|
|
let currentPage = 'dashboard'; |
|
let showLoginModal = false; |
|
let isDarkTheme = false; |
|
|
|
onMount(() => { |
|
// Check for stored auth |
|
const storedMethod = localStorage.getItem('launcher_auth_method'); |
|
const storedPubkey = localStorage.getItem('launcher_pubkey'); |
|
|
|
if (storedMethod === 'extension' && storedPubkey) { |
|
// Try to restore extension session |
|
if (window.nostr) { |
|
window.nostr.getPublicKey().then(pk => { |
|
if (pk === storedPubkey) { |
|
$isLoggedIn = true; |
|
$userPubkey = pk; |
|
$userSigner = window.nostr; |
|
$authMethod = 'extension'; |
|
} |
|
}).catch(() => { |
|
// Extension not available, clear stored auth |
|
localStorage.removeItem('launcher_auth_method'); |
|
localStorage.removeItem('launcher_pubkey'); |
|
}); |
|
} |
|
} |
|
|
|
// Check for dark theme preference |
|
isDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches; |
|
}); |
|
|
|
function handleLogin(event) { |
|
const { method, pubkey, signer, privateKey } = event.detail; |
|
|
|
$isLoggedIn = true; |
|
$userPubkey = pubkey; |
|
$userSigner = signer; |
|
$authMethod = method; |
|
|
|
localStorage.setItem('launcher_auth_method', method); |
|
localStorage.setItem('launcher_pubkey', pubkey); |
|
|
|
if (method === 'nsec' && privateKey) { |
|
// Store encrypted key (handled by LoginModal) |
|
} |
|
|
|
showLoginModal = false; |
|
} |
|
|
|
function handleLogout() { |
|
$isLoggedIn = false; |
|
$userPubkey = ''; |
|
$userSigner = null; |
|
$authMethod = ''; |
|
|
|
localStorage.removeItem('launcher_auth_method'); |
|
localStorage.removeItem('launcher_pubkey'); |
|
localStorage.removeItem('launcher_privkey_encrypted'); |
|
} |
|
|
|
function navigateTo(page) { |
|
currentPage = page; |
|
} |
|
</script> |
|
|
|
<main class:dark-theme={isDarkTheme}> |
|
<Header |
|
{currentPage} |
|
isLoggedIn={$isLoggedIn} |
|
userPubkey={$userPubkey} |
|
on:navigate={(e) => navigateTo(e.detail)} |
|
on:login={() => showLoginModal = true} |
|
on:logout={handleLogout} |
|
/> |
|
|
|
<div class="content"> |
|
{#if !$isLoggedIn} |
|
<div class="login-prompt"> |
|
<h2>ORLY Launcher Admin</h2> |
|
<p>Please login to manage the relay services.</p> |
|
<button class="login-btn" on:click={() => showLoginModal = true}> |
|
Login with Nostr |
|
</button> |
|
</div> |
|
{:else if currentPage === 'dashboard'} |
|
<Dashboard /> |
|
{:else if currentPage === 'config'} |
|
<Config /> |
|
{:else if currentPage === 'update'} |
|
<Update /> |
|
{/if} |
|
</div> |
|
|
|
<LoginModal |
|
bind:showModal={showLoginModal} |
|
{isDarkTheme} |
|
on:login={handleLogin} |
|
on:close={() => showLoginModal = false} |
|
/> |
|
</main> |
|
|
|
<style> |
|
:global(*) { |
|
box-sizing: border-box; |
|
margin: 0; |
|
padding: 0; |
|
} |
|
|
|
:global(body) { |
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; |
|
background: var(--bg-color); |
|
color: var(--text-color); |
|
min-height: 100vh; |
|
} |
|
|
|
main { |
|
--bg-color: #f5f5f5; |
|
--card-bg: #ffffff; |
|
--text-color: #333333; |
|
--muted-color: #666666; |
|
--border-color: #e0e0e0; |
|
--primary: #00bcd4; |
|
--primary-hover: #00acc1; |
|
--success: #4caf50; |
|
--error: #f44336; |
|
--warning: #ff9800; |
|
|
|
min-height: 100vh; |
|
background: var(--bg-color); |
|
} |
|
|
|
main.dark-theme { |
|
--bg-color: #1a1a1a; |
|
--card-bg: #2d2d2d; |
|
--text-color: #e0e0e0; |
|
--muted-color: #999999; |
|
--border-color: #444444; |
|
} |
|
|
|
.content { |
|
max-width: 1200px; |
|
margin: 0 auto; |
|
padding: 20px; |
|
} |
|
|
|
.login-prompt { |
|
text-align: center; |
|
padding: 60px 20px; |
|
} |
|
|
|
.login-prompt h2 { |
|
font-size: 2rem; |
|
margin-bottom: 16px; |
|
color: var(--text-color); |
|
} |
|
|
|
.login-prompt p { |
|
color: var(--muted-color); |
|
margin-bottom: 24px; |
|
} |
|
|
|
.login-btn { |
|
padding: 12px 32px; |
|
font-size: 1rem; |
|
background: var(--primary); |
|
color: white; |
|
border: none; |
|
border-radius: 6px; |
|
cursor: pointer; |
|
transition: background 0.2s; |
|
} |
|
|
|
.login-btn:hover { |
|
background: var(--primary-hover); |
|
} |
|
</style>
|
|
|