import React, { Component } from 'react' import Routes from './router' import cookie from 'js-cookie' import { connect } from "react-redux" import { setCurrentUser, startFetchUser } from "@/store/userAction" import {initialState} from "@/store/userReducer" import { withRouter, Link } from 'react-router-dom' import { compose } from 'redux' import { getParam, http, browser } from "@/utils" import { Toast } from "antd-mobile" import { addDays } from 'date-fns' //拦截ajax请求,返回mock数据 /*import mock from '@/utils/mock' mock()*/ // 默认样式 import './assets/css/index.scss' // iconfont import './assets/font/iconfont.css' class App extends Component { static displayName = 'App' previousLocation = {pathname: '/', search: '', hash: ''} records = [] pathnameBlacklist = ['/country', '/passport'] firstLoad = true componentDidMount() { this.umengStatistic() //平台信息 cookie.set('plat', '5', {domain: '.julyedu.com'}) if (browser.isWeixin && browser.isIOS) { sessionStorage.setItem('enter_url', window.location.href) } this.getUser() this.utm() const {history} = this.props this.setNavigationRecord(this.props.location, this.props.history.action) this.setPreviousLocation() history.listen((location, action) => { this.firstLoad = false this.setNavigationRecord(location, action) this.utm() if (cookie.get('uid') && this.props.user.hasError) { this.getUser() } if (location.pathname === '/passport') { window.localStorage.setItem('binding_redirect', JSON.stringify(this.previousLocation)) } const {pathname, state} = location if (pathname.startsWith('/passport')) { location.state = { ...state, ...{ from: { pathname: this.previousLocation.pathname, search: this.previousLocation.search, hash: this.previousLocation.hash } } } } else { this.removeShareCodeCookie() } }) } umengStatistic = () => { // 友盟统计 const script = document.createElement('script') script.src = 'https://s22.cnzz.com/z_stat.php?id=1265696973&web_id=1265696973' script.language = 'JavaScript' document.body.appendChild(script) } removeShareCodeCookie = () => { cookie.remove('share_code', {path: '/', domain: '.julyedu.com'}) } setNavigationRecord = (location, action) => { const {pathname, search, hash} = location let isLastRecord = location.pathname === (this.records.length && this.records[this.records.length - 1].pathname) let needHistoryMutation = location.pathname !== this.previousLocation.pathname switch (action) { case 'POP': if (needHistoryMutation) { this.firstLoad ? this.records.push({pathname, search, hash}) : this.records.pop() } else { this.records[this.records.length - 1] = location } break case 'REPLACE': this.records.length > 1 && (this.records[this.records.length - 1] = {pathname, search, hash}) break default: !isLastRecord && this.records.push({pathname, search, hash}) } location.state && location.state.records ? (location.state.records = this.records) : location.state ? location.state = {...location.state, records: this.records} : (location.state = {records: this.records}) } utm = () => { // utm统计 m站全站统计广告投放、以及统计详情页浏览 let utm_source = getParam('utm_source') let utm_medium = getParam('utm_medium') let utm_campaign = getParam('utm_campaign') let utm_content = getParam('utm_content') let utm_term = getParam('utm_term') let courseId = location.pathname.startsWith('/getDetail') || location.pathname.startsWith('/detail') ? getParam('id') : 0 if (courseId || (utm_term && utm_source && utm_medium && utm_campaign && utm_content)) { let data = { 'utm_source': utm_source, 'utm_medium': utm_medium, 'utm_campaign': utm_campaign, 'utm_content': utm_content, 'utm_term': utm_term, } http.post(`${API['www']}/base/first_utm_record/${courseId}`, data) .then(res => { }) } } getUser = () => { //获取用户信息 this.props.startFetchUser() //微信 let code = getParam('code') let oid = getParam('oid') if (code && !oid) { //针对2019双旦活动特殊处理,活动结束后删掉 //treasure_code=3538333139312c31&origin=2&aa=bb&code=0211aiYB1VVOL60rmWWB1367YB11aiY7&state=STATE if (getParam('treasure_code') == '3538333139312c31' && code == '0211aiYB1VVOL60rmWWB1367YB11aiY7') { return } http.get(`${API['home']}/m/wx_loginInfo/code/${code}?redirect=${encodeURIComponent(window.location.href)}`) .then(res => { let data = res.data if (data.errno == 200) { if (data.data['is_bind_mobile']) { window.location.assign(data.data.url) } else { let user = this.transformWxUser(res) let {role, uid, token} = data.data let expires = addDays(new Date(), 90) cookie.set('role', role, {expires, domain: '.julyedu.com', path: '/'}) cookie.set('uid', uid, {expires, domain: '.julyedu.com', path: '/'}) cookie.set('token', token, {expires, domain: '.julyedu.com', path: '/'}) this.props.setCurrentUser(user) } } else { Toast.info(data.msg) this.props.setCurrentUser(initialState) } }) } else { http.get(`${API.home}/m/user_info`).then(res => { this.props.setCurrentUser(this.transformUser(res)) }) } } componentDidUpdate() { this.setPreviousLocation() if (!this.props.user.hasError && getParam('redirect')) { window.location.href = getParam('redirect') } } setPreviousLocation = () => { const {location} = this.props let isInBlacklist = this.pathnameBlacklist.some(item => location.pathname.startsWith(item)) !isInBlacklist && (this.previousLocation = location) } transformUser = res => { let payload if (res.data.code === 200) { //移除红包统计cookie this.removeShareCodeCookie() const { msg, data: { avatar_file: avatar, user_name: username, is_vip: isVIP, uid, code } } = res.data payload = { hasError: false, msg, data: { username, isVIP, avatar, uid, code } } } else { payload = { hasError: true, msg: res.data.msg, code: res.data.code, data: {} } } return payload } transformWxUser = res => { let data = res.data if (data.errno == 200) { //移除红包统计cookie this.removeShareCodeCookie() let {uid, token, avatar_file: avatar, uname: username,} = data.data return { hasError: false, data: { uid, token, avatar, username }, msg: data.msg } } else { let {code, msg} = data.data return { code, msg, hasError: true, data: {} } } } render() { return <> <Routes/> <Link className={'year19-index'} to="/year/yearindex"> <img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/gift-package.png" alt=""/> </Link> </> } } export default compose( connect( state => ({user: state.user}), {setCurrentUser, startFetchUser} ), withRouter )(App)