Skip to content

Commit 58340ed

Browse files
M-i-k-e-lethanshar
andauthored
Typescript/tab controller move to typescript (#1079)
* Move TabBarContext from js ro ts * Move TabPage from js to tsx * TabPage - move to typescript (fix typescript) * Move PageCarousel from js to tsx * PageCarousel - move to typescript (fix typescript) * Fix TabPage exception * Delete ReanimatedObject * Move TabBarItem from js to tsx * export TabPageProps * TabPage - fix description * Commit .d files * TabBarItem - move to typescript (fix typescript) * PageCarousel - move to typescript (fix typescript) - part 2 * Move TabBar from js to tsx * Move ScrollBarGradient from js to tsx * ScrollBarGradient add props and docs * Commit .d file * TabBar - move to typescript (fix typescript) * Move TabBarController from js to tsx * TabController - move to typescript (fix typescript) * Move TabControllerScreen to ts * Fix screen and some errors * Fix PR comments * Fix prop * Fix/tab controller transition (#1089) * Fix first tab item change doesn't repsond * Memoize renderCodeBlock in TabController components * Move TabBarController from index.tsx to TabBarController.tsx * Create TabControllerProps namespace * Create TabControllerProps namespace (fix screen) * Revert "Create TabControllerProps namespace (fix screen)" This reverts commit 0d3cff5. * Revert "Create TabControllerProps namespace" This reverts commit cd52f05. * Revert "Move TabBarController from index.tsx to TabBarController.tsx" This reverts commit 2b493ee. * Change interfaces names for TabController related classes Co-authored-by: Ethan Sharabi <[email protected]>
1 parent 35aa34a commit 58340ed

File tree

27 files changed

+1336
-772
lines changed

27 files changed

+1336
-772
lines changed

demo/src/screens/componentScreens/TabControllerScreen/index.js renamed to demo/src/screens/componentScreens/TabControllerScreen/index.tsx

Lines changed: 45 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,54 @@
11
import React, {Component} from 'react';
22
import {ActivityIndicator} from 'react-native';
3-
import {
4-
Assets,
5-
TabController,
6-
Colors,
7-
View,
8-
Text,
9-
Button
10-
} from 'react-native-ui-lib'; //eslint-disable-line
3+
import {Assets, TabController, Colors, View, Text, Button, TabControllerItemProps} from 'react-native-ui-lib';
114
import {gestureHandlerRootHOC} from 'react-native-gesture-handler';
125
import _ from 'lodash';
136

147
import Tab1 from './tab1';
158
import Tab2 from './tab2';
169
import Tab3 from './tab3';
1710

18-
const TABS = [
19-
'Home',
20-
'Posts',
21-
'Reviews',
22-
'Videos',
23-
'Photos',
24-
'Events',
25-
'About',
26-
'Community',
27-
'Groups',
28-
'Offers'
29-
];
30-
31-
class TabControllerScreen extends Component {
32-
constructor(props) {
33-
super(props);
11+
const TABS = ['Home', 'Posts', 'Reviews', 'Videos', 'Photos', 'Events', 'About', 'Community', 'Groups', 'Offers'];
12+
13+
interface State {
14+
asCarousel: boolean;
15+
centerSelected: boolean;
16+
fewItems: boolean;
17+
selectedIndex: number;
18+
key: string | number;
19+
items: TabControllerItemProps[];
20+
}
21+
22+
class TabControllerScreen extends Component<{}, State> {
3423

35-
24+
constructor(props: {}) {
25+
super(props);
3626
this.state = {
3727
asCarousel: true,
3828
centerSelected: false,
3929
fewItems: false,
4030
selectedIndex: 0,
41-
key: Date.now()
31+
key: Date.now(),
32+
items: []
4233
};
43-
44-
const items = this.generateTabItems();
45-
this.state.items = items;
34+
35+
this.state.items = this.generateTabItems();
4636
}
4737

38+
generateTabItems = (fewItems = this.state.fewItems, centerSelected = this.state.centerSelected): TabControllerItemProps[] => {
39+
let items: TabControllerItemProps[] = _.chain(TABS)
40+
.take(fewItems ? 3 : TABS.length)
41+
.map<TabControllerItemProps>(tab => ({label: tab, key: tab}))
42+
.value();
43+
44+
const addItem: TabControllerItemProps = {icon: Assets.icons.demo.add, key: 'add', ignore: true, width: 60, onPress: this.onAddItem};
45+
46+
if (!centerSelected) {
47+
items = [...items, addItem];
48+
}
49+
return items;
50+
};
51+
4852
componentDidMount() {
4953
// this.slow();
5054
}
@@ -61,19 +65,7 @@ class TabControllerScreen extends Component {
6165

6266
onAddItem = () => {
6367
console.warn('Add Item');
64-
}
65-
66-
generateTabItems = (fewItems = this.state.fewItems, centerSelected = this.state.centerSelected) => {
67-
let items = _.chain(TABS)
68-
.take(fewItems ? 3 : TABS.length)
69-
.map((tab) => ({label: tab, key: tab}))
70-
.value();
71-
72-
if (!centerSelected) {
73-
items = [...items, {icon: Assets.icons.demo.add, key: 'add', ignore: true, width: 60, onPress: this.onAddItem}];
74-
}
75-
return items;
76-
}
68+
};
7769

7870
toggleItemsCount = () => {
7971
const {fewItems} = this.state;
@@ -97,14 +89,14 @@ class TabControllerScreen extends Component {
9789
});
9890
};
9991

100-
onChangeIndex = (selectedIndex) => {
92+
onChangeIndex = (selectedIndex: number) => {
10193
this.setState({selectedIndex});
10294
};
10395

10496
renderLoadingPage() {
10597
return (
10698
<View flex center>
107-
<ActivityIndicator size="large"/>
99+
<ActivityIndicator size="large" />
108100
<Text text60L marginT-10>
109101
Loading
110102
</Text>
@@ -119,18 +111,13 @@ class TabControllerScreen extends Component {
119111
return (
120112
<Container {...containerProps}>
121113
<TabController.TabPage index={0}>
122-
<Tab1/>
114+
<Tab1 />
123115
</TabController.TabPage>
124116
<TabController.TabPage index={1}>
125-
<Tab2/>
117+
<Tab2 />
126118
</TabController.TabPage>
127-
<TabController.TabPage
128-
index={2}
129-
lazy
130-
lazyLoadTime={1500}
131-
renderLoading={this.renderLoadingPage}
132-
>
133-
<Tab3/>
119+
<TabController.TabPage index={2} lazy lazyLoadTime={1500} renderLoading={this.renderLoadingPage}>
120+
<Tab3 />
134121
</TabController.TabPage>
135122

136123
{_.map(_.takeRight(TABS, TABS.length - 3), (title, index) => {
@@ -147,14 +134,7 @@ class TabControllerScreen extends Component {
147134
}
148135

149136
render() {
150-
const {
151-
key,
152-
selectedIndex,
153-
asCarousel,
154-
centerSelected,
155-
fewItems,
156-
items
157-
} = this.state;
137+
const {key, selectedIndex, asCarousel, centerSelected, fewItems, items} = this.state;
158138
return (
159139
<View flex bg-grey70>
160140
<TabController
@@ -166,7 +146,7 @@ class TabControllerScreen extends Component {
166146
>
167147
<TabController.TabBar
168148
// items={items}
169-
// key={key}
149+
key={key}
170150
// uppercase
171151
// indicatorStyle={{backgroundColor: 'green', height: 3}}
172152
// labelColor={'green'}
@@ -188,22 +168,22 @@ class TabControllerScreen extends Component {
188168
bg-green30={fewItems}
189169
label={fewItems ? 'Show Many Items' : 'Show Few Items'}
190170
marginB-12
191-
size="small"
171+
size={Button.sizes.small}
192172
onPress={this.toggleItemsCount}
193173
/>
194174
<Button
195175
bg-grey20={!asCarousel}
196176
bg-green30={asCarousel}
197177
label={`Carousel : ${asCarousel ? 'ON' : 'OFF'}`}
198178
marginB-12
199-
size="small"
179+
size={Button.sizes.small}
200180
onPress={this.toggleCarouselMode}
201181
/>
202182
<Button
203183
bg-grey20={!centerSelected}
204184
bg-green30={centerSelected}
205185
label={`centerSelected : ${centerSelected ? 'ON' : 'OFF'}`}
206-
size="small"
186+
size={Button.sizes.small}
207187
onPress={this.toggleCenterSelected}
208188
/>
209189
</View>

demo/src/screens/componentScreens/TabControllerScreen/tab1.js renamed to demo/src/screens/componentScreens/TabControllerScreen/tab1.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, {Component} from 'react';
22
import {StyleSheet} from 'react-native';
3-
import {Colors, View, Text, Image, Assets, Button} from 'react-native-ui-lib'; //eslint-disable-line
3+
import {View, Text, Image, Assets, Button} from 'react-native-ui-lib';
44

55
class Tab1 extends Component {
66
state = {};
@@ -19,7 +19,14 @@ class Tab1 extends Component {
1919
Home
2020
</Text>
2121
<View absR marginR-20>
22-
<Button marginT-20 round style={{width: 50}} size="small" iconSource={Assets.icons.search} white/>
22+
<Button
23+
marginT-20
24+
round
25+
style={{width: 50}}
26+
size={Button.sizes.small}
27+
iconSource={Assets.icons.search}
28+
white
29+
/>
2330
</View>
2431
</View>
2532
);

demo/src/screens/componentScreens/TabControllerScreen/tab2.js renamed to demo/src/screens/componentScreens/TabControllerScreen/tab2.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, {Component} from 'react';
22
import {StyleSheet} from 'react-native';
3-
import {Colors, View, Text, Image, Assets, Button} from 'react-native-ui-lib'; //eslint-disable-line
3+
import {View, Text, Image} from 'react-native-ui-lib';
44

55
class Tab2 extends Component {
66
state = {

demo/src/screens/componentScreens/TabControllerScreen/tab3.js renamed to demo/src/screens/componentScreens/TabControllerScreen/tab3.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React, {Component} from 'react';
22
import {ScrollView} from 'react-native';
33
import _ from 'lodash';
4-
import {Card, Avatar, View, Text, Image, Assets, Button} from 'react-native-ui-lib'; //eslint-disable-line
4+
import {Card, Avatar, View, Text} from 'react-native-ui-lib';
55

66
class Tab2 extends Component {
77
state = {
8-
loading: true,
8+
loading: true
99
};
1010

1111
componentDidMount() {
@@ -51,10 +51,12 @@ class Tab2 extends Component {
5151
<Avatar
5252
size={50}
5353
source={{
54-
uri: 'https://static.pexels.com/photos/60628/flower-garden-blue-sky-hokkaido-japan-60628.jpeg',
54+
uri: 'https://static.pexels.com/photos/60628/flower-garden-blue-sky-hokkaido-japan-60628.jpeg'
5555
}}
5656
/>
57-
<Text text40 marginL-20>{index}</Text>
57+
<Text text40 marginL-20>
58+
{index}
59+
</Text>
5860
</Card>
5961
);
6062
})}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/// <reference types="react" />
2+
import { ImageSourcePropType } from 'react-native';
3+
export interface ScrollBarGradientProps {
4+
/**
5+
* Is the gradient visible
6+
*/
7+
visible?: boolean;
8+
/**
9+
* Should the gradient be on the left (reverse)
10+
*/
11+
left?: boolean;
12+
/**
13+
* The gradient's width (default is 76)
14+
*/
15+
gradientWidth?: number;
16+
/**
17+
* The gradient's height (default 100%)
18+
*/
19+
gradientHeight?: number;
20+
/**
21+
* The gradient's margins (default is 0)
22+
*/
23+
gradientMargins?: number;
24+
/**
25+
* The gradient's height (default 100%)
26+
* @deprecated
27+
*/
28+
height?: number;
29+
/**
30+
* The gradient's color (default is white)
31+
*/
32+
gradientColor?: string;
33+
/**
34+
* Image source for the gradient (default is assets/gradientOverlay.png)
35+
*/
36+
gradientImage?: ImageSourcePropType;
37+
}
38+
declare const ScrollBarGradient: {
39+
({ visible, left, gradientWidth, gradientHeight, gradientMargins, height, gradientColor, gradientImage }: ScrollBarGradientProps): JSX.Element;
40+
displayName: string;
41+
};
42+
export default ScrollBarGradient;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React, { PureComponent } from 'react';
2+
import _ from 'lodash';
3+
import Animated from 'react-native-reanimated';
4+
/**
5+
* @description: TabController's Page Carousel
6+
* @example: https://github.com/wix/react-native-ui-lib/blob/master/demo/src/screens/componentScreens/TabControllerScreen/index.js
7+
* @notes: You must pass `asCarousel` flag to TabController and render your TabPages inside a PageCarousel
8+
*/
9+
declare class PageCarousel extends PureComponent {
10+
static displayName: string;
11+
static contextType: React.Context<{}>;
12+
carousel: React.RefObject<Animated.ScrollView>;
13+
onScroll: (...args: any[]) => void;
14+
componentDidMount(): void;
15+
onTabChange: ([index]: readonly number[]) => void;
16+
scrollToPage: (pageIndex: number) => void;
17+
renderCodeBlock: (() => JSX.Element) & _.MemoizedFunction;
18+
render(): JSX.Element;
19+
}
20+
export default PageCarousel;

0 commit comments

Comments
 (0)