diff --git a/apps/admin-ui/app/(drawer)/dashboard/complaints/index.tsx b/apps/admin-ui/app/(drawer)/dashboard/complaints/index.tsx index c02924b..f070b32 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/complaints/index.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/complaints/index.tsx @@ -63,7 +63,7 @@ export default function Complaints() { if (!selectedComplaintId) return; resolveComplaint.mutate( - { id: String(selectedComplaintId), response }, + { id: String(selectedComplaintId), response: response ?? '' }, { onSuccess: () => { Alert.alert("Success", "Complaint marked as resolved"); diff --git a/apps/admin-ui/app/(drawer)/dashboard/customize-app/all-items-order.tsx b/apps/admin-ui/app/(drawer)/dashboard/customize-app/all-items-order.tsx index 9930cc0..8e941ac 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/customize-app/all-items-order.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/customize-app/all-items-order.tsx @@ -94,7 +94,7 @@ export default function AllItemsOrder() { // Get current order from constants const { data: constants, isLoading: isLoadingConstants, error: constantsError } = trpc.admin.const.getConstants.useQuery(); - const { data: allProducts, isLoading: isLoadingProducts, error: productsError } = trpc.common.product.getAllProductsSummary.useQuery({}); + const { data: allProducts, isLoading: isLoadingProducts, error: productsError } = trpc.common.product.getAllProductsSummary.useQuery(); const updateConstants = trpc.admin.const.updateConstants.useMutation(); // Initialize products from constants diff --git a/apps/admin-ui/app/(drawer)/dashboard/customize-app/popular-items.tsx b/apps/admin-ui/app/(drawer)/dashboard/customize-app/popular-items.tsx index f0d8830..09b4ecd 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/customize-app/popular-items.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/customize-app/popular-items.tsx @@ -34,7 +34,7 @@ type PopularProduct = Omit< > & { price: number; marketPrice: number | null; - images: string[]; + images: string[] | null; storeId: number | null; nextDeliveryDate: string | null; }; @@ -121,7 +121,7 @@ export default function CustomizePopularItems() { // Get current popular items from constants const { data: constants, isLoading: isLoadingConstants, error: constantsError } = trpc.admin.const.getConstants.useQuery(); - const { data: allProducts, isLoading: isLoadingProducts, error: productsError } = trpc.common.product.getAllProductsSummary.useQuery({}); + const { data: allProducts, isLoading: isLoadingProducts, error: productsError } = trpc.common.product.getAllProductsSummary.useQuery(); const updateConstants = trpc.admin.const.updateConstants.useMutation(); // Initialize popular products from constants diff --git a/apps/admin-ui/app/(drawer)/dashboard/products/edit.tsx b/apps/admin-ui/app/(drawer)/dashboard/products/edit.tsx index 3a19620..ac72345 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/products/edit.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/products/edit.tsx @@ -33,6 +33,7 @@ export default function EditProduct() { shortDescription: '', longDescription: '', storeId: 0, + productType: 'item' as const, variants: [], } } diff --git a/apps/admin-ui/app/(drawer)/dashboard/products/index.tsx b/apps/admin-ui/app/(drawer)/dashboard/products/index.tsx index 7a281e1..f582282 100644 --- a/apps/admin-ui/app/(drawer)/dashboard/products/index.tsx +++ b/apps/admin-ui/app/(drawer)/dashboard/products/index.tsx @@ -10,7 +10,9 @@ import type { AdminSku } from '@packages/shared'; type FilterType = 'all' | 'in-stock' | 'out-of-stock'; -function getDefaultSku(product: { skus: AdminSku[] }): AdminSku | null { +type SerializedAdminSku = Omit & { createdAt: string | Date } + +function getDefaultSku(product: { skus: SerializedAdminSku[] }): SerializedAdminSku | null { return product.skus?.[0] ?? null } @@ -114,7 +116,6 @@ export default function Products() { {}} placeholder="Search products..." containerStyle={tw`mb-0`} /> diff --git a/apps/admin-ui/components/ProductGroupForm.tsx b/apps/admin-ui/components/ProductGroupForm.tsx index 4290085..720384e 100644 --- a/apps/admin-ui/components/ProductGroupForm.tsx +++ b/apps/admin-ui/components/ProductGroupForm.tsx @@ -25,7 +25,7 @@ const ProductGroupForm: React.FC = ({ onSuccess, }) => { // Fetch products - const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery({}); + const { data: productsData } = trpc.common.product.getAllProductsSummary.useQuery(); const createGroup = trpc.admin.product.createGroup.useMutation(); const updateGroup = trpc.admin.product.updateGroup.useMutation(); diff --git a/apps/admin-ui/components/ProductsSelector.tsx b/apps/admin-ui/components/ProductsSelector.tsx index d743cc9..2741a34 100644 --- a/apps/admin-ui/components/ProductsSelector.tsx +++ b/apps/admin-ui/components/ProductsSelector.tsx @@ -45,7 +45,7 @@ export default function ProductsSelector({ selectedGroupIds = [], onGroupChange, }: ProductsSelectorProps) { - const { data: skusData } = trpc.common.product.getAllSkusSummary.useQuery({}); + const { data: skusData } = trpc.common.product.getAllSkusSummary.useQuery(); const allSkus: SkuSummary[] = skusData?.skus || []; const [searchQuery, setSearchQuery] = useState(''); diff --git a/apps/admin-ui/src/components/ProductForm.tsx b/apps/admin-ui/src/components/ProductForm.tsx index cdeb9f3..f107dde 100644 --- a/apps/admin-ui/src/components/ProductForm.tsx +++ b/apps/admin-ui/src/components/ProductForm.tsx @@ -182,7 +182,7 @@ const ProductForm = forwardRef(({ value: store.id, })) || [] - const { data: skusData } = trpc.common.product.getAllSkusSummary.useQuery({}) + const { data: skusData } = trpc.common.product.getAllSkusSummary.useQuery() const skuOptions = (skusData?.skus || []).map((sku) => ({ label: sku.label, value: sku.id, diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index 857e740..b5c9ed4 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -1,4 +1,5 @@ import { Hono } from 'hono' +import type { Context } from 'hono' import { cors } from 'hono/cors' import { logger } from 'hono/logger' import { trpcServer } from '@hono/trpc-server' @@ -26,7 +27,7 @@ export const createApp = () => { // tRPC middleware app.use('/api/trpc/*', trpcServer({ router: appRouter, - createContext: async ({ req, c }) => { + createContext: async ({ req }, c) => { let user = null let staffUser = null const authHeader = req.headers.get('authorization') diff --git a/apps/backend/src/lib/init.ts b/apps/backend/src/lib/init.ts index 14bb87c..48836a8 100755 --- a/apps/backend/src/lib/init.ts +++ b/apps/backend/src/lib/init.ts @@ -1,7 +1,7 @@ import '@/src/lib/notif-job' import { initializeAllStores } from '@/src/stores/store-initializer' import { initializeUserNegativityStore } from '@/src/stores/user-negativity-store' -import { startOrderHandler, startCancellationHandler, publishOrder } from '@/src/lib/post-order-handler' +import { publishOrder } from '@/src/lib/post-order-handler' import { deleteOrders } from '@/src/lib/delete-orders' import { createAllCacheFiles } from '@/src/lib/cloud_cache' @@ -22,8 +22,6 @@ export const initFunc = async (): Promise => { await Promise.all([ initializeAllStores(), initializeUserNegativityStore(), - startOrderHandler(), - startCancellationHandler(), ]); // Create all cache files after stores are initialized diff --git a/apps/backend/src/lib/s3-client.ts b/apps/backend/src/lib/s3-client.ts index 2038dc2..1f8b437 100644 --- a/apps/backend/src/lib/s3-client.ts +++ b/apps/backend/src/lib/s3-client.ts @@ -50,7 +50,7 @@ export const imageUploadS3 = async(body: Buffer, type: string, key: string) => { headers: { 'Content-Type': type, }, - body, + body: body as unknown as BodyInit, }) if (!resp.ok) { const responseBody = await resp.text().catch(() => '') @@ -121,8 +121,8 @@ export async function generateSignedUrlFromS3Url(s3UrlRaw: string|null, expiresI const url = buildObjectUrl(getS3BucketName(), s3Url) const signedRequest = await client.sign(url, { method: 'GET', - signQuery: true, - expires: expiresIn, + headers: { 'X-Amz-Expires': String(expiresIn) }, + aws: { signQuery: true }, }) return signedRequest.url } catch (error) { @@ -173,11 +173,11 @@ export async function generateUploadUrl(key: string, mimeType: string, expiresIn const url = buildObjectUrl(getS3BucketName(), key) const signedRequest = await client.sign(url, { method: 'PUT', - signQuery: true, - expires: expiresIn, headers: { 'Content-Type': mimeType, + 'X-Amz-Expires': String(expiresIn), }, + aws: { signQuery: true }, }) return signedRequest.url diff --git a/apps/backend/src/sqliteImporter.ts b/apps/backend/src/sqliteImporter.ts index 070055a..cb08260 100644 --- a/apps/backend/src/sqliteImporter.ts +++ b/apps/backend/src/sqliteImporter.ts @@ -3,7 +3,7 @@ // Re-export database connection import type { D1Database } from '@cloudflare/workers-types' -import { db, initDb as initDbBase } from 'sqliteService' +import { db, initDb as initDbBase } from '../../../packages/db_helper_sqlite' export { db } let dbInitialized = false @@ -15,7 +15,7 @@ export const initDb = (database: D1Database) => { } // Re-export all schema exports -export * from 'sqliteService' +export * from '../../../packages/db_helper_sqlite' // Re-export all helper methods from sqliteService export { @@ -280,4 +280,4 @@ export { // Upload URL Helpers createUploadUrlStatus, claimUploadUrlStatus, -} from 'sqliteService' +} from '../../../packages/db_helper_sqlite' diff --git a/apps/backend/src/trpc/apis/common-apis/common.ts b/apps/backend/src/trpc/apis/common-apis/common.ts index fb3bade..6ce18be 100644 --- a/apps/backend/src/trpc/apis/common-apis/common.ts +++ b/apps/backend/src/trpc/apis/common-apis/common.ts @@ -59,6 +59,10 @@ export async function scaffoldProducts() { productType: product.productType || 'item', isComboOnly: product.isComboOnly, isOffer: product.isOffer, + price: Number(product.price ?? 0), + marketPrice: product.marketPrice != null ? Number(product.marketPrice) : null, + flashPrice: product.flashPrice != null ? Number(product.flashPrice) : null, + isFlashAvailable: product.isFlashAvailable, }; }) ); diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index e1de52a..6fec567 100755 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -44,7 +44,7 @@ }, // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [""], /* Specify multiple folders that act like './node_modules/@types'. */ - "typeRoots": ["./node_modules/@types", "../shared-types"], + "typeRoots": ["../../node_modules/@types", "./node_modules/@types", "../shared-types"], // "types": [], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ diff --git a/apps/fallback-ui/src/routes/vendor-order-list.tsx b/apps/fallback-ui/src/routes/vendor-order-list.tsx index fa18a1b..2c67121 100644 --- a/apps/fallback-ui/src/routes/vendor-order-list.tsx +++ b/apps/fallback-ui/src/routes/vendor-order-list.tsx @@ -4,7 +4,6 @@ import { trpc } from "../trpc/client"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import dayjs from "dayjs"; -import items from "razorpay/dist/types/items"; interface VendorOrder { orderId: string; diff --git a/apps/user-ui/hooks/cart-query-hooks.tsx b/apps/user-ui/hooks/cart-query-hooks.tsx index 43fef88..fddbf6f 100644 --- a/apps/user-ui/hooks/cart-query-hooks.tsx +++ b/apps/user-ui/hooks/cart-query-hooks.tsx @@ -22,7 +22,7 @@ type ProductSummary = Omit< > & { isFlashAvailable: boolean name?: string - flashPrice?: string | null + flashPrice?: number | null images?: string[] | null productQuantity?: number unitNotation?: string diff --git a/apps/web-ui/src/client.tsx b/apps/web-ui/src/client.tsx index 3877cb6..e5ac4b1 100644 --- a/apps/web-ui/src/client.tsx +++ b/apps/web-ui/src/client.tsx @@ -1,7 +1,4 @@ import { hydrateRoot } from 'react-dom/client' import { StartClient } from '@tanstack/react-start/client' -import { getRouter } from './router' -const router = getRouter() - -hydrateRoot(document, ) +hydrateRoot(document, ) diff --git a/apps/web-ui/src/components/AddToCartDialog.tsx b/apps/web-ui/src/components/AddToCartDialog.tsx index af2b292..8be9f8e 100644 --- a/apps/web-ui/src/components/AddToCartDialog.tsx +++ b/apps/web-ui/src/components/AddToCartDialog.tsx @@ -42,7 +42,7 @@ export default function AddToCartDialog() { useEffect(() => { if (isOpen && product) { - const cartItem = cartData?.items?.find((item: any) => item.productId === product.id) + const cartItem = cartData?.items?.find((item: any) => item.skuId === product.id) const cartQuantity = cartItem?.quantity || 0 setQuantity(cartQuantity === 0 ? 1 : cartQuantity) setSelectedSlotId(cartItem?.slotId || null) @@ -75,7 +75,7 @@ export default function AddToCartDialog() { .filter(Boolean) .filter((slot) => dayjs(slot.deliveryTime).isAfter(dayjs())) - const cartItem = cartData?.items?.find((item: any) => item.productId === product?.id) + const cartItem = cartData?.items?.find((item: any) => item.skuId === product?.id) const isUpdate = (cartItem?.quantity || 0) >= 1 const productAvailability = productSlotsMap[product?.id] @@ -89,14 +89,14 @@ export default function AddToCartDialog() { } if (isUpdate && cartItem) { updateItem.mutate( - { productId: product.id, quantity, slotId: selectedSlotId, deliveryDate: selectedSlotId ? slotMap[selectedSlotId]?.deliveryTime : null }, + { skuId: product.id, quantity, slotId: selectedSlotId, deliveryDate: selectedSlotId ? slotMap[selectedSlotId]?.deliveryTime : null }, { onSuccess: () => clearAddedToCartProduct() } ) } else { const slotId = selectedSlotId ?? availableSlotIds[0] ?? 0 addToCart.mutate( { - productId: product.id, + skuId: product.id, quantity, storeId: product.storeId || 1, slotId, diff --git a/apps/web-ui/src/components/AddressForm.tsx b/apps/web-ui/src/components/AddressForm.tsx index 7fb2f8b..da0b14d 100644 --- a/apps/web-ui/src/components/AddressForm.tsx +++ b/apps/web-ui/src/components/AddressForm.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react' import { trpc } from '../lib/trpc-client' -import { p, pInput, MyButton, div } from 'web-components' +import { p, pInput as PInput, MyButton, div } from 'web-components' import { MapPin, X, Plus } from 'lucide-react' import * as Yup from 'yup' import type { AddressFormProps } from '@packages/shared' @@ -123,7 +123,7 @@ export function AddressForm({ onSuccess, initialValues, isEdit = false }: Addres
- handleChange('name', e.target.value)} @@ -133,7 +133,7 @@ export function AddressForm({ onSuccess, initialValues, isEdit = false }: Addres
-
- handleChange('addressLine1', e.target.value)} @@ -154,7 +154,7 @@ export function AddressForm({ onSuccess, initialValues, isEdit = false }: Addres
- handleChange('addressLine2', e.target.value)} @@ -163,7 +163,7 @@ export function AddressForm({ onSuccess, initialValues, isEdit = false }: Addres
-
-
- 4. Paste the copied url here in the field.

- handleChange('googleMapsUrl', e.target.value)} diff --git a/apps/web-ui/src/components/FloatingCartBar.tsx b/apps/web-ui/src/components/FloatingCartBar.tsx index fd04e80..08d3fe5 100644 --- a/apps/web-ui/src/components/FloatingCartBar.tsx +++ b/apps/web-ui/src/components/FloatingCartBar.tsx @@ -55,7 +55,7 @@ export function FloatingCartBar({ isFlashDelivery = false }: FlashDeliveryProps) // Calculate total cart value const totalCartValue = cartItems.reduce( (sum, item) => { - const product = productsById[item.productId] + const product = productsById[item.skuId] const basePrice = product?.price ?? 0 const price = isFlashDelivery ? (product?.flashPrice ?? basePrice) : basePrice return sum + price * item.quantity @@ -142,17 +142,17 @@ export function FloatingCartBar({ isFlashDelivery = false }: FlashDeliveryProps)

- {productsById[item.productId]?.name || ''} + {productsById[item.skuId]?.name || ''}

- {productsById[item.productId]?.productQuantity || 0} - {productsById[item.productId]?.unitNotation || ''} + {productsById[item.skuId]?.productQuantity || 0} + {productsById[item.skuId]?.unitNotation || ''}

{item.slotId && (
@@ -167,17 +167,17 @@ export function FloatingCartBar({ isFlashDelivery = false }: FlashDeliveryProps) value={quantities[item.id] || item.quantity} setValue={(value) => { if (value === 0) { - removeFromCart.mutate(item.productId) + removeFromCart.mutate(item.skuId) } else { setQuantities((prev) => ({ ...prev, [item.id]: value })) - updateCartItem.mutate({ productId: item.productId, quantity: value }) + updateCartItem.mutate({ skuId: item.skuId, quantity: value }) } }} - step={productsById[item.productId]?.incrementStep || 1} + step={productsById[item.skuId]?.incrementStep || 1} />

₹{(() => { - const product = productsById[item.productId] + const product = productsById[item.skuId] const basePrice = product?.price ?? 0 const price = isFlashDelivery ? (product?.flashPrice ?? basePrice) : basePrice return price * item.quantity diff --git a/apps/web-ui/src/components/PaymentAndOrderComponent.tsx b/apps/web-ui/src/components/PaymentAndOrderComponent.tsx index d351ce5..ba4725a 100644 --- a/apps/web-ui/src/components/PaymentAndOrderComponent.tsx +++ b/apps/web-ui/src/components/PaymentAndOrderComponent.tsx @@ -36,7 +36,7 @@ export function PaymentAndOrderComponent({ // Calculate totals const totalPrice = cartItems.reduce((sum, item) => { - const product = productsById[item.productId] + const product = productsById[item.skuId] if (!product) return sum const price = isFlashDelivery ? (product.flashPrice ?? product.price ?? 0) : (product.price || 0) return sum + price * item.quantity @@ -61,7 +61,7 @@ export function PaymentAndOrderComponent({ navigate({ to: '/home/order-success', - search: { orderId: firstOrder?.id, totalAmount: finalTotalWithDelivery }, + search: { orderId: String(firstOrder?.id), totalAmount: String(finalTotalWithDelivery) }, }) }, onError: (error: any) => { @@ -87,7 +87,7 @@ export function PaymentAndOrderComponent({ const orderData = { selectedItems: cartItems.map((item) => ({ - productId: item.productId, + skuId: item.skuId, quantity: item.quantity, slotId: isFlashDelivery ? null : item.slotId, })), diff --git a/apps/web-ui/src/components/ProductCard.tsx b/apps/web-ui/src/components/ProductCard.tsx index 06c0add..3cea289 100644 --- a/apps/web-ui/src/components/ProductCard.tsx +++ b/apps/web-ui/src/components/ProductCard.tsx @@ -42,7 +42,7 @@ export function ProductCard({ const addToCart = useAddToCart('regular') // Find current quantity from cart data - const cartItem = cartData?.items?.find((cartItem: any) => cartItem.productId === item.id) + const cartItem = cartData?.items?.find((cartItem: any) => cartItem.skuId === item.id) const quantity = cartItem?.quantity || 0 // Get slots data from central store @@ -82,7 +82,7 @@ export function ProductCard({ const slot = slotMap[slotId] const deliveryTime = slot ? dayjs(slot.deliveryTime).format('ddd, DD MMM • h:mm A') : '' addToCart.mutate( - { productId: item.id, quantity: 1, slotId, storeId: item.storeId }, + { skuId: item.id, quantity: 1, slotId, storeId: item.storeId }, { onSuccess: () => { alert(`Added ${item.name} for delivery at ${deliveryTime}`) @@ -90,7 +90,7 @@ export function ProductCard({ } ) } else if (cartItem) { - updateCartItem.mutate({ productId: item.id, quantity: newQuantity }) + updateCartItem.mutate({ skuId: item.id, quantity: newQuantity }) } } diff --git a/apps/web-ui/src/hooks/cart-query-hooks.ts b/apps/web-ui/src/hooks/cart-query-hooks.ts index 3c14e44..18c0fe5 100644 --- a/apps/web-ui/src/hooks/cart-query-hooks.ts +++ b/apps/web-ui/src/hooks/cart-query-hooks.ts @@ -5,9 +5,9 @@ type CartType = 'regular' | 'flash' interface CartItem { id: number - productId: number + skuId: number quantity: number - storeId: number + storeId: number | null addedAt: number slotId?: number | null deliveryDate?: string | null @@ -50,20 +50,20 @@ export function useAddToCart(cartType: CartType = 'regular') { return useMutation({ mutationFn: async ({ - productId, + skuId, quantity, storeId, slotId, deliveryDate, }: { - productId: number + skuId: number quantity: number - storeId: number + storeId?: number | null slotId?: number | null deliveryDate?: string | null }) => { const items = readCart(cartType) - const existing = items.find((i) => i.productId === productId) + const existing = items.find((i) => i.skuId === skuId) if (existing) { existing.quantity += quantity if (slotId) existing.slotId = slotId @@ -71,9 +71,9 @@ export function useAddToCart(cartType: CartType = 'regular') { } else { items.push({ id: Date.now(), - productId, + skuId, quantity, - storeId, + storeId: storeId ?? null, addedAt: Date.now(), slotId: slotId ?? null, deliveryDate: deliveryDate ?? null, @@ -95,22 +95,22 @@ export function useUpdateCartItem(cartType: CartType = 'regular') { return useMutation({ mutationFn: async ({ - productId, + skuId, quantity, slotId, deliveryDate, }: { - productId: number + skuId: number quantity: number slotId?: number | null deliveryDate?: string | null }) => { let items = readCart(cartType) - const existing = items.find((i) => i.productId === productId) + const existing = items.find((i) => i.skuId === skuId) if (!existing) return if (quantity <= 0) { // Quantity hit 0 — remove the item from the cart entirely - items = items.filter((i) => i.productId !== productId) + items = items.filter((i) => i.skuId !== skuId) } else { existing.quantity = quantity if (slotId !== undefined) existing.slotId = slotId @@ -129,9 +129,9 @@ export function useRemoveFromCart(cartType: CartType = 'regular') { const queryClient = useQueryClient() return useMutation({ - mutationFn: async (productId: number) => { + mutationFn: async (skuId: number) => { let items = readCart(cartType) - items = items.filter((i) => i.productId !== productId) + items = items.filter((i) => i.skuId !== skuId) writeCart(cartType, items) queryClient.setQueryData([getCartKey(cartType)], toCartData(items)) }, diff --git a/apps/web-ui/src/lib/auth-context.tsx b/apps/web-ui/src/lib/auth-context.tsx index 1e95cbe..b0ed0d7 100644 --- a/apps/web-ui/src/lib/auth-context.tsx +++ b/apps/web-ui/src/lib/auth-context.tsx @@ -7,7 +7,7 @@ import type { User as SharedUser, AuthStateCore } from '@packages/shared' type User = Pick & Partial> & { mobile: string | null - profileImage: string | null + profileImage?: string | null } interface AuthState extends AuthStateCore { diff --git a/apps/web-ui/src/lib/stores/central-product-store.ts b/apps/web-ui/src/lib/stores/central-product-store.ts index e7c9663..d7b65b0 100644 --- a/apps/web-ui/src/lib/stores/central-product-store.ts +++ b/apps/web-ui/src/lib/stores/central-product-store.ts @@ -1,19 +1,10 @@ import { create } from 'zustand' import type { CentralProductState as CentralProductsState } from '@packages/shared' +import type { MergedProduct } from '../../hooks/prominent-api-hooks' -interface Product { - id: number - name: string - price: number - discountedPrice: number | null - images: { uri: string }[] - unit: string - unitValue: number - storeId: number - category: string - isActive: boolean - description: string | null -} +// Central cache holds the API product (MergedProduct) — single product shape +// across the app (numeric pricing, string images). +type Product = MergedProduct type CentralProductStore = CentralProductsState diff --git a/apps/web-ui/src/routes/cart.tsx b/apps/web-ui/src/routes/cart.tsx index f896288..4edf9df 100644 --- a/apps/web-ui/src/routes/cart.tsx +++ b/apps/web-ui/src/routes/cart.tsx @@ -18,11 +18,11 @@ function CartPage() { const productsById: Record = {} products.forEach((p: any) => { productsById[p.id] = p }) - const cartItems = (cart?.items || []).filter((item) => productsById[item.productId]) + const cartItems = (cart?.items || []).filter((item) => productsById[item.skuId]) let total = 0 cartItems.forEach((item) => { - const product = productsById[item.productId] + const product = productsById[item.skuId] if (product) { total += product.price * item.quantity } @@ -57,11 +57,11 @@ function CartPage() { {/* Items */}

{cartItems.map((item) => { - const product = productsById[item.productId] + const product = productsById[item.skuId] const price = product.price return (
updateItem.mutate({ productId: item.productId, quantity: q })} + setValue={(q) => updateItem.mutate({ skuId: item.skuId, quantity: q })} />

₹{price}

@@ -85,7 +85,7 @@ function CartPage() {

₹{price * item.quantity}