@wordpress/components 23.7.0 → 23.9.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 (274) hide show
  1. package/CHANGELOG.md +52 -6
  2. package/build/checkbox-control/index.js +2 -2
  3. package/build/checkbox-control/index.js.map +1 -1
  4. package/build/color-palette/index.native.js +12 -0
  5. package/build/color-palette/index.native.js.map +1 -1
  6. package/build/custom-gradient-picker/index.native.js +3 -1
  7. package/build/custom-gradient-picker/index.native.js.map +1 -1
  8. package/build/custom-gradient-picker/serializer.js +0 -4
  9. package/build/custom-gradient-picker/serializer.js.map +1 -1
  10. package/build/draggable/index.js +6 -1
  11. package/build/draggable/index.js.map +1 -1
  12. package/build/drop-zone/index.js +8 -8
  13. package/build/drop-zone/index.js.map +1 -1
  14. package/build/index.js.map +1 -1
  15. package/build/mobile/bottom-sheet/cell.native.js +6 -6
  16. package/build/mobile/bottom-sheet/cell.native.js.map +1 -1
  17. package/build/mobile/color-settings/palette.screen.native.js +0 -8
  18. package/build/mobile/color-settings/palette.screen.native.js.map +1 -1
  19. package/build/mobile/global-styles-context/utils.native.js +21 -4
  20. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  21. package/build/mobile/keyboard-aware-flat-list/index.android.js +0 -4
  22. package/build/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  23. package/build/mobile/keyboard-aware-flat-list/index.ios.js +100 -55
  24. package/build/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  25. package/build/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js +82 -0
  26. package/build/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js.map +1 -0
  27. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js +85 -0
  28. package/build/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +1 -0
  29. package/build/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js +44 -0
  30. package/build/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js.map +1 -0
  31. package/build/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js +53 -0
  32. package/build/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js.map +1 -0
  33. package/build/mobile/segmented-control/index.native.js +4 -2
  34. package/build/mobile/segmented-control/index.native.js.map +1 -1
  35. package/build/navigator/navigator-provider/component.js +4 -2
  36. package/build/navigator/navigator-provider/component.js.map +1 -1
  37. package/build/navigator/navigator-screen/component.js +4 -3
  38. package/build/navigator/navigator-screen/component.js.map +1 -1
  39. package/build/popover/index.js +1 -8
  40. package/build/popover/index.js.map +1 -1
  41. package/build/private-apis.js +4 -1
  42. package/build/private-apis.js.map +1 -1
  43. package/build/query-controls/author-select.js +2 -1
  44. package/build/query-controls/author-select.js.map +1 -1
  45. package/build/query-controls/category-select.js +3 -1
  46. package/build/query-controls/category-select.js.map +1 -1
  47. package/build/query-controls/index.js +7 -1
  48. package/build/query-controls/index.js.map +1 -1
  49. package/build/sandbox/index.native.js +55 -29
  50. package/build/sandbox/index.native.js.map +1 -1
  51. package/build/slot-fill/index.js +20 -7
  52. package/build/slot-fill/index.js.map +1 -1
  53. package/build/spinner/styles.js +4 -4
  54. package/build/spinner/styles.js.map +1 -1
  55. package/build/tree-grid/index.js +3 -3
  56. package/build/tree-grid/index.js.map +1 -1
  57. package/build/view/component.js +1 -2
  58. package/build/view/component.js.map +1 -1
  59. package/build-module/checkbox-control/index.js +2 -2
  60. package/build-module/checkbox-control/index.js.map +1 -1
  61. package/build-module/color-palette/index.native.js +13 -1
  62. package/build-module/color-palette/index.native.js.map +1 -1
  63. package/build-module/custom-gradient-picker/index.native.js +3 -1
  64. package/build-module/custom-gradient-picker/index.native.js.map +1 -1
  65. package/build-module/custom-gradient-picker/serializer.js +0 -4
  66. package/build-module/custom-gradient-picker/serializer.js.map +1 -1
  67. package/build-module/draggable/index.js +6 -1
  68. package/build-module/draggable/index.js.map +1 -1
  69. package/build-module/drop-zone/index.js +8 -8
  70. package/build-module/drop-zone/index.js.map +1 -1
  71. package/build-module/index.js.map +1 -1
  72. package/build-module/mobile/bottom-sheet/cell.native.js +6 -5
  73. package/build-module/mobile/bottom-sheet/cell.native.js.map +1 -1
  74. package/build-module/mobile/color-settings/palette.screen.native.js +0 -8
  75. package/build-module/mobile/color-settings/palette.screen.native.js.map +1 -1
  76. package/build-module/mobile/global-styles-context/utils.native.js +21 -3
  77. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  78. package/build-module/mobile/keyboard-aware-flat-list/index.android.js +0 -4
  79. package/build-module/mobile/keyboard-aware-flat-list/index.android.js.map +1 -1
  80. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js +97 -54
  81. package/build-module/mobile/keyboard-aware-flat-list/index.ios.js.map +1 -1
  82. package/build-module/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js +73 -0
  83. package/build-module/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js.map +1 -0
  84. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js +76 -0
  85. package/build-module/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js.map +1 -0
  86. package/build-module/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js +33 -0
  87. package/build-module/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js.map +1 -0
  88. package/build-module/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js +40 -0
  89. package/build-module/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js.map +1 -0
  90. package/build-module/mobile/segmented-control/index.native.js +4 -2
  91. package/build-module/mobile/segmented-control/index.native.js.map +1 -1
  92. package/build-module/navigator/navigator-provider/component.js +4 -2
  93. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  94. package/build-module/navigator/navigator-screen/component.js +4 -3
  95. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  96. package/build-module/popover/index.js +1 -8
  97. package/build-module/popover/index.js.map +1 -1
  98. package/build-module/private-apis.js +3 -1
  99. package/build-module/private-apis.js.map +1 -1
  100. package/build-module/query-controls/author-select.js +2 -1
  101. package/build-module/query-controls/author-select.js.map +1 -1
  102. package/build-module/query-controls/category-select.js +3 -1
  103. package/build-module/query-controls/category-select.js.map +1 -1
  104. package/build-module/query-controls/index.js +7 -2
  105. package/build-module/query-controls/index.js.map +1 -1
  106. package/build-module/sandbox/index.native.js +56 -31
  107. package/build-module/sandbox/index.native.js.map +1 -1
  108. package/build-module/slot-fill/index.js +16 -6
  109. package/build-module/slot-fill/index.js.map +1 -1
  110. package/build-module/spinner/styles.js +4 -4
  111. package/build-module/spinner/styles.js.map +1 -1
  112. package/build-module/tree-grid/index.js +3 -3
  113. package/build-module/tree-grid/index.js.map +1 -1
  114. package/build-module/view/component.js +1 -2
  115. package/build-module/view/component.js.map +1 -1
  116. package/build-style/style-rtl.css +26 -16
  117. package/build-style/style.css +26 -16
  118. package/build-types/angle-picker-control/styles/angle-picker-control-styles.d.ts +1 -1
  119. package/build-types/border-box-control/border-box-control/hook.d.ts +2 -2
  120. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +2 -2
  121. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +2 -2
  122. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +2 -2
  123. package/build-types/border-control/border-control/hook.d.ts +2 -2
  124. package/build-types/border-control/border-control-dropdown/hook.d.ts +2 -2
  125. package/build-types/border-control/border-control-style-picker/hook.d.ts +2 -2
  126. package/build-types/box-control/styles/box-control-styles.d.ts +5 -5
  127. package/build-types/button/deprecated.d.ts +8 -8
  128. package/build-types/card/card/hook.d.ts +2 -2
  129. package/build-types/card/card-body/hook.d.ts +2 -2
  130. package/build-types/card/card-divider/hook.d.ts +2 -2
  131. package/build-types/card/card-footer/hook.d.ts +2 -2
  132. package/build-types/card/card-header/hook.d.ts +2 -2
  133. package/build-types/card/card-media/hook.d.ts +2 -2
  134. package/build-types/checkbox-control/index.d.ts.map +1 -1
  135. package/build-types/color-palette/styles.d.ts +1 -1
  136. package/build-types/color-picker/styles.d.ts +7 -7
  137. package/build-types/combobox-control/styles.d.ts +1 -1
  138. package/build-types/custom-gradient-picker/serializer.d.ts +1 -5
  139. package/build-types/custom-gradient-picker/serializer.d.ts.map +1 -1
  140. package/build-types/custom-gradient-picker/types.d.ts +0 -2
  141. package/build-types/custom-gradient-picker/types.d.ts.map +1 -1
  142. package/build-types/date-time/date/styles.d.ts +2 -2
  143. package/build-types/date-time/date-time/styles.d.ts +1 -1
  144. package/build-types/date-time/time/styles.d.ts +8 -8
  145. package/build-types/draggable/index.d.ts +1 -1
  146. package/build-types/draggable/index.d.ts.map +1 -1
  147. package/build-types/draggable/stories/index.d.ts +8 -0
  148. package/build-types/draggable/stories/index.d.ts.map +1 -1
  149. package/build-types/draggable/types.d.ts +7 -0
  150. package/build-types/draggable/types.d.ts.map +1 -1
  151. package/build-types/drop-zone/index.d.ts.map +1 -1
  152. package/build-types/elevation/hook.d.ts +2 -2
  153. package/build-types/external-link/styles/external-link-styles.d.ts +1 -1
  154. package/build-types/flex/flex/hook.d.ts +2 -2
  155. package/build-types/flex/flex-block/hook.d.ts +2 -2
  156. package/build-types/flex/flex-item/hook.d.ts +2 -2
  157. package/build-types/focal-point-picker/styles/focal-point-picker-style.d.ts +2 -2
  158. package/build-types/form-token-field/styles.d.ts +1 -1
  159. package/build-types/grid/hook.d.ts +2 -2
  160. package/build-types/h-stack/hook.d.ts +2 -2
  161. package/build-types/heading/hook.d.ts +2 -2
  162. package/build-types/index.d.ts +129 -0
  163. package/build-types/index.d.ts.map +1 -0
  164. package/build-types/input-control/styles/input-control-styles.d.ts +2 -2
  165. package/build-types/item-group/item/hook.d.ts +2 -2
  166. package/build-types/item-group/item-group/hook.d.ts +2 -2
  167. package/build-types/navigation/styles/navigation-styles.d.ts +2 -2
  168. package/build-types/navigator/navigator-back-button/component.d.ts +1 -1
  169. package/build-types/navigator/navigator-back-button/hook.d.ts +3 -3
  170. package/build-types/navigator/navigator-button/component.d.ts +1 -1
  171. package/build-types/navigator/navigator-button/hook.d.ts +3 -3
  172. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  173. package/build-types/navigator/navigator-screen/component.d.ts +1 -1
  174. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  175. package/build-types/navigator/navigator-to-parent-button/component.d.ts +1 -1
  176. package/build-types/navigator/stories/index.d.ts +1 -0
  177. package/build-types/navigator/stories/index.d.ts.map +1 -1
  178. package/build-types/navigator/types.d.ts +2 -2
  179. package/build-types/navigator/types.d.ts.map +1 -1
  180. package/build-types/number-control/index.d.ts +2 -2
  181. package/build-types/number-control/stories/index.d.ts +2 -2
  182. package/build-types/palette-edit/styles.d.ts +18 -12
  183. package/build-types/palette-edit/styles.d.ts.map +1 -1
  184. package/build-types/popover/index.d.ts +1 -1
  185. package/build-types/popover/index.d.ts.map +1 -1
  186. package/build-types/popover/stories/e2e/index.d.ts +1 -1
  187. package/build-types/private-apis.d.ts +2 -3
  188. package/build-types/private-apis.d.ts.map +1 -1
  189. package/build-types/query-controls/author-select.d.ts.map +1 -1
  190. package/build-types/query-controls/category-select.d.ts.map +1 -1
  191. package/build-types/query-controls/index.d.ts.map +1 -1
  192. package/build-types/range-control/index.d.ts +1 -1
  193. package/build-types/range-control/styles/range-control-styles.d.ts +2 -2
  194. package/build-types/resizable-box/index.d.ts +1 -1
  195. package/build-types/resizable-box/resize-tooltip/index.d.ts +1 -1
  196. package/build-types/resizable-box/stories/index.d.ts +2 -2
  197. package/build-types/scrollable/hook.d.ts +2 -2
  198. package/build-types/search-control/index.d.ts +1 -1
  199. package/build-types/search-control/stories/index.d.ts +2 -2
  200. package/build-types/slot-fill/index.d.ts +13 -1
  201. package/build-types/slot-fill/index.d.ts.map +1 -1
  202. package/build-types/spacer/hook.d.ts +2 -2
  203. package/build-types/spinner/index.d.ts +1 -1
  204. package/build-types/spinner/styles.d.ts.map +1 -1
  205. package/build-types/surface/hook.d.ts +2 -2
  206. package/build-types/text/hook.d.ts +2 -2
  207. package/build-types/text-control/index.d.ts +1 -1
  208. package/build-types/toolbar/toolbar-button/index.d.ts +8 -8
  209. package/build-types/tools-panel/tools-panel/hook.d.ts +2 -2
  210. package/build-types/tools-panel/tools-panel-header/hook.d.ts +2 -2
  211. package/build-types/tools-panel/tools-panel-item/hook.d.ts +2 -2
  212. package/build-types/tree-grid/index.d.ts.map +1 -1
  213. package/build-types/truncate/hook.d.ts +2 -2
  214. package/build-types/ui/context/wordpress-component.d.ts +1 -1
  215. package/build-types/ui/context/wordpress-component.d.ts.map +1 -1
  216. package/build-types/ui/control-group/hook.d.ts +2 -2
  217. package/build-types/ui/control-label/hook.d.ts +2 -2
  218. package/build-types/ui/form-group/form-group.d.ts +2 -2
  219. package/build-types/ui/form-group/use-form-group.d.ts +2 -2
  220. package/build-types/unit-control/index.d.ts +1 -1
  221. package/build-types/unit-control/styles/unit-control-styles.d.ts +2 -2
  222. package/build-types/v-stack/hook.d.ts +2 -2
  223. package/build-types/view/component.d.ts +1 -1
  224. package/build-types/view/component.d.ts.map +1 -1
  225. package/package.json +22 -22
  226. package/src/autocomplete/README.md +4 -2
  227. package/src/checkbox-control/index.tsx +6 -2
  228. package/src/color-palette/index.native.js +20 -1
  229. package/src/color-picker/test/index.tsx +99 -99
  230. package/src/custom-gradient-picker/index.native.js +1 -1
  231. package/src/custom-gradient-picker/serializer.ts +2 -6
  232. package/src/custom-gradient-picker/types.ts +0 -18
  233. package/src/dimension-control/README.md +1 -1
  234. package/src/draggable/README.md +8 -1
  235. package/src/draggable/index.tsx +6 -1
  236. package/src/draggable/stories/index.tsx +69 -33
  237. package/src/draggable/types.ts +7 -0
  238. package/src/drop-zone/index.tsx +12 -8
  239. package/src/drop-zone/style.scss +1 -1
  240. package/src/{index.js → index.ts} +1 -0
  241. package/src/mobile/bottom-sheet/cell.native.js +4 -5
  242. package/src/mobile/color-settings/palette.screen.native.js +0 -7
  243. package/src/mobile/global-styles-context/utils.native.js +18 -3
  244. package/src/mobile/keyboard-aware-flat-list/index.android.js +0 -4
  245. package/src/mobile/keyboard-aware-flat-list/index.ios.js +118 -67
  246. package/src/mobile/keyboard-aware-flat-list/test/use-keyboard-offset.native.js +203 -0
  247. package/src/mobile/keyboard-aware-flat-list/test/use-scroll-to-text-input.native.js +140 -0
  248. package/src/mobile/keyboard-aware-flat-list/test/use-text-input-caret-position.native.js +82 -0
  249. package/src/mobile/keyboard-aware-flat-list/test/use-text-input-offset.native.js +147 -0
  250. package/src/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js +87 -0
  251. package/src/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js +105 -0
  252. package/src/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js +36 -0
  253. package/src/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js +54 -0
  254. package/src/mobile/segmented-control/index.native.js +2 -2
  255. package/src/modal/style.scss +20 -12
  256. package/src/navigator/navigator-provider/component.tsx +2 -0
  257. package/src/navigator/navigator-screen/component.tsx +5 -2
  258. package/src/navigator/stories/index.tsx +68 -0
  259. package/src/navigator/test/index.tsx +52 -0
  260. package/src/navigator/types.ts +2 -1
  261. package/src/popover/index.tsx +2 -15
  262. package/src/{private-apis.js → private-apis.ts} +2 -0
  263. package/src/query-controls/author-select.tsx +1 -0
  264. package/src/query-controls/category-select.tsx +1 -0
  265. package/src/query-controls/index.tsx +4 -2
  266. package/src/sandbox/index.native.js +78 -37
  267. package/src/slot-fill/index.js +14 -6
  268. package/src/snackbar/style.scss +2 -1
  269. package/src/spinner/styles.ts +2 -0
  270. package/src/tree-grid/index.tsx +7 -2
  271. package/src/ui/context/wordpress-component.ts +1 -1
  272. package/src/view/component.tsx +2 -2
  273. package/tsconfig.json +3 -4
  274. package/tsconfig.tsbuildinfo +1 -1
@@ -9,14 +9,20 @@ exports.default = exports.KeyboardAwareFlatList = void 0;
9
9
 
10
10
  var _element = require("@wordpress/element");
11
11
 
12
- var _reactNativeKeyboardAwareScrollView = require("react-native-keyboard-aware-scroll-view");
13
-
14
12
  var _reactNative = require("react-native");
15
13
 
16
- var _es = _interopRequireDefault(require("fast-deep-equal/es6"));
17
-
18
14
  var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
19
15
 
16
+ var _compose = require("@wordpress/compose");
17
+
18
+ var _useTextInputOffset = _interopRequireDefault(require("./use-text-input-offset"));
19
+
20
+ var _useKeyboardOffset = _interopRequireDefault(require("./use-keyboard-offset"));
21
+
22
+ var _useScrollToTextInput = _interopRequireDefault(require("./use-scroll-to-text-input"));
23
+
24
+ var _useTextInputCaretPosition = _interopRequireDefault(require("./use-text-input-caret-position"));
25
+
20
26
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
27
 
22
28
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -28,82 +34,121 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
28
34
  /**
29
35
  * WordPress dependencies
30
36
  */
31
- const List = (0, _element.memo)(_reactNative.FlatList, _es.default);
32
37
 
33
- const AnimatedKeyboardAwareScrollView = _reactNativeReanimated.default.createAnimatedComponent(_reactNativeKeyboardAwareScrollView.KeyboardAwareScrollView);
38
+ /**
39
+ * Internal dependencies
40
+ */
41
+ const AnimatedScrollView = _reactNativeReanimated.default.createAnimatedComponent(_reactNative.ScrollView);
42
+ /**
43
+ * React component that provides a FlatList that is aware of the keyboard state and can scroll
44
+ * to the currently focused TextInput.
45
+ *
46
+ * @param {Object} props Component props.
47
+ * @param {number} props.extraScrollHeight Extra scroll height for the content.
48
+ * @param {Function} props.innerRef Function to pass the ScrollView ref to the parent component.
49
+ * @param {Function} props.onScroll Function to be called when the list is scrolled.
50
+ * @param {boolean} props.scrollEnabled Whether the list can be scrolled.
51
+ * @param {Object} props.scrollViewStyle Additional style for the ScrollView component.
52
+ * @param {boolean} props.shouldPreventAutomaticScroll Whether to prevent scrolling when there's a Keyboard offset set.
53
+ * @param {Object} props... Other props to pass to the FlatList component.
54
+ * @return {WPComponent} KeyboardAwareFlatList component.
55
+ */
56
+
34
57
 
35
58
  const KeyboardAwareFlatList = _ref => {
36
59
  let {
37
60
  extraScrollHeight,
38
- shouldPreventAutomaticScroll,
39
61
  innerRef,
40
- autoScroll,
41
- scrollViewStyle,
42
- inputAccessoryViewHeight,
43
62
  onScroll,
44
- ...listProps
63
+ scrollEnabled,
64
+ scrollViewStyle,
65
+ shouldPreventAutomaticScroll,
66
+ ...props
45
67
  } = _ref;
46
68
  const scrollViewRef = (0, _element.useRef)();
47
- const keyboardWillShowIndicator = (0, _element.useRef)();
48
- const latestContentOffsetY = (0, _reactNativeReanimated.useSharedValue)(-1);
69
+ const scrollViewMeasurements = (0, _element.useRef)();
70
+ const scrollViewYOffset = (0, _reactNativeReanimated.useSharedValue)(-1);
71
+ const {
72
+ height: windowHeight,
73
+ width: windowWidth
74
+ } = (0, _reactNative.useWindowDimensions)();
75
+ const isLandscape = windowWidth >= windowHeight;
76
+ const [keyboardOffset] = (0, _useKeyboardOffset.default)(scrollEnabled, shouldPreventAutomaticScroll);
77
+ const [currentCaretData] = (0, _useTextInputCaretPosition.default)(scrollEnabled);
78
+ const [getTextInputOffset] = (0, _useTextInputOffset.default)(scrollEnabled, scrollViewRef);
79
+ const [scrollToTextInputOffset] = (0, _useScrollToTextInput.default)(extraScrollHeight, keyboardOffset, scrollEnabled, scrollViewMeasurements, scrollViewRef, scrollViewYOffset);
80
+ const onScrollToTextInput = (0, _compose.useThrottle)((0, _element.useCallback)(async caret => {
81
+ const textInputOffset = await getTextInputOffset(caret);
82
+ const hasTextInputOffset = textInputOffset !== null;
83
+
84
+ if (hasTextInputOffset) {
85
+ scrollToTextInputOffset(caret, textInputOffset);
86
+ }
87
+ }, [getTextInputOffset, scrollToTextInputOffset]), 200, {
88
+ leading: false
89
+ });
90
+ (0, _element.useEffect)(() => {
91
+ onScrollToTextInput(currentCaretData);
92
+ }, [currentCaretData, onScrollToTextInput]); // When the orientation changes, the ScrollView measurements
93
+ // need to be re-calculated.
94
+
95
+ (0, _element.useEffect)(() => {
96
+ scrollViewMeasurements.current = null;
97
+ }, [isLandscape]);
49
98
  const scrollHandler = (0, _reactNativeReanimated.useAnimatedScrollHandler)({
50
99
  onScroll: event => {
51
100
  const {
52
101
  contentOffset
53
102
  } = event;
54
- latestContentOffsetY.value = contentOffset.y;
103
+ scrollViewYOffset.value = contentOffset.y;
55
104
  onScroll(event);
56
105
  }
57
106
  });
107
+ const measureScrollView = (0, _element.useCallback)(() => {
108
+ if (scrollViewRef.current) {
109
+ const scrollRef = scrollViewRef.current.getNativeScrollRef();
110
+ scrollRef.measureInWindow((_x, y, width, height) => {
111
+ scrollViewMeasurements.current = {
112
+ y,
113
+ width,
114
+ height
115
+ };
116
+ });
117
+ }
118
+ }, []);
119
+ const onContentSizeChange = (0, _element.useCallback)(() => {
120
+ onScrollToTextInput(currentCaretData); // Sets the first values when the content size changes.
121
+
122
+ if (!scrollViewMeasurements.current) {
123
+ measureScrollView();
124
+ }
125
+ }, [measureScrollView, onScrollToTextInput, currentCaretData]);
58
126
  const getRef = (0, _element.useCallback)(ref => {
59
127
  scrollViewRef.current = ref;
60
128
  innerRef(ref);
61
- }, [innerRef]);
62
- const onKeyboardWillHide = (0, _element.useCallback)(() => {
63
- keyboardWillShowIndicator.current = false;
64
- }, []);
65
- const onKeyboardDidHide = (0, _element.useCallback)(() => {
66
- setTimeout(() => {
67
- if (!keyboardWillShowIndicator.current && latestContentOffsetY.value !== -1 && !shouldPreventAutomaticScroll()) {
68
- var _scrollViewRef$curren;
69
-
70
- // Reset the content position if keyboard is still closed.
71
- (_scrollViewRef$curren = scrollViewRef.current) === null || _scrollViewRef$curren === void 0 ? void 0 : _scrollViewRef$curren.scrollToPosition(0, latestContentOffsetY.value, true);
72
- }
73
- }, 50);
74
- }, [latestContentOffsetY, shouldPreventAutomaticScroll]);
75
- const onKeyboardWillShow = (0, _element.useCallback)(() => {
76
- keyboardWillShowIndicator.current = true;
77
- }, []);
78
- return (0, _element.createElement)(AnimatedKeyboardAwareScrollView, {
79
- style: [{
80
- flex: 1
81
- }, scrollViewStyle],
82
- keyboardDismissMode: "none",
83
- enableResetScrollToCoords: false,
129
+ }, [innerRef]); // Adds content insets when the keyboard is opened to have
130
+ // extra padding at the bottom.
131
+
132
+ const contentInset = {
133
+ bottom: keyboardOffset
134
+ };
135
+ const style = [{
136
+ flex: 1
137
+ }, scrollViewStyle];
138
+ return (0, _element.createElement)(AnimatedScrollView, {
139
+ automaticallyAdjustContentInsets: false,
140
+ contentInset: contentInset,
84
141
  keyboardShouldPersistTaps: "handled",
85
- extraScrollHeight: extraScrollHeight,
86
- extraHeight: 0,
87
- inputAccessoryViewHeight: inputAccessoryViewHeight,
88
- enableAutomaticScroll: autoScroll === undefined ? false : autoScroll,
142
+ onContentSizeChange: onContentSizeChange,
143
+ onScroll: scrollHandler,
89
144
  ref: getRef,
90
- onKeyboardWillHide: onKeyboardWillHide,
91
- onKeyboardDidHide: onKeyboardDidHide,
92
- onKeyboardWillShow: onKeyboardWillShow,
93
- scrollEnabled: listProps.scrollEnabled,
94
- onScroll: scrollHandler
95
- }, (0, _element.createElement)(List, listProps));
145
+ scrollEnabled: scrollEnabled,
146
+ scrollEventThrottle: 16,
147
+ style: style
148
+ }, (0, _element.createElement)(_reactNative.FlatList, props));
96
149
  };
97
150
 
98
151
  exports.KeyboardAwareFlatList = KeyboardAwareFlatList;
99
-
100
- KeyboardAwareFlatList.handleCaretVerticalPositionChange = (scrollView, targetId, caretY, previousCaretY) => {
101
- if (previousCaretY) {
102
- // If this is not the first tap.
103
- scrollView.refreshScrollForField(targetId);
104
- }
105
- };
106
-
107
152
  var _default = KeyboardAwareFlatList;
108
153
  exports.default = _default;
109
154
  //# sourceMappingURL=index.ios.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/index.ios.js"],"names":["List","FlatList","fastDeepEqual","AnimatedKeyboardAwareScrollView","Animated","createAnimatedComponent","KeyboardAwareScrollView","KeyboardAwareFlatList","extraScrollHeight","shouldPreventAutomaticScroll","innerRef","autoScroll","scrollViewStyle","inputAccessoryViewHeight","onScroll","listProps","scrollViewRef","keyboardWillShowIndicator","latestContentOffsetY","scrollHandler","event","contentOffset","value","y","getRef","ref","current","onKeyboardWillHide","onKeyboardDidHide","setTimeout","scrollToPosition","onKeyboardWillShow","flex","undefined","scrollEnabled","handleCaretVerticalPositionChange","scrollView","targetId","caretY","previousCaretY","refreshScrollForField"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';\nimport { FlatList } from 'react-native';\nimport fastDeepEqual from 'fast-deep-equal/es6';\nimport Animated, {\n\tuseAnimatedScrollHandler,\n\tuseSharedValue,\n} from 'react-native-reanimated';\n\n/**\n * WordPress dependencies\n */\nimport { memo, useCallback, useRef } from '@wordpress/element';\n\nconst List = memo( FlatList, fastDeepEqual );\nconst AnimatedKeyboardAwareScrollView = Animated.createAnimatedComponent(\n\tKeyboardAwareScrollView\n);\n\nexport const KeyboardAwareFlatList = ( {\n\textraScrollHeight,\n\tshouldPreventAutomaticScroll,\n\tinnerRef,\n\tautoScroll,\n\tscrollViewStyle,\n\tinputAccessoryViewHeight,\n\tonScroll,\n\t...listProps\n} ) => {\n\tconst scrollViewRef = useRef();\n\tconst keyboardWillShowIndicator = useRef();\n\n\tconst latestContentOffsetY = useSharedValue( -1 );\n\n\tconst scrollHandler = useAnimatedScrollHandler( {\n\t\tonScroll: ( event ) => {\n\t\t\tconst { contentOffset } = event;\n\t\t\tlatestContentOffsetY.value = contentOffset.y;\n\t\t\tonScroll( event );\n\t\t},\n\t} );\n\n\tconst getRef = useCallback(\n\t\t( ref ) => {\n\t\t\tscrollViewRef.current = ref;\n\t\t\tinnerRef( ref );\n\t\t},\n\t\t[ innerRef ]\n\t);\n\tconst onKeyboardWillHide = useCallback( () => {\n\t\tkeyboardWillShowIndicator.current = false;\n\t}, [] );\n\tconst onKeyboardDidHide = useCallback( () => {\n\t\tsetTimeout( () => {\n\t\t\tif (\n\t\t\t\t! keyboardWillShowIndicator.current &&\n\t\t\t\tlatestContentOffsetY.value !== -1 &&\n\t\t\t\t! shouldPreventAutomaticScroll()\n\t\t\t) {\n\t\t\t\t// Reset the content position if keyboard is still closed.\n\t\t\t\tscrollViewRef.current?.scrollToPosition(\n\t\t\t\t\t0,\n\t\t\t\t\tlatestContentOffsetY.value,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t}\n\t\t}, 50 );\n\t}, [ latestContentOffsetY, shouldPreventAutomaticScroll ] );\n\tconst onKeyboardWillShow = useCallback( () => {\n\t\tkeyboardWillShowIndicator.current = true;\n\t}, [] );\n\n\treturn (\n\t\t<AnimatedKeyboardAwareScrollView\n\t\t\tstyle={ [ { flex: 1 }, scrollViewStyle ] }\n\t\t\tkeyboardDismissMode=\"none\"\n\t\t\tenableResetScrollToCoords={ false }\n\t\t\tkeyboardShouldPersistTaps=\"handled\"\n\t\t\textraScrollHeight={ extraScrollHeight }\n\t\t\textraHeight={ 0 }\n\t\t\tinputAccessoryViewHeight={ inputAccessoryViewHeight }\n\t\t\tenableAutomaticScroll={\n\t\t\t\tautoScroll === undefined ? false : autoScroll\n\t\t\t}\n\t\t\tref={ getRef }\n\t\t\tonKeyboardWillHide={ onKeyboardWillHide }\n\t\t\tonKeyboardDidHide={ onKeyboardDidHide }\n\t\t\tonKeyboardWillShow={ onKeyboardWillShow }\n\t\t\tscrollEnabled={ listProps.scrollEnabled }\n\t\t\tonScroll={ scrollHandler }\n\t\t>\n\t\t\t<List { ...listProps } />\n\t\t</AnimatedKeyboardAwareScrollView>\n\t);\n};\n\nKeyboardAwareFlatList.handleCaretVerticalPositionChange = (\n\tscrollView,\n\ttargetId,\n\tcaretY,\n\tpreviousCaretY\n) => {\n\tif ( previousCaretY ) {\n\t\t// If this is not the first tap.\n\t\tscrollView.refreshScrollForField( targetId );\n\t}\n};\n\nexport default KeyboardAwareFlatList;\n"]}
1
+ {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/index.ios.js"],"names":["AnimatedScrollView","Animated","createAnimatedComponent","ScrollView","KeyboardAwareFlatList","extraScrollHeight","innerRef","onScroll","scrollEnabled","scrollViewStyle","shouldPreventAutomaticScroll","props","scrollViewRef","scrollViewMeasurements","scrollViewYOffset","height","windowHeight","width","windowWidth","isLandscape","keyboardOffset","currentCaretData","getTextInputOffset","scrollToTextInputOffset","onScrollToTextInput","caret","textInputOffset","hasTextInputOffset","leading","current","scrollHandler","event","contentOffset","value","y","measureScrollView","scrollRef","getNativeScrollRef","measureInWindow","_x","onContentSizeChange","getRef","ref","contentInset","bottom","style","flex"],"mappings":";;;;;;;;;AAaA;;AATA;;AACA;;AASA;;AAKA;;AACA;;AACA;;AACA;;;;;;AAtBA;AACA;AACA;;AAQA;AACA;AACA;;AAIA;AACA;AACA;AAMA,MAAMA,kBAAkB,GAAGC,+BAASC,uBAAT,CAAkCC,uBAAlC,CAA3B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,MAAMC,qBAAqB,GAAG,QAQ9B;AAAA,MARgC;AACtCC,IAAAA,iBADsC;AAEtCC,IAAAA,QAFsC;AAGtCC,IAAAA,QAHsC;AAItCC,IAAAA,aAJsC;AAKtCC,IAAAA,eALsC;AAMtCC,IAAAA,4BANsC;AAOtC,OAAGC;AAPmC,GAQhC;AACN,QAAMC,aAAa,GAAG,sBAAtB;AACA,QAAMC,sBAAsB,GAAG,sBAA/B;AACA,QAAMC,iBAAiB,GAAG,2CAAgB,CAAC,CAAjB,CAA1B;AAEA,QAAM;AAAEC,IAAAA,MAAM,EAAEC,YAAV;AAAwBC,IAAAA,KAAK,EAAEC;AAA/B,MAA+C,uCAArD;AACA,QAAMC,WAAW,GAAGD,WAAW,IAAIF,YAAnC;AAEA,QAAM,CAAEI,cAAF,IAAqB,gCAC1BZ,aAD0B,EAE1BE,4BAF0B,CAA3B;AAKA,QAAM,CAAEW,gBAAF,IAAuB,wCAA2Bb,aAA3B,CAA7B;AAEA,QAAM,CAAEc,kBAAF,IAAyB,iCAC9Bd,aAD8B,EAE9BI,aAF8B,CAA/B;AAKA,QAAM,CAAEW,uBAAF,IAA8B,mCACnClB,iBADmC,EAEnCe,cAFmC,EAGnCZ,aAHmC,EAInCK,sBAJmC,EAKnCD,aALmC,EAMnCE,iBANmC,CAApC;AASA,QAAMU,mBAAmB,GAAG,0BAC3B,0BACC,MAAQC,KAAR,IAAmB;AAClB,UAAMC,eAAe,GAAG,MAAMJ,kBAAkB,CAAEG,KAAF,CAAhD;AACA,UAAME,kBAAkB,GAAGD,eAAe,KAAK,IAA/C;;AAEA,QAAKC,kBAAL,EAA0B;AACzBJ,MAAAA,uBAAuB,CAAEE,KAAF,EAASC,eAAT,CAAvB;AACA;AACD,GARF,EASC,CAAEJ,kBAAF,EAAsBC,uBAAtB,CATD,CAD2B,EAY3B,GAZ2B,EAa3B;AAAEK,IAAAA,OAAO,EAAE;AAAX,GAb2B,CAA5B;AAgBA,0BAAW,MAAM;AAChBJ,IAAAA,mBAAmB,CAAEH,gBAAF,CAAnB;AACA,GAFD,EAEG,CAAEA,gBAAF,EAAoBG,mBAApB,CAFH,EA7CM,CAiDN;AACA;;AACA,0BAAW,MAAM;AAChBX,IAAAA,sBAAsB,CAACgB,OAAvB,GAAiC,IAAjC;AACA,GAFD,EAEG,CAAEV,WAAF,CAFH;AAIA,QAAMW,aAAa,GAAG,qDAA0B;AAC/CvB,IAAAA,QAAQ,EAAIwB,KAAF,IAAa;AACtB,YAAM;AAAEC,QAAAA;AAAF,UAAoBD,KAA1B;AACAjB,MAAAA,iBAAiB,CAACmB,KAAlB,GAA0BD,aAAa,CAACE,CAAxC;AACA3B,MAAAA,QAAQ,CAAEwB,KAAF,CAAR;AACA;AAL8C,GAA1B,CAAtB;AAQA,QAAMI,iBAAiB,GAAG,0BAAa,MAAM;AAC5C,QAAKvB,aAAa,CAACiB,OAAnB,EAA6B;AAC5B,YAAMO,SAAS,GAAGxB,aAAa,CAACiB,OAAd,CAAsBQ,kBAAtB,EAAlB;AAEAD,MAAAA,SAAS,CAACE,eAAV,CAA2B,CAAEC,EAAF,EAAML,CAAN,EAASjB,KAAT,EAAgBF,MAAhB,KAA4B;AACtDF,QAAAA,sBAAsB,CAACgB,OAAvB,GAAiC;AAAEK,UAAAA,CAAF;AAAKjB,UAAAA,KAAL;AAAYF,UAAAA;AAAZ,SAAjC;AACA,OAFD;AAGA;AACD,GARyB,EAQvB,EARuB,CAA1B;AAUA,QAAMyB,mBAAmB,GAAG,0BAAa,MAAM;AAC9ChB,IAAAA,mBAAmB,CAAEH,gBAAF,CAAnB,CAD8C,CAG9C;;AACA,QAAK,CAAER,sBAAsB,CAACgB,OAA9B,EAAwC;AACvCM,MAAAA,iBAAiB;AACjB;AACD,GAP2B,EAOzB,CAAEA,iBAAF,EAAqBX,mBAArB,EAA0CH,gBAA1C,CAPyB,CAA5B;AASA,QAAMoB,MAAM,GAAG,0BACZC,GAAF,IAAW;AACV9B,IAAAA,aAAa,CAACiB,OAAd,GAAwBa,GAAxB;AACApC,IAAAA,QAAQ,CAAEoC,GAAF,CAAR;AACA,GAJa,EAKd,CAAEpC,QAAF,CALc,CAAf,CAlFM,CA0FN;AACA;;AACA,QAAMqC,YAAY,GAAG;AAAEC,IAAAA,MAAM,EAAExB;AAAV,GAArB;AAEA,QAAMyB,KAAK,GAAG,CAAE;AAAEC,IAAAA,IAAI,EAAE;AAAR,GAAF,EAAerC,eAAf,CAAd;AAEA,SACC,4BAAC,kBAAD;AACC,IAAA,gCAAgC,EAAG,KADpC;AAEC,IAAA,YAAY,EAAGkC,YAFhB;AAGC,IAAA,yBAAyB,EAAC,SAH3B;AAIC,IAAA,mBAAmB,EAAGH,mBAJvB;AAKC,IAAA,QAAQ,EAAGV,aALZ;AAMC,IAAA,GAAG,EAAGW,MANP;AAOC,IAAA,aAAa,EAAGjC,aAPjB;AAQC,IAAA,mBAAmB,EAAG,EARvB;AASC,IAAA,KAAK,EAAGqC;AATT,KAWC,4BAAC,qBAAD,EAAelC,KAAf,CAXD,CADD;AAeA,CAvHM;;;eAyHQP,qB","sourcesContent":["/**\n * External dependencies\n */\n\nimport { ScrollView, FlatList, useWindowDimensions } from 'react-native';\nimport Animated, {\n\tuseAnimatedScrollHandler,\n\tuseSharedValue,\n} from 'react-native-reanimated';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef } from '@wordpress/element';\nimport { useThrottle } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport useTextInputOffset from './use-text-input-offset';\nimport useKeyboardOffset from './use-keyboard-offset';\nimport useScrollToTextInput from './use-scroll-to-text-input';\nimport useTextInputCaretPosition from './use-text-input-caret-position';\n\nconst AnimatedScrollView = Animated.createAnimatedComponent( ScrollView );\n\n/**\n * React component that provides a FlatList that is aware of the keyboard state and can scroll\n * to the currently focused TextInput.\n *\n * @param {Object} props Component props.\n * @param {number} props.extraScrollHeight Extra scroll height for the content.\n * @param {Function} props.innerRef Function to pass the ScrollView ref to the parent component.\n * @param {Function} props.onScroll Function to be called when the list is scrolled.\n * @param {boolean} props.scrollEnabled Whether the list can be scrolled.\n * @param {Object} props.scrollViewStyle Additional style for the ScrollView component.\n * @param {boolean} props.shouldPreventAutomaticScroll Whether to prevent scrolling when there's a Keyboard offset set.\n * @param {Object} props... Other props to pass to the FlatList component.\n * @return {WPComponent} KeyboardAwareFlatList component.\n */\nexport const KeyboardAwareFlatList = ( {\n\textraScrollHeight,\n\tinnerRef,\n\tonScroll,\n\tscrollEnabled,\n\tscrollViewStyle,\n\tshouldPreventAutomaticScroll,\n\t...props\n} ) => {\n\tconst scrollViewRef = useRef();\n\tconst scrollViewMeasurements = useRef();\n\tconst scrollViewYOffset = useSharedValue( -1 );\n\n\tconst { height: windowHeight, width: windowWidth } = useWindowDimensions();\n\tconst isLandscape = windowWidth >= windowHeight;\n\n\tconst [ keyboardOffset ] = useKeyboardOffset(\n\t\tscrollEnabled,\n\t\tshouldPreventAutomaticScroll\n\t);\n\n\tconst [ currentCaretData ] = useTextInputCaretPosition( scrollEnabled );\n\n\tconst [ getTextInputOffset ] = useTextInputOffset(\n\t\tscrollEnabled,\n\t\tscrollViewRef\n\t);\n\n\tconst [ scrollToTextInputOffset ] = useScrollToTextInput(\n\t\textraScrollHeight,\n\t\tkeyboardOffset,\n\t\tscrollEnabled,\n\t\tscrollViewMeasurements,\n\t\tscrollViewRef,\n\t\tscrollViewYOffset\n\t);\n\n\tconst onScrollToTextInput = useThrottle(\n\t\tuseCallback(\n\t\t\tasync ( caret ) => {\n\t\t\t\tconst textInputOffset = await getTextInputOffset( caret );\n\t\t\t\tconst hasTextInputOffset = textInputOffset !== null;\n\n\t\t\t\tif ( hasTextInputOffset ) {\n\t\t\t\t\tscrollToTextInputOffset( caret, textInputOffset );\n\t\t\t\t}\n\t\t\t},\n\t\t\t[ getTextInputOffset, scrollToTextInputOffset ]\n\t\t),\n\t\t200,\n\t\t{ leading: false }\n\t);\n\n\tuseEffect( () => {\n\t\tonScrollToTextInput( currentCaretData );\n\t}, [ currentCaretData, onScrollToTextInput ] );\n\n\t// When the orientation changes, the ScrollView measurements\n\t// need to be re-calculated.\n\tuseEffect( () => {\n\t\tscrollViewMeasurements.current = null;\n\t}, [ isLandscape ] );\n\n\tconst scrollHandler = useAnimatedScrollHandler( {\n\t\tonScroll: ( event ) => {\n\t\t\tconst { contentOffset } = event;\n\t\t\tscrollViewYOffset.value = contentOffset.y;\n\t\t\tonScroll( event );\n\t\t},\n\t} );\n\n\tconst measureScrollView = useCallback( () => {\n\t\tif ( scrollViewRef.current ) {\n\t\t\tconst scrollRef = scrollViewRef.current.getNativeScrollRef();\n\n\t\t\tscrollRef.measureInWindow( ( _x, y, width, height ) => {\n\t\t\t\tscrollViewMeasurements.current = { y, width, height };\n\t\t\t} );\n\t\t}\n\t}, [] );\n\n\tconst onContentSizeChange = useCallback( () => {\n\t\tonScrollToTextInput( currentCaretData );\n\n\t\t// Sets the first values when the content size changes.\n\t\tif ( ! scrollViewMeasurements.current ) {\n\t\t\tmeasureScrollView();\n\t\t}\n\t}, [ measureScrollView, onScrollToTextInput, currentCaretData ] );\n\n\tconst getRef = useCallback(\n\t\t( ref ) => {\n\t\t\tscrollViewRef.current = ref;\n\t\t\tinnerRef( ref );\n\t\t},\n\t\t[ innerRef ]\n\t);\n\n\t// Adds content insets when the keyboard is opened to have\n\t// extra padding at the bottom.\n\tconst contentInset = { bottom: keyboardOffset };\n\n\tconst style = [ { flex: 1 }, scrollViewStyle ];\n\n\treturn (\n\t\t<AnimatedScrollView\n\t\t\tautomaticallyAdjustContentInsets={ false }\n\t\t\tcontentInset={ contentInset }\n\t\t\tkeyboardShouldPersistTaps=\"handled\"\n\t\t\tonContentSizeChange={ onContentSizeChange }\n\t\t\tonScroll={ scrollHandler }\n\t\t\tref={ getRef }\n\t\t\tscrollEnabled={ scrollEnabled }\n\t\t\tscrollEventThrottle={ 16 }\n\t\t\tstyle={ style }\n\t\t>\n\t\t\t<FlatList { ...props } />\n\t\t</AnimatedScrollView>\n\t);\n};\n\nexport default KeyboardAwareFlatList;\n"]}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = useKeyboardOffset;
7
+
8
+ var _reactNative = require("react-native");
9
+
10
+ var _element = require("@wordpress/element");
11
+
12
+ /**
13
+ * External dependencies
14
+ */
15
+
16
+ /**
17
+ * WordPress dependencies
18
+ */
19
+
20
+ /**
21
+ * Hook that adds Keyboard listeners to get the offset space
22
+ * when the keyboard is opened, taking into account focused AztecViews.
23
+ *
24
+ * @param {boolean} scrollEnabled Whether the scroll is enabled or not.
25
+ * @param {Function} shouldPreventAutomaticScroll Whether to prevent scrolling when there's a Keyboard offset set.
26
+ * @return {[number]} Keyboard offset.
27
+ */
28
+ function useKeyboardOffset(scrollEnabled, shouldPreventAutomaticScroll) {
29
+ const [keyboardOffset, setKeyboardOffset] = (0, _element.useState)(0);
30
+ const timeoutRef = (0, _element.useRef)();
31
+ const onKeyboardDidHide = (0, _element.useCallback)(() => {
32
+ if (shouldPreventAutomaticScroll()) {
33
+ clearTimeout(timeoutRef.current);
34
+ return;
35
+ } // A timeout is being used to delay resetting the offset in cases
36
+ // where the focus is changed to a different TextInput.
37
+
38
+
39
+ clearTimeout(timeoutRef.current);
40
+ timeoutRef.current = setTimeout(() => {
41
+ setKeyboardOffset(0);
42
+ }, 200);
43
+ }, [shouldPreventAutomaticScroll]);
44
+ const onKeyboardDidShow = (0, _element.useCallback)(_ref => {
45
+ let {
46
+ endCoordinates
47
+ } = _ref;
48
+ clearTimeout(timeoutRef.current);
49
+ setKeyboardOffset(endCoordinates.height);
50
+ }, []);
51
+ const onKeyboardWillShow = (0, _element.useCallback)(() => {
52
+ clearTimeout(timeoutRef.current);
53
+ }, []);
54
+ (0, _element.useEffect)(() => {
55
+ let willShowSubscription;
56
+ let showSubscription;
57
+ let hideSubscription;
58
+
59
+ if (scrollEnabled) {
60
+ willShowSubscription = _reactNative.Keyboard.addListener('keyboardWillShow', onKeyboardWillShow);
61
+ showSubscription = _reactNative.Keyboard.addListener('keyboardDidShow', onKeyboardDidShow);
62
+ hideSubscription = _reactNative.Keyboard.addListener('keyboardDidHide', onKeyboardDidHide);
63
+ } else {
64
+ var _willShowSubscription, _showSubscription, _hideSubscription;
65
+
66
+ (_willShowSubscription = willShowSubscription) === null || _willShowSubscription === void 0 ? void 0 : _willShowSubscription.remove();
67
+ (_showSubscription = showSubscription) === null || _showSubscription === void 0 ? void 0 : _showSubscription.remove();
68
+ (_hideSubscription = hideSubscription) === null || _hideSubscription === void 0 ? void 0 : _hideSubscription.remove();
69
+ }
70
+
71
+ return () => {
72
+ var _willShowSubscription2, _showSubscription2, _hideSubscription2;
73
+
74
+ clearTimeout(timeoutRef.current);
75
+ (_willShowSubscription2 = willShowSubscription) === null || _willShowSubscription2 === void 0 ? void 0 : _willShowSubscription2.remove();
76
+ (_showSubscription2 = showSubscription) === null || _showSubscription2 === void 0 ? void 0 : _showSubscription2.remove();
77
+ (_hideSubscription2 = hideSubscription) === null || _hideSubscription2 === void 0 ? void 0 : _hideSubscription2.remove();
78
+ };
79
+ }, [onKeyboardDidHide, onKeyboardDidShow, onKeyboardWillShow, scrollEnabled]);
80
+ return [keyboardOffset];
81
+ }
82
+ //# sourceMappingURL=use-keyboard-offset.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/use-keyboard-offset.native.js"],"names":["useKeyboardOffset","scrollEnabled","shouldPreventAutomaticScroll","keyboardOffset","setKeyboardOffset","timeoutRef","onKeyboardDidHide","clearTimeout","current","setTimeout","onKeyboardDidShow","endCoordinates","height","onKeyboardWillShow","willShowSubscription","showSubscription","hideSubscription","Keyboard","addListener","remove"],"mappings":";;;;;;;AAIA;;AAKA;;AATA;AACA;AACA;;AAIA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,iBAAT,CACdC,aADc,EAEdC,4BAFc,EAGb;AACD,QAAM,CAAEC,cAAF,EAAkBC,iBAAlB,IAAwC,uBAAU,CAAV,CAA9C;AACA,QAAMC,UAAU,GAAG,sBAAnB;AAEA,QAAMC,iBAAiB,GAAG,0BAAa,MAAM;AAC5C,QAAKJ,4BAA4B,EAAjC,EAAsC;AACrCK,MAAAA,YAAY,CAAEF,UAAU,CAACG,OAAb,CAAZ;AACA;AACA,KAJ2C,CAM5C;AACA;;;AACAD,IAAAA,YAAY,CAAEF,UAAU,CAACG,OAAb,CAAZ;AACAH,IAAAA,UAAU,CAACG,OAAX,GAAqBC,UAAU,CAAE,MAAM;AACtCL,MAAAA,iBAAiB,CAAE,CAAF,CAAjB;AACA,KAF8B,EAE5B,GAF4B,CAA/B;AAGA,GAZyB,EAYvB,CAAEF,4BAAF,CAZuB,CAA1B;AAcA,QAAMQ,iBAAiB,GAAG,0BAAa,QAA0B;AAAA,QAAxB;AAAEC,MAAAA;AAAF,KAAwB;AAChEJ,IAAAA,YAAY,CAAEF,UAAU,CAACG,OAAb,CAAZ;AACAJ,IAAAA,iBAAiB,CAAEO,cAAc,CAACC,MAAjB,CAAjB;AACA,GAHyB,EAGvB,EAHuB,CAA1B;AAKA,QAAMC,kBAAkB,GAAG,0BAAa,MAAM;AAC7CN,IAAAA,YAAY,CAAEF,UAAU,CAACG,OAAb,CAAZ;AACA,GAF0B,EAExB,EAFwB,CAA3B;AAIA,0BAAW,MAAM;AAChB,QAAIM,oBAAJ;AACA,QAAIC,gBAAJ;AACA,QAAIC,gBAAJ;;AAEA,QAAKf,aAAL,EAAqB;AACpBa,MAAAA,oBAAoB,GAAGG,sBAASC,WAAT,CACtB,kBADsB,EAEtBL,kBAFsB,CAAvB;AAIAE,MAAAA,gBAAgB,GAAGE,sBAASC,WAAT,CAClB,iBADkB,EAElBR,iBAFkB,CAAnB;AAIAM,MAAAA,gBAAgB,GAAGC,sBAASC,WAAT,CAClB,iBADkB,EAElBZ,iBAFkB,CAAnB;AAIA,KAbD,MAaO;AAAA;;AACN,+BAAAQ,oBAAoB,UAApB,sEAAsBK,MAAtB;AACA,2BAAAJ,gBAAgB,UAAhB,8DAAkBI,MAAlB;AACA,2BAAAH,gBAAgB,UAAhB,8DAAkBG,MAAlB;AACA;;AAED,WAAO,MAAM;AAAA;;AACZZ,MAAAA,YAAY,CAAEF,UAAU,CAACG,OAAb,CAAZ;AACA,gCAAAM,oBAAoB,UAApB,wEAAsBK,MAAtB;AACA,4BAAAJ,gBAAgB,UAAhB,gEAAkBI,MAAlB;AACA,4BAAAH,gBAAgB,UAAhB,gEAAkBG,MAAlB;AACA,KALD;AAMA,GA9BD,EA8BG,CACFb,iBADE,EAEFI,iBAFE,EAGFG,kBAHE,EAIFZ,aAJE,CA9BH;AAoCA,SAAO,CAAEE,cAAF,CAAP;AACA","sourcesContent":["/**\n * External dependencies\n */\n\nimport { Keyboard } from 'react-native';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useCallback, useState, useRef } from '@wordpress/element';\n\n/**\n * Hook that adds Keyboard listeners to get the offset space\n * when the keyboard is opened, taking into account focused AztecViews.\n *\n * @param {boolean} scrollEnabled Whether the scroll is enabled or not.\n * @param {Function} shouldPreventAutomaticScroll Whether to prevent scrolling when there's a Keyboard offset set.\n * @return {[number]} Keyboard offset.\n */\nexport default function useKeyboardOffset(\n\tscrollEnabled,\n\tshouldPreventAutomaticScroll\n) {\n\tconst [ keyboardOffset, setKeyboardOffset ] = useState( 0 );\n\tconst timeoutRef = useRef();\n\n\tconst onKeyboardDidHide = useCallback( () => {\n\t\tif ( shouldPreventAutomaticScroll() ) {\n\t\t\tclearTimeout( timeoutRef.current );\n\t\t\treturn;\n\t\t}\n\n\t\t// A timeout is being used to delay resetting the offset in cases\n\t\t// where the focus is changed to a different TextInput.\n\t\tclearTimeout( timeoutRef.current );\n\t\ttimeoutRef.current = setTimeout( () => {\n\t\t\tsetKeyboardOffset( 0 );\n\t\t}, 200 );\n\t}, [ shouldPreventAutomaticScroll ] );\n\n\tconst onKeyboardDidShow = useCallback( ( { endCoordinates } ) => {\n\t\tclearTimeout( timeoutRef.current );\n\t\tsetKeyboardOffset( endCoordinates.height );\n\t}, [] );\n\n\tconst onKeyboardWillShow = useCallback( () => {\n\t\tclearTimeout( timeoutRef.current );\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tlet willShowSubscription;\n\t\tlet showSubscription;\n\t\tlet hideSubscription;\n\n\t\tif ( scrollEnabled ) {\n\t\t\twillShowSubscription = Keyboard.addListener(\n\t\t\t\t'keyboardWillShow',\n\t\t\t\tonKeyboardWillShow\n\t\t\t);\n\t\t\tshowSubscription = Keyboard.addListener(\n\t\t\t\t'keyboardDidShow',\n\t\t\t\tonKeyboardDidShow\n\t\t\t);\n\t\t\thideSubscription = Keyboard.addListener(\n\t\t\t\t'keyboardDidHide',\n\t\t\t\tonKeyboardDidHide\n\t\t\t);\n\t\t} else {\n\t\t\twillShowSubscription?.remove();\n\t\t\tshowSubscription?.remove();\n\t\t\thideSubscription?.remove();\n\t\t}\n\n\t\treturn () => {\n\t\t\tclearTimeout( timeoutRef.current );\n\t\t\twillShowSubscription?.remove();\n\t\t\tshowSubscription?.remove();\n\t\t\thideSubscription?.remove();\n\t\t};\n\t}, [\n\t\tonKeyboardDidHide,\n\t\tonKeyboardDidShow,\n\t\tonKeyboardWillShow,\n\t\tscrollEnabled,\n\t] );\n\treturn [ keyboardOffset ];\n}\n"]}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = useScrollToTextInput;
7
+
8
+ var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
9
+
10
+ var _element = require("@wordpress/element");
11
+
12
+ /**
13
+ * External dependencies
14
+ */
15
+
16
+ /**
17
+ * WordPress dependencies
18
+ */
19
+ const DEFAULT_FONT_SIZE = 16;
20
+ /** @typedef {import('@wordpress/element').RefObject} RefObject */
21
+
22
+ /** @typedef {import('react-native-reanimated').SharedValue} SharedValue */
23
+
24
+ /**
25
+ * Hook to scroll to the currently focused TextInput
26
+ * depending on where the caret is placed taking into
27
+ * account the Keyboard and the Header.
28
+ *
29
+ * @param {number} extraScrollHeight Extra space to not overlap the content.
30
+ * @param {number} keyboardOffset Keyboard space offset.
31
+ * @param {boolean} scrollEnabled Whether the scroll is enabled or not.
32
+ * @param {RefObject} scrollViewMeasurements ScrollView Layout measurements.
33
+ * @param {RefObject} scrollViewRef ScrollView reference.
34
+ * @param {SharedValue} scrollViewYOffset Current offset position of the ScrollView.
35
+ * @return {Function[]} Function to scroll to the current TextInput's offset.
36
+ */
37
+
38
+ function useScrollToTextInput(extraScrollHeight, keyboardOffset, scrollEnabled, scrollViewMeasurements, scrollViewRef, scrollViewYOffset) {
39
+ const {
40
+ top,
41
+ bottom
42
+ } = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
43
+ const insets = top + bottom;
44
+ /**
45
+ * Function to scroll to the current TextInput's offset.
46
+ *
47
+ * @param {Object} caret The caret position data of the currently focused TextInput.
48
+ * @param {number} caret.caretHeight The height of the caret.
49
+ * @param {number} textInputOffset The offset calculated with the caret's Y coordinate + the
50
+ * TextInput's Y coord or height value.
51
+ */
52
+
53
+ const scrollToTextInputOffset = (0, _element.useCallback)((caret, textInputOffset) => {
54
+ const {
55
+ caretHeight = DEFAULT_FONT_SIZE
56
+ } = caret !== null && caret !== void 0 ? caret : {};
57
+
58
+ if (!scrollViewRef.current || !scrollEnabled || !scrollViewMeasurements.current) {
59
+ return;
60
+ }
61
+
62
+ const currentScrollViewYOffset = Math.max(0, scrollViewYOffset.value); // Scroll up.
63
+
64
+ if (textInputOffset < currentScrollViewYOffset) {
65
+ scrollViewRef.current.scrollTo({
66
+ y: textInputOffset,
67
+ animated: true
68
+ });
69
+ return;
70
+ }
71
+
72
+ const availableScreenSpace = Math.abs(Math.floor(scrollViewMeasurements.current.height - (keyboardOffset + extraScrollHeight + caretHeight)));
73
+ const maxOffset = Math.floor(currentScrollViewYOffset + availableScreenSpace);
74
+ const isAtTheTop = textInputOffset < scrollViewMeasurements.current.y + insets; // Scroll down.
75
+
76
+ if (textInputOffset > maxOffset && !isAtTheTop) {
77
+ scrollViewRef.current.scrollTo({
78
+ y: textInputOffset - availableScreenSpace,
79
+ animated: true
80
+ });
81
+ }
82
+ }, [extraScrollHeight, insets, keyboardOffset, scrollEnabled, scrollViewMeasurements, scrollViewRef, scrollViewYOffset]);
83
+ return [scrollToTextInputOffset];
84
+ }
85
+ //# sourceMappingURL=use-scroll-to-text-input.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/use-scroll-to-text-input.native.js"],"names":["DEFAULT_FONT_SIZE","useScrollToTextInput","extraScrollHeight","keyboardOffset","scrollEnabled","scrollViewMeasurements","scrollViewRef","scrollViewYOffset","top","bottom","insets","scrollToTextInputOffset","caret","textInputOffset","caretHeight","current","currentScrollViewYOffset","Math","max","value","scrollTo","y","animated","availableScreenSpace","abs","floor","height","maxOffset","isAtTheTop"],"mappings":";;;;;;;AAGA;;AAKA;;AARA;AACA;AACA;;AAGA;AACA;AACA;AAGA,MAAMA,iBAAiB,GAAG,EAA1B;AAEA;;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACe,SAASC,oBAAT,CACdC,iBADc,EAEdC,cAFc,EAGdC,aAHc,EAIdC,sBAJc,EAKdC,aALc,EAMdC,iBANc,EAOb;AACD,QAAM;AAAEC,IAAAA,GAAF;AAAOC,IAAAA;AAAP,MAAkB,oDAAxB;AACA,QAAMC,MAAM,GAAGF,GAAG,GAAGC,MAArB;AAEA;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AACC,QAAME,uBAAuB,GAAG,0BAC/B,CAAEC,KAAF,EAASC,eAAT,KAA8B;AAC7B,UAAM;AAAEC,MAAAA,WAAW,GAAGd;AAAhB,QAAsCY,KAAtC,aAAsCA,KAAtC,cAAsCA,KAAtC,GAA+C,EAArD;;AAEA,QACC,CAAEN,aAAa,CAACS,OAAhB,IACA,CAAEX,aADF,IAEA,CAAEC,sBAAsB,CAACU,OAH1B,EAIE;AACD;AACA;;AACD,UAAMC,wBAAwB,GAAGC,IAAI,CAACC,GAAL,CAChC,CADgC,EAEhCX,iBAAiB,CAACY,KAFc,CAAjC,CAV6B,CAe7B;;AACA,QAAKN,eAAe,GAAGG,wBAAvB,EAAkD;AACjDV,MAAAA,aAAa,CAACS,OAAd,CAAsBK,QAAtB,CAAgC;AAC/BC,QAAAA,CAAC,EAAER,eAD4B;AAE/BS,QAAAA,QAAQ,EAAE;AAFqB,OAAhC;AAIA;AACA;;AAED,UAAMC,oBAAoB,GAAGN,IAAI,CAACO,GAAL,CAC5BP,IAAI,CAACQ,KAAL,CACCpB,sBAAsB,CAACU,OAAvB,CAA+BW,MAA/B,IACGvB,cAAc,GAAGD,iBAAjB,GAAqCY,WADxC,CADD,CAD4B,CAA7B;AAMA,UAAMa,SAAS,GAAGV,IAAI,CAACQ,KAAL,CACjBT,wBAAwB,GAAGO,oBADV,CAAlB;AAIA,UAAMK,UAAU,GACff,eAAe,GAAGR,sBAAsB,CAACU,OAAvB,CAA+BM,CAA/B,GAAmCX,MADtD,CAlC6B,CAqC7B;;AACA,QAAKG,eAAe,GAAGc,SAAlB,IAA+B,CAAEC,UAAtC,EAAmD;AAClDtB,MAAAA,aAAa,CAACS,OAAd,CAAsBK,QAAtB,CAAgC;AAC/BC,QAAAA,CAAC,EAAER,eAAe,GAAGU,oBADU;AAE/BD,QAAAA,QAAQ,EAAE;AAFqB,OAAhC;AAIA;AACD,GA7C8B,EA8C/B,CACCpB,iBADD,EAECQ,MAFD,EAGCP,cAHD,EAICC,aAJD,EAKCC,sBALD,EAMCC,aAND,EAOCC,iBAPD,CA9C+B,CAAhC;AAyDA,SAAO,CAAEI,uBAAF,CAAP;AACA","sourcesContent":["/**\n * External dependencies\n */\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\n\nconst DEFAULT_FONT_SIZE = 16;\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n/** @typedef {import('react-native-reanimated').SharedValue} SharedValue */\n/**\n * Hook to scroll to the currently focused TextInput\n * depending on where the caret is placed taking into\n * account the Keyboard and the Header.\n *\n * @param {number} extraScrollHeight Extra space to not overlap the content.\n * @param {number} keyboardOffset Keyboard space offset.\n * @param {boolean} scrollEnabled Whether the scroll is enabled or not.\n * @param {RefObject} scrollViewMeasurements ScrollView Layout measurements.\n * @param {RefObject} scrollViewRef ScrollView reference.\n * @param {SharedValue} scrollViewYOffset Current offset position of the ScrollView.\n * @return {Function[]} Function to scroll to the current TextInput's offset.\n */\nexport default function useScrollToTextInput(\n\textraScrollHeight,\n\tkeyboardOffset,\n\tscrollEnabled,\n\tscrollViewMeasurements,\n\tscrollViewRef,\n\tscrollViewYOffset\n) {\n\tconst { top, bottom } = useSafeAreaInsets();\n\tconst insets = top + bottom;\n\n\t/**\n\t * Function to scroll to the current TextInput's offset.\n\t *\n\t * @param {Object} caret The caret position data of the currently focused TextInput.\n\t * @param {number} caret.caretHeight The height of the caret.\n\t * @param {number} textInputOffset The offset calculated with the caret's Y coordinate + the\n\t * TextInput's Y coord or height value.\n\t */\n\tconst scrollToTextInputOffset = useCallback(\n\t\t( caret, textInputOffset ) => {\n\t\t\tconst { caretHeight = DEFAULT_FONT_SIZE } = caret ?? {};\n\n\t\t\tif (\n\t\t\t\t! scrollViewRef.current ||\n\t\t\t\t! scrollEnabled ||\n\t\t\t\t! scrollViewMeasurements.current\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst currentScrollViewYOffset = Math.max(\n\t\t\t\t0,\n\t\t\t\tscrollViewYOffset.value\n\t\t\t);\n\n\t\t\t// Scroll up.\n\t\t\tif ( textInputOffset < currentScrollViewYOffset ) {\n\t\t\t\tscrollViewRef.current.scrollTo( {\n\t\t\t\t\ty: textInputOffset,\n\t\t\t\t\tanimated: true,\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst availableScreenSpace = Math.abs(\n\t\t\t\tMath.floor(\n\t\t\t\t\tscrollViewMeasurements.current.height -\n\t\t\t\t\t\t( keyboardOffset + extraScrollHeight + caretHeight )\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst maxOffset = Math.floor(\n\t\t\t\tcurrentScrollViewYOffset + availableScreenSpace\n\t\t\t);\n\n\t\t\tconst isAtTheTop =\n\t\t\t\ttextInputOffset < scrollViewMeasurements.current.y + insets;\n\n\t\t\t// Scroll down.\n\t\t\tif ( textInputOffset > maxOffset && ! isAtTheTop ) {\n\t\t\t\tscrollViewRef.current.scrollTo( {\n\t\t\t\t\ty: textInputOffset - availableScreenSpace,\n\t\t\t\t\tanimated: true,\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\textraScrollHeight,\n\t\t\tinsets,\n\t\t\tkeyboardOffset,\n\t\t\tscrollEnabled,\n\t\t\tscrollViewMeasurements,\n\t\t\tscrollViewRef,\n\t\t\tscrollViewYOffset,\n\t\t]\n\t);\n\n\treturn [ scrollToTextInputOffset ];\n}\n"]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useTextInputCaretPosition;
9
+
10
+ var _reactNativeAztec = _interopRequireDefault(require("@wordpress/react-native-aztec"));
11
+
12
+ var _element = require("@wordpress/element");
13
+
14
+ /**
15
+ * WordPress dependencies
16
+ */
17
+
18
+ /**
19
+ * Hook that listens to caret changes from AztecView TextInputs.
20
+ *
21
+ * @param {boolean} scrollEnabled Whether the scroll is enabled or not.
22
+ * @return {[number]} Current caret's data.
23
+ */
24
+ function useTextInputCaretPosition(scrollEnabled) {
25
+ const [currentCaretData, setCurrentCaretData] = (0, _element.useState)();
26
+ const onCaretChange = (0, _element.useCallback)(caret => {
27
+ setCurrentCaretData(caret);
28
+ }, []);
29
+ (0, _element.useEffect)(() => {
30
+ if (scrollEnabled) {
31
+ _reactNativeAztec.default.InputState.addCaretChangeListener(onCaretChange);
32
+ } else {
33
+ _reactNativeAztec.default.InputState.removeCaretChangeListener(onCaretChange);
34
+ }
35
+
36
+ return () => {
37
+ if (scrollEnabled) {
38
+ _reactNativeAztec.default.InputState.removeCaretChangeListener(onCaretChange);
39
+ }
40
+ };
41
+ }, [scrollEnabled, onCaretChange]);
42
+ return [currentCaretData];
43
+ }
44
+ //# sourceMappingURL=use-text-input-caret-position.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/use-text-input-caret-position.native.js"],"names":["useTextInputCaretPosition","scrollEnabled","currentCaretData","setCurrentCaretData","onCaretChange","caret","RCTAztecView","InputState","addCaretChangeListener","removeCaretChangeListener"],"mappings":";;;;;;;;;AAGA;;AACA;;AAJA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,yBAAT,CAAoCC,aAApC,EAAoD;AAClE,QAAM,CAAEC,gBAAF,EAAoBC,mBAApB,IAA4C,wBAAlD;AAEA,QAAMC,aAAa,GAAG,0BAAeC,KAAF,IAAa;AAC/CF,IAAAA,mBAAmB,CAAEE,KAAF,CAAnB;AACA,GAFqB,EAEnB,EAFmB,CAAtB;AAIA,0BAAW,MAAM;AAChB,QAAKJ,aAAL,EAAqB;AACpBK,gCAAaC,UAAb,CAAwBC,sBAAxB,CAAgDJ,aAAhD;AACA,KAFD,MAEO;AACNE,gCAAaC,UAAb,CAAwBE,yBAAxB,CAAmDL,aAAnD;AACA;;AAED,WAAO,MAAM;AACZ,UAAKH,aAAL,EAAqB;AACpBK,kCAAaC,UAAb,CAAwBE,yBAAxB,CACCL,aADD;AAGA;AACD,KAND;AAOA,GAdD,EAcG,CAAEH,aAAF,EAAiBG,aAAjB,CAdH;AAeA,SAAO,CAAEF,gBAAF,CAAP;AACA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport RCTAztecView from '@wordpress/react-native-aztec';\nimport { useCallback, useEffect, useState } from '@wordpress/element';\n\n/**\n * Hook that listens to caret changes from AztecView TextInputs.\n *\n * @param {boolean} scrollEnabled Whether the scroll is enabled or not.\n * @return {[number]} Current caret's data.\n */\nexport default function useTextInputCaretPosition( scrollEnabled ) {\n\tconst [ currentCaretData, setCurrentCaretData ] = useState();\n\n\tconst onCaretChange = useCallback( ( caret ) => {\n\t\tsetCurrentCaretData( caret );\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tif ( scrollEnabled ) {\n\t\t\tRCTAztecView.InputState.addCaretChangeListener( onCaretChange );\n\t\t} else {\n\t\t\tRCTAztecView.InputState.removeCaretChangeListener( onCaretChange );\n\t\t}\n\n\t\treturn () => {\n\t\t\tif ( scrollEnabled ) {\n\t\t\t\tRCTAztecView.InputState.removeCaretChangeListener(\n\t\t\t\t\tonCaretChange\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}, [ scrollEnabled, onCaretChange ] );\n\treturn [ currentCaretData ];\n}\n"]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useTextInputOffset;
9
+
10
+ var _reactNativeAztec = _interopRequireDefault(require("@wordpress/react-native-aztec"));
11
+
12
+ var _element = require("@wordpress/element");
13
+
14
+ /**
15
+ * WordPress dependencies
16
+ */
17
+
18
+ /** @typedef {import('@wordpress/element').RefObject} RefObject */
19
+
20
+ /**
21
+ * Hook that calculates the currently focused TextInput's current
22
+ * caret Y coordinate position.
23
+ *
24
+ * @param {boolean} scrollEnabled Whether the scroll is enabled or not.
25
+ * @param {RefObject} scrollViewRef ScrollView reference.
26
+ * @return {[Function]} Function to get the current TextInput's offset.
27
+ */
28
+ function useTextInputOffset(scrollEnabled, scrollViewRef) {
29
+ const getTextInputOffset = (0, _element.useCallback)(async caret => {
30
+ const {
31
+ caretY = null
32
+ } = caret !== null && caret !== void 0 ? caret : {};
33
+
34
+ const textInput = _reactNativeAztec.default.InputState.getCurrentFocusedElement();
35
+
36
+ return new Promise(resolve => {
37
+ if (scrollViewRef.current && textInput && scrollEnabled && caretY !== null) {
38
+ textInput.measureLayout(scrollViewRef.current, (_x, y, _width, height) => {
39
+ const caretYOffset = // For cases where the caretY value is -1
40
+ // we use the y + height value, e.g the current
41
+ // character index is not valid or out of bounds
42
+ // see https://github.com/wordpress-mobile/AztecEditor-iOS/blob/4d0522d67b0056ac211466caaa76936cc5b4f947/Aztec/Classes/TextKit/TextView.swift#L762
43
+ caretY >= 0 && caretY < height ? y + caretY : y + height;
44
+ resolve(Math.round(Math.abs(caretYOffset)));
45
+ }, () => resolve(null));
46
+ } else {
47
+ resolve(null);
48
+ }
49
+ });
50
+ }, [scrollEnabled, scrollViewRef]);
51
+ return [getTextInputOffset];
52
+ }
53
+ //# sourceMappingURL=use-text-input-offset.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/components/src/mobile/keyboard-aware-flat-list/use-text-input-offset.native.js"],"names":["useTextInputOffset","scrollEnabled","scrollViewRef","getTextInputOffset","caret","caretY","textInput","RCTAztecView","InputState","getCurrentFocusedElement","Promise","resolve","current","measureLayout","_x","y","_width","height","caretYOffset","Math","round","abs"],"mappings":";;;;;;;;;AAGA;;AACA;;AAJA;AACA;AACA;;AAIA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,kBAAT,CAA6BC,aAA7B,EAA4CC,aAA5C,EAA4D;AAC1E,QAAMC,kBAAkB,GAAG,0BAC1B,MAAQC,KAAR,IAAmB;AAClB,UAAM;AAAEC,MAAAA,MAAM,GAAG;AAAX,QAAoBD,KAApB,aAAoBA,KAApB,cAAoBA,KAApB,GAA6B,EAAnC;;AACA,UAAME,SAAS,GACdC,0BAAaC,UAAb,CAAwBC,wBAAxB,EADD;;AAGA,WAAO,IAAIC,OAAJ,CAAeC,OAAF,IAAe;AAClC,UACCT,aAAa,CAACU,OAAd,IACAN,SADA,IAEAL,aAFA,IAGAI,MAAM,KAAK,IAJZ,EAKE;AACDC,QAAAA,SAAS,CAACO,aAAV,CACCX,aAAa,CAACU,OADf,EAEC,CAAEE,EAAF,EAAMC,CAAN,EAASC,MAAT,EAAiBC,MAAjB,KAA6B;AAC5B,gBAAMC,YAAY,GACjB;AACA;AACA;AACA;AACAb,UAAAA,MAAM,IAAI,CAAV,IAAeA,MAAM,GAAGY,MAAxB,GACGF,CAAC,GAAGV,MADP,GAEGU,CAAC,GAAGE,MAPR;AAQAN,UAAAA,OAAO,CAAEQ,IAAI,CAACC,KAAL,CAAYD,IAAI,CAACE,GAAL,CAAUH,YAAV,CAAZ,CAAF,CAAP;AACA,SAZF,EAaC,MAAMP,OAAO,CAAE,IAAF,CAbd;AAeA,OArBD,MAqBO;AACNA,QAAAA,OAAO,CAAE,IAAF,CAAP;AACA;AACD,KAzBM,CAAP;AA0BA,GAhCyB,EAiC1B,CAAEV,aAAF,EAAiBC,aAAjB,CAjC0B,CAA3B;AAoCA,SAAO,CAAEC,kBAAF,CAAP;AACA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport RCTAztecView from '@wordpress/react-native-aztec';\nimport { useCallback } from '@wordpress/element';\n\n/** @typedef {import('@wordpress/element').RefObject} RefObject */\n/**\n * Hook that calculates the currently focused TextInput's current\n * caret Y coordinate position.\n *\n * @param {boolean} scrollEnabled Whether the scroll is enabled or not.\n * @param {RefObject} scrollViewRef ScrollView reference.\n * @return {[Function]} Function to get the current TextInput's offset.\n */\nexport default function useTextInputOffset( scrollEnabled, scrollViewRef ) {\n\tconst getTextInputOffset = useCallback(\n\t\tasync ( caret ) => {\n\t\t\tconst { caretY = null } = caret ?? {};\n\t\t\tconst textInput =\n\t\t\t\tRCTAztecView.InputState.getCurrentFocusedElement();\n\n\t\t\treturn new Promise( ( resolve ) => {\n\t\t\t\tif (\n\t\t\t\t\tscrollViewRef.current &&\n\t\t\t\t\ttextInput &&\n\t\t\t\t\tscrollEnabled &&\n\t\t\t\t\tcaretY !== null\n\t\t\t\t) {\n\t\t\t\t\ttextInput.measureLayout(\n\t\t\t\t\t\tscrollViewRef.current,\n\t\t\t\t\t\t( _x, y, _width, height ) => {\n\t\t\t\t\t\t\tconst caretYOffset =\n\t\t\t\t\t\t\t\t// For cases where the caretY value is -1\n\t\t\t\t\t\t\t\t// we use the y + height value, e.g the current\n\t\t\t\t\t\t\t\t// character index is not valid or out of bounds\n\t\t\t\t\t\t\t\t// see https://github.com/wordpress-mobile/AztecEditor-iOS/blob/4d0522d67b0056ac211466caaa76936cc5b4f947/Aztec/Classes/TextKit/TextView.swift#L762\n\t\t\t\t\t\t\t\tcaretY >= 0 && caretY < height\n\t\t\t\t\t\t\t\t\t? y + caretY\n\t\t\t\t\t\t\t\t\t: y + height;\n\t\t\t\t\t\t\tresolve( Math.round( Math.abs( caretYOffset ) ) );\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => resolve( null )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tresolve( null );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\t\t[ scrollEnabled, scrollViewRef ]\n\t);\n\n\treturn [ getTextInputOffset ];\n}\n"]}
@@ -60,6 +60,8 @@ const Segment = _ref => {
60
60
  };
61
61
 
62
62
  const SegmentedControls = _ref2 => {
63
+ var _segmentsDimensions$a, _segmentsDimensions$a2;
64
+
63
65
  let {
64
66
  segments,
65
67
  segmentHandler,
@@ -130,8 +132,8 @@ const SegmentedControls = _ref2 => {
130
132
  }
131
133
 
132
134
  const selectedStyle = (0, _compose.usePreferredColorSchemeStyle)(_style.default.selected, _style.default.selectedDark);
133
- const width = segmentsDimensions[activeSegmentIndex].width;
134
- const height = segmentsDimensions[activeSegmentIndex].height;
135
+ const width = (_segmentsDimensions$a = segmentsDimensions[activeSegmentIndex]) === null || _segmentsDimensions$a === void 0 ? void 0 : _segmentsDimensions$a.width;
136
+ const height = (_segmentsDimensions$a2 = segmentsDimensions[activeSegmentIndex]) === null || _segmentsDimensions$a2 === void 0 ? void 0 : _segmentsDimensions$a2.height;
135
137
  const outlineStyle = [_style.default.outline, isIOS && _style.default.outlineIOS];
136
138
  return (0, _element.createElement)(_reactNative.View, {
137
139
  style: _style.default.row