From ff52f711da31ffa41d27676c0218fb17ed78dd9b Mon Sep 17 00:00:00 2001 From: Coracle-Bot Date: Tue, 29 Sep 2026 16:01:37 +0000 Subject: [PATCH] Wait for the settings decrypt before reading the send delay (#681) --- src/app/settings.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/app/settings.ts b/src/app/settings.ts index 5043055a..d8bfded2 100644 --- a/src/app/settings.ts +++ b/src/app/settings.ts @@ -1,6 +1,6 @@ import type {Writable} from "svelte/store" import {derived, writable} from "svelte/store" -import {append, equals, remove, spec, toggle} from "@welshman/lib" +import {append, equals, poll, remove, spec, toggle} from "@welshman/lib" import {APP_DATA} from "@welshman/util" import {withGetter} from "@welshman/store" import {AppData} from "@welshman/domain" @@ -11,6 +11,8 @@ import {app, fromApp, usePlugin} from "@app/core" export const SETTINGS = "flotilla/settings" +const settingsFilter = {kinds: [APP_DATA], "#d": [SETTINGS]} + export enum RelayAuthMode { Aggressive = "aggressive", Conservative = "conservative", @@ -59,7 +61,7 @@ export class Settings extends DerivedPlugin { constructor(app: IApp) { super(app, { - filters: [{kinds: [APP_DATA], "#d": [SETTINGS]}], + filters: [settingsFilter], eventToItem: app.use(Domain).reader(AppData), getKey: settings => settings.author(), }) @@ -71,7 +73,7 @@ export class Settings extends DerivedPlugin { } fetch(pubkey: string) { - return this.app.use(Network).loadUsingOutbox(pubkey, {kinds: [APP_DATA], "#d": [SETTINGS]}) + return this.app.use(Network).loadUsingOutbox(pubkey, settingsFilter) } } @@ -110,13 +112,18 @@ export const createSettingsForm = (): Writable => { } } -// A send reads the delay when it is clicked, and a room can paint before the user's own settings arrive. +// A send reads the delay when it is clicked, and the settings event is readable only once it decrypts. export const loadSendDelay = async () => { const $app = app.get() const {pubkey} = User.require($app) + const decrypted = () => Boolean($app.use(Settings).get(pubkey)) - if (!$app.use(Settings).get(pubkey)) { + if (!decrypted()) { await $app.use(Settings).load(pubkey) + + if ($app.repository.query([{...settingsFilter, authors: [pubkey]}]).length > 0) { + await poll({interval: 30, condition: decrypted, signal: AbortSignal.timeout(3000)}) + } } return userSettingsValues.get().send_delay