diff --git a/src/app/commands.ts b/src/app/commands.ts index d83705af..ed061687 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -45,7 +45,7 @@ import { nip44EncryptToSelf, loadRelay, } from "@welshman/app" -import {tagRoom, userMembership, MEMBERSHIPS, INDEXER_RELAYS, loadMembership} from "@app/state" +import {tagRoom, userMembership, MEMBERSHIPS, INDEXER_RELAYS, loadMembership, loadSettings} from "@app/state" // Utils @@ -86,6 +86,7 @@ export const loadUserData = ( const promise = Promise.all([ loadInboxRelaySelections(pubkey, request), loadMembership(pubkey, request), + loadSettings(pubkey, request), loadProfile(pubkey, request), loadFollows(pubkey, request), loadMutes(pubkey, request), diff --git a/src/app/components/Content.svelte b/src/app/components/Content.svelte index 15904b00..9386d994 100644 --- a/src/app/components/Content.svelte +++ b/src/app/components/Content.svelte @@ -28,7 +28,7 @@ import ContentQuote from "@app/components/ContentQuote.svelte" import ContentTopic from "@app/components/ContentTopic.svelte" import ContentMention from "@app/components/ContentMention.svelte" - import {entityLink} from "@app/state" + import {entityLink, userSettings} from "@app/state" export let event export let minLength = 500 @@ -69,7 +69,9 @@ warning = null } - let warning = event.tags.find(nthEq(0, "content-warning"))?.[1] + let warning = + $userSettings?.values.hide_sensitive && + event.tags.find(nthEq(0, "content-warning"))?.[1] $: shortContent = showEntire ? fullContent diff --git a/src/app/state.ts b/src/app/state.ts index 5447d0b0..bfa219e5 100644 --- a/src/app/state.ts +++ b/src/app/state.ts @@ -15,11 +15,13 @@ import { pushToMapKey, nthEq, shuffle, + parseJson, } from "@welshman/lib" import { getIdFilters, WRAP, RELAYS, + APP_DATA, REACTION, ZAP_RESPONSE, DIRECT_MESSAGE, @@ -56,6 +58,7 @@ import { pull, createSearch, userFollows, + ensurePlaintext, } from "@welshman/app" import type {AppSyncOpts} from "@welshman/app" import type {SubscribeRequestWithHandlers} from "@welshman/net" @@ -240,6 +243,42 @@ export const deriveEventsForUrl = (url: string, kinds: number[]) => ), ) +// Settings + +export const SETTINGS = "nostr-engine/User/settings/v1" + +export type Settings = { + event: TrustedEvent, + values: { + hide_sensitive: boolean + }, +} + +export const defaultSettings = { + hide_sensitive: true, +} + +export const settings = deriveEventsMapped(repository, { + filters: [{kinds: [APP_DATA], '#d': [SETTINGS]}], + itemToEvent: item => item.event, + eventToItem: async (event: TrustedEvent) => + ({event, values: {...defaultSettings, ...parseJson(await ensurePlaintext(event))}}) +}) + +export const { + indexStore: settingsByPubkey, + deriveItem: deriveSettings, + loadItem: loadSettings, +} = collection({ + name: "settings", + store: settings, + getKey: settings => settings.event.pubkey, + load: (pubkey: string, request: Partial = {}) => + load({...request, filters: [{kinds: [APP_DATA], '#d': [SETTINGS], authors: [pubkey]}]}), +}) + + + // Membership export const getMembershipUrls = (list?: List) => sort(getRelayTagValues(getListTags(list))) @@ -418,6 +457,16 @@ export const roomsByUrl = derived(channels, $channels => { // User stuff +export const userSettings = withGetter( + derived([pubkey, settingsByPubkey], ([$pubkey, $settingsByPubkey]) => { + if (!$pubkey) return undefined + + loadSettings($pubkey) + + return $settingsByPubkey.get($pubkey) + }), +) + export const userMembership = withGetter( derived([pubkey, membershipByPubkey], ([$pubkey, $membershipByPubkey]) => { if (!$pubkey) return undefined diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index d2389bb5..72546e58 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -1,20 +1,27 @@
@@ -34,7 +44,7 @@

Hide sensitive content?

- +

If content is marked by the author as sensitive, flotilla will hide it by default.