import showAlert from "@/components/basic/Alert" import { View, Text } from "@tarojs/components"; import './CheckAccess.scss' import { memo, useContext, useEffect, useState } from "react"; import { TimeFormatter } from "@/utils/time_format"; import { useDispatch, useSelector } from "react-redux"; import { getPlans, setPlan } from "@/services/trackTimeDuration"; import { chooseMode, initTarget, updateStep } from "@/store/set_target"; import { jumpPage } from "../hooks/Common"; import { useDidHide, useDidShow } from "@tarojs/taro"; import Taro from "@tarojs/taro"; import { useTranslation } from "react-i18next"; import { kIsIOS } from "@/utils/tools"; import { ColorType } from "@/context/themes/color"; // import { useIsFocused } from "@react-navigation/native"; let confirmAction: any = null; let cancelAction: any = null; let timer; let access; let useNavigation, AppState, Modal, useIsFocused; if (process.env.TARO_ENV == 'rn') { AppState = require("react-native").AppState Modal = require("react-native").Modal useNavigation = require("@react-navigation/native").useNavigation useIsFocused = require("@react-navigation/native").useIsFocused } const CheckAccess = memo((props: { record: any, count: number, access: any }) => { // export default function CheckAccess(props: { record: any, count: number }) { const [showFastAlert, setShowFastAlert] = useState(false) const [alertTitle, setAlertTitle] = useState('') const [alertContent, setAlertContent] = useState('') const [showCancel, setShowCancel] = useState(false) const [keepContent, setKeepContent] = useState(false) const [cancelText, setCancelText] = useState('') const [confirmText, setConfirmText] = useState('') const [subConfirmText, setSubConfirmText] = useState('') const user = useSelector((state: any) => state.user); const { t } = useTranslation() //判断选择混合场景,如果成功了,就弹窗 const [checkChooseMixed, setCheckChooseMixed] = useState(false) const [chooseMixedSuccess, setChooseMixedSuccess] = useState(false) const ring = useSelector((state: any) => state.ring); const dispatch = useDispatch(); let navigation; let isFocused = false; if (useNavigation) { navigation = useNavigation() isFocused = useIsFocused() } useEffect(() => { var obj = props.record if (props.access) { const member_expire = props.access.member.expire const member_status = props.access.member.status if (member_expire && new Date().getTime() > member_expire && member_status && member_status=='MEMBER') { if (global.indexPageRefresh) { global.indexPageRefresh() } } if (!user.test_user) { return } if (!global.memberAlert) { return; } global.ring = ring; const currentStatus = props.access.fast_sleep.current.qualification.status const preStatus = props.access.fast_sleep.previous.qualification.status if ((preStatus == 'PROVISIONAL_QUALIFIED' || preStatus == 'QUALIFIED_UNTIL_EXPIRE') && currentStatus == 'PENDING' && // global.ring.current_record.scenario != 'FAST' && obj.current_record.status == 'WAIT_FOR_START') { loseGain(props.access.fast_sleep) } // else if ((preStatus == 'PROVISIONAL_QUALIFIED' || preStatus == 'QUALIFIED_UNTIL_EXPIRE') && // currentStatus == 'NOT_QUALIFIED' && // global.ring.current_record.scenario == 'FAST_SLEEP' && // obj.current_record.status == 'WAIT_FOR_START') { // loseGain(props.access.fast_sleep) // } else if (currentStatus == 'PROVISIONAL_QUALIFIED') { Taro.setStorage({ key: 'showedDisqualifiedAlert', data: false }) const { fast_expire, sleep_expire } = props.access.fast_sleep.current.qualification if (fast_expire && new Date().getTime() > fast_expire && obj.current_record.status == 'WAIT_FOR_START') { if (global.indexPageRefresh) { global.indexPageRefresh() } } if (sleep_expire && new Date().getTime() > sleep_expire && obj.current_record.status == 'WAIT_FOR_START') { if (global.indexPageRefresh) { global.indexPageRefresh() } } } else if (currentStatus == 'QUALIFIED_UNTIL_EXPIRE') { Taro.setStorage({ key: 'showedDisqualifiedAlert', data: false }) const member_expire = props.access.member.expire if (member_expire && new Date().getTime() > member_expire) { if (global.indexPageRefresh) { global.indexPageRefresh() } } // if (member_expire && new Date().getTime() > member_expire && obj.current_record.status == 'WAIT_FOR_START' && // global.ring.current_record.scenario != 'FAST') { // if (global.indexPageRefresh) { // global.indexPageRefresh() // } // } } if (obj.current_record.status != 'WAIT_FOR_START') { Taro.setStorage({ key: 'showedDisqualifiedAlert', data: false }) } } }, [props.count]) // const handleAppStateChange = (nextAppState) => { // console.log(nextAppState) // if (nextAppState != 'active') { // return // } // }; function viewWillAppear() { if (checkChooseMixed && chooseMixedSuccess) { upgradeSuccess() confirmAction = null } setCheckChooseMixed(false) setChooseMixedSuccess(false) } function viewWillDisappear() { } // useDidShow(() => { // console.log('user did show'); // viewWillAppear() // }) useEffect(() => { if (process.env.TARO_ENV == 'rn') { // AppState.addEventListener('change', handleAppStateChange); navigation.addListener('focus', () => { viewWillAppear() }); // 当页面即将消失时执行 navigation.addListener('blur', () => { viewWillDisappear() }); } global.chooseMixed = () => { setChooseMixedSuccess(true) setShowFastAlert(false) setKeepContent(false) } global.paySuccess = (res) => { cancelAction = null confirmAction = null setShowFastAlert(false) setKeepContent(false) setTimeout(() => { global.refreshAccess(res) }, 2000) } global.checkAccess = (acccessData: any) => { debugger if (!user.test_user) { return } if (!global.memberAlert) { return; } const currentStatus = acccessData.current.qualification.status const preStatus = acccessData.previous.qualification.status access = acccessData setSubConfirmText('') confirmAction = null const { trigger_event } = access.current.qualification; //删除记录后仍有资格,不做特殊处理。只有删除时为NOT_SATISFIED_AFTER_DELETE时,弹失去资格弹窗 if (trigger_event == 'SATISFIED_AFTER_DELETE') { return; } if (preStatus == 'NOT_QUALIFIED' && currentStatus == 'NOT_QUALIFIED') { const { streak_fast_current, streak_fast_min_required } = acccessData.current.qualification.condition if (streak_fast_current == 0) { return; } setShowFastAlert(true) setKeepContent(false) setAlertTitle(t('feature.check_access.non_access.title')) setAlertContent(t('feature.check_access.non_access.desc', { day: streak_fast_current, // day_left: streak_fast_min_required - streak_fast_current, // day_unit: streak_fast_min_required - streak_fast_current == 1 ? 'day' : 'days' })) setShowCancel(false) setConfirmText(t('feature.check_access.non_access.btn')) } else if (preStatus == 'NOT_QUALIFIED' && (currentStatus == 'PROVISIONAL_QUALIFIED' || currentStatus == 'QUALIFIED_UNTIL_EXPIRE') && global.ring.current_record.scenario != 'FAST_SLEEP') { const { streak_fast_current } = acccessData.current.qualification.condition const reason = t('feature.check_access.gain_access.reason', { day: streak_fast_current }) Taro.setStorage({ key: 'showedDisqualifiedAlert', data: false }) var expire = acccessData.current.qualification.fast_expire setShowFastAlert(true) setKeepContent(true) setAlertTitle(t('feature.check_access.gain_access.title')) setAlertContent(t('feature.check_access.gain_access.desc', { reason: reason })) setShowCancel(true) setCancelText(t('feature.check_access.gain_access.stay_btn')) setConfirmText(t('feature.check_access.gain_access.upgrade')) setSubConfirmText(t('feature.check_access.gain_access.upgrade_desc', { time: TimeFormatter.countdown(expire) })) confirmAction = upgrade // if (process.env.TARO_ENV=='rn' && !kIsIOS){ // return // } timer = setInterval(() => { if (new Date().getTime() > expire) { cancel() return } setSubConfirmText(t('feature.check_access.gain_access.upgrade_desc', { time: TimeFormatter.countdown(expire) })) // setConfirmText(`Upgrade to Fasting with Sleep\n(Offer Expiring in ${TimeFormatter.countdown(expire)})`) }, 1000) } else if ((preStatus == 'PROVISIONAL_QUALIFIED' || preStatus == 'QUALIFIED_UNTIL_EXPIRE') && (currentStatus == 'PROVISIONAL_QUALIFIED' || currentStatus == 'QUALIFIED_UNTIL_EXPIRE')) { const { streak_fast_current, streak_sleep_current } = acccessData.current.qualification.condition if (global.ring.current_record.scenario == 'FAST') { var expire = acccessData.current.qualification.fast_expire const reason = t('feature.check_access.gain_access.reason', { day: streak_fast_current }) setShowFastAlert(true) // setKeepContent(false) setKeepContent(true) setAlertTitle(t('feature.check_access.gain_access.title')) setAlertContent(t('feature.check_access.gain_access.desc', { reason: reason })) setShowCancel(true) setCancelText(t('feature.check_access.gain_access.stay_btn')) setConfirmText(t('feature.check_access.gain_access.upgrade')) setSubConfirmText(t('feature.check_access.gain_access.upgrade_desc', { time: TimeFormatter.countdown(expire) })) confirmAction = upgrade timer = setInterval(() => { if (new Date().getTime() > expire) { cancel() return } setSubConfirmText(t('feature.check_access.gain_access.upgrade_desc', { time: TimeFormatter.countdown(expire) })) // setConfirmText(`Upgrade to Fasting with Sleep\n(Offer Expiring in ${TimeFormatter.countdown(expire)})`) }, 1000) return; } setKeepContent(false) setShowFastAlert(true) setAlertTitle(t('feature.check_access.stay_qualified.title')) setAlertContent(t('feature.check_access.stay_qualified.desc', { fast_streak_day: streak_fast_current, sleep_streak_day: streak_sleep_current })) setShowCancel(false) setConfirmText(t('feature.check_access.stay_qualified.btn')) } else if ((preStatus == 'QUALIFIED_UNTIL_EXPIRE' || preStatus == 'PROVISIONAL_QUALIFIED') && currentStatus == 'PENDING' // && global.ring.current_record.scenario == 'FAST_SLEEP' ) { loseGain(acccessData); } // else if ((preStatus == 'QUALIFIED_UNTIL_EXPIRE' || preStatus == 'PROVISIONAL_QUALIFIED') // && currentStatus == 'NOT_QUALIFIED' // && global.ring.current_record.scenario == 'FAST_SLEEP' // ) { // loseGain(acccessData); // } } }, []) function upgradeSuccess() { setShowFastAlert(false) } async function loseGain(access) { var showedDisqualifiedAlert = await getStorage('showedDisqualifiedAlert') || false; if (showedDisqualifiedAlert) { return; } if (timer) { clearInterval(timer) timer = null } var desc = '' const { trigger_event, fast_expire, sleep_expire, condition } = access.current.qualification; var dt = fast_expire; if (sleep_expire && sleep_expire < fast_expire) { dt = sleep_expire } var date = TimeFormatter.getMonthAndDayByTimestamp(dt, true) var day_unit = Math.max(condition.streak_fast_min_required - 1, 1) == 1 ? 'day' : 'days'; switch (trigger_event) { case 'FAST_STREAK_LOST': desc = t('feature.check_access.lost_reason.fast_streak_lost'); break; case 'SLEEP_STREAK_LOST': desc = t('feature.check_access.lost_reason.sleep_streak_lost'); break; case 'FAST_SLEEP_STREAKS_LOST': desc = t('feature.check_access.lost_reason.fast_sleep_streaks_lost'); break; case 'SLEEP_STREAK_NOT_GROWING': desc = t('feature.check_access.lost_reason.sleep_streak_not_growing'); break; case 'NOT_SATISFIED_AFTER_DELETE': desc = t('feature.check_access.lost_reason.not_satisfied_after_delete', { day: Math.max(condition.streak_fast_min_required - 1, 1), day_unit: day_unit }); break; case 'NA': default: break; } // console.error('失去资格弹窗', trigger_event, desc); setShowFastAlert(true) setKeepContent(true) setAlertTitle(t('feature.check_access.lose_access.title')) setAlertContent(t('feature.check_access.lose_access.desc', { reason: desc, require_days: condition.streak_fast_min_required })) setShowCancel(true) setCancelText(t('feature.check_access.lose_access.btn')) setConfirmText('Become a PRO member') setSubConfirmText('') setTimeout(() => { cancelAction = changeFastScenaria confirmAction = pay }, 100) // confirmAction = pay // cancelAction = changeFastScenaria Taro.setStorage({ key: 'showedDisqualifiedAlert', data: true }) // changeFastScenaria() } function changeFastScenaria() { cancelAction = null confirmAction = null const { start_time, end_time } = global.ring.schedule.fast var params: any = { scenario: 'FAST', trigger_event: 'POPUP_PENDING_SUBSCRIBE_FAIL', method: 'USER_SET', schedule: { fast: { start_time: start_time, end_time: end_time, }, } } setPlan(params).then(res => { if (global.indexPageRefresh) { global.indexPageRefresh() } }) } async function getStorage(key: string) { try { const res = await Taro.getStorage({ key }); return res.data; } catch { return ''; } } function upgrade() { const { prev_input, valid, start_time, end_time } = global.ring.schedule.sleep if (prev_input && valid) { setShowFastAlert(true) setKeepContent(true) setAlertTitle(t('feature.check_access.sleep_schedule.title')) setAlertContent(t('feature.check_access.sleep_schedule.desc', { start_time: start_time, end_time: end_time })) setShowCancel(true) setCancelText(t('feature.check_access.sleep_schedule.cancel')) setConfirmText(t('feature.check_access.sleep_schedule.confirm')) setSubConfirmText('') setTimeout(() => { cancelAction = cancelSetting confirmAction = goSetting }, 100) } else { goSetting() } // const { expire } = access.current.qualification // setShowFastAlert(true) // setAlertTitle('Congrats on Your PRO Status!') // setAlertContent(`To preserve this status, continue your fasting streak in ${TimeFormatter.countdown(expire)} and begin your sleep streak. Remember to keep both of them going.`) // setShowCancel(false) // setConfirmText(`I got this!`) // timer = setInterval(() => { // if (new Date().getTime() > expire) { // cancel() // return // } // setAlertContent(`To preserve this status, continue your fasting streak in ${TimeFormatter.countdown(expire)} and begin your sleep streak. Remember to keep both of them going.`) // }, 1000) } function goSetting() { getPlans().then(res => { const data = res as { scenarios: any[] }; console.log(data) var targets: any = {} data.scenarios.forEach((item) => { if (item.name == 'FAST') { if (item.schedule.fast.duration.prev_input) { item.schedule.fast.duration.last_value = item.schedule.fast.duration.init_value } targets.fast = item } else if (item.name == 'SLEEP') { targets.sleep = item } }) dispatch(initTarget(targets)) dispatch(updateStep({ step: 2 })) dispatch(chooseMode({ isMixed: true })) setCheckChooseMixed(true) jumpPage(`/pages/clock/SetGoal?upgrade=true&isSelf=1&trigger_event=POPUP_QUALIFIED_UPGRADED_SET`, 'SetGoal', navigation, { upgrade: true, isSelf: 1, trigger_event: 'POPUP_QUALIFIED_UPGRADED_SET' }) confirmAction = goSetting }) } function pay() { jumpPage('', 'ProductList', navigation) setTimeout(() => { confirmAction = pay cancelAction = changeFastScenaria }, 200) } function cancelSetting() { const { start_time, end_time } = global.ring.schedule.fast var params: any = { scenario: 'FAST_SLEEP', method: 'USER_SET', trigger_event: 'POPUP_QUALIFIED_UPGRADED_DISMISS', schedule: { fast: { start_time: start_time, end_time: end_time, }, sleep: { start_time: global.ring.schedule.sleep.start_time, end_time: global.ring.schedule.sleep.end_time, } } } setPlan(params).then(res => { if (global.indexPageRefresh) { global.indexPageRefresh() } upgradeSuccess() }) } function confirm() { if (!keepContent) { setShowFastAlert(false) } if (timer) { clearInterval(timer) timer = null } if (confirmAction) confirmAction() confirmAction = null; } function cancel() { setShowFastAlert(false) confirmAction = null; if (timer) { clearInterval(timer) timer = null } if (cancelAction) cancelAction() cancelAction = null; } function alertPop() { return {alertTitle} {alertContent} 0 ? 'fast_alert_confirm confirm_multline' : 'fast_alert_confirm'} onClick={confirm}> {confirmText} { subConfirmText.length > 0 && {subConfirmText} } { showCancel && {cancelText} } { user.test_user && global.memberAlert && member status:{props.access.member.status} current status:{props.access.fast_sleep.current.qualification.status} previous status:{props.access.fast_sleep.previous.qualification.status} trigger event:{props.access.fast_sleep.current.qualification.trigger_event} lost_access_total:{props.access.fast_sleep.current.qualification.condition.lost_access_total} streak_fast_min_required:{props.access.fast_sleep.current.qualification.condition.streak_fast_min_required} } } return { user.test_user && global.memberAlert && showFastAlert && process.env.TARO_ENV == 'weapp' && alertPop() } { user.test_user && global.memberAlert && showFastAlert && isFocused && process.env.TARO_ENV == 'rn' && {alertPop()} } }) export default CheckAccess;