pick time storing and convert time to 24 hours time base

This commit is contained in:
2025-11-13 21:45:06 +03:00
parent 590cc2c5e9
commit a62ba5028f
7 changed files with 87 additions and 27 deletions

View File

@@ -1,8 +1,8 @@
import { FormItemProps, Form, DatePicker } from "antd"; import { DatePicker, Form, FormItemProps } from "antd";
import dayjs from "dayjs"; import dayjs from "dayjs";
import type { DatePickerProps } from "antd"; import type { DatePickerProps } from "antd";
import { UI_DATE_FORMAT, SERVER_DATE_FORMAT } from "utils/constants.ts"; import { SERVER_DATE_FORMAT, UI_DATE_FORMAT } from "utils/constants.ts";
export default function ProDateFormInput({ export default function ProDateFormInput({
formItemProps, formItemProps,

View File

@@ -65,6 +65,8 @@ interface CartState {
scheduledDate: string; scheduledDate: string;
discount: DiscountData; discount: DiscountData;
plateCar: string; plateCar: string;
pickupDate: string,
pickupTime: string
} }
// localStorage keys // localStorage keys
@@ -91,6 +93,8 @@ export const CART_STORAGE_KEYS = {
SCHEDULED_DATE: "fascano_scheduled_date", SCHEDULED_DATE: "fascano_scheduled_date",
DISCOUNT: "fascano_discount", DISCOUNT: "fascano_discount",
PLATE: "fascano_plate_car", PLATE: "fascano_plate_car",
PICKUP_DATE: "fascano_pickup_date",
PICKUP_TIME: "fascano_pickup_time",
} as const; } as const;
// Utility functions for localStorage // Utility functions for localStorage
@@ -173,6 +177,8 @@ const initialState: CartState = {
isDiscount: false, isDiscount: false,
}), }),
plateCar: getFromLocalStorage(CART_STORAGE_KEYS.PLATE, ""), plateCar: getFromLocalStorage(CART_STORAGE_KEYS.PLATE, ""),
pickupDate: getFromLocalStorage(CART_STORAGE_KEYS.PICKUP_DATE, ""),
pickupTime: getFromLocalStorage(CART_STORAGE_KEYS.PICKUP_TIME, ""),
}; };
const orderSlice = createSlice({ const orderSlice = createSlice({
@@ -587,6 +593,24 @@ const orderSlice = createSlice({
); );
} }
}, },
updatePickupDate(state, action: PayloadAction<string>) {
state.pickupDate = action.payload;
if (typeof window !== "undefined") {
localStorage.setItem(
CART_STORAGE_KEYS.PICKUP_DATE,
JSON.stringify(state.pickupDate),
);
}
},
updatePickupTime(state, action: PayloadAction<string>) {
state.pickupTime = action.payload;
if (typeof window !== "undefined") {
localStorage.setItem(
CART_STORAGE_KEYS.PICKUP_TIME,
JSON.stringify(state.pickupTime),
);
}
},
}, },
}); });
@@ -620,6 +644,8 @@ export const {
updateRestaurant, updateRestaurant,
updateScheduledDate, updateScheduledDate,
updateDiscount, updateDiscount,
updatePickupDate,
updatePickupTime,
} = orderSlice.actions; } = orderSlice.actions;
// Tax calculation helper functions // Tax calculation helper functions

View File

@@ -1,13 +1,13 @@
import { Button, Divider } from "antd"; import { Button, Divider } from "antd";
import BackIcon from "components/Icons/BackIcon.tsx"; import BackIcon from "components/Icons/BackIcon.tsx";
import NextIcon from "components/Icons/NextIcon.tsx"; import NextIcon from "components/Icons/NextIcon.tsx";
import dayjs from "dayjs";
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useAppSelector } from "redux/hooks"; import { useAppSelector } from "redux/hooks";
import { ProGray1 } from "ThemeConstants"; import { ProGray1 } from "ThemeConstants";
import { SERVER_DATE_FORMAT } from "utils/constants.ts";
import styles from "./TimeEstimateCard.module.css"; import styles from "./TimeEstimateCard.module.css";
import dayjs from "dayjs";
import { SERVER_DATE_FORMAT, UI_DATE_FORMAT } from "utils/constants.ts";
const timeSlots = [ const timeSlots = [
"12:00", "12:00",
@@ -25,21 +25,24 @@ const timeSlots = [
]; ];
interface EstimateTimeContentProps { interface EstimateTimeContentProps {
onSave: (date: string, time: string) => void; onSave: (date: string, time: string) => void;
onClose: () => void; onClose: () => void;
} }
export default function Content({ export default function Content({ onSave, onClose }: EstimateTimeContentProps) {
onSave,
onClose,
}: EstimateTimeContentProps) {
const { t } = useTranslation(); const { t } = useTranslation();
const [selectedDate, setSelectedDate] = useState<string>(); const [selectedDate, setSelectedDate] = useState<string>(Date());
const [selectedTime, setSelectedTime] = useState<string>(); const [selectedTime, setSelectedTime] = useState<string>();
const [isAM, setIsAM] = useState(true); const [isAM, setIsAM] = useState(true);
const { isRTL } = useAppSelector((state) => state.locale); const { isRTL } = useAppSelector((state) => state.locale);
const formatDate = (date: Date) => {
return date.toLocaleDateString("en-US", {
weekday: "long",
month: "short",
day: "numeric",
});
};
const goToPreviousDay = () => { const goToPreviousDay = () => {
const newDate = dayjs(selectedDate).subtract(1, "d"); const newDate = dayjs(selectedDate).subtract(1, "d");
setSelectedDate(newDate.format(SERVER_DATE_FORMAT)); setSelectedDate(newDate.format(SERVER_DATE_FORMAT));
@@ -55,11 +58,32 @@ export default function Content({
}; };
const handleSave = () => { const handleSave = () => {
console.log(selectedTime); onSave(
onSave(selectedDate || "", `${selectedTime} ${isAM ? "AM" : "PM"}`); dayjs(selectedDate).format(SERVER_DATE_FORMAT),
formatSelectedTime(selectedTime, isAM),
);
onClose(); onClose();
}; };
// covert from 12 to 24 hours system
const formatSelectedTime = (time: string | undefined, am: boolean) => {
const fallback = "12:00";
if (!time) return fallback;
if (am) {
return time === "12:00" ? "00:00" : time.padStart(5, "0");
}
const [rawHour, minute = "00"] = time.split(":");
const hour = Number(rawHour);
if (Number.isNaN(hour)) {
return fallback;
}
const convertedHour = hour === 12 ? 12 : hour + 12;
return `${convertedHour.toString().padStart(2, "0")}:${minute}`;
};
return ( return (
<div style={{ padding: "0 20px", marginTop: 30 }}> <div style={{ padding: "0 20px", marginTop: 30 }}>
{/* Day Selection */} {/* Day Selection */}
@@ -104,7 +128,7 @@ export default function Content({
marginBottom: 4, marginBottom: 4,
}} }}
> >
{dayjs(selectedDate).format(UI_DATE_FORMAT)} {formatDate(dayjs(selectedDate).toDate())}
</div> </div>
</div> </div>

View File

@@ -1,18 +1,19 @@
import { Form } from "antd"; import { Form } from "antd";
import useFormInstance from "antd/es/form/hooks/useFormInstance";
import ProInputCard from "components/ProInputCard/ProInputCard.tsx"; import ProInputCard from "components/ProInputCard/ProInputCard.tsx";
import ProRatioGroups from "components/ProRatioGroups/ProRatioGroups.tsx"; import ProRatioGroups from "components/ProRatioGroups/ProRatioGroups.tsx";
import dayjs from "dayjs";
import { updatePickupDate, updatePickupTime } from "features/order/orderSlice";
import useBreakPoint from "hooks/useBreakPoint.ts"; import useBreakPoint from "hooks/useBreakPoint.ts";
import { BottomSheet } from "pages/cart/components/timeEstimate/BottomSheet.tsx"; import { BottomSheet } from "pages/cart/components/timeEstimate/BottomSheet.tsx";
import { Dialog } from "pages/cart/components/timeEstimate/Dialog.tsx"; import { Dialog } from "pages/cart/components/timeEstimate/Dialog.tsx";
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useFormInstance from "antd/es/form/hooks/useFormInstance"; import { useAppDispatch } from "redux/hooks";
import ProDateFormInput from "components/proDatePicker/ProDatePicker.tsx"; import { SERVER_DATE_FORMAT, UI_TIME_FORMAT } from "utils/constants.ts";
import dayjs from "dayjs";
import { SERVER_DATE_FORMAT } from "utils/constants.ts";
import TimeFormInput from "components/proDatePicker/ProTimePicker.tsx";
export default function TimeEstimateCard() { export default function TimeEstimateCard() {
const dispatch = useAppDispatch();
const { t } = useTranslation(); const { t } = useTranslation();
const form = useFormInstance(); const form = useFormInstance();
const { isDesktop } = useBreakPoint(); const { isDesktop } = useBreakPoint();
@@ -20,9 +21,9 @@ export default function TimeEstimateCard() {
const [isEstimateTimeOpen, setIsEstimateTimeOpen] = useState(false); const [isEstimateTimeOpen, setIsEstimateTimeOpen] = useState(false);
const handleEstimateTimeSave = (date: string, time: string) => { const handleEstimateTimeSave = (date: string, time: string) => {
console.log(time);
form.setFieldsValue({ pickupTime: time, pickupDate: date }); form.setFieldsValue({ pickupTime: time, pickupDate: date });
dispatch(updatePickupTime(time));
dispatch(updatePickupDate(date));
}; };
const handleEstimateTimeClose = () => { const handleEstimateTimeClose = () => {
@@ -50,7 +51,7 @@ export default function TimeEstimateCard() {
setEstimateWay(value); setEstimateWay(value);
handleEstimateTimeSave( handleEstimateTimeSave(
dayjs().format(SERVER_DATE_FORMAT), dayjs().format(SERVER_DATE_FORMAT),
"now", dayjs().format(UI_TIME_FORMAT),
); );
} else { } else {
setEstimateWay(value); setEstimateWay(value);
@@ -59,8 +60,14 @@ export default function TimeEstimateCard() {
}} }}
/> />
</Form.Item> </Form.Item>
{estimateWay === "later" && ( {/* {estimateWay === "later" && (
<div style={{ display: "flex", gap: "15px" }}> <div
style={{
display: "flex",
justifyContent: "space-between",
gap: "15px",
}}
>
<ProDateFormInput <ProDateFormInput
pickerProps={{ pickerProps={{
size: "middle", size: "middle",
@@ -87,7 +94,7 @@ export default function TimeEstimateCard() {
formItemProps={{ name: "pickupTime" }} formItemProps={{ name: "pickupTime" }}
/> />
</div> </div>
)} )} */}
</ProInputCard> </ProInputCard>
{isDesktop ? ( {isDesktop ? (
<Dialog <Dialog

View File

@@ -37,6 +37,8 @@ export default function useOrder() {
location, location,
discount, discount,
plateCar, plateCar,
pickupTime,
pickupDate,
} = useAppSelector(selectCart); } = useAppSelector(selectCart);
const highestLoyaltyItem = useAppSelector(selectHighestPricedLoyaltyItem); const highestLoyaltyItem = useAppSelector(selectHighestPricedLoyaltyItem);
const { useLoyaltyPoints } = useAppSelector(selectCart); const { useLoyaltyPoints } = useAppSelector(selectCart);
@@ -83,7 +85,8 @@ export default function useOrder() {
paymentType: "cod", paymentType: "cod",
uuid: user_uuid, uuid: user_uuid,
pickup_comments: "", pickup_comments: "",
pickup_time: estimateTime, pickup_time: pickupTime,
pickup_date: pickupDate,
car_plate: plateCar, car_plate: plateCar,
delivery_pickup_interval: "", delivery_pickup_interval: "",
orderPrice: orderPrice, orderPrice: orderPrice,

View File

@@ -49,7 +49,7 @@ export const DEFAULT_LANGUAGE = "selectedLang";
export const SERVER_DATE_FORMAT = "YYYY-MM-DD"; export const SERVER_DATE_FORMAT = "YYYY-MM-DD";
export const UI_DATE_FORMAT = "YYYY/MM/DD"; export const UI_DATE_FORMAT = "YYYY/MM/DD";
export const UI_TIME_FORMAT = "h:mm A"; export const UI_TIME_FORMAT = "h:mm";
export const CONTACTS_URL = "LT"; export const CONTACTS_URL = "LT";
export const FILTER_PARAMS = ""; export const FILTER_PARAMS = "";