diff --git a/pages/index.js b/pages/index.js index 5ce6034..1a9b3e7 100644 --- a/pages/index.js +++ b/pages/index.js @@ -11,10 +11,11 @@ export default function Playground() { endDate: null }); const [primaryColor, setPrimaryColor] = useState("blue"); - const [useRange, setUseRange] = useState(true); - const [showFooter, setShowFooter] = useState(false); + const [useRange, setUseRange] = useState(false); + const [showFooter, setShowFooter] = useState(true); const [showShortcuts, setShowShortcuts] = useState(false); - const [asSingle, setAsSingle] = useState(false); + const [asTimePicker, setAsTimePicker] = useState(true); + const [asSingle, setAsSingle] = useState(true); const [placeholder, setPlaceholder] = useState(""); const [separator, setSeparator] = useState("~"); const [i18n, setI18n] = useState("en"); @@ -22,7 +23,7 @@ export default function Playground() { const [inputClassName, setInputClassName] = useState(""); const [containerClassName, setContainerClassName] = useState(""); const [toggleClassName, setToggleClassName] = useState(""); - const [displayFormat, setDisplayFormat] = useState("YYYY-MM-DD"); + const [displayFormat, setDisplayFormat] = useState("DD/MM/YYYY hh:mm A"); const [readOnly, setReadOnly] = useState(false); const [minDate, setMinDate] = useState(""); const [maxDate, setMaxDate] = useState(""); @@ -92,6 +93,7 @@ export default function Playground() { } }} asSingle={asSingle} + asTimePicker={asTimePicker} placeholder={placeholder} separator={separator} startFrom={ @@ -187,6 +189,20 @@ export default function Playground() { +
+
+ setAsTimePicker(e.target.checked)} + /> + +
+
= ({ }) => { // Contexts const { + hour, + minute, + periodDay, period, changePeriod, changeDayHover, @@ -57,6 +61,7 @@ const Calendar: React.FC = ({ changeDatepickerValue, hideDatepicker, asSingle, + asTimePicker, i18n, startWeekOn, input @@ -124,12 +129,16 @@ const Calendar: React.FC = ({ const ipt = input?.current; changeDatepickerValue( { - startDate: dayjs(start).format(DATE_FORMAT), - endDate: dayjs(end).format(DATE_FORMAT) + startDate: asTimePicker + ? formatDateTimeToISO(start, hour, minute, periodDay) + : dayjs(start).format(DATE_FORMAT), + endDate: asTimePicker + ? formatDateTimeToISO(end, hour, minute, periodDay) + : dayjs(end).format(DATE_FORMAT) }, ipt ); - hideDatepicker(); + if (!asTimePicker) hideDatepicker(); } if (period.start && period.end) { @@ -185,16 +194,20 @@ const Calendar: React.FC = ({ } }, [ - asSingle, - changeDatepickerValue, - changeDayHover, - changePeriod, date, - hideDatepicker, - period.end, period.start, + period.end, showFooter, - input + input, + changeDatepickerValue, + asTimePicker, + hour, + minute, + periodDay, + hideDatepicker, + changeDayHover, + changePeriod, + asSingle ] ); diff --git a/src/components/Datepicker.tsx b/src/components/Datepicker.tsx index 54e90b7..f83021a 100644 --- a/src/components/Datepicker.tsx +++ b/src/components/Datepicker.tsx @@ -5,11 +5,12 @@ import Calendar from "../components/Calendar"; import Footer from "../components/Footer"; import Input from "../components/Input"; import Shortcuts from "../components/Shortcuts"; +import Time from "../components/Time"; import { COLORS, DATE_FORMAT, DEFAULT_COLOR, LANGUAGE } from "../constants"; import DatepickerContext from "../contexts/DatepickerContext"; import { formatDate, nextMonth, previousMonth } from "../helpers"; import useOnClickOutside from "../hooks"; -import { Period, DatepickerType, ColorKeys } from "../types"; +import { Period, DatepickerType, ColorKeys, PeriodDay } from "../types"; import { Arrow, VerticalDash } from "./utils"; @@ -22,6 +23,7 @@ const Datepicker: React.FC = ({ showShortcuts = false, configs = undefined, asSingle = false, + asTimePicker = false, placeholder = null, separator = "~", startFrom = null, @@ -61,6 +63,10 @@ const Datepicker: React.FC = ({ const [inputText, setInputText] = useState(""); const [inputRef, setInputRef] = useState(React.createRef()); + const [hour, setHour] = useState("1"); + const [minute, setMinute] = useState("00"); + const [periodDay, setPeriodDay] = useState("PM"); + // Custom Hooks use useOnClickOutside(containerRef, () => { const container = containerRef.current; @@ -93,6 +99,14 @@ const Datepicker: React.FC = ({ } }, []); + /* Start Time */ + const changeHour = useCallback((hour: string) => setHour(hour), []); + + const changeMinute = useCallback((minute: string) => setMinute(minute), []); + + const changePeriodDay = useCallback((periodDay: PeriodDay) => setPeriodDay(periodDay), []); + /* End Time */ + /* Start First */ const firstGotoDate = useCallback( (date: dayjs.Dayjs) => { @@ -247,6 +261,7 @@ const Datepicker: React.FC = ({ const contextValues = useMemo(() => { return { asSingle, + asTimePicker, primaryColor: safePrimaryColor, configs, calendarContainer: calendarContainerRef, @@ -260,6 +275,12 @@ const Datepicker: React.FC = ({ changeInputText: (newText: string) => setInputText(newText), updateFirstDate: (newDate: dayjs.Dayjs) => firstGotoDate(newDate), changeDatepickerValue: onChange, + hour, + minute, + periodDay, + changeHour, + changeMinute, + changePeriodDay, showFooter, placeholder, separator, @@ -286,6 +307,7 @@ const Datepicker: React.FC = ({ }; }, [ asSingle, + asTimePicker, safePrimaryColor, configs, hideDatepicker, @@ -293,6 +315,12 @@ const Datepicker: React.FC = ({ dayHover, inputText, onChange, + hour, + minute, + periodDay, + changeHour, + changeMinute, + changePeriodDay, showFooter, placeholder, separator, @@ -347,15 +375,18 @@ const Datepicker: React.FC = ({ showShortcuts ? "md:pl-2" : "md:pl-1" } pr-2 lg:pr-1`} > - +
+ + {asSingle && asTimePicker &&
{useRange && ( <> @@ -376,7 +407,6 @@ const Datepicker: React.FC = ({ )}
- {showFooter &&