Store the theme with the account, in the webmail's settings.json
The palette and light/dark choice now live in the account's JMAP Files (ihasmail/settings.json), the same file and keys INBUXA webmail uses, so the theme follows the user across devices and both apps. The admin reads it at sign-in and writes only palette, mode and the derived legacy theme, after a fresh read, keeping every other key. A palette change keeps the stored mode. localStorage stays as the first-paint cache.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
|
||||
* SPDX-FileCopyrightText: 2026 Coffey Labs
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
@@ -32,7 +33,11 @@ export function getAccountId(objectType: string): string {
|
||||
return activeAccountId;
|
||||
}
|
||||
|
||||
export async function jmapRequest(methodCalls: JmapMethodCall[], signal?: AbortSignal): Promise<JmapMethodResponse[]> {
|
||||
export async function jmapRequest(
|
||||
methodCalls: JmapMethodCall[],
|
||||
signal?: AbortSignal,
|
||||
extraUsing: string[] = [],
|
||||
): Promise<JmapMethodResponse[]> {
|
||||
const { apiUrl } = useAuthStore.getState();
|
||||
let path = apiUrl || '/jmap';
|
||||
if (path.startsWith('http://') || path.startsWith('https://')) {
|
||||
@@ -48,7 +53,7 @@ export async function jmapRequest(methodCalls: JmapMethodCall[], signal?: AbortS
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
using: JMAP_USING,
|
||||
using: [...JMAP_USING, ...extraUsing],
|
||||
methodCalls,
|
||||
}),
|
||||
signal,
|
||||
|
||||
Reference in New Issue
Block a user