check for nip-9a support

This commit is contained in:
mplorentz 2026-09-03 12:40:28 -04:00
parent a7b948740c
commit 2b2515b1be
2 changed files with 77 additions and 0 deletions

View file

@ -0,0 +1,26 @@
<script lang="ts">
import Button from "@lib/components/Button.svelte"
import Modal from "@lib/components/Modal.svelte"
import ModalBody from "@lib/components/ModalBody.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalTitle from "@lib/components/ModalTitle.svelte"
import {popModal} from "@app/modal"
const gotIt = () => popModal()
</script>
<Modal
><ModalBody>
<ModalHeader>
<ModalTitle>Email notifications</ModalTitle>
</ModalHeader>
<p>
For a community's new messages to appear in your email digest, its relay must support NIP-9a
(email notifications).
</p>
<p>
If a community is missing from your digest, ask the community admin to enable NIP-9a on their
relay.
</p>
<Button class="button button-primary" onclick={gotIt}>Got it</Button>
</ModalBody></Modal>

View file

@ -1,6 +1,8 @@
<script lang="ts">
import cx from "classnames"
import {derived} from "svelte/store"
import {sleep} from "@welshman/lib"
import type {Relay} from "@welshman/domain"
import {Capacitor} from "@capacitor/core"
import {Badge} from "@capawesome/capacitor-badge"
import Bell from "@assets/icons/bell.svg?dataurl"
@ -12,12 +14,16 @@
import Button from "@lib/components/Button.svelte"
import PageContent from "@lib/components/PageContent.svelte"
import {pushToast} from "@app/toast"
import {pushModal} from "@app/modal"
import {clearBadges} from "@app/notifications"
import {Push} from "@app/push"
import {Mail} from "@app/mail"
import {notificationSettings, publishSettings, userSettingsValues} from "@app/settings"
import {emailNotificationState} from "@app/push/adapters/common"
import {EMAIL_NOTIFICATION_SERVER} from "@app/env"
import {relays} from "@app/core"
import {userSpaceUrls} from "@app/rooms"
import EmailNotificationsInfo from "@app/components/EmailNotificationsInfo.svelte"
const clearError = () => {
if ($emailNotificationState.error) {
@ -112,6 +118,34 @@
}
})
// Communities whose relay doesn't advertise NIP-9a won't be included in the email digest.
// Subscribing to each space's NIP-11 info triggers a fetch for any that hasn't loaded yet.
const communitiesWithoutEmail = derived(
userSpaceUrls,
($urls, set: (value: string[]) => void) => {
const unsubscribers = $urls.map(url =>
relays
.get()
.one(url)
.subscribe(() =>
set(
$urls
.map(url => relays.get().get(url))
.filter((relay): relay is Relay => relay !== undefined && !relay.hasNip("9a"))
.map(relay => relay.display()),
),
),
)
return () =>
unsubscribers.forEach(unsubscribe => {
unsubscribe()
})
},
)
const showEmailInfo = () => pushModal(EmailNotificationsInfo)
let loading = $state(false)
let settings = $state(buildSettings())
</script>
@ -198,6 +232,23 @@
{/snippet}
</FieldInline>
{#if settings.email}
{#if $communitiesWithoutEmail.length > 0}
<div class="flex flex-col gap-1 rounded-2xl border border-warning bg-warning/10 p-4">
<p class="flex items-center gap-2 text-sm text-warning">
{#if $communitiesWithoutEmail.length === 1}
1 of your communities does not support email notifications.
{:else}
{$communitiesWithoutEmail.length} of your communities do not support email notifications.
{/if}
<Button class="link" onclick={showEmailInfo}>Learn more</Button>
</p>
<ul class="list-inside list-disc text-sm text-warning">
{#each $communitiesWithoutEmail as name (name)}
<li>{name}</li>
{/each}
</ul>
</div>
{/if}
<FieldInline>
{#snippet label()}
<p>Email address</p>