sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
38 lines (31 loc) • 1.11 kB
text/typescript
import {useCallback, useMemo} from 'react'
import {useObservable} from 'react-rx'
import {map} from 'rxjs/operators'
import {useKeyValueStore} from 'sanity'
const STRUCTURE_TOOL_NAMESPACE = 'studio.structure-tool'
/**
* @internal
*/
export function useStructureToolSetting<ValueType>(
namespace: string,
key: string | null,
defaultValue?: ValueType,
): [ValueType | undefined, (_value: ValueType) => void] {
const keyValueStore = useKeyValueStore()
const keyValueStoreKey = [STRUCTURE_TOOL_NAMESPACE, namespace, key].filter(Boolean).join('.')
const value$ = useMemo(() => {
return keyValueStore
.getKey(keyValueStoreKey)
.pipe(map((value) => (value === null ? defaultValue : value)))
}, [defaultValue, keyValueStore, keyValueStoreKey])
const value = useObservable(value$, defaultValue) as ValueType
const set = useCallback(
(newValue: ValueType) => {
if (newValue !== value) {
keyValueStore.setKey(keyValueStoreKey, newValue as string)
}
},
[keyValueStore, keyValueStoreKey, value],
)
return useMemo(() => [value, set], [set, value])
}