permissions-context.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { createContext, useContext, useEffect } from 'react'
  2. import { useConnectionContext } from '@/features/ide-react/context/connection-context'
  3. import { useEditorContext } from '@/shared/context/editor-context'
  4. import getMeta from '@/utils/meta'
  5. import {
  6. Permissions,
  7. PermissionsLevel,
  8. } from '@/features/ide-react/types/permissions'
  9. import useScopeValue from '@/shared/hooks/use-scope-value'
  10. import { DeepReadonly } from '../../../../../types/utils'
  11. const PermissionsContext = createContext<Permissions | undefined>(undefined)
  12. const permissionsMap: DeepReadonly<Record<PermissionsLevel, Permissions>> = {
  13. readOnly: {
  14. read: true,
  15. write: false,
  16. admin: false,
  17. comment: true,
  18. },
  19. readAndWrite: {
  20. read: true,
  21. write: true,
  22. admin: false,
  23. comment: true,
  24. },
  25. owner: {
  26. read: true,
  27. write: true,
  28. admin: true,
  29. comment: true,
  30. },
  31. }
  32. const anonymousPermissionsMap: typeof permissionsMap = {
  33. readOnly: { ...permissionsMap.readOnly, comment: false },
  34. readAndWrite: { ...permissionsMap.readAndWrite, comment: false },
  35. owner: { ...permissionsMap.owner, comment: false },
  36. }
  37. export const PermissionsProvider: React.FC = ({ children }) => {
  38. const [permissions, setPermissions] =
  39. useScopeValue<Readonly<Permissions>>('permissions')
  40. const { connectionState } = useConnectionContext()
  41. const { permissionsLevel } = useEditorContext() as {
  42. permissionsLevel: PermissionsLevel
  43. }
  44. const anonymous = getMeta('ol-anonymous') as boolean | undefined
  45. useEffect(() => {
  46. const activePermissionsMap = anonymous
  47. ? anonymousPermissionsMap
  48. : permissionsMap
  49. setPermissions(activePermissionsMap[permissionsLevel])
  50. }, [anonymous, permissionsLevel, setPermissions])
  51. useEffect(() => {
  52. if (connectionState.forceDisconnected) {
  53. setPermissions(prevState => ({ ...prevState, write: false }))
  54. }
  55. }, [connectionState.forceDisconnected, setPermissions])
  56. return (
  57. <PermissionsContext.Provider value={permissions}>
  58. {children}
  59. </PermissionsContext.Provider>
  60. )
  61. }
  62. export function usePermissionsContext() {
  63. const context = useContext(PermissionsContext)
  64. if (!context) {
  65. throw new Error(
  66. 'usePermissionsContext is only available inside PermissionsProvider'
  67. )
  68. }
  69. return context
  70. }