@chayns-components/core
Version:
A set of beautiful React components for developing your own applications with chayns.
78 lines • 3.02 kB
JavaScript
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react';
import AccordionGroup from '../accordion/accordion-group/AccordionGroup';
import { StyledSetupWizard } from './SetupWizard.styles';
import { useColorScheme } from '../color-scheme-provider/ColorSchemeProvider';
export const SetupWizardContext = /*#__PURE__*/React.createContext({
selectedId: undefined,
updateSelectedId: undefined,
activeId: undefined,
updateActiveId: undefined,
shouldEnableKeyboardHighlighting: false
});
SetupWizardContext.displayName = 'SetupWizardContext';
const SetupWizard = /*#__PURE__*/forwardRef(({
children,
isWrapped,
shouldEnableKeyboardHighlighting
}, ref) => {
const colorScheme = useColorScheme();
const shouldEnableKeyboardHighlightingEffective = shouldEnableKeyboardHighlighting ?? colorScheme?.shouldEnableKeyboardHighlighting ?? false;
const [selectedId, setSelectedId] = useState(0);
const [activeId, setActiveId] = useState(0);
const [allIds, setAllIds] = useState([]);
useEffect(() => {
React.Children.map(children, child => {
setAllIds(prevState => [...prevState, child.props.id]);
});
}, [children]);
const updateSelectedId = useCallback(id => {
setSelectedId(id);
}, [setSelectedId]);
const updateActiveId = useCallback(id => {
setActiveId(id);
}, [setActiveId]);
const handleNext = useCallback(stepId => {
if (typeof stepId === 'number') {
updateSelectedId(stepId);
if (typeof activeId === 'number' && stepId > activeId) {
updateActiveId(stepId);
}
} else {
const index = allIds.findIndex(id => id === selectedId);
if (index < 0) {
return;
}
const numberAtIndex = allIds[index + 1];
if (!numberAtIndex) {
return;
}
updateSelectedId(numberAtIndex);
if (typeof activeId === 'number' && numberAtIndex > activeId) {
updateActiveId(numberAtIndex);
}
}
}, [activeId, allIds, selectedId, updateActiveId, updateSelectedId]);
const handleReset = useCallback(() => {
updateSelectedId(0);
updateActiveId(0);
}, [updateActiveId, updateSelectedId]);
useImperativeHandle(ref, () => ({
next: handleNext,
reset: handleReset
}), [handleNext, handleReset]);
const providerValue = useMemo(() => ({
selectedId,
updateSelectedId,
activeId,
updateActiveId,
shouldEnableKeyboardHighlighting: shouldEnableKeyboardHighlightingEffective
}), [activeId, selectedId, shouldEnableKeyboardHighlightingEffective, updateActiveId, updateSelectedId]);
return useMemo(() => /*#__PURE__*/React.createElement(SetupWizardContext.Provider, {
value: providerValue
}, /*#__PURE__*/React.createElement(StyledSetupWizard, null, /*#__PURE__*/React.createElement(AccordionGroup, {
isWrapped: isWrapped
}, children))), [children, isWrapped, providerValue]);
});
SetupWizard.displayName = 'SetupWizard';
export default SetupWizard;
//# sourceMappingURL=SetupWizard.js.map