@oxyhq/bloom 0.3.12 → 0.5.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 (191) hide show
  1. package/README.md +133 -90
  2. package/lib/commonjs/bottom-sheet/index.js +341 -98
  3. package/lib/commonjs/bottom-sheet/index.js.map +1 -1
  4. package/lib/commonjs/context-menu/index.js +18 -19
  5. package/lib/commonjs/context-menu/index.js.map +1 -1
  6. package/lib/commonjs/dialog/BloomDialogProvider.js +61 -0
  7. package/lib/commonjs/dialog/BloomDialogProvider.js.map +1 -0
  8. package/lib/commonjs/dialog/BloomDialogProvider.web.js +45 -0
  9. package/lib/commonjs/dialog/BloomDialogProvider.web.js.map +1 -0
  10. package/lib/commonjs/dialog/Dialog.js +197 -100
  11. package/lib/commonjs/dialog/Dialog.js.map +1 -1
  12. package/lib/commonjs/dialog/Dialog.web.js +194 -84
  13. package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
  14. package/lib/commonjs/dialog/SheetShell.js +149 -0
  15. package/lib/commonjs/dialog/SheetShell.js.map +1 -0
  16. package/lib/commonjs/dialog/alert-store.js +116 -0
  17. package/lib/commonjs/dialog/alert-store.js.map +1 -0
  18. package/lib/commonjs/dialog/alert.js +38 -0
  19. package/lib/commonjs/dialog/alert.js.map +1 -0
  20. package/lib/commonjs/dialog/context.js +10 -2
  21. package/lib/commonjs/dialog/context.js.map +1 -1
  22. package/lib/commonjs/dialog/index.js +8 -24
  23. package/lib/commonjs/dialog/index.js.map +1 -1
  24. package/lib/commonjs/dialog/index.web.js +10 -20
  25. package/lib/commonjs/dialog/index.web.js.map +1 -1
  26. package/lib/commonjs/index.js +101 -66
  27. package/lib/commonjs/index.js.map +1 -1
  28. package/lib/commonjs/index.web.js +101 -66
  29. package/lib/commonjs/index.web.js.map +1 -1
  30. package/lib/commonjs/menu/index.js +21 -23
  31. package/lib/commonjs/menu/index.js.map +1 -1
  32. package/lib/commonjs/select/index.js +26 -27
  33. package/lib/commonjs/select/index.js.map +1 -1
  34. package/lib/commonjs/toast/index.js +42 -13
  35. package/lib/commonjs/toast/index.js.map +1 -1
  36. package/lib/commonjs/toast/index.web.js +19 -15
  37. package/lib/commonjs/toast/index.web.js.map +1 -1
  38. package/lib/module/bottom-sheet/index.js +341 -98
  39. package/lib/module/bottom-sheet/index.js.map +1 -1
  40. package/lib/module/context-menu/index.js +15 -16
  41. package/lib/module/context-menu/index.js.map +1 -1
  42. package/lib/module/dialog/BloomDialogProvider.js +57 -0
  43. package/lib/module/dialog/BloomDialogProvider.js.map +1 -0
  44. package/lib/module/dialog/BloomDialogProvider.web.js +41 -0
  45. package/lib/module/dialog/BloomDialogProvider.web.js.map +1 -0
  46. package/lib/module/dialog/Dialog.js +199 -87
  47. package/lib/module/dialog/Dialog.js.map +1 -1
  48. package/lib/module/dialog/Dialog.web.js +195 -70
  49. package/lib/module/dialog/Dialog.web.js.map +1 -1
  50. package/lib/module/dialog/SheetShell.js +143 -0
  51. package/lib/module/dialog/SheetShell.js.map +1 -0
  52. package/lib/module/dialog/alert-store.js +107 -0
  53. package/lib/module/dialog/alert-store.js.map +1 -0
  54. package/lib/module/dialog/alert.js +35 -0
  55. package/lib/module/dialog/alert.js.map +1 -0
  56. package/lib/module/dialog/context.js +10 -2
  57. package/lib/module/dialog/context.js.map +1 -1
  58. package/lib/module/dialog/index.js +3 -1
  59. package/lib/module/dialog/index.js.map +1 -1
  60. package/lib/module/dialog/index.web.js +9 -7
  61. package/lib/module/dialog/index.web.js.map +1 -1
  62. package/lib/module/index.js +2 -3
  63. package/lib/module/index.js.map +1 -1
  64. package/lib/module/index.web.js +2 -3
  65. package/lib/module/index.web.js.map +1 -1
  66. package/lib/module/menu/index.js +11 -13
  67. package/lib/module/menu/index.js.map +1 -1
  68. package/lib/module/select/index.js +27 -28
  69. package/lib/module/select/index.js.map +1 -1
  70. package/lib/module/toast/index.js +41 -11
  71. package/lib/module/toast/index.js.map +1 -1
  72. package/lib/module/toast/index.web.js +18 -13
  73. package/lib/module/toast/index.web.js.map +1 -1
  74. package/lib/typescript/commonjs/__tests__/Dialog.test.d.ts +2 -0
  75. package/lib/typescript/commonjs/__tests__/Dialog.test.d.ts.map +1 -0
  76. package/lib/typescript/commonjs/bottom-sheet/index.d.ts +47 -1
  77. package/lib/typescript/commonjs/bottom-sheet/index.d.ts.map +1 -1
  78. package/lib/typescript/commonjs/context-menu/index.d.ts +4 -3
  79. package/lib/typescript/commonjs/context-menu/index.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/dialog/BloomDialogProvider.d.ts +27 -0
  81. package/lib/typescript/commonjs/dialog/BloomDialogProvider.d.ts.map +1 -0
  82. package/lib/typescript/commonjs/dialog/BloomDialogProvider.web.d.ts +15 -0
  83. package/lib/typescript/commonjs/dialog/BloomDialogProvider.web.d.ts.map +1 -0
  84. package/lib/typescript/commonjs/dialog/Dialog.d.ts +37 -10
  85. package/lib/typescript/commonjs/dialog/Dialog.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/dialog/Dialog.web.d.ts +26 -10
  87. package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/dialog/SheetShell.d.ts +31 -0
  89. package/lib/typescript/commonjs/dialog/SheetShell.d.ts.map +1 -0
  90. package/lib/typescript/commonjs/dialog/alert-store.d.ts +70 -0
  91. package/lib/typescript/commonjs/dialog/alert-store.d.ts.map +1 -0
  92. package/lib/typescript/commonjs/dialog/alert.d.ts +27 -0
  93. package/lib/typescript/commonjs/dialog/alert.d.ts.map +1 -0
  94. package/lib/typescript/commonjs/dialog/context.d.ts +7 -0
  95. package/lib/typescript/commonjs/dialog/context.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/dialog/index.d.ts +5 -2
  97. package/lib/typescript/commonjs/dialog/index.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/dialog/index.web.d.ts +5 -2
  99. package/lib/typescript/commonjs/dialog/index.web.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/dialog/types.d.ts +70 -15
  101. package/lib/typescript/commonjs/dialog/types.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/index.d.ts +3 -3
  103. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/index.web.d.ts +3 -3
  105. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  106. package/lib/typescript/commonjs/menu/index.d.ts +4 -4
  107. package/lib/typescript/commonjs/menu/index.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/select/index.d.ts.map +1 -1
  109. package/lib/typescript/commonjs/toast/index.d.ts +32 -3
  110. package/lib/typescript/commonjs/toast/index.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/toast/index.web.d.ts +14 -7
  112. package/lib/typescript/commonjs/toast/index.web.d.ts.map +1 -1
  113. package/lib/typescript/module/__tests__/Dialog.test.d.ts +2 -0
  114. package/lib/typescript/module/__tests__/Dialog.test.d.ts.map +1 -0
  115. package/lib/typescript/module/bottom-sheet/index.d.ts +47 -1
  116. package/lib/typescript/module/bottom-sheet/index.d.ts.map +1 -1
  117. package/lib/typescript/module/context-menu/index.d.ts +4 -3
  118. package/lib/typescript/module/context-menu/index.d.ts.map +1 -1
  119. package/lib/typescript/module/dialog/BloomDialogProvider.d.ts +27 -0
  120. package/lib/typescript/module/dialog/BloomDialogProvider.d.ts.map +1 -0
  121. package/lib/typescript/module/dialog/BloomDialogProvider.web.d.ts +15 -0
  122. package/lib/typescript/module/dialog/BloomDialogProvider.web.d.ts.map +1 -0
  123. package/lib/typescript/module/dialog/Dialog.d.ts +37 -10
  124. package/lib/typescript/module/dialog/Dialog.d.ts.map +1 -1
  125. package/lib/typescript/module/dialog/Dialog.web.d.ts +26 -10
  126. package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
  127. package/lib/typescript/module/dialog/SheetShell.d.ts +31 -0
  128. package/lib/typescript/module/dialog/SheetShell.d.ts.map +1 -0
  129. package/lib/typescript/module/dialog/alert-store.d.ts +70 -0
  130. package/lib/typescript/module/dialog/alert-store.d.ts.map +1 -0
  131. package/lib/typescript/module/dialog/alert.d.ts +27 -0
  132. package/lib/typescript/module/dialog/alert.d.ts.map +1 -0
  133. package/lib/typescript/module/dialog/context.d.ts +7 -0
  134. package/lib/typescript/module/dialog/context.d.ts.map +1 -1
  135. package/lib/typescript/module/dialog/index.d.ts +5 -2
  136. package/lib/typescript/module/dialog/index.d.ts.map +1 -1
  137. package/lib/typescript/module/dialog/index.web.d.ts +5 -2
  138. package/lib/typescript/module/dialog/index.web.d.ts.map +1 -1
  139. package/lib/typescript/module/dialog/types.d.ts +70 -15
  140. package/lib/typescript/module/dialog/types.d.ts.map +1 -1
  141. package/lib/typescript/module/index.d.ts +3 -3
  142. package/lib/typescript/module/index.d.ts.map +1 -1
  143. package/lib/typescript/module/index.web.d.ts +3 -3
  144. package/lib/typescript/module/index.web.d.ts.map +1 -1
  145. package/lib/typescript/module/menu/index.d.ts +4 -4
  146. package/lib/typescript/module/menu/index.d.ts.map +1 -1
  147. package/lib/typescript/module/select/index.d.ts.map +1 -1
  148. package/lib/typescript/module/toast/index.d.ts +32 -3
  149. package/lib/typescript/module/toast/index.d.ts.map +1 -1
  150. package/lib/typescript/module/toast/index.web.d.ts +14 -7
  151. package/lib/typescript/module/toast/index.web.d.ts.map +1 -1
  152. package/package.json +3 -14
  153. package/src/__tests__/BottomSheet.test.tsx +149 -2
  154. package/src/__tests__/Dialog.test.tsx +177 -0
  155. package/src/bottom-sheet/index.tsx +367 -83
  156. package/src/context-menu/index.tsx +12 -12
  157. package/src/dialog/BloomDialogProvider.tsx +61 -0
  158. package/src/dialog/BloomDialogProvider.web.tsx +46 -0
  159. package/src/dialog/Dialog.tsx +217 -64
  160. package/src/dialog/Dialog.web.tsx +240 -75
  161. package/src/dialog/SheetShell.tsx +154 -0
  162. package/src/dialog/alert-store.ts +126 -0
  163. package/src/dialog/alert.ts +42 -0
  164. package/src/dialog/context.ts +14 -3
  165. package/src/dialog/index.ts +14 -2
  166. package/src/dialog/index.web.ts +20 -8
  167. package/src/dialog/types.ts +73 -16
  168. package/src/index.ts +17 -3
  169. package/src/index.web.ts +17 -3
  170. package/src/menu/index.tsx +13 -17
  171. package/src/select/index.tsx +30 -30
  172. package/src/toast/index.tsx +55 -11
  173. package/src/toast/index.web.tsx +33 -13
  174. package/lib/commonjs/prompt/Prompt.js +0 -267
  175. package/lib/commonjs/prompt/Prompt.js.map +0 -1
  176. package/lib/commonjs/prompt/index.js +0 -61
  177. package/lib/commonjs/prompt/index.js.map +0 -1
  178. package/lib/module/prompt/Prompt.js +0 -250
  179. package/lib/module/prompt/Prompt.js.map +0 -1
  180. package/lib/module/prompt/index.js +0 -4
  181. package/lib/module/prompt/index.js.map +0 -1
  182. package/lib/typescript/commonjs/prompt/Prompt.d.ts +0 -42
  183. package/lib/typescript/commonjs/prompt/Prompt.d.ts.map +0 -1
  184. package/lib/typescript/commonjs/prompt/index.d.ts +0 -3
  185. package/lib/typescript/commonjs/prompt/index.d.ts.map +0 -1
  186. package/lib/typescript/module/prompt/Prompt.d.ts +0 -42
  187. package/lib/typescript/module/prompt/Prompt.d.ts.map +0 -1
  188. package/lib/typescript/module/prompt/index.d.ts +0 -3
  189. package/lib/typescript/module/prompt/index.d.ts.map +0 -1
  190. package/src/prompt/Prompt.tsx +0 -247
  191. package/src/prompt/index.ts +0 -13
@@ -0,0 +1,177 @@
1
+ import React from 'react';
2
+ import { Text } from 'react-native';
3
+ import { act, fireEvent, render } from '@testing-library/react-native';
4
+
5
+ import {
6
+ alert,
7
+ BloomDialogProvider,
8
+ Dialog,
9
+ useDialogControl,
10
+ } from '../dialog';
11
+ import { dismissAlert, getAlertQueue } from '../dialog/alert-store';
12
+ import { BloomThemeProvider } from '../theme/BloomThemeProvider';
13
+
14
+ function renderWithTheme(ui: React.ReactElement) {
15
+ return render(
16
+ <BloomThemeProvider mode="light" colorPreset="teal">
17
+ {ui}
18
+ </BloomThemeProvider>,
19
+ );
20
+ }
21
+
22
+ function Harness({
23
+ children,
24
+ onControl,
25
+ }: {
26
+ children?: (control: ReturnType<typeof useDialogControl>) => React.ReactNode;
27
+ onControl?: (control: ReturnType<typeof useDialogControl>) => void;
28
+ }) {
29
+ const control = useDialogControl();
30
+ React.useEffect(() => {
31
+ onControl?.(control);
32
+ }, [control, onControl]);
33
+ return <>{children?.(control)}</>;
34
+ }
35
+
36
+ describe('Dialog (unified API)', () => {
37
+ it('does not render content until control.open() is called', () => {
38
+ const { queryByText } = renderWithTheme(
39
+ <Harness>
40
+ {(control) => (
41
+ <Dialog control={control} title="Hidden until opened">
42
+ <Text>Body</Text>
43
+ </Dialog>
44
+ )}
45
+ </Harness>,
46
+ );
47
+ expect(queryByText('Hidden until opened')).toBeNull();
48
+ expect(queryByText('Body')).toBeNull();
49
+ });
50
+
51
+ it('renders declarative title + description + actions when opened', () => {
52
+ let control: ReturnType<typeof useDialogControl> | undefined;
53
+ const onDelete = jest.fn();
54
+ const { getByText } = renderWithTheme(
55
+ <Harness onControl={(c) => { control = c; }}>
56
+ {(c) => (
57
+ <Dialog
58
+ control={c}
59
+ title="Delete item?"
60
+ description="This action cannot be undone."
61
+ actions={[
62
+ { label: 'Delete', color: 'destructive', onPress: onDelete },
63
+ { label: 'Cancel', color: 'cancel' },
64
+ ]}
65
+ />
66
+ )}
67
+ </Harness>,
68
+ );
69
+ act(() => { control?.open(); });
70
+ expect(getByText('Delete item?')).toBeTruthy();
71
+ expect(getByText('This action cannot be undone.')).toBeTruthy();
72
+ expect(getByText('Delete')).toBeTruthy();
73
+ expect(getByText('Cancel')).toBeTruthy();
74
+ });
75
+
76
+ it('renders custom children alongside the declarative header', () => {
77
+ let control: ReturnType<typeof useDialogControl> | undefined;
78
+ const { getByText } = renderWithTheme(
79
+ <Harness onControl={(c) => { control = c; }}>
80
+ {(c) => (
81
+ <Dialog control={c} title="Pick a tag">
82
+ <Text>Custom body content</Text>
83
+ </Dialog>
84
+ )}
85
+ </Harness>,
86
+ );
87
+ act(() => { control?.open(); });
88
+ expect(getByText('Pick a tag')).toBeTruthy();
89
+ expect(getByText('Custom body content')).toBeTruthy();
90
+ });
91
+
92
+ it('fires the action onPress after the dialog finishes closing', () => {
93
+ let control: ReturnType<typeof useDialogControl> | undefined;
94
+ const onConfirm = jest.fn();
95
+ const { getByText } = renderWithTheme(
96
+ <Harness onControl={(c) => { control = c; }}>
97
+ {(c) => (
98
+ <Dialog
99
+ control={c}
100
+ title="Confirm?"
101
+ actions={[
102
+ { label: 'Confirm', onPress: onConfirm },
103
+ ]}
104
+ />
105
+ )}
106
+ </Harness>,
107
+ );
108
+ act(() => { control?.open(); });
109
+ act(() => {
110
+ fireEvent.press(getByText('Confirm'));
111
+ });
112
+ expect(onConfirm).toHaveBeenCalledTimes(1);
113
+ });
114
+ });
115
+
116
+ describe('alert() helper', () => {
117
+ // The alert store is module-scope; ensure no cross-test contamination by
118
+ // draining anything left over from prior tests before each new run.
119
+ beforeEach(() => {
120
+ while (getAlertQueue().length > 0) {
121
+ const head = getAlertQueue()[0];
122
+ if (head) dismissAlert(head.id);
123
+ }
124
+ });
125
+
126
+ it('queues alerts before any provider mounts and drains them on subscribe', () => {
127
+ // Call alert() *before* the provider mounts — entry should sit in the
128
+ // queue until a subscriber attaches, at which point the head is
129
+ // rendered.
130
+ alert('Pending', 'Was queued before provider', [
131
+ { text: 'OK' },
132
+ ]);
133
+ expect(getAlertQueue().length).toBe(1);
134
+
135
+ const { getByText } = renderWithTheme(
136
+ <BloomDialogProvider>
137
+ <Text>app body</Text>
138
+ </BloomDialogProvider>,
139
+ );
140
+ // The queued entry now renders inside the provider.
141
+ expect(getByText('Pending')).toBeTruthy();
142
+ expect(getByText('Was queued before provider')).toBeTruthy();
143
+ expect(getByText('OK')).toBeTruthy();
144
+ });
145
+
146
+ it('defaults to a single OK button when no buttons are passed', () => {
147
+ const { getByText } = renderWithTheme(
148
+ <BloomDialogProvider>
149
+ <Text>app</Text>
150
+ </BloomDialogProvider>,
151
+ );
152
+ act(() => {
153
+ alert('Hello');
154
+ });
155
+ expect(getByText('Hello')).toBeTruthy();
156
+ expect(getByText('OK')).toBeTruthy();
157
+ });
158
+
159
+ it('invokes the button onPress when tapped', () => {
160
+ const onPress = jest.fn();
161
+ const { getByText } = renderWithTheme(
162
+ <BloomDialogProvider>
163
+ <Text>app</Text>
164
+ </BloomDialogProvider>,
165
+ );
166
+ act(() => {
167
+ alert('Sign out?', undefined, [
168
+ { text: 'Cancel', style: 'cancel' },
169
+ { text: 'Sign out', style: 'destructive', onPress },
170
+ ]);
171
+ });
172
+ act(() => {
173
+ fireEvent.press(getByText('Sign out'));
174
+ });
175
+ expect(onPress).toHaveBeenCalledTimes(1);
176
+ });
177
+ });