From 0e93334941b45aa5a62b76e683703d569197429a Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Fri, 9 Jan 2026 10:28:25 +0530 Subject: [PATCH 1/4] eender --- src/Axios/Axios.ts | 3 - src/Constant/NavigationString.tsx | 4 +- src/Navigation/MainStack.jsx | 1 + src/Screens/Tender/LiveTender.tsx | 4 +- src/Screens/Tender/LiveTenderDetail.tsx | 18 +++ src/Screens/Tender/LiveTenderTile.tsx | 11 +- src/Screens/Tender/ProceedToBidDetail.tsx | 129 +++++------------- src/Screens/Tender/PurchaseTenderAllList.tsx | 2 + src/Screens/Tender/PurchaseTenderTile.tsx | 42 +++--- .../Tender/tenderBidding/TenderBidding.tsx | 23 ++-- src/Screens/index.ts | 4 +- src/Services/BBPS/Hooks.ts | 57 ++++---- 12 files changed, 129 insertions(+), 169 deletions(-) create mode 100644 src/Screens/Tender/LiveTenderDetail.tsx diff --git a/src/Axios/Axios.ts b/src/Axios/Axios.ts index 7420661..0c18004 100644 --- a/src/Axios/Axios.ts +++ b/src/Axios/Axios.ts @@ -13,20 +13,17 @@ export const apiCall = async ( try { const token: any = store.getState().token.token; - console.log("token : ", token) const response = await axios({ method, url, data, params, // withCredentials: true, - baseURL: Variable.Main_Base, headers: { Authentication: `Bearer ${token?.token}`, 'Content-Type': contentType || 'application/json', }, }); - console.log("url : ", url) return response.data; } catch (error: any) { const errorMessage = error?.response?.data?.error; diff --git a/src/Constant/NavigationString.tsx b/src/Constant/NavigationString.tsx index b6414a3..80b7791 100644 --- a/src/Constant/NavigationString.tsx +++ b/src/Constant/NavigationString.tsx @@ -1,6 +1,3 @@ -import ProceedToBidDetail from "../Screens/Tender/ProceedToBidDetail" -import TenderBidding from "../Screens/Tender/tenderBidding/TenderBidding" - const NavigationString = { Login: 'Login', Splash: 'Splash', @@ -17,5 +14,6 @@ const NavigationString = { ProceedToPurTender:'ProceedToPurTender', TenderBidding:'TenderBidding', ProceedToBidDetail:'ProceedToBidDetail', + LiveTenderDetail:'LiveTenderDetail', } export default NavigationString \ No newline at end of file diff --git a/src/Navigation/MainStack.jsx b/src/Navigation/MainStack.jsx index f50b2a8..3fda2c1 100644 --- a/src/Navigation/MainStack.jsx +++ b/src/Navigation/MainStack.jsx @@ -40,6 +40,7 @@ export default function MainStack() { + ); diff --git a/src/Screens/Tender/LiveTender.tsx b/src/Screens/Tender/LiveTender.tsx index eeca2c9..3e48882 100644 --- a/src/Screens/Tender/LiveTender.tsx +++ b/src/Screens/Tender/LiveTender.tsx @@ -57,8 +57,8 @@ const LiveTender = () => { tenderOfWork={item.departmentName} tenderFees={item.documentFees} tenderNumber={item.tenderNumber} - onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }} - onDetailsPress={() => { }} + // onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }} + // onDetailsPress={() => navigation.navigate('LiveTenderDetail', {item})} /> }, [SelectedPurchaseList] diff --git a/src/Screens/Tender/LiveTenderDetail.tsx b/src/Screens/Tender/LiveTenderDetail.tsx new file mode 100644 index 0000000..5cd345a --- /dev/null +++ b/src/Screens/Tender/LiveTenderDetail.tsx @@ -0,0 +1,18 @@ +import { StyleSheet, Text, View } from 'react-native' +import React from 'react' +import { useRoute } from '@react-navigation/native'; + +const LiveTenderDetail = () => { + const route = useRoute(); + const { tender } = route.params; + console.log("live tender details : ", tender) + return ( + + LiveTenderDetail + + ) +} + +export default LiveTenderDetail + +const styles = StyleSheet.create({}) \ No newline at end of file diff --git a/src/Screens/Tender/LiveTenderTile.tsx b/src/Screens/Tender/LiveTenderTile.tsx index 71890a6..bc5104c 100644 --- a/src/Screens/Tender/LiveTenderTile.tsx +++ b/src/Screens/Tender/LiveTenderTile.tsx @@ -6,6 +6,7 @@ import { LiveTenderTileProps } from './types/types'; import { Calendar, Tag, Info, ArrowRight } from 'lucide-react-native'; import TenderDetail from './Modal/TenderFullDetail'; import TenderFullDetail from './Modal/TenderFullDetail'; +import { useNavigation } from '@react-navigation/native'; const LiveTenderTile: React.FC = ({ data, @@ -16,10 +17,12 @@ const LiveTenderTile: React.FC = ({ purchaseEnd, tenderFees, tenderNumber, + onDetailsPress }) => { - const [showDetail, setShowDetail] = React.useState(false); + const navigation: any = useNavigation(); const purchaseEnded = moment().isAfter(moment(purchaseEnd, 'DD-MM-YYYY HH:mm:ss')); + console.log("live tender data : ", data) return ( {/* Status Tag */} @@ -33,7 +36,7 @@ const LiveTenderTile: React.FC = ({ setShowDetail(true)} + onPress={() => navigation.navigate('LiveTenderDetail', data)} > {/* Header */} @@ -72,7 +75,7 @@ const LiveTenderTile: React.FC = ({ {/* Action Bar */} - setShowDetail(true)}> + Details @@ -104,7 +107,7 @@ const LiveTenderTile: React.FC = ({ {/* Tender Detail Modal */} - setShowDetail(false)} /> + {/* setShowDetail(false)} /> */} ); diff --git a/src/Screens/Tender/ProceedToBidDetail.tsx b/src/Screens/Tender/ProceedToBidDetail.tsx index f937852..086ef56 100644 --- a/src/Screens/Tender/ProceedToBidDetail.tsx +++ b/src/Screens/Tender/ProceedToBidDetail.tsx @@ -2,85 +2,24 @@ import { StyleSheet, Text, View, ScrollView, StatusBar, TouchableOpacity } from import React from 'react' import { InsideHeader } from '../../Component/Index' import colors from '../../Constant/Color' -import { useNavigation } from '@react-navigation/native' +import { useNavigation, useRoute } from '@react-navigation/native' +import { useProceedToBid } from '../../Services/BBPS/Hooks' const ProceedToBidDetail = () => { // Sample data based on your JSON - const navigation = useNavigation() - const tenderData = { - tenderId: 1372, - envelopeASubmittStatus: true, - envelopeBSubmittStatus: true, - envelopeCSubmittStatus: true, - envelopeA_Logs: { - logId: 314, - contractorId: 1, - activity: "Bid on Envelope A", - tenderId: 1372, - dateTime: "Fri Dec 12 13:07:44 IST 2025", - osName: "Linux", - browserName: "Chrome-142.0.0.0", - ipAddress: "192.168.5.10", - macAddress: "00:00:00:00:00:00", - logMessage: "Envelope A bidding is Submitted", - headingMsg: null, - status: null, - envelope: "EA" - }, - envelopeB_Logs: { - logId: 315, - contractorId: 1, - activity: "Bid on Envelope B", - tenderId: 1372, - dateTime: "Fri Dec 12 13:08:00 IST 2025", - osName: "Linux", - browserName: "Chrome-142.0.0.0", - ipAddress: "192.168.5.10", - macAddress: "00:00:00:00:00:00", - logMessage: "Envelope B bidding is Submitted", - headingMsg: null, - status: null, - envelope: "EB" - }, - envelopeC_Logs: { - logId: 316, - contractorId: 1, - activity: "Bid on Envelope C", - tenderId: 1372, - dateTime: "Fri Dec 12 13:08:31 IST 2025", - osName: "Linux", - browserName: "Chrome-142.0.0.0", - ipAddress: "192.168.5.10", - macAddress: "00:00:00:00:00:00", - logMessage: "Envelope C bidding is Submitted", - headingMsg: "Percentage Rate Tender", - status: null, - envelope: "EC" - }, - showEB: true, - showEC: true, - showQCBS: false, - showLCS: false, - viewBid: true, - proceedtoBid: false, - tenderNumber: "TN/152", - emdInFig: "100", - tenderBidWithdraw: "Allowed", - tenderRebid: "Allowed", - nitNo: "NIT-410", - nameofWork: "Tender is created for Testing Process only", - reBid: "Allowed", - bidWithDraw: "Allowed", - envelopeType: "3", - biddingStatus: true, - tenderStages: "1", - dscStatus: false, - submittedStartDate: [2025, 3, 4, 10, 0], - submittedEndDate: [2026, 3, 4, 23, 50], - bidWithdrawStatus: true - }; + const route = useRoute() + const tenderData = route.params?.tender; + const {data, refetch} = useProceedToBid(tenderData?.tenderId); + const navigation = useNavigation() // Format date from array + + const handleStartBidding = () => { + refetch(); + if (data) { + navigation.navigate('TenderBidding', { tenderData: tenderData , bidData: data.data }); + } + } const formatDate = (dateArray: any[]) => { if (!dateArray || dateArray.length < 3) return "N/A"; const [year, month, day, hour = 0, minute = 0] = dateArray; @@ -103,39 +42,39 @@ const ProceedToBidDetail = () => { {title} - {log.envelope} + {log?.envelope} Activity: - {log.activity} + {log?.activity} Date & Time: - {log.dateTime} + {log?.dateTime} System Info: - {log.osName} / {log.browserName} + {log?.osName} / {log?.browserName} IP Address: - {log.ipAddress} + {log?.ipAddress} Status Message: - {log.logMessage} + {log?.logMessage} - {log.headingMsg && ( + {log?.headingMsg && ( Heading: - {log.headingMsg} + {log?.headingMsg} )} @@ -278,23 +217,19 @@ const ProceedToBidDetail = () => { - - { - navigation.navigate('TenderBidding', { tenderData: tenderData }); - }}> - Proceed to Bid - - { - // tenderData?.proceedtoBid && !tenderData?.viewBid && tenderData?.biddingStatus && tenderData?.bidWithdrawStatus === false ? ( - // { - // navigation.navigate('TenderBidding', { tenderData: tenderData }); - // }}> - // Proceed to Bid - // - // ) : One time bidding is completed - } + + + { + tenderData?.proceedtoBid && !tenderData?.viewBid && tenderData?.biddingStatus && tenderData?.bidWithdrawStatus === false ? ( + + + Start Bidding + + + ) : One time bidding is completed + } ) diff --git a/src/Screens/Tender/PurchaseTenderAllList.tsx b/src/Screens/Tender/PurchaseTenderAllList.tsx index 69072ac..59d1e0d 100644 --- a/src/Screens/Tender/PurchaseTenderAllList.tsx +++ b/src/Screens/Tender/PurchaseTenderAllList.tsx @@ -23,6 +23,8 @@ const PurchaseTenderAllList = () => { const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isRefetching, refetch }: any = useFetchPurchaseTender(); const [showRefreshBanner, setShowRefreshBanner] = useState(false); + + console.log("data for tender : ", data) useEffect(() => { if (isRefetching) { setShowRefreshBanner(true); diff --git a/src/Screens/Tender/PurchaseTenderTile.tsx b/src/Screens/Tender/PurchaseTenderTile.tsx index a3c72bd..30b79db 100644 --- a/src/Screens/Tender/PurchaseTenderTile.tsx +++ b/src/Screens/Tender/PurchaseTenderTile.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { use, useEffect } from 'react'; import { View, Text, @@ -33,21 +33,17 @@ const PurchaseTenderTile = ({ elevation: elevation.value, })); - const { data: tenderResponse, }: any = useFetchTenderById(item?.tenderId); - const tender = tenderResponse?.data; + const { data: tenderResponse, }: any = useFetchTenderById(item?.tenderId); + const tender = tenderResponse?.data; - // const { - // refetch, - // isFetching, - // isError, - // } = useProceedToBid(item?.tenderId); + // console.log("item my : ", item) - // const handleProceed = async (item: any) => { - // const res = await refetch(); - // if (res.data && !isError) { - // navigation.navigate('TenderBidding', { tenderData: res.data?.data }); - // } - // }; + { + if (item?.nitNumber == 'TN/111') { + console.log("tender item : ", item?.nitNumber) + + } + } const handlePressIn = () => { scale.value = withTiming(0.97, { duration: 120 }); @@ -59,12 +55,18 @@ const PurchaseTenderTile = ({ elevation.value = withTiming(8, { duration: 160 }); }; - const isLive = item?.liveStatus === true; + const isLive = item?.biddingStatus === true; const statusColor = isLive ? colors.primary : '#94A3B8'; const lightStatusBg = isLive ? '#EFF6FF' : '#F8FAFC'; const [showDetail, setShowDetail] = React.useState(false); + useEffect(() => { + if(item?.tenderNumber == 'TN/210'){ + console.log("tender item : ", item) + } + }, [item]); + return ( - Purchase Ends: + Bid Ends: {moment( - item?.tenderKeyDatesAmendment?.tenderPurchaseDate?.endDateTime, + item?.keydates?.bidSubmissionDate?.endDateTime, 'DD-MM-YYYY HH:mm:ss' - ).format('DD MMM, hh:mm A')} + ).format('DD MMM YYYY, hh:mm A')} @@ -121,7 +123,7 @@ const PurchaseTenderTile = ({ {isLive ? ( ) : ( @@ -133,7 +135,7 @@ const PurchaseTenderTile = ({ disabled={!isLive} onPress={() => { if (isLive) { - navigation.navigate('ProceedToBidDetail', { tender }); + navigation.navigate('ProceedToBidDetail', { tender }); } }} activeOpacity={0.85} diff --git a/src/Screens/Tender/tenderBidding/TenderBidding.tsx b/src/Screens/Tender/tenderBidding/TenderBidding.tsx index b4e10bf..53b7ec3 100644 --- a/src/Screens/Tender/tenderBidding/TenderBidding.tsx +++ b/src/Screens/Tender/tenderBidding/TenderBidding.tsx @@ -53,6 +53,7 @@ const TenderBidding = () => { const navigation = useNavigation(); const [bidData] = useState(route.params?.tenderData || null); + const tenderData = route.params?.bidData || null; const [activeEnvelope, setActiveEnvelope] = useState('A'); const [isLoading, setIsLoading] = useState(false); const [envelopForm, setEnvelopForm] = useState({ @@ -227,9 +228,9 @@ const TenderBidding = () => { }; const hasEnvelopes = () => { - const hasA = bidData?.tenderEnvelopeAList?.length > 0; - const hasB = bidData?.tenderEnvelopeBList?.length > 0; - // const hasC = bidData?.tenderEnvelopeCList?.length > 0; + const hasA = tenderData?.tenderEnvelopeAList?.length > 0; + const hasB = tenderData?.tenderEnvelopeBList?.length > 0; + // const hasC = tenderData?.tenderEnvelopeCList?.length > 0; return hasA || hasB; }; @@ -442,7 +443,8 @@ const TenderBidding = () => { ); } - console.log("route for date : ", route.params) + // console.log("route for date : ", bidData) + // console.log("bid envelop : ", tenderData) return ( @@ -467,20 +469,19 @@ const TenderBidding = () => { Bid Envelopes - {bidData?.showEA && ( + {tenderData?.showEA && ( setActiveEnvelope('A')} /> )} - {bidData?.showEB && ( + {tenderData?.showEB && ( { - if - (bidData?.envelopeASubmittStatus) { + if (tenderData?.envelopeASubmittStatus) { setActiveEnvelope('B') } else { Alert.alert('Info', 'First Fill Envelop A First') @@ -488,7 +489,7 @@ const TenderBidding = () => { }} /> )} - {bidData?.showEC && ( + {tenderData?.showEC && ( { {/* Envelope A List */} - {bidData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && ( + {tenderData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && ( Envelope {activeEnvelope} Details item?.[`tenderEnvelope${activeEnvelope}SequnceId`]?.toString()} renderItem={({ item }) => renderEnvelopeItem({ item, envelopeType: activeEnvelope })} scrollEnabled={false} diff --git a/src/Screens/index.ts b/src/Screens/index.ts index 3f4d9de..d86e2e4 100644 --- a/src/Screens/index.ts +++ b/src/Screens/index.ts @@ -7,6 +7,7 @@ import Home from "./Home/Home"; import Login from "./Login/Login"; import Onboarding from "./Onboarding/Onboarding"; import Splash from "./Splash/Splash"; +import LiveTenderDetail from "./Tender/LiveTenderDetail"; import ProceedToBidDetail from "./Tender/ProceedToBidDetail"; import ProceedToPurTender from "./Tender/ProceedToPurTender"; import PurchaseTenderList from "./Tender/PurchaseTenderList"; @@ -28,6 +29,7 @@ const Screens = { PurchaseTenderList, ProceedToPurTender, TenderBidding, - ProceedToBidDetail + ProceedToBidDetail, + LiveTenderDetail } export default Screens \ No newline at end of file diff --git a/src/Services/BBPS/Hooks.ts b/src/Services/BBPS/Hooks.ts index 070195a..2d3c1c9 100644 --- a/src/Services/BBPS/Hooks.ts +++ b/src/Services/BBPS/Hooks.ts @@ -20,30 +20,31 @@ export const useDashboard = () => { // Auction & Tender export const useFetchPurchaseTender = () => { - return useInfiniteQuery({ - queryKey: ['fetchPurchaseTender'], - initialPageParam: 1, - queryFn: ({ pageParam }) => - fetchPurchaseTender({ - page: pageParam, - size: 10, - }), + return useInfiniteQuery({ + queryKey: ['fetchPurchaseTender'], + queryFn: ({ pageParam = 0 }) => + fetchPurchaseTender({ + page: pageParam, + size: 10, + }), + initialPageParam: 0, + getNextPageParam: (lastPage, allPages) => { + console.log('last page : ', lastPage) + console.log("all page : ", allPages) + const {totalCount } = lastPage; - getNextPageParam: (lastPage) => { - const { page, size, totalCount } = lastPage; + const totalPages = Math.ceil(totalCount / 10); + const nextPage = allPages.length; + return nextPage < totalPages ? nextPage : undefined; + }, - const totalPages = Math.ceil(totalCount / size); - - return page < totalPages ? page + 1 : undefined; - }, - - select: (data) => ({ - ...data, - result: data.pages.flatMap( - (page: any) => page?.data ?? [] - ), - }), - }); + select: (data) => ({ + ...data, + result: data.pages.flatMap( + (page: any) => page?.data ?? [] + ), + }), + }); }; @@ -107,16 +108,16 @@ export const useFetchTenderById = (tenderId: string) => { return useQuery({ queryKey: ['fetchTenderById', tenderId], queryFn: () => fetchTenderById(tenderId) - + }); } export const useProceedToBid = (tenderId?: string) => { - return useQuery({ - queryKey: ['proceedToBid', tenderId], - queryFn: () => proceedToBid(tenderId as string), - enabled: false, // 👈 manual trigger - }); + return useQuery({ + queryKey: ['proceedToBid', tenderId], + queryFn: () => proceedToBid(tenderId as string), + enabled: false, // 👈 manual trigger + }); }; From fa8303fb89dbf9b5c0880250a792c42c5923101e Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Fri, 9 Jan 2026 15:34:10 +0530 Subject: [PATCH 2/4] stuctured envelopa and envelopb integration --- package-lock.json | 171 ++++++++++++++++++ package.json | 1 + src/Constant/Color.tsx | 1 + .../Tender/tenderBidding/TenderBidding.tsx | 121 +++++-------- src/Services/BBPS/Hooks.ts | 29 ++- src/Services/BBPS/apis.ts | 15 +- 6 files changed, 263 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8292e86..91c64a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@react-native-community/blur": "^4.4.1", "@react-native-documents/picker": "^11.0.3", "@react-native-masked-view/masked-view": "^0.3.2", + "@react-native-vector-icons/fontisto": "^12.4.0", "@react-navigation/bottom-tabs": "^7.9.0", "@react-navigation/native": "^7.1.26", "@react-navigation/stack": "^7.6.13", @@ -3034,6 +3035,132 @@ "react-native": ">=0.57" } }, + "node_modules/@react-native-vector-icons/common": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@react-native-vector-icons/common/-/common-12.4.0.tgz", + "integrity": "sha512-t9W0q+AW7WH1Oj5aEg7wGNXDLZJb5sIVkAWo5qtad3PcbBADqoCdikRK/ToLK+xlB0TxjcuL0T74ogudMkYGeA==", + "license": "MIT", + "dependencies": { + "find-up": "^7.0.0", + "picocolors": "^1.1.1", + "plist": "^3.1.0" + }, + "bin": { + "rnvi-update-plist": "lib/commonjs/scripts/updatePlist.js" + }, + "engines": { + "node": ">=20.19.0 <21.0.0 || >=22.0.0" + }, + "peerDependencies": { + "@react-native-vector-icons/get-image": "^12.3.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@react-native-vector-icons/get-image": { + "optional": true + } + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@react-native-vector-icons/common/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-vector-icons/fontisto": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@react-native-vector-icons/fontisto/-/fontisto-12.4.0.tgz", + "integrity": "sha512-0XFOXDTV03Lvz7d0LmzNtvt7BgAupmUcv4HzVdtSccQ9Ak4lmLeBnO6kbP1v4iqcrsATR1xPrhQxTWWIJ90oFQ==", + "license": "MIT", + "dependencies": { + "@react-native-vector-icons/common": "^12.4.0" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/@react-native/assets-registry": { "version": "0.79.0", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.79.0.tgz", @@ -4377,6 +4504,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -11176,6 +11312,20 @@ "node": ">=8" } }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -13493,6 +13643,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -13841,6 +14003,15 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 0b27beb..3c534f4 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@react-native-community/blur": "^4.4.1", "@react-native-documents/picker": "^11.0.3", "@react-native-masked-view/masked-view": "^0.3.2", + "@react-native-vector-icons/fontisto": "^12.4.0", "@react-navigation/bottom-tabs": "^7.9.0", "@react-navigation/native": "^7.1.26", "@react-navigation/stack": "^7.6.13", diff --git a/src/Constant/Color.tsx b/src/Constant/Color.tsx index 7f2a093..a936d45 100644 --- a/src/Constant/Color.tsx +++ b/src/Constant/Color.tsx @@ -7,6 +7,7 @@ const colors = { // Secondary (Warm contrast) secondary: '#1B4B66', // Deep blue for balance secondaryLight: '#639599', // Muted blue + secondaryHighLight: '#e1eff2', // Very light blue (backgrounds) // Status colors success: '#22C55E', // Green diff --git a/src/Screens/Tender/tenderBidding/TenderBidding.tsx b/src/Screens/Tender/tenderBidding/TenderBidding.tsx index 53b7ec3..d0f86aa 100644 --- a/src/Screens/Tender/tenderBidding/TenderBidding.tsx +++ b/src/Screens/Tender/tenderBidding/TenderBidding.tsx @@ -15,6 +15,10 @@ import MyInput from '../../../../src/Component/MyInput'; import { pick, types } from '@react-native-documents/picker'; import { InsideHeader } from '../../../Component/Index'; import colors from '../../../Constant/Color'; +import { SUBMIT_ENVELOPE_A, SUBMIT_ENVELOPE_B } from '../../../Services/BBPS/ApiUrls'; +import axios from 'axios'; +import { Fontisto } from '@react-native-vector-icons/fontisto'; +import { useSubmitEnvelopeA, useSubmitEnvelopeB } from '../../../Services/BBPS/Hooks'; type EnvelopeType = 'A' | 'B' | 'C'; type EnvelopeFormState = { @@ -33,27 +37,18 @@ interface InfoRowProps { value: string; } -interface TenderBiddingData { - data?: { - tenderNumber?: string; - nitNo?: string; - emdInFig?: string; - tenderRebid?: boolean; - showEA?: boolean; - showEB?: boolean; - showEC?: boolean; - tenderEnvelopeAList?: any[]; - tenderEnvelopeBList?: any[]; - tenderEnvelopeCList?: any[]; - }; -} - const TenderBidding = () => { - const route = useRoute(); + const route = useRoute(); const navigation = useNavigation(); + const { mutate: submitEnvelopeA, isPending } = useSubmitEnvelopeA(() => { + navigation.goBack() + }) + const { mutate: submitEnvelopeB, isPending: isPendingB } = useSubmitEnvelopeB(() => { + navigation.goBack() + }) const [bidData] = useState(route.params?.tenderData || null); - const tenderData = route.params?.bidData || null; + const tenderData: any= route.params?.bidData || null; const [activeEnvelope, setActiveEnvelope] = useState('A'); const [isLoading, setIsLoading] = useState(false); const [envelopForm, setEnvelopForm] = useState({ @@ -64,7 +59,7 @@ const TenderBidding = () => { const [loading, setLoading] = useState(false) const [loadingUpload, setLoadingUpload] = useState(false) const [check, setCheck] = useState(false) - + const InfoRow = ({ title, value }: InfoRowProps) => ( @@ -145,7 +140,7 @@ const TenderBidding = () => { activeEnvelope === envelopeType !== 'C' && !bidData?.[`envelope${envelopeType}SubmittStatus`]; - + // console.log("tender ana : ", tenderData) return ( @@ -255,8 +250,9 @@ const TenderBidding = () => { }; const buildEnvelopePayload = () => { + const list = - bidData?.[`tenderEnvelope${activeEnvelope}List`] || []; + tenderData?.[`tenderEnvelope${activeEnvelope}List`] || []; const formValues = envelopForm?.[activeEnvelope] || {}; // 🔹 NON-FILE FIELDS (labelType !== '3') @@ -306,17 +302,17 @@ const TenderBidding = () => { }; }); - return payload = { - deptId: bidData?.deptId, - tenderId: bidData?.tenderId, + const payload: any = { + deptId: tenderData?.deptId, + tenderId: tenderData?.tenderId, [`tenderEnvelope${activeEnvelope}NameId`]: - bidData?.[`tenderEnvelope${activeEnvelope}List`]?.[0]?.[ + tenderData?.[`tenderEnvelope${activeEnvelope}List`]?.[0]?.[ `tenderEnvelope${activeEnvelope}NameId` ], [`envelope${activeEnvelope}TemplateName`]: - bidData?.[`tenderEnvelope${activeEnvelope}List`]?.[0]?.[ + tenderData?.[`tenderEnvelope${activeEnvelope}List`]?.[0]?.[ `envelope${activeEnvelope}TemplateName` ], @@ -324,10 +320,11 @@ const TenderBidding = () => { ? fileData : saveData, }; + // console.log("payload : ", payload) + return payload; }; - const validateEnvelope = () => { const list = bidData?.[`tenderEnvelope${activeEnvelope}List`] || []; const formValues = envelopForm[activeEnvelope]; @@ -351,57 +348,35 @@ const TenderBidding = () => { return !missing; }; - - const handleSubmitEnvelopeA = async () => { + const handleSubmitEnvelopeA = () => { if (!validateEnvelope()) { - Alert.alert('Validation Error', 'Please fill all mandatory fields'); - return; + Alert.alert('Validation Error', 'Please fill all mandatory fields') + return } - const payload = buildEnvelopePayload(); - console.log('Envelope A Payload:', payload); - setLoading(true) + const payload = buildEnvelopePayload() + console.log('Envelope A Payload:', payload) + if (envelopForm?.[activeEnvelope]?.[3]) { handleSubmitEnvelopeFile() } - try { - const res = await apiCallForPostWithToken(SUBMIT_ENVELOPE_A, payload) - console.log("res A envelop : ", res) - ToastAndroid.show(res.message, ToastAndroid.SHORT) - - - navigation.goBack() - } catch (error) { - console.log("error A envelop submit : ", error) - } finally { - setLoading(false) - } - }; - - - const handleSubmitEnvelopeB = async () => { + submitEnvelopeA(payload) + } + const handleSubmitEnvelopeB = () => { if (!validateEnvelope()) { - Alert.alert('Validation Error', 'Please fill all mandatory fields'); - return; + Alert.alert('Validation Error', 'Please fill all mandatory fields') + return } - setLoading(true) - const payload = buildEnvelopePayload(); - console.log('Envelope B Payload:', payload); + + const payload = buildEnvelopePayload() + console.log('Envelope A Payload:', payload) + if (envelopForm?.[activeEnvelope]?.[3]) { handleSubmitEnvelopeFile() } - try { - const res = await apiCallForPostWithToken(SUBMIT_ENVELOPE_B, payload) - console.log("res B envelop : ", res) - ToastAndroid.show(res.message, ToastAndroid.SHORT) - navigation.goBack() - } catch (error) { - console.log("error B envelop submit : ", error) - } finally { - setLoading(false) - } + submitEnvelopeB(payload) } const handleSubmitEnvelopeFile = async () => { @@ -422,7 +397,7 @@ const TenderBidding = () => { console.log("reuestDto for fil doc : ", formData) // return - const res = await apiCallForPostWithToken(activeEnvelope === 'B' ? SUBMIT_ENVELOPE_B : SUBMIT_ENVELOPE_A, payload) + const res = await axios.post(activeEnvelope === 'B' ? SUBMIT_ENVELOPE_B : SUBMIT_ENVELOPE_A, payload) console.log(`res file ${activeEnvelope} Payload:`, res) ToastAndroid.show(res.message, ToastAndroid.SHORT) // navigation.goBack() @@ -508,13 +483,13 @@ const TenderBidding = () => { renderItem={({ item }) => renderEnvelopeItem({ item, envelopeType: activeEnvelope })} scrollEnabled={false} /> - {/* + setCheck(!check)}> {check ? : } Check First Terms&Condition - */} + )} @@ -566,7 +541,7 @@ const styles = StyleSheet.create({ alignItems: 'center', }, card: { - backgroundColor: '#fff', + backgroundColor: colors.primaryHighlight, borderRadius: 12, padding: 16, marginBottom: 16, @@ -607,7 +582,7 @@ const styles = StyleSheet.create({ flexWrap: 'wrap', }, envelopeButton: { - backgroundColor: '#EEF2FF', + backgroundColor: colors.secondaryHighLight, paddingVertical: 10, paddingHorizontal: 14, borderRadius: 8, @@ -615,7 +590,7 @@ const styles = StyleSheet.create({ alignItems: 'center', }, envelopeButtonText: { - color: '#3F51B5', + color: colors.primary, fontWeight: '600', fontSize: 14, }, @@ -625,7 +600,7 @@ const styles = StyleSheet.create({ borderRadius: 10, padding: 12, marginBottom: 12, - backgroundColor: '#f9f9f9', + backgroundColor: colors.primaryHighlight, flexDirection: 'row', justifyContent: 'space-between' }, @@ -635,7 +610,7 @@ const styles = StyleSheet.create({ marginVertical: 20, }, primaryButton: { - backgroundColor: '#3F51B5', + backgroundColor: colors.primary, paddingVertical: 14, paddingHorizontal: 28, borderRadius: 10, @@ -657,7 +632,7 @@ const styles = StyleSheet.create({ alignItems: 'center', }, secondaryButtonText: { - color: '#3F51B5', + color: colors.primary, fontWeight: '600', fontSize: 15, }, diff --git a/src/Services/BBPS/Hooks.ts b/src/Services/BBPS/Hooks.ts index 2d3c1c9..21f1e6e 100644 --- a/src/Services/BBPS/Hooks.ts +++ b/src/Services/BBPS/Hooks.ts @@ -1,5 +1,6 @@ import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'; -import { fetchDashboard, fetchLiveAuction, fetchLiveTender, fetchPurchaseAuction, fetchPurchaseTender, offlineAuctionPurchase, userLogin, offlineTenderPurchase, fetchTenderById, proceedToBid } from './apis'; +import { fetchDashboard, fetchLiveAuction, fetchLiveTender, fetchPurchaseAuction, fetchPurchaseTender, offlineAuctionPurchase, userLogin, offlineTenderPurchase, fetchTenderById, proceedToBid, submitEnvelopeA, submitEnvelopeB } from './apis'; +import { ToastAndroid } from 'react-native'; // User @@ -121,3 +122,29 @@ export const useProceedToBid = (tenderId?: string) => { }; +export const useSubmitEnvelopeA = (onSuccessCallback?: () => void) => { + return useMutation({ + mutationFn: submitEnvelopeA, + onSuccess: (data) => { + ToastAndroid.show(data?.message || 'Submitted successfully', ToastAndroid.SHORT) + onSuccessCallback?.() + }, + onError: (error: any) => { + console.log('Envelope A submit error:', error) + ToastAndroid.show('Something went wrong', ToastAndroid.SHORT) + }, + }) +} +export const useSubmitEnvelopeB = (onSuccessCallback?: () => void) => { + return useMutation({ + mutationFn: submitEnvelopeB, + onSuccess: (data) => { + ToastAndroid.show(data?.message || 'Submitted successfully', ToastAndroid.SHORT) + onSuccessCallback?.() + }, + onError: (error: any) => { + console.log('Envelope A submit error:', error) + ToastAndroid.show('Something went wrong', ToastAndroid.SHORT) + }, + }) +} \ No newline at end of file diff --git a/src/Services/BBPS/apis.ts b/src/Services/BBPS/apis.ts index d952b04..cf22cde 100644 --- a/src/Services/BBPS/apis.ts +++ b/src/Services/BBPS/apis.ts @@ -1,5 +1,5 @@ import axios from "axios"; -import { DASHBOARD_COUNT, GET_MY_AUCTION, GET_MY_TENDER, GET_TENDER_DETAILS, LIVE_AUCTION, LIVE_TENDER, LOG_IN_URL, PROCEED_PURCHASE_AUCTION, PROCEED_TO_BID, PURCHASE_TENDER_OFFLINE, TENDER_LOGIN } from "./ApiUrls"; +import { DASHBOARD_COUNT, GET_MY_AUCTION, GET_MY_TENDER, GET_TENDER_DETAILS, LIVE_AUCTION, LIVE_TENDER, LOG_IN_URL, PROCEED_PURCHASE_AUCTION, PROCEED_TO_BID, PURCHASE_TENDER_OFFLINE, SUBMIT_ENVELOPE_A, SUBMIT_ENVELOPE_B, SUBMIT_ENVELOPE_FILE_A, SUBMIT_ENVELOPE_FILE_B, TENDER_LOGIN } from "./ApiUrls"; import { apiCall } from "../../Axios/Axios"; // User @@ -83,3 +83,16 @@ export const proceedToBid = async (tenderId: string): Promise => { ); return data; } + +export const submitEnvelopeA = async (payload: any) => { + const { data } = await apiCall('post', SUBMIT_ENVELOPE_A, payload) + return data +} +export const submitEnvelopeB = async (payload: any) => { + const { data } = await apiCall('post', SUBMIT_ENVELOPE_B, payload) + return data +} +export const submitEnvelopeFileB = async (payload: any) => { + const { data } = await apiCall('post', SUBMIT_ENVELOPE_FILE_B, payload) + return data +} \ No newline at end of file From d803a89baaaca626d6f3e895248110673a00e4ba Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Fri, 9 Jan 2026 18:31:43 +0530 Subject: [PATCH 3/4] stuctured envelopa and envelopb integration --- src/Screens/Tender/ProceedToBidDetail.tsx | 62 +++++------ .../Tender/tenderBidding/TenderBidding.tsx | 101 ++++++++++-------- src/Services/BBPS/Hooks.ts | 36 +++---- src/Services/BBPS/apis.ts | 42 +++++++- 4 files changed, 139 insertions(+), 102 deletions(-) diff --git a/src/Screens/Tender/ProceedToBidDetail.tsx b/src/Screens/Tender/ProceedToBidDetail.tsx index 086ef56..f981123 100644 --- a/src/Screens/Tender/ProceedToBidDetail.tsx +++ b/src/Screens/Tender/ProceedToBidDetail.tsx @@ -107,27 +107,27 @@ const ProceedToBidDetail = () => { - {tenderData.tenderNumber} - ID: {tenderData.tenderId} + {tenderData?.tenderNumber} + ID: {tenderData?.tenderId} - + - {tenderData.biddingStatus ? "Active" : "Inactive"} + {tenderData?.biddingStatus ? "Active" : "Inactive"} - {tenderData.nameofWork} + {tenderData?.nameofWork} NIT No. - {tenderData.nitNo} + {tenderData?.nitNo} EMD Amount - ₹{tenderData.emdInFig} + ₹{tenderData?.emdInFig} @@ -136,19 +136,19 @@ const ProceedToBidDetail = () => { Envelope Submission Status - - - + + + {/* Envelope Logs */} - {tenderData.envelopeA_Logs && ( + {tenderData?.envelopeA_Logs && ( Submission Logs - - - + + + )} @@ -156,11 +156,11 @@ const ProceedToBidDetail = () => { Tender Details - - - - - + + + + + @@ -170,11 +170,11 @@ const ProceedToBidDetail = () => { Starts On: - {formatDate(tenderData.submittedStartDate)} + {formatDate(tenderData?.submittedStartDate)} Ends On: - {formatDate(tenderData.submittedEndDate)} + {formatDate(tenderData?.submittedEndDate)} @@ -183,12 +183,12 @@ const ProceedToBidDetail = () => { Available Features - - - - - - + + + + + + @@ -199,18 +199,18 @@ const ProceedToBidDetail = () => { All Envelopes Submitted: - {tenderData.envelopeASubmittStatus && tenderData.envelopeBSubmittStatus && tenderData.envelopeCSubmittStatus + {tenderData?.envelopeASubmittStatus && tenderData?.envelopeBSubmittStatus && tenderData?.envelopeCSubmittStatus ? "COMPLETED" : "PENDING"} Bidding Status: - {tenderData.biddingStatus ? "ACTIVE" : "CLOSED"} + { color: tenderData?.biddingStatus ? colors.success : colors.error }]}> + {tenderData?.biddingStatus ? "ACTIVE" : "CLOSED"} diff --git a/src/Screens/Tender/tenderBidding/TenderBidding.tsx b/src/Screens/Tender/tenderBidding/TenderBidding.tsx index d0f86aa..2ac6375 100644 --- a/src/Screens/Tender/tenderBidding/TenderBidding.tsx +++ b/src/Screens/Tender/tenderBidding/TenderBidding.tsx @@ -15,10 +15,11 @@ import MyInput from '../../../../src/Component/MyInput'; import { pick, types } from '@react-native-documents/picker'; import { InsideHeader } from '../../../Component/Index'; import colors from '../../../Constant/Color'; -import { SUBMIT_ENVELOPE_A, SUBMIT_ENVELOPE_B } from '../../../Services/BBPS/ApiUrls'; +import { SUBMIT_ENVELOPE_A, SUBMIT_ENVELOPE_B, SUBMIT_ENVELOPE_FILE_A, SUBMIT_ENVELOPE_FILE_B } from '../../../Services/BBPS/ApiUrls'; import axios from 'axios'; import { Fontisto } from '@react-native-vector-icons/fontisto'; -import { useSubmitEnvelopeA, useSubmitEnvelopeB } from '../../../Services/BBPS/Hooks'; +import { useSubmitEnvelopeA, useSubmitEnvelopeB, useUploadEnvelopeFile } from '../../../Services/BBPS/Hooks'; +import { apiCall } from '../../../Axios/Axios'; type EnvelopeType = 'A' | 'B' | 'C'; type EnvelopeFormState = { @@ -40,16 +41,14 @@ interface InfoRowProps { const TenderBidding = () => { const route = useRoute(); const navigation = useNavigation(); - const { mutate: submitEnvelopeA, isPending } = useSubmitEnvelopeA(() => { - navigation.goBack() - }) - const { mutate: submitEnvelopeB, isPending: isPendingB } = useSubmitEnvelopeB(() => { - navigation.goBack() - }) + const { mutate: submitEnvelopeA, isPending } = useSubmitEnvelopeA() + const { mutate: submitEnvelopeB, isPending: isPendingB } = useSubmitEnvelopeB() + const { mutate: uploadEnvelopeFile, isPending: uploadLoading } = + useUploadEnvelopeFile() const [bidData] = useState(route.params?.tenderData || null); - const tenderData: any= route.params?.bidData || null; - const [activeEnvelope, setActiveEnvelope] = useState('A'); + const tenderData: any = route.params?.bidData || null; + const [activeEnvelope, setActiveEnvelope] = useState('A'); const [isLoading, setIsLoading] = useState(false); const [envelopForm, setEnvelopForm] = useState({ A: {}, @@ -326,7 +325,7 @@ const TenderBidding = () => { }; const validateEnvelope = () => { - const list = bidData?.[`tenderEnvelope${activeEnvelope}List`] || []; + const list = tenderData?.[`tenderEnvelope${activeEnvelope}List`] || []; const formValues = envelopForm[activeEnvelope]; const missing = list.some((item: any) => { @@ -348,35 +347,59 @@ const TenderBidding = () => { return !missing; }; - const handleSubmitEnvelopeA = () => { + + const handleSubmitEnvelopeA = async () => { if (!validateEnvelope()) { - Alert.alert('Validation Error', 'Please fill all mandatory fields') - return + Alert.alert('Validation Error', 'Please fill all mandatory fields'); + return; } - const payload = buildEnvelopePayload() - console.log('Envelope A Payload:', payload) + const payload = buildEnvelopePayload(); + console.log('Envelope A Payload:', payload); + setLoading(true) + if (envelopForm?.[activeEnvelope]?.[3]) { + handleSubmitEnvelopeFile() + } + try { + + const res = await apiCall('post',SUBMIT_ENVELOPE_A, payload) + console.log("res A envelop : ", res) + ToastAndroid.show(res.message, ToastAndroid.SHORT) + + + navigation.goBack() + } catch (error) { + console.log("error A envelop submit : ", error) + } finally { + setLoading(false) + } + }; + + + const handleSubmitEnvelopeB = async () => { + if (!validateEnvelope()) { + Alert.alert('Validation Error', 'Please fill all mandatory fields'); + return; + } + setLoading(true) + const payload = buildEnvelopePayload(); + console.log('Envelope B Payload:', payload); + if (envelopForm?.[activeEnvelope]?.[3]) { handleSubmitEnvelopeFile() } + try { + const res = await apiCall('post', SUBMIT_ENVELOPE_B, payload) + console.log("res B envelop : ", res) - submitEnvelopeA(payload) - } - const handleSubmitEnvelopeB = () => { - if (!validateEnvelope()) { - Alert.alert('Validation Error', 'Please fill all mandatory fields') - return + ToastAndroid.show(res.message, ToastAndroid.SHORT) + navigation.goBack() + } catch (error) { + console.log("error B envelop submit : ", error) + } finally { + setLoading(false) } - - const payload = buildEnvelopePayload() - console.log('Envelope A Payload:', payload) - - if (envelopForm?.[activeEnvelope]?.[3]) { - handleSubmitEnvelopeFile() - } - - submitEnvelopeB(payload) } const handleSubmitEnvelopeFile = async () => { @@ -396,8 +419,7 @@ const TenderBidding = () => { console.log("reuestDto for fil doc : ", formData) - // return - const res = await axios.post(activeEnvelope === 'B' ? SUBMIT_ENVELOPE_B : SUBMIT_ENVELOPE_A, payload) + const res = await apiCall('post', activeEnvelope === 'B' ? SUBMIT_ENVELOPE_FILE_B : SUBMIT_ENVELOPE_FILE_A, payload) console.log(`res file ${activeEnvelope} Payload:`, res) ToastAndroid.show(res.message, ToastAndroid.SHORT) // navigation.goBack() @@ -408,18 +430,8 @@ const TenderBidding = () => { } } - if (isLoading) { - return ( - <> - - Loading... - - - ); - } - // console.log("route for date : ", bidData) - // console.log("bid envelop : ", tenderData) + return ( @@ -492,6 +504,7 @@ const TenderBidding = () => { )} + {hasEnvelopes() ? ( { getNextPageParam: (lastPage, allPages) => { console.log('last page : ', lastPage) console.log("all page : ", allPages) - const {totalCount } = lastPage; + const { totalCount } = lastPage; const totalPages = Math.ceil(totalCount / 10); const nextPage = allPages.length; @@ -122,29 +122,17 @@ export const useProceedToBid = (tenderId?: string) => { }; -export const useSubmitEnvelopeA = (onSuccessCallback?: () => void) => { - return useMutation({ +export const useSubmitEnvelopeA = () => + useMutation({ mutationFn: submitEnvelopeA, - onSuccess: (data) => { - ToastAndroid.show(data?.message || 'Submitted successfully', ToastAndroid.SHORT) - onSuccessCallback?.() - }, - onError: (error: any) => { - console.log('Envelope A submit error:', error) - ToastAndroid.show('Something went wrong', ToastAndroid.SHORT) - }, }) -} -export const useSubmitEnvelopeB = (onSuccessCallback?: () => void) => { - return useMutation({ + +export const useSubmitEnvelopeB = () => + useMutation({ mutationFn: submitEnvelopeB, - onSuccess: (data) => { - ToastAndroid.show(data?.message || 'Submitted successfully', ToastAndroid.SHORT) - onSuccessCallback?.() - }, - onError: (error: any) => { - console.log('Envelope A submit error:', error) - ToastAndroid.show('Something went wrong', ToastAndroid.SHORT) - }, }) -} \ No newline at end of file + +export const useUploadEnvelopeFile = () => + useMutation({ + mutationFn: uploadEnvelopeFile, + }) diff --git a/src/Services/BBPS/apis.ts b/src/Services/BBPS/apis.ts index cf22cde..c8ee2fb 100644 --- a/src/Services/BBPS/apis.ts +++ b/src/Services/BBPS/apis.ts @@ -3,7 +3,15 @@ import { DASHBOARD_COUNT, GET_MY_AUCTION, GET_MY_TENDER, GET_TENDER_DETAILS, LIV import { apiCall } from "../../Axios/Axios"; // User - +export type UploadArgs = { + activeEnvelope: 'A' | 'B' + file: { + uri: string + name: string + type: string + } + payload: any +} export const userLogin = async (payload: { emailAdd: string, password: string }): Promise => { try { // const response = await axios.post(LOG_IN_URL, { ...payload, divice: "mobileApp" }); @@ -85,14 +93,42 @@ export const proceedToBid = async (tenderId: string): Promise => { } export const submitEnvelopeA = async (payload: any) => { + console.log('SUBMIT ENVELOPE A API CALLED', payload) const { data } = await apiCall('post', SUBMIT_ENVELOPE_A, payload) + console.log("data : ", data) return data } export const submitEnvelopeB = async (payload: any) => { + console.log('SUBMIT ENVELOPE B API CALLED', payload) const { data } = await apiCall('post', SUBMIT_ENVELOPE_B, payload) + console.log("data : ", data) return data } -export const submitEnvelopeFileB = async (payload: any) => { - const { data } = await apiCall('post', SUBMIT_ENVELOPE_FILE_B, payload) + + +export const uploadEnvelopeFile = async ({ + activeEnvelope, + file, + payload, +}: UploadArgs) => { + const formData = new FormData() + + formData.append('files', { + uri: file.uri, + name: file.name, + type: file.type, + } as any) + + formData.append('requestDto', JSON.stringify(payload)) + + const url = + activeEnvelope === 'B' ? SUBMIT_ENVELOPE_FILE_B : SUBMIT_ENVELOPE_FILE_A + + const data = await apiCall('post', url, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }) + return data } \ No newline at end of file From f4433d8e926073ed4536a3ed1f3e1874c77288ef Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Mon, 12 Jan 2026 15:23:28 +0530 Subject: [PATCH 4/4] e-tender --- src/Screens/Tender/tenderBidding/TenderBidding.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Screens/Tender/tenderBidding/TenderBidding.tsx b/src/Screens/Tender/tenderBidding/TenderBidding.tsx index 2ac6375..efd1b74 100644 --- a/src/Screens/Tender/tenderBidding/TenderBidding.tsx +++ b/src/Screens/Tender/tenderBidding/TenderBidding.tsx @@ -16,9 +16,7 @@ import { pick, types } from '@react-native-documents/picker'; import { InsideHeader } from '../../../Component/Index'; import colors from '../../../Constant/Color'; import { SUBMIT_ENVELOPE_A, SUBMIT_ENVELOPE_B, SUBMIT_ENVELOPE_FILE_A, SUBMIT_ENVELOPE_FILE_B } from '../../../Services/BBPS/ApiUrls'; -import axios from 'axios'; import { Fontisto } from '@react-native-vector-icons/fontisto'; -import { useSubmitEnvelopeA, useSubmitEnvelopeB, useUploadEnvelopeFile } from '../../../Services/BBPS/Hooks'; import { apiCall } from '../../../Axios/Axios'; type EnvelopeType = 'A' | 'B' | 'C'; @@ -41,10 +39,6 @@ interface InfoRowProps { const TenderBidding = () => { const route = useRoute(); const navigation = useNavigation(); - const { mutate: submitEnvelopeA, isPending } = useSubmitEnvelopeA() - const { mutate: submitEnvelopeB, isPending: isPendingB } = useSubmitEnvelopeB() - const { mutate: uploadEnvelopeFile, isPending: uploadLoading } = - useUploadEnvelopeFile() const [bidData] = useState(route.params?.tenderData || null); const tenderData: any = route.params?.bidData || null; @@ -359,6 +353,7 @@ const TenderBidding = () => { setLoading(true) if (envelopForm?.[activeEnvelope]?.[3]) { handleSubmitEnvelopeFile() + return } try { @@ -388,6 +383,7 @@ const TenderBidding = () => { if (envelopForm?.[activeEnvelope]?.[3]) { handleSubmitEnvelopeFile() + return } try { const res = await apiCall('post', SUBMIT_ENVELOPE_B, payload)