editor-left-menu-context.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { createContext, FC, useCallback, useContext, useState } from 'react'
  2. import useEventListener from '@/shared/hooks/use-event-listener'
  3. type EditorLeftMenuState = {
  4. settingToFocus?: string
  5. }
  6. export const EditorLeftMenuContext = createContext<
  7. EditorLeftMenuState | undefined
  8. >(undefined)
  9. export const EditorLeftMenuProvider: FC<React.PropsWithChildren> = ({
  10. children,
  11. }) => {
  12. const [value, setValue] = useState<EditorLeftMenuState>(() => ({
  13. settingToFocus: undefined,
  14. }))
  15. useEventListener(
  16. 'ui.focus-setting',
  17. useCallback((event: CustomEvent<string>) => {
  18. setValue(value => ({
  19. ...value,
  20. settingToFocus: event.detail,
  21. }))
  22. }, [])
  23. )
  24. return (
  25. <EditorLeftMenuContext.Provider value={value}>
  26. {children}
  27. </EditorLeftMenuContext.Provider>
  28. )
  29. }
  30. export const useEditorLeftMenuContext = () => {
  31. const value = useContext(EditorLeftMenuContext)
  32. if (!value) {
  33. throw new Error(
  34. `useEditorLeftMenuContext is only available inside EditorLeftMenuProvider`
  35. )
  36. }
  37. return value
  38. }