diff --git a/src/Redux/Slices/SelectedPurchaseTender.ts b/src/Redux/Slices/SelectedPurchaseTender.ts index edd9b68..7e996b1 100644 --- a/src/Redux/Slices/SelectedPurchaseTender.ts +++ b/src/Redux/Slices/SelectedPurchaseTender.ts @@ -1,11 +1,9 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; export interface TenderItem { - TenderNumber: string; - [key: string]: any; + tenderId: number; } -// ✅ DEFAULT = EMPTY ARRAY const initialState: TenderItem[] = []; export const selectPurchaseTenderSlice = createSlice({ @@ -27,7 +25,7 @@ export const selectPurchaseTenderSlice = createSlice({ } }, - clearPurchaseTender: () => [], + clearPurchaseTender: () => initialState, }, }); @@ -36,4 +34,4 @@ export const { clearPurchaseTender, } = selectPurchaseTenderSlice.actions; -export default selectPurchaseTenderSlice.reducer; +export default selectPurchaseTenderSlice.reducer; \ No newline at end of file diff --git a/src/Screens/Tender/LiveTender.tsx b/src/Screens/Tender/LiveTender.tsx index df7cc3d..2c0d946 100644 --- a/src/Screens/Tender/LiveTender.tsx +++ b/src/Screens/Tender/LiveTender.tsx @@ -72,6 +72,7 @@ const LiveTender = () => { return ; } + console.log("data live : ", data ) return ( { }} placeholder="Search...." /> @@ -114,7 +115,7 @@ const LiveTender = () => { )} String(item.auctionId)} renderItem={renderItem} showsVerticalScrollIndicator={false} @@ -135,6 +136,8 @@ const LiveTender = () => { windowSize={7} removeClippedSubviews updateCellsBatchingPeriod={50} + onRefresh={refetch} + refreshing={isRefetching} /> ); diff --git a/src/Screens/Tender/LiveTenderTile.tsx b/src/Screens/Tender/LiveTenderTile.tsx index b418a42..453096d 100644 --- a/src/Screens/Tender/LiveTenderTile.tsx +++ b/src/Screens/Tender/LiveTenderTile.tsx @@ -17,20 +17,20 @@ const LiveTenderTile: React.FC = ({ tenderDispatchDate, tenderOfWork, purchaseEnd, - tenderFees, + tenderFees, tenderNumber, - onDetailsPress }) => { const navigation: any = useNavigation(); const purchaseEnded = !moment().isAfter(moment(purchaseEnd, 'DD-MM-YYYY HH:mm:ss')); -const contractorIds = typeof data?.contractorId === 'string' - ? data.contractorId.split(',').map((id:any) => id.trim()) - : Array.isArray(data?.contractorId) - ? data.contractorId - : []; + const contractorIds = typeof data?.contractorId === 'string' + ? data.contractorId.split(',').map((id: any) => id.trim()) + : Array.isArray(data?.contractorId) + ? data.contractorId + : []; + + const purchased = contractorIds.includes(String(contractorId)); -const purchased = contractorIds.includes(String(contractorId)); return ( @@ -38,7 +38,7 @@ const purchased = contractorIds.includes(String(contractorId)); @@ -67,7 +67,6 @@ const purchased = contractorIds.includes(String(contractorId)); Start - {/* {tenderDispatchDate ?? '-'} */} {format.date6(`${tenderDispatchDate}`)} @@ -86,7 +85,7 @@ const purchased = contractorIds.includes(String(contractorId)); {/* Action Bar */} - navigation.navigate('LiveTenderDetail', data)}> + navigation.navigate('LiveTenderDetail', data)}> Details @@ -96,7 +95,7 @@ const purchased = contractorIds.includes(String(contractorId)); styles.mainButton, purchaseEnded ? styles.btnDisabled - :(purchased? styles.btnDisabled: isPurchased + : (purchased ? styles.btnDisabled : isPurchased ? styles.btnPurchased : styles.btnActive), ]} @@ -109,7 +108,7 @@ const purchased = contractorIds.includes(String(contractorId)); isPurchased && !purchaseEnded ? { color: colors.white } : { color: '#fff' }, ]} > - {purchaseEnded ? 'Expired' : (purchased?'Purchased':isPurchased ? 'Remove' : 'Add to Cart')} + {purchaseEnded ? 'Expired' : (purchased ? 'Purchased' : isPurchased ? 'Remove' : 'Add to Cart')} {(!purchaseEnded && !purchased) && ( @@ -117,8 +116,6 @@ const purchased = contractorIds.includes(String(contractorId)); - {/* Tender Detail Modal */} - {/* setShowDetail(false)} /> */} ); diff --git a/src/Screens/Tender/ProceedToBidDetail.tsx b/src/Screens/Tender/ProceedToBidDetail.tsx index 239536a..db9d7a4 100644 --- a/src/Screens/Tender/ProceedToBidDetail.tsx +++ b/src/Screens/Tender/ProceedToBidDetail.tsx @@ -15,9 +15,9 @@ const ProceedToBidDetail = () => { const [refreshing, setRefreshing] = React.useState(false); const [loading, setLoading] = React.useState(false); - console.log("proceed to bid tender detail : ", tenderDataId) - console.log("proceed to data detail : ", data) - console.log("tender data for updated : ", tenderData) + // console.log("proceed to bid tender detail : ", tenderDataId) + // console.log("proceed to data detail : ", data) + // console.log("tender data for updated : ", tenderData) const navigation = useNavigation() // Format date from array @@ -125,7 +125,7 @@ const ProceedToBidDetail = () => { useFocusEffect( useCallback(() => { tenderRefetch(); - }, [tenderData.tenderId]) + }, [tenderData?.tenderId]) ); return ( diff --git a/src/Screens/Tender/PurchaseTenderAllList.tsx b/src/Screens/Tender/PurchaseTenderAllList.tsx index 59d1e0d..b410be7 100644 --- a/src/Screens/Tender/PurchaseTenderAllList.tsx +++ b/src/Screens/Tender/PurchaseTenderAllList.tsx @@ -23,8 +23,6 @@ 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); @@ -36,6 +34,7 @@ const PurchaseTenderAllList = () => { return () => clearTimeout(timer); } }, [isRefetching]); + const format = 'DD-MM-YYYY HH:mm:ss'; function isTenderActive(item: any): boolean { diff --git a/src/Screens/Tender/PurchaseTenderList.tsx b/src/Screens/Tender/PurchaseTenderList.tsx index 6771ab3..a69fee9 100644 --- a/src/Screens/Tender/PurchaseTenderList.tsx +++ b/src/Screens/Tender/PurchaseTenderList.tsx @@ -7,7 +7,7 @@ import colors from '../../Constant/Color'; import { useNavigation } from '@react-navigation/native'; import NavigationString from '../../Constant/NavigationString'; import { useDispatch, useSelector } from 'react-redux'; -import { togglePurchaseAuction } from '../../Redux/Slices/selectPurchaseAuction'; +import { togglePurchaseTender } from '../../Redux/Slices/SelectedPurchaseTender'; const PurchaseTenderList = () => { const Navigation: any = useNavigation() @@ -18,7 +18,6 @@ const PurchaseTenderList = () => { setExpandedIndex(prev => (prev === index ? null : index)); }; - return ( @@ -27,12 +26,13 @@ const PurchaseTenderList = () => { {/* Header */} Tender Purchase List - + {/* */} {/* Cards */} {SelectedPurchaseList.map((item: any, index: any) => { const expanded = expandedIndex === index; + console.log("item gvsdvgfsv h ca : ", item) return ( { {renderRow('Department', item.departmentName)} {renderRow('Purchase End', item.purchaseEnd)} - { Dispatch(togglePurchaseAuction(item)) }}> + { Dispatch(togglePurchaseTender(item)) }}> Remove diff --git a/src/Screens/Tender/PurchaseTenderTile.tsx b/src/Screens/Tender/PurchaseTenderTile.tsx index ae34bbf..2a6d0ff 100644 --- a/src/Screens/Tender/PurchaseTenderTile.tsx +++ b/src/Screens/Tender/PurchaseTenderTile.tsx @@ -104,7 +104,7 @@ const PurchaseTenderTile = ({ item, onPressDetails }: any) => { { if (isLive) { navigation.navigate('ProceedToBidDetail', { tender }); diff --git a/src/Screens/Tender/Tender.tsx b/src/Screens/Tender/Tender.tsx index e2741a4..bd5f117 100644 --- a/src/Screens/Tender/Tender.tsx +++ b/src/Screens/Tender/Tender.tsx @@ -34,7 +34,7 @@ const Tender = () => { (state: any) => state?.selectPurchaseTender, ); - const liveCount = liveTenderData?.totalCount || 0; + const liveCount = liveTenderData?.pages?.[0]?.totalCount || 0; const purchaseCount = purchaseTenderData?.pages?.[0]?.totalCount || 0; const [selectedTab, setSelectedTab] = useState<'live' | 'purchase'>('live'); diff --git a/src/Screens/Tender/tenderBidding/TenderBidding.tsx b/src/Screens/Tender/tenderBidding/TenderBidding.tsx index 4b2db14..4778bf9 100644 --- a/src/Screens/Tender/tenderBidding/TenderBidding.tsx +++ b/src/Screens/Tender/tenderBidding/TenderBidding.tsx @@ -18,9 +18,6 @@ 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 { CheckSquare, Square } from 'lucide-react-native'; import { apiCall } from '../../../Axios/Axios'; - -import axios from 'axios'; -import { useSelector } from 'react-redux'; import EnvelopeCExcelPreview from '../Component/EnvelopeCExcelPreview'; type EnvelopeType = 'A' | 'B' | 'C'; @@ -43,8 +40,6 @@ interface InfoRowProps { const TenderBidding = () => { const route = useRoute(); const navigation = useNavigation(); - const token = useSelector((state: any) => state.token.token); - const [bidData] = useState(route.params?.tenderData || null); const tenderData: any = route.params?.bidData || null; const [activeEnvelope, setActiveEnvelope] = useState('A'); @@ -54,18 +49,13 @@ const TenderBidding = () => { C: {}, }); const [loading, setLoading] = useState(false) - const [loadingUpload, setLoadingUpload] = useState(false) const [check, setCheck] = useState(false) - const [uploadFileResponse, setUploadFileResponse] = useState(null); - - const InfoRow = ({ title, value }: InfoRowProps) => ( {title} {value || '-'} ); - const EnvelopeButton = ({ title, envelopeType, onPress }: EnvelopeButtonProps & { envelopeType: EnvelopeType }) => ( { {title} ); - - const handleEnvelopeChange = ( envelopeType: EnvelopeType, sequenceId: number, @@ -95,7 +83,6 @@ const TenderBidding = () => { }, })); }; - const pickPdf = async ( envelopeType: EnvelopeType, sequenceId: number @@ -116,8 +103,6 @@ const TenderBidding = () => { console.error(err); } }; - - const renderEnvelopeItem = ({ item, envelopeType, @@ -137,22 +122,13 @@ const TenderBidding = () => { const showInput = activeEnvelope === envelopeType && !bidData?.[`envelope${envelopeType}SubmittStatus`]; - - // console.log("tender ana : ", tenderData) return ( - {/* Label Name */} {labelName || '-'} {item?.[`labelMandatory${activeEnvelope}`] && *} - - - {/* - Label Type - {labelType || '-'} - */} {showInput ? ( @@ -227,7 +203,6 @@ const TenderBidding = () => { return hasA || hasB; }; - const digitToWordMap: Record = { '0': 'Zero', '1': 'One', @@ -240,14 +215,12 @@ const TenderBidding = () => { '8': 'Eight', '9': 'Nine', }; - const convertDigitsToWords = (value: string): string => { return value .split('') .map(digit => digitToWordMap[digit] || '') .join(' ') || value; }; - const buildEnvelopePayload = () => { const list = @@ -319,7 +292,6 @@ const TenderBidding = () => { ? fileData : saveData, }; - // console.log("payload : ", payload) return payload; }; @@ -334,13 +306,9 @@ const TenderBidding = () => { const value = formValues?.[seqId]; if (!isMandatory) return false; - - // File upload if (item[`labelType${activeEnvelope}`] === '3') { return !value; } - - // Text / numeric return !value || value.toString().trim() === ''; }); @@ -353,30 +321,29 @@ const TenderBidding = () => { Alert.alert('Validation Error', 'Please fill all mandatory fields'); return; } - const payload = buildEnvelopePayload(); - console.log('Envelope A Payload:', payload); - setLoading(true) if (envelopForm?.[activeEnvelope]?.[3]) { - handleSubmitEnvelopeFile(SUBMIT_ENVELOPE_FILE_A) - return - } - try { + const result = await handleSubmitEnvelopeFile(SUBMIT_ENVELOPE_FILE_A) - const res = await apiCall('post', SUBMIT_ENVELOPE_A, payload) as any - console.log("res A envelop : ", res) - ToastAndroid.show(res?.message, ToastAndroid.SHORT) + if (result && result?.statusCode === 200) { + try { + const res = await apiCall('post', SUBMIT_ENVELOPE_A, payload) as any - - navigation.goBack() - } catch (error) { - console.log("error A envelop submit : ", error) - } finally { - setLoading(false) + if (res?.statusCode === 200) { + navigation.goBack() + ToastAndroid.show(res.message, ToastAndroid.SHORT) + } + } catch (error) { + console.log("error A envelop submit : ", error) + } finally { + setLoading(false) + } + } else { + setLoading(false) + Alert.alert('Error', 'File upload failed. Please try again.') + } } }; - - const handleSubmitEnvelopeB = async () => { if (!validateEnvelope()) { Alert.alert('Validation Error', 'Please fill all mandatory fields'); @@ -405,25 +372,16 @@ const TenderBidding = () => { Alert.alert('Error', 'File upload failed. Please try again.') } } - - - } - const handleSubmitEnvelopeFile = async (url: string) => { - console.log("url :: ", url) - const payload = buildEnvelopePayload(); - const formData = new FormData(); - console.log("envelop form : ", envelopForm) - + const fileDetail: any = envelopForm?.[activeEnvelope]?.[3] formData.append('files', { - uri: envelopForm?.[activeEnvelope]?.[3].uri, - name: envelopForm?.[activeEnvelope]?.[3].name, - type: envelopForm?.[activeEnvelope]?.[3].type, + uri: fileDetail.uri, + name: fileDetail.name, + type: fileDetail.type, }); - // formData.append('requestDto', payload) formData.append('requestDto', JSON.stringify(payload)) console.log("formdata : ", formData) @@ -557,9 +515,10 @@ const TenderBidding = () => { handleSubmitEnvelopeB(); } }} + // disabled={loading} > - {loading ? 'Submitting...' : `Submit Bid (${activeEnvelope})`} + {loading ? : `Submit Bid (${activeEnvelope})`} ) : ( diff --git a/src/Services/BBPS/Hooks.ts b/src/Services/BBPS/Hooks.ts index 22bc298..b4e00e0 100644 --- a/src/Services/BBPS/Hooks.ts +++ b/src/Services/BBPS/Hooks.ts @@ -53,10 +53,30 @@ export const useFetchPurchaseTender = () => { export const useFetchLiveTender = () => { - return useQuery({ - queryKey: ['fetchLiveTender',], - queryFn: () => fetchLiveTender() - }); + + return useInfiniteQuery({ + queryKey: ['fetchLiveTender'], + queryFn: ({ pageParam = 0 }) => fetchLiveTender({ + page: pageParam, + size: 10 + }), + initialPageParam: 0, + getNextPageParam: (lastPage, allPages) => { + const { totalCount } = lastPage; + console.log("last page : ", lastPage) + console.log("all pages : ", allPages) + const totalPages = Math.ceil(totalCount / 10); + const nextPage = allPages.length; + return nextPage < totalPages ? nextPage : undefined; + }, + + select: (data) => ({ + ...data, + result: data.pages.flatMap( + (page: any) => page?.data ?? [] + ), + }), + }) }; export const useFetchPurchaseAuction = () => { @@ -142,11 +162,11 @@ export const useOfflineTenderPurchase = () => { }; export const useFetchTenderById = (tenderId: string) => { -return useQuery({ - queryKey: ['fetchTenderById', tenderId], - queryFn: () => fetchTenderById(tenderId), - enabled: !!tenderId, // prevents running with undefined id -}); + return useQuery({ + queryKey: ['fetchTenderById', tenderId], + queryFn: () => fetchTenderById(tenderId), + enabled: !!tenderId, // prevents running with undefined id + }); } export const useProceedToBid = (tenderId?: string) => { return useQuery({ @@ -306,7 +326,7 @@ export const useTenderDetails = () => { }); }; -export const useFetchLiveTenderById = (tenderId:number) => { +export const useFetchLiveTenderById = (tenderId: number) => { return useQuery({ queryKey: ['fetchLiveTenderById', tenderId], queryFn: () => fetchLiveTenderById(tenderId) diff --git a/src/Services/BBPS/apis.ts b/src/Services/BBPS/apis.ts index 6523944..ac8f594 100644 --- a/src/Services/BBPS/apis.ts +++ b/src/Services/BBPS/apis.ts @@ -125,10 +125,14 @@ export const fetchPurchaseTender = async ({ -export const fetchLiveTender = async (): Promise => { - const data = await apiCall('get', `${LIVE_TENDER}`); +export const fetchLiveTender = async ({page, size}:{page:number, size:number}): Promise => { + console.log("page : ", page) + console.log("size : ", size) + const data = await apiCall('get', `${LIVE_TENDER}?page=${page}&size=${size}`); + console.log("data : ", data) return data } + export const fetchTenderById = async (tenderId: string): Promise => { const data = await apiCall( 'get',