50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
import * as React from 'react';
|
|
import { useControlled } from '@mui/material/utils';
|
|
import { arrayIncludes } from '../utils/utils';
|
|
export function useViews({
|
|
onChange,
|
|
onViewChange,
|
|
openTo,
|
|
view,
|
|
views
|
|
}) {
|
|
var _views, _views2;
|
|
|
|
const [openView, setOpenView] = useControlled({
|
|
name: 'Picker',
|
|
state: 'view',
|
|
controlled: view,
|
|
default: openTo && arrayIncludes(views, openTo) ? openTo : views[0]
|
|
});
|
|
const previousView = (_views = views[views.indexOf(openView) - 1]) != null ? _views : null;
|
|
const nextView = (_views2 = views[views.indexOf(openView) + 1]) != null ? _views2 : null;
|
|
const changeView = React.useCallback(newView => {
|
|
setOpenView(newView);
|
|
|
|
if (onViewChange) {
|
|
onViewChange(newView);
|
|
}
|
|
}, [setOpenView, onViewChange]);
|
|
const openNext = React.useCallback(() => {
|
|
if (nextView) {
|
|
changeView(nextView);
|
|
}
|
|
}, [nextView, changeView]);
|
|
const handleChangeAndOpenNext = React.useCallback((date, currentViewSelectionState) => {
|
|
const isSelectionFinishedOnCurrentView = currentViewSelectionState === 'finish';
|
|
const globalSelectionState = isSelectionFinishedOnCurrentView && Boolean(nextView) ? 'partial' : currentViewSelectionState;
|
|
onChange(date, globalSelectionState);
|
|
|
|
if (isSelectionFinishedOnCurrentView) {
|
|
openNext();
|
|
}
|
|
}, [nextView, onChange, openNext]);
|
|
return {
|
|
handleChangeAndOpenNext,
|
|
nextView,
|
|
previousView,
|
|
openNext,
|
|
openView,
|
|
setOpenView: changeView
|
|
};
|
|
} |