diff --git a/src/Constant/NavigationString.tsx b/src/Constant/NavigationString.tsx
index c5abd14..bd702db 100644
--- a/src/Constant/NavigationString.tsx
+++ b/src/Constant/NavigationString.tsx
@@ -19,5 +19,6 @@ const NavigationString = {
ProceedToBidDetail:'ProceedToBidDetail',
Signup:'Signup',
Registration:'Registration',
+ Partnership:'Partnership',
}
export default NavigationString
\ No newline at end of file
diff --git a/src/Navigation/MainStack.jsx b/src/Navigation/MainStack.jsx
index c7edb92..60e353c 100644
--- a/src/Navigation/MainStack.jsx
+++ b/src/Navigation/MainStack.jsx
@@ -44,6 +44,7 @@ export default function MainStack() {
+
);
}
diff --git a/src/Screens/Ragistration/PartnerShip.tsx b/src/Screens/Ragistration/PartnerShip.tsx
new file mode 100644
index 0000000..5affd87
--- /dev/null
+++ b/src/Screens/Ragistration/PartnerShip.tsx
@@ -0,0 +1,278 @@
+import {
+ KeyboardAvoidingView,
+ SafeAreaView,
+ ScrollView,
+ StyleSheet,
+ Text,
+ TouchableOpacity,
+ View,
+ Platform,
+} from 'react-native';
+import React, { use, useState } from 'react';
+import { useNavigation, useRoute, NavigationProp, RouteProp } from '@react-navigation/native';
+import colors from '../../Constant/Color';
+import PrimaryButton from '../../Component/PrimaryButton/PrimaryButton';
+import MyInput from '../../Component/MyInput';
+import { showToast } from '../../Constant/ShowDailog';
+import { PARTNER_API_ENDPOINT } from '../../Services/BBPS/ApiUrls';
+import { usePartnerShipSubmit } from '../../Services/BBPS/Hooks';
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+import { Navigation } from 'lucide-react-native';
+import { NavigationString } from '../../Constant/AllImports';
+
+
+type Partner = {
+ partnerName: string;
+ percentage: string;
+ partnerPan: string;
+ aadharNumber: string;
+ mobileNumber: string;
+};
+type Navigation = {
+ replace: (route: string) => void;
+};
+type PartnershipParams = {
+ otherId: string | number
+};
+const Partnership = () => {
+ const route = useRoute>();
+
+ const navigation = useNavigation() as Navigation;
+ const [partners, setPartners] = useState([
+ {
+ partnerName: '',
+ percentage: '',
+ partnerPan: '',
+ aadharNumber: '',
+ mobileNumber: '',
+ },
+ ]);
+
+ const [focusedField, setFocusedField] = useState('');
+ const [loading, setLoading] = useState(false)
+ const { mutateAsync:partnerShipSubmit } = usePartnerShipSubmit();
+ const insets = useSafeAreaInsets();
+ const handleChange = (index: number, name: keyof Partner, value: string) => {
+ const updated = [...partners];
+ updated[index][name] = value;
+ setPartners(updated);
+ };
+
+ const handleAddMore = () => {
+ setPartners(prev => [
+ ...prev,
+ {
+ partnerName: '',
+ percentage: '',
+ partnerPan: '',
+ aadharNumber: '',
+ mobileNumber: '',
+ },
+ ]);
+ };
+
+ const handleRemove = (index: number) => {
+ const updated = [...partners];
+ updated.splice(index, 1);
+ setPartners(
+ updated.length > 0
+ ? updated
+ : [
+ {
+ partnerName: '',
+ percentage: '',
+ partnerPan: '',
+ aadharNumber: '',
+ mobileNumber: '',
+ },
+ ]
+ );
+ };
+
+ const handleSubmit = async () => {
+ setLoading(true)
+ try {
+ // Convert percentage strings to numbers and validate
+ const payload = partners.map((p, i) => {
+ const percentage = Number(p.percentage);
+
+ if (isNaN(percentage) || percentage < 0 || percentage > 100) {
+ throw new Error(`Invalid percentage value for partner ${p.partnerName}`);
+ }
+
+ return {
+ contOtherId: route?.params?.otherId,
+ ptnrAadharNo: p.aadharNumber,
+ ptnrMobNo: p.mobileNumber,
+ ptnrName: p.partnerName,
+ ptnrPop: percentage, // Ensure this is a number
+ ptnrPANNo: p.partnerPan,
+ ptnrNo: i,
+ };
+ });
+
+ // Validate total percentage equals 100%
+ const totalPercentage = payload.reduce((sum, p) => sum + p.ptnrPop, 0);
+ if (totalPercentage !== 100) {
+ showToast(`Total percentage must equal 100% (currently ${totalPercentage}%)`);
+ return;
+ }
+
+ console.log("Partner ship payload:", payload);
+ const response = await partnerShipSubmit(payload);
+
+ console.log("first ====== ", response)
+ if (response?.statusCode === 200) {
+ console.log('✅ Partners submitted successfully:', response);
+ showToast(response.message || 'Submitted successfully!');
+ navigation.replace(NavigationString.Home);
+
+ }
+ } catch (error: any) {
+ console.error('❌ Submission failed:', error.message);
+ showToast(error.message || 'Submission failed. Please check partner details.');
+ }finally{
+ setLoading(false)
+ }
+ };
+
+ return (
+
+ Partnership Details
+
+
+
+ {partners.map((partner, index) => (
+
+ Partner {index + 1}
+
+ handleChange(index, 'partnerName', text)}
+ onFocus={() => setFocusedField(`partnerName-${index}`)}
+ onBlur={() => setFocusedField('')}
+ focused={focusedField === `partnerName-${index}`}
+ />
+
+ handleChange(index, 'percentage', text)}
+ onFocus={() => setFocusedField(`percentage-${index}`)}
+ onBlur={() => setFocusedField('')}
+ focused={focusedField === `percentage-${index}`}
+ keyboardType="numeric"
+ maxlength={3}
+ />
+
+ handleChange(index, 'partnerPan', text)}
+ onFocus={() => setFocusedField(`partnerPan-${index}`)}
+ onBlur={() => setFocusedField('')}
+ focused={focusedField === `partnerPan-${index}`}
+ autoCapitalize="characters"
+ maxlength={10}
+
+ />
+
+ handleChange(index, 'aadharNumber', text)}
+ onFocus={() => setFocusedField(`aadharNumber-${index}`)}
+ onBlur={() => setFocusedField('')}
+ focused={focusedField === `aadharNumber-${index}`}
+ keyboardType="numeric"
+ maxlength={12}
+ />
+
+ handleChange(index, 'mobileNumber', text)}
+ onFocus={() => setFocusedField(`mobileNumber-${index}`)}
+ onBlur={() => setFocusedField('')}
+ focused={focusedField === `mobileNumber-${index}`}
+ keyboardType="phone-pad"
+ maxlength={10}
+ />
+
+ {partners.length > 1 && (
+ handleRemove(index)}>
+ Delete Partner
+
+ )}
+
+ ))}
+
+
+ + Add Partner
+
+
+
+
+
+
+
+ );
+};
+
+export default Partnership;
+
+const styles = StyleSheet.create({
+ heading: {
+ fontSize: 18,
+ fontWeight: 'bold',
+ marginBottom: 10,
+ marginTop: 10,
+ textAlign: 'center',
+
+ },
+ partnerTitle: {
+ fontWeight: '600',
+ fontSize: 16,
+ marginBottom: 10,
+ },
+ scrollContainer: {
+ // backgroundColor: color.background,
+ flexGrow: 1,
+ },
+ addButton: {
+ backgroundColor: colors.primary,
+ padding: 10,
+ marginTop: 10,
+ borderRadius: 10,
+ alignItems: 'center',
+ width: 140,
+ alignSelf: 'flex-end',
+ },
+ addText: {
+ color: 'white',
+ fontWeight: '600',
+ },
+ deleteButton: {
+ backgroundColor: '#FF5C5C',
+ padding: 10,
+ marginTop: 10,
+ borderRadius: 10,
+ alignItems: 'center',
+ width: 140,
+ alignSelf: 'flex-end',
+ },
+ deleteText: {
+ color: 'white',
+ fontWeight: '600',
+ },
+});
diff --git a/src/Screens/Ragistration/Ragistration.tsx b/src/Screens/Ragistration/Ragistration.tsx
index 973d798..6751c5e 100644
--- a/src/Screens/Ragistration/Ragistration.tsx
+++ b/src/Screens/Ragistration/Ragistration.tsx
@@ -327,6 +327,7 @@ useEffect(() => {
orgPAN: formData.orgPanNumber,
comAadharNo: formData.aadhaarNumber,
gistnNo: formData.gstnNo,
+ stateName: MasterData?.data?.states?.find((state:any)=>state.stateId==formData.state)?.stateName || '',
};
console.log('Form Data for registration',formData);
diff --git a/src/Screens/Splash/Splash.tsx b/src/Screens/Splash/Splash.tsx
index 70e922c..2dcfd07 100644
--- a/src/Screens/Splash/Splash.tsx
+++ b/src/Screens/Splash/Splash.tsx
@@ -62,14 +62,14 @@ const Splash: React.FC = () => {
const routeByOrgType = (params: { otherId: any; orgType: any }) => {
const orgType = String(params.orgType);
-
+ console.log("hitting here ")
if (orgType === '4' || orgType === '5' || orgType === '6') {
navigation.replace('StageThree', params);
return;
}
if (orgType === '7') {
- navigation.replace('PartnerShip', params);
+ navigation.replace(NavigationString.Partnership, params);
return;
}
@@ -79,7 +79,7 @@ const Splash: React.FC = () => {
const handleGetData = async () => {
try {
const res = await registrationStateMutate();
- console.log('Registration status response:', res?.statusCode);
+ console.log('Registration status response:', res);
if (res?.statusCode === 404 || res?.statusCode === 401) {
navigation.replace('Registration');
diff --git a/src/Screens/index.ts b/src/Screens/index.ts
index f49382b..95d8d7c 100644
--- a/src/Screens/index.ts
+++ b/src/Screens/index.ts
@@ -7,6 +7,7 @@ import StartReverseBidding from "./Bidding/StartReverseBidding";
import Home from "./Home/Home";
import Login from "./Login/Login";
import Onboarding from "./Onboarding/Onboarding";
+import Partnership from "./Ragistration/PartnerShip";
import Registration from "./Ragistration/Ragistration";
import Signup from "./SignUp/SignUp";
import Splash from "./Splash/Splash";
@@ -34,7 +35,8 @@ const Screens = {
ProceedToBidDetail,
StartReverseBidding,
Signup,
- Registration
+ Registration,
+ Partnership
}
diff --git a/src/Services/BBPS/Hooks.ts b/src/Services/BBPS/Hooks.ts
index 405edfb..5891cb6 100644
--- a/src/Services/BBPS/Hooks.ts
+++ b/src/Services/BBPS/Hooks.ts
@@ -1,5 +1,5 @@
import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query';
-import { contractorStageThreeSubmit, contractorStageTwoSubmit, fetchAuctionItem, fetchCityDropdown, fetchDashboard, fetchEmdCheck, fetchLiveAuction, fetchLiveTender, fetchMasterData, fetchPurchaseAuction, fetchPurchaseTender, fetchTenderById, getDesignation, getRagistrationState, offlineAuctionPurchase, offlineTenderPurchase, proceedToBid, registerContractor, sendAadhaarOtp, userAuctionLogin, userLogin, verifyAadhaarOtp, verifyGstNumber, verifyPanHandler } from './apis';
+import { contractorStageThreeSubmit, contractorStageTwoSubmit, fetchAuctionItem, fetchCityDropdown, fetchDashboard, fetchEmdCheck, fetchLiveAuction, fetchLiveTender, fetchMasterData, fetchPurchaseAuction, fetchPurchaseTender, fetchTenderById, getDesignation, getRagistrationState, offlineAuctionPurchase, offlineTenderPurchase, partnerShipSubmit, proceedToBid, registerContractor, sendAadhaarOtp, userAuctionLogin, userLogin, verifyAadhaarOtp, verifyGstNumber, verifyPanHandler } from './apis';
import { apiCall } from '../../Axios/Axios';
// User
@@ -207,4 +207,9 @@ export const useVerifyPan = () =>
export const useContractorStageThreeSubmit = () =>
useMutation({
mutationFn: contractorStageThreeSubmit,
+ });
+
+ export const usePartnerShipSubmit = () =>
+ useMutation({
+ mutationFn: partnerShipSubmit,
});
\ No newline at end of file
diff --git a/src/Services/BBPS/apis.ts b/src/Services/BBPS/apis.ts
index 1db2581..394911c 100644
--- a/src/Services/BBPS/apis.ts
+++ b/src/Services/BBPS/apis.ts
@@ -1,5 +1,5 @@
import axios from "axios";
-import { ALL_DESIGNATION, DASHBOARD_COUNT, EMD_CHECK, FORARD_AUCTION_ITEM, GET_MASTER_DATA, GET_MY_AUCTION, GET_MY_TENDER, GET_REGISTRATION_STATE, GET_TENDER_DETAILS, GETCONTRACTORBYSTATE, LIVE_AUCTION, LIVE_TENDER, LOG_IN_URL, PROCEED_PURCHASE_AUCTION, PROCEED_TO_BID, PURCHASE_OFFLINE_AUCTION, PURCHASE_TENDER_OFFLINE, REJ_STAGE_TWO, REVERSE_AUCTION_ITEM, SAVE_CONTRACTOR_STAGE1, SEND_ADHAROTP, STAGETHREE, TENDER_LOGIN, VERIFY_ADHAR, VERIFY_GST,VERIFY_ORGPAN } from "./ApiUrls";
+import { ALL_DESIGNATION, DASHBOARD_COUNT, EMD_CHECK, FORARD_AUCTION_ITEM, GET_MASTER_DATA, GET_MY_AUCTION, GET_MY_TENDER, GET_REGISTRATION_STATE, GET_TENDER_DETAILS, GETCONTRACTORBYSTATE, LIVE_AUCTION, LIVE_TENDER, LOG_IN_URL, PARTNER_API_ENDPOINT, PROCEED_PURCHASE_AUCTION, PROCEED_TO_BID, PURCHASE_OFFLINE_AUCTION, PURCHASE_TENDER_OFFLINE, REJ_STAGE_TWO, REVERSE_AUCTION_ITEM, SAVE_CONTRACTOR_STAGE1, SEND_ADHAROTP, STAGETHREE, TENDER_LOGIN, VERIFY_ADHAR, VERIFY_GST,VERIFY_ORGPAN } from "./ApiUrls";
import { apiCall } from "../../Axios/Axios";
// User
@@ -260,4 +260,14 @@ export const contractorStageThreeSubmit = (
STAGETHREE,
payload,
);
-};
\ No newline at end of file
+};
+
+export const partnerShipSubmit = (
+ payload: any
+): Promise => {
+ return apiCall(
+ 'post',
+ PARTNER_API_ENDPOINT,
+ payload,
+ );
+};