56f624a073
- Add pluginToolbarStore for plugin toolbar item registration - Add PluginToolbar component (slim ribbon bar under TopBar) - Update AppShell to render PluginToolbar between TopBar and content - Mail page registers toolbar items (account select, search, compose, sync, settings) - Remove old mail top bar, use plugin toolbar instead - Fix mail response: arrays for addresses, add from_name/body_html/sanitized_html/date
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
export interface ToolbarItem {
|
|
id: string;
|
|
plugin: string;
|
|
label: string;
|
|
icon?: React.ReactNode;
|
|
onClick: () => void;
|
|
group?: string;
|
|
disabled?: boolean;
|
|
active?: boolean;
|
|
type?: 'button' | 'search' | 'select';
|
|
searchPlaceholder?: string;
|
|
onSearch?: (query: string) => void;
|
|
selectOptions?: { value: string; label: string }[];
|
|
selectValue?: string;
|
|
onSelect?: (value: string) => void;
|
|
}
|
|
|
|
interface PluginToolbarState {
|
|
items: ToolbarItem[];
|
|
activePlugin: string | null;
|
|
registerItems: (plugin: string, items: ToolbarItem[]) => void;
|
|
unregisterPlugin: (plugin: string) => void;
|
|
setActivePlugin: (plugin: string | null) => void;
|
|
updateItem: (plugin: string, id: string, updates: Partial<ToolbarItem>) => void;
|
|
}
|
|
|
|
export const usePluginToolbarStore = create<PluginToolbarState>((set) => ({
|
|
items: [],
|
|
activePlugin: null,
|
|
registerItems: (plugin, newItems) =>
|
|
set((state) => ({
|
|
items: [...state.items.filter((i) => i.plugin !== plugin), ...newItems],
|
|
activePlugin: plugin,
|
|
})),
|
|
unregisterPlugin: (plugin) =>
|
|
set((state) => ({
|
|
items: state.items.filter((i) => i.plugin !== plugin),
|
|
activePlugin: state.activePlugin === plugin ? null : state.activePlugin,
|
|
})),
|
|
setActivePlugin: (plugin) => set({ activePlugin: plugin }),
|
|
updateItem: (plugin, id, updates) =>
|
|
set((state) => ({
|
|
items: state.items.map((i) =>
|
|
i.plugin === plugin && i.id === id ? { ...i, ...updates } : i
|
|
),
|
|
})),
|
|
}));
|