| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import { createContext, useContext, useMemo } from 'react'
- import type { PropsWithChildren } from 'react'
- import type {
- FontFamily,
- LineHeight,
- OverallTheme,
- } from '../../../../../modules/source-editor/frontend/js/extensions/theme'
- import type {
- Keybindings,
- PdfViewer,
- ProjectCompiler,
- } from '../../../../../types/project-settings'
- import useScopeValue from '../../../shared/hooks/use-scope-value'
- type ProjectSettingsContextValue = {
- compiler: ProjectCompiler
- setCompiler: (compiler: ProjectCompiler) => void
- imageName: string
- setImageName: (imageName: string) => void
- rootDocId: string
- setRootDocId: (rootDocId: string) => void
- spellCheckLanguage: string
- setSpellCheckLanguage: (spellCheckLanguage: string) => void
- autoComplete: boolean
- setAutoComplete: (autoComplete: boolean) => void
- autoPairDelimiters: boolean
- setAutoPairDelimiters: (autoPairDelimiters: boolean) => void
- syntaxValidation: boolean
- setSyntaxValidation: (syntaxValidation: boolean) => void
- mode: Keybindings
- setMode: (mode: Keybindings) => void
- editorTheme: string
- setEditorTheme: (editorTheme: string) => void
- overallTheme: OverallTheme
- setOverallTheme: (overallTheme: OverallTheme) => void
- fontSize: string
- setFontSize: (fontSize: string) => void
- fontFamily: FontFamily
- setFontFamily: (fontFamily: FontFamily) => void
- lineHeight: LineHeight
- setLineHeight: (lineHeight: LineHeight) => void
- pdfViewer: PdfViewer
- setPdfViewer: (pdfViewer: PdfViewer) => void
- }
- export const ProjectSettingsContext = createContext<
- ProjectSettingsContextValue | undefined
- >(undefined)
- export function ProjectSettingsProvider({
- children,
- }: PropsWithChildren<Record<string, never>>) {
- const [compiler, setCompiler] =
- useScopeValue<ProjectCompiler>('project.compiler')
- const [imageName, setImageName] = useScopeValue<string>('project.imageName')
- const [rootDocId, setRootDocId] = useScopeValue<string>('project.rootDoc_id')
- const [spellCheckLanguage, setSpellCheckLanguage] = useScopeValue<string>(
- 'project.spellCheckLanguage'
- )
- const [autoComplete, setAutoComplete] = useScopeValue<boolean>(
- 'settings.autoComplete'
- )
- const [autoPairDelimiters, setAutoPairDelimiters] = useScopeValue<boolean>(
- 'settings.autoPairDelimiters'
- )
- const [syntaxValidation, setSyntaxValidation] = useScopeValue<boolean>(
- 'settings.syntaxValidation'
- )
- const [editorTheme, setEditorTheme] = useScopeValue<string>(
- 'settings.editorTheme'
- )
- const [overallTheme, setOverallTheme] = useScopeValue<OverallTheme>(
- 'settings.overallTheme'
- )
- const [mode, setMode] = useScopeValue<Keybindings>('settings.mode')
- const [fontSize, setFontSize] = useScopeValue<string>('settings.fontSize')
- const [fontFamily, setFontFamily] = useScopeValue<FontFamily>(
- 'settings.fontFamily'
- )
- const [lineHeight, setLineHeight] = useScopeValue<LineHeight>(
- 'settings.lineHeight'
- )
- const [pdfViewer, setPdfViewer] =
- useScopeValue<PdfViewer>('settings.pdfViewer')
- const value: ProjectSettingsContextValue = useMemo(
- () => ({
- compiler,
- setCompiler,
- imageName,
- setImageName,
- rootDocId,
- setRootDocId,
- spellCheckLanguage,
- setSpellCheckLanguage,
- autoComplete,
- setAutoComplete,
- autoPairDelimiters,
- setAutoPairDelimiters,
- syntaxValidation,
- setSyntaxValidation,
- editorTheme,
- setEditorTheme,
- overallTheme,
- setOverallTheme,
- mode,
- setMode,
- fontSize,
- setFontSize,
- fontFamily,
- setFontFamily,
- lineHeight,
- setLineHeight,
- pdfViewer,
- setPdfViewer,
- }),
- [
- compiler,
- setCompiler,
- imageName,
- setImageName,
- rootDocId,
- setRootDocId,
- spellCheckLanguage,
- setSpellCheckLanguage,
- autoComplete,
- setAutoComplete,
- autoPairDelimiters,
- setAutoPairDelimiters,
- syntaxValidation,
- setSyntaxValidation,
- editorTheme,
- setEditorTheme,
- overallTheme,
- setOverallTheme,
- mode,
- setMode,
- fontSize,
- setFontSize,
- fontFamily,
- setFontFamily,
- lineHeight,
- setLineHeight,
- pdfViewer,
- setPdfViewer,
- ]
- )
- return (
- <ProjectSettingsContext.Provider value={value}>
- {children}
- </ProjectSettingsContext.Provider>
- )
- }
- export function useProjectSettingsContext() {
- const context = useContext(ProjectSettingsContext)
- if (!context) {
- throw new Error(
- 'useProjectSettingsContext is only available inside ProjectSettingsProvider'
- )
- }
- return context
- }
|