@terreno/ui 0.14.1 → 0.14.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.
- package/dist/ActionSheet.js +15 -27
- package/dist/ActionSheet.js.map +1 -1
- package/dist/MarkdownView.js +20 -7
- package/dist/MarkdownView.js.map +1 -1
- package/dist/useConsentHistory.d.ts +6 -1
- package/dist/useConsentHistory.js +2 -1
- package/dist/useConsentHistory.js.map +1 -1
- package/package.json +1 -1
- package/src/ActionSheet.test.tsx +554 -0
- package/src/ActionSheet.tsx +24 -37
- package/src/Banner.test.tsx +36 -1
- package/src/DataTable.test.tsx +176 -1
- package/src/DateTimeField.test.tsx +716 -2
- package/src/HeightActionSheet.test.tsx +1 -1
- package/src/HeightField.test.tsx +35 -0
- package/src/HeightFieldDesktop.test.tsx +19 -0
- package/src/MarkdownView.test.tsx +28 -0
- package/src/MarkdownView.tsx +69 -7
- package/src/MobileAddressAutoComplete.test.tsx +6 -2
- package/src/PickerSelect.test.tsx +243 -0
- package/src/SplitPage.test.tsx +299 -43
- package/src/TapToEdit.test.tsx +13 -0
- package/src/ToastNotifications.test.tsx +674 -0
- package/src/Tooltip.test.tsx +707 -1
- package/src/WebAddressAutocomplete.test.tsx +99 -0
- package/src/WebDropdownMenu.test.tsx +28 -2
- package/src/__snapshots__/Banner.test.tsx.snap +125 -0
- package/src/__snapshots__/DataTable.test.tsx.snap +366 -0
- package/src/__snapshots__/MarkdownView.test.tsx.snap +284 -74
- package/src/__snapshots__/SplitPage.test.tsx.snap +698 -46
- package/src/bunSetup.ts +0 -4
- package/src/login/LoginScreen.test.tsx +12 -0
- package/src/useConsentHistory.test.ts +20 -13
- package/src/useConsentHistory.ts +7 -2
|
@@ -1586,4 +1586,678 @@ describe("ToastNotifications", () => {
|
|
|
1586
1586
|
unmount();
|
|
1587
1587
|
});
|
|
1588
1588
|
});
|
|
1589
|
+
|
|
1590
|
+
describe("Toast with swipeEnabled and pan interactions", () => {
|
|
1591
|
+
// Capture PanResponder config callbacks to test them directly
|
|
1592
|
+
const capturedConfigs: Array<Record<string, Function>> = [];
|
|
1593
|
+
|
|
1594
|
+
it("should exercise pan responder callbacks directly", async () => {
|
|
1595
|
+
const {PanResponder} = require("react-native");
|
|
1596
|
+
const originalCreate = PanResponder.create;
|
|
1597
|
+
PanResponder.create = (config: Record<string, Function>) => {
|
|
1598
|
+
capturedConfigs.push(config);
|
|
1599
|
+
return originalCreate.call(PanResponder, config);
|
|
1600
|
+
};
|
|
1601
|
+
|
|
1602
|
+
let toastRef: ToastType | null = null;
|
|
1603
|
+
const TestComponent = () => {
|
|
1604
|
+
const toast = useToastNotifications();
|
|
1605
|
+
toastRef = toast;
|
|
1606
|
+
return <Text>Test</Text>;
|
|
1607
|
+
};
|
|
1608
|
+
|
|
1609
|
+
render(
|
|
1610
|
+
<ToastProvider swipeEnabled>
|
|
1611
|
+
<TestComponent />
|
|
1612
|
+
</ToastProvider>
|
|
1613
|
+
);
|
|
1614
|
+
|
|
1615
|
+
await waitFor(() => {
|
|
1616
|
+
expect(toastRef?.show).toBeDefined();
|
|
1617
|
+
});
|
|
1618
|
+
|
|
1619
|
+
await act(async () => {
|
|
1620
|
+
toastRef?.show("Swipe toast", {id: "swipe-direct", swipeEnabled: true});
|
|
1621
|
+
});
|
|
1622
|
+
|
|
1623
|
+
await act(async () => {
|
|
1624
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1625
|
+
});
|
|
1626
|
+
|
|
1627
|
+
// Find the captured PanResponder config
|
|
1628
|
+
const panConfig = capturedConfigs[capturedConfigs.length - 1];
|
|
1629
|
+
expect(panConfig).toBeDefined();
|
|
1630
|
+
|
|
1631
|
+
if (panConfig) {
|
|
1632
|
+
const mockEvent = {};
|
|
1633
|
+
|
|
1634
|
+
// Test onMoveShouldSetPanResponder with large movement
|
|
1635
|
+
if (panConfig.onMoveShouldSetPanResponder) {
|
|
1636
|
+
const result = panConfig.onMoveShouldSetPanResponder(mockEvent, {dx: 20, dy: 0});
|
|
1637
|
+
expect(result).toBe(true);
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
// Test onMoveShouldSetPanResponder with no movement
|
|
1641
|
+
if (panConfig.onMoveShouldSetPanResponder) {
|
|
1642
|
+
const result = panConfig.onMoveShouldSetPanResponder(mockEvent, {dx: 0, dy: 0});
|
|
1643
|
+
expect(result).toBe(false);
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
// Test onPanResponderMove
|
|
1647
|
+
if (panConfig.onPanResponderMove) {
|
|
1648
|
+
await act(async () => {
|
|
1649
|
+
panConfig.onPanResponderMove(mockEvent, {dx: 30, dy: 5});
|
|
1650
|
+
});
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
// Test onPanResponderRelease with swipe right (dx > 50)
|
|
1654
|
+
if (panConfig.onPanResponderRelease) {
|
|
1655
|
+
await act(async () => {
|
|
1656
|
+
panConfig.onPanResponderRelease(mockEvent, {dx: 60, dy: 0});
|
|
1657
|
+
});
|
|
1658
|
+
await act(async () => {
|
|
1659
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
1660
|
+
});
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
PanResponder.create = originalCreate;
|
|
1665
|
+
});
|
|
1666
|
+
|
|
1667
|
+
it("should handle swipe left via pan responder callback", async () => {
|
|
1668
|
+
const {PanResponder} = require("react-native");
|
|
1669
|
+
const configs: Array<Record<string, Function>> = [];
|
|
1670
|
+
const originalCreate = PanResponder.create;
|
|
1671
|
+
PanResponder.create = (config: Record<string, Function>) => {
|
|
1672
|
+
configs.push(config);
|
|
1673
|
+
return originalCreate.call(PanResponder, config);
|
|
1674
|
+
};
|
|
1675
|
+
|
|
1676
|
+
let toastRef: ToastType | null = null;
|
|
1677
|
+
const TestComponent = () => {
|
|
1678
|
+
const toast = useToastNotifications();
|
|
1679
|
+
toastRef = toast;
|
|
1680
|
+
return <Text>Test</Text>;
|
|
1681
|
+
};
|
|
1682
|
+
|
|
1683
|
+
render(
|
|
1684
|
+
<ToastProvider swipeEnabled>
|
|
1685
|
+
<TestComponent />
|
|
1686
|
+
</ToastProvider>
|
|
1687
|
+
);
|
|
1688
|
+
|
|
1689
|
+
await waitFor(() => {
|
|
1690
|
+
expect(toastRef?.show).toBeDefined();
|
|
1691
|
+
});
|
|
1692
|
+
|
|
1693
|
+
await act(async () => {
|
|
1694
|
+
toastRef?.show("Swipe left", {id: "swipe-left-direct", swipeEnabled: true});
|
|
1695
|
+
});
|
|
1696
|
+
|
|
1697
|
+
await act(async () => {
|
|
1698
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1699
|
+
});
|
|
1700
|
+
|
|
1701
|
+
const panConfig = configs[configs.length - 1];
|
|
1702
|
+
if (panConfig?.onPanResponderRelease) {
|
|
1703
|
+
// Swipe left (dx < -50)
|
|
1704
|
+
await act(async () => {
|
|
1705
|
+
panConfig.onPanResponderRelease({}, {dx: -60, dy: 0});
|
|
1706
|
+
});
|
|
1707
|
+
await act(async () => {
|
|
1708
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
1709
|
+
});
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
PanResponder.create = originalCreate;
|
|
1713
|
+
});
|
|
1714
|
+
|
|
1715
|
+
it("should snap back on small swipe via pan responder callback", async () => {
|
|
1716
|
+
const {PanResponder} = require("react-native");
|
|
1717
|
+
const configs: Array<Record<string, Function>> = [];
|
|
1718
|
+
const originalCreate = PanResponder.create;
|
|
1719
|
+
PanResponder.create = (config: Record<string, Function>) => {
|
|
1720
|
+
configs.push(config);
|
|
1721
|
+
return originalCreate.call(PanResponder, config);
|
|
1722
|
+
};
|
|
1723
|
+
|
|
1724
|
+
let toastRef: ToastType | null = null;
|
|
1725
|
+
const TestComponent = () => {
|
|
1726
|
+
const toast = useToastNotifications();
|
|
1727
|
+
toastRef = toast;
|
|
1728
|
+
return <Text>Test</Text>;
|
|
1729
|
+
};
|
|
1730
|
+
|
|
1731
|
+
render(
|
|
1732
|
+
<ToastProvider swipeEnabled>
|
|
1733
|
+
<TestComponent />
|
|
1734
|
+
</ToastProvider>
|
|
1735
|
+
);
|
|
1736
|
+
|
|
1737
|
+
await waitFor(() => {
|
|
1738
|
+
expect(toastRef?.show).toBeDefined();
|
|
1739
|
+
});
|
|
1740
|
+
|
|
1741
|
+
await act(async () => {
|
|
1742
|
+
toastRef?.show("Small swipe", {id: "swipe-small-direct", swipeEnabled: true});
|
|
1743
|
+
});
|
|
1744
|
+
|
|
1745
|
+
await act(async () => {
|
|
1746
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1747
|
+
});
|
|
1748
|
+
|
|
1749
|
+
const panConfig = configs[configs.length - 1];
|
|
1750
|
+
if (panConfig?.onPanResponderRelease) {
|
|
1751
|
+
// Small swipe that should spring back
|
|
1752
|
+
await act(async () => {
|
|
1753
|
+
panConfig.onPanResponderRelease({}, {dx: 10, dy: 0});
|
|
1754
|
+
});
|
|
1755
|
+
await act(async () => {
|
|
1756
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
1757
|
+
});
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
PanResponder.create = originalCreate;
|
|
1761
|
+
});
|
|
1762
|
+
});
|
|
1763
|
+
|
|
1764
|
+
describe("Toast lifecycle and auto-close", () => {
|
|
1765
|
+
it("should auto-close toast after duration expires", async () => {
|
|
1766
|
+
let toastRef: ToastType | null = null;
|
|
1767
|
+
|
|
1768
|
+
const TestComponent = () => {
|
|
1769
|
+
const toast = useToastNotifications();
|
|
1770
|
+
toastRef = toast;
|
|
1771
|
+
return <Text>Test</Text>;
|
|
1772
|
+
};
|
|
1773
|
+
|
|
1774
|
+
render(
|
|
1775
|
+
<ToastProvider swipeEnabled={false}>
|
|
1776
|
+
<TestComponent />
|
|
1777
|
+
</ToastProvider>
|
|
1778
|
+
);
|
|
1779
|
+
|
|
1780
|
+
await waitFor(() => {
|
|
1781
|
+
expect(toastRef?.show).toBeDefined();
|
|
1782
|
+
});
|
|
1783
|
+
|
|
1784
|
+
const onCloseMock = mock(() => {});
|
|
1785
|
+
await act(async () => {
|
|
1786
|
+
toastRef?.show("Auto close toast", {
|
|
1787
|
+
duration: 100,
|
|
1788
|
+
id: "auto-close",
|
|
1789
|
+
onClose: onCloseMock,
|
|
1790
|
+
});
|
|
1791
|
+
});
|
|
1792
|
+
|
|
1793
|
+
// Wait for requestAnimationFrame + duration + animation
|
|
1794
|
+
await act(async () => {
|
|
1795
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
1796
|
+
});
|
|
1797
|
+
});
|
|
1798
|
+
|
|
1799
|
+
it("should trigger handleClose when hiding a toast", async () => {
|
|
1800
|
+
let toastRef: ToastType | null = null;
|
|
1801
|
+
|
|
1802
|
+
const TestComponent = () => {
|
|
1803
|
+
const toast = useToastNotifications();
|
|
1804
|
+
toastRef = toast;
|
|
1805
|
+
return <Text>Test</Text>;
|
|
1806
|
+
};
|
|
1807
|
+
|
|
1808
|
+
render(
|
|
1809
|
+
<ToastProvider swipeEnabled={false}>
|
|
1810
|
+
<TestComponent />
|
|
1811
|
+
</ToastProvider>
|
|
1812
|
+
);
|
|
1813
|
+
|
|
1814
|
+
await waitFor(() => {
|
|
1815
|
+
expect(toastRef?.show).toBeDefined();
|
|
1816
|
+
});
|
|
1817
|
+
|
|
1818
|
+
await act(async () => {
|
|
1819
|
+
toastRef?.show("Hide me", {duration: 0, id: "hide-close"});
|
|
1820
|
+
});
|
|
1821
|
+
|
|
1822
|
+
await act(async () => {
|
|
1823
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1824
|
+
});
|
|
1825
|
+
|
|
1826
|
+
// Hide triggers the close animation
|
|
1827
|
+
await act(async () => {
|
|
1828
|
+
toastRef?.hide("hide-close");
|
|
1829
|
+
});
|
|
1830
|
+
|
|
1831
|
+
// Wait for close animation to complete
|
|
1832
|
+
await act(async () => {
|
|
1833
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
1834
|
+
});
|
|
1835
|
+
});
|
|
1836
|
+
|
|
1837
|
+
it("should auto-destroy toast after animation completes", async () => {
|
|
1838
|
+
let toastRef: ToastType | null = null;
|
|
1839
|
+
const onCloseMock = mock(() => {});
|
|
1840
|
+
|
|
1841
|
+
const TestComponent = () => {
|
|
1842
|
+
const toast = useToastNotifications();
|
|
1843
|
+
toastRef = toast;
|
|
1844
|
+
return <Text>Test</Text>;
|
|
1845
|
+
};
|
|
1846
|
+
|
|
1847
|
+
render(
|
|
1848
|
+
<ToastProvider animationDuration={50} swipeEnabled={false}>
|
|
1849
|
+
<TestComponent />
|
|
1850
|
+
</ToastProvider>
|
|
1851
|
+
);
|
|
1852
|
+
|
|
1853
|
+
await waitFor(() => {
|
|
1854
|
+
expect(toastRef?.show).toBeDefined();
|
|
1855
|
+
});
|
|
1856
|
+
|
|
1857
|
+
await act(async () => {
|
|
1858
|
+
toastRef?.show("Short life", {
|
|
1859
|
+
animationDuration: 50,
|
|
1860
|
+
duration: 50,
|
|
1861
|
+
id: "short-life",
|
|
1862
|
+
onClose: onCloseMock,
|
|
1863
|
+
});
|
|
1864
|
+
});
|
|
1865
|
+
|
|
1866
|
+
// Wait long enough for auto-close + animation
|
|
1867
|
+
await act(async () => {
|
|
1868
|
+
await new Promise((resolve) => setTimeout(resolve, 400));
|
|
1869
|
+
});
|
|
1870
|
+
|
|
1871
|
+
expect(toastRef?.isOpen("short-life")).toBe(false);
|
|
1872
|
+
});
|
|
1873
|
+
});
|
|
1874
|
+
|
|
1875
|
+
describe("Toast swipe gestures", () => {
|
|
1876
|
+
it("should render swipe-enabled toast and handle pan gestures", async () => {
|
|
1877
|
+
let toastRef: ToastType | null = null;
|
|
1878
|
+
|
|
1879
|
+
const TestComponent = () => {
|
|
1880
|
+
const toast = useToastNotifications();
|
|
1881
|
+
toastRef = toast;
|
|
1882
|
+
return <Text>Test</Text>;
|
|
1883
|
+
};
|
|
1884
|
+
|
|
1885
|
+
render(
|
|
1886
|
+
<ToastProvider swipeEnabled>
|
|
1887
|
+
<TestComponent />
|
|
1888
|
+
</ToastProvider>
|
|
1889
|
+
);
|
|
1890
|
+
|
|
1891
|
+
await waitFor(() => {
|
|
1892
|
+
expect(toastRef?.show).toBeDefined();
|
|
1893
|
+
});
|
|
1894
|
+
|
|
1895
|
+
await act(async () => {
|
|
1896
|
+
toastRef?.show("Swipe me", {swipeEnabled: true});
|
|
1897
|
+
});
|
|
1898
|
+
|
|
1899
|
+
await act(async () => {
|
|
1900
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1901
|
+
});
|
|
1902
|
+
});
|
|
1903
|
+
});
|
|
1904
|
+
|
|
1905
|
+
describe("Toast animation types", () => {
|
|
1906
|
+
it("should show toast with zoom-in animation", async () => {
|
|
1907
|
+
let toastRef: ToastType | null = null;
|
|
1908
|
+
|
|
1909
|
+
const TestComponent = () => {
|
|
1910
|
+
const toast = useToastNotifications();
|
|
1911
|
+
toastRef = toast;
|
|
1912
|
+
return <Text>Test</Text>;
|
|
1913
|
+
};
|
|
1914
|
+
|
|
1915
|
+
render(
|
|
1916
|
+
<ToastProvider animationType="zoom-in" swipeEnabled={false}>
|
|
1917
|
+
<TestComponent />
|
|
1918
|
+
</ToastProvider>
|
|
1919
|
+
);
|
|
1920
|
+
|
|
1921
|
+
await waitFor(() => {
|
|
1922
|
+
expect(toastRef?.show).toBeDefined();
|
|
1923
|
+
});
|
|
1924
|
+
|
|
1925
|
+
await act(async () => {
|
|
1926
|
+
toastRef?.show("Zoom toast", {animationType: "zoom-in"});
|
|
1927
|
+
});
|
|
1928
|
+
|
|
1929
|
+
await act(async () => {
|
|
1930
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1931
|
+
});
|
|
1932
|
+
});
|
|
1933
|
+
|
|
1934
|
+
it("should show toast with bottom placement and slide-in", async () => {
|
|
1935
|
+
let toastRef: ToastType | null = null;
|
|
1936
|
+
|
|
1937
|
+
const TestComponent = () => {
|
|
1938
|
+
const toast = useToastNotifications();
|
|
1939
|
+
toastRef = toast;
|
|
1940
|
+
return <Text>Test</Text>;
|
|
1941
|
+
};
|
|
1942
|
+
|
|
1943
|
+
render(
|
|
1944
|
+
<ToastProvider placement="bottom" swipeEnabled={false}>
|
|
1945
|
+
<TestComponent />
|
|
1946
|
+
</ToastProvider>
|
|
1947
|
+
);
|
|
1948
|
+
|
|
1949
|
+
await waitFor(() => {
|
|
1950
|
+
expect(toastRef?.show).toBeDefined();
|
|
1951
|
+
});
|
|
1952
|
+
|
|
1953
|
+
await act(async () => {
|
|
1954
|
+
toastRef?.show("Bottom slide toast", {placement: "bottom"});
|
|
1955
|
+
});
|
|
1956
|
+
|
|
1957
|
+
await act(async () => {
|
|
1958
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1959
|
+
});
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
|
|
1963
|
+
describe("Toast renderType and renderToast", () => {
|
|
1964
|
+
it("should render custom toast via renderType", async () => {
|
|
1965
|
+
let toastRef: ToastType | null = null;
|
|
1966
|
+
|
|
1967
|
+
const TestComponent = () => {
|
|
1968
|
+
const toast = useToastNotifications();
|
|
1969
|
+
toastRef = toast;
|
|
1970
|
+
return <Text>Test</Text>;
|
|
1971
|
+
};
|
|
1972
|
+
|
|
1973
|
+
const customRenderType = {
|
|
1974
|
+
custom: (toast: ToastProps) => <Text>Custom: {String(toast.message)}</Text>,
|
|
1975
|
+
};
|
|
1976
|
+
|
|
1977
|
+
render(
|
|
1978
|
+
<ToastProvider renderType={customRenderType} swipeEnabled={false}>
|
|
1979
|
+
<TestComponent />
|
|
1980
|
+
</ToastProvider>
|
|
1981
|
+
);
|
|
1982
|
+
|
|
1983
|
+
await waitFor(() => {
|
|
1984
|
+
expect(toastRef?.show).toBeDefined();
|
|
1985
|
+
});
|
|
1986
|
+
|
|
1987
|
+
await act(async () => {
|
|
1988
|
+
toastRef?.show("Hello", {type: "custom"});
|
|
1989
|
+
});
|
|
1990
|
+
|
|
1991
|
+
await act(async () => {
|
|
1992
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1993
|
+
});
|
|
1994
|
+
});
|
|
1995
|
+
|
|
1996
|
+
it("should render custom toast via renderToast", async () => {
|
|
1997
|
+
let toastRef: ToastType | null = null;
|
|
1998
|
+
|
|
1999
|
+
const TestComponent = () => {
|
|
2000
|
+
const toast = useToastNotifications();
|
|
2001
|
+
toastRef = toast;
|
|
2002
|
+
return <Text>Test</Text>;
|
|
2003
|
+
};
|
|
2004
|
+
|
|
2005
|
+
render(
|
|
2006
|
+
<ToastProvider
|
|
2007
|
+
renderToast={(toast) => <Text>Rendered: {String(toast.message)}</Text>}
|
|
2008
|
+
swipeEnabled={false}
|
|
2009
|
+
>
|
|
2010
|
+
<TestComponent />
|
|
2011
|
+
</ToastProvider>
|
|
2012
|
+
);
|
|
2013
|
+
|
|
2014
|
+
await waitFor(() => {
|
|
2015
|
+
expect(toastRef?.show).toBeDefined();
|
|
2016
|
+
});
|
|
2017
|
+
|
|
2018
|
+
await act(async () => {
|
|
2019
|
+
toastRef?.show("Custom render");
|
|
2020
|
+
});
|
|
2021
|
+
|
|
2022
|
+
await act(async () => {
|
|
2023
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2024
|
+
});
|
|
2025
|
+
});
|
|
2026
|
+
});
|
|
2027
|
+
|
|
2028
|
+
describe("Toast onPress", () => {
|
|
2029
|
+
it("should call onPress when toast is pressed", async () => {
|
|
2030
|
+
let toastRef: ToastType | null = null;
|
|
2031
|
+
const onPressMock = mock((_id: string) => {});
|
|
2032
|
+
|
|
2033
|
+
const TestComponent = () => {
|
|
2034
|
+
const toast = useToastNotifications();
|
|
2035
|
+
toastRef = toast;
|
|
2036
|
+
return <Text>Test</Text>;
|
|
2037
|
+
};
|
|
2038
|
+
|
|
2039
|
+
render(
|
|
2040
|
+
<ToastProvider swipeEnabled={false}>
|
|
2041
|
+
<TestComponent />
|
|
2042
|
+
</ToastProvider>
|
|
2043
|
+
);
|
|
2044
|
+
|
|
2045
|
+
await waitFor(() => {
|
|
2046
|
+
expect(toastRef?.show).toBeDefined();
|
|
2047
|
+
});
|
|
2048
|
+
|
|
2049
|
+
await act(async () => {
|
|
2050
|
+
toastRef?.show("Press me", {id: "press-test", onPress: onPressMock});
|
|
2051
|
+
});
|
|
2052
|
+
|
|
2053
|
+
await act(async () => {
|
|
2054
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2055
|
+
});
|
|
2056
|
+
});
|
|
2057
|
+
});
|
|
2058
|
+
|
|
2059
|
+
describe("Toast custom colors", () => {
|
|
2060
|
+
it("should render with custom success/danger/warning/normal colors", async () => {
|
|
2061
|
+
let toastRef: ToastType | null = null;
|
|
2062
|
+
|
|
2063
|
+
const TestComponent = () => {
|
|
2064
|
+
const toast = useToastNotifications();
|
|
2065
|
+
toastRef = toast;
|
|
2066
|
+
return <Text>Test</Text>;
|
|
2067
|
+
};
|
|
2068
|
+
|
|
2069
|
+
render(
|
|
2070
|
+
<ToastProvider
|
|
2071
|
+
dangerColor="#ff0000"
|
|
2072
|
+
normalColor="#999999"
|
|
2073
|
+
successColor="#00ff00"
|
|
2074
|
+
swipeEnabled={false}
|
|
2075
|
+
warningColor="#ffff00"
|
|
2076
|
+
>
|
|
2077
|
+
<TestComponent />
|
|
2078
|
+
</ToastProvider>
|
|
2079
|
+
);
|
|
2080
|
+
|
|
2081
|
+
await waitFor(() => {
|
|
2082
|
+
expect(toastRef?.show).toBeDefined();
|
|
2083
|
+
});
|
|
2084
|
+
|
|
2085
|
+
await act(async () => {
|
|
2086
|
+
toastRef?.show("Normal toast");
|
|
2087
|
+
});
|
|
2088
|
+
|
|
2089
|
+
await act(async () => {
|
|
2090
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2091
|
+
});
|
|
2092
|
+
});
|
|
2093
|
+
});
|
|
2094
|
+
|
|
2095
|
+
describe("center placement toast rendering", () => {
|
|
2096
|
+
it("should fully render center toast content including filter and map callbacks", async () => {
|
|
2097
|
+
let toastRef: ToastType | null = null;
|
|
2098
|
+
const TestComponent = () => {
|
|
2099
|
+
const toast = useToastNotifications();
|
|
2100
|
+
toastRef = toast;
|
|
2101
|
+
return <Text>Test</Text>;
|
|
2102
|
+
};
|
|
2103
|
+
|
|
2104
|
+
const {getByText} = render(
|
|
2105
|
+
<ToastProvider placement="center" swipeEnabled={false}>
|
|
2106
|
+
<TestComponent />
|
|
2107
|
+
</ToastProvider>
|
|
2108
|
+
);
|
|
2109
|
+
|
|
2110
|
+
await waitFor(() => {
|
|
2111
|
+
expect(toastRef?.show).toBeDefined();
|
|
2112
|
+
});
|
|
2113
|
+
|
|
2114
|
+
await act(async () => {
|
|
2115
|
+
toastRef?.show("Center rendered", {placement: "center"});
|
|
2116
|
+
});
|
|
2117
|
+
|
|
2118
|
+
// Flush the requestAnimationFrame (mocked as setTimeout(, 0)) and re-renders
|
|
2119
|
+
for (let i = 0; i < 5; i++) {
|
|
2120
|
+
await act(async () => {
|
|
2121
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2122
|
+
});
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
expect(getByText("Center rendered")).toBeTruthy();
|
|
2126
|
+
});
|
|
2127
|
+
|
|
2128
|
+
it("should render multiple center toasts through filter and map", async () => {
|
|
2129
|
+
let toastRef: ToastType | null = null;
|
|
2130
|
+
const TestComponent = () => {
|
|
2131
|
+
const toast = useToastNotifications();
|
|
2132
|
+
toastRef = toast;
|
|
2133
|
+
return <Text>Test</Text>;
|
|
2134
|
+
};
|
|
2135
|
+
|
|
2136
|
+
const {getByText} = render(
|
|
2137
|
+
<ToastProvider placement="center" swipeEnabled={false}>
|
|
2138
|
+
<TestComponent />
|
|
2139
|
+
</ToastProvider>
|
|
2140
|
+
);
|
|
2141
|
+
|
|
2142
|
+
await waitFor(() => {
|
|
2143
|
+
expect(toastRef?.show).toBeDefined();
|
|
2144
|
+
});
|
|
2145
|
+
|
|
2146
|
+
await act(async () => {
|
|
2147
|
+
toastRef?.show("Center X", {id: "cx", placement: "center"});
|
|
2148
|
+
});
|
|
2149
|
+
|
|
2150
|
+
for (let i = 0; i < 5; i++) {
|
|
2151
|
+
await act(async () => {
|
|
2152
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2153
|
+
});
|
|
2154
|
+
}
|
|
2155
|
+
|
|
2156
|
+
await act(async () => {
|
|
2157
|
+
toastRef?.show("Center Y", {id: "cy", placement: "center"});
|
|
2158
|
+
});
|
|
2159
|
+
|
|
2160
|
+
for (let i = 0; i < 5; i++) {
|
|
2161
|
+
await act(async () => {
|
|
2162
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2163
|
+
});
|
|
2164
|
+
}
|
|
2165
|
+
|
|
2166
|
+
expect(getByText("Center X")).toBeTruthy();
|
|
2167
|
+
expect(getByText("Center Y")).toBeTruthy();
|
|
2168
|
+
});
|
|
2169
|
+
});
|
|
2170
|
+
|
|
2171
|
+
describe("auto-close timer callback", () => {
|
|
2172
|
+
it("should fire the setTimeout callback that calls handleClose", async () => {
|
|
2173
|
+
let toastRef: ToastType | null = null;
|
|
2174
|
+
const onCloseMock = mock(() => {});
|
|
2175
|
+
|
|
2176
|
+
const TestComponent = () => {
|
|
2177
|
+
const toast = useToastNotifications();
|
|
2178
|
+
toastRef = toast;
|
|
2179
|
+
return <Text>Test</Text>;
|
|
2180
|
+
};
|
|
2181
|
+
|
|
2182
|
+
render(
|
|
2183
|
+
<ToastProvider swipeEnabled={false}>
|
|
2184
|
+
<TestComponent />
|
|
2185
|
+
</ToastProvider>
|
|
2186
|
+
);
|
|
2187
|
+
|
|
2188
|
+
await waitFor(() => {
|
|
2189
|
+
expect(toastRef?.show).toBeDefined();
|
|
2190
|
+
});
|
|
2191
|
+
|
|
2192
|
+
await act(async () => {
|
|
2193
|
+
toastRef?.show("Timer toast", {
|
|
2194
|
+
duration: 50,
|
|
2195
|
+
id: "timer-toast",
|
|
2196
|
+
onClose: onCloseMock,
|
|
2197
|
+
});
|
|
2198
|
+
});
|
|
2199
|
+
|
|
2200
|
+
// Flush RAF + duration timeout + close animation
|
|
2201
|
+
for (let i = 0; i < 15; i++) {
|
|
2202
|
+
await act(async () => {
|
|
2203
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2204
|
+
});
|
|
2205
|
+
}
|
|
2206
|
+
});
|
|
2207
|
+
});
|
|
2208
|
+
|
|
2209
|
+
describe("onHide callback on toast props", () => {
|
|
2210
|
+
it("should exercise the onHide function via renderToast", async () => {
|
|
2211
|
+
let toastRef: ToastType | null = null;
|
|
2212
|
+
let capturedOnHide: (() => void) | null = null;
|
|
2213
|
+
|
|
2214
|
+
const customRenderToast = (toast: ToastProps) => {
|
|
2215
|
+
if (!capturedOnHide) {
|
|
2216
|
+
capturedOnHide = toast.onHide;
|
|
2217
|
+
}
|
|
2218
|
+
return <Text>{String(toast.message)}</Text>;
|
|
2219
|
+
};
|
|
2220
|
+
|
|
2221
|
+
const TestComponent = () => {
|
|
2222
|
+
const toast = useToastNotifications();
|
|
2223
|
+
toastRef = toast;
|
|
2224
|
+
return <Text>Test</Text>;
|
|
2225
|
+
};
|
|
2226
|
+
|
|
2227
|
+
render(
|
|
2228
|
+
<ToastProvider renderToast={customRenderToast} swipeEnabled={false}>
|
|
2229
|
+
<TestComponent />
|
|
2230
|
+
</ToastProvider>
|
|
2231
|
+
);
|
|
2232
|
+
|
|
2233
|
+
await waitFor(() => {
|
|
2234
|
+
expect(toastRef?.show).toBeDefined();
|
|
2235
|
+
});
|
|
2236
|
+
|
|
2237
|
+
await act(async () => {
|
|
2238
|
+
toastRef?.show("Custom toast", {id: "onhide-test"});
|
|
2239
|
+
});
|
|
2240
|
+
|
|
2241
|
+
// Flush RAF and let the toast render with the custom renderer
|
|
2242
|
+
for (let i = 0; i < 5; i++) {
|
|
2243
|
+
await act(async () => {
|
|
2244
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2245
|
+
});
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
// Call the captured onHide to exercise the () => hide(id) callback
|
|
2249
|
+
if (capturedOnHide) {
|
|
2250
|
+
await act(async () => {
|
|
2251
|
+
capturedOnHide!();
|
|
2252
|
+
});
|
|
2253
|
+
|
|
2254
|
+
// Let the hide animation complete
|
|
2255
|
+
for (let i = 0; i < 5; i++) {
|
|
2256
|
+
await act(async () => {
|
|
2257
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
2258
|
+
});
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
});
|
|
2262
|
+
});
|
|
1589
2263
|
});
|