Skip to content

Commit 0679a8f

Browse files
committed
Merge branch 'master' into release
2 parents 879bd8d + f607f15 commit 0679a8f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+10027
-487
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ yarn-error.log
6464
# UILib
6565
dist
6666
dist-ts
67-
yarn.lock
6867
package-lock.json
6968
docs/**/*.md
7069

Gemfile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
source 'https://rubygems.org'
22

33
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
4-
ruby File.read(File.join(__dir__, '.ruby-version')).strip
5-
6-
gem 'cocoapods', '~> 1.11', '>= 1.11.3'
4+
ruby '>= 2.6.10'
5+
gem 'cocoapods', '>= 1.11.3'

demo/src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ module.exports = {
6666
get HintsScreen() {
6767
return require('./screens/componentScreens/HintsScreen').default;
6868
},
69+
get HorizontalSortableListScreen() {
70+
return require('./screens/componentScreens/HorizontalSortableListScreen').default;
71+
},
6972
get IconScreen() {
7073
return require('./screens/componentScreens/IconScreen').default;
7174
},

demo/src/screens/MenuStructure.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ export const navigationData = {
9999
{title: 'Conversation List', tags: 'list conversation', screen: 'unicorn.lists.ConversationListScreen'},
100100
{title: 'Drawer', tags: 'drawer', screen: 'unicorn.components.DrawerScreen'},
101101
{title: 'SortableList', tags: 'sortable list drag', screen: 'unicorn.components.SortableListScreen'},
102+
{title: 'HorizontalSortableList', tags: 'sortable horizontal list drag', screen: 'unicorn.components.HorizontalSortableListScreen'},
102103
{title: 'GridList', tags: 'grid list', screen: 'unicorn.components.GridListScreen'},
103104
{title: 'SortableGridList', tags: 'sort grid list drag', screen: 'unicorn.components.SortableGridListScreen'}
104105
]
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import React, {useCallback, useState, useRef} from 'react';
2+
import {StyleSheet} from 'react-native';
3+
import {SortableList, View, Text, Colors, Button, Card, BorderRadiuses} from 'react-native-ui-lib';
4+
import {renderHeader} from '../ExampleScreenPresenter';
5+
import products from '../../data/products';
6+
7+
const data = products.map((product, index) => ({...product, locked: index === 3}));
8+
type Item = (typeof data)[0];
9+
10+
const HorizontalSortableListScreen = () => {
11+
const [items, setItems] = useState<Item[]>(data);
12+
const [selectedItems, setSelectedItems] = useState<Item[]>([]);
13+
const [removedItems, setRemovedItems] = useState<Item[]>([]);
14+
const orderedItems = useRef<Item[]>(data);
15+
16+
const toggleItemSelection = useCallback((item: Item) => {
17+
if (selectedItems.includes(item)) {
18+
setSelectedItems(selectedItems.filter(selectedItem => ![item.id].includes(selectedItem.id)));
19+
} else {
20+
setSelectedItems(selectedItems.concat(item));
21+
}
22+
},
23+
[selectedItems, setSelectedItems]);
24+
25+
const addItem = useCallback(() => {
26+
if (removedItems.length > 0) {
27+
orderedItems.current = orderedItems.current.concat(removedItems[0]);
28+
setItems(orderedItems.current);
29+
setRemovedItems(removedItems.slice(1));
30+
}
31+
}, [removedItems, setItems, setRemovedItems]);
32+
33+
const removeSelectedItems = useCallback(() => {
34+
setRemovedItems(removedItems.concat(selectedItems));
35+
setSelectedItems([]);
36+
orderedItems.current = orderedItems.current.filter(item => !selectedItems.includes(item));
37+
setItems(orderedItems.current);
38+
}, [setRemovedItems, removedItems, selectedItems, setItems, setSelectedItems]);
39+
40+
const keyExtractor = useCallback((item: Item) => {
41+
return `${item.id}`;
42+
}, []);
43+
44+
const onOrderChange = useCallback((newData: Item[]) => {
45+
console.log('New order:', newData);
46+
orderedItems.current = newData;
47+
}, []);
48+
49+
const renderItem = useCallback(({item, index: _index}: {item: Item; index: number}) => {
50+
const selected = selectedItems.includes(item);
51+
const {locked} = item;
52+
const Container = locked ? View : Card;
53+
return (
54+
<Container
55+
style={styles.itemContainer}
56+
onPress={() => toggleItemSelection(item)}
57+
customValue={item.id}
58+
selected={selected}
59+
margin-s1
60+
>
61+
<Card.Section
62+
imageSource={{uri: item.mediaUrl}}
63+
imageStyle={styles.itemImage}
64+
imageProps={{
65+
customOverlayContent: (
66+
<Text margin-s1={!locked} h1={!locked} h4={locked} center={locked} orange30>
67+
{locked ? 'Locked' : item.id}
68+
</Text>
69+
)
70+
}}
71+
/>
72+
</Container>
73+
);
74+
},
75+
[selectedItems, toggleItemSelection]);
76+
77+
return (
78+
<View flex bg-$backgroundDefault>
79+
{renderHeader('Sortable List', {'margin-10': true})}
80+
<View row center marginB-s2>
81+
<Button label="Add Item" size={Button.sizes.xSmall} disabled={removedItems.length === 0} onPress={addItem}/>
82+
<Button
83+
label="Remove Items"
84+
size={Button.sizes.xSmall}
85+
disabled={selectedItems.length === 0}
86+
marginL-s3
87+
onPress={removeSelectedItems}
88+
/>
89+
</View>
90+
<View flex useSafeArea>
91+
<SortableList
92+
horizontal
93+
data={items}
94+
renderItem={renderItem}
95+
keyExtractor={keyExtractor}
96+
onOrderChange={onOrderChange}
97+
scale={1.02}
98+
/>
99+
</View>
100+
</View>
101+
);
102+
};
103+
104+
export default HorizontalSortableListScreen;
105+
const styles = StyleSheet.create({
106+
itemContainer: {
107+
overflow: 'hidden',
108+
borderColor: Colors.$outlineDefault,
109+
borderBottomWidth: 1
110+
},
111+
selectedItemContainer: {
112+
borderLeftColor: Colors.$outlinePrimary,
113+
borderLeftWidth: 5
114+
},
115+
itemImage: {
116+
width: 80,
117+
height: 80,
118+
borderRadius: BorderRadiuses.br10
119+
}
120+
});

demo/src/screens/componentScreens/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export function registerScreens(registrar) {
5050
registrar('unicorn.components.SliderScreen', () => require('./SliderScreen').default);
5151
registrar('unicorn.components.SortableGridListScreen', () => require('./SortableGridListScreen').default);
5252
registrar('unicorn.components.SortableListScreen', () => require('./SortableListScreen').default);
53+
registrar('unicorn.components.HorizontalSortableListScreen', () => require('./HorizontalSortableListScreen').default);
5354
registrar('unicorn.components.StackAggregatorScreen', () => require('./StackAggregatorScreen').default);
5455
registrar('unicorn.components.StepperScreen', () => require('./StepperScreen').default);
5556
registrar('unicorn.components.SwitchScreen', () => require('./SwitchScreen').default);

demo/src/screens/incubatorScreens/IncubatorToastScreen.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ const TOAST_MESSAGES = {
1919
offline: 'Check Your Internet Connection'
2020
};
2121

22-
// TODO: "ReactImageView: Image source "null" doesn't exist" (Android + preset "none")
2322
class ToastsScreen extends Component {
2423
showToast = false; // keep this state in class instance for immediate response
2524
state = {

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@
7676
"@types/jest": "^29.2.1",
7777
"@types/lodash": "^4.0.0",
7878
"@types/prop-types": "^15.5.3",
79-
"@types/react": "^18.0.24",
80-
"@types/react-native": "0.68.5",
79+
"@types/react": "^18.2.15",
80+
"@types/react-native": "0.71.2",
8181
"@types/tinycolor2": "^1.4.2",
8282
"@types/url-parse": "^1.4.3",
8383
"@typescript-eslint/eslint-plugin": "^5.3.1",
@@ -96,7 +96,7 @@
9696
"gh-pages": "^1.1.0",
9797
"jest": "^29.2.1",
9898
"light-date": "^1.2.0",
99-
"metro-react-native-babel-preset": "0.73.7",
99+
"metro-react-native-babel-preset": "0.73.10",
100100
"mocha": "^5.0.0",
101101
"moment": "^2.24.0",
102102
"object-hash": "^3.0.0",
@@ -106,14 +106,14 @@
106106
"react": "18.2.0",
107107
"react-autobind": "^1.0.6",
108108
"react-dom": "^18.2.0",
109-
"react-native": "0.71.2",
109+
"react-native": "0.71.12",
110110
"react-native-fs": "^2.20.0",
111111
"react-native-gesture-handler": "2.9.0",
112112
"react-native-haptic-feedback": "^1.11.0",
113113
"react-native-linear-gradient": "2.6.2",
114114
"react-native-mmkv": "2.6.1",
115115
"react-native-navigation": "7.32.1",
116-
"react-native-reanimated": "3.1.0",
116+
"react-native-reanimated": "3.4.0",
117117
"react-native-shimmer-placeholder": "^2.0.6",
118118
"react-native-svg": "^13.7.0",
119119
"react-native-svg-transformer": "^0.14.3",

scripts/prReleaseNotes.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const GITHUB_TOKEN = 'xxxx';
2-
const LATEST_VERSION = '7.3.0';
3-
const NEW_VERSION = '7.4.0';
4-
const PREFIX = 'uilib';
2+
const LATEST_VERSION = '7.10.0';
3+
const NEW_VERSION = '7.11.0';
4+
const FILE_PREFIX = 'uilib';
55
const REPO = 'wix/react-native-ui-lib';
66

7-
require('./prReleaseNotesCommon').generateReleaseNotes(LATEST_VERSION, NEW_VERSION, GITHUB_TOKEN, PREFIX, REPO);
7+
require('./prReleaseNotesCommon').generateReleaseNotes(LATEST_VERSION, NEW_VERSION, GITHUB_TOKEN, FILE_PREFIX, REPO);

scripts/prReleaseNotesCommon.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ const childProcess = require('child_process');
44
const fetch = require('node-fetch');
55
const readline = require('readline');
66

7-
function fetchLatestReleaseDate(version) {
8-
const relesae = childProcess.execSync(`gh release view ${version}`).toString();
7+
function fetchLatestReleaseDate(tagPrefix, version) {
8+
const relesae = childProcess.execSync(`gh release view ${tagPrefix}${version}`).toString();
99
const releaseMetaData = relesae.split('--')[0];
1010
const createDate = _.flow(data => _.split(data, '\n'),
1111
linesData => _.find(linesData, l => l.startsWith('created')),
@@ -147,8 +147,8 @@ function getReleaseNotesForType(PRs, title) {
147147
return releaseNotes;
148148
}
149149

150-
async function _generateReleaseNotes(latestVersion, newVersion, githubToken, prefix, repo, header) {
151-
const latestReleaseDate = fetchLatestReleaseDate(latestVersion);
150+
async function _generateReleaseNotes(latestVersion, newVersion, githubToken, fileNamePrefix, repo, header, tagPrefix) {
151+
const latestReleaseDate = fetchLatestReleaseDate(tagPrefix, latestVersion);
152152
const PRs = await fetchMergedPRs(latestReleaseDate, repo, githubToken);
153153
if (!PRs) {
154154
return;
@@ -175,14 +175,14 @@ async function _generateReleaseNotes(latestVersion, newVersion, githubToken, pre
175175
releaseNotes += getReleaseNotesForType(silentPRs,
176176
'// Silent - these PRs did not have a changelog or were left out for some other reason, is it on purpose?');
177177

178-
fs.writeFileSync(`${process.env.HOME}/Downloads/${prefix}-release-notes_${newVersion}.txt`, releaseNotes, {
178+
fs.writeFileSync(`${process.env.HOME}/Downloads/${fileNamePrefix}-release-notes_${newVersion}.txt`, releaseNotes, {
179179
encoding: 'utf8'
180180
});
181181

182-
console.log(`\x1b[1m\x1b[32m✔\x1b[0m \x1b[32m${prefix}-release-notes.txt was successfully written to ${process.env.HOME}/Downloads\x1b[0m \x1b[1m\x1b[32m✔\x1b[0m`);
182+
console.log(`\x1b[1m\x1b[32m✔\x1b[0m \x1b[32m${fileNamePrefix}-release-notes.txt was successfully written to ${process.env.HOME}/Downloads\x1b[0m \x1b[1m\x1b[32m✔\x1b[0m`);
183183
}
184184

185-
async function generateReleaseNotes(latestVersion, newVersion, githubToken, prefix, repo, header = '') {
185+
async function generateReleaseNotes(latestVersion, newVersion, githubToken, fileNamePrefix, repo, header = '', tagPrefix = '') {
186186
let latestVer, newVer;
187187
const rl = readline.createInterface({
188188
input: process.stdin,
@@ -200,7 +200,7 @@ async function generateReleaseNotes(latestVersion, newVersion, githubToken, pref
200200
rl.on('close', () => {
201201
console.info(`Current latest version is v${latestVer}`);
202202
console.info(`Generating release notes out or PRs for v${newVer}`);
203-
_generateReleaseNotes(latestVer, newVer, githubToken, prefix, repo, header);
203+
_generateReleaseNotes(latestVer, newVer, githubToken, fileNamePrefix, repo, header, tagPrefix);
204204
});
205205
}
206206

0 commit comments

Comments
 (0)