boxpay-checkout-reactnative-sdk 1.0.0-beta09 → 1.0.0-beta23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/ic_trash.png +0 -0
- package/lib/assets/assets/images/ic_trash.png +0 -0
- package/lib/assets/images/ic_trash.png +0 -0
- package/lib/module/components/deleteAddressModal.js +116 -0
- package/lib/module/components/deleteAddressModal.js.map +1 -0
- package/lib/module/components/savedAddressBottomSheet.js +131 -0
- package/lib/module/components/savedAddressBottomSheet.js.map +1 -0
- package/lib/module/components/savedAddressCard.js +7 -11
- package/lib/module/components/savedAddressCard.js.map +1 -1
- package/lib/module/screens/addressScreen.js +1 -15
- package/lib/module/screens/addressScreen.js.map +1 -1
- package/lib/module/screens/mainScreen.js +4 -4
- package/lib/module/screens/mainScreen.js.map +1 -1
- package/lib/module/screens/savedAddressScreen.js +116 -30
- package/lib/module/screens/savedAddressScreen.js.map +1 -1
- package/lib/module/styles/components/savedAddressCardStyles.js +11 -9
- package/lib/module/styles/components/savedAddressCardStyles.js.map +1 -1
- package/lib/module/styles/{savedAddressScreenStyles.js → screens/savedAddressScreenStyles.js} +5 -3
- package/lib/module/styles/screens/savedAddressScreenStyles.js.map +1 -0
- package/lib/module/utils/stringUtils.js +15 -0
- package/lib/module/utils/stringUtils.js.map +1 -1
- package/lib/typescript/src/components/deleteAddressModal.d.ts +9 -0
- package/lib/typescript/src/components/deleteAddressModal.d.ts.map +1 -0
- package/lib/typescript/src/components/savedAddressBottomSheet.d.ts +13 -0
- package/lib/typescript/src/components/savedAddressBottomSheet.d.ts.map +1 -0
- package/lib/typescript/src/components/savedAddressCard.d.ts +2 -1
- package/lib/typescript/src/components/savedAddressCard.d.ts.map +1 -1
- package/lib/typescript/src/screens/addressScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/mainScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/savedAddressScreen.d.ts.map +1 -1
- package/lib/typescript/src/styles/components/savedAddressCardStyles.d.ts +4 -2
- package/lib/typescript/src/styles/components/savedAddressCardStyles.d.ts.map +1 -1
- package/lib/typescript/src/styles/{savedAddressScreenStyles.d.ts → screens/savedAddressScreenStyles.d.ts} +2 -0
- package/lib/typescript/src/styles/screens/savedAddressScreenStyles.d.ts.map +1 -0
- package/lib/typescript/src/utils/stringUtils.d.ts +4 -0
- package/lib/typescript/src/utils/stringUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/deleteAddressModal.tsx +114 -0
- package/src/components/savedAddressBottomSheet.tsx +135 -0
- package/src/components/savedAddressCard.tsx +6 -12
- package/src/screens/addressScreen.tsx +1 -19
- package/src/screens/mainScreen.tsx +4 -6
- package/src/screens/savedAddressScreen.tsx +117 -28
- package/src/styles/components/savedAddressCardStyles.ts +10 -8
- package/src/styles/{savedAddressScreenStyles.ts → screens/savedAddressScreenStyles.ts} +3 -1
- package/src/utils/stringUtils.ts +19 -0
- package/lib/module/styles/savedAddressScreenStyles.js.map +0 -1
- package/lib/typescript/src/styles/savedAddressScreenStyles.d.ts.map +0 -1
|
@@ -34,12 +34,14 @@ declare const styles: {
|
|
|
34
34
|
backgroundColor: string;
|
|
35
35
|
flexDirection: "row";
|
|
36
36
|
borderRadius: number;
|
|
37
|
+
alignItems: "center";
|
|
37
38
|
};
|
|
38
39
|
imageStyle: {
|
|
39
40
|
height: number;
|
|
40
41
|
width: number;
|
|
41
42
|
marginStart: number;
|
|
42
43
|
marginTop: number;
|
|
44
|
+
tintColor: string;
|
|
43
45
|
};
|
|
44
46
|
insideContainerClickableText: {
|
|
45
47
|
fontSize: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savedAddressScreenStyles.d.ts","sourceRoot":"","sources":["../../../../../src/styles/screens/savedAddressScreenStyles.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDV,CAAA;AAEF,eAAe,MAAM,CAAA"}
|
|
@@ -3,4 +3,8 @@ export declare function getEndpoint(env: string): string;
|
|
|
3
3
|
export declare function generateRandomAlphanumericString(length: number): string;
|
|
4
4
|
export declare function getBaseURL(env: string): string;
|
|
5
5
|
export declare function formatAddress(deliveryAddress: DeliveryAddress): string;
|
|
6
|
+
export declare function extractNames(fullName: string): {
|
|
7
|
+
firstName: string;
|
|
8
|
+
lastName: string;
|
|
9
|
+
};
|
|
6
10
|
//# sourceMappingURL=stringUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringUtils.d.ts","sourceRoot":"","sources":["../../../../src/utils/stringUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAavE;AAGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,aAAa,CAAC,eAAe,EAAG,eAAe,GAAI,MAAM,CAMxE"}
|
|
1
|
+
{"version":3,"file":"stringUtils.d.ts","sourceRoot":"","sources":["../../../../src/utils/stringUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAavE;AAGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,aAAa,CAAC,eAAe,EAAG,eAAe,GAAI,MAAM,CAMxE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAcA"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { View, Text, TouchableOpacity, StyleSheet, Image } from "react-native";
|
|
2
|
+
import Modal from "react-native-modal";
|
|
3
|
+
|
|
4
|
+
interface DeletePros {
|
|
5
|
+
visible : boolean,
|
|
6
|
+
onCancel : () => void,
|
|
7
|
+
onDelete : () => void,
|
|
8
|
+
address : string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const DeleteAddressModal = ({ visible, onCancel, onDelete, address } : DeletePros) => {
|
|
12
|
+
return (
|
|
13
|
+
<Modal
|
|
14
|
+
isVisible={visible}
|
|
15
|
+
animationIn="zoomIn"
|
|
16
|
+
animationOut="zoomOut"
|
|
17
|
+
backdropOpacity={0.5}
|
|
18
|
+
onBackdropPress={onCancel}
|
|
19
|
+
useNativeDriver
|
|
20
|
+
>
|
|
21
|
+
<View style={styles.modalContainer}>
|
|
22
|
+
{/* Delete Icon */}
|
|
23
|
+
<Image
|
|
24
|
+
source={require("./assets/ic_delete.png")}
|
|
25
|
+
style={styles.deleteIcon}
|
|
26
|
+
/>
|
|
27
|
+
|
|
28
|
+
{/* Title */}
|
|
29
|
+
<Text style={styles.title}>Proceed to delete this address?</Text>
|
|
30
|
+
|
|
31
|
+
{/* Address Info */}
|
|
32
|
+
<Text style={styles.address}>{address}</Text>
|
|
33
|
+
|
|
34
|
+
{/* Buttons */}
|
|
35
|
+
<View style={styles.buttonRow}>
|
|
36
|
+
<TouchableOpacity style={styles.cancelButton} onPress={onCancel}>
|
|
37
|
+
<Text style={styles.cancelText}>Cancel</Text>
|
|
38
|
+
</TouchableOpacity>
|
|
39
|
+
|
|
40
|
+
<TouchableOpacity style={styles.deleteButton} onPress={onDelete}>
|
|
41
|
+
<Text style={styles.deleteText}>Yes, delete</Text>
|
|
42
|
+
</TouchableOpacity>
|
|
43
|
+
</View>
|
|
44
|
+
</View>
|
|
45
|
+
</Modal>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const styles = StyleSheet.create({
|
|
50
|
+
modalContainer: {
|
|
51
|
+
backgroundColor: "#fff",
|
|
52
|
+
borderRadius: 16,
|
|
53
|
+
padding: 20,
|
|
54
|
+
alignItems: "center",
|
|
55
|
+
justifyContent: "center",
|
|
56
|
+
width: "90%",
|
|
57
|
+
alignSelf: "center",
|
|
58
|
+
},
|
|
59
|
+
deleteIcon: {
|
|
60
|
+
width: 40,
|
|
61
|
+
height: 40,
|
|
62
|
+
marginBottom: 10,
|
|
63
|
+
tintColor: "#FF3B30",
|
|
64
|
+
},
|
|
65
|
+
title: {
|
|
66
|
+
fontSize: 18,
|
|
67
|
+
fontWeight: "700",
|
|
68
|
+
color: "#000",
|
|
69
|
+
textAlign: "center",
|
|
70
|
+
marginBottom: 10,
|
|
71
|
+
},
|
|
72
|
+
address: {
|
|
73
|
+
fontSize: 14,
|
|
74
|
+
color: "#666",
|
|
75
|
+
textAlign: "center",
|
|
76
|
+
marginBottom: 20,
|
|
77
|
+
lineHeight: 20,
|
|
78
|
+
},
|
|
79
|
+
buttonRow: {
|
|
80
|
+
flexDirection: "row",
|
|
81
|
+
justifyContent: "space-between",
|
|
82
|
+
width: "100%",
|
|
83
|
+
marginTop: 10,
|
|
84
|
+
},
|
|
85
|
+
cancelButton: {
|
|
86
|
+
flex: 1,
|
|
87
|
+
marginRight: 8,
|
|
88
|
+
paddingVertical: 12,
|
|
89
|
+
backgroundColor: "#F9F9F9",
|
|
90
|
+
borderRadius: 8,
|
|
91
|
+
borderWidth: 1,
|
|
92
|
+
borderColor: "#E5E5E5",
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
},
|
|
95
|
+
deleteButton: {
|
|
96
|
+
flex: 1,
|
|
97
|
+
paddingVertical: 12,
|
|
98
|
+
backgroundColor: "#0A8754",
|
|
99
|
+
borderRadius: 8,
|
|
100
|
+
alignItems: "center",
|
|
101
|
+
},
|
|
102
|
+
cancelText: {
|
|
103
|
+
fontSize: 16,
|
|
104
|
+
color: "#0A8754",
|
|
105
|
+
fontWeight: "600",
|
|
106
|
+
},
|
|
107
|
+
deleteText: {
|
|
108
|
+
fontSize: 16,
|
|
109
|
+
color: "#fff",
|
|
110
|
+
fontWeight: "600",
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export default DeleteAddressModal;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
View,
|
|
3
|
+
Text,
|
|
4
|
+
TouchableOpacity,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
Image,
|
|
7
|
+
} from "react-native";
|
|
8
|
+
import Modal from "react-native-modal";
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
visible: boolean;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
onEdit: () => void;
|
|
14
|
+
onSetDefault: () => void;
|
|
15
|
+
onDelete: () => void;
|
|
16
|
+
label: string;
|
|
17
|
+
address: string;
|
|
18
|
+
icon: any;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const SavedAddressBottomSheet = ({
|
|
22
|
+
visible,
|
|
23
|
+
onClose,
|
|
24
|
+
onEdit,
|
|
25
|
+
onSetDefault,
|
|
26
|
+
onDelete,
|
|
27
|
+
label,
|
|
28
|
+
address,
|
|
29
|
+
icon,
|
|
30
|
+
}: Props) => {
|
|
31
|
+
return (
|
|
32
|
+
<Modal
|
|
33
|
+
isVisible={visible}
|
|
34
|
+
onBackdropPress={onClose}
|
|
35
|
+
style={styles.modal}
|
|
36
|
+
backdropOpacity={0.4}
|
|
37
|
+
>
|
|
38
|
+
<View style={styles.container}>
|
|
39
|
+
{/* Address Info */}
|
|
40
|
+
<View style={styles.headerContainer}>
|
|
41
|
+
<Image source={icon} style={styles.icon} />
|
|
42
|
+
<View style={styles.textContainer}>
|
|
43
|
+
<Text style={styles.label}>{label}</Text>
|
|
44
|
+
<Text style={styles.address} numberOfLines={1} ellipsizeMode="tail">
|
|
45
|
+
{address}
|
|
46
|
+
</Text>
|
|
47
|
+
</View>
|
|
48
|
+
</View>
|
|
49
|
+
|
|
50
|
+
{/* Divider */}
|
|
51
|
+
<View style={styles.divider} />
|
|
52
|
+
|
|
53
|
+
{/* Options */}
|
|
54
|
+
<TouchableOpacity style={styles.option} onPress={onEdit}>
|
|
55
|
+
<Text style={styles.optionText}>Edit</Text>
|
|
56
|
+
</TouchableOpacity>
|
|
57
|
+
|
|
58
|
+
<TouchableOpacity style={styles.option} onPress={onSetDefault}>
|
|
59
|
+
<Text style={styles.optionText}>Set as Default</Text>
|
|
60
|
+
</TouchableOpacity>
|
|
61
|
+
|
|
62
|
+
{/* Delete Option */}
|
|
63
|
+
<TouchableOpacity style={styles.deleteOption} onPress={onDelete}>
|
|
64
|
+
<Text style={styles.deleteText}>Delete address</Text>
|
|
65
|
+
</TouchableOpacity>
|
|
66
|
+
</View>
|
|
67
|
+
</Modal>
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const styles = StyleSheet.create({
|
|
72
|
+
modal: {
|
|
73
|
+
justifyContent: "flex-end",
|
|
74
|
+
margin: 0,
|
|
75
|
+
},
|
|
76
|
+
container: {
|
|
77
|
+
backgroundColor: "#fff",
|
|
78
|
+
borderTopLeftRadius: 16,
|
|
79
|
+
borderTopRightRadius: 16,
|
|
80
|
+
padding: 16,
|
|
81
|
+
},
|
|
82
|
+
headerContainer: {
|
|
83
|
+
flexDirection: "row",
|
|
84
|
+
alignItems: "center",
|
|
85
|
+
marginBottom: 12,
|
|
86
|
+
},
|
|
87
|
+
icon: {
|
|
88
|
+
width: 24,
|
|
89
|
+
height: 24,
|
|
90
|
+
marginRight: 12,
|
|
91
|
+
tintColor: "#000",
|
|
92
|
+
},
|
|
93
|
+
textContainer: {
|
|
94
|
+
flex: 1,
|
|
95
|
+
},
|
|
96
|
+
label: {
|
|
97
|
+
fontSize: 16,
|
|
98
|
+
fontWeight: "700",
|
|
99
|
+
color: "#000",
|
|
100
|
+
},
|
|
101
|
+
address: {
|
|
102
|
+
fontSize: 14,
|
|
103
|
+
color: "#555",
|
|
104
|
+
marginTop: 4,
|
|
105
|
+
},
|
|
106
|
+
divider: {
|
|
107
|
+
height: 1,
|
|
108
|
+
backgroundColor: "#ECECED",
|
|
109
|
+
marginVertical: 12,
|
|
110
|
+
},
|
|
111
|
+
option: {
|
|
112
|
+
paddingVertical: 14,
|
|
113
|
+
alignItems: "center",
|
|
114
|
+
backgroundColor: "#fff",
|
|
115
|
+
borderRadius: 10,
|
|
116
|
+
marginBottom: 8,
|
|
117
|
+
borderWidth: 1,
|
|
118
|
+
borderColor: "#ECECED",
|
|
119
|
+
},
|
|
120
|
+
optionText: {
|
|
121
|
+
fontSize: 16,
|
|
122
|
+
color: "#000",
|
|
123
|
+
},
|
|
124
|
+
deleteOption: {
|
|
125
|
+
paddingVertical: 14,
|
|
126
|
+
alignItems: "center",
|
|
127
|
+
},
|
|
128
|
+
deleteText: {
|
|
129
|
+
fontSize: 16,
|
|
130
|
+
color: "red",
|
|
131
|
+
fontWeight: "600",
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
export default SavedAddressBottomSheet;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { useState } from "react"
|
|
2
1
|
import type { FetchSavedAddress } from "../interface"
|
|
3
2
|
import { View, Text, Pressable, Image, TouchableOpacity } from 'react-native';
|
|
4
3
|
import { checkoutDetailsHandler } from "../sharedContext/checkoutDetailsHandler";
|
|
@@ -9,20 +8,17 @@ import { userDataHandler } from "../sharedContext/userdataHandler";
|
|
|
9
8
|
|
|
10
9
|
interface SavedAddressComponentArgs {
|
|
11
10
|
savedAddressList : FetchSavedAddress[],
|
|
12
|
-
onClickAddress : (savedAddress : FetchSavedAddress) => void
|
|
11
|
+
onClickAddress : (savedAddress : FetchSavedAddress) => void,
|
|
12
|
+
onClickOtherOptions : (savedAddress : FetchSavedAddress) => void
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
const SavedAddressComponent = ({savedAddressList, onClickAddress} : SavedAddressComponentArgs) => {
|
|
17
|
-
const [/*isOptionsClicked*/, setIsOptionsClicked] = useState<boolean>(false)
|
|
18
|
-
const [/*selectedAddress*/ , setSelectedAddress] = useState<FetchSavedAddress>()
|
|
16
|
+
const SavedAddressComponent = ({savedAddressList, onClickAddress, onClickOtherOptions} : SavedAddressComponentArgs) => {
|
|
19
17
|
const {userData} = userDataHandler
|
|
20
|
-
// const [isDeleteClicked , setIsDeleteClicked] = useState<boolean>(false)
|
|
21
|
-
// const [isEditClicked, setIsEditClicked] = useState<boolean>(false)
|
|
22
18
|
const {checkoutDetails} = checkoutDetailsHandler
|
|
23
19
|
|
|
24
20
|
return(
|
|
25
|
-
<View style={{ paddingBottom: 12 }}>
|
|
21
|
+
<View style={{ paddingBottom: 12, paddingHorizontal:16 }}>
|
|
26
22
|
{savedAddressList.map((address) => (
|
|
27
23
|
<View key={address.addressRef}>
|
|
28
24
|
<SavedAddressCard
|
|
@@ -44,8 +40,7 @@ const SavedAddressComponent = ({savedAddressList, onClickAddress} : SavedAddress
|
|
|
44
40
|
labelType : address.labelType
|
|
45
41
|
})}
|
|
46
42
|
onClickOtherOptions = {()=> {
|
|
47
|
-
|
|
48
|
-
setIsOptionsClicked(true)
|
|
43
|
+
onClickOtherOptions(address)
|
|
49
44
|
}}
|
|
50
45
|
onClickAddress = {()=> onClickAddress(address)}
|
|
51
46
|
brandColor={checkoutDetails.brandColor}
|
|
@@ -83,7 +78,6 @@ const SavedAddressCard = ({isSelected, labelType, address, onClickAddress, onCli
|
|
|
83
78
|
work: require('../../assets/images/ic_work.png'),
|
|
84
79
|
other: require('../../assets/images/ic_other.png'),
|
|
85
80
|
};
|
|
86
|
-
|
|
87
81
|
const addressIcon =
|
|
88
82
|
icons[labelType.toLowerCase() as keyof typeof icons] || icons.other;
|
|
89
83
|
return (
|
|
@@ -115,7 +109,7 @@ const SavedAddressCard = ({isSelected, labelType, address, onClickAddress, onCli
|
|
|
115
109
|
|
|
116
110
|
{/* Address */}
|
|
117
111
|
<Text style={styles.addressText}>{address}</Text>
|
|
118
|
-
<Text style = {styles.addressText}>{phone}</Text>
|
|
112
|
+
<Text style = {styles.addressText}>Mobile: {phone}</Text>
|
|
119
113
|
</Pressable>
|
|
120
114
|
)
|
|
121
115
|
}
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import styles from '../styles/screens/addressScreenStyles.';
|
|
20
20
|
import type { CheckoutStackParamList } from '../navigation';
|
|
21
21
|
import type { NavigationProp } from '@react-navigation/native';
|
|
22
|
+
import { extractNames } from '../utils/stringUtils';
|
|
22
23
|
|
|
23
24
|
type AddressScreenNavigationProp = NavigationProp<CheckoutStackParamList, 'AddressScreen'>;
|
|
24
25
|
|
|
@@ -108,25 +109,6 @@ const AddressScreen = ({ navigation }: Props) => {
|
|
|
108
109
|
}
|
|
109
110
|
};
|
|
110
111
|
|
|
111
|
-
function extractNames(fullName: string): {
|
|
112
|
-
firstName: string;
|
|
113
|
-
lastName: string;
|
|
114
|
-
} {
|
|
115
|
-
const components = fullName
|
|
116
|
-
.trim()
|
|
117
|
-
.split(' ')
|
|
118
|
-
.filter((part) => part !== '');
|
|
119
|
-
|
|
120
|
-
if (components.length === 0) {
|
|
121
|
-
return { firstName: '', lastName: '' };
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const firstName = components[0] || '';
|
|
125
|
-
const lastName = components.slice(1).join(' ') || '';
|
|
126
|
-
|
|
127
|
-
return { firstName, lastName };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
112
|
const onChangeEmailId = (updatedText: string) => {
|
|
131
113
|
setEmailTextField(updatedText);
|
|
132
114
|
const trimmedText = updatedText.trim();
|
|
@@ -486,6 +486,10 @@ const MainScreen = ({route, navigation} : MainScreenProps) => {
|
|
|
486
486
|
setPaymentHandler({
|
|
487
487
|
onPaymentResult: onPaymentResult,
|
|
488
488
|
});
|
|
489
|
+
if(shopperToken != null && shopperToken != "") {
|
|
490
|
+
checkoutDetailsHandler.checkoutDetails.shopperToken = shopperToken
|
|
491
|
+
getRecommendedInstruments()
|
|
492
|
+
}
|
|
489
493
|
callUIAnalytics(AnalyticsEvents.CHECKOUT_LOADED,"Index Screen Session Loaded","")
|
|
490
494
|
break;
|
|
491
495
|
}
|
|
@@ -505,12 +509,6 @@ const MainScreen = ({route, navigation} : MainScreenProps) => {
|
|
|
505
509
|
}
|
|
506
510
|
}
|
|
507
511
|
loadSession()
|
|
508
|
-
|
|
509
|
-
if(shopperToken != null && shopperToken != "") {
|
|
510
|
-
checkoutDetailsHandler.checkoutDetails.shopperToken = shopperToken
|
|
511
|
-
getRecommendedInstruments()
|
|
512
|
-
}
|
|
513
|
-
|
|
514
512
|
}, []);
|
|
515
513
|
|
|
516
514
|
const handleRecommendedSectionClick = (instrumentValue: string) => {
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
Image,
|
|
9
9
|
Pressable
|
|
10
10
|
} from 'react-native';
|
|
11
|
-
import styles from '../styles/savedAddressScreenStyles';
|
|
11
|
+
import styles from '../styles/screens/savedAddressScreenStyles';
|
|
12
12
|
import { useEffect, useState } from 'react';
|
|
13
13
|
import ShimmerView from '../components/shimmerView';
|
|
14
14
|
import LottieView from 'lottie-react-native';
|
|
@@ -16,11 +16,15 @@ import Header from '../components/header';
|
|
|
16
16
|
import { APIStatus, type FetchSavedAddress} from '../interface';
|
|
17
17
|
import fetchSavedAddress from '../postRequest/fetchSavedAddress';
|
|
18
18
|
import Toast from 'react-native-toast-message'
|
|
19
|
-
|
|
19
|
+
import deleteSavedAddress from '../postRequest/deleteSavedAddress';
|
|
20
20
|
import type { CheckoutStackParamList } from '../navigation';
|
|
21
21
|
import type { NavigationProp } from '@react-navigation/native';
|
|
22
22
|
import SavedAddressComponent from '../components/savedAddressCard';
|
|
23
23
|
import { checkoutDetailsHandler } from '../sharedContext/checkoutDetailsHandler';
|
|
24
|
+
import SavedAddressBottomSheet from '../components/savedAddressBottomSheet';
|
|
25
|
+
import { setUserDataHandler, userDataHandler } from '../sharedContext/userdataHandler';
|
|
26
|
+
import { extractNames, formatAddress } from '../utils/stringUtils';
|
|
27
|
+
import DeleteAddressModal from '../components/deleteAddressModal';
|
|
24
28
|
|
|
25
29
|
type AddressScreenNavigationProp = NavigationProp<CheckoutStackParamList, 'AddressScreen'>;
|
|
26
30
|
|
|
@@ -30,9 +34,20 @@ interface Props {
|
|
|
30
34
|
|
|
31
35
|
const SavedAddressScreen = ({ navigation }: Props) => {
|
|
32
36
|
const [isFirstLoad, setIsFirstLoad] = useState(true)
|
|
33
|
-
const [loading,
|
|
37
|
+
const [loading, setLoading] = useState(false)
|
|
38
|
+
const [isEditClicked, setIsEditClicked] = useState(false)
|
|
34
39
|
const [savedAddressList, setSavedAddresList] = useState<FetchSavedAddress[]>([]);
|
|
35
40
|
const {checkoutDetails} = checkoutDetailsHandler
|
|
41
|
+
const [isOptionsClicked, setIsOptionsClicked] = useState<boolean>(false)
|
|
42
|
+
const [isDeleteConfirmationVisible, setIsDeleteConfirmationVisible] = useState<boolean>(false)
|
|
43
|
+
const [selectedAddress,setSelectedAddress] = useState<FetchSavedAddress>()
|
|
44
|
+
const [updateAddress, setUpdateAddress] = useState<boolean>(false)
|
|
45
|
+
|
|
46
|
+
const icons = {
|
|
47
|
+
home: require('../../assets/images/ic_home.png'),
|
|
48
|
+
work: require('../../assets/images/ic_work.png'),
|
|
49
|
+
other: require('../../assets/images/ic_other.png'),
|
|
50
|
+
};
|
|
36
51
|
|
|
37
52
|
const onProceedBack = () => {
|
|
38
53
|
if (!loading) {
|
|
@@ -69,30 +84,30 @@ const SavedAddressScreen = ({ navigation }: Props) => {
|
|
|
69
84
|
fetchAddress()
|
|
70
85
|
}, []);
|
|
71
86
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
87
|
+
const onClickDeleteAddress = async (selectedAddressRef : string) => {
|
|
88
|
+
const response = await deleteSavedAddress(selectedAddressRef)
|
|
89
|
+
switch(response.apiStatus) {
|
|
90
|
+
case APIStatus.Success : {
|
|
91
|
+
setSavedAddresList(prevList =>
|
|
92
|
+
prevList.filter(address => address.addressRef !== selectedAddressRef)
|
|
93
|
+
);
|
|
94
|
+
setLoading(false)
|
|
95
|
+
break
|
|
96
|
+
}
|
|
97
|
+
case APIStatus.Failed : {
|
|
98
|
+
Toast.show({
|
|
99
|
+
type: 'error',
|
|
100
|
+
text1: 'Oops!',
|
|
101
|
+
text2: 'Something went wrong. Please try again.',
|
|
102
|
+
});
|
|
103
|
+
setLoading(false)
|
|
104
|
+
break
|
|
105
|
+
}
|
|
106
|
+
default : {
|
|
107
|
+
break
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
96
111
|
|
|
97
112
|
|
|
98
113
|
useEffect(() => {
|
|
@@ -104,6 +119,35 @@ const SavedAddressScreen = ({ navigation }: Props) => {
|
|
|
104
119
|
backHandler.remove();
|
|
105
120
|
};
|
|
106
121
|
}, []);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
if(updateAddress || isEditClicked) {
|
|
124
|
+
const { firstName, lastName } = extractNames(selectedAddress?.name ?? "");
|
|
125
|
+
setUserDataHandler({
|
|
126
|
+
userData: {
|
|
127
|
+
email: selectedAddress?.email ?? "",
|
|
128
|
+
firstName: firstName,
|
|
129
|
+
lastName: lastName,
|
|
130
|
+
phone: selectedAddress?.phoneNumber ?? "",
|
|
131
|
+
uniqueId: userDataHandler.userData.uniqueId,
|
|
132
|
+
dob: userDataHandler.userData.dob,
|
|
133
|
+
pan: userDataHandler.userData.pan,
|
|
134
|
+
address1: selectedAddress?.address1 ?? "",
|
|
135
|
+
address2: selectedAddress?.address2 ?? "",
|
|
136
|
+
city: selectedAddress?.city ?? "",
|
|
137
|
+
state: selectedAddress?.state ?? "",
|
|
138
|
+
pincode: selectedAddress?.postalCode ?? "",
|
|
139
|
+
country: selectedAddress?.countryCode ?? "",
|
|
140
|
+
labelType: selectedAddress?.labelType ?? "",
|
|
141
|
+
labelName: selectedAddress?.labelName ?? "",
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
if(isEditClicked) {
|
|
145
|
+
navigation.navigate("AddressScreen",{})
|
|
146
|
+
} else {
|
|
147
|
+
navigation.goBack()
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}, [updateAddress, isEditClicked]);
|
|
107
151
|
|
|
108
152
|
return (
|
|
109
153
|
<SafeAreaView style = {styles.screenView}>
|
|
@@ -165,15 +209,60 @@ const SavedAddressScreen = ({ navigation }: Props) => {
|
|
|
165
209
|
>
|
|
166
210
|
<SavedAddressComponent
|
|
167
211
|
savedAddressList={savedAddressList}
|
|
168
|
-
onClickAddress={(address) => {
|
|
212
|
+
onClickAddress={(address : FetchSavedAddress) => {
|
|
213
|
+
setSelectedAddress(address)
|
|
214
|
+
setUpdateAddress(true)
|
|
169
215
|
console.log(address);
|
|
170
216
|
}}
|
|
217
|
+
onClickOtherOptions={(address : FetchSavedAddress) => {
|
|
218
|
+
setSelectedAddress(address)
|
|
219
|
+
setIsOptionsClicked(true)
|
|
220
|
+
}}
|
|
171
221
|
/>
|
|
172
222
|
</ScrollView>
|
|
173
223
|
</>
|
|
174
224
|
)}
|
|
175
225
|
</View>
|
|
176
226
|
)}
|
|
227
|
+
<SavedAddressBottomSheet
|
|
228
|
+
visible={isOptionsClicked}
|
|
229
|
+
onClose={() => setIsOptionsClicked(false)}
|
|
230
|
+
onEdit={() => setIsEditClicked(true)}
|
|
231
|
+
onSetDefault={() => console.log("Set as Default clicked")}
|
|
232
|
+
onDelete={() => setIsDeleteConfirmationVisible(true)}
|
|
233
|
+
label= {selectedAddress?.labelName ? selectedAddress?.labelName ?? "" : selectedAddress?.labelType ?? ""}
|
|
234
|
+
address={formatAddress({
|
|
235
|
+
address1 : selectedAddress?.address1 ?? "",
|
|
236
|
+
address2: selectedAddress?.address2 ?? "",
|
|
237
|
+
city : selectedAddress?.city ?? "",
|
|
238
|
+
state : selectedAddress?.state ?? "",
|
|
239
|
+
postalCode : selectedAddress?.postalCode ?? "",
|
|
240
|
+
countryCode : selectedAddress?.countryCode ?? "",
|
|
241
|
+
labelName : selectedAddress?.labelName ?? "",
|
|
242
|
+
labelType : selectedAddress?.labelType ?? ""
|
|
243
|
+
})}
|
|
244
|
+
icon={icons[selectedAddress?.labelType.toLowerCase() as keyof typeof icons] || icons.other}
|
|
245
|
+
/>
|
|
246
|
+
|
|
247
|
+
<DeleteAddressModal
|
|
248
|
+
visible={isDeleteConfirmationVisible}
|
|
249
|
+
onCancel={() => setIsDeleteConfirmationVisible(false)}
|
|
250
|
+
onDelete={() => {
|
|
251
|
+
setIsDeleteConfirmationVisible(false);
|
|
252
|
+
console.log("Address deleted");
|
|
253
|
+
onClickDeleteAddress(selectedAddress?.addressRef ?? "")
|
|
254
|
+
}}
|
|
255
|
+
address={formatAddress({
|
|
256
|
+
address1 : selectedAddress?.address1 ?? "",
|
|
257
|
+
address2: selectedAddress?.address2 ?? "",
|
|
258
|
+
city : selectedAddress?.city ?? "",
|
|
259
|
+
state : selectedAddress?.state ?? "",
|
|
260
|
+
postalCode : selectedAddress?.postalCode ?? "",
|
|
261
|
+
countryCode : selectedAddress?.countryCode ?? "",
|
|
262
|
+
labelName : selectedAddress?.labelName ?? "",
|
|
263
|
+
labelType : selectedAddress?.labelType ?? ""
|
|
264
|
+
})}
|
|
265
|
+
/>
|
|
177
266
|
</SafeAreaView>
|
|
178
267
|
)
|
|
179
268
|
}
|
|
@@ -30,26 +30,28 @@ const styles = StyleSheet.create({
|
|
|
30
30
|
gap: 6,
|
|
31
31
|
},
|
|
32
32
|
labelName: {
|
|
33
|
-
fontSize:
|
|
34
|
-
|
|
35
|
-
color: "#
|
|
33
|
+
fontSize: 14,
|
|
34
|
+
fontFamily: 'Poppins-SemiBold',
|
|
35
|
+
color: "#2D2B32",
|
|
36
36
|
},
|
|
37
37
|
selectedTag: {
|
|
38
|
-
backgroundColor: "#
|
|
38
|
+
backgroundColor: "#FFF0F6",
|
|
39
39
|
paddingHorizontal: 8,
|
|
40
40
|
paddingVertical: 2,
|
|
41
41
|
borderRadius: 6,
|
|
42
42
|
marginLeft: 8,
|
|
43
|
+
borderColor:"#FFADD2"
|
|
43
44
|
},
|
|
44
45
|
selectedTagText: {
|
|
45
46
|
fontSize: 10,
|
|
46
|
-
|
|
47
|
-
color: "#
|
|
47
|
+
fontFamily: 'Poppins-Medium',
|
|
48
|
+
color: "#EB2F96",
|
|
48
49
|
},
|
|
49
50
|
addressText: {
|
|
50
51
|
marginTop: 10,
|
|
51
|
-
fontSize:
|
|
52
|
-
|
|
52
|
+
fontSize: 12,
|
|
53
|
+
fontFamily: 'Poppins-Regular',
|
|
54
|
+
color: "#7F7D83",
|
|
53
55
|
lineHeight: 20,
|
|
54
56
|
},
|
|
55
57
|
imageStyle : {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StyleSheet } from "react-native";
|
|
2
|
-
import { checkoutDetailsHandler } from "
|
|
2
|
+
import { checkoutDetailsHandler } from "../../sharedContext/checkoutDetailsHandler";
|
|
3
3
|
|
|
4
4
|
const {brandColor} = checkoutDetailsHandler.checkoutDetails
|
|
5
5
|
|
|
@@ -37,12 +37,14 @@ const styles = StyleSheet.create({
|
|
|
37
37
|
backgroundColor: 'white',
|
|
38
38
|
flexDirection: 'row',
|
|
39
39
|
borderRadius: 12,
|
|
40
|
+
alignItems:'center'
|
|
40
41
|
},
|
|
41
42
|
imageStyle : {
|
|
42
43
|
height: 20,
|
|
43
44
|
width: 20,
|
|
44
45
|
marginStart: 12,
|
|
45
46
|
marginTop: 20,
|
|
47
|
+
tintColor: brandColor
|
|
46
48
|
},
|
|
47
49
|
insideContainerClickableText : {
|
|
48
50
|
fontSize: 14,
|