aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2025-11-07 13:47:47 -0500
committerAdrien Hopkins <[email protected]>2025-11-07 13:47:47 -0500
commit05246ae8d0597ef86f912476ed0a369424d19a72 (patch)
treef7b71e2bae33988e7bffd2c16ca087ee5d041ac3
parent6a9ef382bcdc3825b874fbbfbb9d291983365507 (diff)
downloadcoinos-ui-05246ae8d0597ef86f912476ed0a369424d19a72.tar.gz
coinos-ui-05246ae8d0597ef86f912476ed0a369424d19a72.zip
Dim messages near expiry
-rw-r--r--src/locales/en.json1
-rw-r--r--src/locales/fr.json1
-rw-r--r--src/routes/(app)/dm/[recipient]/+page.svelte20
3 files changed, 18 insertions, 4 deletions
diff --git a/src/locales/en.json b/src/locales/en.json
index a8b8a06a..427c8d96 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -97,6 +97,7 @@
"recipientMsg": "You are sending nostr messages to [R].",
"sendMessage": "Send Message",
"expiry": "Enable message expiry",
+ "fadedWarning": "To avoid metadata leaks, messages expire at a random time up to 2 days after you specify; each message has its own random expiry time. Messages which appear faded are close to expiring; nearby messages may be missing.",
"days": "days",
"relaysNotFound": "Could not find [R]’s DM relays.",
"noRelaysSet": "WARNING: You haven't set any preferred relays. You won't be able to receive any messages or see the messages you've sent.",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 76d3c5c2..4a096420 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -29,6 +29,7 @@
"recipientMsg": "Vous envoyez messages nostr à [R].",
"sendMessage": "Envoyez Message",
"expiry": "Expirez messages",
+ "fadedWarning": "Pour protéger vos métadonées, vos messages expirent à un temps randomée au maximum 2 jours après la date que vous spécifiez; chaque message a son propre temps d’expiration randomée. Les messages qui semble faibles sont proche à expirer; les autres messages autours pouvait avoir déjà disparu.",
"days": "jours",
"relaysNotFound": "Ne pouvait pas trouvez les relais MD de [R].",
"noRelaysSet": "AVERTISSEMENT: Vous n’avez pas specifié vos relais préferés pour messages directs. Vous ne pouvez pas reçevoir des messages ou voir les messages que vous avez envoyé.",
diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte
index c64df7f7..443119fe 100644
--- a/src/routes/(app)/dm/[recipient]/+page.svelte
+++ b/src/routes/(app)/dm/[recipient]/+page.svelte
@@ -75,6 +75,10 @@
return false;
}
+ const expirationClose = (expiration: number) => {
+ return expiration <= (Date.now() / 1000 + 2 * 86400);
+ }
+
const loadEvents = async (relays: string[]) => {
const wrapped = await pool.querySync(
relays, { kinds: [1059], "#p": [user.pubkey], limit: DM_FETCH_LIMIT }
@@ -86,6 +90,11 @@
if (!expired(event)) {
const rumour = await decryptMessage(event);
const created = Math.floor(rumour.created_at / 86400);
+ for (const tag of event.tags) {
+ if (tag[0] == "expiration") {
+ rumour.expiration = parseInt(tag[1]);
+ }
+ }
appendMultimap(decryptedRumours, created, rumour);
} else console.log("relay contains expired event", event.id);
}
@@ -130,9 +139,6 @@
message, sk, recipient.pubkey, user.pubkey, expiry);
}
- console.log(Date.now() / 1000);
- console.log(event2.tags);
-
const recipientRelays = await getPreferredRelays(recipient.pubkey);
const p1 = Promise.any(pool.publish(recipientRelays, event1));
const senderRelays = await getPreferredRelays(user.pubkey);
@@ -166,6 +172,10 @@
color: #ff7f00;
}
+ .expiring {
+ color: #7f7f7f;
+ }
+
.link {
text-decoration-line: underline;
}
@@ -205,7 +215,7 @@
<ul>
{#each messageRumours.get(day) as rumour}
{#if rumour.pubkey === recipient.pubkey || rumour.pubkey === user.pubkey}
- <li>{timeString(new Date(rumour.created_at * 1000))} {dmName(rumour.pubkey)}: {rumour.content}</li>
+ <li class={rumour.expiration && expirationClose(rumour.expiration) ? "expiring" : ""}>{timeString(new Date(rumour.created_at * 1000))} {dmName(rumour.pubkey)}: {rumour.content}</li>
{/if}
{/each}
</ul>
@@ -215,6 +225,8 @@
<textarea id="message-contents" bind:value={text}></textarea>
<input type="checkbox" class="tiny" bind:checked={expiryEnabled}>{$t("dm.expiry")}: <input type="number" class="short" bind:value={expiryDays} disabled={!expiryEnabled} min="1" step="1" max="99999"> {$t("dm.days")}.
+ <p class="expiring">{$t("dm.fadedWarning")}</p>
+
<input id="send-message" type="button" class="btn" disabled={!canSend} value={canSend ? $t("dm.sendMessage") : $t("dm.relaysNotFound").replace("[R]", recipient.username)} on:click={async () => sendMessage(text)}>
{#if relayWarningShown}
<p class="warning"><em>{$t("dm.noRelaysSet")} <a class="link" href="/settings/nostr#dm-relays">{$t("dm.nostrSettingsLink")}</a></em></p>