Skip to content
This repository was archived by the owner on Dec 21, 2022. It is now read-only.

Commit 563109e

Browse files
Improving widgets (LV Swipe & Intro Screen) (#52)
* feat(listview-swipe): adding icon * feat(listview-swipe): simplify property xml * feat(listview-swipe): converting to functional component with hooks * fix(listview-swipe): removing default padding and height * feat(listview-swipe): implementing attributes and toggle option * fix(listview-swipe): fixing task * fix(listview-swipe): fixing unit tests * fix(listview-swipe): fixing archive effect * fix(listview-swipe): fixing spell of words * fix(intro-screen): defining transparent only for modal * fix(intro-screen): fixing functional problems * feat(intro-screen): introducing hide pagination in last slide * refactor(intro-screen): changing render mode of buttons and styles * fix(intro-screen): fixing spell * fix(intro-screen): fixing styles * feat(intro-screen): introducing Async Storage * fix(intro-screen): fixing styles null problem * feat(intro-screen): detecting notch * feat(listview-swipe): removing swipeout and fixing stuffs * feat(intro-screen): adding unit tests for phones with notch * fix(listview-swipe): fixing unit tests * fix(listview-swipe): adding custom mock for animations test * feat(intro-screen): allowing custom size for icons * refactor(listview-swipe): reordering props * fix(intro-screen): fixing pagination's elements disposition * refactor: refining widgets with suggestions * feat(intro-screen): updating icon * refactor: processing feedbacks * fix(qr-code): updating QRcode tests * fix(qr-code): fixing unit tests
1 parent 3508669 commit 563109e

24 files changed

+3121
-926
lines changed

packages-native/intro-screen/package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages-native/intro-screen/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@types/react-native-app-intro-slider": "^3.0.0"
2727
},
2828
"dependencies": {
29+
"@react-native-community/async-storage": "^1.6.2",
2930
"@native-mobile-resources/util-widgets": "^1.0.0"
3031
}
3132
}

packages-native/intro-screen/src/IntroScreen.tsx

Lines changed: 45 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,71 @@
1-
import { createElement, ReactNode, useCallback, useState } from "react";
1+
import { createElement, useCallback, useEffect, useState } from "react";
22
import { defaultWelcomeScreenStyle, IntroScreenStyle } from "./ui/Styles";
33
import { IntroScreenProps } from "../typings/IntroScreenProps";
4-
import { Modal, Text, View, ViewStyle } from "react-native";
5-
import { Icon } from "mendix/components/native/Icon";
6-
import { DynamicValue, NativeIcon, ValueStatus } from "mendix";
7-
import { flattenStyles } from "@native-mobile-resources/util-widgets";
4+
import { Modal, View } from "react-native";
5+
import { DynamicValue, ValueStatus } from "mendix";
86
import { SwipeableContainer } from "./SwipeableContainer";
9-
10-
interface RenderButtonProperty {
11-
[key: string]: ReactNode;
12-
}
7+
import AsyncStorage from "@react-native-community/async-storage";
8+
import deepmerge from "deepmerge";
139

1410
export function IntroScreen(props: IntroScreenProps<IntroScreenStyle>): JSX.Element {
15-
const [visible, setVisible] = useState(true);
16-
const styles = flattenStyles(defaultWelcomeScreenStyle, props.style);
11+
const [visible, setVisible] = useState(false);
12+
const customStyles = props.style ? props.style.filter(o => o != null) : [];
13+
const styles =
14+
customStyles.length > 0
15+
? deepmerge.all<IntroScreenStyle>([defaultWelcomeScreenStyle, ...customStyles])
16+
: defaultWelcomeScreenStyle;
17+
18+
useEffect(() => {
19+
if (props.identifier) {
20+
AsyncStorage.getItem(props.identifier).then(value => {
21+
setVisible(value === "" || value === null);
22+
});
23+
} else {
24+
setVisible(true);
25+
}
26+
}, []);
27+
1728
const onDone = useCallback(() => {
29+
hideModal();
1830
if (props.onDone && props.onDone.canExecute) {
1931
props.onDone.execute();
2032
}
21-
setVisible(false);
2233
}, []);
34+
2335
const onSlideChange = useCallback(() => {
2436
if (props.onSlideChange && props.onSlideChange.canExecute) {
2537
props.onSlideChange.execute();
2638
}
2739
}, []);
40+
2841
const onSkip = useCallback(() => {
42+
hideModal();
2943
if (props.onSkip && props.onSkip.canExecute) {
3044
props.onSkip.execute();
3145
}
32-
setVisible(false);
3346
}, []);
3447

35-
const renderText = (caption?: DynamicValue<string>): ReactNode => {
36-
if (caption && caption.status === ValueStatus.Available && caption.value) {
37-
return <Text style={styles.buttonIconText}>{caption.value}</Text>;
48+
const checkLabel = (label?: DynamicValue<string>): string | undefined => {
49+
if (label && label.value && label.status === ValueStatus.Available) {
50+
return label.value;
3851
}
3952
return undefined;
4053
};
4154

42-
const renderButton = (
43-
property: string,
44-
style: ViewStyle,
45-
icon?: DynamicValue<NativeIcon>,
46-
caption?: DynamicValue<string>
47-
): RenderButtonProperty => {
48-
const returnObject: RenderButtonProperty = {};
49-
if (!icon || !icon.value) {
50-
return returnObject;
55+
const hideModal = (): void => {
56+
if (props.identifier) {
57+
AsyncStorage.setItem(props.identifier, "gone").then(() => setVisible(false));
58+
} else {
59+
setVisible(false);
5160
}
52-
53-
returnObject[property] = () => (
54-
<View style={[{ flexDirection: "row", justifyContent: "center", alignItems: "center" }, style]}>
55-
<Icon icon={icon!.value} color={styles.buttonIconText.color ? styles.buttonIconText.color : "black"} />
56-
{renderText(caption)}
57-
</View>
58-
);
59-
60-
return returnObject;
61-
};
62-
63-
const renderLabel = (label?: DynamicValue<string>): string | undefined => {
64-
if (label && label.value && label.status === ValueStatus.Available) {
65-
return label.value;
66-
}
67-
return undefined;
6861
};
6962

7063
const showSkipPrevious = props.buttonPattern === "all";
7164
const showNextDone = props.buttonPattern !== "none";
72-
const renderButtonsProperties = {
73-
...renderButton("renderSkipButton", styles.buttonSkip, props.skipIcon, props.skipCaption),
74-
...renderButton("renderPreviousButton", styles.buttonPrevious, props.previousIcon, props.previousCaption),
75-
...renderButton("renderNextButton", styles.buttonNext, props.nextIcon, props.nextCaption),
76-
...renderButton("renderDoneButton", styles.buttonDone, props.doneIcon, props.doneCaption)
77-
};
7865

7966
return (
80-
<Modal visible={visible} transparent>
81-
<View style={props.showMode === "fullscreen" ? styles.fullscreenContainer : styles.cardContainer}>
67+
<Modal visible={visible} transparent={props.showMode === "popup"} hardwareAccelerated>
68+
<View style={props.showMode === "fullscreen" ? styles.fullscreenContainer : styles.popupContainer}>
8269
<SwipeableContainer
8370
slides={props.slides}
8471
onDone={onDone}
@@ -91,13 +78,17 @@ export function IntroScreen(props: IntroScreenProps<IntroScreenStyle>): JSX.Elem
9178
showPreviousButton={showSkipPrevious}
9279
showDoneButton={showNextDone}
9380
hidePagination={props.slideIndicators === "never"}
94-
skipLabel={renderLabel(props.skipCaption)}
95-
previousLabel={renderLabel(props.previousCaption)}
96-
nextLabel={renderLabel(props.nextCaption)}
97-
doneLabel={renderLabel(props.doneCaption)}
81+
skipLabel={checkLabel(props.skipCaption)}
82+
skipIcon={props.skipIcon}
83+
previousLabel={checkLabel(props.previousCaption)}
84+
previousIcon={props.previousIcon}
85+
nextLabel={checkLabel(props.nextCaption)}
86+
nextIcon={props.nextIcon}
87+
doneLabel={checkLabel(props.doneCaption)}
88+
doneIcon={props.doneIcon}
9889
styles={styles}
9990
activeSlide={props.activeSlideAttribute}
100-
{...renderButtonsProperties}
91+
hideIndicatorLastSlide={props.hideIndicatorLastSlide}
10192
/>
10293
</View>
10394
</Modal>

packages-native/intro-screen/src/IntroScreen.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<name>Intro screen</name>
77
<description />
88
<icon>
9-
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
1010
</icon>
1111
<properties>
1212
<propertyGroup caption="General">
@@ -55,6 +55,14 @@
5555
<enumerationValue key="never">Never</enumerationValue>
5656
</enumerationValues>
5757
</property>
58+
<property key="hideIndicatorLastSlide" type="boolean" defaultValue="false">
59+
<caption>Hide indicator in last slide</caption>
60+
<description />
61+
</property>
62+
<property key="identifier" type="string" required="false">
63+
<caption>Show once identifier</caption>
64+
<description>If this value is set, the intro screens will automatically be shown the first time the user opens the current page. This identifier is used to store locally whether the intro screen with this identifier is already shown. When the identifier is changed, the intro screen will be shown again for one time.</description>
65+
</property>
5866
</propertyGroup>
5967
<propertyGroup caption="Common">
6068
<systemProperty key="Visibility" />

0 commit comments

Comments
 (0)