-
@ Don
2025-03-17 11:03:41ものさんに説明する用
CreateEntry.svelte で
previewEvent = $bindable()
として受け取っているのがプレビュー用のイベント。
ここでごちゃごちゃ変更して呼び出し元に変更を反映させる。
呼び出し元は Page.svelte と Entry.svelte の2つ。
前者が投稿欄、後者が返信欄のプレビューをそれぞれこんな感じでリアクティブで定義している。let previewEvent: UnsignedEvent | undefined = $state();
CreateEntry.svelte では受け取った previewEvent を $derived.by() や $effect() を使って他の変数に依存して勝手に変わるようにしている。
特に contentToSend に依存して変わるので、入力の度に勝手に変わる。
contentToSend は textarea で bind:value しているので onChange とか onKeyPress とかはまったく使わない。勝手に変わってくれる。 ```makeEvent() っていうのが入力された色々を突っ込むとプレビュー用の UnsignedEvent を返してくれるやつ。 1文字入力されてcontentToSendが変わる度にこれが処理される。うわー。 このイベントには付与すべきpタグも含まれている。 これをpubkeysMentioningToとして定義する。
const pubkeysMentioningTo = $derived( previewEvent?.tags.filter((tag) => tag.length >= 2 && tag[0] === 'p').map((tag) => tag[1]) ?? [] );あとは除外したいpタグリストpubkeysExcludedを定義して、
let pubkeysExcluded: string[] = $state([]); ``` pubkeysMentioningToの中からユーザーに選んでもらう。
実際に送信するイベントはpubkeysExcludedも考慮して署名する。
送信する際もmakeEvent()を呼んでるけど、こっちは引数にpubkeysExcludedが入ってる。プレビューの方には入ってない。