| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { createContext, useContext, useEffect } from 'react'
- import { useConnectionContext } from '@/features/ide-react/context/connection-context'
- import { useEditorContext } from '@/shared/context/editor-context'
- import getMeta from '@/utils/meta'
- import {
- Permissions,
- PermissionsLevel,
- } from '@/features/ide-react/types/permissions'
- import useScopeValue from '@/shared/hooks/use-scope-value'
- import { DeepReadonly } from '../../../../../types/utils'
- import useViewerPermissions from '@/shared/hooks/use-viewer-permissions'
- export const PermissionsContext = createContext<Permissions | undefined>(
- undefined
- )
- const permissionsMap: DeepReadonly<Record<PermissionsLevel, Permissions>> = {
- readOnly: {
- read: true,
- comment: true,
- trackedWrite: false,
- write: false,
- admin: false,
- },
- review: {
- read: true,
- comment: true,
- trackedWrite: true,
- write: false,
- admin: false,
- },
- readAndWrite: {
- read: true,
- comment: true,
- trackedWrite: true,
- write: true,
- admin: false,
- },
- owner: {
- read: true,
- comment: true,
- trackedWrite: true,
- write: true,
- admin: true,
- },
- }
- const anonymousPermissionsMap: typeof permissionsMap = {
- readOnly: { ...permissionsMap.readOnly, comment: false },
- readAndWrite: { ...permissionsMap.readAndWrite, comment: false },
- review: { ...permissionsMap.review, comment: false },
- owner: { ...permissionsMap.owner, comment: false },
- }
- const linkSharingWarningPermissionsMap: typeof permissionsMap = {
- readOnly: { ...permissionsMap.readOnly, comment: false },
- readAndWrite: permissionsMap.readAndWrite,
- review: permissionsMap.review,
- owner: permissionsMap.owner,
- }
- export const PermissionsProvider: React.FC = ({ children }) => {
- const [permissions, setPermissions] =
- useScopeValue<Readonly<Permissions>>('permissions')
- const { connectionState } = useConnectionContext()
- const { permissionsLevel } = useEditorContext() as {
- permissionsLevel: PermissionsLevel
- }
- const hasViewerPermissions = useViewerPermissions()
- const anonymous = getMeta('ol-anonymous')
- useEffect(() => {
- let activePermissionsMap
- if (hasViewerPermissions) {
- activePermissionsMap = linkSharingWarningPermissionsMap
- } else {
- activePermissionsMap = anonymous
- ? anonymousPermissionsMap
- : permissionsMap
- }
- setPermissions(activePermissionsMap[permissionsLevel])
- }, [anonymous, permissionsLevel, setPermissions, hasViewerPermissions])
- useEffect(() => {
- if (connectionState.forceDisconnected) {
- setPermissions(prevState => ({ ...prevState, write: false }))
- }
- }, [connectionState.forceDisconnected, setPermissions])
- return (
- <PermissionsContext.Provider value={permissions}>
- {children}
- </PermissionsContext.Provider>
- )
- }
- export function usePermissionsContext() {
- const context = useContext(PermissionsContext)
- if (!context) {
- throw new Error(
- 'usePermissionsContext is only available inside PermissionsProvider'
- )
- }
- return context
- }
|