React Native create a FoldView using react-native-foldview module
React
React Native
Android
Ios
application
Apk
IPA
Foldview
- By Code solution
- Aug 3rd, 2021
- 0 comments
- 4
React-Navigation provides a 100% feel native application fold view in android and ios both. Today we are going to learn how to create a fold view in my react-native application.
Project Folder Structure
android ios node_modules src Componets AdditionalInfoCard.js InfoCard.js Lines.js PhotoCard.js ProfileCard.js ProfileDetailCard.js App.js Row.js app.json babel.config.js index.js metro.config.js package-lock.json package.json
- Creating New Project run this command
react-native init <Project-name>
- After then create a project add node package
npm install --save react-native-foldview
- After then Open index.js under the Project folder and add this code.
import {AppRegistry} from 'react-native'; import App from './src/App'; import {name as appName} from './app.json'; AppRegistry.registerComponent(appName, () => App);
- After then src folder under the project folder like "project-name/src/" and cut the App.js of the root folder and paste src folder
- After that add this code in App.js
import React from 'react'; import { Platform, SafeAreaView, ScrollView, StatusBar, StyleSheet, View, } from 'react-native'; import Row from './Row'; const STATUSBAR_HEIGHT = Platform.OS === 'ios' ? 20 : 0; const styles = StyleSheet.create({ container: { flex: 1, }, scrollView: { backgroundColor: '#4A637D', flex: 1, padding: 10, paddingTop: STATUSBAR_HEIGHT, }, }); export default () => ( <SafeAreaView style={styles.container}> <StatusBar barStyle="dark-content"/> <ScrollView style={styles.scrollView}> <Row zIndex={100} /> <Row zIndex={90} /> <Row zIndex={80} /> <Row zIndex={70} /> </ScrollView> </SafeAreaView> );
- After That Create Row.js in the src folder and add the code
import React, { Component, } from 'react'; import { LayoutAnimation, UIManager, View, } from 'react-native'; import FoldView from 'react-native-foldview'; import InfoCard from './components/InfoCard'; import PhotoCard from './components/PhotoCard'; import ProfileCard from './components/ProfileCard'; // Enable LayoutAnimation on Android if (UIManager.setLayoutAnimationEnabledExperimental) { UIManager.setLayoutAnimationEnabledExperimental(true); } const ROW_HEIGHT = 180; const Spacer = ({ height }) => ( <View pointerEvents="none" style={{ height, }} /> ); export default class Row extends Component { constructor(props) { super(props); this.state = { expanded: false, height: ROW_HEIGHT, }; } componentWillMount() { this.flip = this.flip.bind(this); this.handleAnimationStart = this.handleAnimationStart.bind(this); this.renderFrontface = this.renderFrontface.bind(this); this.renderBackface = this.renderBackface.bind(this); } flip() { this.setState({ expanded: !this.state.expanded, }); } handleAnimationStart(duration, height) { const isExpanding = this.state.expanded; const animationConfig = { duration, update: { type: isExpanding ? LayoutAnimation.Types.easeOut : LayoutAnimation.Types.easeIn, property: LayoutAnimation.Properties.height, }, }; LayoutAnimation.configureNext(animationConfig); this.setState({ height, }); } renderFrontface() { return ( <InfoCard onPress={this.flip} /> ); } renderBackface() { return ( <ProfileCard onPress={this.flip} /> ); } render() { const { height } = this.state; const { zIndex } = this.props; const spacerHeight = height - ROW_HEIGHT; return ( <View style={{ flex: 1, zIndex, }} > <View style={{ height: ROW_HEIGHT, margin: 10, }} > <FoldView expanded={this.state.expanded} onAnimationStart={this.handleAnimationStart} perspective={1000} renderBackface={this.renderBackface} renderFrontface={this.renderFrontface} > <PhotoCard onPress={this.flip} /> </FoldView> </View> <Spacer height={spacerHeight} /> </View> ); } }
- After then create the components folder under the src folder and create an AdditionalInfoCard.js, InfoCard.js, Lines.js, PhotoCard.js, ProfileCard.js, and ProfileDetailCard.js file then add code
AdditionalInfoCard.js import React from 'react'; import { View, StyleSheet, } from 'react-native'; import { ThinGrayLine, ThickDarkGrayLine, } from './Lines'; export default ({ onPress }) => ( <View style={{ flex: 1, paddingTop: 10, paddingHorizontal: 16, flexDirection: 'row', backgroundColor: '#FFFFFF', borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: '#BDC2C9', }} > <View style={{ flex: 1 }}> <ThickDarkGrayLine width={100} /> <ThinGrayLine width={80} onPress={onPress} /> </View> <View style={{ flex: 1 }}> <ThickDarkGrayLine width={60} /> <ThinGrayLine width={120} /> </View> </View> ); InfoCard.js import React from 'react'; import { View, StyleSheet, } from 'react-native'; import { ThinGrayLine, ThickGrayLine, ThickDarkGrayLine, ThinRedLine, } from './Lines'; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', flexDirection: 'row', }, leftPane: { flex: 1, backgroundColor: '#33373B', padding: 16, flexDirection: 'column', justifyContent: 'space-between', }, rightPane: { flex: 2, padding: 16, backgroundColor: '#fff', }, }); export default ({ onPress }) => ( <View style={styles.container}> <View style={styles.leftPane}> <ThickGrayLine /> <View> <ThinRedLine onPress={onPress} /> <ThickGrayLine width={80} /> </View> </View> <View style={styles.rightPane}> <View style={{ flex: 1, flexDirection: 'column' }}> <ThickGrayLine width={140} /> <ThickGrayLine width={160} /> </View> <View style={{ flexDirection: 'row' }}> <View style={{ flex: 1 }}> <ThinGrayLine width={60} /> <ThickDarkGrayLine width={60} /> </View> <View style={{ flex: 1 }}> <ThinGrayLine width={60} /> <ThickDarkGrayLine width={60} /> </View> </View> </View> </View> ); Lines.js import React from 'react'; import { View, TouchableHighlight, } from 'react-native'; const Line = ({ style, onPress }) => { if (onPress) { return ( <TouchableHighlight style={[ { marginBottom: 10, borderRadius: 2, }, style, ]} onPress={onPress} > <View /> </TouchableHighlight> ); } return ( <View style={[ { marginBottom: 10, }, style, ]} /> ); }; const ThinLine = ({ color, width = 60, ...props }) => ( <Line style={{ width, backgroundColor: color, height: 10, }} {...props} /> ); const ThickLine = ({ color, width = 70, ...props }) => ( <Line style={{ width, backgroundColor: color, height: 20, }} {...props} /> ); export const ThinGrayLine = (props) => ( <ThinLine color={'#BDC2C9'} {...props} /> ); export const ThickGrayLine = (props) => ( <ThickLine color={'#BDC2C9'} {...props} /> ); export const ThickWhiteLine = (props) => ( <ThickLine color={'#FFFFFF'} {...props} /> ); export const ThickDarkGrayLine = (props) => ( <ThickLine color={'#33373B'} {...props} /> ); export const ThinRedLine = (props) => ( <ThinLine color={'#DB0000'} {...props} /> ); PhotoCard.js import React from 'react'; import { View, StyleSheet, } from 'react-native'; import { ThinGrayLine, ThickWhiteLine, } from './Lines'; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#33373B', padding: 10, flexDirection: 'column', }, card: { flex: 1, backgroundColor: '#FFFFFF', justifyContent: 'flex-end', }, }); export default ({ onPress }) => ( <View style={styles.container}> <View style={{ flexDirection: 'row', justifyContent: 'space-between', backgroundColor: '#5A4A9C', height: 40, padding: 10, }} > <ThickWhiteLine width={40} onPress={onPress} /> <ThickWhiteLine width={60} onPress={onPress} /> <ThickWhiteLine width={40} onPress={onPress} /> </View> <View style={styles.card}> <View style={{ flexDirection: 'row', justifyContent: 'space-between', padding: 10, paddingBottom: 0, }} onPress={onPress} > <ThinGrayLine width={40} onPress={onPress}/> <ThinGrayLine width={80} onPress={onPress} /> <ThinGrayLine width={50} onPress={onPress} /> </View> </View> </View> ); ProfileCard.js import React, { Component, } from 'react'; import { View, Text, TouchableHighlight, StyleSheet, } from 'react-native'; import FoldView from 'react-native-foldview'; import ProfileDetailCard from './ProfileDetailCard'; import AdditionalInfoCard from './AdditionalInfoCard'; import { ThinGrayLine, ThickDarkGrayLine, } from './Lines'; export default class ProfileCard extends Component { componentWillMount() { this.renderBackface = this.renderBackface.bind(this); this.renderInnerBackFace = this.renderInnerBackFace.bind(this); } renderBlankFace() { return ( <View style={{ backgroundColor: '#D6EFFF', flex: 1, }} /> ); } renderBackface() { const onPress = this.props.onPress; return ( <View style={{ flex: 1 }}> <FoldView renderFrontface={this.renderBlankFace} renderBackface={this.renderInnerBackFace} > <AdditionalInfoCard onPress={onPress} /> </FoldView> </View> ); } renderInnerBackFace() { const onPress = this.props.onPress; return ( <View style={{ backgroundColor: '#fff', flex: 1, borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: '#BDC2C9', borderBottomLeftRadius: 2, borderBottomRightRadius: 2, }} > <View style={{ backgroundColor: '#FFBD18', flex: 1, margin: 14, borderRadius: 2, }} > <TouchableHighlight style={{ flex: 1, justifyContent: 'center', alignItems: 'center', }} onPress={onPress} > <Text> PRESS ME </Text> </TouchableHighlight> </View> </View> ); } render() { const onPress = this.props.onPress; return ( <View style={{ flex: 1, backgroundColor: '#fff', flexDirection: 'column', }} > <View style={{ flex: 1 }} > <View style={{ flex: 1, paddingBottom: 10, padding: 16, }} > <ThinGrayLine width={120} /> <View style={{ marginTop: 10, flexDirection: 'row', }} > <TouchableHighlight onPress={onPress} > <View style={{ width: 40, height: 40, marginRight: 10, backgroundColor: '#BDC2C9', }} /> </TouchableHighlight> <View style={{ flex: 1, flexDirection: 'column', }} > <ThickDarkGrayLine width={200} /> <ThinGrayLine width={120} /> </View> </View> </View> <View style={{ flex: 1 }}> <FoldView renderFrontface={this.renderBlankFace} renderBackface={this.renderBackface} > <ProfileDetailCard onPress={onPress} /> </FoldView> </View> </View> </View> ); } } ProfileDetailCard.js import React from 'react'; import { View, StyleSheet, } from 'react-native'; import { ThinGrayLine, ThickGrayLine, } from './Lines'; const styles = StyleSheet.create({ container: { flex: 1, paddingTop: 10, paddingHorizontal: 16, flexDirection: 'row', borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: '#BDC2C9', }, }); export default ({ onPress }) => ( <View style={styles.container}> <View style={{ flex: 1 }}> <ThickGrayLine width={60} /> <ThinGrayLine width={120} /> </View> <View style={{ flex: 1 }}> <ThickGrayLine width={60} onPress={onPress} /> <ThinGrayLine width={120} /> </View> </View> );
Fold View in React Native using React-Native-Foldview is done.
Run command
react-native run-android react-native run-ios
if you change the App name then you delete the android and ios folder of your project. After that run this command
npm i -s react-native-eject / yarn add react-native-eject react-native eject
this command help to create android and ios folder with clean status
Thank you
Github link: https://github.com/Sudarshan101/react-native-foldview
youtube: https://www.youtube.com/watch?v=MqcZ3ct-LQ0