From 46f5fa180c1a0b16ef0bb4ec19372c39a03df305 Mon Sep 17 00:00:00 2001 From: shafi54 <108669266+shafi-aviz@users.noreply.github.com> Date: Thu, 29 Jan 2026 01:05:20 +0530 Subject: [PATCH] enh --- apps/backend/index.ts | 2 +- .../src/trpc/admin-apis/vendor-snippets.ts | 25 ++++++++++++------- apps/backend/src/trpc/user-apis/order.ts | 5 +++- .../app/(drawer)/(tabs)/home/index.tsx | 7 +++++- apps/user-ui/app/(drawer)/(tabs)/me/index.tsx | 12 +++++++++ .../app/(drawer)/(tabs)/me/my-orders/[id].tsx | 14 ++++++++--- apps/user-ui/components/NextOrderGlimpse.tsx | 9 ++++++- apps/user-ui/hooks/useAuthenticatedRoute.ts | 2 -- package-lock.json | 3 ++- packages/ui/hooks/useNavigationTarget.ts | 25 +++++++++++++++++++ packages/ui/index.ts | 4 +-- packages/ui/package.json | 3 ++- 12 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 packages/ui/hooks/useNavigationTarget.ts diff --git a/apps/backend/index.ts b/apps/backend/index.ts index 2bb5332..9c78a32 100755 --- a/apps/backend/index.ts +++ b/apps/backend/index.ts @@ -19,7 +19,7 @@ import { seed } from 'src/db/seed'; import './src/jobs/jobs-index'; import { startAutomatedJobs } from './src/lib/automatedJobs'; -seed() +// seed() initFunc() startAutomatedJobs() diff --git a/apps/backend/src/trpc/admin-apis/vendor-snippets.ts b/apps/backend/src/trpc/admin-apis/vendor-snippets.ts index 79adfa4..4fa00d2 100644 --- a/apps/backend/src/trpc/admin-apis/vendor-snippets.ts +++ b/apps/backend/src/trpc/admin-apis/vendor-snippets.ts @@ -1,8 +1,8 @@ import { router, publicProcedure, protectedProcedure } from '../trpc-index'; import { z } from 'zod'; import { db } from '../../db/db_index'; -import { vendorSnippets, deliverySlotInfo, productInfo, orders, orderItems, users } from '../../db/schema'; -import { eq, and, inArray, isNotNull, gt, sql, asc } from 'drizzle-orm'; +import { vendorSnippets, deliverySlotInfo, productInfo, orders, orderItems, users, orderStatus } from '../../db/schema'; +import { eq, and, inArray, isNotNull, gt, sql, asc, ne } from 'drizzle-orm'; import { appUrl } from '../../lib/env-exporter'; const createSnippetSchema = z.object({ @@ -225,10 +225,7 @@ export const vendorSnippetsRouter = router({ // Query orders that match the snippet criteria const matchingOrders = await db.query.orders.findMany({ - where: and( - eq(orders.slotId, snippet.slotId!), - // We'll filter by products in the application logic - ), + where: eq(orders.slotId, snippet.slotId!), with: { orderItems: { with: { @@ -239,6 +236,7 @@ export const vendorSnippetsRouter = router({ }, }, }, + orderStatus: true, user: true, slot: true, }, @@ -247,6 +245,8 @@ export const vendorSnippetsRouter = router({ // Filter orders that contain at least one of the snippet's products const filteredOrders = matchingOrders.filter(order => { + const status = order.orderStatus; + if (status[0].isCancelled) return false; const orderProductIds = order.orderItems.map(item => item.productId); return snippet.productIds.some(productId => orderProductIds.includes(productId)); }); @@ -271,11 +271,13 @@ export const vendorSnippetsRouter = router({ is_package_verified: item.is_package_verified, })); + const orderTotal = products.reduce((sum, p) => sum + p.subtotal, 0); + return { orderId: `ORD${order.readableId.toString().padStart(3, '0')}`, orderDate: order.createdAt.toISOString(), customerName: order.user.name, - totalAmount: order.totalAmount, + totalAmount: orderTotal, slotInfo: order.slot ? { time: order.slot.deliveryTime.toISOString(), sequence: order.slot.deliverySequence, @@ -379,7 +381,7 @@ export const vendorSnippetsRouter = router({ if (!slot) { throw new Error("Slot not found"); } - + // Query orders that match the slot and snippet criteria const matchingOrders = await db.query.orders.findMany({ where: eq(orders.slotId, slotId), @@ -393,6 +395,7 @@ export const vendorSnippetsRouter = router({ }, }, }, + orderStatus: true, user: true, slot: true, }, @@ -401,6 +404,8 @@ export const vendorSnippetsRouter = router({ // Filter orders that contain at least one of the snippet's products const filteredOrders = matchingOrders.filter(order => { + const status = order.orderStatus; + if (status[0]?.isCancelled) return false; const orderProductIds = order.orderItems.map(item => item.productId); return snippet.productIds.some(productId => orderProductIds.includes(productId)); }); @@ -425,11 +430,13 @@ export const vendorSnippetsRouter = router({ is_package_verified: item.is_package_verified, })); + const orderTotal = products.reduce((sum, p) => sum + p.subtotal, 0); + return { orderId: `ORD${order.readableId.toString().padStart(3, '0')}`, orderDate: order.createdAt.toISOString(), customerName: order.user.name, - totalAmount: order.totalAmount, + totalAmount: orderTotal, slotInfo: order.slot ? { time: order.slot.deliveryTime.toISOString(), sequence: order.slot.deliverySequence, diff --git a/apps/backend/src/trpc/user-apis/order.ts b/apps/backend/src/trpc/user-apis/order.ts index 7582559..2d2429a 100644 --- a/apps/backend/src/trpc/user-apis/order.ts +++ b/apps/backend/src/trpc/user-apis/order.ts @@ -712,7 +712,7 @@ export const orderRouter = router({ .input( z.object({ // id: z.string().regex(/^ORD\d+$/, "Invalid order ID format"), - id: z.string(), + id: z.number(), reason: z.string().min(1, "Cancellation reason is required"), }) ) @@ -723,6 +723,9 @@ export const orderRouter = router({ const readableId = Number(id); + console.log({id, reason}) + + // Check if order exists and belongs to user const order = await db.query.orders.findFirst({ where: eq(orders.id, Number(id)), diff --git a/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx index 1965697..61980e4 100755 --- a/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/home/index.tsx @@ -34,6 +34,7 @@ import { useUserDetails } from "@/src/contexts/AuthContext"; import TabLayoutWrapper from "@/components/TabLayoutWrapper"; import { useNavigationStore } from "@/src/store/navigationStore"; import { useGetEssentialConsts } from "@/src/api-hooks/essential-consts.api"; +import NextOrderGlimpse from "@/components/NextOrderGlimpse"; dayjs.extend(relativeTime); // import { StatusBar } from "expo-status-bar"; @@ -362,6 +363,10 @@ export default function Dashboard() { setWhiteSectionLayout({ y }); }} > + + + + {/* Section Title */} @@ -491,7 +496,7 @@ export default function Dashboard() { - Delivery Slot + {dayjs(slot.deliveryTime).format("ddd, MMM DD")} diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/index.tsx b/apps/user-ui/app/(drawer)/(tabs)/me/index.tsx index dc3ee53..031b0db 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/me/index.tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/me/index.tsx @@ -1,16 +1,28 @@ import React from 'react'; import { View, ScrollView } from 'react-native'; import { useRouter } from 'expo-router'; +import { useFocusEffect } from '@react-navigation/native'; import { AppContainer, MyText, tw, MyTouchableOpacity, ProfileImage, colors } from 'common-ui'; import TabLayoutWrapper from '@/components/TabLayoutWrapper'; import { LinearGradient } from 'expo-linear-gradient'; import { Ionicons } from '@expo/vector-icons'; import NextOrderGlimpse from '@/components/NextOrderGlimpse'; import { useAuth } from '@/src/contexts/AuthContext'; +import { useNavigationTarget } from 'common-ui/hooks/useNavigationTarget'; export default function Me() { const router = useRouter(); const { logout } = useAuth(); + const { getNavigationTarget } = useNavigationTarget(); + + useFocusEffect(() => { + const target = getNavigationTarget(); + console.log({target}) + + if (target) { + router.replace(target as any); + } + }); const menuSections = [ { diff --git a/apps/user-ui/app/(drawer)/(tabs)/me/my-orders/[id].tsx b/apps/user-ui/app/(drawer)/(tabs)/me/my-orders/[id].tsx index 0590f1d..6c4b66a 100644 --- a/apps/user-ui/app/(drawer)/(tabs)/me/my-orders/[id].tsx +++ b/apps/user-ui/app/(drawer)/(tabs)/me/my-orders/[id].tsx @@ -50,6 +50,8 @@ export default function OrderDetails() { Alert.alert('Success', 'Order cancelled successfully'); }, onError: (error: any) => { + console.log({error}) + Alert.alert('Error', error.message || 'Failed to cancel order'); }, }); @@ -59,7 +61,7 @@ export default function OrderDetails() { Alert.alert('Error', 'Please enter a reason for cancellation'); return; } - cancelOrderMutation.mutate({ id: order.orderId, reason: cancelReason }); + cancelOrderMutation.mutate({ id: order.id, reason: cancelReason }); }; useEffect(() => { @@ -126,6 +128,12 @@ export default function OrderDetails() { {/* Simple Header */} + router.back()} + style={tw`mr-3 p-2 -ml-2`} + > + + Order #{order.orderId} {dayjs(order.orderDate).format("DD MMM, h:mm A")} @@ -342,10 +350,10 @@ export default function OrderDetails() { {/* Footer Actions */} router.back()} + onPress={() => router.replace('/(drawer)/(tabs)/me')} style={tw`flex-1 bg-slate-100 py-3.5 rounded-xl items-center`} > - Dismiss + Back setComplaintDialogOpen(true)} diff --git a/apps/user-ui/components/NextOrderGlimpse.tsx b/apps/user-ui/components/NextOrderGlimpse.tsx index cae820d..94c44ed 100644 --- a/apps/user-ui/components/NextOrderGlimpse.tsx +++ b/apps/user-ui/components/NextOrderGlimpse.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { View, TouchableOpacity, ActivityIndicator } from 'react-native'; import { useRouter } from 'expo-router'; import { tw, MyText } from 'common-ui'; +import { useNavigationTarget } from 'common-ui/hooks/useNavigationTarget'; import { MaterialIcons, Ionicons } from '@expo/vector-icons'; import dayjs from 'dayjs'; import { trpc } from '@/src/trpc-client'; @@ -38,6 +39,7 @@ interface Order { export default function NextOrderGlimpse() { const router = useRouter(); + const { setNavigationTarget } = useNavigationTarget(); const { data: ordersData, isLoading: ordersLoading } = trpc.user.order.getOrders.useQuery({ page: 1, @@ -97,7 +99,12 @@ export default function NextOrderGlimpse() { return ( router.push(`/(drawer)/(tabs)/me/my-orders/${nextOrder.id}`)} + onPress={() => { + console.log('from next press') + + setNavigationTarget(`/(drawer)/(tabs)/me/my-orders/${nextOrder.id}`); + router.replace('/(drawer)/(tabs)/me'); + }} > diff --git a/apps/user-ui/hooks/useAuthenticatedRoute.ts b/apps/user-ui/hooks/useAuthenticatedRoute.ts index d8e750d..20f1612 100644 --- a/apps/user-ui/hooks/useAuthenticatedRoute.ts +++ b/apps/user-ui/hooks/useAuthenticatedRoute.ts @@ -18,8 +18,6 @@ interface RedirectState { export function useAuthenticatedRoute(options: AuthenticatedRouteOptions = {}) { const { isAuthenticated, isLoading } = useAuth(); const router = useRouter(); - - console.log({ops: options.queryParams}) useFocusEffect(() => { // Don't redirect while auth is loading diff --git a/package-lock.json b/package-lock.json index b5c8715..767986b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24388,7 +24388,8 @@ "react-native-web": "~0.20.0", "react-native-webview": "13.13.5", "twrnc": "^4.9.1", - "yup": "^1.7.0" + "yup": "^1.7.0", + "zustand": "^5.0.10" } }, "packages/ui/node_modules/buffer": { diff --git a/packages/ui/hooks/useNavigationTarget.ts b/packages/ui/hooks/useNavigationTarget.ts new file mode 100644 index 0000000..f501998 --- /dev/null +++ b/packages/ui/hooks/useNavigationTarget.ts @@ -0,0 +1,25 @@ +import { create } from 'zustand'; + +interface NavigationTargetState { + navigationTarget: string | null; + setNavigationTarget: (target: string | null) => void; + getNavigationTarget: () => string | null; +} + +const useNavigationTargetStore = create((set, get) => ({ + navigationTarget: null, + setNavigationTarget: (target: string | null) => { + set({ navigationTarget: target }) + }, + getNavigationTarget: () => { + const target = get().navigationTarget; + if (target) { + set({ navigationTarget: null }); + } + return target; + }, +})); + +export function useNavigationTarget() { + return useNavigationTargetStore(); +} \ No newline at end of file diff --git a/packages/ui/index.ts b/packages/ui/index.ts index b448e91..db929af 100755 --- a/packages/ui/index.ts +++ b/packages/ui/index.ts @@ -64,8 +64,8 @@ const isDevMode = Constants.executionEnvironment !== "standalone"; // const BASE_API_URL = 'http://10.0.2.2:4000'; // const BASE_API_URL = 'http://192.168.100.101:4000'; // const BASE_API_URL = 'http://192.168.1.14:4000'; -let BASE_API_URL = "https://mf.freshyo.in"; - // let BASE_API_URL = 'http://192.168.100.103:4000'; +// let BASE_API_URL = "https://mf.freshyo.in"; + let BASE_API_URL = 'http://192.168.100.103:4000'; // let BASE_API_URL = 'http://192.168.29.219:4000'; // if(isDevMode) { diff --git a/packages/ui/package.json b/packages/ui/package.json index 78446e3..3d5e06f 100755 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -57,6 +57,7 @@ "react-native-web": "~0.20.0", "react-native-webview": "13.13.5", "twrnc": "^4.9.1", - "yup": "^1.7.0" + "yup": "^1.7.0", + "zustand": "^5.0.10" } }