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"
}
}