Skip to content

Commit a686e87

Browse files
troZeePiotr Trocki
andauthored
Fix typescript (#603)
* fix import * fix: typescript * fix: typescript && remove frozen lock * fix: ts * fix: force react 17.x types * fix: typo Co-authored-by: Piotr Trocki <[email protected]>
1 parent e6465d6 commit a686e87

File tree

18 files changed

+407
-82
lines changed

18 files changed

+407
-82
lines changed

example/__tests__/App-test.tsx

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
11
/**
22
* @format
33
*/
4-
5-
import 'react-native';
6-
import React from 'react';
7-
import App from '../src/App';
8-
9-
// Note: test renderer must be required after react-native.
10-
import renderer from 'react-test-renderer';
11-
12-
it('renders correctly', () => {
13-
renderer.create(<App />);
14-
});

example/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
"react": "18.1.0",
1414
"react-native": "0.70.0"
1515
},
16+
"resolutions": {
17+
"@types/react": "17.0.21"
18+
},
1619
"devDependencies": {
1720
"@babel/core": "^7.12.9",
1821
"@babel/runtime": "^7.12.5",

example/src/component/NavigationPanel/LogsPanel.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from 'react';
2-
import { StyleSheet, Text, View } from 'react-native';
3-
import { FlatList } from 'react-native-gesture-handler';
2+
import { StyleSheet, Text, View, FlatList } from 'react-native';
43
import type { LogsPanelProps } from './types';
54

65
export function LogsPanel({ logs }: LogsPanelProps) {

example/src/component/NavigationPanel/NavigationPanel.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, { useState } from 'react';
2-
import { StyleSheet, Text, View } from 'react-native';
3-
import { TouchableOpacity } from 'react-native-gesture-handler';
2+
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
43
import { ControlsPanel } from './ControlPanel';
54
import { LogsPanel } from './LogsPanel';
65
import type { NavigationPanelProps } from './types';
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import type {
2+
default as PagerView,
3+
PageScrollStateChangedNativeEvent,
4+
PagerViewOnPageScrollEventData,
5+
PagerViewOnPageSelectedEventData,
6+
} from 'react-native-pager-view';
7+
import { Animated } from 'react-native';
8+
import { createPage, CreatePage } from '../utils';
9+
import { useCallback, useMemo, useRef, useState } from 'react';
10+
11+
export type UseNavigationPanelProps = ReturnType<typeof useNavigationPanel>;
12+
13+
export interface EventLog {
14+
event: 'scroll' | 'select' | 'statusChanged';
15+
text: string;
16+
timestamp: Date;
17+
}
18+
19+
const getBasePages = (pages: number) =>
20+
new Array(pages).fill('').map((_v, index) => createPage(index));
21+
22+
export function useNavigationPanel(
23+
pagesAmount: number = 10,
24+
onPageSelectedCallback: (position: number) => void = () => {}
25+
) {
26+
const ref = useRef<PagerView>(null);
27+
const [pages, setPages] = useState<CreatePage[]>(
28+
useMemo(() => getBasePages(pagesAmount), [pagesAmount])
29+
);
30+
const [activePage, setActivePage] = useState(0);
31+
const [isAnimated, setIsAnimated] = useState(true);
32+
const [overdragEnabled, setOverdragEnabled] = useState(false);
33+
const [scrollEnabled, setScrollEnabled] = useState(true);
34+
const [scrollState, setScrollState] = useState('idle');
35+
const [dotsEnabled, setDotsEnabled] = useState(false);
36+
const [logs, setLogs] = useState<EventLog[]>([]);
37+
const [progress, setProgress] = useState({ position: 0, offset: 0 });
38+
const onPageScrollOffset = useRef(new Animated.Value(0)).current;
39+
const onPageScrollPosition = useRef(new Animated.Value(0)).current;
40+
const onPageSelectedPosition = useRef(new Animated.Value(0)).current;
41+
42+
const setPage = useCallback(
43+
(page: number) =>
44+
isAnimated
45+
? ref.current?.setPage(page)
46+
: ref.current?.setPageWithoutAnimation(page),
47+
[isAnimated]
48+
);
49+
50+
const addLog = useCallback((log: EventLog) => {
51+
setLogs((text) => [log, ...text].slice(0, 100));
52+
}, []);
53+
54+
const addPage = useCallback(
55+
() => setPages((prevPages) => [...prevPages, createPage(prevPages.length)]),
56+
[]
57+
);
58+
const removePage = useCallback(
59+
() => setPages((prevPages) => prevPages.slice(0, prevPages.length - 1)),
60+
[]
61+
);
62+
const toggleAnimation = useCallback(
63+
() => setIsAnimated((animated) => !animated),
64+
[]
65+
);
66+
const toggleScroll = useCallback(
67+
() => setScrollEnabled((enabled) => !enabled),
68+
[]
69+
);
70+
const toggleDots = useCallback(
71+
() => setDotsEnabled((enabled) => !enabled),
72+
[]
73+
);
74+
const toggleOverdrag = useCallback(
75+
() => setOverdragEnabled((enabled) => !enabled),
76+
[]
77+
);
78+
79+
const onPageScroll = useMemo(
80+
() =>
81+
Animated.event<PagerViewOnPageScrollEventData>(
82+
[
83+
{
84+
nativeEvent: {
85+
offset: onPageScrollOffset,
86+
position: onPageScrollPosition,
87+
},
88+
},
89+
],
90+
{
91+
listener: ({ nativeEvent: { offset, position } }) => {
92+
addLog({
93+
event: 'scroll',
94+
text: `Position: ${position} Offset: ${offset}`,
95+
timestamp: new Date(),
96+
});
97+
setProgress({
98+
position,
99+
offset,
100+
});
101+
},
102+
useNativeDriver: true,
103+
}
104+
),
105+
// eslint-disable-next-line react-hooks/exhaustive-deps
106+
[]
107+
);
108+
109+
const onPageSelected = useMemo(
110+
() =>
111+
Animated.event<PagerViewOnPageSelectedEventData>(
112+
[{ nativeEvent: { position: onPageSelectedPosition } }],
113+
{
114+
listener: ({ nativeEvent: { position } }) => {
115+
addLog({
116+
event: 'select',
117+
text: `Page: ${position}`,
118+
timestamp: new Date(),
119+
});
120+
setActivePage(position);
121+
onPageSelectedCallback(position);
122+
},
123+
useNativeDriver: true,
124+
}
125+
),
126+
// eslint-disable-next-line react-hooks/exhaustive-deps
127+
[]
128+
);
129+
130+
const onPageScrollStateChanged = useCallback(
131+
(e: PageScrollStateChangedNativeEvent) => {
132+
addLog({
133+
event: 'statusChanged',
134+
text: `State: ${e.nativeEvent.pageScrollState}`,
135+
timestamp: new Date(),
136+
});
137+
setScrollState(e.nativeEvent.pageScrollState);
138+
},
139+
// eslint-disable-next-line react-hooks/exhaustive-deps
140+
[]
141+
);
142+
143+
return {
144+
ref,
145+
activePage,
146+
isAnimated,
147+
pages,
148+
scrollState,
149+
scrollEnabled,
150+
dotsEnabled,
151+
progress,
152+
overdragEnabled,
153+
setPage,
154+
addPage,
155+
removePage,
156+
toggleScroll,
157+
toggleDots,
158+
toggleAnimation,
159+
setProgress,
160+
onPageScroll,
161+
onPageSelected,
162+
onPageScrollStateChanged,
163+
toggleOverdrag,
164+
logs,
165+
};
166+
}

example/src/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ export const createPage = (key: number): CreatePage => {
2727
alignItems: 'center',
2828
padding: 20,
2929
},
30-
imgSource: { uri: IMAGE_URIS[key % BGCOLOR.length] },
30+
imgSource: {
31+
uri:
32+
IMAGE_URIS[key % BGCOLOR.length] ||
33+
'https://apod.nasa.gov/apod/image/1410/20141008tleBaldridge001h990.jpg',
34+
},
3135
};
3236
};
Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
11
/**
22
* @format
33
*/
4-
5-
import 'react-native';
6-
import React from 'react';
7-
import App from '../src/App';
8-
9-
// Note: test renderer must be required after react-native.
10-
import renderer from 'react-test-renderer';
11-
12-
it('renders correctly', () => {
13-
renderer.create(<App />);
14-
});

fabricexample/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
"react": "18.1.0",
1414
"react-native": "0.70.0"
1515
},
16+
"resolutions": {
17+
"@types/react": "17.0.21"
18+
},
1619
"devDependencies": {
1720
"@babel/core": "^7.12.9",
1821
"@babel/runtime": "^7.12.5",

fabricexample/src/component/NavigationPanel/LogsPanel.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from 'react';
2-
import { StyleSheet, Text, View } from 'react-native';
3-
import { FlatList } from 'react-native-gesture-handler';
2+
import { StyleSheet, Text, View, FlatList } from 'react-native';
43
import type { LogsPanelProps } from './types';
54

65
export function LogsPanel({ logs }: LogsPanelProps) {

fabricexample/src/component/NavigationPanel/NavigationPanel.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, { useState } from 'react';
2-
import { StyleSheet, Text, View } from 'react-native';
3-
import { TouchableOpacity } from 'react-native-gesture-handler';
2+
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
43
import { ControlsPanel } from './ControlPanel';
54
import { LogsPanel } from './LogsPanel';
65
import type { NavigationPanelProps } from './types';

0 commit comments

Comments
 (0)