feat: add address book, fix email layout, update dependencies

- Address book with JMAP sync and local fallback (contacts CRUD,
  search/filter, composer autocomplete, i18n for 8 languages)
- Fix email layout: remove horizontal scroll, left-side clipping,
  and empty spaces from blocked external images in newsletters
- Update all dependencies to latest compatible versions
- Expand i18n from 3 to 8 languages (added ES, IT, DE, NL, PT)
- Upgrade Next.js to 16.1.6 for security patches
This commit is contained in:
Matthieu MALVACHE
2026-02-16 17:25:20 +01:00
committed by Matthieu MALVACHE
parent 5d60fe5186
commit 8a5bc9b88d
27 changed files with 2927 additions and 968 deletions
+14
View File
@@ -3,6 +3,7 @@ import { persist } from 'zustand/middleware';
import { JMAPClient } from '@/lib/jmap/client';
import { useEmailStore } from './email-store';
import { useIdentityStore } from './identity-store';
import { useContactStore } from './contact-store';
import type { Identity } from '@/lib/jmap/types';
interface AuthState {
@@ -50,6 +51,16 @@ export const useAuthStore = create<AuthState>()(
// Sync identities to identity store
useIdentityStore.getState().setIdentities(identities);
// Fetch contacts if server supports JMAP Contacts
if (client.supportsContacts()) {
const contactStore = useContactStore.getState();
contactStore.setSupportsSync(true);
contactStore.fetchAddressBooks(client).catch(() => {});
contactStore.fetchContacts(client).catch(() => {});
} else {
useContactStore.getState().setSupportsSync(false);
}
// Success - save state (but NOT the password)
set({
isAuthenticated: true,
@@ -124,6 +135,9 @@ export const useAuthStore = create<AuthState>()(
// Clear identity store state
useIdentityStore.getState().clearIdentities();
// Clear contact store state
useContactStore.getState().clearContacts();
},
checkAuth: async () => {