editor-left-menu-context.tsx 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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 = ({ children }) => {
  10. const [value, setValue] = useState<EditorLeftMenuState>(() => ({
  11. settingToFocus: undefined,
  12. }))
  13. useEventListener(
  14. 'ui.focus-setting',
  15. useCallback(event => {
  16. setValue(value => ({
  17. ...value,
  18. settingToFocus: (event as CustomEvent<string>).detail,
  19. }))
  20. }, [])
  21. )
  22. return (
  23. <EditorLeftMenuContext.Provider value={value}>
  24. {children}
  25. </EditorLeftMenuContext.Provider>
  26. )
  27. }
  28. export const useEditorLeftMenuContext = () => {
  29. const value = useContext(EditorLeftMenuContext)
  30. if (!value) {
  31. throw new Error(
  32. `useEditorLeftMenuContext is only available inside EditorLeftMenuProvider`
  33. )
  34. }
  35. return value
  36. }