import React, { Component } from 'react';
import createReactClass from 'create-react-class';
import { AppRegistry, View } from 'react-native';
import variables from '../../common/styles/variables';
const topviewList = []; // 使用数组，解决因 jsbundle 切换导致的元素丢失的问题
class Topview extends Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0,
            modelList: []
        };
    }
    componentDidMount() {
        topviewList.push(this);
    }
    componentWillUnmount() {
        const index = topviewList.indexOf(this);
        topviewList.splice(index, 1);
    }
    add(c, args) {
        return new Promise(resolve => {
            setTimeout(() => {
                let { modelList, count } = this.state;
                ++count;
                const tmp = modelList.concat();
                tmp.push({
                    id: count,
                    component: c,
                    args
                });
                this.setState({
                    count,
                    modelList: tmp
                });
                return resolve(count);
            });
        }).catch(e => {
            console.error(e);
        });
    }
    remove(id) {
        return new Promise(resolve => {
            setTimeout(() => {
                let { modelList, count } = this.state;
                let index = null;
                const matched = modelList.some((item, i) => {
                    /* tslint:disable:triple-equals */
                    if (item.id == id) {
                        index = i;
                        return true;
                    }
                    else {
                        return false;
                    }
                });
                if (!matched) {
                    return resolve();
                }
                const tmp = modelList.concat();
                tmp.splice(index, 1);
                if (!tmp.length) {
                    count = 0;
                }
                this.setState({
                    modelList: tmp,
                    count
                });
                return resolve();
            });
        }).catch(e => {
            console.error(e);
        });
    }
    replace(c, id) {
        return new Promise(resolve => {
            let { modelList } = this.state;
            const tmpList = modelList.concat();
            let tmpIndex;
            let tmpItem = tmpList.filter((item, index) => {
                if (item.id === id) {
                    tmpIndex = index;
                    return true;
                }
            })[0];
            tmpItem = {
                ...tmpItem,
                component: c
            };
            console.log(c);
            tmpList.splice(tmpIndex, 1, tmpItem);
            this.setState({
                modelList: tmpList
            });
            return resolve();
        }).catch(e => {
            console.error(e);
        });
    }
    render() {
        const { modelList } = this.state;
        if (!modelList.length) {
            return null;
        }
        else {
            return (React.createElement(View, { style: {
                    position: 'absolute',
                    zIndex: variables.topviewZIndex == null ? 1 : variables.topviewZIndex,
                    top: 0,
                    left: 0,
                    right: 0,
                    bottom: 0,
                }, pointerEvents: 'box-none', collapsable: false }, modelList.map((item) => {
                const args = item.args || {};
                args.fullScreenPatch = args.fullScreenPatch || [];
                return item.component ? React.cloneElement(item.component, {
                    key: item.id
                }) : null;
            })));
        }
    }
}
// 制作registerComponent 的替身
const originRegisterComponent = AppRegistry.registerComponent;
// 改写 registerComponent 方法的实现
AppRegistry.registerComponent = function (element, func) {
    const reg = func();
    return originRegisterComponent(element, function () {
        return createReactClass({
            render: function () {
                // 创建 root_element
                return React.createElement(View, {
                    style: { flex: 1 }
                }, React.createElement(reg, this.props), React.createElement(Topview, null));
            }
        });
    });
};
function getInstance() {
    return topviewList[topviewList.length - 1];
}
export { getInstance as TopviewGetInstance, Topview };
//# sourceMappingURL=index.js.map