+
{title}
) : (
@@ -204,7 +204,7 @@ function BackButton({ children }: { children?: React.ReactNode }) {
onClick={() => pop()}
>
-
{children}
+
{children}
)
}
diff --git a/src/lib/draft-event.ts b/src/lib/draft-event.ts
index 305f606b..f2db71dd 100644
--- a/src/lib/draft-event.ts
+++ b/src/lib/draft-event.ts
@@ -1405,8 +1405,62 @@ export function buildClientTag(handlerPubkey?: string, handlerIdentifier?: strin
return ['client', 'imwald']
}
-export function buildAltTag() {
- return ['alt', 'This event was published by https://jumble.imwald.eu.']
+/** Canonical `alt` we attach for Imwald / jumble.imwald.eu publishing attribution (NIP-31). */
+export const IMWALD_ATTRIBUTION_ALT_TEXT = 'This event was published by https://jumble.imwald.eu.'
+
+export function buildAltTag(): string[] {
+ return ['alt', IMWALD_ATTRIBUTION_ALT_TEXT]
+}
+
+/**
+ * True for `alt` tags that are *our* app attribution (current or legacy Jumble/Imwald wording).
+ * Does not match arbitrary user `alt` text unless it clearly points at this app.
+ */
+export function isImwaldAppAttributionAltTag(tag: string[]): boolean {
+ if (!Array.isArray(tag) || tag[0] !== 'alt' || tag.length < 2) return false
+ const raw = tag[1]
+ if (typeof raw !== 'string') return false
+ const v = raw.trim()
+ if (v === IMWALD_ATTRIBUTION_ALT_TEXT) return true
+ const l = v.toLowerCase()
+ if (l.includes('jumble.imwald.eu')) return true
+ if (
+ /^this event was published\b/i.test(v) &&
+ (l.includes('imwald') || l.includes('jumble'))
+ ) {
+ return true
+ }
+ return false
+}
+
+/** Removes every `client` tag and any Jumble/Imwald attribution `alt` (see {@link isImwaldAppAttributionAltTag}). */
+export function stripImwaldAttributionTags(tags: string[][]): string[][] {
+ return tags.filter(
+ (tag) =>
+ Array.isArray(tag) &&
+ tag[0] !== 'client' &&
+ !isImwaldAppAttributionAltTag(tag)
+ )
+}
+
+/**
+ * Before sign/publish: strip all `client` tags and Imwald/Jumble attribution `alt` tags, then
+ * append exactly one {@link buildClientTag} + {@link buildAltTag} when `addClientTag !== false`.
+ */
+export function applyImwaldAttributionTags(
+ draftEvent: TDraftEvent,
+ options?: { addClientTag?: boolean }
+): TDraftEvent {
+ const draft = JSON.parse(JSON.stringify(draftEvent)) as TDraftEvent
+ const existingTags = Array.isArray(draft.tags) ? draft.tags : []
+ const sanitizedTags = stripImwaldAttributionTags(existingTags)
+ const shouldAdd = options?.addClientTag !== false
+ if (shouldAdd) {
+ draft.tags = [...sanitizedTags, buildClientTag(), buildAltTag()]
+ } else {
+ draft.tags = [...sanitizedTags]
+ }
+ return draft
}
function buildNsfwTag() {
diff --git a/src/lib/event.ts b/src/lib/event.ts
index 8deb33b0..7d011908 100644
--- a/src/lib/event.ts
+++ b/src/lib/event.ts
@@ -529,11 +529,13 @@ export function getNoteBech32Id(event: Event) {
export function getUsingClient(event: Event) {
const clientTag = event.tags.find(tagNameEquals('client'))
if (!clientTag) return undefined
-
+
// NIP-89 client tag format: ["client", "Client Name", "31990:pubkey:identifier", "relay"]
// Simple format: ["client", "client_name"]
- // For display purposes, we use the client name (second element)
- return clientTag[1]
+ const name = clientTag[1]
+ if (!name) return undefined
+ if (name.toLowerCase() === 'imwald') return 'Imwald'
+ return name
}
export function getImetaInfosFromEvent(event: Event) {
diff --git a/src/lib/like-reaction-emojis.ts b/src/lib/like-reaction-emojis.ts
new file mode 100644
index 00000000..fcb396ab
--- /dev/null
+++ b/src/lib/like-reaction-emojis.ts
@@ -0,0 +1,19 @@
+/**
+ * Single source for the quick-like emoji row (SuggestedEmojis “+” row uses the same glyphs;
+ * emoji-picker-react needs hex unified ids — see {@link EMOJI_PICKER_REACTIONS}).
+ */
+export const DEFAULT_SUGGESTED_EMOJIS = ['❤️', '👍', '🔥', '😂', '😢', '🫂', '🚀'] as const
+
+function emojiToPickerUnified(emoji: string): string {
+ const parts: string[] = []
+ for (const ch of emoji) {
+ const cp = ch.codePointAt(0)
+ if (cp != null) parts.push(cp.toString(16))
+ }
+ return parts.join('-')
+}
+
+/** Unified ids for `emoji-picker-react` reactions row — derived from {@link DEFAULT_SUGGESTED_EMOJIS}. */
+export const EMOJI_PICKER_REACTIONS: readonly string[] = DEFAULT_SUGGESTED_EMOJIS.map((e) =>
+ emojiToPickerUnified(e)
+)
diff --git a/src/pages/primary/ExplorePage/index.tsx b/src/pages/primary/ExplorePage/index.tsx
index c7701953..4da1006c 100644
--- a/src/pages/primary/ExplorePage/index.tsx
+++ b/src/pages/primary/ExplorePage/index.tsx
@@ -168,7 +168,7 @@ function ExplorePageTitlebar({ onRefresh }: { onRefresh: () => void }) {
-
{t('Explore')}
+
{t('Explore')}
diff --git a/src/pages/primary/MePage/index.tsx b/src/pages/primary/MePage/index.tsx
index d57ed55d..4d79c46a 100644
--- a/src/pages/primary/MePage/index.tsx
+++ b/src/pages/primary/MePage/index.tsx
@@ -134,7 +134,7 @@ function MePageTitlebar({ onRefresh }: { onRefresh: () => void }) {
const { t } = useTranslation()
return (
-
{t('YouTabName')}
+
{t('YouTabName')}
)
diff --git a/src/pages/primary/NoteListPage/index.tsx b/src/pages/primary/NoteListPage/index.tsx
index 6a5c8459..b57e1293 100644
--- a/src/pages/primary/NoteListPage/index.tsx
+++ b/src/pages/primary/NoteListPage/index.tsx
@@ -171,7 +171,7 @@ const NoteListPage = forwardRef
((_, ref) => {
<>
{isSmallScreen ? : null}
-
{feedPageTitle}
+ {feedPageTitle}
{showFavoriteRelaysPicker ? : null}
{homeSubHeader}
diff --git a/src/pages/primary/ProfilePage/index.tsx b/src/pages/primary/ProfilePage/index.tsx
index e487e619..f285a4e7 100644
--- a/src/pages/primary/ProfilePage/index.tsx
+++ b/src/pages/primary/ProfilePage/index.tsx
@@ -52,7 +52,7 @@ function ProfilePageTitlebar({ onFeedRefresh }: { onFeedRefresh: () => void }) {
-
{t('Profile')}
+
{t('Profile')}
diff --git a/src/pages/primary/RelayPage/index.tsx b/src/pages/primary/RelayPage/index.tsx
index f71833df..998ad49e 100644
--- a/src/pages/primary/RelayPage/index.tsx
+++ b/src/pages/primary/RelayPage/index.tsx
@@ -48,7 +48,7 @@ function RelayPageTitlebar({ url, onRefresh }: { url?: string; onRefresh: () =>
-
{simplifyUrl(url ?? '')}
+
{simplifyUrl(url ?? '')}
diff --git a/src/pages/primary/RssPage/index.tsx b/src/pages/primary/RssPage/index.tsx
index db670932..64d9a353 100644
--- a/src/pages/primary/RssPage/index.tsx
+++ b/src/pages/primary/RssPage/index.tsx
@@ -63,7 +63,7 @@ const RssPage = forwardRef
((_, ref) => {
-
{t('RSS + Web')}
+
{t('RSS + Web')}