This commit is contained in:
Jaanu423
2026-01-09 10:28:25 +05:30
parent 860d70d86e
commit 0e93334941
12 changed files with 129 additions and 169 deletions
-3
View File
@@ -13,20 +13,17 @@ export const apiCall = async <R, D = {}>(
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;
+1 -3
View File
@@ -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
+1
View File
@@ -40,6 +40,7 @@ export default function MainStack() {
<Stack.Screen name={NavigationString.ProceedToPurTender} component={Screens.ProceedToPurTender} options={option} />
<Stack.Screen name={NavigationString.TenderBidding} component={Screens.TenderBidding} options={option} />
<Stack.Screen name={NavigationString.ProceedToBidDetail} component={Screens.ProceedToBidDetail} options={option} />
<Stack.Screen name={NavigationString.LiveTenderDetail} component={Screens.LiveTenderDetail} options={option} />
</Stack.Navigator>
);
+2 -2
View File
@@ -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]
+18
View File
@@ -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<any>();
const { tender } = route.params;
console.log("live tender details : ", tender)
return (
<View>
<Text>LiveTenderDetail</Text>
</View>
)
}
export default LiveTenderDetail
const styles = StyleSheet.create({})
+7 -4
View File
@@ -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<LiveTenderTileProps> = ({
data,
@@ -16,10 +17,12 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
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 (
<View style={styles.cardWrapper}>
{/* Status Tag */}
@@ -33,7 +36,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
<TouchableOpacity
style={styles.container}
activeOpacity={0.9}
onPress={() => setShowDetail(true)}
onPress={() => navigation.navigate('LiveTenderDetail', data)}
>
{/* Header */}
<View style={styles.header}>
@@ -72,7 +75,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
{/* Action Bar */}
<View style={styles.actionBar}>
<TouchableOpacity style={styles.iconBtn} onPress={() => setShowDetail(true)}>
<TouchableOpacity style={styles.iconBtn} onPress={onDetailsPress}>
<Info size={18} color={colors.primary} />
<Text style={styles.iconBtnText}>Details</Text>
</TouchableOpacity>
@@ -104,7 +107,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
</View>
{/* Tender Detail Modal */}
<TenderFullDetail visible={showDetail} data={data} onClose={() => setShowDetail(false)} />
{/* <TenderFullDetail visible={showDetail} data={data} onClose={() => setShowDetail(false)} /> */}
</TouchableOpacity>
</View>
);
+32 -97
View File
@@ -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<any>()
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<any>()
// 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 = () => {
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>{title}</Text>
<View style={[styles.envelopeBadge, { backgroundColor: colors.primary }]}>
<Text style={styles.envelopeBadgeText}>{log.envelope}</Text>
<Text style={styles.envelopeBadgeText}>{log?.envelope}</Text>
</View>
</View>
<View style={styles.logDetailRow}>
<Text style={styles.label}>Activity:</Text>
<Text style={styles.value}>{log.activity}</Text>
<Text style={styles.value}>{log?.activity}</Text>
</View>
<View style={styles.logDetailRow}>
<Text style={styles.label}>Date & Time:</Text>
<Text style={styles.value}>{log.dateTime}</Text>
<Text style={styles.value}>{log?.dateTime}</Text>
</View>
<View style={styles.logDetailRow}>
<Text style={styles.label}>System Info:</Text>
<Text style={styles.value}>{log.osName} / {log.browserName}</Text>
<Text style={styles.value}>{log?.osName} / {log?.browserName}</Text>
</View>
<View style={styles.logDetailRow}>
<Text style={styles.label}>IP Address:</Text>
<Text style={styles.value}>{log.ipAddress}</Text>
<Text style={styles.value}>{log?.ipAddress}</Text>
</View>
<View style={styles.logDetailRow}>
<Text style={styles.label}>Status Message:</Text>
<Text style={[styles.value, styles.successText]}>{log.logMessage}</Text>
<Text style={[styles.value, styles.successText]}>{log?.logMessage}</Text>
</View>
{log.headingMsg && (
{log?.headingMsg && (
<View style={styles.logDetailRow}>
<Text style={styles.label}>Heading:</Text>
<Text style={styles.value}>{log.headingMsg}</Text>
<Text style={styles.value}>{log?.headingMsg}</Text>
</View>
)}
</View>
@@ -278,23 +217,19 @@ const ProceedToBidDetail = () => {
<View style={styles.footerSpace} />
</ScrollView>
<View style={styles.footer}>
<TouchableOpacity style={styles.proceedButton} onPress={() => {
navigation.navigate('TenderBidding', { tenderData: tenderData });
}}>
<Text style={styles.proceedButtonText}>Proceed to Bid</Text>
</TouchableOpacity>
{
// tenderData?.proceedtoBid && !tenderData?.viewBid && tenderData?.biddingStatus && tenderData?.bidWithdrawStatus === false ? (
// <TouchableOpacity style={styles.proceedButton} onPress={() => {
// navigation.navigate('TenderBidding', { tenderData: tenderData });
// }}>
// <Text style={styles.proceedButtonText}>Proceed to Bid</Text>
// </TouchableOpacity>
// ) : <Text style={styles.footerText}>One time bidding is completed</Text>
} </View>
<View style={styles.footer}>
{
tenderData?.proceedtoBid && !tenderData?.viewBid && tenderData?.biddingStatus && tenderData?.bidWithdrawStatus === false ? (
<TouchableOpacity style={styles.proceedButton} onPress={handleStartBidding}>
<Text style={styles.proceedButtonText}>Start Bidding</Text>
</TouchableOpacity>
) : <Text style={styles.footerText}>One time bidding is completed</Text>
} </View>
</View>
)
@@ -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);
+22 -20
View File
@@ -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 (
<Animated.View
entering={FadeInUp.duration(400)}
@@ -105,11 +107,11 @@ const PurchaseTenderTile = ({
setShowDetail(true)
}}>
<Text style={styles.dateText}>
<Text style={styles.dateLabel}>Purchase Ends: </Text>
<Text style={styles.dateLabel}>Bid Ends: </Text>
{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')}
</Text>
</TouchableOpacity>
@@ -121,7 +123,7 @@ const PurchaseTenderTile = ({
{isLive ? (
<CountdownTimer
endDate={
item?.tenderKeyDatesAmendment?.tenderPurchaseDate?.endDateTime
item?.keydates?.bidSubmissionDate?.endDateTime
}
/>
) : (
@@ -133,7 +135,7 @@ const PurchaseTenderTile = ({
disabled={!isLive}
onPress={() => {
if (isLive) {
navigation.navigate('ProceedToBidDetail', { tender });
navigation.navigate('ProceedToBidDetail', { tender });
}
}}
activeOpacity={0.85}
@@ -53,6 +53,7 @@ const TenderBidding = () => {
const navigation = useNavigation();
const [bidData] = useState<any>(route.params?.tenderData || null);
const tenderData = route.params?.bidData || null;
const [activeEnvelope, setActiveEnvelope] = useState<EnvelopeType | null>('A');
const [isLoading, setIsLoading] = useState(false);
const [envelopForm, setEnvelopForm] = useState<EnvelopeFormState>({
@@ -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 (
<View style={styles.container}>
<InsideHeader title="Tender Bidding Start" showArrow />
@@ -467,20 +469,19 @@ const TenderBidding = () => {
<View style={styles.card}>
<Text style={styles.sectionTitle}>Bid Envelopes</Text>
<View style={styles.envelopeRow}>
{bidData?.showEA && (
{tenderData?.showEA && (
<EnvelopeButton
title="Envelope A"
envelopeType="A"
onPress={() => setActiveEnvelope('A')}
/>
)}
{bidData?.showEB && (
{tenderData?.showEB && (
<EnvelopeButton
title="Envelope B"
envelopeType="B"
onPress={() => {
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 && (
<EnvelopeButton
title="Envelope C"
envelopeType="C"
@@ -498,11 +499,11 @@ const TenderBidding = () => {
</View>
</View>
{/* Envelope A List */}
{bidData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && (
{tenderData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && (
<View style={styles.card}>
<Text style={styles.sectionTitle}>Envelope {activeEnvelope} Details</Text>
<FlatList
data={bidData?.[`tenderEnvelope${activeEnvelope}List`]}
data={tenderData?.[`tenderEnvelope${activeEnvelope}List`]}
keyExtractor={(item) => item?.[`tenderEnvelope${activeEnvelope}SequnceId`]?.toString()}
renderItem={({ item }) => renderEnvelopeItem({ item, envelopeType: activeEnvelope })}
scrollEnabled={false}
+3 -1
View File
@@ -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
+29 -28
View File
@@ -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
});
};