From e1a9f6112194055b42f87f0aaa3571845a7ac8a3 Mon Sep 17 00:00:00 2001 From: Silberengel Date: Thu, 26 Feb 2026 19:28:49 +0100 Subject: [PATCH] refactor 8 Nostr-Signature: 716cfe7b5d8b788e6e24092a6ad7e92de0b3d383c43a343f3c5bec4d2bbdd4b9 573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc e80ed3d9d471bd6907e212edfd7cf3f6039fa80e4434c35f0591729515eaa98c7a8ac54f2ac6f7a2fefb7846de0e2f0a120543a0dbe862c47c7710a653189b0c --- nostr/commit-signatures.jsonl | 1 + src/app.css | 1 - src/lib/components/PRDetail.svelte | 79 +- src/routes/+layout.svelte | 25 +- src/routes/api-docs/+page.svelte | 33 +- .../[repo]/commits/[hash]/verify/+server.ts | 6 +- .../api/repos/[npub]/[repo]/tree/+server.ts | 21 +- src/routes/repos/+page.svelte | 248 ++--- src/routes/repos/[npub]/[repo]/+page.svelte | 917 +++++------------- .../[repo]/components/DiscussionsTab.svelte | 20 +- .../[npub]/[repo]/components/DocsTab.svelte | 139 ++- .../[repo]/components/DocsViewer.svelte | 162 ++-- .../[npub]/[repo]/components/FilesTab.svelte | 230 ++++- .../[repo]/components/HistoryTab.svelte | 107 +- .../[npub]/[repo]/components/IssuesTab.svelte | 116 ++- .../[npub]/[repo]/components/PRsTab.svelte | 48 +- .../[repo]/components/PatchesTab.svelte | 78 +- .../[repo]/components/StatusTabLayout.svelte | 38 +- .../[npub]/[repo]/components/TabLayout.svelte | 109 ++- .../dialogs/CloneUrlVerificationDialog.svelte | 6 +- .../dialogs/VerificationDialog.svelte | 4 +- .../[npub]/[repo]/hooks/use-repo-effects.ts | 77 +- .../[npub]/[repo]/services/auth-operations.ts | 122 +++ .../[npub]/[repo]/services/patch-handlers.ts | 42 + .../[npub]/[repo]/services/repo-operations.ts | 264 +++++ .../[npub]/[repo]/services/tag-operations.ts | 6 +- .../repos/[npub]/[repo]/stores/repo-state.ts | 2 +- .../[npub]/[repo]/utils/content-renderer.ts | 87 ++ .../[npub]/[repo]/utils/discussion-utils.ts | 30 + .../[npub]/[repo]/utils/file-handlers.ts | 134 +++ .../[npub]/[repo]/utils/repo-handlers.ts | 78 ++ 31 files changed, 2118 insertions(+), 1112 deletions(-) create mode 100644 src/routes/repos/[npub]/[repo]/services/auth-operations.ts create mode 100644 src/routes/repos/[npub]/[repo]/services/patch-handlers.ts create mode 100644 src/routes/repos/[npub]/[repo]/utils/content-renderer.ts create mode 100644 src/routes/repos/[npub]/[repo]/utils/file-handlers.ts create mode 100644 src/routes/repos/[npub]/[repo]/utils/repo-handlers.ts diff --git a/nostr/commit-signatures.jsonl b/nostr/commit-signatures.jsonl index 23235a2..1257ae4 100644 --- a/nostr/commit-signatures.jsonl +++ b/nostr/commit-signatures.jsonl @@ -100,3 +100,4 @@ {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772110337,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 4"]],"content":"Signed commit: refactor 4","id":"d330d1a096e5f3951e8b2a66160a23c5ac28aa94313ecd0948c7e50baa60bdbb","sig":"febf4088cca3f7223f55ab300ed7fdb7b333c03d2534b05721dfaf9d9284f4599b385ba54379890fa6b846aed02d656a5e45429a6dd571dddbb997be6d8159b2"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772111536,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 5"]],"content":"Signed commit: refactor 5","id":"47651ed0aee8072f356fbac30b6168f2c985bcca392f9ed7d7c38d9670d90f16","sig":"2ca5d04d4a619dc3e02962249f7c650e3a561315897b329f4493e87148c5dd89fbcb6694515a72d0d17e64c9930e57bd7761e27b353275bb1ada9449330f4e1c"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772112054,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 6"]],"content":"Signed commit: refactor 6","id":"cd9b7e015ee3bd6a4c4ab7d54d90ab411a08c29f249158c4cdea2b12996b6b44","sig":"2a8fd0a3718169df1517c0b939ec9ea9793da4dc07b20d9366f09fe70b5268e94451916f975e2cea1a3741419440189d31f844e79863e84de00c0be7c449e92a"} +{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1772112920,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","refactor 7"]],"content":"Signed commit: refactor 7","id":"80f54ac61390cfbc8f2496a162d7065c447033a2e085ab5886c8138e337e93f9","sig":"f64bd2c965eff3534ad68e245651c189dc925d9613dd85557d88af8c692361ade13ccdd9deb88ae07eb227aa002af99d525a7fdf6f29eca854b5a02882ef226f"} diff --git a/src/app.css b/src/app.css index 3dfd118..e19172c 100644 --- a/src/app.css +++ b/src/app.css @@ -1221,7 +1221,6 @@ button.theme-option.active img.theme-icon-option, .repo-badge:hover { background: var(--bg-secondary); border-color: var(--accent); - transform: translateY(-1px); box-shadow: 0 2px 4px var(--shadow-color-light); font-size: 0.9rem; /* Preserve font size on hover */ color: var(--text-primary); diff --git a/src/lib/components/PRDetail.svelte b/src/lib/components/PRDetail.svelte index 9b11531..dfc15c8 100644 --- a/src/lib/components/PRDetail.svelte +++ b/src/lib/components/PRDetail.svelte @@ -10,7 +10,16 @@ import { KIND } from '../types/nostr.js'; import { nip19 } from 'nostr-tools'; import CommentRenderer from './CommentRenderer.svelte'; - import type { Comment } from './CommentRenderer.svelte'; + // Define Comment type locally to match CommentRenderer's export + type Comment = { + id: string; + content: string; + author: string; + createdAt: number; + kind: number; + pubkey: string; + replies?: Comment[]; + }; import { loadNostrLinks } from '../utils/nostr-links.js'; import type { NostrEvent } from '../types/nostr.js'; @@ -129,12 +138,14 @@ await loadNostrLinks(comment.content, nostrClient, nostrLinkEvents, nostrLinkProfiles); } for (const highlight of highlights) { - if (highlight.comment) { + if (highlight.comment && typeof highlight.comment === 'string') { await loadNostrLinks(highlight.comment, nostrClient, nostrLinkEvents, nostrLinkProfiles); } if (highlight.comments) { for (const comment of highlight.comments) { - await loadNostrLinks(comment.content, nostrClient, nostrLinkEvents, nostrLinkProfiles); + if (comment.content && typeof comment.content === 'string') { + await loadNostrLinks(comment.content, nostrClient, nostrLinkEvents, nostrLinkProfiles); + } } } } @@ -734,7 +745,7 @@ margin-bottom: 1rem; } - .add-comment-btn, .reply-btn { + .add-comment-btn { padding: 0.4rem 0.8rem; background: var(--button-primary); color: var(--accent-text, #ffffff); @@ -746,11 +757,11 @@ transition: background 0.2s ease; } - .add-comment-btn:hover, .reply-btn:hover { + .add-comment-btn:hover { background: var(--button-primary-hover); } - .highlight-item, .comment-item { + .highlight-item { margin-bottom: 1.5rem; padding: 1rem; background: var(--bg-secondary); @@ -758,22 +769,7 @@ border-left: 3px solid var(--accent); } - .comment-item.nested { - margin-left: 2rem; - margin-top: 0.75rem; - border-left-color: var(--success-text); - background: var(--bg-secondary); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); - } - - .comment-item.nested .comment-content { - border-left-color: var(--success-text); - background: var(--card-bg); - margin: 0.5rem 0; - padding: 0.875rem 1rem; - } - - .highlight-header, .comment-header { + .highlight-header { display: flex; gap: 1rem; margin-bottom: 0.5rem; @@ -781,7 +777,7 @@ color: var(--text-muted); } - .highlight-author, .comment-author { + .highlight-author { font-weight: bold; color: var(--text-primary); } @@ -844,17 +840,6 @@ filter: brightness(0) saturate(100%) invert(1); } - .comment-content { - margin: 0.75rem 0; - padding: 1rem 1.25rem; - background: var(--bg-secondary); - border-radius: 6px; - border-left: 4px solid var(--accent); - color: var(--text-primary); - font-size: 1rem; - line-height: 1.6; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - } .highlight-comments { margin-top: 1rem; @@ -1004,32 +989,6 @@ background: var(--success-hover, #218838); } - .close-btn { - background: var(--error-text, #dc3545); - color: white; - } - - .close-btn:hover:not(:disabled) { - background: var(--error-hover, #c82333); - } - - .reopen-btn { - background: var(--accent, #007bff); - color: white; - } - - .reopen-btn:hover:not(:disabled) { - background: var(--accent-hover, #0056b3); - } - - .draft-btn { - background: var(--bg-tertiary, #6c757d); - color: white; - } - - .draft-btn:hover:not(:disabled) { - background: var(--bg-secondary, #5a6268); - } @media (max-width: 768px) { .pr-actions { diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 64145e4..9b81d0d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -290,7 +290,7 @@ } async function checkPendingTransfers(userPubkeyHex: string) { - if (!isMounted) return; + if (!isMounted || typeof window === 'undefined') return; try { // Add timeout to prevent hanging @@ -313,14 +313,29 @@ pendingTransfers = data.pendingTransfers.filter( (t: { eventId: string }) => !dismissedTransfers.has(t.eventId) ); + } else if (isMounted) { + // Clear transfers if response is ok but no transfers + pendingTransfers = []; } + } else if (response.status === 404 && isMounted) { + // Endpoint doesn't exist - silently ignore + pendingTransfers = []; } } catch (err) { - // Only log if it's not an abort (timeout) and component is still mounted - if (isMounted && err instanceof Error && err.name !== 'AbortError') { - console.error('Failed to check for pending transfers:', err); + // Only log if it's not an abort (timeout), not a network error, and component is still mounted + if (isMounted && err instanceof Error) { + // Ignore expected errors + if (err.name === 'AbortError') { + // Timeout - silently ignore + return; + } + if (err.name === 'TypeError' && err.message.includes('NetworkError')) { + // Network error (server not available, CORS, etc.) - silently ignore + return; + } + // Log other unexpected errors + console.warn('Failed to check for pending transfers:', err); } - // Silently ignore timeouts - they're expected if the server is slow } } diff --git a/src/routes/api-docs/+page.svelte b/src/routes/api-docs/+page.svelte index 88a4e09..f28bca8 100644 --- a/src/routes/api-docs/+page.svelte +++ b/src/routes/api-docs/+page.svelte @@ -1,28 +1,47 @@ @@ -2414,7 +1911,7 @@
- {#if state.clone.isCloned === true} + {#if state.clone.isCloned === true && $page.data?.gitDomain && !$page.data.gitDomain.startsWith('localhost') && !$page.data.gitDomain.startsWith('127.0.0.1')}