@oxyhq/services 5.17.17 → 5.18.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 (618) hide show
  1. package/README.md +32 -38
  2. package/lib/commonjs/core/CrossDomainAuth.js +277 -0
  3. package/lib/commonjs/core/CrossDomainAuth.js.map +1 -0
  4. package/lib/commonjs/core/HttpService.js +82 -15
  5. package/lib/commonjs/core/HttpService.js.map +1 -1
  6. package/lib/commonjs/core/OxyServices.base.js +11 -3
  7. package/lib/commonjs/core/OxyServices.base.js.map +1 -1
  8. package/lib/commonjs/core/OxyServices.js +4 -1
  9. package/lib/commonjs/core/OxyServices.js.map +1 -1
  10. package/lib/commonjs/core/index.js +30 -0
  11. package/lib/commonjs/core/index.js.map +1 -1
  12. package/lib/commonjs/core/mixins/OxyServices.assets.js +16 -3
  13. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -1
  14. package/lib/commonjs/core/mixins/OxyServices.auth.js +73 -32
  15. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -1
  16. package/lib/commonjs/core/mixins/OxyServices.features.js +372 -0
  17. package/lib/commonjs/core/mixins/OxyServices.features.js.map +1 -0
  18. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +289 -0
  19. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -0
  20. package/lib/commonjs/core/mixins/OxyServices.popup.js +352 -0
  21. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +1 -0
  22. package/lib/commonjs/core/mixins/OxyServices.redirect.js +378 -0
  23. package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +1 -0
  24. package/lib/commonjs/core/mixins/OxyServices.user.js +35 -24
  25. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -1
  26. package/lib/commonjs/core/mixins/index.js +28 -15
  27. package/lib/commonjs/core/mixins/index.js.map +1 -1
  28. package/lib/commonjs/crypto/index.js +30 -0
  29. package/lib/commonjs/crypto/index.js.map +1 -1
  30. package/lib/commonjs/crypto/keyManager.js +902 -0
  31. package/lib/commonjs/crypto/keyManager.js.map +1 -0
  32. package/lib/commonjs/crypto/polyfill.js +14 -5
  33. package/lib/commonjs/crypto/polyfill.js.map +1 -1
  34. package/lib/commonjs/crypto/recoveryPhrase.js +152 -0
  35. package/lib/commonjs/crypto/recoveryPhrase.js.map +1 -0
  36. package/lib/commonjs/crypto/signatureService.js +289 -0
  37. package/lib/commonjs/crypto/signatureService.js.map +1 -0
  38. package/lib/commonjs/i18n/locales/en-US.json +1 -1
  39. package/lib/commonjs/index.js +40 -26
  40. package/lib/commonjs/index.js.map +1 -1
  41. package/lib/commonjs/models/interfaces.js +0 -15
  42. package/lib/commonjs/models/interfaces.js.map +1 -1
  43. package/lib/commonjs/ui/components/BottomSheetRouter.js +9 -1
  44. package/lib/commonjs/ui/components/BottomSheetRouter.js.map +1 -1
  45. package/lib/commonjs/ui/components/GroupedItem.js +11 -1
  46. package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
  47. package/lib/commonjs/ui/components/Icon.js.map +1 -1
  48. package/lib/commonjs/ui/components/IconButton/utils.js.map +1 -1
  49. package/lib/commonjs/ui/components/OxyProvider.js +41 -11
  50. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  51. package/lib/commonjs/ui/components/SettingRow.js +17 -4
  52. package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
  53. package/lib/commonjs/ui/components/TextField/Adornment/utils.js.map +1 -1
  54. package/lib/commonjs/ui/components/TextField/helpers.js.map +1 -1
  55. package/lib/commonjs/ui/components/TouchableRipple/utils.js.map +1 -1
  56. package/lib/commonjs/ui/components/Typography/AnimatedText.js.map +1 -1
  57. package/lib/commonjs/ui/components/feedback/FormInput.js +72 -0
  58. package/lib/commonjs/ui/components/feedback/FormInput.js.map +1 -0
  59. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js +33 -0
  60. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js.map +1 -0
  61. package/lib/commonjs/ui/components/feedback/constants.js +59 -0
  62. package/lib/commonjs/ui/components/feedback/constants.js.map +1 -0
  63. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +262 -0
  64. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -0
  65. package/lib/commonjs/ui/components/feedback/index.js +54 -0
  66. package/lib/commonjs/ui/components/feedback/index.js.map +1 -0
  67. package/lib/commonjs/ui/components/feedback/types.js +6 -0
  68. package/lib/commonjs/ui/components/feedback/types.js.map +1 -0
  69. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js +52 -0
  70. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js.map +1 -0
  71. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +282 -0
  72. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -0
  73. package/lib/commonjs/ui/components/modals/index.js +14 -0
  74. package/lib/commonjs/ui/components/modals/index.js.map +1 -0
  75. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +309 -0
  76. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  77. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +79 -0
  78. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -0
  79. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +108 -0
  80. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -0
  81. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +79 -0
  82. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  83. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +176 -0
  84. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  85. package/lib/commonjs/ui/components/payment/constants.js +53 -0
  86. package/lib/commonjs/ui/components/payment/constants.js.map +1 -0
  87. package/lib/commonjs/ui/components/payment/index.js +80 -0
  88. package/lib/commonjs/ui/components/payment/index.js.map +1 -0
  89. package/lib/commonjs/ui/components/payment/paymentStyles.js +409 -0
  90. package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -0
  91. package/lib/commonjs/ui/components/payment/types.js +6 -0
  92. package/lib/commonjs/ui/components/payment/types.js.map +1 -0
  93. package/lib/commonjs/ui/context/OxyContext.js +110 -199
  94. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  95. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +150 -19
  96. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  97. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +279 -0
  98. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -0
  99. package/lib/commonjs/ui/hooks/index.js +26 -0
  100. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  101. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +79 -72
  102. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  103. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js +38 -51
  104. package/lib/commonjs/ui/hooks/queries/useAccountQueries.js.map +1 -1
  105. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js +3 -3
  106. package/lib/commonjs/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  107. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js +18 -12
  108. package/lib/commonjs/ui/hooks/queries/useServicesQueries.js.map +1 -1
  109. package/lib/commonjs/ui/hooks/useAsyncAction.js +95 -0
  110. package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -0
  111. package/lib/commonjs/ui/hooks/useProfileEditing.js +3 -5
  112. package/lib/commonjs/ui/hooks/useProfileEditing.js.map +1 -1
  113. package/lib/commonjs/ui/hooks/useSessionManagement.js +4 -8
  114. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  115. package/lib/commonjs/ui/hooks/useSessionSocket.js +162 -315
  116. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  117. package/lib/commonjs/ui/hooks/useSettingToggle.js +126 -0
  118. package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -0
  119. package/lib/commonjs/ui/hooks/useStorage.js +24 -58
  120. package/lib/commonjs/ui/hooks/useStorage.js.map +1 -1
  121. package/lib/commonjs/ui/index.js +50 -21
  122. package/lib/commonjs/ui/index.js.map +1 -1
  123. package/lib/commonjs/ui/navigation/routes.js +6 -1
  124. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  125. package/lib/commonjs/ui/screens/AccountCenterScreen.js +6 -4
  126. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  127. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +33 -30
  128. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  129. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +29 -24
  130. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  131. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +3 -3
  132. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  133. package/lib/commonjs/ui/screens/FAQScreen.js +315 -0
  134. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -0
  135. package/lib/commonjs/ui/screens/FeedbackScreen.js +73 -590
  136. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  137. package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -7
  138. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  139. package/lib/commonjs/ui/screens/OxyAuthScreen.js +134 -66
  140. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  141. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +67 -1395
  142. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  143. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +6 -13
  144. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  145. package/lib/commonjs/ui/screens/ProfileScreen.js +13 -5
  146. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  147. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +16 -10
  148. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  149. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +23 -11
  150. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  151. package/lib/commonjs/ui/stores/accountStore.js +2 -4
  152. package/lib/commonjs/ui/stores/accountStore.js.map +1 -1
  153. package/lib/commonjs/ui/stores/authStore.js +45 -32
  154. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  155. package/lib/commonjs/ui/styles/spacing.js +54 -2
  156. package/lib/commonjs/ui/styles/spacing.js.map +1 -1
  157. package/lib/commonjs/ui/utils/avatarUtils.js +37 -41
  158. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  159. package/lib/commonjs/ui/utils/storageHelpers.js.map +1 -1
  160. package/lib/commonjs/utils/errorUtils.js +13 -0
  161. package/lib/commonjs/utils/errorUtils.js.map +1 -1
  162. package/lib/commonjs/utils/validationUtils.js +15 -1
  163. package/lib/commonjs/utils/validationUtils.js.map +1 -1
  164. package/lib/module/core/CrossDomainAuth.js +271 -0
  165. package/lib/module/core/CrossDomainAuth.js.map +1 -0
  166. package/lib/module/core/HttpService.js +82 -15
  167. package/lib/module/core/HttpService.js.map +1 -1
  168. package/lib/module/core/OxyServices.base.js +11 -4
  169. package/lib/module/core/OxyServices.base.js.map +1 -1
  170. package/lib/module/core/OxyServices.js +4 -1
  171. package/lib/module/core/OxyServices.js.map +1 -1
  172. package/lib/module/core/index.js +6 -1
  173. package/lib/module/core/index.js.map +1 -1
  174. package/lib/module/core/mixins/OxyServices.assets.js +16 -3
  175. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -1
  176. package/lib/module/core/mixins/OxyServices.auth.js +73 -32
  177. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -1
  178. package/lib/module/core/mixins/OxyServices.features.js +369 -0
  179. package/lib/module/core/mixins/OxyServices.features.js.map +1 -0
  180. package/lib/module/core/mixins/OxyServices.fedcm.js +286 -0
  181. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -0
  182. package/lib/module/core/mixins/OxyServices.popup.js +349 -0
  183. package/lib/module/core/mixins/OxyServices.popup.js.map +1 -0
  184. package/lib/module/core/mixins/OxyServices.redirect.js +375 -0
  185. package/lib/module/core/mixins/OxyServices.redirect.js.map +1 -0
  186. package/lib/module/core/mixins/OxyServices.user.js +35 -24
  187. package/lib/module/core/mixins/OxyServices.user.js.map +1 -1
  188. package/lib/module/core/mixins/index.js +16 -3
  189. package/lib/module/core/mixins/index.js.map +1 -1
  190. package/lib/module/crypto/index.js +8 -4
  191. package/lib/module/crypto/index.js.map +1 -1
  192. package/lib/module/crypto/keyManager.js +899 -0
  193. package/lib/module/crypto/keyManager.js.map +1 -0
  194. package/lib/module/crypto/polyfill.js +6 -5
  195. package/lib/module/crypto/polyfill.js.map +1 -1
  196. package/lib/module/crypto/recoveryPhrase.js +147 -0
  197. package/lib/module/crypto/recoveryPhrase.js.map +1 -0
  198. package/lib/module/crypto/signatureService.js +286 -0
  199. package/lib/module/crypto/signatureService.js.map +1 -0
  200. package/lib/module/i18n/locales/en-US.json +1 -1
  201. package/lib/module/index.js +6 -9
  202. package/lib/module/index.js.map +1 -1
  203. package/lib/module/models/interfaces.js +0 -15
  204. package/lib/module/models/interfaces.js.map +1 -1
  205. package/lib/module/ui/components/BottomSheetRouter.js +6 -2
  206. package/lib/module/ui/components/BottomSheetRouter.js.map +1 -1
  207. package/lib/module/ui/components/GroupedItem.js +11 -1
  208. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  209. package/lib/module/ui/components/Icon.js.map +1 -1
  210. package/lib/module/ui/components/IconButton/utils.js.map +1 -1
  211. package/lib/module/ui/components/OxyProvider.js +41 -11
  212. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  213. package/lib/module/ui/components/SettingRow.js +17 -4
  214. package/lib/module/ui/components/SettingRow.js.map +1 -1
  215. package/lib/module/ui/components/TextField/Adornment/utils.js.map +1 -1
  216. package/lib/module/ui/components/TextField/helpers.js.map +1 -1
  217. package/lib/module/ui/components/TouchableRipple/utils.js.map +1 -1
  218. package/lib/module/ui/components/Typography/AnimatedText.js.map +1 -1
  219. package/lib/module/ui/components/feedback/FormInput.js +67 -0
  220. package/lib/module/ui/components/feedback/FormInput.js.map +1 -0
  221. package/lib/module/ui/components/feedback/ProgressIndicator.js +28 -0
  222. package/lib/module/ui/components/feedback/ProgressIndicator.js.map +1 -0
  223. package/lib/module/ui/components/feedback/constants.js +55 -0
  224. package/lib/module/ui/components/feedback/constants.js.map +1 -0
  225. package/lib/module/ui/components/feedback/feedbackStyles.js +257 -0
  226. package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -0
  227. package/lib/module/ui/components/feedback/index.js +8 -0
  228. package/lib/module/ui/components/feedback/index.js.map +1 -0
  229. package/lib/module/ui/components/feedback/types.js +4 -0
  230. package/lib/module/ui/components/feedback/types.js.map +1 -0
  231. package/lib/module/ui/components/feedback/useFeedbackForm.js +47 -0
  232. package/lib/module/ui/components/feedback/useFeedbackForm.js.map +1 -0
  233. package/lib/module/ui/components/modals/DeleteAccountModal.js +276 -0
  234. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -0
  235. package/lib/module/ui/components/modals/index.js +4 -0
  236. package/lib/module/ui/components/modals/index.js.map +1 -0
  237. package/lib/module/ui/components/payment/PaymentDetailsStep.js +303 -0
  238. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  239. package/lib/module/ui/components/payment/PaymentMethodStep.js +73 -0
  240. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -0
  241. package/lib/module/ui/components/payment/PaymentReviewStep.js +102 -0
  242. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -0
  243. package/lib/module/ui/components/payment/PaymentSuccessStep.js +73 -0
  244. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  245. package/lib/module/ui/components/payment/PaymentSummaryStep.js +170 -0
  246. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  247. package/lib/module/ui/components/payment/constants.js +47 -0
  248. package/lib/module/ui/components/payment/constants.js.map +1 -0
  249. package/lib/module/ui/components/payment/index.js +10 -0
  250. package/lib/module/ui/components/payment/index.js.map +1 -0
  251. package/lib/module/ui/components/payment/paymentStyles.js +404 -0
  252. package/lib/module/ui/components/payment/paymentStyles.js.map +1 -0
  253. package/lib/module/ui/components/payment/types.js +4 -0
  254. package/lib/module/ui/components/payment/types.js.map +1 -0
  255. package/lib/module/ui/context/OxyContext.js +112 -191
  256. package/lib/module/ui/context/OxyContext.js.map +1 -1
  257. package/lib/module/ui/context/hooks/useAuthOperations.js +150 -19
  258. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  259. package/lib/module/ui/context/hooks/useSessionManagement.js +274 -0
  260. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -0
  261. package/lib/module/ui/hooks/index.js +2 -0
  262. package/lib/module/ui/hooks/index.js.map +1 -1
  263. package/lib/module/ui/hooks/mutations/useAccountMutations.js +80 -72
  264. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  265. package/lib/module/ui/hooks/queries/useAccountQueries.js +31 -44
  266. package/lib/module/ui/hooks/queries/useAccountQueries.js.map +1 -1
  267. package/lib/module/ui/hooks/queries/useSecurityQueries.js +1 -1
  268. package/lib/module/ui/hooks/queries/useSecurityQueries.js.map +1 -1
  269. package/lib/module/ui/hooks/queries/useServicesQueries.js +13 -7
  270. package/lib/module/ui/hooks/queries/useServicesQueries.js.map +1 -1
  271. package/lib/module/ui/hooks/useAsyncAction.js +89 -0
  272. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -0
  273. package/lib/module/ui/hooks/useProfileEditing.js +3 -5
  274. package/lib/module/ui/hooks/useProfileEditing.js.map +1 -1
  275. package/lib/module/ui/hooks/useSessionManagement.js +4 -8
  276. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  277. package/lib/module/ui/hooks/useSessionSocket.js +162 -315
  278. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  279. package/lib/module/ui/hooks/useSettingToggle.js +120 -0
  280. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -0
  281. package/lib/module/ui/hooks/useStorage.js +25 -59
  282. package/lib/module/ui/hooks/useStorage.js.map +1 -1
  283. package/lib/module/ui/index.js +15 -10
  284. package/lib/module/ui/index.js.map +1 -1
  285. package/lib/module/ui/navigation/routes.js +6 -1
  286. package/lib/module/ui/navigation/routes.js.map +1 -1
  287. package/lib/module/ui/screens/AccountCenterScreen.js +6 -4
  288. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  289. package/lib/module/ui/screens/AccountOverviewScreen.js +33 -30
  290. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  291. package/lib/module/ui/screens/AccountSettingsScreen.js +29 -24
  292. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  293. package/lib/module/ui/screens/AccountSwitcherScreen.js +3 -3
  294. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  295. package/lib/module/ui/screens/FAQScreen.js +310 -0
  296. package/lib/module/ui/screens/FAQScreen.js.map +1 -0
  297. package/lib/module/ui/screens/FeedbackScreen.js +64 -581
  298. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  299. package/lib/module/ui/screens/HelpSupportScreen.js +8 -7
  300. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  301. package/lib/module/ui/screens/OxyAuthScreen.js +135 -68
  302. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  303. package/lib/module/ui/screens/PaymentGatewayScreen.js +67 -1397
  304. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  305. package/lib/module/ui/screens/PrivacySettingsScreen.js +6 -13
  306. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  307. package/lib/module/ui/screens/ProfileScreen.js +13 -5
  308. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  309. package/lib/module/ui/screens/SavesCollectionsScreen.js +16 -10
  310. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  311. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +23 -11
  312. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  313. package/lib/module/ui/stores/accountStore.js +2 -4
  314. package/lib/module/ui/stores/accountStore.js.map +1 -1
  315. package/lib/module/ui/stores/authStore.js +45 -32
  316. package/lib/module/ui/stores/authStore.js.map +1 -1
  317. package/lib/module/ui/styles/spacing.js +6 -2
  318. package/lib/module/ui/styles/spacing.js.map +1 -1
  319. package/lib/module/ui/utils/avatarUtils.js +37 -40
  320. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  321. package/lib/module/ui/utils/storageHelpers.js.map +1 -1
  322. package/lib/module/utils/errorUtils.js +7 -0
  323. package/lib/module/utils/errorUtils.js.map +1 -1
  324. package/lib/module/utils/validationUtils.js +13 -0
  325. package/lib/module/utils/validationUtils.js.map +1 -1
  326. package/lib/typescript/core/CrossDomainAuth.d.ts +161 -0
  327. package/lib/typescript/core/CrossDomainAuth.d.ts.map +1 -0
  328. package/lib/typescript/core/HttpService.d.ts +1 -1
  329. package/lib/typescript/core/HttpService.d.ts.map +1 -1
  330. package/lib/typescript/core/OxyServices.base.d.ts +0 -6
  331. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -1
  332. package/lib/typescript/core/OxyServices.d.ts +5 -36
  333. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  334. package/lib/typescript/core/index.d.ts +4 -0
  335. package/lib/typescript/core/index.d.ts.map +1 -1
  336. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -1
  337. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -1
  338. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +40 -20
  339. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -1
  340. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -1
  341. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -1
  342. package/lib/typescript/core/mixins/OxyServices.features.d.ts +229 -0
  343. package/lib/typescript/core/mixins/OxyServices.features.d.ts.map +1 -0
  344. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts +195 -0
  345. package/lib/typescript/core/mixins/OxyServices.fedcm.d.ts.map +1 -0
  346. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -1
  347. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -1
  348. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -1
  349. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -1
  350. package/lib/typescript/core/mixins/OxyServices.popup.d.ts +206 -0
  351. package/lib/typescript/core/mixins/OxyServices.popup.d.ts.map +1 -0
  352. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -1
  353. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts +246 -0
  354. package/lib/typescript/core/mixins/OxyServices.redirect.d.ts.map +1 -0
  355. package/lib/typescript/core/mixins/OxyServices.security.d.ts.map +1 -1
  356. package/lib/typescript/core/mixins/OxyServices.user.d.ts +6 -4
  357. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -1
  358. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -1
  359. package/lib/typescript/core/mixins/index.d.ts +291 -9
  360. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  361. package/lib/typescript/crypto/index.d.ts +6 -3
  362. package/lib/typescript/crypto/index.d.ts.map +1 -1
  363. package/lib/typescript/crypto/keyManager.d.ts +190 -0
  364. package/lib/typescript/crypto/keyManager.d.ts.map +1 -0
  365. package/lib/typescript/crypto/polyfill.d.ts +4 -3
  366. package/lib/typescript/crypto/polyfill.d.ts.map +1 -1
  367. package/lib/typescript/crypto/recoveryPhrase.d.ts +59 -0
  368. package/lib/typescript/crypto/recoveryPhrase.d.ts.map +1 -0
  369. package/lib/typescript/crypto/signatureService.d.ts +87 -0
  370. package/lib/typescript/crypto/signatureService.d.ts.map +1 -0
  371. package/lib/typescript/index.d.ts +5 -6
  372. package/lib/typescript/index.d.ts.map +1 -1
  373. package/lib/typescript/models/interfaces.d.ts +2 -14
  374. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  375. package/lib/typescript/models/session.d.ts +0 -9
  376. package/lib/typescript/models/session.d.ts.map +1 -1
  377. package/lib/typescript/types/bip39.d.ts +32 -0
  378. package/lib/typescript/ui/components/BottomSheetRouter.d.ts +5 -0
  379. package/lib/typescript/ui/components/BottomSheetRouter.d.ts.map +1 -1
  380. package/lib/typescript/ui/components/GroupedItem.d.ts +5 -1
  381. package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
  382. package/lib/typescript/ui/components/IconButton/utils.d.ts +1 -1
  383. package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
  384. package/lib/typescript/ui/components/SettingRow.d.ts +6 -0
  385. package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -1
  386. package/lib/typescript/ui/components/TextField/Addons/Outline.d.ts +2 -2
  387. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts +1 -1
  388. package/lib/typescript/ui/components/TextField/Adornment/utils.d.ts.map +1 -1
  389. package/lib/typescript/ui/components/TextField/helpers.d.ts +8 -8
  390. package/lib/typescript/ui/components/TextField/types.d.ts +1 -0
  391. package/lib/typescript/ui/components/TextField/types.d.ts.map +1 -1
  392. package/lib/typescript/ui/components/feedback/FormInput.d.ts +20 -0
  393. package/lib/typescript/ui/components/feedback/FormInput.d.ts.map +1 -0
  394. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts +11 -0
  395. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts.map +1 -0
  396. package/lib/typescript/ui/components/feedback/constants.d.ts +5 -0
  397. package/lib/typescript/ui/components/feedback/constants.d.ts.map +1 -0
  398. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts +280 -0
  399. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts.map +1 -0
  400. package/lib/typescript/ui/components/feedback/index.d.ts +7 -0
  401. package/lib/typescript/ui/components/feedback/index.d.ts.map +1 -0
  402. package/lib/typescript/ui/components/feedback/types.d.ts +46 -0
  403. package/lib/typescript/ui/components/feedback/types.d.ts.map +1 -0
  404. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts +9 -0
  405. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts.map +1 -0
  406. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts +19 -0
  407. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts.map +1 -0
  408. package/lib/typescript/ui/components/modals/index.d.ts +2 -0
  409. package/lib/typescript/ui/components/modals/index.d.ts.map +1 -0
  410. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts +21 -0
  411. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -0
  412. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts +14 -0
  413. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts.map +1 -0
  414. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts +16 -0
  415. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts.map +1 -0
  416. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts +10 -0
  417. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -0
  418. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts +15 -0
  419. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -0
  420. package/lib/typescript/ui/components/payment/constants.d.ts +7 -0
  421. package/lib/typescript/ui/components/payment/constants.d.ts.map +1 -0
  422. package/lib/typescript/ui/components/payment/index.d.ts +9 -0
  423. package/lib/typescript/ui/components/payment/index.d.ts.map +1 -0
  424. package/lib/typescript/ui/components/payment/paymentStyles.d.ts +396 -0
  425. package/lib/typescript/ui/components/payment/paymentStyles.d.ts.map +1 -0
  426. package/lib/typescript/ui/components/payment/types.d.ts +40 -0
  427. package/lib/typescript/ui/components/payment/types.d.ts.map +1 -0
  428. package/lib/typescript/ui/components/types.d.ts +4 -0
  429. package/lib/typescript/ui/components/types.d.ts.map +1 -1
  430. package/lib/typescript/ui/context/OxyContext.d.ts +57 -3
  431. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  432. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts +10 -3
  433. package/lib/typescript/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  434. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts +41 -0
  435. package/lib/typescript/ui/context/hooks/useSessionManagement.d.ts.map +1 -0
  436. package/lib/typescript/ui/hooks/index.d.ts +2 -0
  437. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  438. package/lib/typescript/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  439. package/lib/typescript/ui/hooks/queries/useAccountQueries.d.ts.map +1 -1
  440. package/lib/typescript/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  441. package/lib/typescript/ui/hooks/useAsyncAction.d.ts +51 -0
  442. package/lib/typescript/ui/hooks/useAsyncAction.d.ts.map +1 -0
  443. package/lib/typescript/ui/hooks/useProfileEditing.d.ts.map +1 -1
  444. package/lib/typescript/ui/hooks/useSessionManagement.d.ts.map +1 -1
  445. package/lib/typescript/ui/hooks/useSessionSocket.d.ts +1 -2
  446. package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
  447. package/lib/typescript/ui/hooks/useSettingToggle.d.ts +55 -0
  448. package/lib/typescript/ui/hooks/useSettingToggle.d.ts.map +1 -0
  449. package/lib/typescript/ui/hooks/useStorage.d.ts +3 -9
  450. package/lib/typescript/ui/hooks/useStorage.d.ts.map +1 -1
  451. package/lib/typescript/ui/index.d.ts +6 -2
  452. package/lib/typescript/ui/index.d.ts.map +1 -1
  453. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  454. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  455. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  456. package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  457. package/lib/typescript/ui/screens/FAQScreen.d.ts +5 -0
  458. package/lib/typescript/ui/screens/FAQScreen.d.ts.map +1 -0
  459. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  460. package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  461. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts +1 -1
  462. package/lib/typescript/ui/screens/OxyAuthScreen.d.ts.map +1 -1
  463. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +3 -15
  464. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  465. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  466. package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
  467. package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  468. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  469. package/lib/typescript/ui/stores/accountStore.d.ts.map +1 -1
  470. package/lib/typescript/ui/stores/authStore.d.ts +8 -7
  471. package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
  472. package/lib/typescript/ui/styles/spacing.d.ts +5 -0
  473. package/lib/typescript/ui/styles/spacing.d.ts.map +1 -1
  474. package/lib/typescript/ui/types/navigation.d.ts +2 -1
  475. package/lib/typescript/ui/types/navigation.d.ts.map +1 -1
  476. package/lib/typescript/ui/utils/avatarUtils.d.ts +2 -13
  477. package/lib/typescript/ui/utils/avatarUtils.d.ts.map +1 -1
  478. package/lib/typescript/ui/utils/storageHelpers.d.ts +0 -3
  479. package/lib/typescript/ui/utils/storageHelpers.d.ts.map +1 -1
  480. package/lib/typescript/utils/errorUtils.d.ts +6 -0
  481. package/lib/typescript/utils/errorUtils.d.ts.map +1 -1
  482. package/lib/typescript/utils/validationUtils.d.ts +8 -0
  483. package/lib/typescript/utils/validationUtils.d.ts.map +1 -1
  484. package/package.json +8 -7
  485. package/src/core/CrossDomainAuth.ts +307 -0
  486. package/src/core/HttpService.ts +99 -16
  487. package/src/core/OxyServices.base.ts +20 -3
  488. package/src/core/OxyServices.ts +7 -3
  489. package/src/core/index.ts +9 -1
  490. package/src/core/mixins/OxyServices.assets.ts +14 -3
  491. package/src/core/mixins/OxyServices.auth.ts +105 -36
  492. package/src/core/mixins/OxyServices.features.ts +428 -0
  493. package/src/core/mixins/OxyServices.fedcm.ts +315 -0
  494. package/src/core/mixins/OxyServices.popup.ts +402 -0
  495. package/src/core/mixins/OxyServices.redirect.ts +397 -0
  496. package/src/core/mixins/OxyServices.user.ts +39 -24
  497. package/src/core/mixins/index.ts +33 -14
  498. package/src/crypto/index.ts +16 -5
  499. package/src/crypto/keyManager.ts +966 -0
  500. package/src/crypto/polyfill.ts +6 -5
  501. package/src/crypto/recoveryPhrase.ts +166 -0
  502. package/src/crypto/signatureService.ts +323 -0
  503. package/src/i18n/locales/en-US.json +1 -1
  504. package/src/index.ts +19 -15
  505. package/src/models/interfaces.ts +4 -16
  506. package/src/models/session.ts +2 -11
  507. package/src/types/bip39.d.ts +32 -0
  508. package/src/ui/components/BottomSheetRouter.tsx +6 -1
  509. package/src/ui/components/GroupedItem.tsx +19 -1
  510. package/src/ui/components/Icon.tsx +1 -1
  511. package/src/ui/components/IconButton/utils.ts +1 -1
  512. package/src/ui/components/OxyProvider.tsx +44 -12
  513. package/src/ui/components/SettingRow.tsx +26 -4
  514. package/src/ui/components/TextField/Addons/Outline.tsx +2 -2
  515. package/src/ui/components/TextField/Adornment/utils.ts +2 -2
  516. package/src/ui/components/TextField/helpers.tsx +10 -10
  517. package/src/ui/components/TextField/types.tsx +1 -1
  518. package/src/ui/components/TouchableRipple/utils.ts +2 -2
  519. package/src/ui/components/Typography/AnimatedText.tsx +2 -2
  520. package/src/ui/components/feedback/FormInput.tsx +84 -0
  521. package/src/ui/components/feedback/ProgressIndicator.tsx +35 -0
  522. package/src/ui/components/feedback/constants.ts +22 -0
  523. package/src/ui/components/feedback/feedbackStyles.ts +247 -0
  524. package/src/ui/components/feedback/index.ts +6 -0
  525. package/src/ui/components/feedback/types.ts +52 -0
  526. package/src/ui/components/feedback/useFeedbackForm.ts +44 -0
  527. package/src/ui/components/modals/DeleteAccountModal.tsx +294 -0
  528. package/src/ui/components/modals/index.ts +1 -0
  529. package/src/ui/components/payment/PaymentDetailsStep.tsx +222 -0
  530. package/src/ui/components/payment/PaymentMethodStep.tsx +89 -0
  531. package/src/ui/components/payment/PaymentReviewStep.tsx +126 -0
  532. package/src/ui/components/payment/PaymentSuccessStep.tsx +71 -0
  533. package/src/ui/components/payment/PaymentSummaryStep.tsx +159 -0
  534. package/src/ui/components/payment/constants.ts +39 -0
  535. package/src/ui/components/payment/index.ts +9 -0
  536. package/src/ui/components/payment/paymentStyles.ts +397 -0
  537. package/src/ui/components/payment/types.ts +45 -0
  538. package/src/ui/components/types.tsx +6 -0
  539. package/src/ui/context/OxyContext.tsx +173 -195
  540. package/src/ui/context/hooks/useAuthOperations.ts +177 -36
  541. package/src/ui/context/hooks/useSessionManagement.ts +399 -0
  542. package/src/ui/hooks/index.ts +3 -1
  543. package/src/ui/hooks/mutations/useAccountMutations.ts +83 -76
  544. package/src/ui/hooks/queries/useAccountQueries.ts +29 -35
  545. package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
  546. package/src/ui/hooks/queries/useServicesQueries.ts +14 -6
  547. package/src/ui/hooks/useAsyncAction.ts +129 -0
  548. package/src/ui/hooks/useProfileEditing.ts +3 -3
  549. package/src/ui/hooks/useSessionManagement.ts +5 -10
  550. package/src/ui/hooks/useSessionSocket.ts +46 -175
  551. package/src/ui/hooks/useSettingToggle.ts +147 -0
  552. package/src/ui/hooks/useStorage.ts +24 -76
  553. package/src/ui/index.ts +22 -13
  554. package/src/ui/navigation/routes.ts +8 -2
  555. package/src/ui/screens/AccountCenterScreen.tsx +4 -4
  556. package/src/ui/screens/AccountOverviewScreen.tsx +36 -38
  557. package/src/ui/screens/AccountSettingsScreen.tsx +34 -37
  558. package/src/ui/screens/AccountSwitcherScreen.tsx +4 -4
  559. package/src/ui/screens/FAQScreen.tsx +332 -0
  560. package/src/ui/screens/FeedbackScreen.tsx +91 -626
  561. package/src/ui/screens/HelpSupportScreen.tsx +7 -5
  562. package/src/ui/screens/OxyAuthScreen.tsx +138 -64
  563. package/src/ui/screens/PaymentGatewayScreen.tsx +96 -1275
  564. package/src/ui/screens/PrivacySettingsScreen.tsx +6 -12
  565. package/src/ui/screens/ProfileScreen.tsx +11 -6
  566. package/src/ui/screens/SavesCollectionsScreen.tsx +19 -10
  567. package/src/ui/screens/karma/KarmaCenterScreen.tsx +10 -10
  568. package/src/ui/stores/accountStore.ts +1 -11
  569. package/src/ui/stores/authStore.ts +43 -44
  570. package/src/ui/styles/spacing.ts +15 -2
  571. package/src/ui/types/navigation.ts +2 -2
  572. package/src/ui/utils/avatarUtils.ts +39 -46
  573. package/src/ui/utils/storageHelpers.ts +0 -4
  574. package/src/utils/__tests__/validationUtils.test.ts +16 -1
  575. package/src/utils/errorUtils.ts +8 -1
  576. package/src/utils/validationUtils.ts +12 -0
  577. package/lib/commonjs/core/services/SessionService.js +0 -163
  578. package/lib/commonjs/core/services/SessionService.js.map +0 -1
  579. package/lib/commonjs/core/services/TokenService.js +0 -220
  580. package/lib/commonjs/core/services/TokenService.js.map +0 -1
  581. package/lib/commonjs/crypto/types.js +0 -2
  582. package/lib/commonjs/crypto/types.js.map +0 -1
  583. package/lib/commonjs/ui/context/OxyContextBase.js +0 -21
  584. package/lib/commonjs/ui/context/OxyContextBase.js.map +0 -1
  585. package/lib/commonjs/ui/context/hooks/useStorage.js +0 -79
  586. package/lib/commonjs/ui/context/hooks/useStorage.js.map +0 -1
  587. package/lib/commonjs/ui/hooks/useAvatarPicker.js +0 -56
  588. package/lib/commonjs/ui/hooks/useAvatarPicker.js.map +0 -1
  589. package/lib/module/core/services/SessionService.js +0 -159
  590. package/lib/module/core/services/SessionService.js.map +0 -1
  591. package/lib/module/core/services/TokenService.js +0 -217
  592. package/lib/module/core/services/TokenService.js.map +0 -1
  593. package/lib/module/crypto/types.js +0 -2
  594. package/lib/module/crypto/types.js.map +0 -1
  595. package/lib/module/ui/context/OxyContextBase.js +0 -16
  596. package/lib/module/ui/context/OxyContextBase.js.map +0 -1
  597. package/lib/module/ui/context/hooks/useStorage.js +0 -74
  598. package/lib/module/ui/context/hooks/useStorage.js.map +0 -1
  599. package/lib/module/ui/hooks/useAvatarPicker.js +0 -50
  600. package/lib/module/ui/hooks/useAvatarPicker.js.map +0 -1
  601. package/lib/typescript/core/services/SessionService.d.ts +0 -78
  602. package/lib/typescript/core/services/SessionService.d.ts.map +0 -1
  603. package/lib/typescript/core/services/TokenService.d.ts +0 -72
  604. package/lib/typescript/core/services/TokenService.d.ts.map +0 -1
  605. package/lib/typescript/crypto/types.d.ts +0 -22
  606. package/lib/typescript/crypto/types.d.ts.map +0 -1
  607. package/lib/typescript/ui/context/OxyContextBase.d.ts +0 -63
  608. package/lib/typescript/ui/context/OxyContextBase.d.ts.map +0 -1
  609. package/lib/typescript/ui/context/hooks/useStorage.d.ts +0 -22
  610. package/lib/typescript/ui/context/hooks/useStorage.d.ts.map +0 -1
  611. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts +0 -19
  612. package/lib/typescript/ui/hooks/useAvatarPicker.d.ts.map +0 -1
  613. package/src/core/services/SessionService.ts +0 -173
  614. package/src/core/services/TokenService.ts +0 -237
  615. package/src/crypto/types.ts +0 -23
  616. package/src/ui/context/OxyContextBase.tsx +0 -78
  617. package/src/ui/context/hooks/useStorage.ts +0 -104
  618. package/src/ui/hooks/useAvatarPicker.ts +0 -61
@@ -1,18 +1,14 @@
1
- import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';
1
+ import React, { useState, useRef, useCallback, useMemo } from 'react';
2
2
  import {
3
3
  View,
4
4
  Text,
5
- TextInput,
6
5
  TouchableOpacity,
7
- StyleSheet,
8
6
  ActivityIndicator,
9
7
  Platform,
10
8
  KeyboardAvoidingView,
11
9
  ScrollView,
12
10
  Animated,
13
11
  StatusBar,
14
- Alert,
15
- Dimensions,
16
12
  } from 'react-native';
17
13
  import type { BaseScreenProps } from '../types/navigation';
18
14
  import { useThemeColors } from '../styles';
@@ -23,516 +19,38 @@ import { packageInfo } from '../../constants/version';
23
19
  import { GroupedSection } from '../components';
24
20
  import { useI18n } from '../hooks/useI18n';
25
21
  import { useOxy } from '../context/OxyContext';
26
- import { screenContentStyle } from '../constants/spacing';
27
22
 
28
- // Types for better type safety
29
- interface FeedbackData {
30
- type: 'bug' | 'feature' | 'general' | 'support';
31
- title: string;
32
- description: string;
33
- priority: 'low' | 'medium' | 'high' | 'critical';
34
- category: string;
35
- contactEmail: string;
36
- systemInfo: boolean;
37
- }
38
-
39
- interface FeedbackState {
40
- status: 'idle' | 'submitting' | 'success' | 'error';
41
- message: string;
42
- }
43
-
44
- // Constants
45
- const FEEDBACK_TYPES = [
46
- { id: 'bug', label: 'Bug Report', icon: 'bug', color: '#FF3B30', description: 'Report a problem or issue' },
47
- { id: 'feature', label: 'Feature Request', icon: 'bulb', color: '#007AFF', description: 'Suggest a new feature' },
48
- { id: 'general', label: 'General Feedback', icon: 'chatbubble', color: '#34C759', description: 'Share your thoughts' },
49
- { id: 'support', label: 'Support Request', icon: 'help-circle', color: '#FF9500', description: 'Get help with something' },
50
- ];
51
-
52
- const PRIORITY_LEVELS = [
53
- { id: 'low', label: 'Low', icon: 'arrow-down', color: '#34C759' },
54
- { id: 'medium', label: 'Medium', icon: 'remove', color: '#FF9500' },
55
- { id: 'high', label: 'High', icon: 'arrow-up', color: '#FF3B30' },
56
- { id: 'critical', label: 'Critical', icon: 'warning', color: '#FF0000' },
57
- ];
58
-
59
- const CATEGORIES = {
60
- bug: ['UI/UX', 'Performance', 'Authentication', 'File Management', 'Billing', 'Other'],
61
- feature: ['User Interface', 'File Management', 'Security', 'Performance', 'Integration', 'Other'],
62
- general: ['User Experience', 'Design', 'Performance', 'Documentation', 'Other'],
63
- support: ['Account Issues', 'Billing', 'Technical Problems', 'Feature Questions', 'Other'],
64
- };
65
-
66
- // Styles factory function
67
- const createStyles = (colors: any, theme: string) => StyleSheet.create({
68
- container: {
69
- flex: 1,
70
- },
71
- fullBleed: {
72
- width: '100%',
73
- alignSelf: 'stretch',
74
- },
75
- scrollContent: {
76
- flexGrow: 1,
77
- ...screenContentStyle,
78
- },
79
- stepContainer: {
80
- flex: 1,
81
- justifyContent: 'flex-start',
82
- alignItems: 'flex-start',
83
- },
84
- modernHeader: {
85
- alignItems: 'flex-start',
86
- width: '100%',
87
- marginBottom: 24,
88
- },
89
- modernTitle: {
90
- fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
91
- fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
92
- fontSize: 42,
93
- lineHeight: 48,
94
- marginBottom: 12,
95
- textAlign: 'left',
96
- letterSpacing: -1,
97
- },
98
- modernSubtitle: {
99
- fontSize: 18,
100
- lineHeight: 24,
101
- textAlign: 'left',
102
- opacity: 0.8,
103
- marginBottom: 24,
104
- },
105
- stepTitle: {
106
- fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
107
- fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
108
- fontSize: 42,
109
- lineHeight: 48,
110
- marginBottom: 12,
111
- textAlign: 'left',
112
- letterSpacing: -1,
113
- },
114
- inputContainer: {
115
- width: '100%',
116
- marginBottom: 24,
117
- },
118
- premiumInputWrapper: {
119
- flexDirection: 'row',
120
- alignItems: 'center',
121
- height: 56,
122
- borderRadius: 16,
123
- paddingHorizontal: 20,
124
- borderWidth: 2,
125
- backgroundColor: colors.inputBackground,
126
- },
127
- textAreaWrapper: {
128
- flexDirection: 'column',
129
- alignItems: 'flex-start',
130
- minHeight: 120,
131
- borderRadius: 16,
132
- paddingHorizontal: 20,
133
- paddingVertical: 16,
134
- borderWidth: 2,
135
- backgroundColor: colors.inputBackground,
136
- },
137
- inputIcon: {
138
- marginRight: 12,
139
- },
140
- inputContent: {
141
- flex: 1,
142
- },
143
- modernLabel: {
144
- fontSize: 12,
145
- fontWeight: '500',
146
- marginBottom: 2,
147
- },
148
- modernInput: {
149
- flex: 1,
150
- fontSize: 16,
151
- height: '100%',
152
- },
153
- textArea: {
154
- flex: 1,
155
- fontSize: 16,
156
- textAlignVertical: 'top',
157
- minHeight: 80,
158
- },
159
- typeGrid: {
160
- flexDirection: 'row',
161
- flexWrap: 'wrap',
162
- gap: 12,
163
- marginBottom: 24,
164
- },
165
- typeCard: {
166
- width: (Dimensions.get('window').width - 72) / 2,
167
- padding: 20,
168
- borderRadius: 16,
169
- borderWidth: 2,
170
- alignItems: 'center',
171
- justifyContent: 'center',
172
- minHeight: 120,
173
- },
174
- typeIcon: {
175
- marginBottom: 12,
176
- },
177
- typeLabel: {
178
- fontSize: 16,
179
- fontWeight: '600',
180
- textAlign: 'center',
181
- marginBottom: 4,
182
- },
183
- typeDescription: {
184
- fontSize: 12,
185
- textAlign: 'center',
186
- opacity: 0.8,
187
- },
188
- priorityContainer: {
189
- flexDirection: 'row',
190
- justifyContent: 'space-between',
191
- marginBottom: 24,
192
- },
193
- priorityButton: {
194
- flex: 1,
195
- padding: 16,
196
- borderRadius: 12,
197
- borderWidth: 2,
198
- alignItems: 'center',
199
- marginHorizontal: 4,
200
- },
201
- priorityLabel: {
202
- fontSize: 12,
203
- fontWeight: '600',
204
- marginTop: 4,
205
- },
206
- categoryContainer: {
207
- marginBottom: 24,
208
- },
209
- categoryButton: {
210
- flexDirection: 'row',
211
- alignItems: 'center',
212
- paddingVertical: 12,
213
- paddingHorizontal: 16,
214
- borderRadius: 12,
215
- borderWidth: 1,
216
- marginBottom: 8,
217
- },
218
- categoryText: {
219
- fontSize: 16,
220
- marginLeft: 12,
221
- },
222
- checkboxContainer: {
223
- flexDirection: 'row',
224
- alignItems: 'center',
225
- marginBottom: 24,
226
- },
227
- checkbox: {
228
- width: 24,
229
- height: 24,
230
- borderRadius: 6,
231
- borderWidth: 2,
232
- marginRight: 12,
233
- alignItems: 'center',
234
- justifyContent: 'center',
235
- },
236
- checkboxText: {
237
- fontSize: 16,
238
- flex: 1,
239
- },
240
- button: {
241
- flexDirection: 'row',
242
- alignItems: 'center',
243
- justifyContent: 'center',
244
- paddingVertical: 18,
245
- paddingHorizontal: 32,
246
- borderRadius: 16,
247
- marginVertical: 8,
248
- gap: 8,
249
- width: '100%',
250
- ...Platform.select({
251
- web: {
252
- boxShadow: '0 4px 8px rgba(0,0,0,0.3)',
253
- },
254
- default: {
255
- shadowOffset: { width: 0, height: 4 },
256
- shadowOpacity: 0.3,
257
- shadowRadius: 8,
258
- elevation: 6,
259
- }
260
- }),
261
- },
262
- buttonText: {
263
- color: '#FFFFFF',
264
- fontSize: 16,
265
- fontWeight: '600',
266
- letterSpacing: 0.5,
267
- },
268
- navigationButtons: {
269
- flexDirection: 'row',
270
- justifyContent: 'center',
271
- marginTop: 16,
272
- marginBottom: 8,
273
- width: '100%',
274
- gap: 8,
275
- },
276
- navButton: {
277
- flexDirection: 'row',
278
- alignItems: 'center',
279
- paddingVertical: 6,
280
- paddingHorizontal: 12,
281
- gap: 6,
282
- minWidth: 70,
283
- borderWidth: 1,
284
- ...Platform.select({
285
- web: {
286
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
287
- },
288
- default: {
289
- shadowOffset: { width: 0, height: 2 },
290
- shadowOpacity: 0.1,
291
- shadowRadius: 4,
292
- elevation: 2,
293
- }
294
- }),
295
- },
296
- backButton: {
297
- backgroundColor: 'transparent',
298
- borderTopLeftRadius: 35,
299
- borderBottomLeftRadius: 35,
300
- borderTopRightRadius: 12,
301
- borderBottomRightRadius: 12,
302
- },
303
- nextButton: {
304
- backgroundColor: 'transparent',
305
- borderTopRightRadius: 35,
306
- borderBottomRightRadius: 35,
307
- borderTopLeftRadius: 12,
308
- borderBottomLeftRadius: 12,
309
- },
310
- navButtonText: {
311
- fontSize: 13,
312
- fontWeight: '500',
313
- },
314
- progressContainer: {
315
- flexDirection: 'row',
316
- justifyContent: 'center',
317
- marginBottom: 20,
318
- marginTop: 8,
319
- },
320
- progressDot: {
321
- height: 10,
322
- width: 10,
323
- borderRadius: 5,
324
- marginHorizontal: 6,
325
- borderWidth: 2,
326
- borderColor: '#fff',
327
- ...Platform.select({
328
- web: {
329
- boxShadow: '0 1px 2px rgba(0,0,0,0.08)',
330
- },
331
- default: {
332
- shadowColor: colors.primary,
333
- shadowOpacity: 0.08,
334
- shadowOffset: { width: 0, height: 1 },
335
- shadowRadius: 2,
336
- elevation: 1,
337
- }
338
- }),
339
- },
340
- summaryContainer: {
341
- padding: 0,
342
- marginBottom: 24,
343
- width: '100%',
344
- },
345
- summaryRow: {
346
- flexDirection: 'row',
347
- marginBottom: 10,
348
- },
349
- summaryLabel: {
350
- fontSize: 15,
351
- width: 90,
352
- },
353
- summaryValue: {
354
- fontSize: 15,
355
- fontWeight: '600',
356
- flex: 1,
357
- },
358
- successContainer: {
359
- alignItems: 'center',
360
- justifyContent: 'center',
361
- padding: 40,
362
- },
363
- successIcon: {
364
- marginBottom: 24,
365
- },
366
- successTitle: {
367
- fontSize: 24,
368
- fontWeight: 'bold',
369
- marginBottom: 12,
370
- textAlign: 'center',
371
- },
372
- successMessage: {
373
- fontSize: 16,
374
- textAlign: 'center',
375
- opacity: 0.8,
376
- marginBottom: 24,
377
- },
378
- });
379
-
380
- // Custom hooks for better separation of concerns
381
- const useFeedbackForm = () => {
382
- const [feedbackData, setFeedbackData] = useState<FeedbackData>({
383
- type: 'general',
384
- title: '',
385
- description: '',
386
- priority: 'medium',
387
- category: '',
388
- contactEmail: '',
389
- systemInfo: true,
390
- });
391
-
392
- const [feedbackState, setFeedbackState] = useState<FeedbackState>({
393
- status: 'idle',
394
- message: ''
395
- });
396
-
397
- const updateField = useCallback((field: keyof FeedbackData, value: any) => {
398
- setFeedbackData(prev => ({ ...prev, [field]: value }));
399
- }, []);
400
-
401
- const resetForm = useCallback(() => {
402
- setFeedbackData({
403
- type: 'general',
404
- title: '',
405
- description: '',
406
- priority: 'medium',
407
- category: '',
408
- contactEmail: '',
409
- systemInfo: true,
410
- });
411
- setFeedbackState({ status: 'idle', message: '' });
412
- }, []);
413
-
414
- return {
415
- feedbackData,
416
- feedbackState,
417
- setFeedbackState,
418
- updateField,
419
- resetForm
420
- };
421
- };
422
-
423
- // Reusable components
424
- const FormInput: React.FC<{
425
- icon: string;
426
- label: string;
427
- value: string;
428
- onChangeText: (text: string) => void;
429
- placeholder?: string;
430
- multiline?: boolean;
431
- numberOfLines?: number;
432
- testID?: string;
433
- colors: any;
434
- styles: any;
435
- borderColor?: string;
436
- }> = React.memo(({
437
- icon,
438
- label,
439
- value,
440
- onChangeText,
441
- placeholder,
442
- multiline = false,
443
- numberOfLines = 1,
444
- testID,
445
- colors,
446
- styles,
447
- borderColor,
448
- }) => (
449
- <View style={styles.inputContainer}>
450
- <View style={[
451
- multiline ? styles.textAreaWrapper : styles.premiumInputWrapper,
452
- {
453
- borderColor: borderColor || colors.border,
454
- backgroundColor: colors.inputBackground,
455
- shadowColor: colors.primary,
456
- shadowOffset: { width: 0, height: 4 },
457
- shadowOpacity: 0.1,
458
- shadowRadius: 12,
459
- elevation: 3,
460
- }
461
- ]}>
462
- {!multiline && (
463
- <Ionicons
464
- name={icon as any}
465
- size={22}
466
- color={colors.secondaryText}
467
- style={styles.inputIcon}
468
- />
469
- )}
470
- <View style={styles.inputContent}>
471
- <Text style={[styles.modernLabel, { color: colors.secondaryText }]}>
472
- {label}
473
- </Text>
474
- <TextInput
475
- style={[
476
- multiline ? styles.textArea : styles.modernInput,
477
- { color: colors.text }
478
- ]}
479
- value={value}
480
- onChangeText={onChangeText}
481
- placeholder={placeholder}
482
- placeholderTextColor={colors.secondaryText + '60'}
483
- multiline={multiline}
484
- numberOfLines={multiline ? numberOfLines : undefined}
485
- testID={testID}
486
- />
487
- </View>
488
- </View>
489
- </View>
490
- ));
491
-
492
- const ProgressIndicator: React.FC<{ currentStep: number; totalSteps: number; colors: any; styles: any }> = React.memo(({ currentStep, totalSteps, colors, styles }) => (
493
- <View style={styles.progressContainer}>
494
- {Array.from({ length: totalSteps }, (_, index) => (
495
- <View
496
- key={index}
497
- style={[
498
- styles.progressDot,
499
- currentStep === index ?
500
- { backgroundColor: colors.primary, width: 24 } :
501
- { backgroundColor: colors.border }
502
- ]}
503
- />
504
- ))}
505
- </View>
506
- ));
23
+ import {
24
+ FormInput,
25
+ ProgressIndicator,
26
+ useFeedbackForm,
27
+ createFeedbackStyles,
28
+ FEEDBACK_TYPES,
29
+ PRIORITY_LEVELS,
30
+ CATEGORIES,
31
+ } from '../components/feedback';
507
32
 
508
- // Main component
509
33
  const FeedbackScreen: React.FC<BaseScreenProps> = ({
510
34
  navigate,
511
35
  goBack,
512
36
  onClose,
513
37
  theme,
514
38
  }) => {
515
- // Use useOxy() hook for OxyContext values
516
39
  const { user, oxyServices } = useOxy();
517
40
  const normalizedTheme = normalizeTheme(theme);
518
41
  const colors = useThemeColors(normalizedTheme);
519
42
  const { t } = useI18n();
520
43
 
521
- // Form state
522
44
  const { feedbackData, feedbackState, setFeedbackState, updateField, resetForm } = useFeedbackForm();
523
45
 
524
- // UI state
525
46
  const [currentStep, setCurrentStep] = useState(0);
526
47
  const [errorMessage, setErrorMessage] = useState('');
527
48
 
528
- // Animation refs
529
49
  const fadeAnim = useRef(new Animated.Value(1)).current;
530
50
  const slideAnim = useRef(new Animated.Value(0)).current;
531
51
 
532
- // Memoized styles
533
- const styles = useMemo(() => createStyles(colors, normalizedTheme), [colors, normalizedTheme]);
52
+ const styles = useMemo(() => createFeedbackStyles(colors as any), [colors]);
534
53
 
535
- // Animation functions
536
54
  const animateTransition = useCallback((nextStep: number) => {
537
55
  Animated.timing(fadeAnim, {
538
56
  toValue: 0,
@@ -569,7 +87,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
569
87
  }
570
88
  }, [currentStep, animateTransition]);
571
89
 
572
- // Form validation helpers
573
90
  const isTypeStepValid = useCallback(() => {
574
91
  return feedbackData.type && feedbackData.category;
575
92
  }, [feedbackData.type, feedbackData.category]);
@@ -582,7 +99,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
582
99
  return feedbackData.contactEmail.trim() || user?.email;
583
100
  }, [feedbackData.contactEmail, user?.email]);
584
101
 
585
- // Submit feedback handler
586
102
  const handleSubmitFeedback = useCallback(async () => {
587
103
  if (!isTypeStepValid() || !isDetailsStepValid() || !isContactStepValid()) {
588
104
  toast.error(t('feedback.toasts.fillRequired') || 'Please fill in all required fields');
@@ -593,7 +109,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
593
109
  setFeedbackState({ status: 'submitting', message: '' });
594
110
  setErrorMessage('');
595
111
 
596
- // Prepare feedback data
597
112
  const feedbackPayload = {
598
113
  type: feedbackData.type,
599
114
  title: feedbackData.title,
@@ -611,15 +126,11 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
611
126
  } : undefined,
612
127
  };
613
128
 
614
- // TODO: Implement actual API integration
615
- // Replace setTimeout simulation with actual API call: await oxyServices.submitFeedback(feedbackPayload)
616
- // Currently simulates API call with setTimeout for development/testing purposes
617
- await new Promise(resolve => setTimeout(resolve, 2000)); // Simulate API call
129
+ await oxyServices.submitFeedback(feedbackPayload);
618
130
 
619
131
  setFeedbackState({ status: 'success', message: t('feedback.toasts.submitSuccess') || 'Feedback submitted successfully!' });
620
132
  toast.success(t('feedback.toasts.thanks') || 'Thank you for your feedback!');
621
133
 
622
- // Reset form after success
623
134
  setTimeout(() => {
624
135
  resetForm();
625
136
  setCurrentStep(0);
@@ -629,24 +140,22 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
629
140
  setFeedbackState({ status: 'error', message: error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback') });
630
141
  toast.error(error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback'));
631
142
  }
632
- }, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm]);
143
+ }, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm, setFeedbackState, t]);
633
144
 
634
- // Step components
635
- // Memoized grouped section items
636
145
  const feedbackTypeItems = useMemo(() => FEEDBACK_TYPES.map(type => ({
637
146
  id: type.id,
638
147
  icon: type.icon,
639
148
  iconColor: type.color,
640
149
  title: type.label,
641
150
  subtitle: type.description,
642
- onPress: () => { updateField('type', type.id); updateField('category', ''); },
151
+ onPress: () => { updateField('type', type.id as any); updateField('category', ''); },
643
152
  selected: feedbackData.type === type.id,
644
153
  showChevron: false,
645
154
  multiRow: true,
646
155
  dense: true,
647
156
  })), [feedbackData.type, updateField]);
648
157
 
649
- const categoryItems = useMemo(() => (feedbackData.type ? (CATEGORIES[feedbackData.type as keyof typeof CATEGORIES] || []).map(cat => ({
158
+ const categoryItems = useMemo(() => (feedbackData.type ? (CATEGORIES[feedbackData.type] || []).map(cat => ({
650
159
  id: cat,
651
160
  icon: feedbackData.category === cat ? 'check-circle' : 'ellipse-outline',
652
161
  iconColor: feedbackData.category === cat ? colors.primary : colors.secondaryText,
@@ -662,17 +171,14 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
662
171
  icon: p.icon,
663
172
  iconColor: p.color,
664
173
  title: p.label,
665
- onPress: () => updateField('priority', p.id),
174
+ onPress: () => updateField('priority', p.id as any),
666
175
  selected: feedbackData.priority === p.id,
667
176
  showChevron: false,
668
177
  dense: true,
669
178
  })), [feedbackData.priority, updateField]);
670
179
 
671
- const renderTypeStep = useCallback(() => (
672
- <Animated.View style={[
673
- styles.stepContainer,
674
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
675
- ]}>
180
+ const renderTypeStep = () => (
181
+ <Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
676
182
  <View style={styles.modernHeader}>
677
183
  <Text style={[styles.stepTitle, { color: colors.text }]}>
678
184
  {t('feedback.type.title') || 'What type of feedback?'}
@@ -687,7 +193,9 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
687
193
 
688
194
  {feedbackData.type && (
689
195
  <View style={styles.categoryContainer}>
690
- <Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>{t('feedback.category.label') || 'Category'}</Text>
196
+ <Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
197
+ {t('feedback.category.label') || 'Category'}
198
+ </Text>
691
199
  <View style={styles.fullBleed}>
692
200
  <GroupedSection items={categoryItems} />
693
201
  </View>
@@ -696,46 +204,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
696
204
 
697
205
  <View style={styles.navigationButtons}>
698
206
  <TouchableOpacity
699
- style={[styles.navButton, {
700
- backgroundColor: 'transparent',
701
- borderColor: colors.border,
702
- shadowColor: colors.border,
703
- borderTopLeftRadius: 35,
704
- borderBottomLeftRadius: 35,
705
- borderTopRightRadius: 35,
706
- borderBottomRightRadius: 35,
707
- }]}
207
+ style={[styles.navButton, { backgroundColor: 'transparent', borderColor: colors.border, borderRadius: 35 }]}
708
208
  onPress={goBack}
209
+ accessibilityRole="button"
210
+ accessibilityLabel="Go back"
709
211
  >
710
212
  <Ionicons name="arrow-back" size={16} color={colors.text} />
711
213
  <Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
712
214
  </TouchableOpacity>
713
215
 
714
216
  <TouchableOpacity
715
- style={[styles.navButton, {
716
- backgroundColor: colors.primary,
717
- borderColor: colors.primary,
718
- shadowColor: colors.primary,
719
- borderTopLeftRadius: 35,
720
- borderBottomLeftRadius: 35,
721
- borderTopRightRadius: 35,
722
- borderBottomRightRadius: 35,
723
- }]}
217
+ style={[styles.navButton, { backgroundColor: colors.primary, borderColor: colors.primary, borderRadius: 35 }]}
724
218
  onPress={nextStep}
725
219
  disabled={!isTypeStepValid()}
220
+ accessibilityRole="button"
221
+ accessibilityLabel="Continue to next step"
726
222
  >
727
223
  <Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
728
224
  <Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
729
225
  </TouchableOpacity>
730
226
  </View>
731
227
  </Animated.View>
732
- ), [fadeAnim, slideAnim, colors, feedbackData, feedbackTypeItems, categoryItems, updateField, goBack, nextStep, isTypeStepValid, styles, theme]);
228
+ );
733
229
 
734
- const renderDetailsStep = useCallback(() => (
735
- <Animated.View style={[
736
- styles.stepContainer,
737
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
738
- ]}>
230
+ const renderDetailsStep = () => (
231
+ <Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
739
232
  <View style={styles.modernHeader}>
740
233
  <Text style={[styles.stepTitle, { color: colors.text }]}>
741
234
  {t('feedback.details.title') || 'Tell us more'}
@@ -749,34 +242,34 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
749
242
  icon="create-outline"
750
243
  label={t('feedback.fields.title.label') || 'Title'}
751
244
  value={feedbackData.title}
752
- onChangeText={(text) => {
753
- updateField('title', text);
754
- setErrorMessage('');
755
- }}
245
+ onChangeText={(text) => { updateField('title', text); setErrorMessage(''); }}
756
246
  placeholder={t('feedback.fields.title.placeholder') || 'Brief summary of your feedback'}
757
247
  testID="feedback-title-input"
758
- colors={colors}
248
+ colors={colors as any}
759
249
  styles={styles}
250
+ accessibilityLabel="Feedback title"
251
+ accessibilityHint="Enter a brief summary of your feedback"
760
252
  />
761
253
 
762
254
  <FormInput
763
255
  icon="document-text-outline"
764
256
  label={t('feedback.fields.description.label') || 'Description'}
765
257
  value={feedbackData.description}
766
- onChangeText={(text) => {
767
- updateField('description', text);
768
- setErrorMessage('');
769
- }}
258
+ onChangeText={(text) => { updateField('description', text); setErrorMessage(''); }}
770
259
  placeholder={t('feedback.fields.description.placeholder') || 'Please provide detailed information...'}
771
260
  multiline={true}
772
261
  numberOfLines={6}
773
262
  testID="feedback-description-input"
774
- colors={colors}
263
+ colors={colors as any}
775
264
  styles={styles}
265
+ accessibilityLabel="Feedback description"
266
+ accessibilityHint="Provide detailed information about your feedback"
776
267
  />
777
268
 
778
269
  <View style={{ marginBottom: 24 }}>
779
- <Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>{t('feedback.priority.label') || 'Priority Level'}</Text>
270
+ <Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
271
+ {t('feedback.priority.label') || 'Priority Level'}
272
+ </Text>
780
273
  <View style={styles.fullBleed}>
781
274
  <GroupedSection items={priorityItems} />
782
275
  </View>
@@ -784,37 +277,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
784
277
 
785
278
  <View style={styles.navigationButtons}>
786
279
  <TouchableOpacity
787
- style={[styles.navButton, styles.backButton, {
788
- borderColor: colors.border,
789
- shadowColor: colors.border,
790
- }]}
280
+ style={[styles.navButton, styles.backButton, { borderColor: colors.border }]}
791
281
  onPress={prevStep}
282
+ accessibilityRole="button"
283
+ accessibilityLabel="Go back"
792
284
  >
793
285
  <Ionicons name="arrow-back" size={16} color={colors.text} />
794
286
  <Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
795
287
  </TouchableOpacity>
796
288
 
797
289
  <TouchableOpacity
798
- style={[styles.navButton, styles.nextButton, {
799
- backgroundColor: colors.primary,
800
- borderColor: colors.primary,
801
- shadowColor: colors.primary,
802
- }]}
290
+ style={[styles.navButton, styles.nextButton, { backgroundColor: colors.primary, borderColor: colors.primary }]}
803
291
  onPress={nextStep}
804
292
  disabled={!isDetailsStepValid()}
293
+ accessibilityRole="button"
294
+ accessibilityLabel="Continue to next step"
805
295
  >
806
296
  <Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
807
297
  <Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
808
298
  </TouchableOpacity>
809
299
  </View>
810
300
  </Animated.View>
811
- ), [fadeAnim, slideAnim, colors, feedbackData, updateField, setErrorMessage, prevStep, nextStep, isDetailsStepValid, styles, priorityItems, theme]);
301
+ );
812
302
 
813
- const renderContactStep = useCallback(() => (
814
- <Animated.View style={[
815
- styles.stepContainer,
816
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
817
- ]}>
303
+ const renderContactStep = () => (
304
+ <Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
818
305
  <View style={styles.modernHeader}>
819
306
  <Text style={[styles.stepTitle, { color: colors.text }]}>
820
307
  {t('feedback.contact.title') || 'Contact Information'}
@@ -828,14 +315,13 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
828
315
  icon="mail-outline"
829
316
  label={t('feedback.fields.email.label') || 'Email Address'}
830
317
  value={feedbackData.contactEmail}
831
- onChangeText={(text) => {
832
- updateField('contactEmail', text);
833
- setErrorMessage('');
834
- }}
318
+ onChangeText={(text) => { updateField('contactEmail', text); setErrorMessage(''); }}
835
319
  placeholder={user?.email || (t('feedback.fields.email.placeholder') || 'Enter your email address')}
836
320
  testID="feedback-email-input"
837
- colors={colors}
321
+ colors={colors as any}
838
322
  styles={styles}
323
+ accessibilityLabel="Email address"
324
+ accessibilityHint="Enter your email so we can respond"
839
325
  />
840
326
 
841
327
  <View style={styles.checkboxContainer}>
@@ -848,10 +334,11 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
848
334
  }
849
335
  ]}
850
336
  onPress={() => updateField('systemInfo', !feedbackData.systemInfo)}
337
+ accessibilityRole="checkbox"
338
+ accessibilityState={{ checked: feedbackData.systemInfo }}
339
+ accessibilityLabel="Include system information"
851
340
  >
852
- {feedbackData.systemInfo && (
853
- <Ionicons name="checkmark" size={16} color="#FFFFFF" />
854
- )}
341
+ {feedbackData.systemInfo && <Ionicons name="checkmark" size={16} color="#FFFFFF" />}
855
342
  </TouchableOpacity>
856
343
  <Text style={[styles.checkboxText, { color: colors.text }]}>
857
344
  {t('feedback.contact.includeSystemInfo') || 'Include system information to help us better understand your issue'}
@@ -860,37 +347,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
860
347
 
861
348
  <View style={styles.navigationButtons}>
862
349
  <TouchableOpacity
863
- style={[styles.navButton, styles.backButton, {
864
- borderColor: colors.border,
865
- shadowColor: colors.border,
866
- }]}
350
+ style={[styles.navButton, styles.backButton, { borderColor: colors.border }]}
867
351
  onPress={prevStep}
352
+ accessibilityRole="button"
353
+ accessibilityLabel="Go back"
868
354
  >
869
355
  <Ionicons name="arrow-back" size={16} color={colors.text} />
870
356
  <Text style={[styles.navButtonText, { color: colors.text }]}>Back</Text>
871
357
  </TouchableOpacity>
872
358
 
873
359
  <TouchableOpacity
874
- style={[styles.navButton, styles.nextButton, {
875
- backgroundColor: colors.primary,
876
- borderColor: colors.primary,
877
- shadowColor: colors.primary,
878
- }]}
360
+ style={[styles.navButton, styles.nextButton, { backgroundColor: colors.primary, borderColor: colors.primary }]}
879
361
  onPress={nextStep}
880
362
  disabled={!isContactStepValid()}
363
+ accessibilityRole="button"
364
+ accessibilityLabel="Continue to summary"
881
365
  >
882
366
  <Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>Next</Text>
883
367
  <Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
884
368
  </TouchableOpacity>
885
369
  </View>
886
370
  </Animated.View>
887
- ), [fadeAnim, slideAnim, colors, feedbackData, user, updateField, setErrorMessage, prevStep, nextStep, isContactStepValid, styles]);
371
+ );
888
372
 
889
- const renderSummaryStep = useCallback(() => (
890
- <Animated.View style={[
891
- styles.stepContainer,
892
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
893
- ]}>
373
+ const renderSummaryStep = () => (
374
+ <Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
894
375
  <View style={styles.modernHeader}>
895
376
  <Text style={[styles.stepTitle, { color: colors.text }]}>
896
377
  {t('feedback.summary.title') || 'Summary'}
@@ -902,31 +383,27 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
902
383
 
903
384
  <View style={styles.summaryContainer}>
904
385
  <View style={styles.summaryRow}>
905
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.type') || 'Type:'}</Text>
386
+ <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Type:</Text>
906
387
  <Text style={[styles.summaryValue, { color: colors.text }]}>
907
388
  {FEEDBACK_TYPES.find(t => t.id === feedbackData.type)?.label}
908
389
  </Text>
909
390
  </View>
910
-
911
391
  <View style={styles.summaryRow}>
912
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.category') || 'Category:'}</Text>
392
+ <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Category:</Text>
913
393
  <Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.category}</Text>
914
394
  </View>
915
-
916
395
  <View style={styles.summaryRow}>
917
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.priority') || 'Priority:'}</Text>
396
+ <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Priority:</Text>
918
397
  <Text style={[styles.summaryValue, { color: colors.text }]}>
919
398
  {PRIORITY_LEVELS.find(p => p.id === feedbackData.priority)?.label}
920
399
  </Text>
921
400
  </View>
922
-
923
401
  <View style={styles.summaryRow}>
924
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.titleLabel') || 'Title:'}</Text>
402
+ <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Title:</Text>
925
403
  <Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.title}</Text>
926
404
  </View>
927
-
928
405
  <View style={styles.summaryRow}>
929
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>{t('feedback.summary.contact') || 'Contact:'}</Text>
406
+ <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Contact:</Text>
930
407
  <Text style={[styles.summaryValue, { color: colors.text }]}>
931
408
  {feedbackData.contactEmail || user?.email}
932
409
  </Text>
@@ -938,6 +415,8 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
938
415
  onPress={handleSubmitFeedback}
939
416
  disabled={feedbackState.status === 'submitting'}
940
417
  testID="submit-feedback-button"
418
+ accessibilityRole="button"
419
+ accessibilityLabel="Submit feedback"
941
420
  >
942
421
  {feedbackState.status === 'submitting' ? (
943
422
  <ActivityIndicator color="#FFFFFF" size="small" />
@@ -951,32 +430,23 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
951
430
 
952
431
  <View style={styles.navigationButtons}>
953
432
  <TouchableOpacity
954
- style={[styles.navButton, {
955
- backgroundColor: 'transparent',
956
- borderColor: colors.border,
957
- shadowColor: colors.border,
958
- borderTopLeftRadius: 35,
959
- borderBottomLeftRadius: 35,
960
- borderTopRightRadius: 35,
961
- borderBottomRightRadius: 35,
962
- }]}
433
+ style={[styles.navButton, { backgroundColor: 'transparent', borderColor: colors.border, borderRadius: 35 }]}
963
434
  onPress={prevStep}
435
+ accessibilityRole="button"
436
+ accessibilityLabel="Go back"
964
437
  >
965
438
  <Ionicons name="arrow-back" size={16} color={colors.text} />
966
439
  <Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
967
440
  </TouchableOpacity>
968
441
  </View>
969
442
  </Animated.View>
970
- ), [fadeAnim, slideAnim, colors, feedbackData, user, feedbackState.status, handleSubmitFeedback, prevStep, styles]);
443
+ );
971
444
 
972
- const renderSuccessStep = useCallback(() => (
973
- <Animated.View style={[
974
- styles.stepContainer,
975
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
976
- ]}>
445
+ const renderSuccessStep = () => (
446
+ <Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
977
447
  <View style={styles.successContainer}>
978
- <View style={[styles.successIcon, { backgroundColor: colors.success + '20', padding: 24, borderRadius: 50 }]}>
979
- <Ionicons name="checkmark-circle" size={48} color={colors.success} />
448
+ <View style={[styles.successIcon, { backgroundColor: (colors.success || '#34C759') + '20', padding: 24, borderRadius: 50 }]}>
449
+ <Ionicons name="checkmark-circle" size={48} color={colors.success || '#34C759'} />
980
450
  </View>
981
451
  <Text style={[styles.successTitle, { color: colors.text }]}>
982
452
  {t('feedback.success.thanks') || 'Thank You!'}
@@ -986,23 +456,18 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
986
456
  </Text>
987
457
  <TouchableOpacity
988
458
  style={[styles.button, { backgroundColor: colors.primary }]}
989
- onPress={() => {
990
- resetForm();
991
- setCurrentStep(0);
992
- }}
459
+ onPress={() => { resetForm(); setCurrentStep(0); }}
460
+ accessibilityRole="button"
461
+ accessibilityLabel="Submit another feedback"
993
462
  >
994
463
  <Text style={styles.buttonText}>{t('feedback.actions.submitAnother') || 'Submit Another'}</Text>
995
464
  </TouchableOpacity>
996
465
  </View>
997
466
  </Animated.View>
998
- ), [fadeAnim, slideAnim, colors, resetForm, styles]);
999
-
1000
- // Render current step
1001
- const renderCurrentStep = useCallback(() => {
1002
- if (feedbackState.status === 'success') {
1003
- return renderSuccessStep();
1004
- }
467
+ );
1005
468
 
469
+ const renderCurrentStep = () => {
470
+ if (feedbackState.status === 'success') return renderSuccessStep();
1006
471
  switch (currentStep) {
1007
472
  case 0: return renderTypeStep();
1008
473
  case 1: return renderDetailsStep();
@@ -1010,7 +475,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
1010
475
  case 3: return renderSummaryStep();
1011
476
  default: return renderTypeStep();
1012
477
  }
1013
- }, [currentStep, feedbackState.status, renderTypeStep, renderDetailsStep, renderContactStep, renderSummaryStep, renderSuccessStep]);
478
+ };
1014
479
 
1015
480
  return (
1016
481
  <KeyboardAvoidingView
@@ -1028,7 +493,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
1028
493
  keyboardShouldPersistTaps="handled"
1029
494
  >
1030
495
  {feedbackState.status !== 'success' && (
1031
- <ProgressIndicator currentStep={currentStep} totalSteps={4} colors={colors} styles={styles} />
496
+ <ProgressIndicator currentStep={currentStep} totalSteps={4} colors={colors as any} styles={styles} />
1032
497
  )}
1033
498
  {renderCurrentStep()}
1034
499
  </ScrollView>
@@ -1036,4 +501,4 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
1036
501
  );
1037
502
  };
1038
503
 
1039
- export default FeedbackScreen;
504
+ export default FeedbackScreen;