| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- import {
- useEffect
- } from "react";
- import {
- View
- } from "react-native";
- import type {
- TimeInputRangeType
- } from "./components/timeInput/type";
- import type ITimeSelectorProps from "./type";
- import type {
- UpdateDateRangeType,
- UpdateDateType
- } from "./type";
- import stylesheet, {
- useStyles
- } from "./stylesheet";
- import TimeInput from "./components/timeInput";
- import {
- NCoreUIKitLocalize,
- NCoreUIKitTheme,
- NCoreUIKitToast
- } from "../../core/hooks";
- import type {
- DateTimePickerDateRange
- } from "../dateTimePicker/type";
- import moment from "moment";
- import {
- Fragment
- } from "react/jsx-runtime";
- import Text from "../text";
- const TimeSelector = ({
- isTimeSelectWorksWithCenterWhenTimePicker,
- multipleSelectMinimumRequireMS,
- isWorkWith24HoursFormat = true,
- isWorkWithSeconds = false,
- multipleSelectMaximumMS,
- setIsSheetContentReady,
- selectMultipleObject,
- selectObject,
- pickerType,
- dateRange,
- maxDate,
- minDate,
- variant,
- date
- }: ITimeSelectorProps) => {
- const {
- spaces
- } = NCoreUIKitTheme.useContext();
- const {
- localize
- } = NCoreUIKitLocalize.useContext();
- const {
- inputsContainer: inputsContainerDynamicStyle,
- rangeContainer: rangeContainerDynamicStyle,
- container: containerDynamicStyle,
- colonText: colonTextDynamicStyle,
- timeTitle: timeTitleDynamicStyle
- } = useStyles({
- isTimeSelectWorksWithCenterWhenTimePicker,
- pickerType,
- spaces
- });
- useEffect(() => {
- if(pickerType === "time") setIsSheetContentReady(true);
- }, []);
- const setDateRangeValue = ({
- rangeType,
- seconds,
- minutes,
- hours
- }: UpdateDateRangeType) => {
- if(!dateRange) {
- return;
- }
- const newRangeDate = dateRange[rangeType] ? dateRange[rangeType] : new Date();
- if(hours !== undefined) {
- newRangeDate?.setHours(hours);
- }
- if(minutes !== undefined) {
- newRangeDate?.setMinutes(minutes);
- }
- if(seconds !== undefined) {
- newRangeDate?.setSeconds(seconds);
- }
- const newMultipleObject = dateRange;
- newMultipleObject[rangeType] = newRangeDate;
- return newMultipleObject;
- };
- const setDateValue = ({
- seconds,
- minutes,
- hours
- }: UpdateDateType) => {
- const newDate = date ? date : new Date();
- if(hours !== undefined) {
- newDate?.setHours(hours);
- }
- if(minutes !== undefined) {
- newDate?.setMinutes(minutes);
- }
- if(seconds !== undefined) {
- newDate?.setSeconds(seconds);
- }
- return newDate;
- };
- const rangeValidation = ({
- dateRangeValue,
- rangeType
- }: {
- dateRangeValue: DateTimePickerDateRange;
- rangeType: TimeInputRangeType;
- }) => {
- const start = rangeType === "start" ? dateRangeValue[rangeType] : dateRange?.start;
- const end = rangeType === "end" ? dateRangeValue[rangeType] : dateRange?.end;
- if(start && end) {
- if(multipleSelectMinimumRequireMS && Math.abs(moment(end).diff(start, "milliseconds")) < multipleSelectMinimumRequireMS) {
- NCoreUIKitToast.open({
- title: localize("selected-start-and-end-times-cannot-be-less-than-x-times-apart", [
- moment.duration(multipleSelectMinimumRequireMS).humanize()
- ])
- });
- return false;
- }
- if(multipleSelectMaximumMS && Math.abs(moment(end).diff(start, "milliseconds")) > multipleSelectMaximumMS) {
- NCoreUIKitToast.open({
- title: localize("selected-start-and-end-times-cannot-exceed-x-intervals", [
- moment.duration(multipleSelectMaximumMS).humanize()
- ])
- });
- return false;
- }
- if(moment(end).isBefore(start)) {
- NCoreUIKitToast.open({
- title: localize("selected-end-time-cannot-before-from-start-time")
- });
- return false;
- }
- if(moment(start).isAfter(end)) {
- NCoreUIKitToast.open({
- title: localize("selected-start-time-cannot-after-then-end-time")
- });
- return false;
- }
- }
- return true;
- };
- const renderTimeInputs = () => {
- if(variant === "range") {
- return <View
- style={[
- stylesheet.rangeContainer,
- rangeContainerDynamicStyle
- ]}
- >
- <Text
- variant="labelMediumSize"
- style={{
- ...stylesheet.timeTitle,
- ...timeTitleDynamicStyle
- }}
- >
- {localize("start-time")}:
- </Text>
- <View
- style={[
- stylesheet.inputsContainer,
- inputsContainerDynamicStyle,
- {
- marginBottom: spaces.spacingMd
- }
- ]}
- >
- <TimeInput
- initialValue={dateRange?.start?.getHours().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- rangeType="start"
- timeType="hours"
- />
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={dateRange?.start?.getMinutes().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="minutes"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- rangeType="start"
- />
- {
- isWorkWithSeconds ?
- <Fragment>
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={dateRange?.start?.getSeconds().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="seconds"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- rangeType="start"
- />
- </Fragment>
- :
- null
- }
- </View>
- <Text
- variant="labelMediumSize"
- style={{
- ...stylesheet.timeTitle,
- ...timeTitleDynamicStyle
- }}
- >
- {localize("end-time")}:
- </Text>
- <View
- style={[
- stylesheet.inputsContainer,
- inputsContainerDynamicStyle
- ]}
- >
- <TimeInput
- initialValue={dateRange?.end?.getHours().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- timeType="hours"
- rangeType="end"
- />
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={dateRange?.end?.getMinutes().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="minutes"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- rangeType="end"
- />
- {
- isWorkWithSeconds ?
- <Fragment>
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={dateRange?.end?.getSeconds().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- rangeValidation={rangeValidation}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="seconds"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- rangeType="end"
- />
- </Fragment>
- :
- null
- }
- </View>
- </View>;
- }
- return <View>
- <Text
- variant="labelMediumSize"
- style={{
- ...stylesheet.timeTitle,
- ...timeTitleDynamicStyle
- }}
- >
- {localize("end-time")}:
- </Text>
- <View
- style={[
- stylesheet.inputsContainer,
- inputsContainerDynamicStyle
- ]}
- >
- <TimeInput
- initialValue={date?.getHours().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- setDateValue={setDateValue}
- selectObject={selectObject}
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- timeType="hours"
- />
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={date?.getMinutes().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="minutes"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- />
- {
- isWorkWithSeconds ?
- <Fragment>
- <Text
- variant="titleMediumSize"
- style={{
- ...stylesheet.colonText,
- ...colonTextDynamicStyle
- }}
- >
- :
- </Text>
- <TimeInput
- initialValue={date?.getSeconds().toString().padStart(2, "0")}
- isWorkWith24HoursFormat={isWorkWith24HoursFormat}
- selectMultipleObject={selectMultipleObject}
- setDateRangeValue={setDateRangeValue}
- setDateValue={setDateValue}
- selectObject={selectObject}
- timeType="seconds"
- variant={variant}
- maxDate={maxDate}
- minDate={minDate}
- />
- </Fragment>
- :
- null
- }
- </View>
- </View>;
- };
- return <View
- style={[
- stylesheet.container,
- containerDynamicStyle
- ]}
- >
- {renderTimeInputs()}
- </View>;
- };
- export default TimeSelector;
|