mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-11-04 16:14:07 +00:00
An installed app had no title bar of its own, no way to save attachments except a zip, and "pop out" stayed inside the page. A new window was a second copy of the app that had to restore the session itself, and on start-up that evicts any login made without "Remember me" from the list every window shares. - Title bar: `display_override` with `window-controls-overlay`, one `--titlebar-inset` variable at the page roots and skeletons, and a drag strip with the window title. 0 without an overlay, so nothing moves. - Save all to a folder: `showDirectoryPicker`, asking the device policy before the picker and before each file, with the zip as the fallback. - Pop-out routes `/popout/message/<id>` and `/popout/compose`, on offer in an installed app or when the desktop bridge has windows. Hidden in Lite. - A pop-out borrows the main window's session and never evicts or starts a token timer. Every renewal now takes a Web Lock, so two windows can't send the same refresh token, which Stalwart 1.0 may treat as a replay. - A draft moves to its window under the same id. A closing window hands unsaved text to the main window to save, since its own request wouldn't survive the close. - Read state, drafts, theme and language follow across windows, and `html[data-desktop]` gates the app-like behaviour in `app/desktop.css`.
24 lines
1009 B
TypeScript
24 lines
1009 B
TypeScript
/**
|
|
* What a composer needs to start in another window. Plain data: it crosses a
|
|
* BroadcastChannel and is kept in the pop-out's sessionStorage over a reload.
|
|
* Attachments are blob references, already on the server.
|
|
*/
|
|
|
|
import type { ComposerDraftData } from '@/components/email/email-composer';
|
|
import type { ComposePrefill } from '@/lib/plugin-compose-gate';
|
|
import type { EmailWriteSource } from '@/stores/email-store';
|
|
import type { ProComposerMode, ProReplyContext } from '@/stores/pro-tab-store';
|
|
|
|
export interface ComposePopoutPayload {
|
|
mode: ProComposerMode;
|
|
replyTo?: ProReplyContext;
|
|
initialDraftText?: string;
|
|
initialData?: ComposerDraftData | null;
|
|
prefill?: ComposePrefill | null;
|
|
/** The message replied to or forwarded, for its $answered / $forwarded flag. */
|
|
sourceEmailId?: string | null;
|
|
sourceEmailSource?: EmailWriteSource | null;
|
|
/** The mailbox a new message was started from; picks the identity (see the composer's prop). */
|
|
composeFromAccountEmail?: string;
|
|
}
|