import React, {Component} from 'react' import {FlatList, View, TouchableOpacity, RefreshControl, ScrollView, ActivityIndicator, SafeAreaView} from 'react-native' import Image from 'react-native-fast-image' import {BackgroundImage} from '../../components/BackgroundImage' import LinearGradient from 'react-native-linear-gradient'; import Text from '../../components/Text'; import { get_notification, news, read_notification} from '../../api/UserApi' import {bindActionCreators} from 'redux' import {appSetNotification} from '../../redux/app/action' import {connect} from 'react-redux'; import { t } from '../../utils/i18n'; import parseDateLocale from '../../utils/parseDateLocale'; import { NavigationEvents } from "react-navigation"; const injectScript = ` (function () { window.onclick = function(e) { e.preventDefault(); window.postMessage(e.target.href); e.stopPropagation() } }()); `; class NotificationScreen extends Component { constructor(props) { super(props) this.state = { new_noti: [], page: 1, last_page: 1, refreshing: false, } } _set_read(item) { switch (item.source_type) { case 'payment_success': case 'update_app': return false; default: read_notification(item.id).then(res => { this.navigateNotification(item) }) } } getContentId(item) { let data = item.data; let dataJson = JSON.parse(data); if(dataJson.id){ return dataJson.id; }else { return null; } } navigateNotification = (item) => { switch (item.source_type) { case 'news': case 'general': case 'promotion': this.props.navigation.navigate('NewsDetail', { news_id: item.source_id, getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }); break; case 'parcels': if(item.parcel_status === 'PENDING'){ this.props.navigation.navigate('ObjectDetail', { object_id: item.source_id, getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }) }else { this.props.navigation.navigate('Object', { user: this.props.user, getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }) } break; case 'message': this.props.navigation.navigate('Question', { getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }); break; case 'meter': this.props.navigation.navigate('Meter', { getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }); break; case 'invoice': case 'invoice_overdue': this.props.navigation.navigate('Payment', { payment_id: this.getContentId(item), getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }); break; case 'repair': case 'effect_repair': case 'effect_responsible': case 'edit_repair': case 'appointment_repair': case 'cancel_repair': case 'success_repair': case 'renew_appointment': this.props.navigation.navigate('RepairHistoryDetail', { repair_id: this.getContentId(item), type: item.source_type, getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }) break; case 'request_contact': this.props.navigation.navigate('Question', { getNotification: () => { this.setState({ page: 1 }, () => { this.getNotification() }) } }) break; default: return false; } } componentDidMount() { if (this.props.token != null && this.props.user != null) { this.setState({ auth: true, }) } else { this.setState({ auth: false, }) } this.setState({ page: 1, refreshing: true }, () => { this.getNotification() }) } getNotification() { let user_noti_id = 0; if(this.props.user && this.props.user.id){ user_noti_id = this.props.user.id }else if(this.props.device && this.props.device.customer_id){ user_noti_id = this.props.device.customer_id } // console.log('user_noti_id => ', user_noti_id) if(this.props.token != null){ get_notification(user_noti_id, this.state.page).then(res => { if (res.data) { this.setState({ new_noti: res.data.data, page: res.data.current_page, refreshing: false, last_page: res.data.last_page }); } }) }else{ this.setState({ refreshing: false }) } } componentWillUnmount() { let user_noti_id = 0; if(this.props.user && this.props.user.id){ user_noti_id = this.props.user.id }else if(this.props.device && this.props.device.customer_id){ user_noti_id = this.props.device.customer_id } this.props.appSetNotification(0) } loadMoreNoti() { // console.log('check loadmore -------------> '); let user_noti_id = 0; if(this.props.user && this.props.user.id){ user_noti_id = this.props.user.id }else if(this.props.device && this.props.device.customer_id){ user_noti_id = this.props.device.customer_id } if(parseInt(this.state.page) < parseInt(this.state.last_page) && !this.state.refreshing){ this.setState({ page: this.state.page + 1, refreshing: true }, () => { get_notification(user_noti_id, this.state.page).then(res => { if (res.data) { let listData = this.state.new_noti let new_listdata = listData.concat(res.data.data) this.setState({ new_noti: new_listdata, page: res.data.current_page, refreshing: false, last_page: res.data.last_page }); } }) }) } } _onRefresh = () => { this.setState({refreshing: true, page: 1}, () => { this.getNotification() }); } getTypeNoti(item) { let type = 'ข่าวใหม่'; switch (item.source_type) { case 'news': case 'general': type = t('latest_news'); break; case 'rooms': type = t('new_room'); break; case 'parcels': type = t('new_parcel'); break; case 'promotion': type = t('latest_promotion'); break; case 'message': type = t('new_message'); break; case 'invoice': case 'invoice_overdue': type = t('bill_payment'); break; case 'meter': type = t('meter_noti'); break; case 'repair': case 'effect_repair': case 'effect_responsible': case 'edit_repair': case 'appointment_repair': case 'request_contact': case 'cancel_repair': case 'success_repair': case 'renew_appointment': type = item.title; break; case 'update_app': type = t('update_app'); break; case 'payment_success': type = t('payment_success'); break; default: type = ''; break; } return type; } getStatusParcel (status) { switch (status) { case 'PENDING': return t('waiting_for_pickup'); case 'WAIT_PICKUP': return t('awaiting_payment'); case 'RECEIVE': return t('paid'); case 'OTHER': return t('other'); case 'ERROR': default: return t('contact_front_desk'); } } displayParcelContent (data) { console.log('data >>> ', JSON.parse(data.data)) if(data.parcel_status){ return t('status') + ' : ' + this.getStatusParcel(data.parcel_status) } return ''; } renderSeparator() { return ( ); } renderFooter() { if (!this.state.refreshing) return null; return ( ); } getImageCover = (item) => { if (item.image_path) { return {uri: item.image_path}; } else { switch (item.source_type) { case 'invoice': return require('../../../assets/images/invoice_icon.png'); case 'invoice_overdue': return require('../../../assets/images/invoice_overdue_icon.png'); case 'meter': return require('../../../assets/images/meter_icon.png'); case 'repair': case 'effect_repair': case 'effect_responsible': case 'edit_repair': case 'request_contact': case 'cancel_repair': case 'renew_appointment': return require('../../../assets/images/repair_noti.png'); case 'appointment_repair': return require('../../../assets/images/appointment_repair.png'); case 'success_repair': return require('../../../assets/images/success_repair.png'); default: return require('../../../assets/images/logo_5.png'); } } } getContent = (item) => { switch (item.source_type) { // case 'parcels': // return this.displayParcelContent(item); case 'message': if(item && item.source && item.source.media){ console.log('media >> ', item.source.media) return ; }else { return item.content; } default: return item.content; } } _keyExtractorNewNoti = (item, index) => 'new_noti_'+index render() { return ( {/* } >*/} { this._onRefresh() }} /> } keyExtractor={this._keyExtractorNewNoti} ListEmptyComponent={() => {t('no_notification')} } ItemSeparatorComponent={this.renderSeparator} ListFooterComponent={this.renderFooter.bind(this)} onEndReachedThreshold={0.01} onEndReached={this.loadMoreNoti.bind(this)} renderItem={({item, rowData, index}) => { this._set_read(item) /*this.props.navigation.navigate('NewsDetail', { news_id: item.source_id, getNotification: () => this.getNotification() })*/ }} key={index} delayPressIn={50} activeOpacity={0.8} style={[ item && item.is_read === false ? styles.isReadFalse : styles.isReadTrue]} > {/*{this.getTypeNoti(item.source_type)}*/} { item && item.source_type && this.getTypeNoti(item) } {this.getContent(item)} { item && item.notified_at && parseDateLocale(item.notified_at, 'D MMM Y, HH:mm')} } /> {/**/} ) } } const styles = { container: { flex: 1, }, contentContainer: { paddingVertical: 0, }, isReadFalse: { flex: 1, flexDirection: 'row', backgroundColor: '#E1EDD2', borderBottomColor: '#7CBB33', borderBottomWidth: 1 }, isReadTrue: { flex: 1, flexDirection: 'row', backgroundColor: '#ffffff', borderBottomColor: 'rgba(0, 0, 0, 0.25)', borderBottomWidth: 1 }, viewimages: { flex: 1, flexDirection: 'row', alignItems: 'flex-start', marginBottom: 3 }, image: { width: 50, height: 50, borderRadius: 5, marginLeft: 16, marginTop: 16 }, viewcontainer: { flex: 1, justifyContent: 'center', marginLeft: 5, padding: 12 }, text_emply_noti: { marginTop: 10, // fontFamily: Fonts.KrungthaiRegular, fontSize: 14, lineHeight: 22, color: 'rgba(0, 0, 0, 0.5)', alignItems: 'center' } } const mapDisPatchToProps = state => { return state.app } const countNotification = dispatch => bindActionCreators({ appSetNotification }, dispatch) export default connect(mapDisPatchToProps, countNotification)(NotificationScreen)