mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-11-03 00:13:09 +00:00
feat: set the tab title on Settings, Calendar, Contacts and Files
Only the mail shell updated document.title, so every other surface sat at the static value the root layout renders: the tab could not tell you where you were, and on a multi-account setup it could not tell you whose mailbox you were in either. Each surface now sets "<screen> - <account> - <app>" through the shared useDocumentTitle hook. Labels reuse the sidebar navigation translations, so the tab and the rail never disagree about what a screen is called - no new translation keys. Refs #1159 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8ca7dbbe9b
commit
13e2855484
@@ -91,6 +91,7 @@ import {
|
||||
} from "@/lib/calendar-scroll-window";
|
||||
import { useLiteLinkSegments } from "@/hooks/use-lite-link-segments";
|
||||
import { findMeetingLink } from "@/lib/event-links";
|
||||
import { useDocumentTitle } from "@/hooks/use-document-title";
|
||||
|
||||
type PendingScopeAction =
|
||||
| { type: "edit"; event: CalendarEvent; updates: Partial<CalendarEvent>; sendScheduling?: boolean }
|
||||
@@ -111,6 +112,8 @@ export function CalendarApp({ linkSegments: routeSegments }: CalendarAppProps =
|
||||
const linkSegments = useLiteLinkSegments('calendar', routeSegments);
|
||||
const router = useRouter();
|
||||
const t = useTranslations("calendar");
|
||||
const tSidebar = useTranslations("sidebar");
|
||||
useDocumentTitle(tSidebar("calendar"));
|
||||
const tWebcalAction = useTranslations("calendar.webcal_action");
|
||||
const tDeepLink = useTranslations("deep_link");
|
||||
const isMobile = useIsMobile();
|
||||
|
||||
@@ -43,6 +43,7 @@ import { consumePendingDeepLinkEntry, subscribePendingDeepLink } from "@/lib/dee
|
||||
import { useDeepLinkUrl } from "@/hooks/use-deep-link-url";
|
||||
import { useProInterfaceActive } from "@/components/pro/pro-interface-redirect";
|
||||
import { useLiteLinkSegments } from "@/hooks/use-lite-link-segments";
|
||||
import { useDocumentTitle } from "@/hooks/use-document-title";
|
||||
|
||||
type View =
|
||||
| "list"
|
||||
@@ -63,6 +64,8 @@ function ContactsAppContent({ linkSegments: routeSegments }: ContactsAppProps =
|
||||
// Static Lite build: the route params are empty, read the link from the URL.
|
||||
const linkSegments = useLiteLinkSegments('contacts', routeSegments);
|
||||
const t = useTranslations("contacts");
|
||||
const tSidebar = useTranslations("sidebar");
|
||||
useDocumentTitle(tSidebar("contacts"));
|
||||
const contactsEnabled = usePolicyStore((s) => s.isFeatureEnabled('contactsEnabled'));
|
||||
const { client, isAuthenticated, logout, checkAuth, isLoading: authLoading } = useAuthStore();
|
||||
const { showAppsModal, inlineApp, loadedApps, handleManageApps, handleInlineApp, closeInlineApp, closeAppsModal } = useSidebarApps();
|
||||
|
||||
@@ -38,6 +38,7 @@ import { consumePendingDeepLinkEntry, subscribePendingDeepLink } from "@/lib/dee
|
||||
import { useDeepLinkUrl } from "@/hooks/use-deep-link-url";
|
||||
import { useProInterfaceActive } from "@/components/pro/pro-interface-redirect";
|
||||
import { useLiteLinkSegments } from "@/hooks/use-lite-link-segments";
|
||||
import { useDocumentTitle } from "@/hooks/use-document-title";
|
||||
|
||||
export interface FilesAppProps {
|
||||
/** Path segments after `/files` - the folder path, one segment per level. */
|
||||
@@ -49,6 +50,8 @@ export function FilesApp({ linkSegments: routeSegments }: FilesAppProps = {}) {
|
||||
const linkSegments = useLiteLinkSegments('files', routeSegments);
|
||||
const router = useRouter();
|
||||
const t = useTranslations("files");
|
||||
const tSidebar = useTranslations("sidebar");
|
||||
useDocumentTitle(tSidebar("files"));
|
||||
const tDeepLink = useTranslations("deep_link");
|
||||
const filesEnabled = usePolicyStore((s) => s.isFeatureEnabled('filesEnabled'));
|
||||
const { isAuthenticated, logout, checkAuth, isLoading: authLoading, client } = useAuthStore();
|
||||
|
||||
@@ -102,6 +102,7 @@ import {
|
||||
tabSearchPaths,
|
||||
} from '@/lib/settings-search';
|
||||
import { useLiteLinkSegments } from '@/hooks/use-lite-link-segments';
|
||||
import { useDocumentTitle } from '@/hooks/use-document-title';
|
||||
|
||||
type Tab = SettingsSearchTab;
|
||||
|
||||
@@ -217,6 +218,7 @@ export function SettingsApp({ linkSegments: routeSegments }: SettingsAppProps =
|
||||
const router = useRouter();
|
||||
const t = useTranslations('settings');
|
||||
const tSidebar = useTranslations('sidebar');
|
||||
useDocumentTitle(tSidebar('settings'));
|
||||
const { client, isAuthenticated, logout, checkAuth, isLoading: authLoading } = useAuthStore();
|
||||
const { showAppsModal, inlineApp, loadedApps, handleManageApps, handleInlineApp, closeInlineApp, closeAppsModal } = useSidebarApps();
|
||||
const isEmbedded = useIsEmbedded();
|
||||
|
||||
Reference in New Issue
Block a user