@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com's products.
99 lines (98 loc) • 3.41 kB
JavaScript
"use client";
import * as React from "react";
import cx from "clsx";
import WizardStep from "./WizardStep";
import { WizardStepContextProvider } from "./WizardContext";
import Button from "../Button";
import Stack from "../Stack";
import ChevronDown from "../icons/ChevronDown";
import Portal from "../Portal";
import Modal from "../Modal";
import { CardSection } from "../Card";
import useMediaQuery from "../hooks/useMediaQuery";
const Wizard = ({
dataTest,
lockScrolling = true,
direction,
id,
labelClose = "Close",
labelProgress,
completedSteps,
activeStep,
children,
onChangeStep
}) => {
const {
isLargeMobile
} = useMediaQuery();
const [open, setOpen] = React.useState(false);
const toggle = React.useRef(null);
const isCompact = !isLargeMobile;
const childrenArray = React.Children.toArray(children);
const stepStatuses = childrenArray.map((step, index) => {
if (index < completedSteps) return "completed";
if (index === completedSteps) return "available";
return "disabled";
});
const activeStepTitle = childrenArray.find((_, index) => index === activeStep)?.props.title;
const stepsCount = React.Children.count(children);
const steps = React.Children.map(children, (step, index) => /*#__PURE__*/React.createElement(WizardStepContextProvider, {
index: index,
status: stepStatuses[index],
isLastStep: index === stepsCount - 1,
isColumnOnDesktop: direction === "column",
nextStepStatus: stepStatuses[index + 1],
isCompact: isCompact,
isActive: activeStep === index,
onChangeStep: onChangeStep,
onClose: () => setOpen(false)
}, step));
if (isCompact) {
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
ref: toggle,
dataTest: dataTest,
ariaControls: id,
ariaExpanded: open,
type: "secondary",
fullWidth: true,
iconRight: /*#__PURE__*/React.createElement(ChevronDown, {
ariaHidden: true
}),
onClick: () => {
setOpen(true);
}
}, /*#__PURE__*/React.createElement(Stack, {
as: "span",
inline: true,
align: "center"
}, typeof labelProgress !== "undefined" && /*#__PURE__*/React.createElement("b", {
className: "text-nowrap"
}, labelProgress), /*#__PURE__*/React.createElement("span", {
className: "font-normal"
}, activeStepTitle))), /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement("div", {
id: id
}, open && /*#__PURE__*/React.createElement(Modal, {
hasCloseButton: false,
lockScrolling: lockScrolling,
onClose: () => {
setOpen(false);
}
}, /*#__PURE__*/React.createElement("nav", {
className: "orbit-wizard pt-[9px]"
}, /*#__PURE__*/React.createElement("ul", null, steps, /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(CardSection, null, /*#__PURE__*/React.createElement(Button, {
type: "secondary",
fullWidth: true,
onClick: () => {
setOpen(false);
}
}, labelClose)))))))));
}
return /*#__PURE__*/React.createElement("nav", {
className: "orbit-wizard"
}, /*#__PURE__*/React.createElement("ul", {
className: cx("flex", direction === "column" ? "flex-col" : "flex-row"),
"data-test": dataTest
}, steps));
};
export default Wizard;
export { WizardStep };