51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
/* eslint-disable react/require-default-props */
|
|
import React from 'react';
|
|
|
|
export enum SidebarBodyComponentId {
|
|
AddContent = 'add-content',
|
|
Info = 'info',
|
|
}
|
|
|
|
export interface LibraryContextData {
|
|
sidebarBodyComponent: SidebarBodyComponentId | null;
|
|
closeLibrarySidebar: () => void;
|
|
openAddContentSidebar: () => void;
|
|
openInfoSidebar: () => void;
|
|
}
|
|
|
|
export const LibraryContext = React.createContext({
|
|
sidebarBodyComponent: null,
|
|
closeLibrarySidebar: () => {},
|
|
openAddContentSidebar: () => {},
|
|
openInfoSidebar: () => {},
|
|
} as LibraryContextData);
|
|
|
|
/**
|
|
* React component to provide `LibraryContext`
|
|
*/
|
|
export const LibraryProvider = (props: { children?: React.ReactNode }) => {
|
|
const [sidebarBodyComponent, setSidebarBodyComponent] = React.useState<SidebarBodyComponentId | null>(null);
|
|
|
|
const closeLibrarySidebar = React.useCallback(() => setSidebarBodyComponent(null), []);
|
|
const openAddContentSidebar = React.useCallback(() => setSidebarBodyComponent(SidebarBodyComponentId.AddContent), []);
|
|
const openInfoSidebar = React.useCallback(() => setSidebarBodyComponent(SidebarBodyComponentId.Info), []);
|
|
|
|
const context = React.useMemo(() => ({
|
|
sidebarBodyComponent,
|
|
closeLibrarySidebar,
|
|
openAddContentSidebar,
|
|
openInfoSidebar,
|
|
}), [
|
|
sidebarBodyComponent,
|
|
closeLibrarySidebar,
|
|
openAddContentSidebar,
|
|
openInfoSidebar,
|
|
]);
|
|
|
|
return (
|
|
<LibraryContext.Provider value={context}>
|
|
{props.children}
|
|
</LibraryContext.Provider>
|
|
);
|
|
};
|