@propel-nsl/propel-react-native-sdk 1.0.0

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.
Files changed (221) hide show
  1. package/assets/fonts/Lexend-Black.ttf +0 -0
  2. package/assets/fonts/Lexend-Bold.ttf +0 -0
  3. package/assets/fonts/Lexend-ExtraBold.ttf +0 -0
  4. package/assets/fonts/Lexend-ExtraLight.ttf +0 -0
  5. package/assets/fonts/Lexend-Light.ttf +0 -0
  6. package/assets/fonts/Lexend-Medium.ttf +0 -0
  7. package/assets/fonts/Lexend-Regular.ttf +0 -0
  8. package/assets/fonts/Lexend-SemiBold.ttf +0 -0
  9. package/assets/fonts/Lexend-Thin.ttf +0 -0
  10. package/assets/images/HomeGoods.png +0 -0
  11. package/assets/images/accessories.png +0 -0
  12. package/assets/images/amazon.png +0 -0
  13. package/assets/images/apnaClubLogo.png +0 -0
  14. package/assets/images/apparel.png +0 -0
  15. package/assets/images/backgroundblue.png +0 -0
  16. package/assets/images/bannerCard.png +0 -0
  17. package/assets/images/bottomWave.png +0 -0
  18. package/assets/images/coin_1_1.png +0 -0
  19. package/assets/images/flipkart.png +0 -0
  20. package/assets/images/frame_1171278967.png +0 -0
  21. package/assets/images/gift.png +0 -0
  22. package/assets/images/herobanner.png +0 -0
  23. package/assets/images/hinduPencilsLogo.png +0 -0
  24. package/assets/images/icons/addwhiteicon.png +0 -0
  25. package/assets/images/icons/arrow-back.png +0 -0
  26. package/assets/images/icons/arrowgreen.png +0 -0
  27. package/assets/images/icons/arrowred.png +0 -0
  28. package/assets/images/icons/arrowright.png +0 -0
  29. package/assets/images/icons/arrowup.png +0 -0
  30. package/assets/images/icons/blackarrowdown.png +0 -0
  31. package/assets/images/icons/blackarrowup.png +0 -0
  32. package/assets/images/icons/blackcross.png +0 -0
  33. package/assets/images/icons/call.png +0 -0
  34. package/assets/images/icons/camera.png +0 -0
  35. package/assets/images/icons/cart.png +0 -0
  36. package/assets/images/icons/chat.png +0 -0
  37. package/assets/images/icons/circleblack.png +0 -0
  38. package/assets/images/icons/copy.png +0 -0
  39. package/assets/images/icons/cross.png +0 -0
  40. package/assets/images/icons/delete.png +0 -0
  41. package/assets/images/icons/delivery.png +0 -0
  42. package/assets/images/icons/eVoucher.png +0 -0
  43. package/assets/images/icons/editIcon.png +0 -0
  44. package/assets/images/icons/email.png +0 -0
  45. package/assets/images/icons/eye.png +0 -0
  46. package/assets/images/icons/faq.png +0 -0
  47. package/assets/images/icons/filtericon.png +0 -0
  48. package/assets/images/icons/greyDownArrow.png +0 -0
  49. package/assets/images/icons/help.png +0 -0
  50. package/assets/images/icons/home.png +0 -0
  51. package/assets/images/icons/homeinactive.png +0 -0
  52. package/assets/images/icons/i_blackicon.png +0 -0
  53. package/assets/images/icons/i_icon.png +0 -0
  54. package/assets/images/icons/location.png +0 -0
  55. package/assets/images/icons/logout.png +0 -0
  56. package/assets/images/icons/minus.png +0 -0
  57. package/assets/images/icons/myOrders.png +0 -0
  58. package/assets/images/icons/orders.png +0 -0
  59. package/assets/images/icons/pencillogo.png +0 -0
  60. package/assets/images/icons/pending.png +0 -0
  61. package/assets/images/icons/plus.png +0 -0
  62. package/assets/images/icons/redCross.png +0 -0
  63. package/assets/images/icons/redCrossicon.png +0 -0
  64. package/assets/images/icons/redWarningicon.png +0 -0
  65. package/assets/images/icons/redeem.png +0 -0
  66. package/assets/images/icons/redeemactive.png +0 -0
  67. package/assets/images/icons/redemptionHistory.png +0 -0
  68. package/assets/images/icons/redhelpicon.png +0 -0
  69. package/assets/images/icons/search.png +0 -0
  70. package/assets/images/icons/stopwatch.png +0 -0
  71. package/assets/images/icons/successTick.gif +0 -0
  72. package/assets/images/icons/tick.png +0 -0
  73. package/assets/images/icons/tnc.png +0 -0
  74. package/assets/images/icons/user.png +0 -0
  75. package/assets/images/icons/userredicon.png +0 -0
  76. package/assets/images/icons/wavecorner.png +0 -0
  77. package/assets/images/logo.png +0 -0
  78. package/assets/images/myntra_copy.png +0 -0
  79. package/assets/images/nike.png +0 -0
  80. package/assets/images/oq3p0u0_1.png +0 -0
  81. package/assets/images/profileicon.png +0 -0
  82. package/assets/images/topWave.png +0 -0
  83. package/assets/images/zagglePropelLogo.png +0 -0
  84. package/index.ts +23 -0
  85. package/lib/index.ts +25 -0
  86. package/package.json +70 -0
  87. package/src/PropelSDKScreen.tsx +98 -0
  88. package/src/SDKApp.tsx +540 -0
  89. package/src/bridge/SDKBridge.ts +104 -0
  90. package/src/bridge/index.ts +3 -0
  91. package/src/components/SDKBackHandler.tsx +187 -0
  92. package/src/components/SDKProfile.tsx +87 -0
  93. package/src/components/SDKProfileWrapper.tsx +51 -0
  94. package/src/constants.ts +10 -0
  95. package/src/contexts/SDKContext.tsx +72 -0
  96. package/src/hooks/useSDKBackNavigation.ts +61 -0
  97. package/src/navigation/SDKMainTabNavigator.tsx +315 -0
  98. package/src/navigation/SDKNavigator.tsx +41 -0
  99. package/src/redux/store.ts +32 -0
  100. package/src/screens/Dashboard/index.tsx +531 -0
  101. package/src/screens/Dashboard/styles.ts +512 -0
  102. package/src/screens/DeliveryAddress/index.tsx +221 -0
  103. package/src/screens/DeliveryAddress/styles.ts +122 -0
  104. package/src/screens/E-Vouchers/index.tsx +157 -0
  105. package/src/screens/E-Vouchers/styles.ts +106 -0
  106. package/src/screens/Faq/Faq.constants.ts +164 -0
  107. package/src/screens/Faq/index.tsx +114 -0
  108. package/src/screens/Faq/styles.ts +131 -0
  109. package/src/screens/Help/index.tsx +128 -0
  110. package/src/screens/Help/styles.ts +121 -0
  111. package/src/screens/Login/index.tsx +215 -0
  112. package/src/screens/Login/styles.ts +134 -0
  113. package/src/screens/MyCart/MyCart.constants.ts +13 -0
  114. package/src/screens/MyCart/index.tsx +318 -0
  115. package/src/screens/MyCart/styles.ts +249 -0
  116. package/src/screens/MyOrders/index.tsx +87 -0
  117. package/src/screens/MyOrders/styles.ts +281 -0
  118. package/src/screens/MyProfile/index.tsx +72 -0
  119. package/src/screens/MyProfile/styles.ts +47 -0
  120. package/src/screens/NewDeliveryAddress/index.tsx +360 -0
  121. package/src/screens/NewDeliveryAddress/styles.ts +68 -0
  122. package/src/screens/Onboarding/index.tsx +57 -0
  123. package/src/screens/Onboarding/styles.ts +60 -0
  124. package/src/screens/OrdersDetails/index.tsx +333 -0
  125. package/src/screens/OrdersDetails/styles.ts +262 -0
  126. package/src/screens/OtpVerification/index.tsx +283 -0
  127. package/src/screens/OtpVerification/styles.ts +197 -0
  128. package/src/screens/PaymentMethod/index.tsx +389 -0
  129. package/src/screens/PaymentMethod/styles.ts +246 -0
  130. package/src/screens/PointsLog/index.tsx +286 -0
  131. package/src/screens/PointsLog/styles.ts +156 -0
  132. package/src/screens/ProductDetails/index.tsx +682 -0
  133. package/src/screens/ProductDetails/styles.ts +372 -0
  134. package/src/screens/Profile/index.tsx +368 -0
  135. package/src/screens/Profile/styles.ts +158 -0
  136. package/src/screens/RedemptionHistory/RedemptionHistory.constants.ts +4 -0
  137. package/src/screens/RedemptionHistory/index.tsx +304 -0
  138. package/src/screens/RedemptionHistory/styles.ts +84 -0
  139. package/src/screens/Reedem/index.tsx +345 -0
  140. package/src/screens/Reedem/styles.ts +269 -0
  141. package/src/screens/TnC/TnC.constants.ts +169 -0
  142. package/src/screens/TnC/index.tsx +83 -0
  143. package/src/screens/TnC/styles.ts +88 -0
  144. package/src/screens/TransactionSuccessful/index.tsx +77 -0
  145. package/src/screens/TransactionSuccessful/styles.ts +77 -0
  146. package/src/screens/Verification/index.tsx +58 -0
  147. package/src/screens/Verification/styles.ts +74 -0
  148. package/src/screens/index.ts +23 -0
  149. package/src/types/index.ts +46 -0
  150. package/src-app/components/AmountBreakDownModal/index.tsx +86 -0
  151. package/src-app/components/AmountBreakDownModal/styles.ts +110 -0
  152. package/src-app/components/BottomNavIcons.tsx +125 -0
  153. package/src-app/components/Button.tsx +120 -0
  154. package/src-app/components/Card.tsx +47 -0
  155. package/src-app/components/ConfirmPopup/ConfirmPopup.constants.ts +25 -0
  156. package/src-app/components/ConfirmPopup/index.tsx +48 -0
  157. package/src-app/components/ConfirmPopup/styles.ts +167 -0
  158. package/src-app/components/CustomButton/index.tsx +67 -0
  159. package/src-app/components/CustomButton/styles.ts +44 -0
  160. package/src-app/components/CustomCard/index.tsx +221 -0
  161. package/src-app/components/CustomCard/styles.ts +184 -0
  162. package/src-app/components/CustomError/index.tsx +54 -0
  163. package/src-app/components/CustomError/styles.ts +41 -0
  164. package/src-app/components/CustomImage/index.tsx +37 -0
  165. package/src-app/components/CustomImage/styles.ts +5 -0
  166. package/src-app/components/CustomLoader/index.tsx +45 -0
  167. package/src-app/components/CustomLoader/styles.ts +35 -0
  168. package/src-app/components/CustomMessagePopUp/index.tsx +51 -0
  169. package/src-app/components/CustomMessagePopUp/styles.ts +74 -0
  170. package/src-app/components/CustomProductCard/index.tsx +13 -0
  171. package/src-app/components/CustomProductCard/styles.ts +5 -0
  172. package/src-app/components/FilterModal.tsx +372 -0
  173. package/src-app/components/Footer/index.tsx +23 -0
  174. package/src-app/components/Footer/styles.ts +37 -0
  175. package/src-app/components/Icon.tsx +80 -0
  176. package/src-app/components/Logout/index.tsx +82 -0
  177. package/src-app/components/Logout/styles.ts +116 -0
  178. package/src-app/components/MobileHeader.tsx +141 -0
  179. package/src-app/components/NoDataFound/index.tsx +18 -0
  180. package/src-app/components/NoDataFound/styles.ts +26 -0
  181. package/src-app/components/OTPModal.tsx +747 -0
  182. package/src-app/components/ProfileField.tsx +47 -0
  183. package/src-app/components/QuantityModal/index.tsx +113 -0
  184. package/src-app/components/QuantityModal/styles.ts +84 -0
  185. package/src-app/components/TabBarIcons.tsx +110 -0
  186. package/src-app/components/TextInput.tsx +79 -0
  187. package/src-app/components/ToastConfig.tsx +60 -0
  188. package/src-app/components/index.ts +18 -0
  189. package/src-app/config/env.ts +22 -0
  190. package/src-app/constants/Fonts.ts +12 -0
  191. package/src-app/constants/Formatter.ts +39 -0
  192. package/src-app/constants/HtmlSanitization.ts +46 -0
  193. package/src-app/constants/Images.ts +81 -0
  194. package/src-app/constants/Labels.ts +8 -0
  195. package/src-app/constants/Messages.ts +108 -0
  196. package/src-app/constants/Routes.ts +17 -0
  197. package/src-app/constants/Scaling.ts +5 -0
  198. package/src-app/constants/Text.ts +8 -0
  199. package/src-app/constants/offSets.ts +18 -0
  200. package/src-app/hooks/useAppDispatch.ts +4 -0
  201. package/src-app/hooks/useAppSelector.ts +4 -0
  202. package/src-app/hooks/useBackHandler.ts +47 -0
  203. package/src-app/hooks/useScreenBackHandler.ts +91 -0
  204. package/src-app/navigation/AppNavigator.tsx +34 -0
  205. package/src-app/navigation/MainTabNavigator.tsx +294 -0
  206. package/src-app/redux/authSaga.ts +605 -0
  207. package/src-app/redux/authSlice.ts +754 -0
  208. package/src-app/redux/rootSaga.ts +6 -0
  209. package/src-app/redux/store.ts +25 -0
  210. package/src-app/services/api.ts +14 -0
  211. package/src-app/services/endpoints.ts +33 -0
  212. package/src-app/services/index.ts +574 -0
  213. package/src-app/services/sdkCredentials.ts +44 -0
  214. package/src-app/styles/colors.ts +85 -0
  215. package/src-app/styles/shared.ts +112 -0
  216. package/src-app/types/authTypes.ts +155 -0
  217. package/src-app/types/navigation.ts +99 -0
  218. package/src-app/utils/Validation.ts +48 -0
  219. package/src-app/utils/filterPins.ts +29 -0
  220. package/src-app/utils/navigationUtils.ts +43 -0
  221. package/src-app/utils/useHardwareBack.ts +21 -0
@@ -0,0 +1,345 @@
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ ScrollView,
6
+ TouchableOpacity,
7
+ SafeAreaView,
8
+ Dimensions,
9
+ TextInput,
10
+ } from 'react-native';
11
+ import Svg, { Path, G, Defs, ClipPath, Rect } from 'react-native-svg';
12
+ import { useFocusEffect, useNavigation } from '@react-navigation/native';
13
+ import { AppStackParamList, ProductData } from '../../../src-app/types/navigation';
14
+ import styles from './styles';
15
+ import { StackNavigationProp } from '@react-navigation/stack';
16
+ import { useAppDispatch } from '../../../src-app/hooks/useAppDispatch';
17
+ import {
18
+ myProductsListRequest,
19
+ productTypesRequest,
20
+ resetAuthState,
21
+ } from '../../../src-app/redux/authSlice';
22
+ import { useAppSelector } from '../../../src-app/hooks/useAppSelector';
23
+ import { RootState } from '../../../src-app/redux/store';
24
+ import {
25
+ CustomImage,
26
+ CustomLoader,
27
+ CustomMessagePopUp,
28
+ FilterModal,
29
+ NoDataFound,
30
+ } from '../../../src-app/components';
31
+ import Images from '../../../src-app/constants/Images';
32
+ import { colors } from '../../../src-app/styles/colors';
33
+ import { CATEGORY_LABELS } from '../../../src-app/constants/Labels';
34
+ import { formatPointsRange } from '../../../src-app/constants/Formatter';
35
+ import { NUMBER } from '../../../src-app/constants/Messages';
36
+ import { MAP, PUSH, REDUCE } from '../../../src-app/utils/filterPins';
37
+ import { ROUTES } from '../../../src-app/constants/Routes';
38
+
39
+ const AmbraneIcon: React.FC = () => (
40
+ <Svg width="45" height="6" viewBox="0 0 46 6" fill="none">
41
+ <G clipPath="url(#clip0_244_4835)">
42
+ <Path
43
+ d="M13.07 1.7372C12.6479 1.40724 12.1502 1.23657 11.5848 1.23657C11.0194 1.23657 10.3704 1.46034 9.90857 1.90029C9.44671 2.34024 9.21179 2.8788 9.21179 3.50079C9.21179 4.12279 9.44671 4.65756 9.90857 5.09751C10.3704 5.53746 10.9358 5.76122 11.5848 5.76122C12.2338 5.76122 12.6479 5.59435 13.07 5.26059V5.76122H13.9579V1.24037H13.07V1.7372ZM12.636 2.49953C12.9226 2.7726 13.07 3.11015 13.07 3.50079C13.07 3.89144 12.9226 4.22519 12.636 4.50206C12.3493 4.77513 11.9949 4.91546 11.5848 4.91546C11.1747 4.91546 10.8243 4.77513 10.5337 4.50206C10.247 4.22519 10.0997 3.88765 10.0997 3.50079C10.0997 3.11394 10.247 2.7726 10.5337 2.49953C10.8243 2.22646 11.1787 2.08613 11.5848 2.08613C11.9909 2.08613 12.3453 2.22646 12.636 2.49953Z"
44
+ fill="#FF5206"
45
+ />
46
+ <Path
47
+ d="M19.5122 1.24023C18.9309 1.24023 18.4451 1.45642 18.0669 1.88878C17.6926 1.45642 17.2069 1.24023 16.6176 1.24023C16.0283 1.24023 15.9089 1.33505 15.6142 1.52089V1.24023H14.7263V5.76109H15.6142V3.04175C15.6142 2.77626 15.7098 2.55629 15.9049 2.36666C16.104 2.17702 16.3389 2.086 16.6176 2.086C16.8963 2.086 17.1312 2.17702 17.3263 2.37045C17.5254 2.55629 17.6209 2.77626 17.6209 3.04554V5.76489H18.5049V3.04175C18.5049 2.77626 18.6004 2.55629 18.7955 2.36666C18.9946 2.17702 19.2295 2.086 19.5082 2.086C19.7869 2.086 20.0218 2.17702 20.2169 2.37045C20.416 2.55629 20.5116 2.77626 20.5116 3.04554V5.76489H21.3995V3.04175C21.3995 2.54491 21.2123 2.11634 20.846 1.76742C20.4837 1.41849 20.0338 1.24023 19.5122 1.24023Z"
48
+ fill="#FF5206"
49
+ />
50
+ <Path
51
+ d="M24.4891 1.24032C23.9237 1.24032 23.426 1.40719 23.004 1.74095V0.00390625H22.1161V5.76117H23.004V5.26054C23.426 5.59051 23.9237 5.76117 24.4891 5.76117C25.0545 5.76117 25.7035 5.53741 26.1654 5.09746C26.6272 4.65751 26.8621 4.11895 26.8621 3.50075C26.8621 2.88254 26.6272 2.34019 26.1654 1.90024C25.6995 1.46029 25.1381 1.24032 24.4891 1.24032ZM25.9743 3.50075C25.9743 3.8876 25.8269 4.22514 25.5363 4.50201C25.2496 4.77508 24.8952 4.91541 24.4891 4.91541C24.083 4.91541 23.7247 4.77508 23.438 4.50201C23.1513 4.22514 23.004 3.8876 23.004 3.50075C23.004 3.11389 23.1513 2.77255 23.438 2.49948C23.7247 2.22641 24.079 2.08608 24.4891 2.08608C24.8992 2.08608 25.2496 2.22641 25.5363 2.49948C25.8269 2.77255 25.9743 3.1101 25.9743 3.50075Z"
52
+ fill="#FF5206"
53
+ />
54
+ <Path
55
+ d="M29.936 1.24023H29.8125C29.2471 1.24023 28.7494 1.40711 28.3274 1.74087V1.24023H27.4435V5.76489H28.3274V3.50066C28.3274 3.11381 28.4747 2.77626 28.7614 2.50319C29.052 2.22633 29.4064 2.086 29.8125 2.086H29.936V1.24023Z"
56
+ fill="#FF5206"
57
+ />
58
+ <Path
59
+ d="M33.7623 1.7372C33.3403 1.40724 32.8426 1.23657 32.2772 1.23657C31.7118 1.23657 31.0628 1.46034 30.601 1.90029C30.1391 2.34024 29.9042 2.8788 29.9042 3.50079C29.9042 4.12279 30.1391 4.65756 30.601 5.09751C31.0628 5.53746 31.6282 5.76122 32.2772 5.76122C32.9262 5.76122 33.3403 5.59435 33.7623 5.26059V5.76122H34.6502V1.24037H33.7623V1.7372ZM33.3283 2.49953C33.615 2.7726 33.7623 3.11015 33.7623 3.50079C33.7623 3.89144 33.615 4.22519 33.3283 4.50206C33.0417 4.77513 32.6873 4.91546 32.2772 4.91546C31.8671 4.91546 31.5167 4.77513 31.2261 4.50206C30.9394 4.22519 30.7921 3.88765 30.7921 3.50079C30.7921 3.11394 30.9394 2.7726 31.2261 2.49953C31.5167 2.22646 31.8711 2.08613 32.2772 2.08613C32.6833 2.08613 33.0417 2.22646 33.3283 2.49953Z"
60
+ fill="#FF5206"
61
+ />
62
+ <Path
63
+ d="M37.7599 1.24027C37.1945 1.24027 36.6968 1.40715 36.2747 1.7409V1.2251H35.3868V5.76492H36.2747V3.5007C36.2747 3.11005 36.4221 2.77251 36.7087 2.49943C36.9994 2.22636 37.3537 2.08603 37.7599 2.08603C38.166 2.08603 38.5204 2.22636 38.807 2.49943C39.0977 2.77251 39.245 3.11005 39.245 3.5007V5.76113H40.1329V3.5007C40.1329 2.8787 39.898 2.34014 39.4361 1.90019C38.9743 1.46024 38.4089 1.24027 37.7599 1.24027Z"
64
+ fill="#FF5206"
65
+ />
66
+ <Path
67
+ d="M44.8033 1.90395C44.3414 1.464 43.7761 1.24023 43.1231 1.24023C42.4701 1.24023 41.9087 1.464 41.4468 1.90395C40.9889 2.3439 40.754 2.88246 40.754 3.50066C40.754 4.11887 40.9889 4.65743 41.4508 5.09738C41.9127 5.53733 42.4781 5.76109 43.1271 5.76109C43.7761 5.76109 44.7277 5.36286 45.2015 4.57778H44.0906C43.8238 4.80534 43.5013 4.91912 43.1271 4.91912C42.7528 4.91912 42.4582 4.81293 42.1874 4.60433C41.9565 4.41849 41.7972 4.19472 41.7096 3.92544H45.4324L45.4603 3.8458C45.4682 3.82304 45.4682 3.80408 45.4722 3.78891C45.4921 3.70168 45.5001 3.60307 45.5001 3.50066C45.5001 2.88246 45.2652 2.3439 44.8033 1.90395ZM41.7136 3.07589C41.8012 2.8104 41.9605 2.58663 42.1874 2.40458C42.4542 2.19219 42.7727 2.08221 43.1271 2.08221C43.4814 2.08221 43.8039 2.1884 44.0667 2.40458C44.2976 2.58284 44.4569 2.80661 44.5445 3.07589H41.7136Z"
68
+ fill="#FF5206"
69
+ />
70
+ <Path
71
+ d="M5.07485 0.743363C4.88374 0.307206 4.42984 0 3.90427 0C3.37869 0 2.87303 0.345133 2.7058 0.823009C2.61025 1.05057 2.59034 1.31226 2.65803 1.61188C2.87303 2.56764 2.55052 3.14033 1.63874 3.53856C1.54716 3.58028 1.45558 3.61821 1.36002 3.64475H1.35604C1.08131 3.73957 0.850381 3.91403 0.69908 4.14159C0.57565 4.32743 0.5 4.5512 0.5 4.78635C0.5 5.15044 0.667227 5.47661 0.933994 5.69659C1.15696 5.88243 1.44762 5.99241 1.76615 5.99241C2.43506 5.99241 2.98452 5.49558 3.02831 4.86979C3.02831 4.84324 3.02831 4.81669 3.02831 4.79014V4.75601C3.02831 4.54741 2.99646 4.33881 2.9885 4.13022C2.96063 3.24273 3.2473 2.84071 4.07149 2.4842C4.21881 2.41972 4.36613 2.34766 4.50549 2.26043C4.66077 2.18078 4.79614 2.067 4.90365 1.93426C5.06689 1.73325 5.16245 1.47914 5.16245 1.20228C5.16245 0.925411 5.12662 0.883692 5.06689 0.743363H5.07485Z"
72
+ fill="#FF5206"
73
+ />
74
+ <Path
75
+ d="M6.04239 6.00003C6.74167 6.00003 7.30854 5.46005 7.30854 4.79396C7.30854 4.12787 6.74167 3.58789 6.04239 3.58789C5.34312 3.58789 4.77625 4.12787 4.77625 4.79396C4.77625 5.46005 5.34312 6.00003 6.04239 6.00003Z"
76
+ fill="#FF5206"
77
+ />
78
+ </G>
79
+ <Defs>
80
+ <ClipPath id="clip0_244_4835">
81
+ <Rect width="45" height="6" fill="white" transform="translate(0.5)" />
82
+ </ClipPath>
83
+ </Defs>
84
+ </Svg>
85
+ );
86
+
87
+ const TitanLogo: React.FC = () => (
88
+ <Svg width="22" height="14" viewBox="0 0 22 14" fill="none">
89
+ <Path
90
+ d="M7.33203 2.98438H9.82812V13H12.8496V2.98438H15.3457V0.351562H7.33203V2.98438ZM17.1348 13H20.1562V0.351562H17.1348V13Z"
91
+ fill="#000000"
92
+ />
93
+ </Svg>
94
+ );
95
+
96
+ const RayBanLogo: React.FC = () => (
97
+ <Svg width="21" height="11" viewBox="0 0 21 11" fill="none">
98
+ <Path
99
+ d="M3.5 0.5H17.5C18.8807 0.5 20 1.61929 20 3V8C20 9.38071 18.8807 10.5 17.5 10.5H3.5C2.11929 10.5 1 9.38071 1 8V3C1 1.61929 2.11929 0.5 3.5 0.5Z"
100
+ stroke="#000000"
101
+ strokeWidth="1"
102
+ />
103
+ <Path
104
+ d="M7 3C7 2.44772 7.44772 2 8 2H13C13.5523 2 14 2.44772 14 3V8C14 8.55228 13.5523 9 13 9H8C7.44772 9 7 8.55228 7 8V3Z"
105
+ fill="#000000"
106
+ />
107
+ </Svg>
108
+ );
109
+
110
+ const getCategoryLabel = (category: string) => CATEGORY_LABELS[category] ?? "";
111
+
112
+ const ProductCard: React.FC<{
113
+ title: string;
114
+ imageUrl: string;
115
+ category: string;
116
+ logo?: React.ReactNode;
117
+ backgroundColor?: string;
118
+ onPress: () => void;
119
+ priceCents: number
120
+ }> = ({
121
+ title,
122
+ imageUrl,
123
+ category,
124
+ logo,
125
+ backgroundColor = colors.orderDetailsBackground,
126
+ onPress,
127
+ priceCents=0,
128
+ }) => (
129
+ <TouchableOpacity style={styles.productCard} onPress={onPress}>
130
+ <View style={[styles.productImageContainer, { backgroundColor }]}>
131
+ {logo && <View style={styles.logoContainer}>{logo}</View>}
132
+ <CustomImage source={{ uri: imageUrl }} imgStyle={styles.productImage} />
133
+ <View style={styles.categoryBadge}>
134
+ <Text style={styles.categoryText}>{getCategoryLabel(category)}</Text>
135
+ </View>
136
+ </View>
137
+ <View style={styles.productInfo}>
138
+ <Text style={styles.productTitle}>{title}</Text>
139
+ <Text style={styles.productPoints}>
140
+ {((priceCents ?? 0) / 100)} Points
141
+ </Text>
142
+
143
+ </View>
144
+ </TouchableOpacity>
145
+ );
146
+
147
+ const Redeem: React.FC = () => {
148
+ type ProductDetailNavigationProp = StackNavigationProp<
149
+ AppStackParamList,
150
+ 'ProductDetail'
151
+ >;
152
+
153
+ const navigation = useNavigation<ProductDetailNavigationProp>();
154
+ const dispatch = useAppDispatch();
155
+ const [isFilterModalVisible, setIsFilterModalVisible] = useState(false);
156
+ const [searchQuery, setSearchQuery] = useState('');
157
+ const [messagepopUpVisible, setMessagepopUpVisible] = useState(false);
158
+ const DEFAULT_FILTERS = { productType: 'Physical Voucher', categories: [] as string[] };
159
+ const [selectedFilters, setSelectedFilters] = useState(DEFAULT_FILTERS);
160
+
161
+
162
+ const { myProductsListError, viewMyCartData } = useAppSelector(
163
+ (state: RootState) => state.auth,
164
+ );
165
+
166
+ const screenWidth = Dimensions.get('window').width;
167
+ const cardWidth = (screenWidth - 60) / 2;
168
+
169
+ const handleProductPress = (product: ProductData) => {
170
+ console.log('🚀 Redeem navigating to ProductDetail with id:', product?.id);
171
+ // In SDK, ProductDetail is a hidden tab, not nested inside DashboardTab
172
+ // Navigate directly to the ProductDetail tab
173
+ navigation.navigate(ROUTES.ProductDetail as any, {
174
+ id: product?.id,
175
+ from: ROUTES.REDEEM
176
+ });
177
+ };
178
+
179
+ const { productTypesData, myProductsListLoading } = useAppSelector(
180
+ (state: RootState) => state.auth,
181
+ );
182
+
183
+ useFocusEffect(
184
+ useCallback(() => {
185
+ console.log('🏪 Redeem Screen: useFocusEffect triggered - refreshing data');
186
+ setSelectedFilters(DEFAULT_FILTERS);
187
+ setSearchQuery('');
188
+ dispatch(myProductsListRequest({}));
189
+ }, [dispatch])
190
+ );
191
+
192
+ useEffect(() => {
193
+ dispatch(productTypesRequest({}));
194
+ }, [dispatch])
195
+
196
+ const { myProductsListData } = useAppSelector(
197
+ (state: RootState) => state.auth,
198
+ );
199
+
200
+ const handleSearch = (text: string) => {
201
+ console.log('🔍 Redeem Screen: Search triggered with text:', text);
202
+ setSearchQuery(text);
203
+ if (text.length >= 3) {
204
+ console.log('🔍 Redeem Screen: Dispatching search request with name:', text);
205
+ dispatch(myProductsListRequest({ name: text }));
206
+ }
207
+ if (text.length === 0) {
208
+ console.log('🔍 Redeem Screen: Dispatching clear search request');
209
+ dispatch(myProductsListRequest({}));
210
+ }
211
+ };
212
+
213
+ const navigateToCart = () => {
214
+ // In SDK, MyCart is a hidden tab screen, navigate directly to it
215
+ navigation.navigate(ROUTES.MyCart as any, { from: ROUTES.REDEEM });
216
+ };
217
+
218
+ return (
219
+ <SafeAreaView style={styles.container}>
220
+ <View style={styles.headerContent}>
221
+ <Text style={styles.headerTitle}>{ROUTES.REDEEM}</Text>
222
+ <TouchableOpacity
223
+ activeOpacity={0.7}
224
+ style={styles.cartBadge}
225
+ onPress={navigateToCart}
226
+ >
227
+ <View style={styles.cartCountContainer}>
228
+ <Text style={styles.cartCountText}>
229
+ {viewMyCartData?.items?.length}
230
+ </Text>
231
+ </View>
232
+ <CustomImage source={Images.cart} imgStyle={styles.cartIcon} />
233
+ </TouchableOpacity>
234
+ </View>
235
+ <View style={styles.searchSection}>
236
+ <View style={styles.searchBar}>
237
+ <View style={styles.searchContainer}>
238
+ <CustomImage source={Images.search} imgStyle={styles.searchIcon} />
239
+ <TextInput
240
+ value={searchQuery}
241
+ onChangeText={handleSearch}
242
+ placeholder="Search"
243
+ placeholderTextColor={colors.onSurfaceVariant}
244
+ style={styles.searchPlaceholder}
245
+ />
246
+ </View>
247
+ <TouchableOpacity
248
+ activeOpacity={0.7}
249
+ style={styles.filterButton}
250
+ onPress={() => {
251
+ setIsFilterModalVisible(true);
252
+ }}
253
+ >
254
+ <CustomImage
255
+ source={Images.filtericon}
256
+ imgStyle={styles.filterIcon}
257
+ />
258
+ </TouchableOpacity>
259
+ </View>
260
+ </View>
261
+
262
+ {myProductsListLoading ? (
263
+ <CustomLoader loading={myProductsListLoading} />
264
+ ) : (
265
+ <ScrollView
266
+ style={styles.scrollContainer}
267
+ showsVerticalScrollIndicator={false}
268
+ >
269
+ {Array.isArray(myProductsListData) &&
270
+ myProductsListData?.length > 0 ? (
271
+ <View style={styles.productsGrid}>
272
+ {myProductsListData
273
+ ?.[REDUCE]((rows: any[], product, index) => {
274
+ if (index % 2 === 0) {
275
+ rows?.[PUSH]([product]);
276
+ } else {
277
+ rows?.[rows.length - 1]?.[PUSH](product);
278
+ }
279
+ return rows;
280
+ }, [])
281
+ ?.[MAP]((row: any[], rowIndex: number) => (
282
+ <View key={rowIndex} style={styles.productRow}>
283
+ {row?.[MAP]((product, productIndex) => (
284
+ <ProductCard
285
+ key={`${rowIndex}-${productIndex}`}
286
+ title={product?.name}
287
+ priceCents={product?.price?.price_cents} imageUrl={product?.image?.url}
288
+ category={product?.product_type}
289
+ logo={
290
+ product?.logo === 'titan' ? (
291
+ <TitanLogo />
292
+ ) : product?.logo === 'ambrane' ? (
293
+ <AmbraneIcon />
294
+ ) : product?.logo === 'rayban' ? (
295
+ <RayBanLogo />
296
+ ) : undefined
297
+ }
298
+ backgroundColor={product?.backgroundColor}
299
+ onPress={() => handleProductPress(product)}
300
+ />
301
+ ))}
302
+ {row?.length === 1 && <View style={{ width: cardWidth }} />}
303
+ </View>
304
+ ))}
305
+ </View>
306
+ ) : (
307
+ <NoDataFound containerstyle={styles.nodataFound} />
308
+ )}
309
+ </ScrollView>
310
+ )}
311
+
312
+ <FilterModal
313
+ key={`${selectedFilters.productType}|${[...selectedFilters.categories].sort().join(',')}`}
314
+ visible={isFilterModalVisible}
315
+ data={productTypesData}
316
+ initialFilters={selectedFilters}
317
+ onClose={() => setIsFilterModalVisible(false)}
318
+ onApply={(filters) => {
319
+ setSelectedFilters(filters);
320
+ setIsFilterModalVisible(false);
321
+ }}
322
+ onClear={() => {
323
+ setSelectedFilters(DEFAULT_FILTERS);
324
+ setIsFilterModalVisible(false);
325
+ dispatch(myProductsListRequest({}));
326
+ }}
327
+ />
328
+
329
+
330
+
331
+ <CustomMessagePopUp
332
+ title="Error"
333
+ message={myProductsListError || ''}
334
+ visible={messagepopUpVisible}
335
+ onClose={() => {
336
+ setMessagepopUpVisible(false);
337
+ dispatch(resetAuthState('myProductsListError'));
338
+ }}
339
+ icon={Images?.pendingIcon}
340
+ />
341
+ </SafeAreaView>
342
+ );
343
+ };
344
+
345
+ export default Redeem;
@@ -0,0 +1,269 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import FontFamily from '../../../src-app/constants/Fonts';
3
+ import { colors } from '../../../src-app/styles/colors';
4
+ import { SCALE, VSCALE } from '../../../src-app/constants/Scaling';
5
+
6
+ const styles = StyleSheet.create({
7
+ container: {
8
+ flex: 1,
9
+ backgroundColor: colors.background,
10
+ },
11
+ header: {
12
+ backgroundColor: colors.background,
13
+ paddingHorizontal: SCALE(20),
14
+ paddingTop: VSCALE(20),
15
+ paddingBottom: VSCALE(28),
16
+ },
17
+ statusBar: {
18
+ flexDirection: 'row',
19
+ justifyContent: 'space-between',
20
+ alignItems: 'center',
21
+ marginBottom: VSCALE(28),
22
+ },
23
+ timeText: {
24
+ fontFamily: FontFamily.LEXEND_REGULAR,
25
+ fontSize: SCALE(16),
26
+ fontWeight: '600',
27
+ color: colors.onSurface,
28
+ textAlign: 'center',
29
+ width: SCALE(95),
30
+ },
31
+ statusIcons: {
32
+ flexDirection: 'row',
33
+ alignItems: 'center',
34
+ gap: SCALE(6),
35
+ width: SCALE(77),
36
+ height: VSCALE(13),
37
+ },
38
+ headerContent: {
39
+ marginTop: VSCALE(30),
40
+ },
41
+ headerTitle: {
42
+ fontFamily: FontFamily.LEXEND_REGULAR,
43
+ fontSize: SCALE(18),
44
+ fontWeight: '600',
45
+ color: colors.onSurface,
46
+ textTransform: 'capitalize',
47
+ textAlign: 'center',
48
+ },
49
+ cartButton: {
50
+ width: SCALE(42),
51
+ height: SCALE(42),
52
+ borderRadius: SCALE(100),
53
+ backgroundColor: 'rgba(255, 255, 255, 0.45)',
54
+ justifyContent: 'center',
55
+ alignItems: 'center',
56
+ position: 'relative',
57
+ },
58
+ cartBadge: {
59
+ position: 'absolute',
60
+ top: VSCALE(0),
61
+ right: SCALE(25),
62
+ width: SCALE(20),
63
+ height: VSCALE(20),
64
+ justifyContent: 'center',
65
+ alignItems: 'center',
66
+ },
67
+ cartBadgeText: {
68
+ fontFamily: FontFamily.LEXEND_REGULAR,
69
+ fontSize: SCALE(10),
70
+ fontWeight: '600',
71
+ color: colors.primary,
72
+ textTransform: 'capitalize',
73
+ },
74
+ searchSection: {
75
+ flexDirection: 'row',
76
+ paddingHorizontal: SCALE(20),
77
+ paddingTop: VSCALE(20),
78
+ gap: SCALE(16),
79
+ alignItems: 'center',
80
+ },
81
+ searchBar: {
82
+ flex: 1,
83
+ flexDirection: 'row',
84
+ alignItems: 'center',
85
+ paddingHorizontal: SCALE(16),
86
+ paddingVertical: VSCALE(14),
87
+ borderRadius: SCALE(12),
88
+ borderWidth: 1,
89
+ borderColor: colors.outline,
90
+ gap: SCALE(12),
91
+ height: VSCALE(48),
92
+ justifyContent: 'space-between',
93
+ },
94
+ searchPlaceholder: {
95
+ fontFamily: FontFamily.LEXEND_REGULAR,
96
+ fontSize: SCALE(12),
97
+ color: colors.onSurfaceVariant,
98
+ width: '85%',
99
+ minHeight: VSCALE(40),
100
+ },
101
+ filterButton: {
102
+ width: SCALE(48),
103
+ height: VSCALE(48),
104
+ justifyContent: 'center',
105
+ alignItems: 'center',
106
+ },
107
+ scrollContainer: {
108
+ flex: 1,
109
+ paddingTop: VSCALE(20),
110
+ },
111
+ productsGrid: {
112
+ paddingHorizontal: SCALE(20),
113
+ flexDirection: 'column',
114
+ gap: VSCALE(28),
115
+ paddingBottom: VSCALE(100),
116
+ },
117
+ productRow: {
118
+ flexDirection: 'row',
119
+ justifyContent: 'space-between',
120
+ alignItems: 'flex-start',
121
+ },
122
+ productCard: {
123
+ flexDirection: 'column',
124
+ alignItems: 'flex-start',
125
+ gap: VSCALE(12),
126
+ flex: 1,
127
+ marginHorizontal: SCALE(8),
128
+ },
129
+ productImageContainer: {
130
+ width: '100%',
131
+ height: VSCALE(112),
132
+ shadowColor: colors.shadow,
133
+ shadowOffset: { width: 0, height: 2 },
134
+ shadowOpacity: 0.25,
135
+ shadowRadius: 3.84,
136
+ backgroundColor: colors.background,
137
+ borderRadius: SCALE(12),
138
+ borderWidth: 0.25,
139
+ borderColor: colors.outline,
140
+ },
141
+ logoContainer: {
142
+ position: 'absolute',
143
+ top: VSCALE(12),
144
+ right: SCALE(12),
145
+ zIndex: 10,
146
+ },
147
+ productImage: {
148
+ width: '100%',
149
+ height: '100%',
150
+ resizeMode: 'contain',
151
+ },
152
+ categoryBadge: {
153
+ position: 'absolute',
154
+ top: 0,
155
+ left: 0,
156
+ borderTopLeftRadius: SCALE(12),
157
+ borderBottomRightRadius: SCALE(12),
158
+ backgroundColor: colors.surface,
159
+ padding: SCALE(10),
160
+ },
161
+ categoryText: {
162
+ fontFamily: FontFamily.LEXEND_REGULAR,
163
+ fontSize: SCALE(8),
164
+ fontWeight: '400',
165
+ color: colors.onSurface,
166
+ textAlign: 'center',
167
+ },
168
+ productInfo: {
169
+ flexDirection: 'column',
170
+ alignItems: 'flex-start',
171
+ gap: VSCALE(4),
172
+ width: '100%',
173
+ },
174
+ productTitle: {
175
+ fontFamily: FontFamily.LEXEND_REGULAR,
176
+ fontSize: SCALE(12),
177
+ fontWeight: '500',
178
+ color: colors.onSurface,
179
+ },
180
+ productPoints: {
181
+ fontFamily: FontFamily.LEXEND_REGULAR,
182
+ fontSize: SCALE(10),
183
+ fontWeight: '400',
184
+ color: colors.onSurfaceVariant,
185
+ },
186
+ footer: {
187
+ position: 'absolute',
188
+ bottom: 0,
189
+ left: 0,
190
+ right: 0,
191
+ height: VSCALE(48),
192
+ backgroundColor: colors.background,
193
+ shadowColor: 'rgba(0, 0, 0, 0.04)',
194
+ shadowOffset: {
195
+ width: 0,
196
+ height: -2,
197
+ },
198
+ shadowOpacity: 1,
199
+ shadowRadius: SCALE(10),
200
+ elevation: 5,
201
+ paddingHorizontal: SCALE(120),
202
+ paddingVertical: VSCALE(14),
203
+ },
204
+ footerContent: {
205
+ flexDirection: 'row',
206
+ alignItems: 'center',
207
+ justifyContent: 'center',
208
+ gap: SCALE(4),
209
+ },
210
+ poweredByText: {
211
+ fontFamily: FontFamily.LEXEND_REGULAR,
212
+ fontSize: SCALE(8),
213
+ fontWeight: '400',
214
+ color: colors.onSurfaceVariant,
215
+ textTransform: 'capitalize',
216
+ },
217
+ footerLogo: {
218
+ width: SCALE(103),
219
+ height: VSCALE(20),
220
+ resizeMode: 'contain',
221
+ },
222
+ filterIcon: {
223
+ width: SCALE(16),
224
+ height: SCALE(16),
225
+ resizeMode: 'contain',
226
+ right: SCALE(30),
227
+ },
228
+ searchIcon: {
229
+ width: SCALE(14),
230
+ height: SCALE(14),
231
+ resizeMode: 'contain',
232
+ },
233
+ searchContainer: {
234
+ flexDirection: 'row',
235
+ gap: SCALE(10),
236
+ alignItems: 'center',
237
+ },
238
+ cartIcon: {
239
+ width: SCALE(24),
240
+ height: VSCALE(26),
241
+ resizeMode: 'contain',
242
+ },
243
+ emptyText: {
244
+ textAlign: 'center',
245
+ marginTop: VSCALE(20),
246
+ fontSize: SCALE(16),
247
+ color: colors.onSurface,
248
+ },
249
+ cartCountContainer: {
250
+ position: 'absolute',
251
+ right: SCALE(0),
252
+ width: SCALE(16),
253
+ height: VSCALE(14),
254
+ justifyContent: 'center',
255
+ alignItems: 'center',
256
+ top: VSCALE(-5),
257
+ },
258
+ cartCountText: {
259
+ fontFamily: FontFamily.LEXEND_REGULAR,
260
+ fontSize: SCALE(10),
261
+ fontWeight: '700',
262
+ color: colors.red,
263
+ },
264
+ nodataFound:{
265
+ minHeight:450
266
+ }
267
+ });
268
+
269
+ export default styles;