@@ -4,7 +4,6 @@ import { authStore } from './authStore.svelte.js';
44import { settingsStore } from './settingsStore.svelte.js' ;
55import { initializeSyncManager } from './syncManager.svelte.js' ;
66import { generateDTag } from '../utils/idGenerator.js' ;
7- import { loadBoardFromNostr } from '../utils/boardLoader.js' ;
87import type NDK from '@nostr-dev-kit/ndk' ;
98import type { NDKKind } from '@nostr-dev-kit/ndk' ;
109import {
@@ -3291,21 +3290,10 @@ export class BoardStore {
32913290 this . updateTrigger ++ ; // Force derived recalculation
32923291 }
32933292 } else {
3294- // ❌ Loading failed - create default demo board as fallback
3295- console . warn ( '⚠️ Loading demo board from source failed, using default' ) ;
3296- const defaultBoard = this . createDefaultDemoBoard ( ) ;
3297- BoardStorage . saveBoard ( defaultBoard ) ;
3298-
3299- // 🎯 WICHTIG: Fallback-Board AKTIV laden
3300- this . board = defaultBoard ;
3301- this . _columnOrder = defaultBoard . columns . map ( c => c . id ) ;
3302-
3303- this . demoBoardLoadInProgress = false ; // 🚨 Clear flag!
3304- this . triggerUpdate ( ) ;
3293+ this . demoBoardLoadInProgress = false ;
33053294 }
33063295 } ) . catch ( error => {
33073296 // Bei Fehler: Erstelle Standard-Demo-Board
3308- console . error ( '❌ Error loading demo board:' , error ) ;
33093297 const defaultBoard = this . createDefaultDemoBoard ( ) ;
33103298 BoardStorage . saveBoard ( defaultBoard ) ;
33113299
@@ -3361,19 +3349,17 @@ export class BoardStore {
33613349
33623350 /**
33633351 * Lädt ein Board von einer Nostr-Adresse (naddr) und kopiert es als Demo-Board
3364- *
3365- * Uses the shared boardLoader utility to ensure consistent behavior with viewer mode.
3366- * The only difference is that new IDs are generated for board, columns, and cards.
33673352 */
33683353 private async loadBoardFromSourceAddress ( naddrOrId : string ) : Promise < Board | null > {
33693354 // Import nostr utilities
33703355 const { nip19 } = await import ( 'nostr-tools' ) ;
3356+ const { nostrEventToBoard, nostrEventToCard } = await import ( '$lib/utils/nostrEvents.js' ) ;
33713357
33723358 let pubkey : string ;
33733359 let identifier : string ;
3374- let relays : string [ ] = [ ] ;
3360+ let relays : string [ ] | undefined ;
33753361
3376- // Decode naddr
3362+ // Decode naddr wenn es eine ist
33773363 if ( naddrOrId . startsWith ( 'naddr1' ) ) {
33783364 try {
33793365 const decoded = nip19 . decode ( naddrOrId ) ;
@@ -3384,7 +3370,7 @@ export class BoardStore {
33843370
33853371 pubkey = decoded . data . pubkey ;
33863372 identifier = decoded . data . identifier ;
3387- relays = decoded . data . relays || [ ] ;
3373+ relays = decoded . data . relays ;
33883374
33893375 console . log ( '📍 naddr dekodiert:' , { pubkey : pubkey . slice ( 0 , 8 ) + '...' , identifier, relays } ) ;
33903376 } catch ( error ) {
@@ -3403,26 +3389,127 @@ export class BoardStore {
34033389 return null ;
34043390 }
34053391
3406- // Use shared board loading utility with demo board options
3407- // This ensures exact same logic as viewing a board, but with new IDs
3408- const board = await loadBoardFromNostr (
3409- ndk ,
3410- pubkey ,
3411- identifier ,
3412- relays ,
3413- {
3414- generateNewIds : true , // Generate new IDs for demo board copy
3415- overrideBoardId : 'demo-board' ,
3416- overrideAuthor : '0000000000000000000000000000000000000000000000000000000000000000' ,
3417- overrideAuthorName : 'Demo User'
3392+ // Zu Relays verbinden falls angegeben
3393+ if ( relays && relays . length > 0 ) {
3394+ for ( const relayUrl of relays ) {
3395+ try {
3396+ const relay = ndk . pool . getRelay ( relayUrl ) ;
3397+ if ( relay && ! relay . connectivity . status ) {
3398+ await relay . connect ( ) ;
3399+ console . log ( `🔌 Relay verbunden: ${ relayUrl } ` ) ;
3400+ }
3401+ } catch ( error ) {
3402+ console . warn ( `⚠️ Konnte nicht zu Relay verbinden: ${ relayUrl } ` , error ) ;
3403+ }
34183404 }
3419- ) ;
3405+
3406+ // Kurz warten damit Relays verbinden können
3407+ await new Promise ( resolve => setTimeout ( resolve , 1000 ) ) ;
3408+ }
34203409
3421- if ( ! board ) {
3422- console . error ( '❌ Konnte Demo-Board nicht laden' ) ;
3410+ // Board Event laden
3411+ const filter = {
3412+ kinds : [ 30301 ] ,
3413+ authors : [ pubkey ] ,
3414+ '#d' : [ identifier ]
3415+ } ;
3416+
3417+ console . log ( '🔍 Lade Board Event:' , filter ) ;
3418+ const boardEvent = await ndk . fetchEvent ( filter ) ;
3419+
3420+ if ( ! boardEvent ) {
3421+ console . error ( '❌ Board Event nicht gefunden' ) ;
34233422 return null ;
34243423 }
34253424
3425+ console . log ( '✅ Board Event gefunden:' , boardEvent . id ) ;
3426+
3427+ // Board aus Event konvertieren
3428+ const boardProps = nostrEventToBoard ( boardEvent ) ;
3429+
3430+ console . log ( `📋 Board hat ${ boardProps . columns ?. length || 0 } Spalten:` ,
3431+ boardProps . columns ?. map ( c => `${ c . name } (${ c . id } )` ) || [ ] ) ;
3432+
3433+ // Board mit neuer Demo-ID erstellen
3434+ // Use a valid dummy pubkey (64 zeros) instead of 'demo' to avoid Nostr validation errors
3435+ const board = new Board ( {
3436+ ...boardProps ,
3437+ id : 'demo-board' , // ⚠️ WICHTIG: Neue ID für Demo-Board
3438+ author : '0000000000000000000000000000000000000000000000000000000000000000' , // Valid hex pubkey
3439+ authorName : 'Demo User' ,
3440+ publishState : 'private'
3441+ } ) ;
3442+
3443+ // Cards für das Board laden
3444+ const aTagValue = `30301:${ pubkey } :${ identifier } ` ;
3445+ const cardFilter = {
3446+ kinds : [ 30302 ] ,
3447+ '#a' : [ aTagValue ]
3448+ } ;
3449+
3450+ console . log ( '🔍 Lade Card Events für:' , aTagValue ) ;
3451+ const cardEvents = await ndk . fetchEvents ( cardFilter ) ;
3452+ const cardEventArray = Array . from ( cardEvents ) ;
3453+
3454+ console . log ( `✅ ${ cardEventArray . length } Card Events gefunden` ) ;
3455+
3456+ if ( cardEventArray . length === 0 ) return board ;
3457+
3458+ // ⚠️ CRITICAL: Reuse exact logic from working [naddr]/+page.svelte
3459+ // DON'T use addCard() - it does array reassignment which doesn't work before board is in store!
3460+ // Instead: Create Card instance and push directly to column.cards array
3461+ for ( const cardEvent of cardEventArray ) {
3462+ try {
3463+ const cardProps = nostrEventToCard ( cardEvent as any ) as CardProps & { columnName ?: string } ;
3464+ if ( ! cardProps . id ) continue ;
3465+
3466+ // Finde oder erstelle Spalte (columnName kommt via @ts-ignore aus nostrEventToCard)
3467+ const columnName = cardProps . columnName || 'To Do' ;
3468+ let column = board . columns . find ( c => c . name === columnName ) ;
3469+
3470+ if ( ! column ) {
3471+ // Spalte existiert nicht im Board Event, erstelle sie
3472+ column = board . addColumn ( { name : columnName } ) ;
3473+ console . log ( `📁 Spalte erstellt: ${ columnName } ` ) ;
3474+ }
3475+
3476+ // Prüfe ob Card bereits existiert
3477+ const existingCard = column . findCard ( cardProps . id ) ;
3478+ if ( existingCard ) {
3479+ // Update existierende Card (LWW)
3480+ const existingTime = existingCard . updatedAt ? new Date ( existingCard . updatedAt ) . getTime ( ) : 0 ;
3481+ const newTime = cardProps . updatedAt ? new Date ( cardProps . updatedAt ) . getTime ( ) : 0 ;
3482+
3483+ if ( newTime > existingTime ) {
3484+ existingCard . update ( cardProps ) ;
3485+ }
3486+ } else {
3487+ // ⚠️ CRITICAL: Use same pattern as [naddr]/+page.svelte
3488+ // Create Card and push to array directly (NOT addCard which does reassignment)
3489+ const card = new Card ( {
3490+ ...cardProps ,
3491+ author : '0000000000000000000000000000000000000000000000000000000000000000' ,
3492+ authorName : 'Demo User'
3493+ } ) ;
3494+ column . cards . push ( card ) ;
3495+ }
3496+ } catch ( error ) {
3497+ console . warn ( '⚠️ Fehler beim Verarbeiten von Card Event:' , error ) ;
3498+ }
3499+ }
3500+
3501+ // ⚡ CRITICAL: Sortiere Cards nach Rank pro Spalte!
3502+ // ndk.fetchEvents() liefert ein Set ohne garantierte Reihenfolge.
3503+ // Ohne Sortierung hängt die Card-Reihenfolge davon ab, welcher Relay
3504+ // zuerst antwortet → unterschiedliche Reihenfolge auf verschiedenen Browsern.
3505+ for ( const column of board . columns ) {
3506+ column . cards . sort ( ( a : any , b : any ) => {
3507+ const rankA = a . rank ?? Number . MAX_SAFE_INTEGER ;
3508+ const rankB = b . rank ?? Number . MAX_SAFE_INTEGER ;
3509+ return rankA - rankB ;
3510+ } ) ;
3511+ }
3512+
34263513 console . log ( `✅ Demo-Board erstellt mit ${ board . columns . length } Spalten und ${ board . columns . reduce ( ( sum , col ) => sum + col . cards . length , 0 ) } Karten` ) ;
34273514
34283515 return board ;
0 commit comments