eender
This commit is contained in:
@@ -13,20 +13,17 @@ export const apiCall = async <R, D = {}>(
|
|||||||
try {
|
try {
|
||||||
const token: any = store.getState().token.token;
|
const token: any = store.getState().token.token;
|
||||||
|
|
||||||
console.log("token : ", token)
|
|
||||||
const response = await axios({
|
const response = await axios({
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
data,
|
data,
|
||||||
params,
|
params,
|
||||||
// withCredentials: true,
|
// withCredentials: true,
|
||||||
baseURL: Variable.Main_Base,
|
|
||||||
headers: {
|
headers: {
|
||||||
Authentication: `Bearer ${token?.token}`,
|
Authentication: `Bearer ${token?.token}`,
|
||||||
'Content-Type': contentType || 'application/json',
|
'Content-Type': contentType || 'application/json',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
console.log("url : ", url)
|
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
const errorMessage = error?.response?.data?.error;
|
const errorMessage = error?.response?.data?.error;
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
import ProceedToBidDetail from "../Screens/Tender/ProceedToBidDetail"
|
|
||||||
import TenderBidding from "../Screens/Tender/tenderBidding/TenderBidding"
|
|
||||||
|
|
||||||
const NavigationString = {
|
const NavigationString = {
|
||||||
Login: 'Login',
|
Login: 'Login',
|
||||||
Splash: 'Splash',
|
Splash: 'Splash',
|
||||||
@@ -17,5 +14,6 @@ const NavigationString = {
|
|||||||
ProceedToPurTender:'ProceedToPurTender',
|
ProceedToPurTender:'ProceedToPurTender',
|
||||||
TenderBidding:'TenderBidding',
|
TenderBidding:'TenderBidding',
|
||||||
ProceedToBidDetail:'ProceedToBidDetail',
|
ProceedToBidDetail:'ProceedToBidDetail',
|
||||||
|
LiveTenderDetail:'LiveTenderDetail',
|
||||||
}
|
}
|
||||||
export default NavigationString
|
export default NavigationString
|
||||||
@@ -40,6 +40,7 @@ export default function MainStack() {
|
|||||||
<Stack.Screen name={NavigationString.ProceedToPurTender} component={Screens.ProceedToPurTender} options={option} />
|
<Stack.Screen name={NavigationString.ProceedToPurTender} component={Screens.ProceedToPurTender} options={option} />
|
||||||
<Stack.Screen name={NavigationString.TenderBidding} component={Screens.TenderBidding} 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.ProceedToBidDetail} component={Screens.ProceedToBidDetail} options={option} />
|
||||||
|
<Stack.Screen name={NavigationString.LiveTenderDetail} component={Screens.LiveTenderDetail} options={option} />
|
||||||
|
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ const LiveTender = () => {
|
|||||||
tenderOfWork={item.departmentName}
|
tenderOfWork={item.departmentName}
|
||||||
tenderFees={item.documentFees}
|
tenderFees={item.documentFees}
|
||||||
tenderNumber={item.tenderNumber}
|
tenderNumber={item.tenderNumber}
|
||||||
onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }}
|
// onPurchasePress={() => { Dispatch(togglePurchaseTender(item)) }}
|
||||||
onDetailsPress={() => { }}
|
// onDetailsPress={() => navigation.navigate('LiveTenderDetail', {item})}
|
||||||
/>
|
/>
|
||||||
},
|
},
|
||||||
[SelectedPurchaseList]
|
[SelectedPurchaseList]
|
||||||
|
|||||||
@@ -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({})
|
||||||
@@ -6,6 +6,7 @@ import { LiveTenderTileProps } from './types/types';
|
|||||||
import { Calendar, Tag, Info, ArrowRight } from 'lucide-react-native';
|
import { Calendar, Tag, Info, ArrowRight } from 'lucide-react-native';
|
||||||
import TenderDetail from './Modal/TenderFullDetail';
|
import TenderDetail from './Modal/TenderFullDetail';
|
||||||
import TenderFullDetail from './Modal/TenderFullDetail';
|
import TenderFullDetail from './Modal/TenderFullDetail';
|
||||||
|
import { useNavigation } from '@react-navigation/native';
|
||||||
|
|
||||||
const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
||||||
data,
|
data,
|
||||||
@@ -16,10 +17,12 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
|||||||
purchaseEnd,
|
purchaseEnd,
|
||||||
tenderFees,
|
tenderFees,
|
||||||
tenderNumber,
|
tenderNumber,
|
||||||
|
onDetailsPress
|
||||||
}) => {
|
}) => {
|
||||||
const [showDetail, setShowDetail] = React.useState(false);
|
const navigation: any = useNavigation();
|
||||||
const purchaseEnded = moment().isAfter(moment(purchaseEnd, 'DD-MM-YYYY HH:mm:ss'));
|
const purchaseEnded = moment().isAfter(moment(purchaseEnd, 'DD-MM-YYYY HH:mm:ss'));
|
||||||
|
|
||||||
|
console.log("live tender data : ", data)
|
||||||
return (
|
return (
|
||||||
<View style={styles.cardWrapper}>
|
<View style={styles.cardWrapper}>
|
||||||
{/* Status Tag */}
|
{/* Status Tag */}
|
||||||
@@ -33,7 +36,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
|||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={styles.container}
|
style={styles.container}
|
||||||
activeOpacity={0.9}
|
activeOpacity={0.9}
|
||||||
onPress={() => setShowDetail(true)}
|
onPress={() => navigation.navigate('LiveTenderDetail', data)}
|
||||||
>
|
>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<View style={styles.header}>
|
<View style={styles.header}>
|
||||||
@@ -72,7 +75,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
|||||||
|
|
||||||
{/* Action Bar */}
|
{/* Action Bar */}
|
||||||
<View style={styles.actionBar}>
|
<View style={styles.actionBar}>
|
||||||
<TouchableOpacity style={styles.iconBtn} onPress={() => setShowDetail(true)}>
|
<TouchableOpacity style={styles.iconBtn} onPress={onDetailsPress}>
|
||||||
<Info size={18} color={colors.primary} />
|
<Info size={18} color={colors.primary} />
|
||||||
<Text style={styles.iconBtnText}>Details</Text>
|
<Text style={styles.iconBtnText}>Details</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
@@ -104,7 +107,7 @@ const LiveTenderTile: React.FC<LiveTenderTileProps> = ({
|
|||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* Tender Detail Modal */}
|
{/* Tender Detail Modal */}
|
||||||
<TenderFullDetail visible={showDetail} data={data} onClose={() => setShowDetail(false)} />
|
{/* <TenderFullDetail visible={showDetail} data={data} onClose={() => setShowDetail(false)} /> */}
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,85 +2,24 @@ import { StyleSheet, Text, View, ScrollView, StatusBar, TouchableOpacity } from
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { InsideHeader } from '../../Component/Index'
|
import { InsideHeader } from '../../Component/Index'
|
||||||
import colors from '../../Constant/Color'
|
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 = () => {
|
const ProceedToBidDetail = () => {
|
||||||
// Sample data based on your JSON
|
// Sample data based on your JSON
|
||||||
const navigation = useNavigation<any>()
|
const route = useRoute()
|
||||||
const tenderData = {
|
const tenderData = route.params?.tender;
|
||||||
tenderId: 1372,
|
const {data, refetch} = useProceedToBid(tenderData?.tenderId);
|
||||||
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 navigation = useNavigation<any>()
|
||||||
// Format date from array
|
// Format date from array
|
||||||
|
|
||||||
|
const handleStartBidding = () => {
|
||||||
|
refetch();
|
||||||
|
if (data) {
|
||||||
|
navigation.navigate('TenderBidding', { tenderData: tenderData , bidData: data.data });
|
||||||
|
}
|
||||||
|
}
|
||||||
const formatDate = (dateArray: any[]) => {
|
const formatDate = (dateArray: any[]) => {
|
||||||
if (!dateArray || dateArray.length < 3) return "N/A";
|
if (!dateArray || dateArray.length < 3) return "N/A";
|
||||||
const [year, month, day, hour = 0, minute = 0] = dateArray;
|
const [year, month, day, hour = 0, minute = 0] = dateArray;
|
||||||
@@ -103,39 +42,39 @@ const ProceedToBidDetail = () => {
|
|||||||
<View style={styles.cardHeader}>
|
<View style={styles.cardHeader}>
|
||||||
<Text style={styles.cardTitle}>{title}</Text>
|
<Text style={styles.cardTitle}>{title}</Text>
|
||||||
<View style={[styles.envelopeBadge, { backgroundColor: colors.primary }]}>
|
<View style={[styles.envelopeBadge, { backgroundColor: colors.primary }]}>
|
||||||
<Text style={styles.envelopeBadgeText}>{log.envelope}</Text>
|
<Text style={styles.envelopeBadgeText}>{log?.envelope}</Text>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>Activity:</Text>
|
<Text style={styles.label}>Activity:</Text>
|
||||||
<Text style={styles.value}>{log.activity}</Text>
|
<Text style={styles.value}>{log?.activity}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>Date & Time:</Text>
|
<Text style={styles.label}>Date & Time:</Text>
|
||||||
<Text style={styles.value}>{log.dateTime}</Text>
|
<Text style={styles.value}>{log?.dateTime}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>System Info:</Text>
|
<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>
|
||||||
|
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>IP Address:</Text>
|
<Text style={styles.label}>IP Address:</Text>
|
||||||
<Text style={styles.value}>{log.ipAddress}</Text>
|
<Text style={styles.value}>{log?.ipAddress}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>Status Message:</Text>
|
<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>
|
</View>
|
||||||
|
|
||||||
{log.headingMsg && (
|
{log?.headingMsg && (
|
||||||
<View style={styles.logDetailRow}>
|
<View style={styles.logDetailRow}>
|
||||||
<Text style={styles.label}>Heading:</Text>
|
<Text style={styles.label}>Heading:</Text>
|
||||||
<Text style={styles.value}>{log.headingMsg}</Text>
|
<Text style={styles.value}>{log?.headingMsg}</Text>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
@@ -278,23 +217,19 @@ const ProceedToBidDetail = () => {
|
|||||||
|
|
||||||
<View style={styles.footerSpace} />
|
<View style={styles.footerSpace} />
|
||||||
</ScrollView>
|
</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>
|
</View>
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ const PurchaseTenderAllList = () => {
|
|||||||
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isRefetching, refetch }: any = useFetchPurchaseTender();
|
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, isRefetching, refetch }: any = useFetchPurchaseTender();
|
||||||
const [showRefreshBanner, setShowRefreshBanner] = useState(false);
|
const [showRefreshBanner, setShowRefreshBanner] = useState(false);
|
||||||
|
|
||||||
|
|
||||||
|
console.log("data for tender : ", data)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isRefetching) {
|
if (isRefetching) {
|
||||||
setShowRefreshBanner(true);
|
setShowRefreshBanner(true);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React from 'react';
|
import React, { use, useEffect } from 'react';
|
||||||
import {
|
import {
|
||||||
View,
|
View,
|
||||||
Text,
|
Text,
|
||||||
@@ -33,21 +33,17 @@ const PurchaseTenderTile = ({
|
|||||||
elevation: elevation.value,
|
elevation: elevation.value,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const { data: tenderResponse, }: any = useFetchTenderById(item?.tenderId);
|
const { data: tenderResponse, }: any = useFetchTenderById(item?.tenderId);
|
||||||
const tender = tenderResponse?.data;
|
const tender = tenderResponse?.data;
|
||||||
|
|
||||||
// const {
|
// console.log("item my : ", item)
|
||||||
// refetch,
|
|
||||||
// isFetching,
|
|
||||||
// isError,
|
|
||||||
// } = useProceedToBid(item?.tenderId);
|
|
||||||
|
|
||||||
// const handleProceed = async (item: any) => {
|
{
|
||||||
// const res = await refetch();
|
if (item?.nitNumber == 'TN/111') {
|
||||||
// if (res.data && !isError) {
|
console.log("tender item : ", item?.nitNumber)
|
||||||
// navigation.navigate('TenderBidding', { tenderData: res.data?.data });
|
|
||||||
// }
|
}
|
||||||
// };
|
}
|
||||||
|
|
||||||
const handlePressIn = () => {
|
const handlePressIn = () => {
|
||||||
scale.value = withTiming(0.97, { duration: 120 });
|
scale.value = withTiming(0.97, { duration: 120 });
|
||||||
@@ -59,12 +55,18 @@ const PurchaseTenderTile = ({
|
|||||||
elevation.value = withTiming(8, { duration: 160 });
|
elevation.value = withTiming(8, { duration: 160 });
|
||||||
};
|
};
|
||||||
|
|
||||||
const isLive = item?.liveStatus === true;
|
const isLive = item?.biddingStatus === true;
|
||||||
|
|
||||||
const statusColor = isLive ? colors.primary : '#94A3B8';
|
const statusColor = isLive ? colors.primary : '#94A3B8';
|
||||||
const lightStatusBg = isLive ? '#EFF6FF' : '#F8FAFC';
|
const lightStatusBg = isLive ? '#EFF6FF' : '#F8FAFC';
|
||||||
const [showDetail, setShowDetail] = React.useState(false);
|
const [showDetail, setShowDetail] = React.useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if(item?.tenderNumber == 'TN/210'){
|
||||||
|
console.log("tender item : ", item)
|
||||||
|
}
|
||||||
|
}, [item]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Animated.View
|
<Animated.View
|
||||||
entering={FadeInUp.duration(400)}
|
entering={FadeInUp.duration(400)}
|
||||||
@@ -105,11 +107,11 @@ const PurchaseTenderTile = ({
|
|||||||
setShowDetail(true)
|
setShowDetail(true)
|
||||||
}}>
|
}}>
|
||||||
<Text style={styles.dateText}>
|
<Text style={styles.dateText}>
|
||||||
<Text style={styles.dateLabel}>Purchase Ends: </Text>
|
<Text style={styles.dateLabel}>Bid Ends: </Text>
|
||||||
{moment(
|
{moment(
|
||||||
item?.tenderKeyDatesAmendment?.tenderPurchaseDate?.endDateTime,
|
item?.keydates?.bidSubmissionDate?.endDateTime,
|
||||||
'DD-MM-YYYY HH:mm:ss'
|
'DD-MM-YYYY HH:mm:ss'
|
||||||
).format('DD MMM, hh:mm A')}
|
).format('DD MMM YYYY, hh:mm A')}
|
||||||
</Text>
|
</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
|
|
||||||
@@ -121,7 +123,7 @@ const PurchaseTenderTile = ({
|
|||||||
{isLive ? (
|
{isLive ? (
|
||||||
<CountdownTimer
|
<CountdownTimer
|
||||||
endDate={
|
endDate={
|
||||||
item?.tenderKeyDatesAmendment?.tenderPurchaseDate?.endDateTime
|
item?.keydates?.bidSubmissionDate?.endDateTime
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -133,7 +135,7 @@ const PurchaseTenderTile = ({
|
|||||||
disabled={!isLive}
|
disabled={!isLive}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (isLive) {
|
if (isLive) {
|
||||||
navigation.navigate('ProceedToBidDetail', { tender });
|
navigation.navigate('ProceedToBidDetail', { tender });
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
activeOpacity={0.85}
|
activeOpacity={0.85}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ const TenderBidding = () => {
|
|||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
|
|
||||||
const [bidData] = useState<any>(route.params?.tenderData || null);
|
const [bidData] = useState<any>(route.params?.tenderData || null);
|
||||||
|
const tenderData = route.params?.bidData || null;
|
||||||
const [activeEnvelope, setActiveEnvelope] = useState<EnvelopeType | null>('A');
|
const [activeEnvelope, setActiveEnvelope] = useState<EnvelopeType | null>('A');
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const [envelopForm, setEnvelopForm] = useState<EnvelopeFormState>({
|
const [envelopForm, setEnvelopForm] = useState<EnvelopeFormState>({
|
||||||
@@ -227,9 +228,9 @@ const TenderBidding = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const hasEnvelopes = () => {
|
const hasEnvelopes = () => {
|
||||||
const hasA = bidData?.tenderEnvelopeAList?.length > 0;
|
const hasA = tenderData?.tenderEnvelopeAList?.length > 0;
|
||||||
const hasB = bidData?.tenderEnvelopeBList?.length > 0;
|
const hasB = tenderData?.tenderEnvelopeBList?.length > 0;
|
||||||
// const hasC = bidData?.tenderEnvelopeCList?.length > 0;
|
// const hasC = tenderData?.tenderEnvelopeCList?.length > 0;
|
||||||
return hasA || hasB;
|
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 (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<InsideHeader title="Tender Bidding Start" showArrow />
|
<InsideHeader title="Tender Bidding Start" showArrow />
|
||||||
@@ -467,20 +469,19 @@ const TenderBidding = () => {
|
|||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
<Text style={styles.sectionTitle}>Bid Envelopes</Text>
|
<Text style={styles.sectionTitle}>Bid Envelopes</Text>
|
||||||
<View style={styles.envelopeRow}>
|
<View style={styles.envelopeRow}>
|
||||||
{bidData?.showEA && (
|
{tenderData?.showEA && (
|
||||||
<EnvelopeButton
|
<EnvelopeButton
|
||||||
title="Envelope A"
|
title="Envelope A"
|
||||||
envelopeType="A"
|
envelopeType="A"
|
||||||
onPress={() => setActiveEnvelope('A')}
|
onPress={() => setActiveEnvelope('A')}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{bidData?.showEB && (
|
{tenderData?.showEB && (
|
||||||
<EnvelopeButton
|
<EnvelopeButton
|
||||||
title="Envelope B"
|
title="Envelope B"
|
||||||
envelopeType="B"
|
envelopeType="B"
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if
|
if (tenderData?.envelopeASubmittStatus) {
|
||||||
(bidData?.envelopeASubmittStatus) {
|
|
||||||
setActiveEnvelope('B')
|
setActiveEnvelope('B')
|
||||||
} else {
|
} else {
|
||||||
Alert.alert('Info', 'First Fill Envelop A First')
|
Alert.alert('Info', 'First Fill Envelop A First')
|
||||||
@@ -488,7 +489,7 @@ const TenderBidding = () => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{bidData?.showEC && (
|
{tenderData?.showEC && (
|
||||||
<EnvelopeButton
|
<EnvelopeButton
|
||||||
title="Envelope C"
|
title="Envelope C"
|
||||||
envelopeType="C"
|
envelopeType="C"
|
||||||
@@ -498,11 +499,11 @@ const TenderBidding = () => {
|
|||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
{/* Envelope A List */}
|
{/* Envelope A List */}
|
||||||
{bidData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && (
|
{tenderData?.[`tenderEnvelope${activeEnvelope}List`]?.length > 0 && activeEnvelope !== 'C' && (
|
||||||
<View style={styles.card}>
|
<View style={styles.card}>
|
||||||
<Text style={styles.sectionTitle}>Envelope {activeEnvelope} Details</Text>
|
<Text style={styles.sectionTitle}>Envelope {activeEnvelope} Details</Text>
|
||||||
<FlatList
|
<FlatList
|
||||||
data={bidData?.[`tenderEnvelope${activeEnvelope}List`]}
|
data={tenderData?.[`tenderEnvelope${activeEnvelope}List`]}
|
||||||
keyExtractor={(item) => item?.[`tenderEnvelope${activeEnvelope}SequnceId`]?.toString()}
|
keyExtractor={(item) => item?.[`tenderEnvelope${activeEnvelope}SequnceId`]?.toString()}
|
||||||
renderItem={({ item }) => renderEnvelopeItem({ item, envelopeType: activeEnvelope })}
|
renderItem={({ item }) => renderEnvelopeItem({ item, envelopeType: activeEnvelope })}
|
||||||
scrollEnabled={false}
|
scrollEnabled={false}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import Home from "./Home/Home";
|
|||||||
import Login from "./Login/Login";
|
import Login from "./Login/Login";
|
||||||
import Onboarding from "./Onboarding/Onboarding";
|
import Onboarding from "./Onboarding/Onboarding";
|
||||||
import Splash from "./Splash/Splash";
|
import Splash from "./Splash/Splash";
|
||||||
|
import LiveTenderDetail from "./Tender/LiveTenderDetail";
|
||||||
import ProceedToBidDetail from "./Tender/ProceedToBidDetail";
|
import ProceedToBidDetail from "./Tender/ProceedToBidDetail";
|
||||||
import ProceedToPurTender from "./Tender/ProceedToPurTender";
|
import ProceedToPurTender from "./Tender/ProceedToPurTender";
|
||||||
import PurchaseTenderList from "./Tender/PurchaseTenderList";
|
import PurchaseTenderList from "./Tender/PurchaseTenderList";
|
||||||
@@ -28,6 +29,7 @@ const Screens = {
|
|||||||
PurchaseTenderList,
|
PurchaseTenderList,
|
||||||
ProceedToPurTender,
|
ProceedToPurTender,
|
||||||
TenderBidding,
|
TenderBidding,
|
||||||
ProceedToBidDetail
|
ProceedToBidDetail,
|
||||||
|
LiveTenderDetail
|
||||||
}
|
}
|
||||||
export default Screens
|
export default Screens
|
||||||
+29
-28
@@ -20,30 +20,31 @@ export const useDashboard = () => {
|
|||||||
// Auction & Tender
|
// Auction & Tender
|
||||||
|
|
||||||
export const useFetchPurchaseTender = () => {
|
export const useFetchPurchaseTender = () => {
|
||||||
return useInfiniteQuery({
|
return useInfiniteQuery({
|
||||||
queryKey: ['fetchPurchaseTender'],
|
queryKey: ['fetchPurchaseTender'],
|
||||||
initialPageParam: 1,
|
queryFn: ({ pageParam = 0 }) =>
|
||||||
queryFn: ({ pageParam }) =>
|
fetchPurchaseTender({
|
||||||
fetchPurchaseTender({
|
page: pageParam,
|
||||||
page: pageParam,
|
size: 10,
|
||||||
size: 10,
|
}),
|
||||||
}),
|
initialPageParam: 0,
|
||||||
|
getNextPageParam: (lastPage, allPages) => {
|
||||||
|
console.log('last page : ', lastPage)
|
||||||
|
console.log("all page : ", allPages)
|
||||||
|
const {totalCount } = lastPage;
|
||||||
|
|
||||||
getNextPageParam: (lastPage) => {
|
const totalPages = Math.ceil(totalCount / 10);
|
||||||
const { page, size, totalCount } = lastPage;
|
const nextPage = allPages.length;
|
||||||
|
return nextPage < totalPages ? nextPage : undefined;
|
||||||
|
},
|
||||||
|
|
||||||
const totalPages = Math.ceil(totalCount / size);
|
select: (data) => ({
|
||||||
|
...data,
|
||||||
return page < totalPages ? page + 1 : undefined;
|
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({
|
return useQuery({
|
||||||
queryKey: ['fetchTenderById', tenderId],
|
queryKey: ['fetchTenderById', tenderId],
|
||||||
queryFn: () => fetchTenderById(tenderId)
|
queryFn: () => fetchTenderById(tenderId)
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useProceedToBid = (tenderId?: string) => {
|
export const useProceedToBid = (tenderId?: string) => {
|
||||||
return useQuery({
|
return useQuery({
|
||||||
queryKey: ['proceedToBid', tenderId],
|
queryKey: ['proceedToBid', tenderId],
|
||||||
queryFn: () => proceedToBid(tenderId as string),
|
queryFn: () => proceedToBid(tenderId as string),
|
||||||
enabled: false, // 👈 manual trigger
|
enabled: false, // 👈 manual trigger
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user