/**
* 通知功能页面适配器
* @邠心vbe on 2023/08/17
*/
import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs';
import React, { Component } from 'react';
import { StyleSheet, View } from 'react-native';
import { PageList } from '../Router';
import ListAlerts from './ListAlerts';
import ListNews from './ListNews';
import ListCampaign from './ListCampaign';
import app from '../../../app.json';
import utils from '../../utils/utils';
import apiNotification from '../../api/apiNotification';
import TextView from '../../components/TextView';
import AlertUtil from './AlertUtil';
export default class Notification extends Component {
constructor(props) {
super(props);
this.state = {
ready: false,
refreshing: false,
countInfo: {},
pageAdapter: []
};
this.pageAdapterAll = [{
title: $t('notification.tabCampaign'),
name: "Campaigns",
component: ListCampaign
}, {
title: $t('notification.tabAlerts'),
name: "Alerts",
component: ListAlerts
}, {
title: AlertUtil.isPromotion ? $t('notification.tabPromotions') : $t("notification.tabArticles"),
name: "News",
component: ListNews
}]
this.pageAdapter = [{
title: $t('notification.tabAlerts'),
name: "Alerts",
component: ListAlerts
}, {
title: AlertUtil.isPromotion ? $t('notification.tabPromotions') : $t("notification.tabArticles"),
name: "News",
component: ListNews
}]
this.tabBarStyle = {
tabBarStyle: styles.tabStyle,
tabBarPressColor: rippleColor,
tabBarScrollEnabled: false,
tabBarIndicatorStyle: styles.indicator,
tabBarActiveTintColor: tabBarTextActive,
tabBarInactiveTintColor: tabBarTextInactive
}
this.isHide = false;
}
componentDidMount() {
if (app.notifications.showCampaigns && app.notifications.showArticle) {
this.setState({
ready: true,
pageAdapter: this.pageAdapterAll
}, () => {
setTimeout(() => {
this.init();
}, 500);
});
} else if (app.notifications.showArticle) {
this.setState({
ready: true,
pageAdapter: this.pageAdapter
}, () => {
setTimeout(() => {
this.init();
}, 500);
});
} else {
this.setState({
ready: true
})
this.init();
}
this.props.navigation.addListener('focus', () => {
if (this.isHide) {
this.isHide = false;
this.getTotalCount();
}
});
this.props.navigation.addListener('blur', () => {
this.isHide = true;
});
}
componentWillUnmount() {
AlertUtil.release();
//BackHandler.removeEventListener("hardwareBackPress", this.backPage)
}
init() {
utils.setBackClick([this.props?.route?.name, "Campaigns", "Alerts", "Promotions"], this.backPage)
this.getTotalCount();
//BackHandler.addEventListener('hardwareBackPress', this.backPage)
AlertUtil.setOnRefreshListener(() => {
this.getTotalCount();
})
}
backPage = () => {
//const params = this.props.route.params;
if (!this.isHide) {
startPage(PageList.home);
return true;
}
}
getTotalCount() {
apiNotification.getTabDotCount().then(res => {
if (res.data) {
this.setState({
countInfo: res.data
})
AlertUtil.setBadgeCount(res.data)
}
}).catch(err => {
if (res.data) {
this.setState({
countInfo: {}
})
AlertUtil.setBadgeCount()
}
})
}
getBadgeText(index) {
let count = 0;
switch (index) {
case 0:
if (app.notifications.showCampaigns) {
count = this.state.countInfo?.campaignUnreadCount;
} else {
count = this.state.countInfo?.alertUnreadCount;
}
break;
case 1:
if (app.notifications.showCampaigns) {
count = this.state.countInfo?.alertUnreadCount;
} else {
count = this.state.countInfo?.newsUnreadCount;
}
break
case 2:
count = this.state.countInfo?.newsUnreadCount;
break;
}
if (count > 0) {
return {count}
} else {
return <>>
}
}
render() {
const Tab = createMaterialTopTabNavigator();
if (!this.state.ready) {
return (
)
}
if (this.state.pageAdapter.length > 0) {
return (
this.backPage()}>
{ this.state.pageAdapter.map((item, index) =>
this.getBadgeText(index)
}}
/>
)}
);
} else {
return
}
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: colorLight
},
tabStyle: {
backgroundColor: app.isWhitelabel ? colorLight : colorPrimary
},
indicator: {
backgroundColor: app.isWhitelabel ? colorPrimary : colorLight
},
badgeText: {
minWidth: 20,
height: 20,
color: textLight,
fontSize: 10,
marginTop: 4,
marginRight: 8,
paddingLeft: 4,
paddingRight: 4,
borderRadius: 30,
fontWeight: 'bold',
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'center',
backgroundColor: "#FF3B30"
}
})