import React, { ReactNode, forwardRef, ForwardRefRenderFunction, useImperativeHandle, } from 'react'; import { StyleSheet, Text, View, ImageRequireSource } from 'react-native'; import { renderTextLikeJSX, mergeProps } from '../../core/helpers'; import { Button, Fill, ShouldRender } from '@xrnjs/ui'; import { ErrorBlockProps } from './interface'; import createStyle from './styles/errorBlock.style'; import { useTheme } from '../Theme/Theme'; import Image from '../Image'; import { TextType } from '../Button/enum'; const StatusMapToImage = { notFound: require('./asset/SystemError.webp'), empty: require('./asset/emptyv1.png'), finished: require('./asset/finished.png'), networkError: require('./asset/errorv1.png'), noAuth: require('./asset/noAuthv1.png'), noLogin: require('./asset/emptyv1.png'), noData: require('./asset/404v1.png'), systemCompatibility: require('./asset/errorv1.png'), systemUpgrade: require('./asset/errorv1.png'), emptyIcon: require('./asset/emptyIcon.png'), } as { [key: string]: ImageRequireSource }; export interface ErrorBlockRef {} const ErrorBlock: ForwardRefRenderFunction = ( p, ref ) => { const props: ErrorBlockProps = mergeProps(p); const { isSmallScene = false, smallSceneText, title, titleStyle, description, descriptionStyle, extra, status = 'empty', image, fullPage = false, style, footer, footerText, footerSecondText, footerDescription, footerDescriptionText, footerDescriptionTextStyle, onFooterDescriptionPress, onFooterPress, onFooterSecondPress, smallSceneLayout = 'horizontal', } = props; const token = useTheme(); const styles = createStyle(token); useImperativeHandle(ref, () => ({})); const renderImage = () => { if (image) { if (typeof image === 'string') { return ; } return image; } else if (StatusMapToImage[status]) { return ; } }; const renderTitle = () => { return renderTextLikeJSX(title, [styles.title, titleStyle]); }; const renderDescription = () => { return renderTextLikeJSX(description, [ styles.description, descriptionStyle, ]); }; const renderFooter = () => { return footer ? ( footer ) : ( ); }; const renderFooterDescription = () => { return footerDescription ? ( footerDescription ) : ( ); }; const renderSmallScene = ( text: ReactNode, icon: keyof typeof StatusMapToImage = 'emptyIcon', layout: 'horizontal' | 'vertical' = 'horizontal' ) => { const source = StatusMapToImage[icon]; return ( {text} ); }; return isSmallScene ? ( {renderSmallScene(smallSceneText, 'emptyIcon', smallSceneLayout)} ) : ( {renderImage()} {renderTitle()} {renderDescription()} {renderFooter()} {renderFooterDescription()} {extra && extra} ); }; export default forwardRef(ErrorBlock); export type { ErrorBlockProps }; // 适配之前xt-rn-core通过相对路径引入类型定义的问题