permissions-context.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { createContext, useContext, useState, useEffect, useMemo } 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 { Permissions } from '@/features/ide-react/types/permissions'
  6. type PermissionsContextValue = {
  7. permissions: Permissions
  8. }
  9. const PermissionsContext = createContext<PermissionsContextValue | undefined>(
  10. undefined
  11. )
  12. const readOnlyPermissions: Readonly<Permissions> = {
  13. read: true,
  14. write: false,
  15. admin: false,
  16. comment: true,
  17. }
  18. const readAndWritePermissions: Readonly<Permissions> = {
  19. read: true,
  20. write: true,
  21. admin: false,
  22. comment: true,
  23. }
  24. const ownerPermissions: Readonly<Permissions> = {
  25. read: true,
  26. write: true,
  27. admin: true,
  28. comment: true,
  29. }
  30. const permissionsMap = {
  31. readOnly: readOnlyPermissions,
  32. readAndWrite: readAndWritePermissions,
  33. owner: ownerPermissions,
  34. anonymous: {
  35. readOnly: { ...readOnlyPermissions, comment: false },
  36. readAndWrite: { ...readAndWritePermissions, comment: false },
  37. owner: { ...ownerPermissions, comment: false },
  38. },
  39. } as const
  40. export const PermissionsProvider: React.FC = ({ children }) => {
  41. const [permissions, setPermissions] = useState<Permissions>({
  42. read: false,
  43. write: false,
  44. admin: false,
  45. comment: false,
  46. })
  47. const { connectionState } = useConnectionContext()
  48. const { permissionsLevel } = useEditorContext()
  49. const anonymous = getMeta('ol-anonymous') as boolean | undefined
  50. useEffect(() => {
  51. if (permissionsLevel === 'readOnly') {
  52. if (anonymous) {
  53. setPermissions(permissionsMap.anonymous.readOnly)
  54. } else {
  55. setPermissions(permissionsMap.readOnly)
  56. }
  57. }
  58. if (permissionsLevel === 'readAndWrite') {
  59. if (permissions.admin) {
  60. if (anonymous) {
  61. setPermissions(permissionsMap.anonymous.owner)
  62. } else {
  63. setPermissions(permissionsMap.owner)
  64. }
  65. } else {
  66. if (anonymous) {
  67. setPermissions(permissionsMap.anonymous.readAndWrite)
  68. } else {
  69. setPermissions(permissionsMap.readAndWrite)
  70. }
  71. }
  72. }
  73. if (permissionsLevel === 'owner') {
  74. if (anonymous) {
  75. setPermissions(permissionsMap.anonymous.owner)
  76. } else {
  77. setPermissions(permissionsMap.owner)
  78. }
  79. }
  80. }, [anonymous, permissions, permissionsLevel])
  81. useEffect(() => {
  82. if (connectionState.forceDisconnected) {
  83. setPermissions(prevState => ({ ...prevState, write: false }))
  84. }
  85. }, [connectionState.forceDisconnected])
  86. const value = useMemo<PermissionsContextValue>(
  87. () => ({
  88. permissions,
  89. }),
  90. [permissions]
  91. )
  92. return (
  93. <PermissionsContext.Provider value={value}>
  94. {children}
  95. </PermissionsContext.Provider>
  96. )
  97. }
  98. export function usePermissionsContext(): PermissionsContextValue {
  99. const context = useContext(PermissionsContext)
  100. if (!context) {
  101. throw new Error(
  102. 'usePermissionsContext is only available inside PermissionsProvider'
  103. )
  104. }
  105. return context
  106. }