ferns-ui 1.16.1 → 2.0.0-beta.2

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 (184) hide show
  1. package/dist/Accordion.js +2 -7
  2. package/dist/Accordion.js.map +1 -1
  3. package/dist/ActionSheet.js +11 -14
  4. package/dist/ActionSheet.js.map +1 -1
  5. package/dist/AddressField.js +1 -1
  6. package/dist/AddressField.js.map +1 -1
  7. package/dist/Badge.js +1 -1
  8. package/dist/Badge.js.map +1 -1
  9. package/dist/Banner.js +1 -1
  10. package/dist/Banner.js.map +1 -1
  11. package/dist/Box.js +3 -3
  12. package/dist/Box.js.map +1 -1
  13. package/dist/Button.js +1 -0
  14. package/dist/Button.js.map +1 -1
  15. package/dist/CheckBox.js.map +1 -1
  16. package/dist/Common.d.ts +9 -13
  17. package/dist/Common.js.map +1 -1
  18. package/dist/DataTable.js +2 -1
  19. package/dist/DataTable.js.map +1 -1
  20. package/dist/DateTimeField.js +22 -22
  21. package/dist/DateTimeField.js.map +1 -1
  22. package/dist/EmailField.js +37 -17
  23. package/dist/EmailField.js.map +1 -1
  24. package/dist/ErrorBoundary.d.ts +1 -1
  25. package/dist/FernsProvider.js +1 -1
  26. package/dist/FernsProvider.js.map +1 -1
  27. package/dist/Heading.js +1 -3
  28. package/dist/Heading.js.map +1 -1
  29. package/dist/Hyperlink.js +1 -1
  30. package/dist/Hyperlink.js.map +1 -1
  31. package/dist/IconButton.js +1 -1
  32. package/dist/IconButton.js.map +1 -1
  33. package/dist/Image.js.map +1 -1
  34. package/dist/MobileAddressAutoComplete.js +1 -1
  35. package/dist/MobileAddressAutoComplete.js.map +1 -1
  36. package/dist/Modal.d.ts +1 -1
  37. package/dist/Modal.js +15 -35
  38. package/dist/Modal.js.map +1 -1
  39. package/dist/ModalSheet.d.ts +1 -1
  40. package/dist/ModalSheet.js +1 -1
  41. package/dist/ModalSheet.js.map +1 -1
  42. package/dist/NumberField.js +4 -10
  43. package/dist/NumberField.js.map +1 -1
  44. package/dist/NumberPickerActionSheet.d.ts +3 -1
  45. package/dist/NumberPickerActionSheet.js +3 -0
  46. package/dist/NumberPickerActionSheet.js.map +1 -1
  47. package/dist/Page.js +1 -1
  48. package/dist/Page.js.map +1 -1
  49. package/dist/Pagination.js +2 -2
  50. package/dist/Pagination.js.map +1 -1
  51. package/dist/Permissions.d.ts +1 -1
  52. package/dist/Permissions.js +2 -2
  53. package/dist/Permissions.js.map +1 -1
  54. package/dist/PickerSelect.js +1 -1
  55. package/dist/PickerSelect.js.map +1 -1
  56. package/dist/SectionDivider.js +1 -1
  57. package/dist/SectionDivider.js.map +1 -1
  58. package/dist/SegmentedControl.js.map +1 -1
  59. package/dist/Signature.native.js +2 -2
  60. package/dist/Signature.native.js.map +1 -1
  61. package/dist/SignatureField.js +2 -2
  62. package/dist/SignatureField.js.map +1 -1
  63. package/dist/Slider.js +3 -3
  64. package/dist/Slider.js.map +1 -1
  65. package/dist/SplitPage.js +7 -7
  66. package/dist/SplitPage.js.map +1 -1
  67. package/dist/SplitPage.native.js +6 -4
  68. package/dist/SplitPage.native.js.map +1 -1
  69. package/dist/TapToEdit.js +3 -3
  70. package/dist/TapToEdit.js.map +1 -1
  71. package/dist/Text.js +1 -1
  72. package/dist/Text.js.map +1 -1
  73. package/dist/TextFieldNumberActionSheet.d.ts +4 -2
  74. package/dist/TextFieldNumberActionSheet.js +4 -1
  75. package/dist/TextFieldNumberActionSheet.js.map +1 -1
  76. package/dist/Tooltip.js +21 -39
  77. package/dist/Tooltip.js.map +1 -1
  78. package/dist/Unifier.d.ts +1 -0
  79. package/dist/Unifier.js.map +1 -1
  80. package/dist/Utilities.d.ts +1 -1
  81. package/dist/Utilities.js +3 -2
  82. package/dist/Utilities.js.map +1 -1
  83. package/dist/WebAddressAutocomplete.js +1 -2
  84. package/dist/WebAddressAutocomplete.js.map +1 -1
  85. package/dist/index.d.ts +10 -10
  86. package/dist/index.js +9 -10
  87. package/dist/index.js.map +1 -1
  88. package/dist/jestSetup.d.ts +0 -0
  89. package/dist/jestSetup.js +21 -0
  90. package/dist/jestSetup.js.map +1 -0
  91. package/dist/setupTests.js +22 -0
  92. package/dist/setupTests.js.map +1 -1
  93. package/dist/table/Table.js +15 -14
  94. package/dist/table/Table.js.map +1 -1
  95. package/dist/table/TableHeaderCell.js +2 -2
  96. package/dist/table/TableHeaderCell.js.map +1 -1
  97. package/dist/test-utils.d.ts +4 -1
  98. package/dist/useStoredState.js +2 -4
  99. package/dist/useStoredState.js.map +1 -1
  100. package/package.json +106 -43
  101. package/src/Accordion.tsx +1 -7
  102. package/src/ActionSheet.tsx +22 -26
  103. package/src/AddressField.tsx +1 -1
  104. package/src/Avatar.test.tsx +0 -2
  105. package/src/Badge.tsx +1 -1
  106. package/src/Banner.tsx +1 -1
  107. package/src/Box.test.tsx +70 -71
  108. package/src/Box.tsx +9 -21
  109. package/src/Button.tsx +1 -0
  110. package/src/CheckBox.tsx +1 -7
  111. package/src/Common.ts +21 -14
  112. package/src/DataTable.tsx +4 -3
  113. package/src/DateTimeField.tsx +22 -22
  114. package/src/EmailField.tsx +42 -22
  115. package/src/FernsProvider.tsx +4 -1
  116. package/src/Heading.tsx +1 -3
  117. package/src/Hyperlink.tsx +2 -2
  118. package/src/IconButton.tsx +2 -2
  119. package/src/Image.tsx +0 -1
  120. package/src/MobileAddressAutoComplete.tsx +1 -1
  121. package/src/Modal.tsx +21 -58
  122. package/src/ModalSheet.tsx +1 -1
  123. package/src/NumberField.tsx +4 -10
  124. package/src/NumberPickerActionSheet.tsx +5 -1
  125. package/src/Page.tsx +1 -1
  126. package/src/Pagination.tsx +11 -2
  127. package/src/Permissions.ts +2 -2
  128. package/src/PickerSelect.tsx +1 -1
  129. package/src/SectionDivider.tsx +1 -1
  130. package/src/SegmentedControl.tsx +1 -3
  131. package/src/Signature.native.tsx +2 -2
  132. package/src/SignatureField.tsx +2 -2
  133. package/src/Slider.tsx +17 -10
  134. package/src/SplitPage.native.tsx +4 -2
  135. package/src/SplitPage.tsx +4 -4
  136. package/src/TapToEdit.tsx +7 -3
  137. package/src/Text.tsx +1 -1
  138. package/src/TextArea.test.tsx +43 -27
  139. package/src/TextField.test.tsx +4 -3
  140. package/src/TextFieldNumberActionSheet.tsx +7 -3
  141. package/src/Tooltip.tsx +29 -45
  142. package/src/Unifier.ts +3 -1
  143. package/src/Utilities.tsx +4 -3
  144. package/src/WebAddressAutocomplete.tsx +1 -1
  145. package/src/index.tsx +10 -11
  146. package/src/jestSetup.ts +16 -0
  147. package/src/setupTests.ts +24 -0
  148. package/src/table/Table.tsx +38 -36
  149. package/src/table/TableHeaderCell.tsx +2 -2
  150. package/src/useStoredState.ts +11 -13
  151. package/dist/Accordion.test.d.ts +0 -1
  152. package/dist/Accordion.test.js +0 -71
  153. package/dist/Accordion.test.js.map +0 -1
  154. package/dist/AddressField.test.d.ts +0 -1
  155. package/dist/AddressField.test.js +0 -65
  156. package/dist/AddressField.test.js.map +0 -1
  157. package/dist/Avatar.test.d.ts +0 -1
  158. package/dist/Avatar.test.js +0 -131
  159. package/dist/Avatar.test.js.map +0 -1
  160. package/dist/Badge.test.d.ts +0 -1
  161. package/dist/Badge.test.js +0 -76
  162. package/dist/Badge.test.js.map +0 -1
  163. package/dist/Box.test.d.ts +0 -1
  164. package/dist/Box.test.js +0 -528
  165. package/dist/Box.test.js.map +0 -1
  166. package/dist/DateTimeField.test.d.ts +0 -1
  167. package/dist/DateTimeField.test.js +0 -258
  168. package/dist/DateTimeField.test.js.map +0 -1
  169. package/dist/DateUtilities.test.d.ts +0 -1
  170. package/dist/DateUtilities.test.js +0 -279
  171. package/dist/DateUtilities.test.js.map +0 -1
  172. package/dist/MarkdownView.d.ts +0 -5
  173. package/dist/MarkdownView.js +0 -44
  174. package/dist/MarkdownView.js.map +0 -1
  175. package/dist/TextArea.test.d.ts +0 -1
  176. package/dist/TextArea.test.js +0 -146
  177. package/dist/TextArea.test.js.map +0 -1
  178. package/dist/TextField.test.d.ts +0 -1
  179. package/dist/TextField.test.js +0 -251
  180. package/dist/TextField.test.js.map +0 -1
  181. package/dist/useStoredState.test.d.ts +0 -1
  182. package/dist/useStoredState.test.js +0 -93
  183. package/dist/useStoredState.test.js.map +0 -1
  184. package/src/MarkdownView.tsx +0 -67
package/src/index.tsx CHANGED
@@ -34,7 +34,6 @@ export * from "./ImageBackground";
34
34
  export * from "./InfoModalIcon";
35
35
  export * from "./InfoTooltipButton";
36
36
  export * from "./Link";
37
- export * from "./MarkdownView";
38
37
  export * from "./MediaQuery";
39
38
  export * from "./MobileAddressAutoComplete";
40
39
  export * from "./Modal";
@@ -60,17 +59,11 @@ export * from "./SignatureField";
60
59
  export * from "./Slider";
61
60
  export * from "./Spinner";
62
61
  export * from "./SplitPage";
63
- export * from "./TapToEdit";
64
- export * from "./Text";
65
- export * from "./TextArea";
66
- export * from "./TextField";
67
- export * from "./Theme";
68
- export * from "./Toast";
69
- export * from "./Tooltip";
70
62
  export * from "./table/Table";
71
63
  export * from "./table/Table";
72
64
  export * from "./table/TableBadge";
73
65
  export * from "./table/TableBoolean";
66
+ export * from "./table/tableContext";
74
67
  export * from "./table/TableDate";
75
68
  export * from "./table/TableHeader";
76
69
  export * from "./table/TableHeaderCell";
@@ -79,13 +72,18 @@ export * from "./table/TableNumber";
79
72
  export * from "./table/TableRow";
80
73
  export * from "./table/TableText";
81
74
  export * from "./table/TableTitle";
82
- export * from "./table/tableContext";
75
+ export * from "./TapToEdit";
76
+ export * from "./Text";
77
+ export * from "./TextArea";
78
+ export * from "./TextField";
79
+ export * from "./Theme";
80
+ export * from "./Toast";
81
+ export * from "./Tooltip";
83
82
  export * from "./UnifiedAddressAutoComplete";
84
83
  export * from "./Unifier";
85
- export * from "./Utilities";
86
84
  export * from "./useStoredState";
85
+ export * from "./Utilities";
87
86
  export * from "./WebAddressAutocomplete";
88
-
89
87
  // export * from "./Layout";
90
88
  // export * from "./Drawer";
91
89
  // export * from "./Chart";
@@ -1372,3 +1370,4 @@ export interface Options {
1372
1370
  */
1373
1371
  blurOnUnmount?: boolean;
1374
1372
  }
1373
+ export {};
@@ -0,0 +1,16 @@
1
+ // This runs before jest-expo's setup, so we need to initialize globalThis.expo early
2
+ // Mock expo-modules-core global
3
+ if (typeof globalThis.expo === "undefined") {
4
+ const EventEmitterClass = class EventEmitter {
5
+ addListener = jest.fn();
6
+ removeListener = jest.fn();
7
+ removeAllListeners = jest.fn();
8
+ emit = jest.fn();
9
+ };
10
+
11
+ globalThis.expo = {
12
+ EventEmitter: EventEmitterClass,
13
+ NativeModule: class NativeModule {},
14
+ SharedObject: class SharedObject {},
15
+ } as any;
16
+ }
package/src/setupTests.ts CHANGED
@@ -79,6 +79,30 @@ jest.mock("expo-image-picker", () => ({
79
79
  },
80
80
  }));
81
81
 
82
+ // Mock expo-haptics
83
+ jest.mock("expo-haptics", () => ({
84
+ ImpactFeedbackStyle: {
85
+ Light: "light",
86
+ Medium: "medium",
87
+ Heavy: "heavy",
88
+ },
89
+ NotificationFeedbackType: {
90
+ Success: "success",
91
+ Warning: "warning",
92
+ Error: "error",
93
+ },
94
+ impactAsync: jest.fn(),
95
+ notificationAsync: jest.fn(),
96
+ selectionAsync: jest.fn(),
97
+ }));
98
+
99
+ // Mock expo-clipboard
100
+ jest.mock("expo-clipboard", () => ({
101
+ getStringAsync: jest.fn().mockResolvedValue(""),
102
+ setStringAsync: jest.fn().mockResolvedValue(undefined),
103
+ hasStringAsync: jest.fn().mockResolvedValue(false),
104
+ }));
105
+
82
106
  // Make sure we can test date/time functionality
83
107
  global.Date.now = jest.fn(() => new Date("2023-05-15T10:30:00.000Z").getTime());
84
108
 
@@ -3,7 +3,7 @@ import {ScrollView} from "react-native";
3
3
  import {DimensionValue} from "react-native/Libraries/StyleSheet/StyleSheetTypes";
4
4
 
5
5
  import {Box} from "../Box";
6
- import {ColumnSortInterface, TableProps} from "../Common";
6
+ import {ColumnSortInterface, TableProps, TableRowProps} from "../Common";
7
7
  import {Pagination} from "../Pagination";
8
8
  import {TableContextProvider} from "./tableContext";
9
9
 
@@ -30,7 +30,7 @@ export const Table = ({
30
30
  // Check if any of the rows below have a drawerContents prop to see if we need to render space
31
31
  // for the caret.
32
32
  const hasDrawerContents = arrayChildren.some((child) => {
33
- return (child as ReactElement).props?.drawerContents;
33
+ return (child as ReactElement<TableRowProps>).props?.drawerContents;
34
34
  });
35
35
 
36
36
  // Calculate the total width of the table. If the table has only number widths, calculate a
@@ -68,42 +68,44 @@ export const Table = ({
68
68
  sortColumn={sortColumn}
69
69
  stickyHeader={stickyHeader}
70
70
  >
71
- <Box
72
- flex="grow"
73
- maxWidth="100%"
74
- style={{
75
- position: "relative",
76
- }}
77
- width={width}
78
- >
79
- <ScrollView horizontal style={{width, maxWidth: "100%"}}>
80
- {/* TODO: Replace table scrollview with flat list */}
81
- <ScrollView
82
- // nestedScrollEnabled
83
- stickyHeaderIndices={stickyHeader ? [0] : undefined}
84
- style={{width, maxWidth: "100%", flex: 1, maxHeight}}
85
- >
86
- {Children.map(
87
- children,
88
- (child, index) =>
89
- Boolean(child) &&
90
- React.cloneElement(child as ReactElement, {
91
- color: index % 2 === 1 && alternateRowBackground ? "neutralLight" : "base",
92
- })
93
- )}
71
+ <>
72
+ <Box
73
+ flex="grow"
74
+ maxWidth="100%"
75
+ style={{
76
+ position: "relative",
77
+ }}
78
+ width={width}
79
+ >
80
+ <ScrollView horizontal style={{width, maxWidth: "100%"}}>
81
+ {/* TODO: Replace table scrollview with flat list */}
82
+ <ScrollView
83
+ // nestedScrollEnabled
84
+ stickyHeaderIndices={stickyHeader ? [0] : undefined}
85
+ style={{width, maxWidth: "100%", flex: 1, maxHeight}}
86
+ >
87
+ {Children.map(
88
+ children,
89
+ (child, index) =>
90
+ Boolean(child) &&
91
+ React.cloneElement(child as ReactElement<TableRowProps>, {
92
+ color: index % 2 === 1 && alternateRowBackground ? "neutralLight" : "base",
93
+ })
94
+ )}
95
+ </ScrollView>
94
96
  </ScrollView>
95
- </ScrollView>
96
- </Box>
97
- {Boolean(shouldPaginate && totalPages !== undefined) && (
98
- <Box alignItems="center" borderTop="default" direction="row" height={60} paddingX={8}>
99
- <Pagination
100
- page={propsPage ?? page}
101
- setPage={propsSetPage ?? setPage}
102
- totalPages={totalPages!}
103
- />
104
- {Boolean(extraControls) && extraControls}
105
97
  </Box>
106
- )}
98
+ {Boolean(shouldPaginate && totalPages !== undefined) && (
99
+ <Box alignItems="center" borderTop="default" direction="row" height={60} paddingX={8}>
100
+ <Pagination
101
+ page={propsPage ?? page}
102
+ setPage={propsSetPage ?? setPage}
103
+ totalPages={totalPages!}
104
+ />
105
+ {Boolean(extraControls) && extraControls}
106
+ </Box>
107
+ )}
108
+ </>
107
109
  </TableContextProvider>
108
110
  );
109
111
  };
@@ -6,8 +6,8 @@ import {View} from "react-native";
6
6
  import {Box} from "../Box";
7
7
  import {AlignItems, TableHeaderCellProps} from "../Common";
8
8
  import {useTheme} from "../Theme";
9
- import {TableTitle} from "./TableTitle";
10
9
  import {useTableContext} from "./tableContext";
10
+ import {TableTitle} from "./TableTitle";
11
11
 
12
12
  /**
13
13
  * Use TableHeaderCell to define a header cell in Table.
@@ -48,7 +48,7 @@ export const TableHeaderCell = ({
48
48
  if (setSortColumn) {
49
49
  setSortColumn(newSort ? {column: index, direction: newSort} : undefined);
50
50
  }
51
- onSortChange?.(newSort);
51
+ onSortChange && onSortChange(newSort);
52
52
  }, [index, onSortChange, setSortColumn, sort]);
53
53
 
54
54
  if (sortable && !onSortChange) {
@@ -22,19 +22,17 @@ export const useStoredState = <T>(
22
22
 
23
23
  // Fetch data when the component mounts
24
24
  useEffect(() => {
25
- void fetchData()
26
- .then((value) => {
27
- if (isMounted.current) {
28
- setState(value);
29
- setIsLoading(false);
30
- }
31
- })
32
- .catch((error) => {
33
- console.error("Error fetching data:", error);
34
- if (isMounted.current) {
35
- setIsLoading(false);
36
- }
37
- });
25
+ void fetchData().then((value) => {
26
+ if (isMounted.current) {
27
+ setState(value);
28
+ setIsLoading(false);
29
+ }
30
+ }).catch((error) => {
31
+ console.error("Error fetching data:", error);
32
+ if (isMounted.current) {
33
+ setIsLoading(false);
34
+ }
35
+ });
38
36
 
39
37
  return () => {
40
38
  isMounted.current = false;
@@ -1 +0,0 @@
1
- export {};
@@ -1,71 +0,0 @@
1
- import { fireEvent } from "@testing-library/react-native";
2
- import React from "react";
3
- import { Text } from "react-native";
4
- import { Accordion } from "./Accordion";
5
- import { renderWithTheme } from "./test-utils";
6
- describe("Accordion", () => {
7
- const defaultProps = {
8
- title: "Test Title",
9
- children: React.createElement(Text, { testID: "test-content" }, "Test Content"),
10
- };
11
- it("renders correctly with default props", () => {
12
- const { toJSON } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps)));
13
- expect(toJSON()).toMatchSnapshot();
14
- });
15
- it("renders title and children", () => {
16
- const { getByText, getByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { isCollapsed: false })));
17
- expect(getByText("Test Title")).toBeTruthy();
18
- expect(getByTestId("test-content")).toBeTruthy();
19
- });
20
- it("renders subtitle when provided", () => {
21
- const { getByText } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { subtitle: "Test Subtitle" })));
22
- expect(getByText("Test Subtitle")).toBeTruthy();
23
- });
24
- it("collapses when isCollapsed is true", () => {
25
- const { queryByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { isCollapsed: true })));
26
- expect(queryByTestId("test-content")).toBeNull();
27
- });
28
- it("expands when isCollapsed is false", () => {
29
- const { getByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { isCollapsed: false })));
30
- expect(getByTestId("test-content")).toBeTruthy();
31
- });
32
- it("toggles visibility when header is pressed", () => {
33
- const { queryByTestId, getByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { isCollapsed: false })));
34
- // Content should be visible initially
35
- expect(getByTestId("test-content")).toBeTruthy();
36
- // Click the toggle button
37
- const toggleButton = getByTestId("accordion-toggle");
38
- fireEvent.press(toggleButton);
39
- // Content should be hidden after click
40
- expect(queryByTestId("test-content")).toBeNull();
41
- });
42
- it("renders info modal icon when includeInfoModal is true and infoModalTitle is provided", () => {
43
- const { getByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { includeInfoModal: true, infoModalTitle: "Test Info Title" })));
44
- // The info modal icon should be present
45
- expect(getByTestId("info-icon")).toBeTruthy();
46
- });
47
- it("toggles content visibility when header is clicked", () => {
48
- const { getByTestId, queryByText, getByText } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { isCollapsed: false })));
49
- // Content should be visible initially
50
- expect(queryByText("Test Content")).toBeTruthy();
51
- // Click the header to collapse
52
- const toggleButton = getByTestId("accordion-toggle");
53
- fireEvent.press(toggleButton);
54
- // Content should be hidden after click
55
- expect(queryByText("Test Content")).toBeNull();
56
- // Click again to expand
57
- fireEvent.press(toggleButton);
58
- expect(getByText("Test Content")).toBeTruthy();
59
- });
60
- it("renders info modal icon when includeInfoModal is true and infoModalTitle is provided", () => {
61
- const { getByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { includeInfoModal: true, infoModalTitle: "Info Title" })));
62
- // The info modal icon should be present
63
- expect(getByTestId("info-icon")).toBeTruthy();
64
- });
65
- it("does not render info modal icon when includeInfoModal is false", () => {
66
- const { queryByTestId } = renderWithTheme(React.createElement(Accordion, Object.assign({}, defaultProps, { includeInfoModal: false, infoModalTitle: "Info Title" })));
67
- // The info modal icon should not be present
68
- expect(queryByTestId("info-icon")).toBeNull();
69
- });
70
- });
71
- //# sourceMappingURL=Accordion.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Accordion.test.js","sourceRoot":"","sources":["../src/Accordion.test.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,65 +0,0 @@
1
- import { fireEvent } from "@testing-library/react-native";
2
- import React from "react";
3
- import { AddressField } from "./AddressField";
4
- import { renderWithTheme } from "./test-utils";
5
- describe("AddressField", () => {
6
- const defaultProps = {
7
- testID: "test-address",
8
- value: {
9
- address1: "123 Main St",
10
- address2: "Apt 4B",
11
- city: "Springfield",
12
- state: "IL",
13
- zipcode: "62701",
14
- countyName: "Sangamon",
15
- countyCode: "17167",
16
- },
17
- onChange: jest.fn(),
18
- onBlur: jest.fn(),
19
- };
20
- it("renders correctly with default props", () => {
21
- const { toJSON } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps)));
22
- expect(toJSON()).toMatchSnapshot();
23
- });
24
- it("renders all address fields", () => {
25
- const { getByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps)));
26
- expect(getByTestId("test-address-address1")).toBeTruthy();
27
- expect(getByTestId("test-address-address2")).toBeTruthy();
28
- expect(getByTestId("test-address-city")).toBeTruthy();
29
- expect(getByTestId("test-address-zip")).toBeTruthy();
30
- });
31
- it("calls onChange when address fields are updated", () => {
32
- const { getByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps)));
33
- const cityInput = getByTestId("test-address-city");
34
- fireEvent.changeText(cityInput, "New City");
35
- expect(defaultProps.onChange).toHaveBeenCalledWith(Object.assign(Object.assign({}, defaultProps.value), { city: "New City" }));
36
- });
37
- it("calls onBlur when a field is blurred", () => {
38
- const { getByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps)));
39
- // Reset mock since it was called during render
40
- defaultProps.onBlur.mockClear();
41
- const zipInput = getByTestId("test-address-zip");
42
- fireEvent.changeText(zipInput, "90210");
43
- fireEvent(zipInput, "blur");
44
- expect(defaultProps.onBlur).toHaveBeenCalledWith(Object.assign(Object.assign({}, defaultProps.value), { zipcode: "90210" }));
45
- });
46
- it("renders county fields when includeCounty is true", () => {
47
- const { getByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps, { includeCounty: true })));
48
- expect(getByTestId("test-address-county")).toBeTruthy();
49
- expect(getByTestId("test-address-county-code")).toBeTruthy();
50
- });
51
- it("does not render county fields when includeCounty is false", () => {
52
- const { queryByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps, { includeCounty: false })));
53
- expect(queryByTestId("test-address-county")).toBeNull();
54
- expect(queryByTestId("test-address-county-code")).toBeNull();
55
- });
56
- it("disables all fields when disabled prop is true", () => {
57
- const { getByTestId } = renderWithTheme(React.createElement(AddressField, Object.assign({}, defaultProps, { disabled: true })));
58
- const address1Input = getByTestId("test-address-address1");
59
- const cityInput = getByTestId("test-address-city");
60
- // Check that the disabled prop is passed down to the inputs
61
- expect(address1Input.props.accessibilityState.disabled).toBe(true);
62
- expect(cityInput.props.accessibilityState.disabled).toBe(true);
63
- });
64
- });
65
- //# sourceMappingURL=AddressField.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AddressField.test.js","sourceRoot":"","sources":["../src/AddressField.test.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,131 +0,0 @@
1
- import { act, fireEvent } from "@testing-library/react-native";
2
- // import {ImageManipulator} from "expo-image-manipulator";
3
- // Import the actual implementation for SaveFormat
4
- import * as ImageManipulator from "expo-image-manipulator";
5
- import React from "react";
6
- import { Avatar } from "./Avatar";
7
- import { renderWithTheme } from "./test-utils";
8
- // Mock expo-image-picker
9
- jest.mock("expo-image-picker", () => ({
10
- launchImageLibraryAsync: jest.fn(),
11
- }));
12
- // Mock expo-image-manipulator
13
- const mockResize = jest.fn();
14
- const mockRenderAsync = jest.fn();
15
- const mockSaveAsync = jest.fn();
16
- jest.mock("expo-image-manipulator", () => {
17
- const actual = jest.requireActual("expo-image-manipulator");
18
- return Object.assign(Object.assign({}, actual), { ImageManipulator: {
19
- manipulate: jest.fn().mockImplementation(() => ({
20
- resize: mockResize.mockImplementation(() => ({
21
- renderAsync: mockRenderAsync.mockResolvedValue({
22
- saveAsync: mockSaveAsync.mockResolvedValue({
23
- uri: "test-uri",
24
- base64: "test-base64",
25
- }),
26
- }),
27
- })),
28
- })),
29
- }, SaveFormat: {
30
- PNG: "png",
31
- JPEG: "jpeg",
32
- } });
33
- });
34
- jest.mock("expo-image-picker", () => ({
35
- launchImageLibraryAsync: jest.fn().mockResolvedValue({
36
- canceled: false,
37
- assets: [
38
- {
39
- uri: "test-uri",
40
- width: 100,
41
- height: 100,
42
- },
43
- ],
44
- }),
45
- }));
46
- // Mock the LinearGradient component
47
- jest.mock("expo-linear-gradient", () => ({
48
- LinearGradient: "LinearGradient",
49
- }));
50
- describe("Avatar", () => {
51
- const defaultProps = {
52
- name: "John Doe",
53
- src: "https://example.com/avatar.jpg",
54
- testID: "avatar",
55
- };
56
- beforeEach(() => {
57
- jest.clearAllMocks();
58
- });
59
- it("renders correctly with default props", () => {
60
- const { toJSON } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps)));
61
- expect(toJSON()).toMatchSnapshot();
62
- });
63
- it("renders initials when no image is provided", () => {
64
- const { getByText } = renderWithTheme(React.createElement(Avatar, { name: "John Doe", testID: "avatar" }));
65
- expect(getByText("JD")).toBeTruthy();
66
- });
67
- it("renders image when src is provided", () => {
68
- const { getByTestId } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps)));
69
- const image = getByTestId("avatar-image");
70
- expect(image).toBeTruthy();
71
- });
72
- it("shows initials when image fails to load", () => {
73
- const { getByText, getByTestId } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { name: "John Doe" })));
74
- // Simulate image load error
75
- fireEvent(getByTestId("avatar-image"), "onError");
76
- expect(getByText("JD")).toBeTruthy();
77
- });
78
- it("applies correct size class", () => {
79
- const size = "lg";
80
- const { getByTestId } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { size: size })));
81
- const avatar = getByTestId("avatar-image");
82
- // Check if the style contains the expected size
83
- expect(avatar.props.style).toMatchObject({
84
- height: 72, // lg size from the sizes object
85
- });
86
- });
87
- it("shows status indicator when status is provided", () => {
88
- const { getByTestId } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { status: "online" })));
89
- expect(getByTestId("status-indicator")).toBeTruthy();
90
- });
91
- it("shows edit icon when status is imagePicker and size is xl", () => {
92
- const { getByText } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { size: "xl", status: "imagePicker" })));
93
- expect(getByText("Upload Image")).toBeTruthy();
94
- });
95
- it("calls onChange when edit icon is pressed", async () => {
96
- const mockOnChange = jest.fn();
97
- const { getByText } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { size: "xl", status: "imagePicker", onChange: mockOnChange })));
98
- await act(async () => {
99
- fireEvent.press(getByText("Upload Image"));
100
- });
101
- // The onChange should be called with the processed image
102
- expect(mockOnChange).toHaveBeenCalledWith({
103
- avatarImageFormat: "png",
104
- uri: "data:image/png;base64,test-base64",
105
- base64: "test-base64",
106
- });
107
- expect(ImageManipulator.ImageManipulator.manipulate).toHaveBeenCalled();
108
- expect(mockResize).toHaveBeenCalled();
109
- expect(mockRenderAsync).toHaveBeenCalled();
110
- expect(mockSaveAsync).toHaveBeenCalledWith({
111
- format: "png",
112
- base64: true,
113
- });
114
- });
115
- it("applies border when hasBorder is true", () => {
116
- const { getByTestId } = renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { hasBorder: true })));
117
- const avatar = getByTestId("avatar-image");
118
- // Check if the style contains border properties
119
- expect(avatar.props.style).toMatchObject({
120
- borderWidth: expect.any(Number),
121
- borderColor: expect.any(String),
122
- });
123
- });
124
- it("shows warning when imagePicker status is used with non-xl size", () => {
125
- const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
126
- renderWithTheme(React.createElement(Avatar, Object.assign({}, defaultProps, { size: "lg", status: "imagePicker" })));
127
- expect(consoleWarnSpy).toHaveBeenCalledWith("Avatars with the status of 'imagePicker' should also have an onChange property.");
128
- consoleWarnSpy.mockRestore();
129
- });
130
- });
131
- //# sourceMappingURL=Avatar.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Avatar.test.js","sourceRoot":"","sources":["../src/Avatar.test.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,76 +0,0 @@
1
- import React from "react";
2
- import { Badge } from "./Badge";
3
- import { renderWithTheme } from "./test-utils";
4
- describe("Badge", () => {
5
- const defaultProps = {
6
- value: "Test",
7
- };
8
- it("renders correctly with default props", () => {
9
- const { toJSON } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps)));
10
- expect(toJSON()).toMatchSnapshot();
11
- });
12
- it("renders text value correctly", () => {
13
- const { getByText } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps)));
14
- expect(getByText("Test")).toBeTruthy();
15
- });
16
- it("renders number value correctly", () => {
17
- const { getByText } = renderWithTheme(React.createElement(Badge, { value: 42 }));
18
- expect(getByText("42")).toBeTruthy();
19
- });
20
- it("truncates large numbers with maxValue", () => {
21
- const { getByText } = renderWithTheme(React.createElement(Badge, { maxValue: 100, value: 150, variant: "numberOnly" }));
22
- expect(getByText("100+")).toBeTruthy();
23
- });
24
- it("does not truncate numbers below maxValue", () => {
25
- const { getByText } = renderWithTheme(React.createElement(Badge, { maxValue: 100, value: 50, variant: "numberOnly" }));
26
- expect(getByText("50")).toBeTruthy();
27
- });
28
- it("applies correct status colors", () => {
29
- const statuses = ["error", "warning", "info", "success", "neutral"];
30
- statuses.forEach((status) => {
31
- let { getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { status: status, testID: "badge" })));
32
- // Test primary variant
33
- const badge = getByTestId("badge");
34
- expect(badge).toHaveStyle({ backgroundColor: expect.any(String) });
35
- // Test secondary variant
36
- ({ getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { secondary: true, status: status, testID: "badge-secondary" }))));
37
- const secondaryBadge = getByTestId("badge-secondary");
38
- expect(secondaryBadge).toHaveStyle({ backgroundColor: expect.any(String) });
39
- });
40
- });
41
- it("renders icon when iconName is provided", () => {
42
- const { getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { iconName: "check", testID: "badge-with-icon" })));
43
- expect(getByTestId("icon")).toBeTruthy();
44
- });
45
- it("renders icon only when variant is iconOnly", () => {
46
- const { getByTestId, queryByText } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { iconName: "check", testID: "icon-only-badge", variant: "iconOnly" })));
47
- expect(getByTestId("icon")).toBeTruthy();
48
- expect(queryByText("Test")).toBeNull();
49
- });
50
- it("applies custom colors when status is custom", () => {
51
- const customColors = {
52
- customBackgroundColor: "#123456",
53
- customTextColor: "#ffffff",
54
- customBorderColor: "#654321",
55
- customIconColor: "#ffcc00",
56
- };
57
- const { getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { iconName: "star", secondary: true, status: "custom", testID: "custom-badge" }, customColors)));
58
- const badge = getByTestId("custom-badge");
59
- expect(badge).toHaveStyle({
60
- backgroundColor: customColors.customBackgroundColor,
61
- borderColor: customColors.customBorderColor,
62
- });
63
- });
64
- it("applies correct border radius based on variant", () => {
65
- // Default variant
66
- let { getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { testID: "default-badge" })));
67
- expect(getByTestId("default-badge")).toHaveStyle({ borderRadius: expect.any(Number) });
68
- // Icon only variant
69
- ({ getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { iconName: "check", testID: "icon-only-badge", variant: "iconOnly" }))));
70
- expect(getByTestId("icon-only-badge")).toHaveStyle({ borderRadius: expect.any(Number) });
71
- // Number only variant
72
- ({ getByTestId } = renderWithTheme(React.createElement(Badge, Object.assign({}, defaultProps, { testID: "number-only-badge", variant: "numberOnly" }))));
73
- expect(getByTestId("number-only-badge")).toHaveStyle({ borderRadius: expect.any(Number) });
74
- });
75
- });
76
- //# sourceMappingURL=Badge.test.js.map