feat: plugin ribbon toolbar + mail response fixes
- 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
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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
|
||||
),
|
||||
})),
|
||||
}));
|
||||
Reference in New Issue
Block a user