From f441f3e6d182ec573477e123b0f8ba2ddd05b1a4 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Wed, 28 Oct 2026 12:58:10 +0100 Subject: [PATCH] fix: show calendar, subscription and account addresses in settings left to right in arabic --- .../calendar-management-settings.test.tsx | 15 +++++++++++++- .../__tests__/settings-ltr-addresses.test.tsx | 20 +++++++++++++++++++ .../settings/account-security-settings.tsx | 2 +- components/settings/account-settings.tsx | 6 +++--- .../settings/calendar-management-settings.tsx | 5 +++-- components/settings/multi-account-push.tsx | 4 ++-- .../settings/share-collection-dialog.tsx | 2 +- components/settings/sidebar-apps-settings.tsx | 4 ++-- 8 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 components/settings/__tests__/settings-ltr-addresses.test.tsx diff --git a/components/settings/__tests__/calendar-management-settings.test.tsx b/components/settings/__tests__/calendar-management-settings.test.tsx index 439eb43d6..4f2b4bdce 100644 --- a/components/settings/__tests__/calendar-management-settings.test.tsx +++ b/components/settings/__tests__/calendar-management-settings.test.tsx @@ -68,9 +68,22 @@ describe('CalendarManagementSettings CalDAV fallback address', () => { render(); - expect(await screen.findByText('https://host.example/stalwart/.well-known/caldav')).toBeInTheDocument(); + const url = await screen.findByText('https://host.example/stalwart/.well-known/caldav'); + // Left to right in Arabic too: the start of the address stays in view. + expect(url).toHaveAttribute('dir', 'ltr'); vi.restoreAllMocks(); }); + + it('shows a subscription address left to right', () => { + useAuthStore.setState({ client: { getAccountId: () => 'acct-1' }, serverUrl: null, username: null } as never); + useCalendarStore.setState({ + calendars: [appleColored], + icalSubscriptions: [{ id: 's', name: 'Holidays', url: 'https://example.com/holidays.ics', color: '#ff0000', calendarId: 'x' }], + updateCalendar: vi.fn(), + } as never); + render(); + expect(screen.getByText('https://example.com/holidays.ics')).toHaveAttribute('dir', 'ltr'); + }); }); // Phone: seven icons in a row hid the calendar names. The row actions are diff --git a/components/settings/__tests__/settings-ltr-addresses.test.tsx b/components/settings/__tests__/settings-ltr-addresses.test.tsx new file mode 100644 index 000000000..6fcaf9ea0 --- /dev/null +++ b/components/settings/__tests__/settings-ltr-addresses.test.tsx @@ -0,0 +1,20 @@ +import { render, screen } from '@testing-library/react'; +import { afterEach, describe, expect, it } from 'vitest'; +import { useSettingsStore } from '@/stores/settings-store'; +import { SidebarAppsSettings } from '../sidebar-apps-settings'; + +// Addresses read left to right in an Arabic layout too; in a right-to-left +// box a cut address lost its start ("https://") instead of its end. + +const initial = useSettingsStore.getState(); +afterEach(() => { useSettingsStore.setState(initial, true); }); + +describe('addresses in Settings', () => { + it('shows a sidebar app address left to right', () => { + useSettingsStore.setState({ + sidebarApps: [{ id: 'a', name: 'Wiki', url: 'https://wiki.example.com/start', icon: 'globe', openMode: 'inline' }], + } as never); + render(); + expect(screen.getByText('https://wiki.example.com/start')).toHaveAttribute('dir', 'ltr'); + }); +}); diff --git a/components/settings/account-security-settings.tsx b/components/settings/account-security-settings.tsx index 11697c9b6..3050067d8 100644 --- a/components/settings/account-security-settings.tsx +++ b/components/settings/account-security-settings.tsx @@ -334,7 +334,7 @@ function TotpSection() { )}
- {setupUrl} + {setupUrl}
diff --git a/components/settings/account-settings.tsx b/components/settings/account-settings.tsx index 22a954062..51ad26d32 100644 --- a/components/settings/account-settings.tsx +++ b/components/settings/account-settings.tsx @@ -155,13 +155,13 @@ export function AccountSettings() { {/* Email Address */} - {email ? toUnicodeEmail(email) : tCommon('unknown')} + {email ? toUnicodeEmail(email) : tCommon('unknown')} {/* Username / Login (show when it differs from email) */} {username && username !== email && ( - {toUnicodeEmail(username)} + {toUnicodeEmail(username)} )} @@ -410,7 +410,7 @@ function AccountRow({ )}
-

+

{toUnicodeEmail(account.email || account.username)}

diff --git a/components/settings/calendar-management-settings.tsx b/components/settings/calendar-management-settings.tsx index 00d901eef..bc41bf66a 100644 --- a/components/settings/calendar-management-settings.tsx +++ b/components/settings/calendar-management-settings.tsx @@ -727,7 +727,8 @@ export function CalendarManagementSettings() { return (
- + {/* An address reads left to right in Arabic too, cut at its end. */} + {caldavUrl} { const safeUrl = redactUrlCredentials(sub.url); return ( - + {safeUrl} ); diff --git a/components/settings/multi-account-push.tsx b/components/settings/multi-account-push.tsx index 532313745..97377b34b 100644 --- a/components/settings/multi-account-push.tsx +++ b/components/settings/multi-account-push.tsx @@ -125,7 +125,7 @@ export function MultiAccountPushSettings({ relayBaseUrl }: { relayBaseUrl?: stri {account.displayName || account.label || account.username} - {account.email || account.username} · {enabled[account.id] ? t('state_on') : t('state_off')} + {account.email || account.username} · {enabled[account.id] ? t('state_on') : t('state_off')} @@ -143,7 +143,7 @@ export function MultiAccountPushSettings({ relayBaseUrl }: { relayBaseUrl?: stri {failures.length > 0 &&
    {failures.map(f =>
  • {f.name} - {f.email && f.email !== f.name && ({f.email})} + {f.email && f.email !== f.name && ({f.email})} : {f.reason}
  • )}
} diff --git a/components/settings/share-collection-dialog.tsx b/components/settings/share-collection-dialog.tsx index a9412dc62..cd42ea6f6 100644 --- a/components/settings/share-collection-dialog.tsx +++ b/components/settings/share-collection-dialog.tsx @@ -401,7 +401,7 @@ export function ShareCollectionDialog({ )}
{p.email && p.email !== p.name && ( -
{p.email}
+
{p.email}
)}
{savingId === p.id && } diff --git a/components/settings/sidebar-apps-settings.tsx b/components/settings/sidebar-apps-settings.tsx index cf3a99214..ccabe35fb 100644 --- a/components/settings/sidebar-apps-settings.tsx +++ b/components/settings/sidebar-apps-settings.tsx @@ -206,7 +206,7 @@ function ManagedAppsSection() {
{app.name}
-
{app.url}
+
{app.url}
@@ -332,7 +332,7 @@ export function SidebarAppsSettings() {
{app.name}
-
{app.url}
+
{app.url}