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 && (
+
+ )}