@mediacubeco/expo-template-fsd 2.3.0 → 2.4.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 (333) hide show
  1. package/.claude/commands/git-commit.md +164 -0
  2. package/.claude/rules/architecture.md +38 -0
  3. package/.claude/rules/{prettier-eslint-typescript.mdc → prettier-eslint-typescript.md} +5 -10
  4. package/.claude/settings.json +2 -2
  5. package/.claude/skills/api/SKILL.md +362 -0
  6. package/.claude/skills/api/references/client/overview.md +106 -0
  7. package/.claude/skills/api/references/hooks/index.ts +3 -0
  8. package/.claude/skills/api/references/hooks/use-api-health.ts +25 -0
  9. package/.claude/skills/api/references/hooks/use-api-post.ts +46 -0
  10. package/.claude/skills/api/references/hooks/use-api-posts.ts +24 -0
  11. package/.claude/skills/api/references/mock/post.mock.ts +29 -0
  12. package/.claude/skills/{generate-api-model/references → api/references/model}/entities/common.ts +5 -2
  13. package/.claude/skills/api/references/model/resources/common.ts +9 -0
  14. package/.claude/skills/api/references/queries/health.ts +14 -0
  15. package/.claude/skills/api/references/queries/index.ts +2 -0
  16. package/.claude/skills/api/references/queries/post.ts +23 -0
  17. package/.claude/skills/api/references/repository/health/health.ts +11 -0
  18. package/.claude/skills/api/references/repository/health/health.types.ts +25 -0
  19. package/.claude/skills/api/references/repository/health/index.ts +2 -0
  20. package/.claude/skills/api/references/repository/post/index.ts +9 -0
  21. package/.claude/skills/api/references/repository/post/post.ts +34 -0
  22. package/.claude/skills/api/references/repository/post/post.types.ts +61 -0
  23. package/.claude/skills/code-style/SKILL.md +1025 -1
  24. package/.claude/skills/code-style/references/components/payout-speed-option/index.ts +2 -0
  25. package/.claude/skills/code-style/references/components/payout-speed-option/payout-speed-option.styles.ts +76 -0
  26. package/.claude/skills/code-style/references/components/payout-speed-option/payout-speed-option.tsx +58 -0
  27. package/.claude/skills/code-style/references/components/payout-speed-option/payout-speed-option.types.ts +22 -0
  28. package/.claude/skills/code-style/references/components/post/index.ts +2 -0
  29. package/.claude/skills/code-style/references/components/post/post.styles.ts +19 -0
  30. package/.claude/skills/code-style/references/components/post/post.tsx +21 -0
  31. package/.claude/skills/code-style/references/components/post/post.types.ts +9 -0
  32. package/.claude/skills/code-style/references/components/wrap/index.ts +2 -0
  33. package/.claude/skills/code-style/references/components/wrap/wrap.styles.ts +15 -0
  34. package/.claude/skills/code-style/references/components/wrap/wrap.tsx +31 -0
  35. package/.claude/skills/code-style/references/components/wrap/wrap.types.ts +10 -0
  36. package/.claude/skills/code-style/references/hooks/use-posts.ts +37 -0
  37. package/.claude/skills/code-style/references/pages/post/index.ts +4 -0
  38. package/.claude/skills/code-style/references/pages/post/post-details/index.ts +1 -0
  39. package/.claude/skills/code-style/references/pages/post/post-details/post-details.tsx +13 -0
  40. package/.claude/skills/code-style/references/pages/post/post-guide/index.ts +1 -0
  41. package/.claude/skills/code-style/references/pages/post/post-guide/post-guide.tsx +17 -0
  42. package/.claude/skills/code-style/references/pages/post/post-list/index.ts +1 -0
  43. package/.claude/skills/code-style/references/pages/post/post-list/post-list.styles.ts +17 -0
  44. package/.claude/skills/code-style/references/pages/post/post-list/post-list.tsx +25 -0
  45. package/.claude/skills/code-style/references/pages/post/post-share/index.ts +1 -0
  46. package/.claude/skills/code-style/references/pages/post/post-share/post-share.tsx +13 -0
  47. package/.claude/skills/code-style/references/routes/(stack)/_layout.tsx +18 -0
  48. package/.claude/skills/code-style/references/routes/(stack)/details.tsx +8 -0
  49. package/.claude/skills/code-style/references/routes/(stack)/guide.tsx +8 -0
  50. package/.claude/skills/code-style/references/routes/(stack)/index.tsx +8 -0
  51. package/.claude/skills/code-style/references/routes/(stack)/share.tsx +8 -0
  52. package/.claude/skills/code-style/references/routes/(tabs)/(post-details)/index.tsx +8 -0
  53. package/.claude/skills/code-style/references/routes/(tabs)/(post-list)/index.tsx +8 -0
  54. package/.claude/skills/code-style/references/routes/(tabs)/_layout.tsx +50 -0
  55. package/.claude/skills/code-style/references/routes/_app.tsx +20 -0
  56. package/.claude/skills/code-style/references/routes/guide.tsx +8 -0
  57. package/.claude/skills/code-style/references/routes/share.tsx +8 -0
  58. package/.claude/skills/code-style/references/store/use-post-draft-store.ts +62 -0
  59. package/.claude/skills/design-style/SKILL.md +320 -0
  60. package/.env +3 -1
  61. package/.env.example +3 -1
  62. package/CLAUDE.md +5 -11
  63. package/app.json +6 -3
  64. package/axios.d.ts +5 -0
  65. package/env.d.ts +3 -1
  66. package/package.json +33 -40
  67. package/patches/react-native-screens+4.25.2.patch +118 -0
  68. package/react-query.d.ts +13 -0
  69. package/src/app/(root)/(home)/_layout.tsx +2 -2
  70. package/src/app/(root)/(home)/index.tsx +2 -2
  71. package/src/app/(root)/(settings)/_layout.tsx +2 -2
  72. package/src/app/(root)/(settings)/index.tsx +2 -2
  73. package/src/app/(root)/_layout.tsx +35 -32
  74. package/src/pages/home/home-main.tsx +3 -7
  75. package/src/pages/settings/settings-main.tsx +3 -7
  76. package/src/shared/assets/fonts/index.ts +3 -3
  77. package/src/shared/assets/fonts/sf-pro-text-bold.ttf +0 -0
  78. package/src/shared/assets/fonts/sf-pro-text-regular.ttf +0 -0
  79. package/src/shared/assets/fonts/sf-pro-text-semibold.ttf +0 -0
  80. package/src/shared/assets/icons/back.tsx +21 -0
  81. package/src/shared/assets/icons/close.tsx +21 -0
  82. package/src/shared/assets/icons/common.ts +8 -0
  83. package/src/shared/assets/icons/default.tsx +44 -0
  84. package/src/shared/assets/icons/index.ts +13 -1
  85. package/src/shared/assets/icons/refresh.tsx +23 -0
  86. package/src/shared/assets/icons/share.tsx +38 -0
  87. package/src/shared/assets/icons/type.ts +7 -0
  88. package/src/shared/assets/translations/index.ts +4 -4
  89. package/src/shared/constants/config.ts +13 -0
  90. package/src/shared/constants/environment.ts +16 -4
  91. package/src/shared/constants/index.ts +1 -0
  92. package/src/shared/hooks/index.ts +1 -4
  93. package/src/shared/hooks/use-compose.ts +23 -0
  94. package/src/shared/lib/api/api.client.ts +157 -0
  95. package/src/shared/lib/api/api.provider.tsx +14 -36
  96. package/src/shared/lib/api/api.ts +1 -5
  97. package/src/shared/lib/api/api.types.ts +6 -3
  98. package/src/shared/lib/api/hooks/index.ts +1 -0
  99. package/src/shared/lib/api/index.ts +2 -3
  100. package/src/shared/lib/api/models/api-instance/api-instance.client.ts +50 -0
  101. package/src/shared/lib/api/models/api-instance/api-instance.ts +30 -82
  102. package/src/shared/lib/api/models/api-instance/api-instance.types.ts +16 -18
  103. package/src/shared/lib/api/models/api-instance/api-instance.utils.ts +13 -20
  104. package/src/shared/lib/api/models/api-instance/index.ts +3 -0
  105. package/src/shared/lib/api/queries/index.ts +1 -0
  106. package/src/shared/lib/api/repositories/index.ts +1 -1
  107. package/src/shared/lib/localization/constants/index.ts +16 -5
  108. package/src/shared/lib/localization/index.ts +5 -1
  109. package/src/shared/lib/navigation/hooks/index.ts +8 -3
  110. package/src/shared/{hooks/use-breakpoints.ts → lib/navigation/hooks/use-navigation-breakpoints.ts} +2 -5
  111. package/src/shared/lib/navigation/hooks/use-navigation-dimensions.ts +12 -0
  112. package/src/shared/lib/navigation/hooks/use-navigation-options.tsx +175 -0
  113. package/src/shared/lib/navigation/hooks/{use-navigation.ts → use-navigation-route.ts} +2 -2
  114. package/src/shared/lib/navigation/hooks/use-navigation-safe-area.ts +61 -0
  115. package/src/shared/lib/navigation/hooks/use-navigation-tabs-native.ts +10 -0
  116. package/src/shared/lib/navigation/hooks/use-navigation-tabs.tsx +10 -0
  117. package/src/shared/lib/navigation/hooks/use-navigation-transition.ts +27 -0
  118. package/src/shared/lib/navigation/index.ts +11 -4
  119. package/src/shared/lib/navigation/navigation-tabs-native.context.tsx +5 -0
  120. package/src/shared/lib/navigation/navigation-tabs-native.provider.tsx +17 -0
  121. package/src/shared/lib/navigation/navigation-tabs.context.tsx +10 -0
  122. package/src/shared/lib/navigation/navigation-tabs.provider.tsx +22 -0
  123. package/src/shared/lib/navigation/navigation.provider.tsx +6 -1
  124. package/src/shared/lib/storage/index.ts +1 -1
  125. package/src/shared/lib/storage/storage.provider.tsx +4 -0
  126. package/src/shared/lib/storage/storage.ts +29 -25
  127. package/src/shared/lib/theme/constants/animations.ts +26 -0
  128. package/src/shared/lib/theme/constants/colors.ts +336 -43
  129. package/src/shared/lib/theme/constants/delays.ts +1 -1
  130. package/src/shared/lib/theme/constants/durations.ts +1 -1
  131. package/src/shared/lib/theme/constants/fonts.ts +2 -1
  132. package/src/shared/lib/theme/constants/index.ts +42 -20
  133. package/src/shared/lib/theme/constants/shadows.ts +7 -25
  134. package/src/shared/lib/theme/constants/sizes.ts +11 -2
  135. package/src/shared/lib/theme/constants/transparencies.ts +1 -1
  136. package/src/shared/lib/theme/hooks/use-theme-setup.ts +3 -1
  137. package/src/shared/lib/theme/index.ts +10 -1
  138. package/src/shared/lib/theme/theme.provider.tsx +45 -19
  139. package/src/shared/lib/theme/theme.scope.tsx +43 -0
  140. package/src/shared/lib/theme/theme.types.ts +15 -3
  141. package/src/shared/lib/theme/utils/color.ts +81 -0
  142. package/src/shared/lib/theme/utils/index.ts +2 -0
  143. package/src/shared/lib/theme/utils/snapshot.ts +17 -0
  144. package/src/shared/lib/theme/utils/storage.ts +5 -2
  145. package/src/shared/services/browser/browser.ts +66 -0
  146. package/src/shared/services/browser/index.ts +1 -0
  147. package/src/shared/services/cookies/cookies.ts +73 -0
  148. package/src/shared/services/cookies/index.ts +1 -0
  149. package/src/shared/services/index.ts +5 -0
  150. package/src/shared/services/linking/index.ts +1 -0
  151. package/src/shared/services/linking/linking.ts +22 -0
  152. package/src/shared/services/share/index.ts +1 -0
  153. package/src/shared/services/share/share.ts +28 -0
  154. package/src/shared/services/universal-links/index.ts +104 -0
  155. package/src/shared/services/universal-links/universal-links.ts +25 -0
  156. package/src/shared/services/universal-links/universal-links.types.ts +5 -0
  157. package/src/shared/ui/atoms/blur/blur.tsx +9 -4
  158. package/src/shared/ui/atoms/blur/blur.types.ts +1 -1
  159. package/src/shared/ui/atoms/blur-progress/blur-progress.styles.ts +16 -0
  160. package/src/shared/ui/atoms/blur-progress/blur-progress.tsx +30 -0
  161. package/src/shared/ui/atoms/blur-progress/blur-progress.types.tsx +5 -0
  162. package/src/shared/ui/atoms/blur-progress/index.ts +1 -0
  163. package/src/shared/ui/atoms/glass/glass.tsx +13 -5
  164. package/src/shared/ui/atoms/glass/glass.types.ts +1 -1
  165. package/src/shared/ui/atoms/icon/icon.styles.ts +82 -0
  166. package/src/shared/ui/atoms/icon/icon.tsx +21 -0
  167. package/src/shared/ui/atoms/icon/icon.types.ts +23 -0
  168. package/src/shared/ui/atoms/icon/index.ts +2 -0
  169. package/src/shared/ui/atoms/index.ts +7 -0
  170. package/src/shared/ui/atoms/skeleton/index.ts +2 -0
  171. package/src/shared/ui/atoms/skeleton/skeleton.styles.ts +69 -0
  172. package/src/shared/ui/atoms/skeleton/skeleton.tsx +26 -0
  173. package/src/shared/ui/atoms/skeleton/skeleton.types.ts +9 -0
  174. package/src/shared/ui/atoms/spinner/index.ts +2 -0
  175. package/src/shared/ui/atoms/spinner/spinner.styles.ts +102 -0
  176. package/src/shared/ui/atoms/spinner/spinner.tsx +48 -0
  177. package/src/shared/ui/atoms/spinner/spinner.types.ts +25 -0
  178. package/src/shared/ui/atoms/text/index.ts +2 -0
  179. package/src/shared/ui/atoms/text/text.styles.ts +186 -0
  180. package/src/shared/ui/atoms/text/text.tsx +37 -0
  181. package/src/shared/ui/atoms/text/text.types.ts +35 -0
  182. package/src/shared/ui/atoms/touch/components/haptics/haptics.styles.ts +21 -0
  183. package/src/shared/ui/atoms/touch/components/haptics/haptics.tsx +28 -0
  184. package/src/shared/ui/atoms/touch/components/haptics/haptics.types.ts +17 -0
  185. package/src/shared/ui/atoms/touch/components/haptics/index.ts +2 -0
  186. package/src/shared/ui/atoms/touch/components/index.ts +3 -0
  187. package/src/shared/ui/atoms/touch/components/ripple/index.ts +2 -0
  188. package/src/shared/ui/atoms/touch/components/ripple/ripple.styles.ts +78 -0
  189. package/src/shared/ui/atoms/touch/components/ripple/ripple.tsx +29 -0
  190. package/src/shared/ui/atoms/touch/components/ripple/ripple.types.ts +17 -0
  191. package/src/shared/ui/atoms/touch/components/spring/index.ts +2 -0
  192. package/src/shared/ui/atoms/touch/components/spring/spring.styles.ts +31 -0
  193. package/src/shared/ui/atoms/touch/components/spring/spring.tsx +28 -0
  194. package/src/shared/ui/atoms/touch/components/spring/spring.types.ts +17 -0
  195. package/src/shared/ui/atoms/touch/index.ts +2 -0
  196. package/src/shared/ui/atoms/touch/touch.styles.ts +14 -0
  197. package/src/shared/ui/atoms/touch/touch.tsx +137 -0
  198. package/src/shared/ui/atoms/touch/touch.types.ts +27 -0
  199. package/src/shared/ui/atoms/visibility/index.ts +2 -0
  200. package/src/shared/ui/atoms/visibility/visibility.styles.ts +85 -0
  201. package/src/shared/ui/atoms/visibility/visibility.tsx +61 -0
  202. package/src/shared/ui/atoms/visibility/visibility.types.ts +34 -0
  203. package/src/shared/ui/molecules/keyboard-area/keyboard-area.styles.ts +11 -9
  204. package/src/shared/ui/molecules/keyboard-area/keyboard-area.tsx +3 -6
  205. package/src/shared/ui/molecules/refresh-control/refresh-control.tsx +3 -5
  206. package/src/shared/ui/molecules/refresh-control/refresh-control.types.ts +1 -1
  207. package/src/shared/ui/molecules/slider/components/indicator/components/dot/dot.styles.ts +41 -0
  208. package/src/shared/ui/molecules/slider/components/indicator/components/dot/dot.tsx +12 -0
  209. package/src/shared/ui/molecules/slider/components/indicator/components/dot/dot.types.ts +13 -0
  210. package/src/shared/ui/molecules/slider/components/indicator/components/dot/index.ts +2 -0
  211. package/src/shared/ui/molecules/slider/components/indicator/index.ts +2 -0
  212. package/src/shared/ui/molecules/slider/components/indicator/indicator.styles.ts +20 -0
  213. package/src/shared/ui/molecules/slider/components/indicator/indicator.tsx +22 -0
  214. package/src/shared/ui/molecules/slider/components/indicator/indicator.types.ts +10 -0
  215. package/src/shared/ui/molecules/slider/index.ts +3 -0
  216. package/src/shared/ui/molecules/slider/slider.styles.ts +68 -0
  217. package/src/shared/ui/molecules/slider/slider.tsx +64 -0
  218. package/src/shared/ui/molecules/slider/slider.types.ts +28 -0
  219. package/src/shared/ui/organisms/bar/bar.styles.ts +100 -0
  220. package/src/shared/ui/organisms/bar/bar.tsx +89 -0
  221. package/src/shared/ui/organisms/bar/bar.types.ts +49 -0
  222. package/src/shared/ui/organisms/bar/index.ts +2 -0
  223. package/src/shared/ui/organisms/bar-tab/bar-tab.tsx +9 -0
  224. package/src/shared/ui/organisms/bar-tab/bar-tab.types.ts +5 -0
  225. package/src/shared/ui/organisms/bar-tab/components/index.ts +1 -0
  226. package/src/shared/ui/organisms/bar-tab/components/tab/index.ts +2 -0
  227. package/src/shared/ui/organisms/bar-tab/components/tab/tab.styles.ts +21 -0
  228. package/src/shared/ui/organisms/bar-tab/components/tab/tab.tsx +18 -0
  229. package/src/shared/ui/organisms/bar-tab/components/tab/tab.types.ts +5 -0
  230. package/src/shared/ui/organisms/bar-tab/index.ts +2 -0
  231. package/src/shared/ui/organisms/bar-tab-navigation/bar-tab-navigation.styles.ts +22 -0
  232. package/src/shared/ui/organisms/bar-tab-navigation/bar-tab-navigation.tsx +66 -0
  233. package/src/shared/ui/organisms/bar-tab-navigation/bar-tab-navigation.types.ts +5 -0
  234. package/src/shared/ui/organisms/bar-tab-navigation/components/index.ts +1 -0
  235. package/src/shared/ui/organisms/bar-tab-navigation/components/tab-navigation/index.ts +2 -0
  236. package/src/shared/ui/organisms/bar-tab-navigation/components/tab-navigation/tab-navigation.styles.ts +56 -0
  237. package/src/shared/ui/organisms/bar-tab-navigation/components/tab-navigation/tab-navigation.tsx +30 -0
  238. package/src/shared/ui/organisms/bar-tab-navigation/components/tab-navigation/tab-navigation.types.ts +7 -0
  239. package/src/shared/ui/organisms/bar-tab-navigation/index.ts +2 -0
  240. package/src/shared/ui/organisms/index.ts +4 -1
  241. package/src/shared/ui/organisms/slider/components/indicator/components/dot/dot.styles.ts +41 -0
  242. package/src/shared/ui/organisms/slider/components/indicator/components/dot/dot.tsx +12 -0
  243. package/src/shared/ui/organisms/slider/components/indicator/components/dot/dot.types.ts +13 -0
  244. package/src/shared/ui/organisms/slider/components/indicator/components/dot/index.ts +2 -0
  245. package/src/shared/ui/organisms/slider/components/indicator/index.ts +2 -0
  246. package/src/shared/ui/organisms/slider/components/indicator/indicator.styles.ts +20 -0
  247. package/src/shared/ui/organisms/slider/components/indicator/indicator.tsx +22 -0
  248. package/src/shared/ui/organisms/slider/components/indicator/indicator.types.ts +10 -0
  249. package/src/shared/ui/organisms/slider/index.ts +3 -0
  250. package/src/shared/ui/organisms/slider/slider.styles.ts +68 -0
  251. package/src/shared/ui/organisms/slider/slider.tsx +64 -0
  252. package/src/shared/ui/organisms/slider/slider.types.ts +28 -0
  253. package/src/shared/ui/templates/index.ts +3 -0
  254. package/src/shared/ui/templates/modal-container/index.ts +13 -0
  255. package/src/shared/ui/templates/modal-container/modal-container-list.tsx +45 -0
  256. package/src/shared/ui/templates/modal-container/modal-container-scroll.tsx +66 -0
  257. package/src/shared/ui/templates/modal-container/modal-container-section-list.tsx +46 -0
  258. package/src/shared/ui/templates/modal-container/modal-container.hooks.tsx +172 -0
  259. package/src/shared/ui/templates/modal-container/modal-container.styles.ts +121 -0
  260. package/src/shared/ui/templates/modal-container/modal-container.types.ts +69 -0
  261. package/src/shared/ui/templates/screen-container/index.ts +1 -1
  262. package/src/shared/ui/templates/screen-container/screen-container-list.tsx +28 -10
  263. package/src/shared/ui/templates/screen-container/screen-container-scroll.tsx +28 -10
  264. package/src/shared/ui/templates/screen-container/screen-container-section-list.tsx +29 -11
  265. package/src/shared/ui/templates/screen-container/screen-container.hooks.tsx +79 -8
  266. package/src/shared/ui/templates/screen-container/screen-container.styles.ts +105 -15
  267. package/src/shared/ui/templates/screen-container/screen-container.types.tsx +34 -7
  268. package/src/shared/ui/templates/screen-header/components/index.ts +6 -0
  269. package/src/shared/ui/templates/screen-header/components/screen-header-description/index.ts +2 -0
  270. package/src/shared/ui/templates/screen-header/components/screen-header-description/screen-header-description.tsx +15 -0
  271. package/src/shared/ui/templates/screen-header/components/screen-header-description/screen-header-description.types.ts +11 -0
  272. package/src/shared/ui/templates/screen-header/components/screen-header-icon/index.ts +2 -0
  273. package/src/shared/ui/templates/screen-header/components/screen-header-icon/screen-header-icon.styles.ts +44 -0
  274. package/src/shared/ui/templates/screen-header/components/screen-header-icon/screen-header-icon.tsx +65 -0
  275. package/src/shared/ui/templates/screen-header/components/screen-header-icon/screen-header-icon.types.ts +14 -0
  276. package/src/shared/ui/templates/screen-header/components/screen-header-icon-back/index.ts +2 -0
  277. package/src/shared/ui/templates/screen-header/components/screen-header-icon-back/screen-header-icon-back.tsx +17 -0
  278. package/src/shared/ui/templates/screen-header/components/screen-header-icon-back/screen-header-icon-back.types.ts +6 -0
  279. package/src/shared/ui/templates/screen-header/components/screen-header-icon-close/index.ts +2 -0
  280. package/src/shared/ui/templates/screen-header/components/screen-header-icon-close/screen-header-icon-close.tsx +27 -0
  281. package/src/shared/ui/templates/screen-header/components/screen-header-icon-close/screen-header-icon-close.types.ts +10 -0
  282. package/src/shared/ui/templates/screen-header/components/screen-header-info/index.ts +2 -0
  283. package/src/shared/ui/templates/screen-header/components/screen-header-info/screen-header-info.tsx +15 -0
  284. package/src/shared/ui/templates/screen-header/components/screen-header-info/screen-header-info.types.ts +10 -0
  285. package/src/shared/ui/templates/screen-header/components/screen-header-title/index.ts +2 -0
  286. package/src/shared/ui/templates/screen-header/components/screen-header-title/screen-header-title.tsx +19 -0
  287. package/src/shared/ui/templates/screen-header/components/screen-header-title/screen-header-title.types.ts +13 -0
  288. package/src/shared/ui/templates/screen-header/index.ts +3 -0
  289. package/src/shared/ui/templates/screen-header/screen-header.styles.ts +49 -0
  290. package/src/shared/ui/templates/screen-header/screen-header.tsx +26 -0
  291. package/src/shared/ui/templates/screen-header/screen-header.types.ts +15 -0
  292. package/src/shared/ui/templates/web-container/index.ts +2 -0
  293. package/src/shared/ui/templates/web-container/web-container.styles.ts +34 -0
  294. package/src/shared/ui/templates/web-container/web-container.tsx +172 -0
  295. package/src/shared/ui/templates/web-container/web-container.types.ts +21 -0
  296. package/.claude/rules/app-routing.mdc +0 -47
  297. package/.claude/rules/exports-at-end.mdc +0 -55
  298. package/.claude/rules/kebab-case-naming.mdc +0 -29
  299. package/.claude/rules/mediacubeco-packages.mdc +0 -56
  300. package/.claude/skills/generate-api-model/SKILL.md +0 -230
  301. package/.claude/skills/generate-api-model/references/resources/common.ts +0 -8
  302. package/.claude/skills/generate-api-model-mock/SKILL.md +0 -56
  303. package/.claude/skills/git-commit/SKILL.md +0 -139
  304. package/.gitignore +0 -34
  305. package/src/shared/assets/icons/like.tsx +0 -17
  306. package/src/shared/hooks/use-animated.ts +0 -200
  307. package/src/shared/hooks/use-mixins.ts +0 -36
  308. package/src/shared/hooks/use-safe-area.ts +0 -75
  309. package/src/shared/lib/api/repositories/auth/auth.ts +0 -23
  310. package/src/shared/lib/api/repositories/auth/auth.types.ts +0 -22
  311. package/src/shared/lib/api/repositories/auth/index.ts +0 -1
  312. package/src/shared/lib/navigation/hooks/use-navigation-native-tabs.ts +0 -10
  313. package/src/shared/lib/navigation/hooks/use-navigation-options.ts +0 -123
  314. package/src/shared/lib/navigation/navigation-native-tabs.context.tsx +0 -5
  315. package/src/shared/lib/navigation/navigation-native-tabs.provider.tsx +0 -12
  316. package/src/shared/lib/theme/constants/borders.ts +0 -8
  317. package/src/shared/lib/theme/constants/weights.ts +0 -13
  318. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/index.ts +0 -0
  319. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/post/index.ts +0 -0
  320. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/post/post-comment.ts +0 -0
  321. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/post/post.ts +0 -0
  322. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/user/index.ts +0 -0
  323. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/user/user-settings.ts +0 -0
  324. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/user/user-verification.ts +0 -0
  325. /package/.claude/skills/{generate-api-model/references → api/references/model}/entities/user/user.ts +0 -0
  326. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/index.ts +0 -0
  327. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/post/index.ts +0 -0
  328. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/post/post-comment.ts +0 -0
  329. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/post/post.ts +0 -0
  330. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/user/index.ts +0 -0
  331. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/user/user-settings.ts +0 -0
  332. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/user/user-verification.ts +0 -0
  333. /package/.claude/skills/{generate-api-model/references → api/references/model}/resources/user/user.ts +0 -0
@@ -0,0 +1,157 @@
1
+ import { listenAppState } from '@mediacubeco/base-react-native/utils'
2
+ import { ErrorHandler } from '@mediacubeco/base/helpers'
3
+ import { addNetworkStateListener, getNetworkStateAsync } from 'expo-network'
4
+ import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'
5
+ import {
6
+ focusManager,
7
+ MutationCache,
8
+ onlineManager,
9
+ QueryCache,
10
+ QueryClient,
11
+ } from '@tanstack/react-query'
12
+ import { type PersistQueryClientProviderProps } from '@tanstack/react-query-persist-client'
13
+ import { storageAsync } from '../storage'
14
+ import { apiInstanceErrorHandlerCase } from './models'
15
+
16
+ const MAX_RETRY_COUNT = 2
17
+ const GC_TIME = 1000 * 60 * 60 * 24
18
+ const PERSIST_MAX_AGE = 1000 * 60 * 60 * 24
19
+ const PERSIST_THROTTLE_TIME = 1000
20
+ const PERSIST_KEY = 'reactQuery'
21
+
22
+ /**
23
+ * Отправляет ошибку TanStack Query в `ErrorHandler.capture`: разобранное сообщение,
24
+ * HTTP-статус, ошибки валидации, состояние сети и переданные детали запроса/мутации.
25
+ */
26
+ const queryCache = new QueryCache({
27
+ onError: (error, query) => {
28
+ if (query.meta?.silent) {
29
+ return
30
+ }
31
+
32
+ const { isStale, getObserversCount, ...rest } = query
33
+
34
+ ErrorHandler.capture(error, {
35
+ signal: 'query',
36
+ payload: {
37
+ ...rest,
38
+ isStale: isStale(),
39
+ observerCount: getObserversCount(),
40
+ },
41
+ })
42
+ },
43
+ })
44
+
45
+ const mutationCache = new MutationCache({
46
+ onError: (error, variables, context, mutation) => {
47
+ if (mutation.meta?.silent) {
48
+ return
49
+ }
50
+
51
+ const { ...rest } = mutation
52
+
53
+ ErrorHandler.capture(error, {
54
+ signal: 'query',
55
+ payload: {
56
+ variables,
57
+ context,
58
+ ...rest,
59
+ },
60
+ })
61
+ },
62
+ })
63
+
64
+ const queryClient = new QueryClient({
65
+ queryCache,
66
+ mutationCache,
67
+ defaultOptions: {
68
+ queries: {
69
+ gcTime: GC_TIME,
70
+ retry: (failureCount, error) => {
71
+ const { status } = ErrorHandler.parse(error)
72
+
73
+ if (status >= 400 && status < 500) {
74
+ return false
75
+ }
76
+
77
+ return failureCount < MAX_RETRY_COUNT
78
+ },
79
+ },
80
+ },
81
+ })
82
+
83
+ const prefetchApiReferenceData = () => {
84
+ return Promise.all([])
85
+ }
86
+
87
+ const persister = createAsyncStoragePersister({
88
+ key: PERSIST_KEY,
89
+ storage: storageAsync,
90
+ throttleTime: PERSIST_THROTTLE_TIME,
91
+ })
92
+
93
+ const persistOptions = {
94
+ maxAge: PERSIST_MAX_AGE,
95
+ dehydrateOptions: {
96
+ shouldDehydrateQuery: (query) => {
97
+ return query.state.status === 'success' && query.meta?.persist === true
98
+ },
99
+ },
100
+ persister,
101
+ } satisfies PersistQueryClientProviderProps['persistOptions']
102
+
103
+ /**
104
+ * Приблизительный вес персистентного дампа TanStack Query в байтах: длина
105
+ * сериализованной строки под ключом `PERSIST_KEY` (0, если дампа ещё нет).
106
+ */
107
+ const getQueryPersistSize = async () => {
108
+ const value = await storageAsync.getItem(PERSIST_KEY)
109
+
110
+ return value ? value.length : 0
111
+ }
112
+
113
+ /**
114
+ * Полная очистка кэша TanStack Query: сбрасывает in-memory кэш и удаляет
115
+ * персистентный дамп из хранилища. Настройки темы, языка и сессии не затрагивает.
116
+ */
117
+ const clearQueryPersist = async () => {
118
+ queryClient.clear()
119
+
120
+ await persister.removeClient()
121
+ }
122
+
123
+ onlineManager.setEventListener((setOnline) => {
124
+ const syncOnline = async () => {
125
+ try {
126
+ const state = await getNetworkStateAsync()
127
+
128
+ setOnline(Boolean(state.isConnected))
129
+ } catch {
130
+ setOnline(true)
131
+ }
132
+ }
133
+
134
+ syncOnline()
135
+
136
+ const subscription = addNetworkStateListener((state) => {
137
+ setOnline(Boolean(state.isConnected))
138
+ })
139
+
140
+ return () => subscription.remove()
141
+ })
142
+
143
+ listenAppState({
144
+ onChange: (status) => {
145
+ focusManager.setFocused(status === 'active')
146
+ },
147
+ })
148
+
149
+ ErrorHandler.case(apiInstanceErrorHandlerCase)
150
+
151
+ export {
152
+ queryClient,
153
+ persistOptions,
154
+ prefetchApiReferenceData,
155
+ getQueryPersistSize,
156
+ clearQueryPersist,
157
+ }
@@ -1,44 +1,22 @@
1
- import { listenAppState } from '@mediacubeco/base-react-native/utils'
2
- import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'
3
- import { focusManager, QueryClient } from '@tanstack/react-query'
4
- import {
5
- PersistQueryClientProvider,
6
- type PersistQueryClientProviderProps,
7
- } from '@tanstack/react-query-persist-client'
8
- import { storageAsync } from '../storage'
1
+ import { useCallback } from 'react'
2
+ import { useReactQueryDevTools } from '@dev-plugins/react-query'
3
+ import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'
9
4
  import { type ApiProviderProps } from './api.types'
5
+ import { persistOptions, prefetchApiReferenceData, queryClient } from './api.client'
10
6
 
11
- const client = new QueryClient({
12
- defaultOptions: {
13
- queries: {
14
- retry: 2,
15
- gcTime: 1000 * 60 * 60 * 24,
16
- },
17
- },
18
- })
19
-
20
- const persistOptions = {
21
- maxAge: 1000 * 60 * 60 * 24,
22
- dehydrateOptions: {
23
- shouldDehydrateQuery: (query) => {
24
- return query.state.status === 'success' && query.meta?.persist === true
25
- },
26
- },
27
- persister: createAsyncStoragePersister({
28
- storage: storageAsync,
29
- throttleTime: 1000,
30
- }),
31
- } satisfies PersistQueryClientProviderProps['persistOptions']
7
+ const ApiProvider = ({ children }: ApiProviderProps) => {
8
+ useReactQueryDevTools(queryClient)
32
9
 
33
- listenAppState({
34
- onChange: (status) => {
35
- focusManager.setFocused(status === 'active')
36
- },
37
- })
10
+ const handleSuccess = useCallback(() => {
11
+ prefetchApiReferenceData()
12
+ }, [])
38
13
 
39
- const ApiProvider = ({ children }: ApiProviderProps) => {
40
14
  return (
41
- <PersistQueryClientProvider client={client} persistOptions={persistOptions}>
15
+ <PersistQueryClientProvider
16
+ client={queryClient}
17
+ persistOptions={persistOptions}
18
+ onSuccess={handleSuccess}
19
+ >
42
20
  {children}
43
21
  </PersistQueryClientProvider>
44
22
  )
@@ -1,7 +1,3 @@
1
- import { AuthRepository } from './repositories'
2
-
3
- class Api {
4
- static authRepository = new AuthRepository('/auth')
5
- }
1
+ class Api {}
6
2
 
7
3
  export { Api }
@@ -1,9 +1,12 @@
1
1
  import { type PropsWithChildren } from 'react'
2
+ import { type ApiInstanceOptions } from './models'
2
3
 
3
- type ApiResponse<Response = {}> = {
4
- data: Partial<Response>
4
+ type ApiResponse<Response = {}> = Response & {}
5
+
6
+ type ApiConfig<Config = {}> = Config & {
7
+ options?: ApiInstanceOptions
5
8
  }
6
9
 
7
10
  type ApiProviderProps = PropsWithChildren
8
11
 
9
- export type { ApiResponse, ApiProviderProps }
12
+ export type { ApiResponse, ApiConfig, ApiProviderProps }
@@ -0,0 +1 @@
1
+ export {}
@@ -1,4 +1,3 @@
1
- export {} from './entities'
2
- export {} from './resources'
3
- export {} from './hooks'
1
+ export * from './entities'
2
+ export * from './hooks'
4
3
  export { default as ApiProvider } from './api.provider'
@@ -0,0 +1,50 @@
1
+ import { Log } from '@mediacubeco/base/helpers'
2
+ import axios, { AxiosError, isAxiosError } from 'axios'
3
+ import { APP_URL_API } from '../../../../constants'
4
+
5
+ /**
6
+ * Общий axios-инстанс приложения: база из `APP_URL_API`, таймаут и JSON-заголовки.
7
+ * Интерсепторы навешиваются здесь один раз: Bearer из сессии (с учётом `skipAuth`),
8
+ * single-flight 401-refresh с одним повтором, логирование успехов и ошибок.
9
+ */
10
+ const apiInstanceClient = axios.create({
11
+ baseURL: APP_URL_API,
12
+ withCredentials: true,
13
+ headers: {
14
+ 'Accept': 'application/json',
15
+ 'Content-Type': 'application/json',
16
+ },
17
+ })
18
+
19
+ apiInstanceClient.interceptors.request.use((config) => {
20
+ return config
21
+ })
22
+
23
+ apiInstanceClient.interceptors.response.use(
24
+ (response) => {
25
+ const { config } = response
26
+
27
+ Log.formatted.success(config.method ?? 'request', apiInstanceClient.getUri(config), response)
28
+
29
+ return response
30
+ },
31
+ async (error) => {
32
+ if (!isAxiosError(error) || !error.config) {
33
+ throw error
34
+ }
35
+
36
+ const { config } = error
37
+
38
+ if (error.code !== AxiosError.ERR_CANCELED) {
39
+ Log.formatted.danger(
40
+ config.method ?? 'request',
41
+ apiInstanceClient.getUri(config),
42
+ error.response
43
+ )
44
+ }
45
+
46
+ throw error
47
+ }
48
+ )
49
+
50
+ export { apiInstanceClient }
@@ -1,116 +1,64 @@
1
- import { ErrorHandler, Log } from '@mediacubeco/base/helpers'
2
- import { API_URL } from '../../../../constants'
3
- import { formatRoute, formatURI } from './api-instance.utils'
4
1
  import { ApiInstanceMethod } from './api-instance.constants'
5
2
  import {
6
3
  type ApiInstanceConfig,
7
- type ApiInstanceDefaultBody,
8
- type ApiInstanceDefaultHeaders,
9
- type ApiInstanceDefaultParams,
10
4
  type ApiInstanceRoute,
11
- type ApiInstanceURL,
12
5
  type ApiInstanceURN,
13
6
  } from './api-instance.types'
7
+ import { apiInstanceClient } from './api-instance.client'
14
8
 
9
+ /**
10
+ * Базовый класс репозиториев: типизированные HTTP-методы поверх общего axios-инстанса.
11
+ * Держит URN домена и приклеивает его к каждому route.
12
+ */
15
13
  abstract class ApiInstance {
16
- private url: ApiInstanceURL
14
+ /** URN домена репозитория, добавляется перед каждым route. */
17
15
  private urn: ApiInstanceURN
18
16
 
19
- private headers: ApiInstanceDefaultHeaders
20
-
21
17
  constructor(urn: ApiInstanceURN) {
22
- this.url = API_URL
23
18
  this.urn = urn
24
-
25
- this.headers = {
26
- 'Accept': 'application/json',
27
- 'Content-Type': 'application/json',
28
- // 'Authorization': `Bearer ${API_TOKEN}`,
29
- }
30
- }
31
-
32
- private formatHeaders(headers?: ApiInstanceDefaultHeaders) {
33
- return { ...this.headers, ...headers }
34
19
  }
35
20
 
21
+ /** Выполняет запрос через общий axios-инстанс и возвращает тело ответа (undefined при пустом теле). */
36
22
  private async request<Result>(
37
23
  method: ApiInstanceMethod,
38
24
  route: ApiInstanceRoute,
39
- { params, body, headers }: ApiInstanceConfig = {}
40
- ): Promise<Result> {
41
- const uri = formatURI(this.url, this.urn, formatRoute(route, params))
42
-
43
- try {
44
- const response = await fetch(uri, {
45
- method,
46
- body: JSON.stringify(body),
47
- headers: this.formatHeaders(headers),
48
- })
49
-
50
- if (!response.ok) {
51
- ErrorHandler.throw('API Error', response)
52
- }
53
-
54
- const data = await response.json()
55
-
56
- Log.formatted.success(method, uri, { data, params, body, headers })
57
-
58
- return data as Result
59
- } catch (error) {
60
- ErrorHandler.forward(error, {
61
- signal: method,
62
- message: uri,
63
- payload: { params, body, headers },
64
- })
65
- }
66
- }
67
-
68
- protected updateHeaders(headers: ApiInstanceDefaultHeaders) {
69
- this.headers = { ...this.headers, ...headers }
25
+ { params, body, headers, options, ...config }: ApiInstanceConfig = {}
26
+ ) {
27
+ const response = await apiInstanceClient.request<Result>({
28
+ url: [this.urn, route].join(''),
29
+ method,
30
+ params,
31
+ data: body,
32
+ headers,
33
+ ...options,
34
+ ...config,
35
+ })
36
+
37
+ return response.data
70
38
  }
71
39
 
72
- protected async get<
73
- Result,
74
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
75
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
76
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
77
- >(route: ApiInstanceRoute, config?: ApiInstanceConfig<Body, Params, Headers>) {
40
+ /** GET-запрос домена. */
41
+ protected async get<Result>(route: ApiInstanceRoute, config?: ApiInstanceConfig) {
78
42
  return await this.request<Result>(ApiInstanceMethod.Get, route, config)
79
43
  }
80
44
 
81
- protected async post<
82
- Result,
83
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
84
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
85
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
86
- >(route: ApiInstanceRoute, config?: ApiInstanceConfig<Body, Params, Headers>) {
45
+ /** POST-запрос домена. */
46
+ protected async post<Result>(route: ApiInstanceRoute, config?: ApiInstanceConfig) {
87
47
  return await this.request<Result>(ApiInstanceMethod.Post, route, config)
88
48
  }
89
49
 
90
- protected async put<
91
- Result,
92
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
93
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
94
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
95
- >(route: ApiInstanceRoute, config?: ApiInstanceConfig<Body, Params, Headers>) {
50
+ /** PUT-запрос домена. */
51
+ protected async put<Result>(route: ApiInstanceRoute, config?: ApiInstanceConfig) {
96
52
  return await this.request<Result>(ApiInstanceMethod.Put, route, config)
97
53
  }
98
54
 
99
- protected async patch<
100
- Result,
101
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
102
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
103
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
104
- >(route: ApiInstanceRoute, config?: ApiInstanceConfig<Body, Params, Headers>) {
55
+ /** PATCH-запрос домена. */
56
+ protected async patch<Result>(route: ApiInstanceRoute, config?: ApiInstanceConfig) {
105
57
  return await this.request<Result>(ApiInstanceMethod.Patch, route, config)
106
58
  }
107
59
 
108
- protected async delete<
109
- Result,
110
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
111
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
112
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
113
- >(route: ApiInstanceRoute, config?: ApiInstanceConfig<Body, Params, Headers>) {
60
+ /** DELETE-запрос домена. */
61
+ protected async delete<Result>(route: ApiInstanceRoute, config?: ApiInstanceConfig) {
114
62
  return await this.request<Result>(ApiInstanceMethod.Delete, route, config)
115
63
  }
116
64
  }
@@ -1,31 +1,29 @@
1
- type ApiInstanceURL = `https://${string}`
1
+ import { type AxiosRequestConfig } from 'axios'
2
2
 
3
3
  type ApiInstanceURN = `/${string}`
4
4
 
5
5
  type ApiInstanceRoute = `/${string}`
6
6
 
7
- type ApiInstanceDefaultParams = Record<string, string>
8
-
9
- type ApiInstanceDefaultBody = Record<string, any>
10
-
11
- type ApiInstanceDefaultHeaders = Record<string, string>
7
+ type ApiInstanceOptions = {
8
+ signal?: AbortSignal
9
+ timeout?: number
10
+ }
12
11
 
13
- type ApiInstanceConfig<
14
- Params extends ApiInstanceDefaultParams = ApiInstanceDefaultParams,
15
- Body extends ApiInstanceDefaultBody = ApiInstanceDefaultBody,
16
- Headers extends ApiInstanceDefaultHeaders = ApiInstanceDefaultHeaders,
17
- > = {
18
- params?: Params
19
- body?: Body
20
- headers?: Headers
12
+ type ApiInstanceConfig = Omit<AxiosRequestConfig, 'data'> & {
13
+ body?: AxiosRequestConfig['data']
14
+ options?: ApiInstanceOptions
21
15
  }
22
16
 
17
+ /** Тело ошибки бэкенда (Laravel): сообщение и ошибки валидации по полям. */
18
+ type ApiInstanceErrorData = {
19
+ message?: string
20
+ errors?: Record<string, string | string[]>
21
+ } & Record<string, unknown>
22
+
23
23
  export type {
24
- ApiInstanceURL,
25
24
  ApiInstanceURN,
26
25
  ApiInstanceRoute,
27
- ApiInstanceDefaultBody,
28
- ApiInstanceDefaultParams,
29
- ApiInstanceDefaultHeaders,
26
+ ApiInstanceErrorData,
27
+ ApiInstanceOptions,
30
28
  ApiInstanceConfig,
31
29
  }
@@ -1,22 +1,15 @@
1
- import {
2
- type ApiInstanceDefaultParams,
3
- type ApiInstanceRoute,
4
- type ApiInstanceURL,
5
- type ApiInstanceURN,
6
- } from './api-instance.types'
7
-
8
- const formatURI = (url: ApiInstanceURL, urn: ApiInstanceURN, route: ApiInstanceRoute) => {
9
- return [url, urn, route].join('')
10
- }
11
-
12
- const formatRoute = <Params extends ApiInstanceDefaultParams>(
13
- route: ApiInstanceRoute,
14
- params?: Params
15
- ) => {
16
- const query = new URLSearchParams(params).toString()
17
- const validRoute = route.endsWith('/') ? route.slice(0, -1) : route
18
-
19
- return [validRoute, query].filter(Boolean).join('?') as ApiInstanceRoute
1
+ import { type ErrorHandlerCaseConfig } from '@mediacubeco/base/helpers'
2
+ import { type AxiosError, isAxiosError } from 'axios'
3
+ import { type ApiInstanceErrorData } from './api-instance.types'
4
+
5
+ const apiInstanceErrorHandlerCase: ErrorHandlerCaseConfig<AxiosError<ApiInstanceErrorData>> = {
6
+ check: (error): error is AxiosError<ApiInstanceErrorData> => isAxiosError(error),
7
+ parse: (error, defaultResult) => ({
8
+ ...defaultResult,
9
+ message: error.response?.data?.message ?? error.message,
10
+ status: error.response?.status ?? defaultResult.status,
11
+ errors: (error.response?.data?.errors ?? defaultResult.errors) as typeof defaultResult.errors,
12
+ }),
20
13
  }
21
14
 
22
- export { formatURI, formatRoute }
15
+ export { apiInstanceErrorHandlerCase }
@@ -1 +1,4 @@
1
1
  export { default as ApiInstance } from './api-instance'
2
+ export { apiInstanceClient } from './api-instance.client'
3
+ export type { ApiInstanceErrorData, ApiInstanceOptions } from './api-instance.types'
4
+ export { apiInstanceErrorHandlerCase } from './api-instance.utils'
@@ -0,0 +1 @@
1
+ export {}
@@ -1 +1 @@
1
- export * from './auth'
1
+ export {}
@@ -10,23 +10,32 @@ enum LocalizationCode {
10
10
  English = 'en',
11
11
  }
12
12
 
13
- const LOCALIZATION_RESOURCES = {
14
- en: { translation: TRANSLATIONS.EN },
15
- ru: { translation: TRANSLATIONS.RU },
13
+ const LOCALIZATION_NATIVE_TITLES: Record<LocalizationCode, string> = {
14
+ [LocalizationCode.Russian]: 'Русский',
15
+ [LocalizationCode.English]: 'English',
16
16
  }
17
17
 
18
+ const LOCALIZATION_NATIVE_GREETINGS: Record<LocalizationCode, string> = {
19
+ [LocalizationCode.Russian]: 'Привет!',
20
+ [LocalizationCode.English]: 'Hello!',
21
+ }
22
+
23
+ const LOCALIZATION_RESOURCES = Object.fromEntries(
24
+ Object.entries(TRANSLATIONS).map(([code, translation]) => [code, { translation }])
25
+ )
26
+
18
27
  const LOCALIZATION_SUPPORTED_LOCALE_LIST = Object.keys(LOCALIZATION_RESOURCES) as LocalizationCode[]
19
28
 
20
29
  const LOCALIZATION_CODE = (locales.find(
21
30
  (locale) => locale && LOCALIZATION_SUPPORTED_LOCALE_LIST.includes(locale as LocalizationCode)
22
- ) ?? LOCALIZATION_SUPPORTED_LOCALE_LIST[0]) as LocalizationCode
31
+ ) ?? LocalizationCode.English) as LocalizationCode
23
32
 
24
33
  const LOCALIZATION_CODE_FALLBACK = (locales.find(
25
34
  (locale) =>
26
35
  locale &&
27
36
  locale !== LOCALIZATION_CODE &&
28
37
  LOCALIZATION_SUPPORTED_LOCALE_LIST.includes(locale as LocalizationCode)
29
- ) ?? LOCALIZATION_SUPPORTED_LOCALE_LIST[1]) as LocalizationCode
38
+ ) ?? LocalizationCode.Russian) as LocalizationCode
30
39
 
31
40
  const languageDetector: LanguageDetectorAsyncModule = {
32
41
  type: 'languageDetector' as const,
@@ -46,6 +55,8 @@ const languageDetector: LanguageDetectorAsyncModule = {
46
55
 
47
56
  export {
48
57
  LocalizationCode,
58
+ LOCALIZATION_NATIVE_GREETINGS,
59
+ LOCALIZATION_NATIVE_TITLES,
49
60
  LOCALIZATION_RESOURCES,
50
61
  LOCALIZATION_SUPPORTED_LOCALE_LIST,
51
62
  LOCALIZATION_CODE,
@@ -1,4 +1,8 @@
1
1
  export { LocalizationTranslate } from './components'
2
+ export {
3
+ LocalizationCode,
4
+ LOCALIZATION_NATIVE_GREETINGS,
5
+ LOCALIZATION_NATIVE_TITLES,
6
+ } from './constants'
2
7
  export { useLocalizationSetup, useLocalizationText } from './hooks'
3
- export { LocalizationCode } from './constants'
4
8
  export { default as LocalizationProvider } from './localization.provider'
@@ -1,4 +1,9 @@
1
- export * from './use-navigation'
2
- export * from './use-navigation-params'
1
+ export * from './use-navigation-breakpoints'
2
+ export * from './use-navigation-dimensions'
3
3
  export * from './use-navigation-options'
4
- export * from './use-navigation-native-tabs'
4
+ export * from './use-navigation-params'
5
+ export * from './use-navigation-route'
6
+ export * from './use-navigation-safe-area'
7
+ export * from './use-navigation-tabs'
8
+ export * from './use-navigation-tabs-native'
9
+ export * from './use-navigation-transition'
@@ -1,6 +1,6 @@
1
1
  import { useWindowDimensions } from 'react-native'
2
2
 
3
- const useBreakpoints = () => {
3
+ const useNavigationBreakpoints = () => {
4
4
  const { width } = useWindowDimensions()
5
5
 
6
6
  return {
@@ -19,7 +19,4 @@ const useBreakpoints = () => {
19
19
  }
20
20
  }
21
21
 
22
- type Breakpoints = ReturnType<typeof useBreakpoints>
23
-
24
- export { useBreakpoints }
25
- export type { Breakpoints }
22
+ export { useNavigationBreakpoints }
@@ -0,0 +1,12 @@
1
+ import { useWindowDimensions } from 'react-native'
2
+
3
+ const useNavigationDimensions = () => {
4
+ const { width, height } = useWindowDimensions()
5
+
6
+ return {
7
+ WIDTH: width,
8
+ HEIGHT: height,
9
+ }
10
+ }
11
+
12
+ export { useNavigationDimensions }