/* frame component to show pages (sliders) from right or bottom
const sliderFrameHook: SliderFrameHookProps = {};
const onClick = (event: Event) => {
sliderFrameHook.load!(<... />);
or
sliderFrameHook.close!(event);
};
return (
...
);
*/
import { MediaQueryMaxWidth, VNode, stopPropagation } from 'lupine.components';
import { SliderHelper, SliderHelperCloseProps } from './slider-helper';
export type SliderFrameHookProps = {
load?: (children: VNode) => void;
close?: (event: Event) => void;
isOpened?: () => boolean;
};
export type SliderFrameProps = {
defaultContent?: VNode | string;
direction?: 'right' | 'bottom';
hook?: SliderFrameHookProps;
afterClose?: () => void | Promise;
maxWidth?: string;
};
export const SliderFrame = (props: SliderFrameProps) => {
let closeSlider: SliderHelperCloseProps | undefined;
let opened = false;
if (props.hook) {
props.hook.load = (children) => {
opened = true;
SliderHelper.show({
direction: props.direction || 'right',
children,
maxWidth: props.maxWidth,
closeEvent: () => {
opened = false;
closeSlider = undefined;
props.afterClose?.();
},
}).then((close) => {
closeSlider = close;
});
};
props.hook.close = (event: Event) => {
stopPropagation(event);
closeSlider?.();
};
props.hook.isOpened = () => {
return opened;
};
}
return <>>;
};