mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
e9e6fbdd85
Co-authored-by: Max Korp <maxkorp@8bytealchemy.com> Co-authored-by: Santiago Cubino <scubino@litebox.ai> Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
'use client';
|
|
|
|
import { createContext, useContext, useState, useCallback, ReactNode } from 'react';
|
|
|
|
interface OpenedFoldersContextType {
|
|
openedFolderIds: Set<string>;
|
|
toggleFolder: (folderId: string) => void;
|
|
isFolderOpen: (folderId: string) => boolean;
|
|
}
|
|
|
|
const OpenedFoldersContext = createContext<OpenedFoldersContextType | undefined>(undefined);
|
|
|
|
export const OpenedFoldersProvider = ({ children }: { children: ReactNode }) => {
|
|
const [openedFolderIds, setOpenedFolderIds] = useState<Set<string>>(new Set());
|
|
|
|
const toggleFolder = useCallback((folderId: string) => {
|
|
setOpenedFolderIds(prev => {
|
|
const newSet = new Set(prev);
|
|
if (newSet.has(folderId)) {
|
|
newSet.delete(folderId);
|
|
} else {
|
|
newSet.add(folderId);
|
|
}
|
|
return newSet;
|
|
});
|
|
}, []);
|
|
|
|
const isFolderOpen = useCallback((folderId: string) => {
|
|
return openedFolderIds.has(folderId);
|
|
}, [openedFolderIds]);
|
|
|
|
return (
|
|
<OpenedFoldersContext.Provider value={{ openedFolderIds, toggleFolder, isFolderOpen }}>
|
|
{children}
|
|
</OpenedFoldersContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useOpenedFolders = () => {
|
|
const context = useContext(OpenedFoldersContext);
|
|
if (context === undefined) {
|
|
throw new Error('useOpenedFolders must be used within an OpenedFoldersProvider');
|
|
}
|
|
return context;
|
|
};
|
|
|