import { createPreviewEvent } from '../articleInvoice' import type { ArticleDraft } from '../articlePublisher' import type { AlbyInvoice } from '@/types/alby' import type { Article } from '@/types/nostr' import { finalizeEvent } from 'nostr-tools' import { hexToBytes } from 'nostr-tools/utils' import { buildParsedArticleFromDraft as buildParsedArticleFromDraftCore } from '../articleDraftToParsedArticle' import { getPublishRelays } from '../relaySelection' import { writeOrchestrator } from '../writeOrchestrator' import { getPrivateKeyForSigning } from './shared' export async function buildParsedArticleFromDraft( draft: ArticleDraft, invoice: AlbyInvoice, authorPubkey: string ): Promise<{ article: Article; hash: string; version: number; index: number }> { return buildParsedArticleFromDraftCore({ draft, invoice, authorPubkey }) } export interface PublishPreviewWithInvoiceParams { draft: ArticleDraft invoice: AlbyInvoice authorPubkey: string presentationId: string extraTags?: string[][] customArticle?: Article } export async function publishPreviewWithInvoice(params: PublishPreviewWithInvoiceParams): Promise { const payload = await resolvePublicationPayload(params) const previewEventTemplate = await createPreviewEvent({ draft: params.draft, invoice: params.invoice, authorPubkey: params.authorPubkey, authorPresentationId: params.presentationId, ...(params.extraTags ? { extraTags: params.extraTags } : {}), }) const privateKey = getPrivateKeyForSigning(undefined) const event = finalizeEvent(previewEventTemplate, hexToBytes(privateKey)) return publishPublicationToRelays({ event, payload }) } async function resolvePublicationPayload(params: PublishPreviewWithInvoiceParams): Promise<{ article: Article; hash: string; version: number; index: number }> { if (params.customArticle) { return { article: params.customArticle, hash: params.customArticle.hash, version: params.customArticle.version, index: params.customArticle.index ?? 0 } } return buildParsedArticleFromDraft(params.draft, params.invoice, params.authorPubkey) } async function publishPublicationToRelays(params: { event: import('nostr-tools').Event; payload: { article: Article; hash: string; version: number; index: number } }): Promise { const relays = await getPublishRelays() const result = await writeOrchestrator.writeAndPublish( { objectType: 'publication', hash: params.payload.hash, event: params.event, parsed: params.payload.article, version: params.payload.version, hidden: false, index: params.payload.index }, relays ) return result.success ? params.event : null }