ide-context.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { createContext, FC, useContext, useMemo } from 'react'
  2. import { ScopeValueStore } from '../../../../types/ide/scope-value-store'
  3. import { Scope } from '../../../../types/angular/scope'
  4. import getMeta from '@/utils/meta'
  5. import { ScopeEventEmitter } from '../../../../types/ide/scope-event-emitter'
  6. export type Ide = {
  7. [key: string]: any // TODO: define the rest of the `ide` and `$scope` properties
  8. $scope: Scope
  9. }
  10. type IdeContextValue = Ide & {
  11. isReactIde: boolean
  12. scopeStore: ScopeValueStore
  13. scopeEventEmitter: ScopeEventEmitter
  14. }
  15. const IdeContext = createContext<IdeContextValue | undefined>(undefined)
  16. const isReactIde: boolean = getMeta('ol-idePageReact')
  17. export const IdeProvider: FC<{
  18. ide: Ide
  19. scopeStore: ScopeValueStore
  20. scopeEventEmitter: ScopeEventEmitter
  21. }> = ({ ide, scopeStore, scopeEventEmitter, children }) => {
  22. const value = useMemo<IdeContextValue>(() => {
  23. return {
  24. ...ide,
  25. isReactIde,
  26. scopeStore,
  27. scopeEventEmitter,
  28. }
  29. }, [ide, scopeStore, scopeEventEmitter])
  30. return <IdeContext.Provider value={value}>{children}</IdeContext.Provider>
  31. }
  32. export function useIdeContext(): IdeContextValue {
  33. const context = useContext(IdeContext)
  34. if (!context) {
  35. throw new Error('useIdeContext is only available inside IdeProvider')
  36. }
  37. return context
  38. }