permissions-context.tsx 2.2 KB

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