|
|
@@ -0,0 +1,193 @@
|
|
|
+/**
|
|
|
+ * ModalPortal
|
|
|
+ * @邠心vbe on 2022/02/28
|
|
|
+ */
|
|
|
+import React, { Component } from 'react';
|
|
|
+import { StyleSheet, View } from 'react-native';
|
|
|
+import Modal from 'react-native-modal';
|
|
|
+
|
|
|
+let modal
|
|
|
+export default class ModalPortal extends Component {
|
|
|
+ constructor(props) {
|
|
|
+ super(props);
|
|
|
+ this.state = {
|
|
|
+ showDialog: false,
|
|
|
+ showLoading: false,
|
|
|
+ showIOSLoading: false,
|
|
|
+ children: <></>,
|
|
|
+ loadChildren: <></>,
|
|
|
+ loadMessage: "...",
|
|
|
+ };
|
|
|
+ modal = this;
|
|
|
+ this.isHide = true;
|
|
|
+ this.onBack = undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ static show(children, onBack) {
|
|
|
+ return modal.show(children, onBack);
|
|
|
+ }
|
|
|
+
|
|
|
+ static showLoading(children) {
|
|
|
+ return modal.showLoading(children);
|
|
|
+ }
|
|
|
+
|
|
|
+ static dismiss() {
|
|
|
+ modal.dismiss();
|
|
|
+ }
|
|
|
+
|
|
|
+ static dismissLoading() {
|
|
|
+ modal.dismissLoading();
|
|
|
+ }
|
|
|
+
|
|
|
+ static dismissAll() {
|
|
|
+ modal.dismissAll();
|
|
|
+ }
|
|
|
+
|
|
|
+ static isShowing() {
|
|
|
+ return modal.isShowing();
|
|
|
+ }
|
|
|
+
|
|
|
+ show(children, onBack=undefined) {
|
|
|
+ if (isIOS) {
|
|
|
+ if (!this.isHide) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.show(children);
|
|
|
+ }, 500);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.setState({
|
|
|
+ showDialog: true,
|
|
|
+ children: children,
|
|
|
+ }, () => {
|
|
|
+ this.onModalShow();
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.setState({
|
|
|
+ showDialog: true,
|
|
|
+ children: children
|
|
|
+ })
|
|
|
+ this.onBack = onBack;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ showLoading(children) {
|
|
|
+ if (isIOS) {
|
|
|
+ //console.log("showIOSLoading", children)
|
|
|
+ this.setState({
|
|
|
+ loadChildren: children,
|
|
|
+ showIOSLoading: true
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.setState({
|
|
|
+ showLoading: true,
|
|
|
+ loadChildren: children
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dismiss() {
|
|
|
+ this.setState({
|
|
|
+ showDialog: false
|
|
|
+ })
|
|
|
+ this.onBack = undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ dismissLoading() {
|
|
|
+ if (isIOS) {
|
|
|
+ this.setState({
|
|
|
+ showIOSLoading: false
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.setState({
|
|
|
+ showLoading: false
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dismissAll() {
|
|
|
+ this.setState({
|
|
|
+ showDialog: false,
|
|
|
+ showLoading: false,
|
|
|
+ showIOSLoading: false
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ isShowing() {
|
|
|
+ //console.log("[ModalPortal] isShowing", this.state.showDialog);
|
|
|
+ return this.state.showDialog;
|
|
|
+ }
|
|
|
+
|
|
|
+ onBackPress() {
|
|
|
+ if (this.onBack) {
|
|
|
+ this.onBack();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (this.state.showLoading) {
|
|
|
+ this.dismissLoading();
|
|
|
+ } else if (this.state.showDialog) {
|
|
|
+ this.dismiss();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ onModalShow() {
|
|
|
+ //console.log('onModalShow', this.isHide);
|
|
|
+ this.isHide = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ onModalHide() {
|
|
|
+ //console.log('onModalHide', this.isHide);
|
|
|
+ this.isHide = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <Modal
|
|
|
+ style={{margin: 0, zIndex: 900}}
|
|
|
+ isVisible={this.state.showDialog}
|
|
|
+ deviceHeight={$height + statusHeight}
|
|
|
+ avoidKeyboard={true}
|
|
|
+ animationIn={"fadeIn"}
|
|
|
+ animationOut={"fadeOut"}
|
|
|
+ useNativeDriver={true}
|
|
|
+ statusBarTranslucent={true}
|
|
|
+ onBackButtonPress={() => this.onBackPress()}
|
|
|
+ onModalHide={() => this.onModalHide()}>
|
|
|
+ {this.state.children}
|
|
|
+ </Modal>
|
|
|
+ <Modal
|
|
|
+ style={{margin: 0, zIndex: 901}}
|
|
|
+ isVisible={this.state.showLoading}
|
|
|
+ deviceHeight={$height + statusHeight}
|
|
|
+ animationIn="fadeIn"
|
|
|
+ animationOut="fadeOut"
|
|
|
+ useNativeDriver={true}
|
|
|
+ animationInTiming={80}
|
|
|
+ animationOutTiming={100}
|
|
|
+ statusBarTranslucent={true}
|
|
|
+ onBackButtonPress={() => this.onBackPress()}>
|
|
|
+ {this.state.loadChildren}
|
|
|
+ </Modal>
|
|
|
+ { this.state.showIOSLoading &&
|
|
|
+ <View style={styles.iosLoadingView}>
|
|
|
+ {this.state.loadChildren}
|
|
|
+ </View>
|
|
|
+ }
|
|
|
+ </>
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const styles = StyleSheet.create({
|
|
|
+ iosLoadingView: {
|
|
|
+ top: 0,
|
|
|
+ left: 0,
|
|
|
+ right: 0,
|
|
|
+ bottom: 0,
|
|
|
+ zIndex: 500,
|
|
|
+ alignItems: 'center',
|
|
|
+ position: 'absolute',
|
|
|
+ justifyContent: 'center',
|
|
|
+ backgroundColor: 'rgba(0,0,0,.7)'
|
|
|
+ }
|
|
|
+})
|