view.tsx 3.42 KB
/* eslint-disable @typescript-eslint/camelcase */
/**
 * @author sheng
 * @description 功能介绍列表页
 * @date 2020/09/03
 */
import React, { memo, useState, useLayoutEffect, useEffect } from 'react'
import { Text, View, FlatList, Pressable, InteractionManager } from 'react-native'
import { Icons } from '../../../assets/icons'
import { styles } from './style'
import { dateFormat, setUnit } from '../../../libs/utils'
import { Toast, Divider, Empty, ModalManager } from 'react-native-mb-ui'
import { getVersionList } from '../../../api/version'
import { NavigationProp } from '@react-navigation/native'
import { RouteList } from '../../../router/route'

interface Items {
    version: string;
    create_time: number;
    remark: string;
    id: number;
}

interface ItemProp {
    onClick: () => void;
    item: Items;
}

const Item = memo(({ onClick, item }: ItemProp) => {
    const { version, create_time } = item
    return (
        <>
            <Pressable
                style={styles.item}
                android_ripple={{ color: '#eee' }}
                onPress={onClick}
            >
                <View style={styles.content}>
                    <Text style={styles.title}>商品交易所{version}主要更新</Text>
                    <Text style={styles.subtitle}>{dateFormat('MM/DD', new Date(create_time).getTime())}</Text>
                </View>
                <Icons name='you' size={setUnit(32)} color='#C2C3C4' />
            </Pressable>
            <Divider style={{ marginLeft: setUnit(25) }} />
        </>
    )
})

let http
const Page: React.FC<{ navigation: NavigationProp<RouteList> }> = ({ navigation }) => {
    const [records, setRecords] = useState([])

    useLayoutEffect(() => {
        navigation.setOptions({
            headerLeft: () => (
                <Icons
                    name='guanbi'
                    color='#555'
                    size={setUnit(32)}
                    style={{ paddingHorizontal: setUnit(24) }}
                    onPress={(): void => navigation.goBack()}
                />
            )
        })
    }, [navigation])

    useEffect(() => {
        const fetchData = (): void => {
            InteractionManager.runAfterInteractions(() => {
                Toast.loading()
                http = getVersionList(res => {
                    setRecords(res?.reverse() || [])
                    Toast.hideLoading()
                }, err => {
                    Toast.hideLoading()
                    ModalManager.alert({
                        title: '错误',
                        content: err
                    })
                })
            })
        }
        fetchData()
        return (): void => {
            if (http) http.cancel()
        }
    }, [])



    return (
        <View style={styles.container}>
            <FlatList
                data={records}
                contentContainerStyle={!records.length ? styles.containerStyle : {}}
                keyExtractor={(item: Items): string => item.id?.toString()}
                renderItem={({ item }: { item: Items }): React.ReactElement => (
                    <Item
                        onClick={(): void => navigation.navigate('FeatureDetail', { content: item.remark || '' })}
                        item={item}
                    />
                )}
                ListEmptyComponent={(): React.ReactElement => <Empty style={{ paddingTop: 100 }} />}
            />
        </View>
    )
}

export default Page