@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.
- package/dist/core/src/components/AMAProvider.d.ts +26 -0
- package/dist/core/src/components/AMAProvider.js +147 -0
- package/dist/core/src/components/AutofocusContainer.d.ts +9 -0
- package/dist/core/src/components/AutofocusContainer.js +58 -0
- package/dist/core/src/components/HideChildrenFromAccessibilityTree.d.ts +6 -0
- package/dist/core/src/components/HideChildrenFromAccessibilityTree.js +40 -0
- package/dist/core/src/hooks/useButtonChecks.d.ts +6 -0
- package/dist/core/src/hooks/useButtonChecks.js +51 -0
- package/dist/core/src/hooks/useChecks.d.ts +15 -0
- package/dist/core/src/hooks/useChecks.js +152 -0
- package/dist/core/src/hooks/useFocus.d.ts +4 -0
- package/dist/core/src/hooks/useFocus.js +55 -0
- package/dist/core/src/hooks/useTimedAction.d.ts +3 -0
- package/dist/core/src/hooks/useTimedAction.js +63 -0
- package/dist/core/src/index.d.ts +7 -0
- package/dist/core/src/index.js +20 -0
- package/dist/internal/src/checks/checkAccessibilityRole.d.ts +3 -0
- package/dist/internal/src/checks/checkAccessibilityRole.js +32 -0
- package/dist/internal/src/checks/checkFocusTrap.d.ts +8 -0
- package/dist/internal/src/checks/checkFocusTrap.js +34 -0
- package/dist/internal/src/checks/checkForAccessibilityState.d.ts +7 -0
- package/dist/internal/src/checks/checkForAccessibilityState.js +48 -0
- package/dist/internal/src/checks/checkMinimumSize.d.ts +3 -0
- package/dist/internal/src/checks/checkMinimumSize.js +29 -0
- package/dist/internal/src/checks/contrastChecker.d.ts +8 -0
- package/dist/internal/src/checks/contrastChecker.js +77 -0
- package/dist/internal/src/checks/noUndefinedProperty.d.ts +8 -0
- package/dist/internal/src/checks/noUndefinedProperty.js +14 -0
- package/dist/internal/src/checks/uppercaseChecker.d.ts +8 -0
- package/dist/internal/src/checks/uppercaseChecker.js +18 -0
- package/dist/internal/src/checks/uppercaseStringChecker.d.ts +8 -0
- package/dist/internal/src/checks/uppercaseStringChecker.js +29 -0
- package/dist/internal/src/index.d.ts +20 -0
- package/dist/internal/src/index.js +56 -0
- package/dist/internal/src/types.d.ts +17 -0
- package/dist/internal/src/types.js +2 -0
- package/dist/internal/src/utils/applyStyle.d.ts +9 -0
- package/dist/internal/src/utils/applyStyle.js +33 -0
- package/dist/internal/src/utils/constants.d.ts +3 -0
- package/dist/internal/src/utils/constants.js +32 -0
- package/dist/internal/src/utils/error.style.d.ts +6 -0
- package/dist/internal/src/utils/error.style.js +11 -0
- package/dist/internal/src/utils/generateAccessibilityStateFromProp.d.ts +9 -0
- package/dist/internal/src/utils/generateAccessibilityStateFromProp.js +35 -0
- package/dist/internal/src/utils/getPropertyFromStyle.d.ts +2 -0
- package/dist/internal/src/utils/getPropertyFromStyle.js +10 -0
- package/dist/internal/src/utils/interpolateAnimationStates.d.ts +2 -0
- package/dist/internal/src/utils/interpolateAnimationStates.js +43 -0
- package/dist/internal/src/utils/isFocused.d.ts +2 -0
- package/dist/internal/src/utils/isFocused.js +7 -0
- package/dist/internal/src/utils/logger.d.ts +16 -0
- package/dist/internal/src/utils/logger.js +53 -0
- package/dist/internal/src/utils/logger.rules.d.ts +15 -0
- package/dist/internal/src/utils/logger.rules.js +74 -0
- package/dist/internal/src/utils/maybeGenerateStringFromElement.d.ts +2 -0
- package/dist/internal/src/utils/maybeGenerateStringFromElement.js +51 -0
- package/dist/internal/src/utils/minimumTouchableSize.d.ts +3 -0
- package/dist/internal/src/utils/minimumTouchableSize.js +9 -0
- package/dist/lists/src/components/DynamicFlatList.d.ts +7 -0
- package/dist/lists/src/components/DynamicFlatList.js +36 -0
- package/dist/lists/src/components/FlatList.d.ts +10 -0
- package/dist/lists/src/components/FlatList.js +24 -0
- package/dist/lists/src/components/ListWrapper.d.ts +7 -0
- package/dist/lists/src/components/ListWrapper.js +45 -0
- package/dist/lists/src/components/StaticFlatList.d.ts +7 -0
- package/dist/lists/src/components/StaticFlatList.js +34 -0
- package/dist/lists/src/hooks/useDynamicList.d.ts +16 -0
- package/dist/lists/src/hooks/useDynamicList.js +62 -0
- package/dist/lists/src/index.d.ts +5 -0
- package/dist/lists/src/index.js +15 -0
- package/package.json +58 -0
- package/src/components/DynamicFlatList.test.tsx +58 -0
- package/src/components/DynamicFlatList.tsx +48 -0
- package/src/components/FlatList.test.tsx +378 -0
- package/src/components/FlatList.tsx +29 -0
- package/src/components/ListWrapper.android.test.tsx +20 -0
- package/src/components/ListWrapper.ios.test.tsx +15 -0
- package/src/components/ListWrapper.tsx +35 -0
- package/src/components/StaticFlatList.tsx +32 -0
- package/src/hooks/useDynamicFlatList.test.ts +50 -0
- package/src/hooks/useDynamicList.ts +84 -0
- 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';
|