|
|
|
|
@ -70,7 +70,6 @@
@@ -70,7 +70,6 @@
|
|
|
|
|
let tags = $state<string[][]>(getInitialTags()); |
|
|
|
|
let publishing = $state(false); |
|
|
|
|
let showAdvancedEditor = $state(false); |
|
|
|
|
let hasGraspList = $state<boolean | null>(null); // null = not checked yet |
|
|
|
|
let richTextEditorRef: { clearUploadedFiles: () => void; getUploadedFiles: () => Array<{ url: string; imetaTag: string[] }> } | null = $state(null); |
|
|
|
|
let uploadedFiles: Array<{ url: string; imetaTag: string[] }> = $state([]); |
|
|
|
|
|
|
|
|
|
@ -107,32 +106,6 @@
@@ -107,32 +106,6 @@
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// Check if user has grasp list when creating repo announcement |
|
|
|
|
$effect(() => { |
|
|
|
|
if (effectiveKind === 30617 || effectiveKind === KIND.REPO_ANNOUNCEMENT) { |
|
|
|
|
const currentPubkey = sessionManager.getCurrentPubkey(); |
|
|
|
|
if (currentPubkey) { |
|
|
|
|
(async () => { |
|
|
|
|
try { |
|
|
|
|
const graspListEvents = await nostrClient.fetchEvents( |
|
|
|
|
[{ kinds: [10317], authors: [currentPubkey], limit: 1 }], |
|
|
|
|
relayManager.getProfileReadRelays(), |
|
|
|
|
{ useCache: 'cache-first', cacheResults: true } |
|
|
|
|
); |
|
|
|
|
hasGraspList = graspListEvents.length > 0; |
|
|
|
|
} catch (error) { |
|
|
|
|
console.warn('Failed to check for grasp list:', error); |
|
|
|
|
hasGraspList = false; // Assume missing on error |
|
|
|
|
} |
|
|
|
|
})(); |
|
|
|
|
} else { |
|
|
|
|
hasGraspList = false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
hasGraspList = null; // Reset when not creating repo announcement |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// Restore draft from IndexedDB if no initial event |
|
|
|
|
$effect(() => { |
|
|
|
|
if (typeof window === 'undefined' || initialEvent) return; |
|
|
|
|
@ -211,7 +184,6 @@
@@ -211,7 +184,6 @@
|
|
|
|
|
const helpText = $derived(kindMetadata.helpText); |
|
|
|
|
const isKind30040 = $derived(selectedKind === 30040); |
|
|
|
|
const isKind10895 = $derived(selectedKind === 10895); |
|
|
|
|
const allPublishRelays = $derived([...new Set([...config.documentationPublishRelays, ...config.graspRelays])]); |
|
|
|
|
|
|
|
|
|
// Clear content for metadata-only kinds (but preserve content when cloning/editing) |
|
|
|
|
$effect(() => { |
|
|
|
|
@ -413,9 +385,9 @@
@@ -413,9 +385,9 @@
|
|
|
|
|
true |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// For repo announcements, also add documentation and GRASP relays |
|
|
|
|
// For repo announcements, also add documentation relays |
|
|
|
|
if (effectiveKind === 30617 || effectiveKind === KIND.REPO_ANNOUNCEMENT) { |
|
|
|
|
relays = [...new Set([...relays, ...config.documentationPublishRelays, ...config.graspRelays])]; |
|
|
|
|
relays = [...new Set([...relays, ...config.documentationPublishRelays])]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const results = await signAndPublish(eventTemplate, relays); |
|
|
|
|
@ -423,46 +395,6 @@
@@ -423,46 +395,6 @@
|
|
|
|
|
publicationModalOpen = true; |
|
|
|
|
|
|
|
|
|
if (results.success.length > 0) { |
|
|
|
|
// For repo announcements, check if we need to create a grasp list |
|
|
|
|
if (effectiveKind === 30617 || effectiveKind === KIND.REPO_ANNOUNCEMENT) { |
|
|
|
|
try { |
|
|
|
|
const currentPubkey = session.pubkey; |
|
|
|
|
const graspListEvents = await nostrClient.fetchEvents( |
|
|
|
|
[{ kinds: [10317], authors: [currentPubkey], limit: 1 }], |
|
|
|
|
relayManager.getProfileReadRelays(), |
|
|
|
|
{ useCache: 'cache-first', cacheResults: true } |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (graspListEvents.length === 0) { |
|
|
|
|
// User doesn't have a grasp list, create one |
|
|
|
|
// Only include actual GRASP relays in the g tags (not documentation relays) |
|
|
|
|
// Filter out thecitadel since it's not a GRASP server |
|
|
|
|
const graspRelaysForTags = config.graspRelays.filter(r => !r.includes('thecitadel')); |
|
|
|
|
|
|
|
|
|
const graspListEventTemplate: Omit<NostrEvent, 'sig' | 'id'> = { |
|
|
|
|
kind: 10317, |
|
|
|
|
pubkey: currentPubkey, |
|
|
|
|
created_at: Math.floor(Date.now() / 1000), |
|
|
|
|
tags: graspRelaysForTags.map(server => ['g', server]), // Only GRASP relays in g tags |
|
|
|
|
content: '' |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const signedGraspListEvent = await session.signer(graspListEventTemplate); |
|
|
|
|
await cacheEvent(signedGraspListEvent); |
|
|
|
|
|
|
|
|
|
// Publish grasp list to documentation and GRASP relays |
|
|
|
|
// (documentation relay accepts these kinds but isn't a GRASP relay, so not in g tags) |
|
|
|
|
const allGraspRelays = [...new Set([...config.documentationPublishRelays, ...config.graspRelays])]; |
|
|
|
|
|
|
|
|
|
await signAndPublish(graspListEventTemplate, allGraspRelays); |
|
|
|
|
console.log('Auto-created and published user grasp list (kind 10317)'); |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
console.warn('Failed to check/create grasp list:', error); |
|
|
|
|
// Non-critical, continue |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
content = ''; |
|
|
|
|
tags = []; |
|
|
|
|
uploadedFiles = []; |
|
|
|
|
@ -477,7 +409,6 @@
@@ -477,7 +409,6 @@
|
|
|
|
|
if (dTag) { |
|
|
|
|
try { |
|
|
|
|
// Only include documentation relay as relay hint (keeps naddr shorter) |
|
|
|
|
// Both events are published to documentation and GRASP relays, but we only hint at documentation relay |
|
|
|
|
const relayHints = config.documentationPublishRelays; |
|
|
|
|
const naddr = nip19.naddrEncode({ |
|
|
|
|
kind: signedEvent.kind, |
|
|
|
|
@ -795,34 +726,6 @@
@@ -795,34 +726,6 @@
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="form-actions"> |
|
|
|
|
{#if (effectiveKind === 30617 || effectiveKind === KIND.REPO_ANNOUNCEMENT) && hasGraspList === false} |
|
|
|
|
<div class="grasp-list-notice"> |
|
|
|
|
<Icon name="info" size={16} /> |
|
|
|
|
<div class="notice-content"> |
|
|
|
|
<p class="notice-text"> |
|
|
|
|
A User Grasp List (kind 10317) will be created automatically on your behalf. |
|
|
|
|
</p> |
|
|
|
|
<p class="notice-relays"> |
|
|
|
|
Events will be published to: |
|
|
|
|
</p> |
|
|
|
|
<ul class="relay-list"> |
|
|
|
|
{#each allPublishRelays as relay} |
|
|
|
|
<li> |
|
|
|
|
{relay} |
|
|
|
|
{#if config.documentationPublishRelays.includes(relay)} |
|
|
|
|
<span class="relay-note">(documentation relay, accepts these kinds but not a GRASP relay)</span> |
|
|
|
|
{:else} |
|
|
|
|
<span class="relay-note">(GRASP relay)</span> |
|
|
|
|
{/if} |
|
|
|
|
</li> |
|
|
|
|
{/each} |
|
|
|
|
</ul> |
|
|
|
|
<p class="notice-note"> |
|
|
|
|
Note: Only GRASP relays will be included in the g tags of the kind 10317 event. |
|
|
|
|
</p> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
{/if} |
|
|
|
|
<button |
|
|
|
|
class="publish-button" |
|
|
|
|
onclick={publish} |
|
|
|
|
@ -1955,64 +1858,4 @@
@@ -1955,64 +1858,4 @@
|
|
|
|
|
background: var(--fog-dark-border, #475569); |
|
|
|
|
border-color: var(--fog-dark-accent, #94a3b8); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.grasp-list-notice { |
|
|
|
|
display: flex; |
|
|
|
|
gap: 0.75rem; |
|
|
|
|
padding: 1rem; |
|
|
|
|
margin-bottom: 1rem; |
|
|
|
|
background: var(--fog-highlight, #f3f4f6); |
|
|
|
|
border: 1px solid var(--fog-border, #e5e7eb); |
|
|
|
|
border-radius: 0.375rem; |
|
|
|
|
color: var(--fog-text, #1f2937); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .grasp-list-notice { |
|
|
|
|
background: var(--fog-dark-highlight, #475569); |
|
|
|
|
border-color: var(--fog-dark-border, #374151); |
|
|
|
|
color: var(--fog-dark-text, #f1f5f9); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.notice-content { |
|
|
|
|
flex: 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.notice-text { |
|
|
|
|
margin: 0 0 0.5rem 0; |
|
|
|
|
font-weight: 500; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.notice-relays { |
|
|
|
|
margin: 0.5rem 0 0.25rem 0; |
|
|
|
|
font-size: 0.875rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.relay-list { |
|
|
|
|
margin: 0.25rem 0 0 0; |
|
|
|
|
padding-left: 1.5rem; |
|
|
|
|
font-size: 0.875rem; |
|
|
|
|
list-style: disc; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.relay-note { |
|
|
|
|
color: var(--fog-text-light, #52667a); |
|
|
|
|
font-style: italic; |
|
|
|
|
margin-left: 0.5rem; |
|
|
|
|
font-size: 0.8125rem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .relay-note { |
|
|
|
|
color: var(--fog-dark-text-light, #a8b8d0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.notice-note { |
|
|
|
|
margin: 0.75rem 0 0 0; |
|
|
|
|
font-size: 0.8125rem; |
|
|
|
|
color: var(--fog-text-light, #52667a); |
|
|
|
|
font-style: italic; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
:global(.dark) .notice-note { |
|
|
|
|
color: var(--fog-dark-text-light, #a8b8d0); |
|
|
|
|
} |
|
|
|
|
</style> |
|
|
|
|
|