overleaf/services/web/frontend/js/shared/context/ide-context.tsx
Tim Down 92a38e1311 Merge pull request #15280 from overleaf/td-scope-store-and-emitter
IDE scope store and emitter

GitOrigin-RevId: 9835d684db791937cd0bbc657228cb9112089b47
2023-10-25 08:03:55 +00:00

46 lines
1.3 KiB
TypeScript

import { createContext, FC, useContext, useMemo } from 'react'
import { ScopeValueStore } from '../../../../types/ide/scope-value-store'
import { Scope } from '../../../../types/angular/scope'
import getMeta from '@/utils/meta'
import { ScopeEventEmitter } from '../../../../types/ide/scope-event-emitter'
export type Ide = {
[key: string]: any // TODO: define the rest of the `ide` and `$scope` properties
$scope: Scope
}
type IdeContextValue = Ide & {
isReactIde: boolean
scopeStore: ScopeValueStore
scopeEventEmitter: ScopeEventEmitter
}
const IdeContext = createContext<IdeContextValue | undefined>(undefined)
const isReactIde: boolean = getMeta('ol-idePageReact')
export const IdeProvider: FC<{
ide: Ide
scopeStore: ScopeValueStore
scopeEventEmitter: ScopeEventEmitter
}> = ({ ide, scopeStore, scopeEventEmitter, children }) => {
const value = useMemo<IdeContextValue>(() => {
return {
...ide,
isReactIde,
scopeStore,
scopeEventEmitter,
}
}, [ide, scopeStore, scopeEventEmitter])
return <IdeContext.Provider value={value}>{children}</IdeContext.Provider>
}
export function useIdeContext(): IdeContextValue {
const context = useContext(IdeContext)
if (!context) {
throw new Error('useIdeContext is only available inside IdeProvider')
}
return context
}