Browse Source

fix buttons

bug-fixes for ui
main
Silberengel 4 weeks ago
parent
commit
a375a4bff2
  1. 14
      src/app.css
  2. 37
      src/lib/components/NavBar.svelte
  3. 22
      src/lib/services/messaging/event-forwarder.ts
  4. 8
      src/lib/services/messaging/preferences-storage.ts
  5. 4
      src/routes/repos/+page.svelte

14
src/app.css

@ -251,13 +251,13 @@ button:disabled, .button:disabled {
cursor: not-allowed; cursor: not-allowed;
} }
.btn-primary, .login-button, .save-button, .view-button, .search-button, .create-file-button, .create-branch-button, .create-tag-button, .create-issue-button, .create-pr-button, .add-comment-btn, .reply-btn { .btn-primary, .login-button, .save-button, .search-button, .create-file-button, .create-branch-button, .create-tag-button, .create-issue-button, .create-pr-button, .add-comment-btn, .reply-btn {
background: var(--button-primary); background: var(--button-primary);
color: white; color: white;
border: none; border: none;
} }
.btn-primary:hover:not(:disabled), .login-button:hover:not(:disabled), .save-button:hover:not(:disabled), .view-button:hover, .search-button:hover:not(:disabled), .create-file-button:hover, .create-branch-button:hover, .create-tag-button:hover, .create-issue-button:hover, .create-pr-button:hover, .add-comment-btn:hover, .reply-btn:hover { .btn-primary:hover:not(:disabled), .login-button:hover:not(:disabled), .save-button:hover:not(:disabled), .search-button:hover:not(:disabled), .create-file-button:hover, .create-branch-button:hover, .create-tag-button:hover, .create-issue-button:hover, .create-pr-button:hover, .add-comment-btn:hover, .reply-btn:hover {
background: var(--button-primary-hover); background: var(--button-primary-hover);
} }
@ -1287,7 +1287,15 @@ label.filter-checkbox > span,
.register-button { .register-button {
background: var(--accent); background: var(--accent);
color: var(--accent-text, white); color: var(--accent-text, white);
border-color: var(--accent); border: 1px solid var(--accent);
padding: 0.5rem 1rem;
border-radius: 0.375rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
display: inline-block;
} }
.register-button:hover { .register-button:hover {

37
src/lib/components/NavBar.svelte

@ -105,7 +105,31 @@
<div class="auth-section"> <div class="auth-section">
<ThemeToggle /> <ThemeToggle />
{#if userPubkey} {#if userPubkey}
<UserBadge pubkey={userPubkey} /> {@const userNpub = (() => {
try {
// Check if it's already an npub
if (userPubkey.startsWith('npub')) {
return userPubkey;
}
// Try to decode first (might already be npub)
try {
const decoded = nip19.decode(userPubkey);
if (decoded.type === 'npub') {
return userPubkey;
}
} catch {
// Not an npub, continue to encode
}
// Convert hex pubkey to npub
return nip19.npubEncode(userPubkey);
} catch {
// If all fails, return as-is (will be handled by route)
return userPubkey;
}
})()}
<a href={`/users/${userNpub}`} class="user-badge-link">
<UserBadge pubkey={userPubkey} />
</a>
<button onclick={logout} class="logout-button">Logout</button> <button onclick={logout} class="logout-button">Logout</button>
{:else} {:else}
<button onclick={login} class="login-button" disabled={!isNIP07Available()}> <button onclick={login} class="login-button" disabled={!isNIP07Available()}>
@ -217,6 +241,17 @@
flex-shrink: 0; flex-shrink: 0;
} }
.user-badge-link {
text-decoration: none;
color: inherit;
display: flex;
align-items: center;
}
.user-badge-link:hover {
text-decoration: none;
}
.mobile-menu-toggle { .mobile-menu-toggle {
display: none; display: none;
background: transparent; background: transparent;

22
src/lib/services/messaging/event-forwarder.ts

@ -6,10 +6,23 @@
import logger from '../logger.js'; import logger from '../logger.js';
import type { NostrEvent } from '../../types/nostr.js'; import type { NostrEvent } from '../../types/nostr.js';
import { getPreferences } from './preferences-storage.js';
import { getCachedUserLevel } from '../security/user-level-cache.js'; import { getCachedUserLevel } from '../security/user-level-cache.js';
import { KIND } from '../../types/nostr.js'; import { KIND } from '../../types/nostr.js';
// Lazy import to avoid importing Node.js crypto in browser
let getPreferences: typeof import('./preferences-storage.js').getPreferences;
async function getPreferencesLazy() {
if (typeof window !== 'undefined') {
// Browser environment - event forwarding should be done server-side
return null;
}
if (!getPreferences) {
const module = await import('./preferences-storage.js');
getPreferences = module.getPreferences;
}
return getPreferences;
}
// ============================================================================ // ============================================================================
// Types & Interfaces // Types & Interfaces
// ============================================================================ // ============================================================================
@ -584,7 +597,12 @@ export async function forwardEventIfEnabled(
return; return;
} }
const preferences = await getPreferences(userPubkeyHex); const getPreferencesFn = await getPreferencesLazy();
if (!getPreferencesFn) {
// Browser environment - forwarding should be done server-side via API
return;
}
const preferences = await getPreferencesFn(userPubkeyHex);
if (!preferences || !preferences.enabled) { if (!preferences || !preferences.enabled) {
return; return;
} }

8
src/lib/services/messaging/preferences-storage.ts

@ -8,8 +8,16 @@
* - Per-user key derivation (master key + pubkey + salt) * - Per-user key derivation (master key + pubkey + salt)
* - AES-256-GCM authenticated encryption * - AES-256-GCM authenticated encryption
* - Random IV per encryption * - Random IV per encryption
*
* NOTE: This module uses Node.js crypto and should only be used server-side.
* It will throw an error if imported in browser/client code.
*/ */
// Ensure this is only used server-side
if (typeof window !== 'undefined') {
throw new Error('preferences-storage.ts uses Node.js crypto and cannot be imported in browser code. Use API endpoints instead.');
}
import { import {
createCipheriv, createCipheriv,
createDecipheriv, createDecipheriv,

4
src/routes/repos/+page.svelte

@ -462,7 +462,7 @@
<p class="description">{getRepoDescription(repo)}</p> <p class="description">{getRepoDescription(repo)}</p>
{/if} {/if}
</div> </div>
<a href="/repos/{item.npub}/{item.repoName}" class="view-button"> <a href="/repos/{item.npub}/{item.repoName}" class="register-button">
View & Edit → View & Edit →
</a> </a>
</div> </div>
@ -524,7 +524,7 @@
{/if} {/if}
</div> </div>
<div class="repo-actions"> <div class="repo-actions">
<a href="/repos/{item.npub}/{item.repoName}" class="view-button"> <a href="/repos/{item.npub}/{item.repoName}" class="register-button">
View & Edit → View & Edit →
</a> </a>
{#if canDelete} {#if canDelete}

Loading…
Cancel
Save