mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 06:33:55 +01:00
Merge pull request #26928 from overleaf/td-remove-use-scope-value
Remove useScopeValue and its associated store GitOrigin-RevId: 439d6eb16343f65695ef615a9ff697d0cc5ad2c7
This commit is contained in:
@@ -8,7 +8,6 @@ export type Ide = {
|
||||
}
|
||||
|
||||
type IdeContextValue = Ide & {
|
||||
scopeStore: ScopeValueStore
|
||||
scopeEventEmitter: ScopeEventEmitter
|
||||
unstableStore: ScopeValueStore
|
||||
}
|
||||
@@ -18,11 +17,10 @@ export const IdeContext = createContext<IdeContextValue | undefined>(undefined)
|
||||
export const IdeProvider: FC<
|
||||
React.PropsWithChildren<{
|
||||
ide: Ide
|
||||
scopeStore: ScopeValueStore
|
||||
scopeEventEmitter: ScopeEventEmitter
|
||||
unstableStore: ScopeValueStore
|
||||
}>
|
||||
> = ({ ide, scopeStore, scopeEventEmitter, unstableStore, children }) => {
|
||||
> = ({ ide, scopeEventEmitter, unstableStore, children }) => {
|
||||
/**
|
||||
* Expose unstableStore via `window.overleaf.unstable.store`, so it can be accessed by external extensions.
|
||||
*
|
||||
@@ -49,11 +47,10 @@ export const IdeProvider: FC<
|
||||
const value = useMemo<IdeContextValue>(() => {
|
||||
return {
|
||||
...ide,
|
||||
scopeStore,
|
||||
scopeEventEmitter,
|
||||
unstableStore,
|
||||
}
|
||||
}, [ide, scopeStore, scopeEventEmitter, unstableStore])
|
||||
}, [ide, scopeEventEmitter, unstableStore])
|
||||
|
||||
return <IdeContext.Provider value={value}>{children}</IdeContext.Provider>
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
import {
|
||||
type Dispatch,
|
||||
type SetStateAction,
|
||||
useCallback,
|
||||
useState,
|
||||
} from 'react'
|
||||
import { useIdeContext } from '../context/ide-context'
|
||||
import _ from 'lodash'
|
||||
|
||||
/**
|
||||
* Similar to `useScopeValue`, but instead of creating a two-way binding, only
|
||||
* changes in react-> angular direction are propagated, with `value` remaining
|
||||
* local and independent of its value in the Angular scope.
|
||||
*
|
||||
* The interface is compatible with React.useState(), including
|
||||
* the option of passing a function to the setter.
|
||||
*/
|
||||
export default function useScopeValueSetterOnly<T = any>(
|
||||
path: string, // dot '.' path of a property in the Angular scope.
|
||||
defaultValue?: T
|
||||
): [T | undefined, Dispatch<SetStateAction<T | undefined>>] {
|
||||
const { scopeStore } = useIdeContext()
|
||||
|
||||
const [value, setValue] = useState<T | undefined>(defaultValue)
|
||||
|
||||
const scopeSetter = useCallback(
|
||||
(newValue: SetStateAction<T | undefined>) => {
|
||||
setValue(val => {
|
||||
const actualNewValue = _.isFunction(newValue) ? newValue(val) : newValue
|
||||
scopeStore.set(path, actualNewValue)
|
||||
return actualNewValue
|
||||
})
|
||||
},
|
||||
[path, scopeStore]
|
||||
)
|
||||
|
||||
return [value, scopeSetter]
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
import {
|
||||
type Dispatch,
|
||||
type SetStateAction,
|
||||
useCallback,
|
||||
useEffect,
|
||||
useState,
|
||||
} from 'react'
|
||||
import _ from 'lodash'
|
||||
import { useIdeContext } from '../context/ide-context'
|
||||
|
||||
/**
|
||||
* Binds a property in an Angular scope making it accessible in a React
|
||||
* component. The interface is compatible with React.useState(), including
|
||||
* the option of passing a function to the setter.
|
||||
*
|
||||
* The generic type is not an actual guarantee because the value for a path is
|
||||
* returned as undefined when there is nothing in the scope store for that path.
|
||||
*/
|
||||
export default function useScopeValue<T = any>(
|
||||
path: string // dot '.' path of a property in the Angular scope
|
||||
): [T, Dispatch<SetStateAction<T>>] {
|
||||
const { scopeStore } = useIdeContext()
|
||||
|
||||
const [value, setValue] = useState<T>(() => scopeStore.get(path))
|
||||
|
||||
useEffect(() => {
|
||||
return scopeStore.watch<T>(path, (newValue: T) => {
|
||||
// NOTE: this is deliberately wrapped in a function,
|
||||
// to avoid calling setValue directly with a value that's a function
|
||||
setValue(() => newValue)
|
||||
})
|
||||
}, [path, scopeStore])
|
||||
|
||||
const scopeSetter = useCallback(
|
||||
(newValue: SetStateAction<T>) => {
|
||||
setValue(val => {
|
||||
const actualNewValue = _.isFunction(newValue) ? newValue(val) : newValue
|
||||
scopeStore.set(path, actualNewValue)
|
||||
return actualNewValue
|
||||
})
|
||||
},
|
||||
[path, scopeStore]
|
||||
)
|
||||
|
||||
return [value, scopeSetter]
|
||||
}
|
||||
Reference in New Issue
Block a user