import {FeedEditorState} from "spotlight/feed-editor/store" import {useDispatch, useSelector} from "react-redux" import {FeedOptions} from "spotlight/feed" import {FeedEditorActions} from "spotlight/feed-editor/store/index" import {Device, NonResponsive, Responsive} from "spotlight/utils/responsive" import {areEqual} from "spotlight/utils/generic/areEqual" type SelectorFn = (state: FeedEditorState["editor"]) => T; type Setter = (val: T) => void; type ValueSetterPair = [T, Setter] export function useEditorSelector(selector: SelectorFn, equalityFn?: (left: T, right: T) => boolean) { return useSelector(state => selector(state.editor), equalityFn) } export function usePreviewDevice(): Device { return useEditorSelector(state => state.previewDevice) } export function useResponsiveSelector(selector: SelectorFn>, device?: Device): T { device = device ?? useEditorSelector(state => state.previewDevice) const value = useSelector(selector) return Responsive.get(value, device) } export function useFeedOptionSetter(dispatch, option: K) { return React.useCallback((value: FeedOptions[K]) => { const payload = { [option]: value, } dispatch(FeedEditorActions.changeFeedOptions(payload)) }, [option, dispatch]) } export function useNumberFeedOptionSetter(dispatch, option: keyof FeedOptions) { return React.useCallback((value: FeedOptions[K]) => { dispatch(FeedEditorActions.changeFeedOptions({ [option]: typeof value === "number" ? value : 0, })) }, [option, dispatch]) } export function useFeedOption(option: keyof FeedOptions, selector: SelectorFn): ValueSetterPair { let value = useEditorSelector(selector, areEqual) let setter = useFeedOptionSetter(useDispatch(), option) return [value, setter] } export function wrapResponsive>( pair: ValueSetterPair, fallbackToDesktop?: boolean, ): [T, Setter, R, Setter, Device] { const [rValue, rSetter] = pair const device = useEditorSelector(state => state.previewDevice) return [ // @ts-ignore Responsive.get(rValue, device, fallbackToDesktop ?? true), // @ts-ignore React.useCallback((value: T) => rSetter(Responsive.set(rValue, device, value)), [rSetter, device, rValue]), rValue, rSetter, device, ] }