58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
import { create } from "zustand";
|
|
|
|
interface FilePickerState {
|
|
selectedPaths: Set<string>;
|
|
expandedFolders: Set<string>;
|
|
|
|
toggleSelection: (path: string) => void;
|
|
selectAll: (paths: string[]) => void;
|
|
clearSelection: () => void;
|
|
toggleFolder: (path: string) => void;
|
|
getSelectedPaths: () => string[];
|
|
}
|
|
|
|
export const useFilePickerStore = create<FilePickerState>((set, get) => ({
|
|
selectedPaths: new Set(),
|
|
expandedFolders: new Set(),
|
|
|
|
toggleSelection: (path: string) => {
|
|
set((state) => {
|
|
const newSet = new Set(state.selectedPaths);
|
|
if (newSet.has(path)) {
|
|
newSet.delete(path);
|
|
} else {
|
|
newSet.add(path);
|
|
}
|
|
return { selectedPaths: newSet };
|
|
});
|
|
},
|
|
|
|
selectAll: (paths: string[]) => {
|
|
set((state) => {
|
|
const newSet = new Set(state.selectedPaths);
|
|
paths.forEach((p) => newSet.add(p));
|
|
return { selectedPaths: newSet };
|
|
});
|
|
},
|
|
|
|
clearSelection: () => {
|
|
set({ selectedPaths: new Set() });
|
|
},
|
|
|
|
toggleFolder: (path: string) => {
|
|
set((state) => {
|
|
const newSet = new Set(state.expandedFolders);
|
|
if (newSet.has(path)) {
|
|
newSet.delete(path);
|
|
} else {
|
|
newSet.add(path);
|
|
}
|
|
return { expandedFolders: newSet };
|
|
});
|
|
},
|
|
|
|
getSelectedPaths: () => {
|
|
return Array.from(get().selectedPaths);
|
|
},
|
|
}));
|