@react-native-ama/lists 1.0.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 (82) hide show
  1. package/dist/core/src/components/AMAProvider.d.ts +26 -0
  2. package/dist/core/src/components/AMAProvider.js +147 -0
  3. package/dist/core/src/components/AutofocusContainer.d.ts +9 -0
  4. package/dist/core/src/components/AutofocusContainer.js +58 -0
  5. package/dist/core/src/components/HideChildrenFromAccessibilityTree.d.ts +6 -0
  6. package/dist/core/src/components/HideChildrenFromAccessibilityTree.js +40 -0
  7. package/dist/core/src/hooks/useButtonChecks.d.ts +6 -0
  8. package/dist/core/src/hooks/useButtonChecks.js +51 -0
  9. package/dist/core/src/hooks/useChecks.d.ts +15 -0
  10. package/dist/core/src/hooks/useChecks.js +152 -0
  11. package/dist/core/src/hooks/useFocus.d.ts +4 -0
  12. package/dist/core/src/hooks/useFocus.js +55 -0
  13. package/dist/core/src/hooks/useTimedAction.d.ts +3 -0
  14. package/dist/core/src/hooks/useTimedAction.js +63 -0
  15. package/dist/core/src/index.d.ts +7 -0
  16. package/dist/core/src/index.js +20 -0
  17. package/dist/internal/src/checks/checkAccessibilityRole.d.ts +3 -0
  18. package/dist/internal/src/checks/checkAccessibilityRole.js +32 -0
  19. package/dist/internal/src/checks/checkFocusTrap.d.ts +8 -0
  20. package/dist/internal/src/checks/checkFocusTrap.js +34 -0
  21. package/dist/internal/src/checks/checkForAccessibilityState.d.ts +7 -0
  22. package/dist/internal/src/checks/checkForAccessibilityState.js +48 -0
  23. package/dist/internal/src/checks/checkMinimumSize.d.ts +3 -0
  24. package/dist/internal/src/checks/checkMinimumSize.js +29 -0
  25. package/dist/internal/src/checks/contrastChecker.d.ts +8 -0
  26. package/dist/internal/src/checks/contrastChecker.js +77 -0
  27. package/dist/internal/src/checks/noUndefinedProperty.d.ts +8 -0
  28. package/dist/internal/src/checks/noUndefinedProperty.js +14 -0
  29. package/dist/internal/src/checks/uppercaseChecker.d.ts +8 -0
  30. package/dist/internal/src/checks/uppercaseChecker.js +18 -0
  31. package/dist/internal/src/checks/uppercaseStringChecker.d.ts +8 -0
  32. package/dist/internal/src/checks/uppercaseStringChecker.js +29 -0
  33. package/dist/internal/src/index.d.ts +20 -0
  34. package/dist/internal/src/index.js +56 -0
  35. package/dist/internal/src/types.d.ts +17 -0
  36. package/dist/internal/src/types.js +2 -0
  37. package/dist/internal/src/utils/applyStyle.d.ts +9 -0
  38. package/dist/internal/src/utils/applyStyle.js +33 -0
  39. package/dist/internal/src/utils/constants.d.ts +3 -0
  40. package/dist/internal/src/utils/constants.js +32 -0
  41. package/dist/internal/src/utils/error.style.d.ts +6 -0
  42. package/dist/internal/src/utils/error.style.js +11 -0
  43. package/dist/internal/src/utils/generateAccessibilityStateFromProp.d.ts +9 -0
  44. package/dist/internal/src/utils/generateAccessibilityStateFromProp.js +35 -0
  45. package/dist/internal/src/utils/getPropertyFromStyle.d.ts +2 -0
  46. package/dist/internal/src/utils/getPropertyFromStyle.js +10 -0
  47. package/dist/internal/src/utils/interpolateAnimationStates.d.ts +2 -0
  48. package/dist/internal/src/utils/interpolateAnimationStates.js +43 -0
  49. package/dist/internal/src/utils/isFocused.d.ts +2 -0
  50. package/dist/internal/src/utils/isFocused.js +7 -0
  51. package/dist/internal/src/utils/logger.d.ts +16 -0
  52. package/dist/internal/src/utils/logger.js +53 -0
  53. package/dist/internal/src/utils/logger.rules.d.ts +15 -0
  54. package/dist/internal/src/utils/logger.rules.js +74 -0
  55. package/dist/internal/src/utils/maybeGenerateStringFromElement.d.ts +2 -0
  56. package/dist/internal/src/utils/maybeGenerateStringFromElement.js +51 -0
  57. package/dist/internal/src/utils/minimumTouchableSize.d.ts +3 -0
  58. package/dist/internal/src/utils/minimumTouchableSize.js +9 -0
  59. package/dist/lists/src/components/DynamicFlatList.d.ts +7 -0
  60. package/dist/lists/src/components/DynamicFlatList.js +36 -0
  61. package/dist/lists/src/components/FlatList.d.ts +10 -0
  62. package/dist/lists/src/components/FlatList.js +24 -0
  63. package/dist/lists/src/components/ListWrapper.d.ts +7 -0
  64. package/dist/lists/src/components/ListWrapper.js +45 -0
  65. package/dist/lists/src/components/StaticFlatList.d.ts +7 -0
  66. package/dist/lists/src/components/StaticFlatList.js +34 -0
  67. package/dist/lists/src/hooks/useDynamicList.d.ts +16 -0
  68. package/dist/lists/src/hooks/useDynamicList.js +62 -0
  69. package/dist/lists/src/index.d.ts +5 -0
  70. package/dist/lists/src/index.js +15 -0
  71. package/package.json +58 -0
  72. package/src/components/DynamicFlatList.test.tsx +58 -0
  73. package/src/components/DynamicFlatList.tsx +48 -0
  74. package/src/components/FlatList.test.tsx +378 -0
  75. package/src/components/FlatList.tsx +29 -0
  76. package/src/components/ListWrapper.android.test.tsx +20 -0
  77. package/src/components/ListWrapper.ios.test.tsx +15 -0
  78. package/src/components/ListWrapper.tsx +35 -0
  79. package/src/components/StaticFlatList.tsx +32 -0
  80. package/src/hooks/useDynamicFlatList.test.ts +50 -0
  81. package/src/hooks/useDynamicList.ts +84 -0
  82. package/src/index.ts +8 -0
@@ -0,0 +1,50 @@
1
+ import * as UseChecks from '@react-native-ama/core/src/hooks/useChecks';
2
+ import { renderHook } from '@testing-library/react-native';
3
+
4
+ import { useDynamicList } from './useDynamicList';
5
+
6
+ beforeEach(() => {
7
+ jest.clearAllMocks();
8
+ });
9
+
10
+ const logResult = jest.fn();
11
+
12
+ describe('useDynamicFlatList', () => {
13
+ beforeEach(function () {
14
+ // @ts-ignore
15
+ jest.spyOn(UseChecks, 'useChecks').mockReturnValue({
16
+ logResult,
17
+ } as any);
18
+ });
19
+
20
+ it('checks that the singular message contains the word %count%', () => {
21
+ renderHook(() =>
22
+ useDynamicList({
23
+ data: [],
24
+ singularMessage: 'hello',
25
+ pluralMessage: '%count% me',
26
+ }),
27
+ );
28
+
29
+ expect(logResult).toHaveBeenCalledWith('useDynamicFlatList', {
30
+ extra: 'hello',
31
+ message: 'Special string %count% not found in singularMessage',
32
+ rule: 'FLATLIST_NO_COUNT_IN_SINGULAR_MESSAGE',
33
+ });
34
+ });
35
+
36
+ it('checks that the plural message contains the word %count%', () => {
37
+ renderHook(() =>
38
+ useDynamicList({
39
+ data: [],
40
+ accessibilitySingularMessage: '%count% ok',
41
+ } as any),
42
+ );
43
+
44
+ expect(logResult).toHaveBeenCalledWith('useDynamicFlatList', {
45
+ extra: undefined,
46
+ message: 'Special string %count% not found in pluralMessage',
47
+ rule: 'FLATLIST_NO_COUNT_IN_PLURAL_MESSAGE',
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,84 @@
1
+ import { useChecks } from '@react-native-ama/core';
2
+ import React from 'react';
3
+ import { AccessibilityInfo } from 'react-native';
4
+
5
+ export type UseDynamicList = {
6
+ data: ArrayLike<any>;
7
+ singularMessage: string;
8
+ pluralMessage: string;
9
+ isPlural?: (count: number) => boolean;
10
+ numColumns?: number;
11
+ };
12
+
13
+ export const useDynamicList = ({
14
+ data,
15
+ singularMessage,
16
+ pluralMessage,
17
+ isPlural = simpleIsPlural,
18
+ numColumns = 1,
19
+ }: UseDynamicList) => {
20
+ const isFirstRender = React.useRef(true);
21
+ const initialCount = React.useRef(data?.length);
22
+ const lastItemsCount = React.useRef<null | number>(null);
23
+
24
+ const checks = __DEV__ ? useChecks?.() : null;
25
+
26
+ __DEV__ &&
27
+ React.useEffect(() => {
28
+ if (!singularMessage?.includes('%count%')) {
29
+ checks?.logResult('useDynamicFlatList', {
30
+ rule: 'FLATLIST_NO_COUNT_IN_SINGULAR_MESSAGE',
31
+ message: 'Special string %count% not found in singularMessage',
32
+ extra: singularMessage,
33
+ });
34
+ }
35
+
36
+ if (!pluralMessage?.includes('%count%')) {
37
+ checks?.logResult('useDynamicFlatList', {
38
+ rule: 'FLATLIST_NO_COUNT_IN_PLURAL_MESSAGE',
39
+ message: 'Special string %count% not found in pluralMessage',
40
+ extra: pluralMessage,
41
+ });
42
+ }
43
+ // eslint-disable-next-line react-hooks/exhaustive-deps
44
+ }, [pluralMessage, singularMessage, checks?.logResult]);
45
+
46
+ React.useEffect(() => {
47
+ const itemsCount = data?.length || 0;
48
+
49
+ if (
50
+ isFirstRender.current ||
51
+ itemsCount === initialCount.current ||
52
+ itemsCount === lastItemsCount.current
53
+ ) {
54
+ isFirstRender.current = false;
55
+ lastItemsCount.current = null;
56
+
57
+ return;
58
+ }
59
+
60
+ const message = isPlural(itemsCount) ? pluralMessage : singularMessage;
61
+ const messageToAnnounce = message.replace('%count%', itemsCount.toString());
62
+
63
+ AccessibilityInfo.announceForAccessibility(messageToAnnounce);
64
+
65
+ lastItemsCount.current = itemsCount;
66
+ }, [pluralMessage, singularMessage, data, isPlural]);
67
+
68
+ const rowsCount = lastItemsCount.current || initialCount.current || 0;
69
+
70
+ return __DEV__
71
+ ? {
72
+ rowsCount: rowsCount / numColumns,
73
+ columnsCount: numColumns,
74
+ style: checks?.debugStyle,
75
+ }
76
+ : {
77
+ rowsCount: rowsCount / numColumns,
78
+ columnsCount: numColumns,
79
+ };
80
+ };
81
+
82
+ function simpleIsPlural(count: number) {
83
+ return count !== 1;
84
+ }
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ // Components
2
+ export { DynamicFlatList } from './components/DynamicFlatList';
3
+ export { FlatList } from './components/FlatList';
4
+ export { ListWrapper } from './components/ListWrapper';
5
+ export { StaticFlatList } from './components/StaticFlatList';
6
+
7
+ // Hooks
8
+ export { useDynamicList } from './hooks/useDynamicList';