import PageContainerBehavior from "../../core/behavior/page-container.behavior"; import { DraggableSheetBehavior, getDraggableSheetContext } from "../../core/behavior/draggableSheet.behavior"; import { login } from "../../lib/logic"; const { shared, Easing, timing } = wx.worklet const offset = shared(0); // pages/home/home.ts import { getPatients, healthReportMethod, healthIndexMethod, getSolarTerms, getShortScienceList } from "./request"; import { toCertificationPage } from "./router"; import { useLocation } from "../../lib/use/use-location"; Component({ behaviors: [ PageContainerBehavior, DraggableSheetBehavior('.draggable-sheet-wrapper'), ], lifetimes: { attached() { this.initFabAnimated(); } }, pageLifetimes: { show() { this.load(); }, hide() { offset.value = timing(0, { duration: 100, easing: (Easing).linear }, () => { 'worklet' }); } }, properties: { patientId: { type: String, value: '' }, next: { type: String, value: '' }, }, data: { patients: [] as (App.Patient.Model & { isDefault: 'Y' | 'N' })[], patient: null as App.Patient.Model | null, healthId: '', healthReport: { data: null, message: '' }, healthIndex: { data: [], message: '' }, position: {} as AnyObject, location: {} as AnyObject, solarTerms: {} as AnyObject, sheet: false, scienceList: [] as AnyArray, _loaded: false, }, observers: { 'patient'(model: { patientId: string, sex: 0 | 1 }) { wx.setStorageSync('patientId', model.patientId); this._getHealthReport(); this._getAbnormalHealthIndex(); const patientIcon = { 0: 'gender-male', 1: 'gender-female' }[model.sex]; const patientIconColor = { 0: '#0f40f5', 1: '#E560B3' }[model.sex]; this.setData({ patientIcon, patientIconColor }) }, }, methods: { async load() { await login(); wx.showLoading({ title: '加载中' }); const { patient } = await getPatients(/*this.data.patientId*/); if (!patient) await toCertificationPage(); else this.setData({ patient }); wx.hideLoading(); if (!this.data._loaded) { this.loadScienceList(); useLocation().then((location) => { this.setData({ location }) }).catch(()=>{}); getSolarTerms().then((solarTerms) => { this.setData({ solarTerms }) }).catch(()=>{}); this.setData({ _loaded: true }); } }, async _getHealthReport() { wx.showLoading({ title: '加载中' }); this.setData({ 'healthReport.loading': true, }) try { const data = await healthReportMethod(); this.setData({ 'healthReport.data': data, 'healthReport.loading': false, healthId: data?.healthAnalysisReportId, }); } catch (error) { this.setData({ 'healthReport.data': [], 'healthReport.loading': false, 'healthReport.message': error.errMsg, healthId: '', }); } wx.hideLoading(); }, async _getAbnormalHealthIndex() { this.setData({ 'healthIndex.loading': true, }) try { const data = await healthIndexMethod(); this.setData({ 'healthIndex.data': data.map((item: AnyObject) => item.abnormalDesc).filter(Boolean), 'healthIndex.loading': false, }); } catch (error) { this.setData({ 'healthIndex.data': [], 'healthIndex.loading': false, 'healthIndex.message': error.errMsg, }); } }, onBodyModel(event: WechatMiniprogram.TouchEvent) { if (event.detail?.position === 'LB') { this.toReportPage(); } else if (event.detail?.position === 'LT') { const report = this.data.healthReport.data as unknown as AnyObject; this.setData({ position: { LT: ['willillState', 'willillDegree', 'willillSocial', 'willillFunction'].map(key => { const title = report[`${key}Name`] const description = report[`${key}Description`] return title || description ? { title, description } : null }).filter(Boolean) }, }); this.showDraggableSheet(); } else if (event.detail?.position === 'RT') { const report = this.data.healthReport.data as unknown as AnyObject; const get = (key: string) => ({ [key]: report[key] }) this.setData({ position: { RT: { ...get('constitutionGroupName'), ...get('constitutionGroupDefinition'), ...get('faceImg'), ...get('faceAnalysisResult'), ...get('tongueAnalysisResult'), ...get('upImg'), ...get('downImg'), } }, }); this.showDraggableSheet(); } else if (event.detail?.position === 'RB') { const report = this.data.healthReport.data as unknown as AnyObject; const get = (key: string) => ({ [key]: report[key] }) this.setData({ position: { RB: { ...get('diagnoseSyndromeSummary'), ...get('diagnoseSyndromes'), ...get('factorItemSummary'), ...get('factorItems'), } }, }); this.showDraggableSheet(); } else if (event.detail?.position === 'CT') { this.setData({ position: { CT: this.data.healthIndex.data.map((item, index) => `${index + 1}、${item}`) } }); this.showDraggableSheet(); } }, initFabAnimated() { (this).applyAnimatedStyle('.fab-wrapper', () => { 'worklet' return { right: `${Math.min(offset.value, 36) - 36}px` }; }); (this).applyAnimatedStyle('.fab-1', () => { 'worklet' return { transform: `translateY(${-offset.value}px)` }; }); (this).applyAnimatedStyle('.fab-2', () => { 'worklet' return { transform: `translateX(${-offset.value}px) translateY(${-offset.value / 2}px)` }; }); (this).applyAnimatedStyle('.fab-3', () => { 'worklet' return { transform: `translateX(${-offset.value}px) translateY(${offset.value / 2}px)` }; }); (this).applyAnimatedStyle('.fab-4', () => { 'worklet' return { transform: `translateY(${offset.value}px)` }; }); }, onFabTap() { const value = Math.abs(offset.value - 72); offset.value = timing(value, { duration: 500, easing: (Easing).linear }, () => { 'worklet' if (offset.value > 0) offset.value = 72 }) }, toChatsPage() { wx.navigateTo({ url: `/module/chats/pages/index/index` }) }, toHealthPage() { wx.navigateTo({ url: `/module/health/pages/home/home` }) }, toDietTonicPage() { wx.navigateTo({ url: `/module/article/pages/diet-list/diet-list?classify=tonic` }) }, toDietTeaPage() { wx.navigateTo({ url: `/module/article/pages/diet-list/diet-list?classify=tea` }) }, toSciencePage() { wx.navigateTo({ url: `/module/article/pages/science-list/science-list` }) }, toSchemePage() { const id = this.data.healthId; if (id) wx.navigateTo({ url: `/module/health/pages/scheme/scheme?id=${id}` }) else wx.showToast({ title: '暂无调理方案', icon: 'none' }); }, toReportPage() { const id = this.data.healthId; if (id) wx.navigateTo({ url: `/module/health/pages/report/report?id=${id}` }) else wx.showToast({ title: '暂无分析报告', icon: 'none' }); }, onDraggableSizeUpdate(e) { 'worklet' if (e.pixels < 1) { wx.worklet.runOnJS(this.hideDraggableSheet.bind(this))() } }, showDraggableSheet() { getDraggableSheetContext.call(this).scrollTo({ size: 0.5, pixels: 600, animated: true, duration: 300, easingFunction: 'ease' }); this.setData({ sheet: true }); }, hideDraggableSheet(event?: any) { if (event) { getDraggableSheetContext.call(this).scrollTo({ size: 0, animated: true, duration: 300, easingFunction: 'ease' }); } this.setData({ position: {}, sheet: false }) }, async loadScienceList() { try { const { data } = await getShortScienceList(); this.setData({ scienceList: data }) } catch (error) { } } }, })