import PropTypes from 'prop-types'
import React from 'react'
import { ActivityIndicator, Image, StyleSheet, Text, View } from 'react-native'
import RootSiblings from 'react-native-root-siblings'
import { errorHandler, shouldBeObject, successHandler } from '../../utils'
import errorPng from './error.png'
import successPng from './success.png'
const globalAny: any = global
const styles = StyleSheet.create({
toastView: {
width: 76,
height: 76,
justifyContent: 'center',
alignItems: 'center'
},
toastIcon: {
width: 55,
height: 55
},
toastContent: {
color: '#FFFFFF',
textAlign: 'center'
},
textToastContent: {
paddingTop: 10,
paddingBottom: 10,
paddingLeft: 15,
paddingRight: 15,
lineHeight: 20,
color: '#FFFFFF',
textAlign: 'center'
},
container: {
zIndex: 10000,
position: 'absolute',
width: '100%',
height: '100%',
alignItems: 'center',
justifyContent: 'center'
},
noMaskContainer: {
zIndex: 10000,
position: 'absolute',
top: '50%',
left: '50%',
width: 180,
height: 180,
marginLeft: -90,
marginTop: -90,
alignItems: 'center',
justifyContent: 'center'
},
itemView: {
backgroundColor: '#fff',
alignItems: 'center',
width: '100%',
justifyContent: 'center',
borderBottomWidth: 1,
borderBottomColor: 'rgba(0,0,0,0.5)'
},
grayBlock: {
width: 120,
height: 120,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'rgba(20,20,20,0.8)',
borderRadius: 8,
flexDirection: 'column'
},
textGrayBlock: {
width: 180,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'rgba(20,20,20,0.8)',
borderRadius: 8,
flexDirection: 'column'
}
})
const WXLoading = ({
title,
mask
}) => {
return (
{title}
)
}
WXLoading.propTypes = {
title: PropTypes.string,
mask: PropTypes.bool
}
function showToast (options: Taro.showToast.Option): Promise {
const isObject = shouldBeObject(options)
if (!isObject.res) {
const res = { errMsg: `showToast${isObject.msg}` }
console.error(res.errMsg)
return Promise.reject(res)
}
let { title = '', icon = 'success', image, duration = 1500, mask = false, success, fail, complete } = options || {} // eslint-disable-line
const isLoading = (icon === 'loading')
const res = isLoading ? { errMsg: 'showLoading:ok' } : { errMsg: 'showToast:ok' }
const maskStyle = mask ? styles.container : styles.noMaskContainer
let ToastView
if (image) {
ToastView =
{title || ''}
} else if (isLoading) {
ToastView =
} else if (icon === 'none') {
ToastView =
{title || ''}
} else {
ToastView =
{title || ''}
}
try {
// setTimeout fires incorrectly when using chrome debug #4470
// https://github.com/facebook/react-native/issues/4470
globalAny.wxToastRootSiblings && globalAny.wxToastRootSiblings.destroy()
globalAny.wxToastRootSiblings = new RootSiblings(ToastView)
setTimeout(() => {
globalAny.wxToastRootSiblings && globalAny.wxToastRootSiblings.update(ToastView)
}, 100)
if (duration > 0) {
setTimeout(() => {
globalAny.wxToastRootSiblings && globalAny.wxToastRootSiblings.destroy()
}, duration)
}
return successHandler(success, complete)(res)
} catch (e) {
res.errMsg = isLoading ? `showLoading:fail invalid ${e}` : `showToast:fail invalid ${e}`
return errorHandler(fail, complete)(res)
}
}
function showLoading (options: Taro.showLoading.Option = { title: '加载中' }): Promise {
const isObject = shouldBeObject(options)
if (!isObject.res) {
const res = { errMsg: `showLoading${isObject.msg}` }
console.error(res.errMsg)
return Promise.reject(res)
}
const { title = '', mask, success, fail, complete } = options || {}
return showToast({
title,
icon: 'loading',
duration: 0,
mask,
success,
fail,
complete
})
}
function hideToast (opts: Taro.hideToast.Option = {}): void {
const { success, fail, complete } = opts
try {
globalAny.wxToastRootSiblings && globalAny.wxToastRootSiblings.destroy()
globalAny.wxToastRootSiblings = undefined
const res = { errMsg: 'showToast:ok' }
success?.(res)
complete?.(res)
} catch (e) {
const res = { errMsg: e }
fail?.(res)
complete?.(res)
}
}
function hideLoading (opts: Taro.hideLoading.Option = {}): void {
const { success, fail, complete } = opts
try {
globalAny.wxToastRootSiblings && globalAny.wxToastRootSiblings.destroy()
globalAny.wxToastRootSiblings = undefined
const res = { errMsg: 'showLoading:ok' }
success?.(res)
complete?.(res)
} catch (e) {
const res = { errMsg: e }
fail?.(res)
complete?.(res)
}
}
export {
hideLoading,
hideToast,
showLoading,
showToast
}