@xhsreds/reds-rn-next 0.8.4-fix-image-callbacks202510011434 → 0.8.4-image-optimization202510222117

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 (465) hide show
  1. package/coverage/.tmp/coverage-0.json +1 -1
  2. package/coverage/.tmp/coverage-1.json +1 -1
  3. package/coverage/.tmp/coverage-10.json +1 -1
  4. package/coverage/.tmp/coverage-11.json +1 -1
  5. package/coverage/.tmp/coverage-12.json +1 -1
  6. package/coverage/.tmp/coverage-13.json +1 -1
  7. package/coverage/.tmp/coverage-14.json +1 -1
  8. package/coverage/.tmp/coverage-15.json +1 -1
  9. package/coverage/.tmp/coverage-16.json +1 -1
  10. package/coverage/.tmp/coverage-17.json +1 -1
  11. package/coverage/.tmp/coverage-18.json +1 -1
  12. package/coverage/.tmp/coverage-19.json +1 -1
  13. package/coverage/.tmp/coverage-2.json +1 -1
  14. package/coverage/.tmp/coverage-20.json +1 -1
  15. package/coverage/.tmp/coverage-21.json +1 -1
  16. package/coverage/.tmp/coverage-22.json +1 -1
  17. package/coverage/.tmp/coverage-23.json +1 -1
  18. package/coverage/.tmp/coverage-24.json +1 -1
  19. package/coverage/.tmp/coverage-25.json +1 -1
  20. package/coverage/.tmp/coverage-27.json +1 -1
  21. package/coverage/.tmp/coverage-28.json +1 -1
  22. package/coverage/.tmp/coverage-29.json +1 -1
  23. package/coverage/.tmp/coverage-3.json +1 -1
  24. package/coverage/.tmp/coverage-30.json +1 -1
  25. package/coverage/.tmp/coverage-31.json +1 -1
  26. package/coverage/.tmp/coverage-35.json +1 -1
  27. package/coverage/.tmp/coverage-38.json +1 -1
  28. package/coverage/.tmp/coverage-4.json +1 -1
  29. package/coverage/.tmp/coverage-40.json +1 -1
  30. package/coverage/.tmp/coverage-41.json +1 -1
  31. package/coverage/.tmp/coverage-42.json +1 -1
  32. package/coverage/.tmp/coverage-5.json +1 -1
  33. package/coverage/.tmp/coverage-6.json +1 -1
  34. package/coverage/.tmp/coverage-7.json +1 -1
  35. package/coverage/.tmp/coverage-8.json +1 -1
  36. package/coverage/.tmp/coverage-9.json +1 -1
  37. package/lib/cjs/_chunks/{C9tZEm0t.js → vVKkFPW_.js} +2 -2
  38. package/lib/cjs/_chunks/{C9tZEm0t.js.map → vVKkFPW_.js.map} +1 -1
  39. package/lib/cjs/components/ActionSheets/ActionSheets.js +1 -1
  40. package/lib/cjs/components/ActionSheets/ActionSheetsItem.js +1 -1
  41. package/lib/cjs/components/ActionSheets/api.js +1 -1
  42. package/lib/cjs/components/ActionSheets/hooks.js +1 -1
  43. package/lib/cjs/components/ActionSheets/index.js +1 -1
  44. package/lib/cjs/components/ActionablePopover/ActionablePopover.js +1 -1
  45. package/lib/cjs/components/ActionablePopover/index.js +1 -1
  46. package/lib/cjs/components/Alert/Alert.js +1 -1
  47. package/lib/cjs/components/Alert/hooks/alert.js +1 -1
  48. package/lib/cjs/components/Alert/index.js +1 -1
  49. package/lib/cjs/components/Alert/styles.js +1 -1
  50. package/lib/cjs/components/Avatar/Avatar.js +1 -1
  51. package/lib/cjs/components/Avatar/index.js +1 -1
  52. package/lib/cjs/components/Avatar/styles.js +1 -1
  53. package/lib/cjs/components/AvatarGroup/AvatarGroup.js +1 -1
  54. package/lib/cjs/components/AvatarGroup/index.js +1 -1
  55. package/lib/cjs/components/Badge/Badge.js +1 -1
  56. package/lib/cjs/components/Badge/index.js +1 -1
  57. package/lib/cjs/components/Badge/styles.js +1 -1
  58. package/lib/cjs/components/BottomBar/BottomBar.js +1 -1
  59. package/lib/cjs/components/BottomBar/index.js +1 -1
  60. package/lib/cjs/components/Button/Button.js +1 -1
  61. package/lib/cjs/components/Button/Viewable.js +1 -1
  62. package/lib/cjs/components/Button/index.js +1 -1
  63. package/lib/cjs/components/Button/styleMap.js +1 -1
  64. package/lib/cjs/components/Carousel/Carousel.js +1 -1
  65. package/lib/cjs/components/Carousel/index.js +1 -1
  66. package/lib/cjs/components/CheckBoxGroup/CheckBox.js +1 -1
  67. package/lib/cjs/components/CheckBoxGroup/CheckBoxGroup.js +1 -1
  68. package/lib/cjs/components/CheckBoxGroup/index.js +1 -1
  69. package/lib/cjs/components/CheckBoxGroup/styles.js +1 -1
  70. package/lib/cjs/components/Collapse/Collapse.js +1 -1
  71. package/lib/cjs/components/Collapse/Item/Item.js +1 -1
  72. package/lib/cjs/components/Collapse/Item/styles.js +1 -1
  73. package/lib/cjs/components/Collapse/index.js +1 -1
  74. package/lib/cjs/components/ConfigProvider/ConfigProvider.js +1 -1
  75. package/lib/cjs/components/ConfigProvider/hooks/ConfigCache/ConfigCache.js +1 -1
  76. package/lib/cjs/components/ConfigProvider/hooks/ConfigCache/index.js +1 -1
  77. package/lib/cjs/components/ConfigProvider/hooks/themeToken/index.js +1 -1
  78. package/lib/cjs/components/ConfigProvider/hooks/themeToken/useThemeToken.js +1 -1
  79. package/lib/cjs/components/ConfigProvider/index.js +1 -1
  80. package/lib/cjs/components/DatePicker/DatePicker.js +1 -1
  81. package/lib/cjs/components/DatePicker/api.js +1 -1
  82. package/lib/cjs/components/DatePicker/index.js +1 -1
  83. package/lib/cjs/components/Divider/Divider.js +1 -1
  84. package/lib/cjs/components/Divider/index.js +1 -1
  85. package/lib/cjs/components/Divider/styles.js +1 -1
  86. package/lib/cjs/components/DropDown/DropDown.js +1 -1
  87. package/lib/cjs/components/DropDown/DropDownItem.js +1 -1
  88. package/lib/cjs/components/DropDown/index.js +1 -1
  89. package/lib/cjs/components/Empty/Empty.js +1 -1
  90. package/lib/cjs/components/Empty/index.js +1 -1
  91. package/lib/cjs/components/Empty/styles.js +1 -1
  92. package/lib/cjs/components/FAB/FAB.js +1 -1
  93. package/lib/cjs/components/FAB/index.js +1 -1
  94. package/lib/cjs/components/Form/Form.js +1 -1
  95. package/lib/cjs/components/Form/FormItem.js +1 -1
  96. package/lib/cjs/components/Form/index.js +1 -1
  97. package/lib/cjs/components/Form/styles.js +1 -1
  98. package/lib/cjs/components/Image/Image.js +42 -101
  99. package/lib/cjs/components/Image/Image.js.map +1 -1
  100. package/lib/cjs/components/Image/Image69.js +2 -1
  101. package/lib/cjs/components/Image/Image69.js.map +1 -1
  102. package/lib/cjs/components/Image/VisibilitySensor.js +21 -74
  103. package/lib/cjs/components/Image/VisibilitySensor.js.map +1 -1
  104. package/lib/cjs/components/Image/hook/index.js +3 -1
  105. package/lib/cjs/components/Image/hook/index.js.map +1 -1
  106. package/lib/cjs/components/Image/hook/useImageId.js +18 -0
  107. package/lib/cjs/components/Image/hook/useImageId.js.map +1 -0
  108. package/lib/cjs/components/Image/index.js +3 -1
  109. package/lib/cjs/components/Image/index.js.map +1 -1
  110. package/lib/cjs/components/Image/manager/ImageAPMManager.js +397 -0
  111. package/lib/cjs/components/Image/manager/ImageAPMManager.js.map +1 -0
  112. package/lib/cjs/components/Image/manager/index.js +12 -0
  113. package/lib/cjs/components/Image/manager/index.js.map +1 -0
  114. package/lib/cjs/components/Image/manager/types.js +3 -0
  115. package/lib/cjs/components/Image/manager/types.js.map +1 -0
  116. package/lib/cjs/components/Image/utils.js +1 -3
  117. package/lib/cjs/components/Image/utils.js.map +1 -1
  118. package/lib/cjs/components/ImagePreview/ImagePreview.js +1 -1
  119. package/lib/cjs/components/ImagePreview/api.js +1 -1
  120. package/lib/cjs/components/ImagePreview/index.js +1 -1
  121. package/lib/cjs/components/LanguageProvider/hooks/useLanguage.js +1 -1
  122. package/lib/cjs/components/LanguageProvider/index.js +1 -1
  123. package/lib/cjs/components/List/List.js +1 -1
  124. package/lib/cjs/components/List/ListItem/ListItem.js +1 -1
  125. package/lib/cjs/components/List/index.js +1 -1
  126. package/lib/cjs/components/List/styles.js +1 -1
  127. package/lib/cjs/components/MiniSnackBar/MiniSnackBar.js +1 -1
  128. package/lib/cjs/components/MiniSnackBar/index.js +1 -1
  129. package/lib/cjs/components/MiniSnackBar/styles.js +1 -1
  130. package/lib/cjs/components/NavigationBar/NavigationBar.js +1 -1
  131. package/lib/cjs/components/NavigationBar/index.js +1 -1
  132. package/lib/cjs/components/NavigationBar/styles.js +1 -1
  133. package/lib/cjs/components/NoticeBar/NoticeBar.js +1 -1
  134. package/lib/cjs/components/NoticeBar/index.js +1 -1
  135. package/lib/cjs/components/Picker/Picker.js +1 -1
  136. package/lib/cjs/components/Picker/api.js +1 -1
  137. package/lib/cjs/components/Picker/index.js +1 -1
  138. package/lib/cjs/components/PickerView/PickerView.js +1 -1
  139. package/lib/cjs/components/PickerView/Wheel.js +1 -1
  140. package/lib/cjs/components/PickerView/index.js +1 -1
  141. package/lib/cjs/components/Popover/Popover.js +1 -1
  142. package/lib/cjs/components/Popover/index.js +1 -1
  143. package/lib/cjs/components/Portal/core/PortalProvider.js +1 -1
  144. package/lib/cjs/components/Portal/index.js +1 -1
  145. package/lib/cjs/components/Progress/Progress.js +1 -1
  146. package/lib/cjs/components/Progress/index.js +1 -1
  147. package/lib/cjs/components/Progress/styles.js +1 -1
  148. package/lib/cjs/components/ProgressIndicator/ProgressIndicator.js +1 -1
  149. package/lib/cjs/components/ProgressIndicator/index.js +1 -1
  150. package/lib/cjs/components/ProgressIndicator/styles.js +1 -1
  151. package/lib/cjs/components/PullRefresh/PullRefresh.js +1 -1
  152. package/lib/cjs/components/PullRefresh/component.js +1 -1
  153. package/lib/cjs/components/PullRefresh/index.js +1 -1
  154. package/lib/cjs/components/Radio/Radio.js +3 -1
  155. package/lib/cjs/components/Radio/Radio.js.map +1 -1
  156. package/lib/cjs/components/Radio/RadioGroup.js +1 -1
  157. package/lib/cjs/components/Radio/index.js +3 -1
  158. package/lib/cjs/components/Radio/index.js.map +1 -1
  159. package/lib/cjs/components/Radio/styles.js +1 -1
  160. package/lib/cjs/components/Rate/Rate.js +1 -1
  161. package/lib/cjs/components/Rate/index.js +1 -1
  162. package/lib/cjs/components/Result/Result.js +1 -1
  163. package/lib/cjs/components/Result/index.js +1 -1
  164. package/lib/cjs/components/Result/styles.js +1 -1
  165. package/lib/cjs/components/Search/Search.js +1 -1
  166. package/lib/cjs/components/Search/index.js +1 -1
  167. package/lib/cjs/components/Search/styles.js +1 -1
  168. package/lib/cjs/components/SegmentedControl/SegmentedControl.js +1 -1
  169. package/lib/cjs/components/SegmentedControl/index.js +1 -1
  170. package/lib/cjs/components/Sheets/AnimatedSheets.js +1 -1
  171. package/lib/cjs/components/Sheets/Sheets.js +1 -1
  172. package/lib/cjs/components/Sheets/api.js +1 -1
  173. package/lib/cjs/components/Sheets/index.js +1 -1
  174. package/lib/cjs/components/Skeleton/Item/SkeletonItem.js +1 -1
  175. package/lib/cjs/components/Skeleton/Item/SkeletonItem69.js +1 -1
  176. package/lib/cjs/components/Skeleton/Skeleton.js +1 -1
  177. package/lib/cjs/components/Skeleton/Skeleton69.js +1 -1
  178. package/lib/cjs/components/Skeleton/index.js +1 -1
  179. package/lib/cjs/components/Slider/Slider.js +1 -1
  180. package/lib/cjs/components/Slider/index.js +1 -1
  181. package/lib/cjs/components/SlimAlert/Alert.js +1 -1
  182. package/lib/cjs/components/SlimAlert/AlertContent.js +1 -1
  183. package/lib/cjs/components/SlimAlert/AlertFooter.js +1 -1
  184. package/lib/cjs/components/SlimAlert/index.js +1 -1
  185. package/lib/cjs/components/SlimAlert/styles.js +1 -1
  186. package/lib/cjs/components/SlimNavigationBar/NavigationBar.js +1 -1
  187. package/lib/cjs/components/SlimNavigationBar/NavigationBarAction.js +1 -1
  188. package/lib/cjs/components/SlimNavigationBar/index.js +1 -1
  189. package/lib/cjs/components/SlimNavigationBar/styles.js +1 -1
  190. package/lib/cjs/components/SlimSheets/AnimatedSheets.js +1 -1
  191. package/lib/cjs/components/SlimSheets/AnimatedSheetsAction.js +1 -1
  192. package/lib/cjs/components/SlimSheets/AnimatedSheetsHeader.js +1 -1
  193. package/lib/cjs/components/SlimSheets/DragAnimatedSheets.js +1 -1
  194. package/lib/cjs/components/SlimSheets/index.js +1 -1
  195. package/lib/cjs/components/SlimTabs/BadgeSlimTabItem.js +1 -1
  196. package/lib/cjs/components/SlimTabs/SlimTab.js +1 -1
  197. package/lib/cjs/components/SlimTabs/SlimTabItem.js +1 -1
  198. package/lib/cjs/components/SlimTabs/SlimTabItemLabel.js +1 -1
  199. package/lib/cjs/components/SlimTabs/SlimTabItemValue.js +1 -1
  200. package/lib/cjs/components/SlimTabs/SlimTabList.js +1 -1
  201. package/lib/cjs/components/SlimTabs/index.js +1 -1
  202. package/lib/cjs/components/SlimTabs/styles.js +1 -1
  203. package/lib/cjs/components/SnackBar/SnackBar.js +1 -1
  204. package/lib/cjs/components/SnackBar/index.js +1 -1
  205. package/lib/cjs/components/SnackBar/styles.js +1 -1
  206. package/lib/cjs/components/Stepper/Stepper.js +1 -1
  207. package/lib/cjs/components/Stepper/index.js +1 -1
  208. package/lib/cjs/components/Switch/Switch.js +1 -1
  209. package/lib/cjs/components/Switch/index.js +1 -1
  210. package/lib/cjs/components/Tab/Tabs.js +1 -1
  211. package/lib/cjs/components/Tab/index.js +1 -1
  212. package/lib/cjs/components/Tab/styles.js +1 -1
  213. package/lib/cjs/components/TabBar/TabBar.js +1 -1
  214. package/lib/cjs/components/TabBar/index.js +1 -1
  215. package/lib/cjs/components/TabBar/styles.js +1 -1
  216. package/lib/cjs/components/Tag/Tag.js +1 -1
  217. package/lib/cjs/components/Tag/index.js +1 -1
  218. package/lib/cjs/components/Text/Text.js +1 -1
  219. package/lib/cjs/components/Text/Viewable.js +1 -1
  220. package/lib/cjs/components/Text/hooks/cloneContainer.js +1 -1
  221. package/lib/cjs/components/Text/hooks/index.js +1 -1
  222. package/lib/cjs/components/Text/hooks/loadFontFromFile.js +1 -1
  223. package/lib/cjs/components/Text/index.js +1 -1
  224. package/lib/cjs/components/Text/styles.js +1 -1
  225. package/lib/cjs/components/TextField/TextField.js +1 -1
  226. package/lib/cjs/components/TextField/index.js +1 -1
  227. package/lib/cjs/components/TextField/styles.js +1 -1
  228. package/lib/cjs/components/TextView/TextView.js +1 -1
  229. package/lib/cjs/components/TextView/index.js +1 -1
  230. package/lib/cjs/components/TextView/styles.js +1 -1
  231. package/lib/cjs/components/Toast/Toast.js +1 -1
  232. package/lib/cjs/components/Toast/api.js +1 -1
  233. package/lib/cjs/components/Toast/index.js +1 -1
  234. package/lib/cjs/components/Toast/styles.js +1 -1
  235. package/lib/cjs/components/Uploader/Uploader.js +1 -1
  236. package/lib/cjs/components/Uploader/index.js +1 -1
  237. package/lib/cjs/components/Uploader/utils.js +1 -1
  238. package/lib/cjs/index.js +3 -1
  239. package/lib/cjs/index.js.map +1 -1
  240. package/lib/esm/_chunks/{CAkwE9ZD.js → DpFbw-p-.js} +2 -2
  241. package/lib/esm/_chunks/{CAkwE9ZD.js.map → DpFbw-p-.js.map} +1 -1
  242. package/lib/esm/components/ActionSheets/ActionSheets.js +1 -1
  243. package/lib/esm/components/ActionSheets/ActionSheetsItem.js +1 -1
  244. package/lib/esm/components/ActionSheets/api.js +1 -1
  245. package/lib/esm/components/ActionSheets/hooks.js +1 -1
  246. package/lib/esm/components/ActionSheets/index.js +1 -1
  247. package/lib/esm/components/ActionablePopover/ActionablePopover.js +1 -1
  248. package/lib/esm/components/ActionablePopover/index.js +1 -1
  249. package/lib/esm/components/Alert/Alert.js +1 -1
  250. package/lib/esm/components/Alert/hooks/alert.js +1 -1
  251. package/lib/esm/components/Alert/index.js +1 -1
  252. package/lib/esm/components/Alert/styles.js +1 -1
  253. package/lib/esm/components/Avatar/Avatar.js +1 -1
  254. package/lib/esm/components/Avatar/index.js +1 -1
  255. package/lib/esm/components/Avatar/styles.js +1 -1
  256. package/lib/esm/components/AvatarGroup/AvatarGroup.js +1 -1
  257. package/lib/esm/components/AvatarGroup/index.js +1 -1
  258. package/lib/esm/components/Badge/Badge.js +1 -1
  259. package/lib/esm/components/Badge/index.js +1 -1
  260. package/lib/esm/components/Badge/styles.js +1 -1
  261. package/lib/esm/components/BottomBar/BottomBar.js +1 -1
  262. package/lib/esm/components/BottomBar/index.js +1 -1
  263. package/lib/esm/components/Button/Button.js +1 -1
  264. package/lib/esm/components/Button/Viewable.js +1 -1
  265. package/lib/esm/components/Button/index.js +1 -1
  266. package/lib/esm/components/Button/styleMap.js +1 -1
  267. package/lib/esm/components/Carousel/Carousel.js +1 -1
  268. package/lib/esm/components/Carousel/index.js +1 -1
  269. package/lib/esm/components/CheckBoxGroup/CheckBox.js +1 -1
  270. package/lib/esm/components/CheckBoxGroup/CheckBoxGroup.js +1 -1
  271. package/lib/esm/components/CheckBoxGroup/index.js +1 -1
  272. package/lib/esm/components/CheckBoxGroup/styles.js +1 -1
  273. package/lib/esm/components/Collapse/Collapse.js +1 -1
  274. package/lib/esm/components/Collapse/Item/Item.js +1 -1
  275. package/lib/esm/components/Collapse/Item/styles.js +1 -1
  276. package/lib/esm/components/Collapse/index.js +1 -1
  277. package/lib/esm/components/ConfigProvider/ConfigProvider.js +1 -1
  278. package/lib/esm/components/ConfigProvider/hooks/ConfigCache/ConfigCache.js +1 -1
  279. package/lib/esm/components/ConfigProvider/hooks/ConfigCache/index.js +1 -1
  280. package/lib/esm/components/ConfigProvider/hooks/themeToken/index.js +1 -1
  281. package/lib/esm/components/ConfigProvider/hooks/themeToken/useThemeToken.js +1 -1
  282. package/lib/esm/components/ConfigProvider/index.js +1 -1
  283. package/lib/esm/components/DatePicker/DatePicker.js +1 -1
  284. package/lib/esm/components/DatePicker/api.js +1 -1
  285. package/lib/esm/components/DatePicker/index.js +1 -1
  286. package/lib/esm/components/Divider/Divider.js +1 -1
  287. package/lib/esm/components/Divider/index.js +1 -1
  288. package/lib/esm/components/Divider/styles.js +1 -1
  289. package/lib/esm/components/DropDown/DropDown.js +1 -1
  290. package/lib/esm/components/DropDown/DropDownItem.js +1 -1
  291. package/lib/esm/components/DropDown/index.js +1 -1
  292. package/lib/esm/components/Empty/Empty.js +1 -1
  293. package/lib/esm/components/Empty/index.js +1 -1
  294. package/lib/esm/components/Empty/styles.js +1 -1
  295. package/lib/esm/components/FAB/FAB.js +1 -1
  296. package/lib/esm/components/FAB/index.js +1 -1
  297. package/lib/esm/components/Form/Form.js +1 -1
  298. package/lib/esm/components/Form/FormItem.js +1 -1
  299. package/lib/esm/components/Form/index.js +1 -1
  300. package/lib/esm/components/Form/styles.js +1 -1
  301. package/lib/esm/components/Image/Image.js +45 -104
  302. package/lib/esm/components/Image/Image.js.map +1 -1
  303. package/lib/esm/components/Image/Image69.js +2 -1
  304. package/lib/esm/components/Image/Image69.js.map +1 -1
  305. package/lib/esm/components/Image/VisibilitySensor.js +22 -75
  306. package/lib/esm/components/Image/VisibilitySensor.js.map +1 -1
  307. package/lib/esm/components/Image/hook/index.js +2 -1
  308. package/lib/esm/components/Image/hook/index.js.map +1 -1
  309. package/lib/esm/components/Image/hook/useImageId.js +16 -0
  310. package/lib/esm/components/Image/hook/useImageId.js.map +1 -0
  311. package/lib/esm/components/Image/index.js +3 -1
  312. package/lib/esm/components/Image/index.js.map +1 -1
  313. package/lib/esm/components/Image/manager/ImageAPMManager.js +393 -0
  314. package/lib/esm/components/Image/manager/ImageAPMManager.js.map +1 -0
  315. package/lib/esm/components/Image/manager/index.js +6 -0
  316. package/lib/esm/components/Image/manager/index.js.map +1 -0
  317. package/lib/esm/components/Image/manager/types.js +2 -0
  318. package/lib/esm/components/Image/manager/types.js.map +1 -0
  319. package/lib/esm/components/Image/utils.js +1 -3
  320. package/lib/esm/components/Image/utils.js.map +1 -1
  321. package/lib/esm/components/ImagePreview/ImagePreview.js +1 -1
  322. package/lib/esm/components/ImagePreview/api.js +1 -1
  323. package/lib/esm/components/ImagePreview/index.js +1 -1
  324. package/lib/esm/components/LanguageProvider/hooks/useLanguage.js +1 -1
  325. package/lib/esm/components/LanguageProvider/index.js +1 -1
  326. package/lib/esm/components/List/List.js +1 -1
  327. package/lib/esm/components/List/ListItem/ListItem.js +1 -1
  328. package/lib/esm/components/List/index.js +1 -1
  329. package/lib/esm/components/List/styles.js +1 -1
  330. package/lib/esm/components/MiniSnackBar/MiniSnackBar.js +1 -1
  331. package/lib/esm/components/MiniSnackBar/index.js +1 -1
  332. package/lib/esm/components/MiniSnackBar/styles.js +1 -1
  333. package/lib/esm/components/NavigationBar/NavigationBar.js +1 -1
  334. package/lib/esm/components/NavigationBar/index.js +1 -1
  335. package/lib/esm/components/NavigationBar/styles.js +1 -1
  336. package/lib/esm/components/NoticeBar/NoticeBar.js +1 -1
  337. package/lib/esm/components/NoticeBar/index.js +1 -1
  338. package/lib/esm/components/Picker/Picker.js +1 -1
  339. package/lib/esm/components/Picker/api.js +1 -1
  340. package/lib/esm/components/Picker/index.js +1 -1
  341. package/lib/esm/components/PickerView/PickerView.js +1 -1
  342. package/lib/esm/components/PickerView/Wheel.js +1 -1
  343. package/lib/esm/components/PickerView/index.js +1 -1
  344. package/lib/esm/components/Popover/Popover.js +1 -1
  345. package/lib/esm/components/Popover/index.js +1 -1
  346. package/lib/esm/components/Portal/core/PortalProvider.js +1 -1
  347. package/lib/esm/components/Portal/index.js +1 -1
  348. package/lib/esm/components/Progress/Progress.js +1 -1
  349. package/lib/esm/components/Progress/index.js +1 -1
  350. package/lib/esm/components/Progress/styles.js +1 -1
  351. package/lib/esm/components/ProgressIndicator/ProgressIndicator.js +1 -1
  352. package/lib/esm/components/ProgressIndicator/index.js +1 -1
  353. package/lib/esm/components/ProgressIndicator/styles.js +1 -1
  354. package/lib/esm/components/PullRefresh/PullRefresh.js +1 -1
  355. package/lib/esm/components/PullRefresh/component.js +1 -1
  356. package/lib/esm/components/PullRefresh/index.js +1 -1
  357. package/lib/esm/components/Radio/Radio.js +3 -1
  358. package/lib/esm/components/Radio/Radio.js.map +1 -1
  359. package/lib/esm/components/Radio/RadioGroup.js +1 -1
  360. package/lib/esm/components/Radio/index.js +3 -1
  361. package/lib/esm/components/Radio/index.js.map +1 -1
  362. package/lib/esm/components/Radio/styles.js +1 -1
  363. package/lib/esm/components/Rate/Rate.js +1 -1
  364. package/lib/esm/components/Rate/index.js +1 -1
  365. package/lib/esm/components/Result/Result.js +1 -1
  366. package/lib/esm/components/Result/index.js +1 -1
  367. package/lib/esm/components/Result/styles.js +1 -1
  368. package/lib/esm/components/Search/Search.js +1 -1
  369. package/lib/esm/components/Search/index.js +1 -1
  370. package/lib/esm/components/Search/styles.js +1 -1
  371. package/lib/esm/components/SegmentedControl/SegmentedControl.js +1 -1
  372. package/lib/esm/components/SegmentedControl/index.js +1 -1
  373. package/lib/esm/components/Sheets/AnimatedSheets.js +1 -1
  374. package/lib/esm/components/Sheets/Sheets.js +1 -1
  375. package/lib/esm/components/Sheets/api.js +1 -1
  376. package/lib/esm/components/Sheets/index.js +1 -1
  377. package/lib/esm/components/Skeleton/Item/SkeletonItem.js +1 -1
  378. package/lib/esm/components/Skeleton/Item/SkeletonItem69.js +1 -1
  379. package/lib/esm/components/Skeleton/Skeleton.js +1 -1
  380. package/lib/esm/components/Skeleton/Skeleton69.js +1 -1
  381. package/lib/esm/components/Skeleton/index.js +1 -1
  382. package/lib/esm/components/Slider/Slider.js +1 -1
  383. package/lib/esm/components/Slider/index.js +1 -1
  384. package/lib/esm/components/SlimAlert/Alert.js +1 -1
  385. package/lib/esm/components/SlimAlert/AlertContent.js +1 -1
  386. package/lib/esm/components/SlimAlert/AlertFooter.js +1 -1
  387. package/lib/esm/components/SlimAlert/index.js +1 -1
  388. package/lib/esm/components/SlimAlert/styles.js +1 -1
  389. package/lib/esm/components/SlimNavigationBar/NavigationBar.js +1 -1
  390. package/lib/esm/components/SlimNavigationBar/NavigationBarAction.js +1 -1
  391. package/lib/esm/components/SlimNavigationBar/index.js +1 -1
  392. package/lib/esm/components/SlimNavigationBar/styles.js +1 -1
  393. package/lib/esm/components/SlimSheets/AnimatedSheets.js +1 -1
  394. package/lib/esm/components/SlimSheets/AnimatedSheetsAction.js +1 -1
  395. package/lib/esm/components/SlimSheets/AnimatedSheetsHeader.js +1 -1
  396. package/lib/esm/components/SlimSheets/DragAnimatedSheets.js +1 -1
  397. package/lib/esm/components/SlimSheets/index.js +1 -1
  398. package/lib/esm/components/SlimTabs/BadgeSlimTabItem.js +1 -1
  399. package/lib/esm/components/SlimTabs/SlimTab.js +1 -1
  400. package/lib/esm/components/SlimTabs/SlimTabItem.js +1 -1
  401. package/lib/esm/components/SlimTabs/SlimTabItemLabel.js +1 -1
  402. package/lib/esm/components/SlimTabs/SlimTabItemValue.js +1 -1
  403. package/lib/esm/components/SlimTabs/SlimTabList.js +1 -1
  404. package/lib/esm/components/SlimTabs/index.js +1 -1
  405. package/lib/esm/components/SlimTabs/styles.js +1 -1
  406. package/lib/esm/components/SnackBar/SnackBar.js +1 -1
  407. package/lib/esm/components/SnackBar/index.js +1 -1
  408. package/lib/esm/components/SnackBar/styles.js +1 -1
  409. package/lib/esm/components/Stepper/Stepper.js +1 -1
  410. package/lib/esm/components/Stepper/index.js +1 -1
  411. package/lib/esm/components/Switch/Switch.js +1 -1
  412. package/lib/esm/components/Switch/index.js +1 -1
  413. package/lib/esm/components/Tab/Tabs.js +1 -1
  414. package/lib/esm/components/Tab/index.js +1 -1
  415. package/lib/esm/components/Tab/styles.js +1 -1
  416. package/lib/esm/components/TabBar/TabBar.js +1 -1
  417. package/lib/esm/components/TabBar/index.js +1 -1
  418. package/lib/esm/components/TabBar/styles.js +1 -1
  419. package/lib/esm/components/Tag/Tag.js +1 -1
  420. package/lib/esm/components/Tag/index.js +1 -1
  421. package/lib/esm/components/Text/Text.js +1 -1
  422. package/lib/esm/components/Text/Viewable.js +1 -1
  423. package/lib/esm/components/Text/hooks/cloneContainer.js +1 -1
  424. package/lib/esm/components/Text/hooks/index.js +1 -1
  425. package/lib/esm/components/Text/hooks/loadFontFromFile.js +1 -1
  426. package/lib/esm/components/Text/index.js +1 -1
  427. package/lib/esm/components/Text/styles.js +1 -1
  428. package/lib/esm/components/TextField/TextField.js +1 -1
  429. package/lib/esm/components/TextField/index.js +1 -1
  430. package/lib/esm/components/TextField/styles.js +1 -1
  431. package/lib/esm/components/TextView/TextView.js +1 -1
  432. package/lib/esm/components/TextView/index.js +1 -1
  433. package/lib/esm/components/TextView/styles.js +1 -1
  434. package/lib/esm/components/Toast/Toast.js +1 -1
  435. package/lib/esm/components/Toast/api.js +1 -1
  436. package/lib/esm/components/Toast/index.js +1 -1
  437. package/lib/esm/components/Toast/styles.js +1 -1
  438. package/lib/esm/components/Uploader/Uploader.js +1 -1
  439. package/lib/esm/components/Uploader/index.js +1 -1
  440. package/lib/esm/components/Uploader/utils.js +1 -1
  441. package/lib/esm/index.js +3 -1
  442. package/lib/esm/index.js.map +1 -1
  443. package/lib/src/components/Image/Image.d.ts +1 -1
  444. package/lib/src/components/Image/hook/index.d.ts +1 -0
  445. package/lib/src/components/Image/hook/useImageId.d.ts +7 -0
  446. package/lib/src/components/Image/index.d.ts +1 -1
  447. package/lib/src/components/Image/manager/ImageAPMManager.d.ts +123 -0
  448. package/lib/src/components/Image/manager/index.d.ts +2 -0
  449. package/lib/src/components/Image/manager/types.d.ts +40 -0
  450. package/lib/types/components/Image/Image.d.ts +1 -1
  451. package/lib/types/components/Image/hook/index.d.ts +1 -0
  452. package/lib/types/components/Image/hook/useImageId.d.ts +7 -0
  453. package/lib/types/components/Image/index.d.ts +1 -1
  454. package/lib/types/components/Image/manager/ImageAPMManager.d.ts +123 -0
  455. package/lib/types/components/Image/manager/index.d.ts +2 -0
  456. package/lib/types/components/Image/manager/types.d.ts +40 -0
  457. package/package.json +1 -1
  458. package/src/components/Image/Image.tsx +48 -127
  459. package/src/components/Image/VisibilitySensor.tsx +35 -82
  460. package/src/components/Image/hook/index.ts +2 -0
  461. package/src/components/Image/hook/useImageId.ts +33 -0
  462. package/src/components/Image/manager/ImageAPMManager.ts +389 -0
  463. package/src/components/Image/manager/index.ts +2 -0
  464. package/src/components/Image/manager/types.ts +46 -0
  465. package/src/components/Image/utils.ts +0 -2
@@ -1,4 +1,4 @@
1
- import React, { useState, memo, useMemo, useRef, useCallback, useEffect } from "react";
1
+ import React, { useState, memo, useMemo, useEffect } from "react";
2
2
  import {
3
3
  View,
4
4
  Image as RNImage,
@@ -10,25 +10,17 @@ import {
10
10
  ImageErrorEventData,
11
11
  ImageProgressEventDataIOS,
12
12
  ImageSourcePropType,
13
- ImageURISource,
14
13
  } from "react-native";
15
- import {
16
- RedsImage,
17
- ImageDefaultProps,
18
- IMAGE_STATUS,
19
- TErrorStyle,
20
- TLoadStyle,
21
- ImageTrackerProps,
22
- } from "./interface/index";
14
+ import { RedsImage, ImageDefaultProps, IMAGE_STATUS, TErrorStyle, TLoadStyle } from "./interface/index";
23
15
  import styles from "./styles";
24
- import { useAveColor, useBlur } from "./hook";
16
+ import { useAveColor, useBlur, useImageId } from "./hook";
25
17
  import CircularProgress from "./CircularProgress";
26
18
  import { useColorMode } from "../ConfigProvider";
27
19
  import useMounted from "../../pvCount/useUnmountedProcess";
28
20
  import { lightColor } from "@xhs/reds-token-next";
29
- import { formatUri, isDataUri, isLocalFile, convertKeysToSnakeCase } from "./utils";
21
+ import { formatUri } from "./utils";
30
22
  import VisibilitySensor from "./VisibilitySensor";
31
- import { apmPush } from "./apm";
23
+ import { ImageAPMManager } from "./manager";
32
24
 
33
25
  const imageReLoad = {
34
26
  light: "https://picasso-static.xiaohongshu.com/fe-platform/06ae169b310c2926e541903b828486a80fcac404.png",
@@ -54,15 +46,22 @@ const Image = ({
54
46
  abortApmCollection,
55
47
  fadeDuration,
56
48
  onFirstDrawFinished,
49
+ apmBiz,
57
50
  ...props
58
51
  }: RedsImage & Omit<ImageProps, keyof RedsImage>) => {
59
52
  useMounted("Image");
53
+
54
+ // Generate stable ID for this image instance
55
+ const imageId = useImageId();
56
+
60
57
  const [imageStatus, setImageStatus] = useState(IMAGE_STATUS.LOADING);
61
58
  const [progress, setProgress] = useState(0);
59
+ const [viewable, setViewable] = useState(false);
60
+ const [apmDone, setApmDone] = useState(false);
62
61
 
63
62
  const formatSource = useMemo(() => {
64
63
  // @ts-ignore
65
- if (_source) return { uri: formatUri({ uri: _source.uri, width }) } as ImageSourcePropTyp;
64
+ if (_source) return { uri: formatUri({ uri: _source.uri, width }) };
66
65
  // @ts-ignore
67
66
  return { uri: formatUri({ uri: src, width }) } as ImageSourcePropType;
68
67
  }, [src, _source, width]);
@@ -75,114 +74,33 @@ const Image = ({
75
74
 
76
75
  const blurSource = useBlur({ source: formatSource });
77
76
 
78
- const [viewable, setViewable] = useState(false);
79
- const hasInit = useRef(false);
80
- const checkIsVisible = (isVisible: boolean) => {
81
- if (abortApmCollection) return;
82
- // 判断首屏
83
- if (!hasInit.current) {
84
- hasInit.current = true;
85
- apmDataRef.current.isFirstScreen = isVisible ? "true" : "false";
86
- }
87
- setViewable(isVisible);
88
- };
89
- const apmDataRef = useRef<ImageTrackerProps>({
90
- imageUrl: "",
91
- imageHost: "",
92
- intersectTime: viewable ? Date.now() : 0,
93
- imageSize: 0,
94
- isFirstScreen: "false",
95
- isPrefetch: "",
96
- isSuccess: "false",
97
- errorReason: "",
98
- loadedStartTime: 0,
99
- loadedTime: 0,
100
- loadDuration: 0,
101
- viewDuration: 0,
102
- });
103
- const [apmDoneRef, setApmDoneRef] = useState(false);
104
-
77
+ // APM Manager Integration - Single effect for registration
105
78
  useEffect(() => {
106
79
  if (abortApmCollection) return;
107
- try {
108
- const apmData = apmDataRef.current;
109
- if (
110
- typeof formatSource !== "number" &&
111
- !isLocalFile((formatSource as ImageURISource).uri as string) &&
112
- !isDataUri((formatSource as ImageURISource).uri as string)
113
- ) {
114
- const imageUrl = new URL((formatSource as ImageURISource).uri as string);
115
- apmData.imageHost = `${imageUrl.protocol}//${imageUrl.host}`;
116
- apmData.imageUrl = (formatSource as ImageURISource).uri as string;
117
- }
118
- } catch (error) {
119
- //
120
- }
121
- }, [formatSource, abortApmCollection]);
122
80
 
123
- useEffect(() => {
124
- if (abortApmCollection) return;
125
- const imageUrl = (formatSource as ImageURISource)?.uri || "";
126
- if (typeof RNImage.queryCache === "function" && !!imageUrl) {
127
- const uriEncodeImageUrl = encodeURI(imageUrl);
128
- RNImage.queryCache([imageUrl]).then((res) => {
129
- if (res?.[uriEncodeImageUrl]) {
130
- apmDataRef.current.isPrefetch = "true";
131
- } else {
132
- apmDataRef.current.isPrefetch = "false";
133
- }
134
- });
135
- }
136
- return () => {
137
- apmDataRef.current.isPrefetch = "";
138
- };
139
- }, [formatSource, abortApmCollection]);
81
+ const manager = ImageAPMManager.getInstance();
82
+ manager.register(imageId, formatSource, apmBiz);
140
83
 
141
- const pushApmData = useCallback(() => {
142
- if (abortApmCollection) return;
143
- const apmData = apmDataRef.current;
144
- const viewDuration = apmData.loadedTime - apmData.intersectTime;
145
- apmData.viewDuration = viewDuration < 0 ? 0 : viewDuration;
146
- /**
147
- * 如果Image.queryCache未完成时,通过imageSize来判断
148
- * 如果image_size是-1,那么认为图片已有缓存
149
- */
150
- const imageSize = apmDataRef.current.imageSize || 0;
151
- if (!apmDataRef.current.isPrefetch) {
152
- apmDataRef.current.isPrefetch = String((imageSize || 0) <= 0);
153
- }
154
- if (!apmDoneRef && apmData.imageUrl && !abortApmCollection) {
155
- setApmDoneRef(true);
156
- apmPush(convertKeysToSnakeCase(apmData));
157
- }
158
- }, [abortApmCollection]);
84
+ return () => manager.unregister(imageId);
85
+ }, [imageId, abortApmCollection, apmBiz]);
159
86
 
160
- // 判断首屏
161
- if (
162
- (!apmDataRef.current.isFirstScreen || apmDataRef.current.isFirstScreen === "false") &&
163
- viewable &&
164
- !abortApmCollection
165
- ) {
166
- apmDataRef.current.isFirstScreen = "true";
167
- }
87
+ // Update source if it changes
168
88
  useEffect(() => {
169
89
  if (abortApmCollection) return;
170
- const apmData = apmDataRef.current;
171
- if (!apmData.intersectTime && viewable) {
172
- apmData.intersectTime = Date.now();
173
- // 进入视窗前加载完成/失败
174
- if (apmData.loadedTime || apmData.errorReason) {
175
- pushApmData();
176
- }
177
- }
178
- }, [viewable, pushApmData, abortApmCollection]);
179
- const onLoadEnd = () => {
180
- props?.onLoadEnd?.();
90
+ ImageAPMManager.getInstance().updateSource(imageId, formatSource);
91
+ }, [formatSource, abortApmCollection, imageId]);
92
+
93
+ // Visibility tracking - simplified
94
+ const checkIsVisible = (isVisible: boolean) => {
181
95
  if (abortApmCollection) return;
182
- const apmData = apmDataRef.current;
183
- // 进入视窗后加载成功/失败
184
- if (apmData.intersectTime) {
185
- pushApmData();
96
+ ImageAPMManager.getInstance().setViewable(imageId, isVisible);
97
+ setViewable(isVisible);
98
+ };
99
+
100
+ // Event handlers - simplified to use manager
101
+ const onLoadStart = () => {
102
+ if (!abortApmCollection) {
103
+ ImageAPMManager.getInstance().recordLoadStart(imageId);
186
104
  }
187
105
  };
188
106
 
@@ -193,33 +111,36 @@ const Image = ({
193
111
  if (total) {
194
112
  setProgress(((loaded / total) * 100) | 0);
195
113
  }
196
- !abortApmCollection && (apmDataRef.current.imageSize = total);
114
+ if (!abortApmCollection) {
115
+ ImageAPMManager.getInstance().recordProgress(imageId, loaded, total);
116
+ }
197
117
  props.onProgress?.(e);
198
118
  };
119
+
199
120
  const onLoad = (e: NativeSyntheticEvent<ImageLoadEventData>) => {
200
121
  if (!abortApmCollection) {
201
- const now = Date.now();
202
- const loadDuration = now - apmDataRef.current.loadedStartTime;
203
- apmDataRef.current.loadedTime = now;
204
- apmDataRef.current.loadDuration = loadDuration < 0 ? 0 : loadDuration;
205
- apmDataRef.current.isSuccess = "true";
122
+ ImageAPMManager.getInstance().recordLoad(imageId);
206
123
  }
207
124
  props.onLoad?.(e);
208
125
  setImageStatus(IMAGE_STATUS.LOADED);
209
126
  };
210
127
 
211
- const onLoadStart = () => {
212
- !abortApmCollection && (apmDataRef.current.loadedStartTime = Date.now());
213
- };
214
-
215
128
  const onError = (e: NativeSyntheticEvent<ImageErrorEventData>) => {
216
129
  if (!abortApmCollection) {
217
- apmDataRef.current.isSuccess = "false";
218
- apmDataRef.current.errorReason = `${e.nativeEvent.error}`;
130
+ ImageAPMManager.getInstance().recordError(imageId, `${e.nativeEvent.error}`);
219
131
  }
220
132
  props.onError?.(e);
221
133
  setImageStatus(errorStyle === TErrorStyle.ERROR ? IMAGE_STATUS.LOADERROR : IMAGE_STATUS.RELOAD);
222
134
  };
135
+
136
+ const onLoadEnd = () => {
137
+ if (!abortApmCollection) {
138
+ ImageAPMManager.getInstance().checkAndPush(imageId);
139
+ setApmDone(true);
140
+ }
141
+ props?.onLoadEnd?.();
142
+ };
143
+
223
144
  const onReload = (e: GestureResponderEvent) => {
224
145
  setImageStatus(IMAGE_STATUS.HIDE);
225
146
  props.onReload?.(e);
@@ -234,7 +155,7 @@ const Image = ({
234
155
  <View style={{ borderRadius, height, width, ...(style as {}) }}>
235
156
  {imageStatus !== IMAGE_STATUS.HIDE &&
236
157
  (!abortApmCollection ? (
237
- <VisibilitySensor onChange={checkIsVisible} disabled={apmDoneRef}>
158
+ <VisibilitySensor onChange={checkIsVisible} disabled={apmDone}>
238
159
  <RNImage
239
160
  {...props}
240
161
  // @ts-ignore
@@ -1,98 +1,51 @@
1
- import React, { useCallback, useEffect, useRef, useState, forwardRef, useImperativeHandle } from "react";
2
- import { Dimensions, type ScaledSize, View } from "react-native";
3
- import type { VisibilitySensorRef, VisibilitySensorProps, RectDimensionsState } from "./interface/visibilitySensor";
4
- // function useInterval(callback: () => void, delay: number | null) {
5
- // const savedCallback = useRef(callback);
6
- // useEffect(() => {
7
- // savedCallback.current = callback;
8
- // }, [callback]);
9
- // useEffect(() => {
10
- // if (delay === null || delay === undefined) {
11
- // return;
12
- // }
13
- // const id = setInterval(() => savedCallback.current(), delay);
14
- // return () => clearInterval(id);
15
- // }, [delay]);
16
- // }
1
+ import React, { useCallback, useEffect, useRef, forwardRef, useImperativeHandle } from "react";
2
+ import { Dimensions, View } from "react-native";
3
+ import type { VisibilitySensorRef, VisibilitySensorProps } from "./interface/visibilitySensor";
4
+
17
5
  const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>((props, ref) => {
18
6
  const { onChange, disabled = false, triggerOnce = false, delay, threshold = {}, children, ...rest } = props;
19
7
  const localRef = useRef<View>(null);
20
- const hasMountedRef = useRef(false);
8
+ const lastVisibleRef = useRef<boolean | undefined>(undefined);
9
+ const measuredOnceRef = useRef<boolean>(false);
10
+
21
11
  useImperativeHandle(ref, () => ({
22
12
  getInnerRef: () => localRef.current,
23
13
  }));
24
- const [rectDimensions, setRectDimensions] = useState<RectDimensionsState>({
25
- rectTop: 0,
26
- rectBottom: 0,
27
- rectLeft: 0,
28
- rectRight: 0,
29
- rectWidth: 0,
30
- rectHeight: 0,
31
- });
32
- const [lastValue, setLastValue] = useState<boolean | undefined>(undefined);
33
- const [active, setActive] = useState<boolean>(false);
34
- const measureInnerView = () => {
35
- if (!active) return;
36
- localRef.current?.measure((_x: number, _y: number, width: number, height: number, pageX: number, pageY: number) => {
37
- const dimensions = {
38
- rectTop: pageY,
39
- rectBottom: pageY + height,
40
- rectLeft: pageX,
41
- rectRight: pageX + width,
42
- rectWidth: width,
43
- rectHeight: height,
44
- };
45
- if (
46
- rectDimensions.rectTop !== dimensions.rectTop ||
47
- rectDimensions.rectBottom !== dimensions.rectBottom ||
48
- rectDimensions.rectLeft !== dimensions.rectLeft ||
49
- rectDimensions.rectRight !== dimensions.rectRight ||
50
- rectDimensions.rectWidth !== dimensions.rectWidth ||
51
- rectDimensions.rectHeight !== dimensions.rectHeight
52
- ) {
53
- setRectDimensions(dimensions);
14
+
15
+ // Compute visibility once using native measure; avoid react state to prevent layout loops
16
+ const measureAndNotify = useCallback(() => {
17
+ if (disabled || measuredOnceRef.current) return;
18
+ const win = Dimensions.get("window");
19
+ localRef.current?.measure((_, __, width: number, height: number, pageX: number, pageY: number) => {
20
+ const isVisible =
21
+ pageY + (threshold.top || 0) <= win.height &&
22
+ pageY + height - (threshold.bottom || 0) >= 0 &&
23
+ pageX + (threshold.left || 0) <= win.width &&
24
+ pageX + width - (threshold.right || 0) >= 0;
25
+
26
+ if (lastVisibleRef.current !== isVisible) {
27
+ lastVisibleRef.current = isVisible;
28
+ onChange(isVisible);
29
+ // Only measure once to match original behavior
30
+ measuredOnceRef.current = true;
54
31
  }
55
32
  });
56
- };
57
- // useInterval(measureInnerView, delay || 100);
58
- const startWatching = useCallback(() => {
59
- if (!active) setActive(true);
60
- }, [active]);
61
- const stopWatching = useCallback(() => {
62
- if (active) setActive(false);
63
- }, [active]);
33
+ }, [disabled, onChange, threshold]);
34
+
35
+ // Keep active in sync with disabled prop
64
36
  useEffect(() => {
65
- if (!disabled) {
66
- startWatching();
37
+ // If it becomes enabled and we haven't measured yet, measure once now
38
+ if (!disabled && !measuredOnceRef.current) {
39
+ // Defer to allow layout to settle
40
+ requestAnimationFrame(() => measureAndNotify());
67
41
  }
68
- return () => {
69
- stopWatching();
70
- };
71
- }, [disabled, startWatching, stopWatching]);
72
- useEffect(() => {
73
- if (!hasMountedRef.current) {
74
- hasMountedRef.current = true;
75
- return;
76
- }
77
- const window: ScaledSize = Dimensions.get("window");
78
- const isVisible: boolean =
79
- rectDimensions.rectTop + (threshold.top || 0) <= window.height && // Top edge is within the bottom of the window
80
- rectDimensions.rectBottom - (threshold.bottom || 0) >= 0 && // Bottom edge is within the top of the window
81
- rectDimensions.rectLeft + (threshold.left || 0) <= window.width && // Left edge is within the right of the window
82
- rectDimensions.rectRight - (threshold.right || 0) >= 0; // Right edge is within the left of the window
83
- if (lastValue !== isVisible) {
84
- setLastValue(isVisible);
85
- onChange(isVisible);
86
- if (isVisible && triggerOnce) {
87
- stopWatching();
88
- }
89
- }
90
- // change
91
- }, [rectDimensions, lastValue, threshold, onChange, triggerOnce, stopWatching]);
42
+ }, [disabled, measureAndNotify]);
43
+
92
44
  return (
93
- <View ref={localRef} {...rest} onLayout={() => measureInnerView()}>
45
+ <View ref={localRef} {...rest} onLayout={measureAndNotify}>
94
46
  {children}
95
47
  </View>
96
48
  );
97
49
  });
50
+
98
51
  export default VisibilitySensor;
@@ -30,3 +30,5 @@ export const useBlur = ({ source }: { source: ImageSourcePropType }) => {
30
30
  if (!url) return { uri: "" };
31
31
  return { uri: url.includes("?") ? url.replace(/\?.*/, "?imageMogr2/blur/25x25") : url + "?imageMogr2/blur/25x25" };
32
32
  };
33
+
34
+ export { useImageId } from "./useImageId";
@@ -0,0 +1,33 @@
1
+ import { useRef } from "react";
2
+ import React from "react";
3
+
4
+ /**
5
+ * useId polyfill for React < 18
6
+ *
7
+ * React 18+ has native useId() hook for generating unique IDs.
8
+ * For older versions, we implement a simple counter-based solution.
9
+ */
10
+
11
+ let globalCounter = 0;
12
+
13
+ /**
14
+ * Generate a unique ID for each image instance
15
+ *
16
+ * If React 18+ useId is available, use it.
17
+ * Otherwise, use a counter-based fallback.
18
+ */
19
+ export function useImageId(): string {
20
+ // Try to use React 18+ native useId if available
21
+ if (typeof (React as any).useId === "function") {
22
+ return (React as any).useId();
23
+ }
24
+
25
+ // Fallback for React < 18
26
+ const idRef = useRef<string | null>(null);
27
+
28
+ if (idRef.current === null) {
29
+ idRef.current = `image-${++globalCounter}`;
30
+ }
31
+
32
+ return idRef.current;
33
+ }