From b2ece8f33aa842a96485f7dcd26fbb5f9eab6e18 Mon Sep 17 00:00:00 2001 From: Akhileshwar Shriram <112577383+AkhilTheBoss@users.noreply.github.com> Date: Wed, 14 Jan 2026 13:52:35 -0800 Subject: [PATCH 1/3] feat: address comments --- .../src/components/store/ShippingTimeline.tsx | 116 ++++++++++++++++++ .../src/screens/conductor/store/shipping.tsx | 4 + client/src/types/Store.ts | 7 ++ server/api/services/store-service.ts | 50 ++++++++ 4 files changed, 177 insertions(+) create mode 100644 client/src/components/store/ShippingTimeline.tsx diff --git a/client/src/components/store/ShippingTimeline.tsx b/client/src/components/store/ShippingTimeline.tsx new file mode 100644 index 00000000..6629d515 --- /dev/null +++ b/client/src/components/store/ShippingTimeline.tsx @@ -0,0 +1,116 @@ +import { StoreShippingOption } from "../../types"; +import { IconCheck, IconSettings, IconTruck, IconHome } from "@tabler/icons-react"; + +interface ShippingTimelineProps { + shippingOption: StoreShippingOption; +} + +export default function ShippingTimeline({ shippingOption }: ShippingTimelineProps) { + const formatDate = (dateString: string): string => { + const date = new Date(dateString); + return new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }).format(date); + }; + + const formatDateRange = (start: string, end: string): string => { + return `${formatDate(start)} - ${formatDate(end)}`; + }; + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayFormatted = formatDate(today.toISOString().split('T')[0]); + + const timelineSteps = [ + { + name: "Order Placed", + icon: IconCheck, + date: `Today (${todayFormatted})`, + completed: true, + }, + { + name: "Printing (On-Demand)", + icon: IconSettings, + date: formatDateRange( + shippingOption.production_start_date_estimate, + shippingOption.production_end_date_estimate + ), + completed: false, + }, + { + name: "Shipped", + icon: IconTruck, + date: formatDateRange( + shippingOption.ship_date_start_estimate, + shippingOption.ship_date_end_estimate + ), + completed: false, + }, + { + name: "Estimated Arrival", + icon: IconHome, + date: formatDateRange( + shippingOption.delivery_date_start_estimate, + shippingOption.delivery_date_end_estimate + ), + completed: false, + }, + ]; + + return ( +
+

+ Estimated Production & Delivery Timeline +

+
+
+ {timelineSteps.map((step, stepIdx) => ( +
+
+
+
+ {stepIdx < timelineSteps.length - 1 && ( + +
+

+ {step.name} +

+

{step.date}

+
+
+ ))} +
+
+

+ *Please note: Because your book is printed specially for you upon ordering, + production times can vary before shipping begins. +

+
+ ); +} \ No newline at end of file diff --git a/client/src/screens/conductor/store/shipping.tsx b/client/src/screens/conductor/store/shipping.tsx index 5d60c7b1..b2704d5e 100644 --- a/client/src/screens/conductor/store/shipping.tsx +++ b/client/src/screens/conductor/store/shipping.tsx @@ -20,6 +20,7 @@ import LoadingSpinner from "../../../components/LoadingSpinner"; import { useTypedSelector } from "../../../state/hooks"; import { useModals } from "../../../context/ModalContext"; import ConfirmOrderModal from "../../../components/store/ConfirmOrderModal"; +import ShippingTimeline from "../../../components/store/ShippingTimeline"; const STATE_CODES = [ { @@ -898,6 +899,9 @@ export default function ShippingPage() {
)} + {hasPhysicalProducts && selectedShippingOption && ( + + )}
-
+ {hasPhysicalProducts && selectedShippingOption && ( + + )} +

If you have any questions or concerns, please contact our{" "} Date: Sun, 18 Jan 2026 17:00:25 -0800 Subject: [PATCH 3/3] fix: fix checkout page horizontal overflow on mobile --- client/src/screens/conductor/store/shipping.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/screens/conductor/store/shipping.tsx b/client/src/screens/conductor/store/shipping.tsx index c8deeef1..c4a4373f 100644 --- a/client/src/screens/conductor/store/shipping.tsx +++ b/client/src/screens/conductor/store/shipping.tsx @@ -522,7 +522,7 @@ export default function ShippingPage() {

{ e.preventDefault(); }}