@medway-ui/native 1.6.1 → 1.7.1

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 (224) hide show
  1. package/README.md +27 -2
  2. package/lib/commonjs/components/Alert.js +3 -1
  3. package/lib/commonjs/components/Alert.js.map +1 -1
  4. package/lib/commonjs/components/AlertDialog.js +5 -2
  5. package/lib/commonjs/components/AlertDialog.js.map +1 -1
  6. package/lib/commonjs/components/Badge.js +37 -2
  7. package/lib/commonjs/components/Badge.js.map +1 -1
  8. package/lib/commonjs/components/Button.js +32 -1
  9. package/lib/commonjs/components/Button.js.map +1 -1
  10. package/lib/commonjs/components/Carousel.js +12 -2
  11. package/lib/commonjs/components/Carousel.js.map +1 -1
  12. package/lib/commonjs/components/Checkbox.js +2 -0
  13. package/lib/commonjs/components/Checkbox.js.map +1 -1
  14. package/lib/commonjs/components/Chip.js +208 -0
  15. package/lib/commonjs/components/Chip.js.map +1 -0
  16. package/lib/commonjs/components/Choice.js +116 -0
  17. package/lib/commonjs/components/Choice.js.map +1 -0
  18. package/lib/commonjs/components/Dialog.js +27 -16
  19. package/lib/commonjs/components/Dialog.js.map +1 -1
  20. package/lib/commonjs/components/DropdownMenu.js +73 -57
  21. package/lib/commonjs/components/DropdownMenu.js.map +1 -1
  22. package/lib/commonjs/components/EmptyState.js +9 -2
  23. package/lib/commonjs/components/EmptyState.js.map +1 -1
  24. package/lib/commonjs/components/Feed.js +7 -3
  25. package/lib/commonjs/components/Feed.js.map +1 -1
  26. package/lib/commonjs/components/Feedback.js +77 -0
  27. package/lib/commonjs/components/Feedback.js.map +1 -0
  28. package/lib/commonjs/components/Filter.js +93 -0
  29. package/lib/commonjs/components/Filter.js.map +1 -0
  30. package/lib/commonjs/components/IndexLevel.js +4 -3
  31. package/lib/commonjs/components/IndexLevel.js.map +1 -1
  32. package/lib/commonjs/components/Input.js +149 -45
  33. package/lib/commonjs/components/Input.js.map +1 -1
  34. package/lib/commonjs/components/InvitePopover.js +4 -1
  35. package/lib/commonjs/components/InvitePopover.js.map +1 -1
  36. package/lib/commonjs/components/MemberRow.js +3 -4
  37. package/lib/commonjs/components/MemberRow.js.map +1 -1
  38. package/lib/commonjs/components/PostForm.js +18 -8
  39. package/lib/commonjs/components/PostForm.js.map +1 -1
  40. package/lib/commonjs/components/PrizeCollection.js +1 -1
  41. package/lib/commonjs/components/RadioGroup.js +7 -0
  42. package/lib/commonjs/components/RadioGroup.js.map +1 -1
  43. package/lib/commonjs/components/Select.js +1 -1
  44. package/lib/commonjs/components/Sheet.js +4 -1
  45. package/lib/commonjs/components/Sheet.js.map +1 -1
  46. package/lib/commonjs/components/Skeleton.js +55 -4
  47. package/lib/commonjs/components/Skeleton.js.map +1 -1
  48. package/lib/commonjs/components/Switch.js +2 -0
  49. package/lib/commonjs/components/Switch.js.map +1 -1
  50. package/lib/commonjs/components/Tabs.js +2 -0
  51. package/lib/commonjs/components/Tabs.js.map +1 -1
  52. package/lib/commonjs/components/Toast.js +355 -79
  53. package/lib/commonjs/components/Toast.js.map +1 -1
  54. package/lib/commonjs/editor/NoteEditor.js +41 -14
  55. package/lib/commonjs/editor/NoteEditor.js.map +1 -1
  56. package/lib/commonjs/editor/editorHtml.generated.js +1 -1
  57. package/lib/commonjs/editor/editorHtml.generated.js.map +1 -1
  58. package/lib/commonjs/hooks/useThemeColor.js +693 -65
  59. package/lib/commonjs/hooks/useThemeColor.js.map +1 -1
  60. package/lib/commonjs/hooks/useTrackedText.js +21 -0
  61. package/lib/commonjs/hooks/useTrackedText.js.map +1 -0
  62. package/lib/commonjs/index.js +46 -0
  63. package/lib/commonjs/index.js.map +1 -1
  64. package/lib/commonjs/lib/optional-deps.js +20 -0
  65. package/lib/commonjs/lib/optional-deps.js.map +1 -0
  66. package/lib/commonjs/lib/touch-target.js +19 -0
  67. package/lib/commonjs/lib/touch-target.js.map +1 -0
  68. package/lib/module/components/Alert.js +3 -1
  69. package/lib/module/components/Alert.js.map +1 -1
  70. package/lib/module/components/AlertDialog.js +5 -2
  71. package/lib/module/components/AlertDialog.js.map +1 -1
  72. package/lib/module/components/Badge.js +36 -2
  73. package/lib/module/components/Badge.js.map +1 -1
  74. package/lib/module/components/Button.js +32 -1
  75. package/lib/module/components/Button.js.map +1 -1
  76. package/lib/module/components/Carousel.js +12 -2
  77. package/lib/module/components/Carousel.js.map +1 -1
  78. package/lib/module/components/Checkbox.js +2 -0
  79. package/lib/module/components/Checkbox.js.map +1 -1
  80. package/lib/module/components/Chip.js +204 -0
  81. package/lib/module/components/Chip.js.map +1 -0
  82. package/lib/module/components/Choice.js +112 -0
  83. package/lib/module/components/Choice.js.map +1 -0
  84. package/lib/module/components/Dialog.js +28 -17
  85. package/lib/module/components/Dialog.js.map +1 -1
  86. package/lib/module/components/DropdownMenu.js +74 -58
  87. package/lib/module/components/DropdownMenu.js.map +1 -1
  88. package/lib/module/components/EmptyState.js +9 -2
  89. package/lib/module/components/EmptyState.js.map +1 -1
  90. package/lib/module/components/Feed.js +7 -3
  91. package/lib/module/components/Feed.js.map +1 -1
  92. package/lib/module/components/Feedback.js +74 -0
  93. package/lib/module/components/Feedback.js.map +1 -0
  94. package/lib/module/components/Filter.js +89 -0
  95. package/lib/module/components/Filter.js.map +1 -0
  96. package/lib/module/components/IndexLevel.js +4 -3
  97. package/lib/module/components/IndexLevel.js.map +1 -1
  98. package/lib/module/components/Input.js +149 -45
  99. package/lib/module/components/Input.js.map +1 -1
  100. package/lib/module/components/InvitePopover.js +4 -1
  101. package/lib/module/components/InvitePopover.js.map +1 -1
  102. package/lib/module/components/MemberRow.js +3 -4
  103. package/lib/module/components/MemberRow.js.map +1 -1
  104. package/lib/module/components/PostForm.js +18 -8
  105. package/lib/module/components/PostForm.js.map +1 -1
  106. package/lib/module/components/PrizeCollection.js +1 -1
  107. package/lib/module/components/RadioGroup.js +7 -0
  108. package/lib/module/components/RadioGroup.js.map +1 -1
  109. package/lib/module/components/Select.js +1 -1
  110. package/lib/module/components/Sheet.js +4 -1
  111. package/lib/module/components/Sheet.js.map +1 -1
  112. package/lib/module/components/Skeleton.js +56 -5
  113. package/lib/module/components/Skeleton.js.map +1 -1
  114. package/lib/module/components/Switch.js +2 -0
  115. package/lib/module/components/Switch.js.map +1 -1
  116. package/lib/module/components/Tabs.js +2 -0
  117. package/lib/module/components/Tabs.js.map +1 -1
  118. package/lib/module/components/Toast.js +360 -84
  119. package/lib/module/components/Toast.js.map +1 -1
  120. package/lib/module/editor/NoteEditor.js +41 -14
  121. package/lib/module/editor/NoteEditor.js.map +1 -1
  122. package/lib/module/editor/editorHtml.generated.js +1 -1
  123. package/lib/module/editor/editorHtml.generated.js.map +1 -1
  124. package/lib/module/hooks/useThemeColor.js +693 -65
  125. package/lib/module/hooks/useThemeColor.js.map +1 -1
  126. package/lib/module/hooks/useTrackedText.js +18 -0
  127. package/lib/module/hooks/useTrackedText.js.map +1 -0
  128. package/lib/module/index.js +8 -0
  129. package/lib/module/index.js.map +1 -1
  130. package/lib/module/lib/optional-deps.js +16 -0
  131. package/lib/module/lib/optional-deps.js.map +1 -0
  132. package/lib/module/lib/touch-target.js +15 -0
  133. package/lib/module/lib/touch-target.js.map +1 -0
  134. package/lib/typescript/components/Alert.d.ts.map +1 -1
  135. package/lib/typescript/components/AlertDialog.d.ts.map +1 -1
  136. package/lib/typescript/components/Badge.d.ts +1 -1
  137. package/lib/typescript/components/Badge.d.ts.map +1 -1
  138. package/lib/typescript/components/Button.d.ts.map +1 -1
  139. package/lib/typescript/components/Carousel.d.ts +1 -1
  140. package/lib/typescript/components/Carousel.d.ts.map +1 -1
  141. package/lib/typescript/components/Checkbox.d.ts.map +1 -1
  142. package/lib/typescript/components/Chip.d.ts +30 -0
  143. package/lib/typescript/components/Chip.d.ts.map +1 -0
  144. package/lib/typescript/components/Choice.d.ts +17 -0
  145. package/lib/typescript/components/Choice.d.ts.map +1 -0
  146. package/lib/typescript/components/Dialog.d.ts.map +1 -1
  147. package/lib/typescript/components/DropdownMenu.d.ts +0 -7
  148. package/lib/typescript/components/DropdownMenu.d.ts.map +1 -1
  149. package/lib/typescript/components/EmptyState.d.ts +3 -2
  150. package/lib/typescript/components/EmptyState.d.ts.map +1 -1
  151. package/lib/typescript/components/Feed.d.ts.map +1 -1
  152. package/lib/typescript/components/Feedback.d.ts +17 -0
  153. package/lib/typescript/components/Feedback.d.ts.map +1 -0
  154. package/lib/typescript/components/Filter.d.ts +17 -0
  155. package/lib/typescript/components/Filter.d.ts.map +1 -0
  156. package/lib/typescript/components/IndexLevel.d.ts.map +1 -1
  157. package/lib/typescript/components/Input.d.ts +3 -3
  158. package/lib/typescript/components/Input.d.ts.map +1 -1
  159. package/lib/typescript/components/InvitePopover.d.ts.map +1 -1
  160. package/lib/typescript/components/MemberRow.d.ts.map +1 -1
  161. package/lib/typescript/components/PostForm.d.ts.map +1 -1
  162. package/lib/typescript/components/RadioGroup.d.ts.map +1 -1
  163. package/lib/typescript/components/Sheet.d.ts.map +1 -1
  164. package/lib/typescript/components/Skeleton.d.ts +1 -1
  165. package/lib/typescript/components/Skeleton.d.ts.map +1 -1
  166. package/lib/typescript/components/Switch.d.ts.map +1 -1
  167. package/lib/typescript/components/Tabs.d.ts.map +1 -1
  168. package/lib/typescript/components/Tag.d.ts +2 -2
  169. package/lib/typescript/components/ThemedIcon.d.ts +1 -1
  170. package/lib/typescript/components/ThemedIcon.d.ts.map +1 -1
  171. package/lib/typescript/components/Toast.d.ts +24 -13
  172. package/lib/typescript/components/Toast.d.ts.map +1 -1
  173. package/lib/typescript/editor/NoteEditor.d.ts.map +1 -1
  174. package/lib/typescript/editor/editorHtml.generated.d.ts.map +1 -1
  175. package/lib/typescript/hooks/useThemeColor.d.ts +0 -10
  176. package/lib/typescript/hooks/useThemeColor.d.ts.map +1 -1
  177. package/lib/typescript/hooks/useTrackedText.d.ts +6 -0
  178. package/lib/typescript/hooks/useTrackedText.d.ts.map +1 -0
  179. package/lib/typescript/index.d.ts +9 -1
  180. package/lib/typescript/index.d.ts.map +1 -1
  181. package/lib/typescript/lib/optional-deps.d.ts +23 -0
  182. package/lib/typescript/lib/optional-deps.d.ts.map +1 -0
  183. package/lib/typescript/lib/touch-target.d.ts +5 -0
  184. package/lib/typescript/lib/touch-target.d.ts.map +1 -0
  185. package/package.json +6 -1
  186. package/setup/createMedwayUiNavigator.tsx +4 -7
  187. package/setup/metro.js +12 -3
  188. package/setup/tokens.native.css +268 -258
  189. package/src/components/Alert.tsx +3 -1
  190. package/src/components/AlertDialog.tsx +8 -3
  191. package/src/components/Badge.tsx +51 -3
  192. package/src/components/Button.tsx +39 -1
  193. package/src/components/Carousel.tsx +17 -3
  194. package/src/components/Checkbox.tsx +2 -0
  195. package/src/components/Chip.tsx +227 -0
  196. package/src/components/Choice.tsx +139 -0
  197. package/src/components/Dialog.tsx +39 -23
  198. package/src/components/DropdownMenu.tsx +99 -87
  199. package/src/components/EmptyState.tsx +18 -3
  200. package/src/components/Feed.tsx +4 -3
  201. package/src/components/Feedback.tsx +111 -0
  202. package/src/components/Filter.tsx +106 -0
  203. package/src/components/IndexLevel.tsx +8 -10
  204. package/src/components/Input.tsx +142 -54
  205. package/src/components/InvitePopover.tsx +5 -1
  206. package/src/components/MemberRow.tsx +3 -5
  207. package/src/components/PostForm.tsx +16 -9
  208. package/src/components/PrizeCollection.tsx +1 -1
  209. package/src/components/RadioGroup.tsx +8 -0
  210. package/src/components/Select.tsx +1 -1
  211. package/src/components/Sheet.tsx +4 -1
  212. package/src/components/Skeleton.tsx +47 -6
  213. package/src/components/Switch.tsx +2 -0
  214. package/src/components/Tabs.tsx +2 -0
  215. package/src/components/ThemedIcon.tsx +1 -1
  216. package/src/components/Toast.tsx +489 -87
  217. package/src/editor/NoteEditor.tsx +50 -11
  218. package/src/editor/editorHtml.generated.ts +1 -1
  219. package/src/hooks/useThemeColor.ts +757 -64
  220. package/src/hooks/useTrackedText.ts +20 -0
  221. package/src/index.ts +36 -1
  222. package/src/lib/optional-deps.ts +27 -0
  223. package/src/lib/touch-target.ts +12 -0
  224. package/setup/index.tsx +0 -42
@@ -354,6 +354,23 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
354
354
  );
355
355
  }, []);
356
356
 
357
+ const editableRef = useRef(editable);
358
+ useEffect(() => {
359
+ editableRef.current = editable;
360
+ }, [editable]);
361
+
362
+ const sendMutation = useCallback(
363
+ (message: NativeToEditorMessage) => {
364
+ if (editableRef.current) send(message);
365
+ },
366
+ [send]
367
+ );
368
+
369
+ const handleWebViewReset = useCallback(() => {
370
+ setIsReady(false);
371
+ setSlashState(EMPTY_SLASH_STATE);
372
+ }, []);
373
+
357
374
  const pendingDocumentRequests = useRef(
358
375
  new Map<string, { resolve: (doc: EditorDocument) => void; reject: (error: Error) => void }>()
359
376
  );
@@ -392,17 +409,25 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
392
409
 
393
410
  const insertImage = useCallback(async () => {
394
411
  const upload = onImageUploadRef.current;
395
- if (!upload) return;
412
+ if (!upload || !editableRef.current) return;
396
413
 
397
414
  try {
398
415
  const result = await upload();
399
416
  if (!result) return;
400
- send({ type: "insertImage", src: result.src, alt: result.alt ?? null });
417
+ if (!editableRef.current) {
418
+ onImageRemovedRef.current?.(result.src);
419
+ return;
420
+ }
421
+ sendMutation({
422
+ type: "insertImage",
423
+ src: result.src,
424
+ alt: result.alt ?? null,
425
+ });
401
426
  } catch (error) {
402
427
  // eslint-disable-next-line no-console
403
428
  console.error("@medway-ui/native NoteEditor: onImageUpload failed", error);
404
429
  }
405
- }, [send]);
430
+ }, [sendMutation]);
406
431
 
407
432
  const handleMessage = useCallback(
408
433
  (event: WebViewMessageEvent) => {
@@ -540,17 +565,17 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
540
565
 
541
566
  const confirmLink = useCallback(() => {
542
567
  const href = linkValue.trim();
543
- send(
568
+ sendMutation(
544
569
  href
545
570
  ? { type: "command", command: { name: "setLink", href } }
546
571
  : { type: "command", command: { name: "unsetLink" } }
547
572
  );
548
573
  setLinkDialogOpen(false);
549
- }, [linkValue, send]);
574
+ }, [linkValue, sendMutation]);
550
575
 
551
576
  const runToolbarCommand = useCallback(
552
- (command: EditorCommand) => send({ type: "command", command }),
553
- [send]
577
+ (command: EditorCommand) => sendMutation({ type: "command", command }),
578
+ [sendMutation]
554
579
  );
555
580
  const toolbarGroups = useMemo(
556
581
  () => buildToolbarGroups(selectionState, openLinkDialog),
@@ -559,10 +584,11 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
559
584
 
560
585
  const handleSlashSelect = useCallback(
561
586
  (id: SlashCommandId) => {
587
+ if (!editable) return;
562
588
  send({ type: "runSlashCommand", commandId: id });
563
589
  if (id === "image") insertImage();
564
590
  },
565
- [send, insertImage]
591
+ [editable, send, insertImage]
566
592
  );
567
593
 
568
594
  const containerHeight = isEmbedded ? contentHeight : undefined;
@@ -573,7 +599,6 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
573
599
  <View
574
600
  style={[
575
601
  isEmbedded ? styles.containerEmbedded : styles.container,
576
- isEmbedded ? { height: containerHeight } : null,
577
602
  { backgroundColor: resolvedBackground },
578
603
  ]}
579
604
  >
@@ -581,6 +606,7 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
581
606
  <NoteEditorToolbar
582
607
  groups={toolbarGroups}
583
608
  state={selectionState}
609
+ disabled={!editable}
584
610
  onCommand={runToolbarCommand}
585
611
  onImagePress={onImageUpload ? insertImage : undefined}
586
612
  />
@@ -614,12 +640,18 @@ const NoteEditor = forwardRef<NoteEditorHandle, NoteEditorProps>(
614
640
  <WebView
615
641
  ref={webViewRef}
616
642
  testID={testID}
643
+ containerStyle={
644
+ isEmbedded ? { flex: 0, height: containerHeight } : undefined
645
+ }
617
646
  source={{ html: EDITOR_HTML }}
618
647
  // Anchored: `react-native-webview` treats each entry as an
619
648
  // unanchored pattern, so a bare "about:blank" also admits
620
649
  // "about:blankse.evil.com".
621
650
  originWhitelist={["^about:blank$"]}
622
651
  onMessage={handleMessage}
652
+ onLoadStart={handleWebViewReset}
653
+ onContentProcessDidTerminate={handleWebViewReset}
654
+ onRenderProcessGone={handleWebViewReset}
623
655
  // Links already leave the editor via the `linkPress` message, so
624
656
  // nothing rendered here needs to navigate. Allowing only the
625
657
  // initial `about:blank` load closes off `data:`/script-driven
@@ -694,11 +726,13 @@ NoteEditor.displayName = "NoteEditor";
694
726
  function NoteEditorToolbar({
695
727
  groups,
696
728
  state,
729
+ disabled: allDisabled,
697
730
  onCommand,
698
731
  onImagePress,
699
732
  }: {
700
733
  groups: ToolbarItem[][];
701
734
  state: EditorSelectionState;
735
+ disabled: boolean;
702
736
  onCommand: (command: EditorCommand) => void;
703
737
  onImagePress?: () => void;
704
738
  }) {
@@ -719,7 +753,7 @@ function NoteEditorToolbar({
719
753
  ) : null}
720
754
  {group.map((item) => {
721
755
  const active = item.activeKey ? state.active[item.activeKey] : false;
722
- const disabled = item.disabled?.(state) ?? false;
756
+ const disabled = allDisabled || (item.disabled?.(state) ?? false);
723
757
  const Icon = item.Icon;
724
758
 
725
759
  const buttonStyle: StyleProp<ViewStyle> = [
@@ -751,8 +785,13 @@ function NoteEditorToolbar({
751
785
  <Pressable
752
786
  accessibilityRole="button"
753
787
  accessibilityLabel="Inserir imagem"
788
+ accessibilityState={{ disabled: allDisabled }}
789
+ disabled={allDisabled}
754
790
  onPress={onImagePress}
755
- style={styles.toolbarButton}
791
+ style={[
792
+ styles.toolbarButton,
793
+ allDisabled ? styles.toolbarButtonDisabled : null,
794
+ ]}
756
795
  >
757
796
  <ImageIcon width={16} height={16} color={iconColor} />
758
797
  </Pressable>