diff --git a/ui/src/lib/app.svelte.ts b/ui/src/lib/app.svelte.ts index a079f9f..94d8739 100644 --- a/ui/src/lib/app.svelte.ts +++ b/ui/src/lib/app.svelte.ts @@ -493,7 +493,13 @@ async function routeStartParam(param: string): Promise { showToast(t('friends.added', { name: friend.displayName })); void refreshNotifications(); } catch (err) { - handleError(err); + // Tapping your own invite link redeems your own code: show a friendly note, not + // the scary "can't do that to yourself" error. + if (err instanceof GatewayError && err.code === 'self_relation') { + showToast(t('friends.selfInvite')); + } else { + handleError(err); + } } return; default: diff --git a/ui/src/lib/i18n/en.ts b/ui/src/lib/i18n/en.ts index 48cc214..b01d5b6 100644 --- a/ui/src/lib/i18n/en.ts +++ b/ui/src/lib/i18n/en.ts @@ -234,8 +234,9 @@ export const en = { 'friends.copy': 'Copy', 'friends.codeCopied': 'Code copied.', 'friends.shareTelegram': 'Share via Telegram', - 'friends.inviteText': "Let's be friends in Scrabble!", + 'friends.inviteText': "Let's play Scrabble!", 'friends.linkCopied': 'Link copied.', + 'friends.selfInvite': "Hopefully you've been friends with yourself for a while ☺️", 'friends.added': 'Added {name}.', 'friends.blockedList': 'Blocked players', 'friends.unblock': 'Unblock', diff --git a/ui/src/lib/i18n/ru.ts b/ui/src/lib/i18n/ru.ts index e3fcb7e..3d6da26 100644 --- a/ui/src/lib/i18n/ru.ts +++ b/ui/src/lib/i18n/ru.ts @@ -235,8 +235,9 @@ export const ru: Record = { 'friends.copy': 'Копировать', 'friends.codeCopied': 'Код скопирован.', 'friends.shareTelegram': 'Поделиться через Telegram', - 'friends.inviteText': 'Давай дружить в Скрэббл!', + 'friends.inviteText': 'Давай играть в Эрудит!', 'friends.linkCopied': 'Ссылка скопирована.', + 'friends.selfInvite': 'Надеюсь, что с собой Вы уже давно дружите ☺️', 'friends.added': 'Добавлен(а) {name}.', 'friends.blockedList': 'Заблокированные', 'friends.unblock': 'Разблокировать', diff --git a/ui/src/screens/Friends.svelte b/ui/src/screens/Friends.svelte index 620efeb..13d27f5 100644 --- a/ui/src/screens/Friends.svelte +++ b/ui/src/screens/Friends.svelte @@ -3,7 +3,9 @@ import { app, handleError, refreshNotifications, showToast } from '../lib/app.svelte'; import { connection } from '../lib/connection.svelte'; import { gateway } from '../lib/gateway'; - import { t } from '../lib/i18n/index.svelte'; + import { GatewayError } from '../lib/client'; + import { localeFrom, t } from '../lib/i18n/index.svelte'; + import { translate } from '../lib/i18n/catalog'; import { friendCodeParam, shareLink } from '../lib/deeplink'; import { shareTelegramLink } from '../lib/telegram'; import type { AccountRef, FriendCode } from '../lib/model'; @@ -62,7 +64,11 @@ showToast(t('friends.added', { name: friend.displayName })); await load(); } catch (e) { - handleError(e); + if (e instanceof GatewayError && e.code === 'self_relation') { + showToast(t('friends.selfInvite')); // redeeming your own code: a friendly, non-error note + } else { + handleError(e); + } } } @@ -83,8 +89,10 @@ // shareInvite shares the friend-code deep link: inside Telegram via the native // "share to chat" picker; on the web via the system share sheet; failing both, it // copies the link to the clipboard. - async function shareInvite(url: string) { - const text = t('friends.inviteText'); + async function shareInvite(url: string, lang: string) { + // The caption is in the bot's language (Эрудит for ru, Scrabble for en), not the + // interface language — the recipient lands in that bot. + const text = translate(localeFrom(lang), 'friends.inviteText'); if (shareTelegramLink(url, text)) return; if (typeof navigator !== 'undefined' && navigator.share) { try { @@ -120,7 +128,8 @@ {#if code} - {@const tg = shareLink(friendCodeParam(code.code), app.session?.serviceLanguage || app.locale)} + {@const lang = app.session?.serviceLanguage || app.locale} + {@const tg = shareLink(friendCodeParam(code.code), lang)}
@@ -130,7 +139,7 @@ {t('friends.codeHint')} · {t('friends.codeExpires', { time: codeTime(code.expiresAtUnix) })} {#if tg} - + {/if}
{:else}