|  | @@ -1,16 +1,342 @@
 | 
	
		
			
				|  |  | -import { Component } from '@angular/core';
 | 
	
		
			
				|  |  | -import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
 | 
	
		
			
				|  |  | -import { ExploreContainerComponent } from '../explore-container/explore-container.component';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
 | 
	
		
			
				|  |  | +import { Router } from '@angular/router';
 | 
	
		
			
				|  |  | +import { addIcons } from 'ionicons';
 | 
	
		
			
				|  |  | +import { checkmarkCircle, trash, calendar, helpCircle, create } from 'ionicons/icons';
 | 
	
		
			
				|  |  | +import { CommonModule } from '@angular/common';
 | 
	
		
			
				|  |  | +import { FormsModule } from '@angular/forms';
 | 
	
		
			
				|  |  | +import { IonSelect, IonThumbnail, IonCardSubtitle, IonImg, IonCard, IonButtons, IonItem, IonList, IonHeader, IonIcon, IonToolbar, IonContent, IonSegment, IonSegmentButton, IonGrid, IonRow, IonCol, IonButton, IonLabel, IonBadge, IonInput, ModalController, IonCardTitle, IonCardContent, IonCardHeader, IonSelectOption } from '@ionic/angular/standalone';
 | 
	
		
			
				|  |  | +import { FmodeChatCompletion, ImagineWork, DalleOptions, ChatPanelOptions, FmodeChat, FmodeChatMessage, MarkdownPreviewModule, openChatPanelModal } from "fmode-ng";
 | 
	
		
			
				|  |  | +import { AgentTaskStep } from './agent/agent.task';
 | 
	
		
			
				|  |  | +import { TaskPoemPictureDesc } from './agent/tasks/poem/poem-desc';
 | 
	
		
			
				|  |  | +import { TaskPoemPictureCreate } from './agent/tasks/poem/poem-picture';
 | 
	
		
			
				|  |  | +import { startTask } from './agent/agent.start';
 | 
	
		
			
				|  |  | +import { TaskInqueryUserStory } from './agent/tasks/poem/inquiry/1.inquiry-user-story';
 | 
	
		
			
				|  |  | +import { TaskInqueryDoctorQuestion } from './agent/tasks/poem/inquiry/2.inquiry-doctor-question';
 | 
	
		
			
				|  |  | +import { TaskInqueryUserAnswer } from './agent/tasks/poem/inquiry/3.inquiry-user-answer';
 | 
	
		
			
				|  |  | +import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
 | 
	
		
			
				|  |  | +import { EditPlanModalComponent } from './edit-plan-modal/edit-plan-modal.component';
 | 
	
		
			
				|  |  | +import { AlertController } from '@ionic/angular';
 | 
	
		
			
				|  |  | +import { openUserEditModal } from 'src/lib/user/modal-user-edit/modal-user-edit.component';
 | 
	
		
			
				|  |  | +import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
 | 
	
		
			
				|  |  |  @Component({
 | 
	
		
			
				|  |  |    selector: 'app-tab2',
 | 
	
		
			
				|  |  |    templateUrl: 'tab2.page.html',
 | 
	
		
			
				|  |  |    styleUrls: ['tab2.page.scss'],
 | 
	
		
			
				|  |  |    standalone: true,
 | 
	
		
			
				|  |  | -  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent]
 | 
	
		
			
				|  |  | +  imports: [
 | 
	
		
			
				|  |  | +    MarkdownPreviewModule,
 | 
	
		
			
				|  |  | +    IonSelectOption,
 | 
	
		
			
				|  |  | +    IonSelect,
 | 
	
		
			
				|  |  | +    IonThumbnail,
 | 
	
		
			
				|  |  | +    IonCardSubtitle,
 | 
	
		
			
				|  |  | +    IonImg,
 | 
	
		
			
				|  |  | +    IonCard,
 | 
	
		
			
				|  |  | +    IonCardTitle,
 | 
	
		
			
				|  |  | +    IonCardHeader,
 | 
	
		
			
				|  |  | +    IonCardContent,
 | 
	
		
			
				|  |  | +    IonButtons,
 | 
	
		
			
				|  |  | +    IonItem,
 | 
	
		
			
				|  |  | +    IonList,
 | 
	
		
			
				|  |  | +    IonIcon,
 | 
	
		
			
				|  |  | +    FormsModule,
 | 
	
		
			
				|  |  | +    CommonModule,
 | 
	
		
			
				|  |  | +    IonHeader,
 | 
	
		
			
				|  |  | +    IonToolbar,
 | 
	
		
			
				|  |  | +    IonContent,
 | 
	
		
			
				|  |  | +    IonSegment,
 | 
	
		
			
				|  |  | +    IonSegmentButton,
 | 
	
		
			
				|  |  | +    IonGrid,
 | 
	
		
			
				|  |  | +    IonRow,
 | 
	
		
			
				|  |  | +    IonCol,
 | 
	
		
			
				|  |  | +    IonButton,
 | 
	
		
			
				|  |  | +    IonLabel,
 | 
	
		
			
				|  |  | +    IonBadge,
 | 
	
		
			
				|  |  | +    IonInput
 | 
	
		
			
				|  |  | +  ]
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  | -export class Tab2Page {
 | 
	
		
			
				|  |  | +export class Tab2Page implements OnInit {
 | 
	
		
			
				|  |  | +  selectedTab: string = 'checkin';  // 默认选中的tab
 | 
	
		
			
				|  |  | +  planList: any[] = [
 | 
	
		
			
				|  |  | +  ];
 | 
	
		
			
				|  |  | +  coachList: any[] = [
 | 
	
		
			
				|  |  | +  ];
 | 
	
		
			
				|  |  | +  currentUser: CloudUser | undefined
 | 
	
		
			
				|  |  | +  constructor(private router: Router, private modalCtrl: ModalController, private cdr: ChangeDetectorRef, private alertController: AlertController) {
 | 
	
		
			
				|  |  | +    addIcons({ checkmarkCircle, calendar, helpCircle, trash, create });
 | 
	
		
			
				|  |  | +    this.currentUser = new CloudUser();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  async loadPlanList() {
 | 
	
		
			
				|  |  | +    let currentUser = new CloudUser();
 | 
	
		
			
				|  |  | +    const cloudQuery = new CloudQuery("fitPlan");
 | 
	
		
			
				|  |  | +    cloudQuery.equalTo("user", currentUser.toPointer());
 | 
	
		
			
				|  |  | +    this.planList = await cloudQuery.find();
 | 
	
		
			
				|  |  | +    this.cdr.detectChanges();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  async loadCoachList() {
 | 
	
		
			
				|  |  | +    let query = new CloudQuery("Coach");
 | 
	
		
			
				|  |  | +    this.coachList = await query.find();
 | 
	
		
			
				|  |  | +    this.cdr.detectChanges();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  ngOnInit() {
 | 
	
		
			
				|  |  | +    this.loadPlanList()
 | 
	
		
			
				|  |  | +    this.loadCoachList()
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  ngOnChanges() {
 | 
	
		
			
				|  |  | +    this.loadPlanList();
 | 
	
		
			
				|  |  | +    this.loadCoachList()
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  ngAfterViewChecked() {
 | 
	
		
			
				|  |  | +    this.loadPlanList();
 | 
	
		
			
				|  |  | +    this.loadCoachList()
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  async login() {
 | 
	
		
			
				|  |  | +    let user = await openUserLoginModal(this.modalCtrl);
 | 
	
		
			
				|  |  | +    if (user?.id) {
 | 
	
		
			
				|  |  | +      this.currentUser = user
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  async signup() {
 | 
	
		
			
				|  |  | +    // 弹出注册窗口
 | 
	
		
			
				|  |  | +    let user = await openUserLoginModal(this.modalCtrl, "signup");
 | 
	
		
			
				|  |  | +    if (user?.id) {
 | 
	
		
			
				|  |  | +      this.currentUser = user
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  logout() {
 | 
	
		
			
				|  |  | +    this.currentUser?.logout();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  editUser() {
 | 
	
		
			
				|  |  | +    openUserEditModal(this.modalCtrl)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //plan页面
 | 
	
		
			
				|  |  | +  editPlan(day: any) {
 | 
	
		
			
				|  |  | +    console.log('编辑计划:', day);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 创建一个弹出框
 | 
	
		
			
				|  |  | +    this.modalCtrl.create({
 | 
	
		
			
				|  |  | +      component: EditPlanModalComponent,
 | 
	
		
			
				|  |  | +      componentProps: { plan: day }
 | 
	
		
			
				|  |  | +    }).then(modal => {
 | 
	
		
			
				|  |  | +      modal.present();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      modal.onDidDismiss().then((result) => {
 | 
	
		
			
				|  |  | +        if (result.data) {
 | 
	
		
			
				|  |  | +          const updatedPlan = result.data;
 | 
	
		
			
				|  |  | +          const index = this.planList.findIndex(item => item.id === updatedPlan.id);
 | 
	
		
			
				|  |  | +          if (index !== -1) {
 | 
	
		
			
				|  |  | +            this.planList[index] = updatedPlan;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  async deletePlan(day: any) {
 | 
	
		
			
				|  |  | +    const alert = await this.alertController.create({
 | 
	
		
			
				|  |  | +      header: '确认删除',
 | 
	
		
			
				|  |  | +      message: '确定要删除此计划吗?',
 | 
	
		
			
				|  |  | +      buttons: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '取消',
 | 
	
		
			
				|  |  | +          role: 'cancel',
 | 
	
		
			
				|  |  | +          cssClass: 'secondary',
 | 
	
		
			
				|  |  | +          handler: () => {
 | 
	
		
			
				|  |  | +            console.log('删除操作被取消');
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '确认',
 | 
	
		
			
				|  |  | +          handler: () => {
 | 
	
		
			
				|  |  | +            day.destroy()
 | 
	
		
			
				|  |  | +              .then(() => {
 | 
	
		
			
				|  |  | +                console.log('计划已删除');
 | 
	
		
			
				|  |  | +                this.loadPlanList();
 | 
	
		
			
				|  |  | +              })
 | 
	
		
			
				|  |  | +              .catch((error: any) => {
 | 
	
		
			
				|  |  | +                console.error('删除失败:', error);
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ]
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await alert.present();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  //任务链
 | 
	
		
			
				|  |  | +  taskList: AgentTaskStep[] = []
 | 
	
		
			
				|  |  | +  //一个等待一秒的函数  每经过一秒
 | 
	
		
			
				|  |  | +  wait(duration: number = 1000) {
 | 
	
		
			
				|  |  | +    return new Promise(resolve => {
 | 
	
		
			
				|  |  | +      setTimeout(() => {
 | 
	
		
			
				|  |  | +        resolve(true)
 | 
	
		
			
				|  |  | +      }, duration);
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  shareData: any = {}
 | 
	
		
			
				|  |  | +  // 任务:完成故事意境描述及图像绘制
 | 
	
		
			
				|  |  | +  doPoemTask() {
 | 
	
		
			
				|  |  | +    let task1 = TaskPoemPictureDesc({ shareData: this.shareData, modalCtrl: this.modalCtrl });
 | 
	
		
			
				|  |  | +    let task2 = TaskPoemPictureCreate({ shareData: this.shareData, modalCtrl: this.modalCtrl });
 | 
	
		
			
				|  |  | +    let PoemTaskList = [task1, task2]
 | 
	
		
			
				|  |  | +    this.taskList = PoemTaskList
 | 
	
		
			
				|  |  | +    startTask(PoemTaskList)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  doInqueryTask() {
 | 
	
		
			
				|  |  | +    let task1 = TaskInqueryUserStory({ shareData: this.shareData, modalCtrl: this.modalCtrl });
 | 
	
		
			
				|  |  | +    let task2 = TaskInqueryDoctorQuestion({ shareData: this.shareData, modalCtrl: this.modalCtrl });
 | 
	
		
			
				|  |  | +    let task3 = TaskInqueryUserAnswer({ shareData: this.shareData, modalCtrl: this.modalCtrl });
 | 
	
		
			
				|  |  | +    // 定义任务集
 | 
	
		
			
				|  |  | +    let InquireServiceTaskList = [
 | 
	
		
			
				|  |  | +      task1, task2, task3
 | 
	
		
			
				|  |  | +    ]
 | 
	
		
			
				|  |  | +    // 传递给显示组件
 | 
	
		
			
				|  |  | +    this.taskList = InquireServiceTaskList
 | 
	
		
			
				|  |  | +    // 开始执行任务
 | 
	
		
			
				|  |  | +    startTask(InquireServiceTaskList)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // 聊天页面
 | 
	
		
			
				|  |  | +  async openInquiry(coach: CloudObject) {
 | 
	
		
			
				|  |  | +    let currentUser = new CloudUser();
 | 
	
		
			
				|  |  | +    let userPrompt = ``
 | 
	
		
			
				|  |  | +    if (!currentUser?.id) {
 | 
	
		
			
				|  |  | +      console.log("用户未登录,请登录后重试");
 | 
	
		
			
				|  |  | +      let user = await openUserLoginModal(this.modalCtrl);
 | 
	
		
			
				|  |  | +      if (!user?.id) {
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      currentUser = user;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (currentUser?.get("realname")) {
 | 
	
		
			
				|  |  | +      userPrompt += `当前来访的患者,姓名:${currentUser?.get("realname")}`
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (currentUser?.get("gender")) {
 | 
	
		
			
				|  |  | +      userPrompt += `,性别:${currentUser?.get("gender")}`
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (currentUser?.get("age")) {
 | 
	
		
			
				|  |  | +      userPrompt += `,年龄:${currentUser?.get("age")}`
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    localStorage.setItem("company", "E4KpGvTEto")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let consult = new CloudObject("fitConsultation")
 | 
	
		
			
				|  |  | +    let now = new Date();
 | 
	
		
			
				|  |  | +    let dateStr = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`
 | 
	
		
			
				|  |  | +    // 对象权限的精确指定
 | 
	
		
			
				|  |  | +    let ACL: any = {
 | 
	
		
			
				|  |  | +      "*": { read: false, write: false }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (currentUser?.id) {
 | 
	
		
			
				|  |  | +      ACL[currentUser?.id] = { read: true, write: true }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    localStorage.setItem("company", "E4KpGvTEto")
 | 
	
		
			
				|  |  | +    consult.set({
 | 
	
		
			
				|  |  | +      title: `交流记录${dateStr}-${coach?.get("name")}`,
 | 
	
		
			
				|  |  | +      coach: coach.toPointer(),
 | 
	
		
			
				|  |  | +      user: currentUser.toPointer(),
 | 
	
		
			
				|  |  | +      ACL: ACL
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      onChatInit: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        console.log("onChatInit");
 | 
	
		
			
				|  |  | +        console.log("预设角色", chat.role);
 | 
	
		
			
				|  |  | +        chat.role.set("name", coach?.get("name"));
 | 
	
		
			
				|  |  | +        chat.role.set("title", "职业教练");
 | 
	
		
			
				|  |  | +        chat.role.set("tags", coach?.get("specialize"));
 | 
	
		
			
				|  |  | +        chat.role.set("avatar", "../../assets/images/coach2.jpg")
 | 
	
		
			
				|  |  | +        chat.role.set("prompt", `
 | 
	
		
			
				|  |  | +# 角色设定
 | 
	
		
			
				|  |  | +您是${coach?.get("name")},年龄${coach?.get("age")},特长为${coach?.get("specialize")},要完成一次教练与学员之间的锻炼部位交流。
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# 对话环节
 | 
	
		
			
				|  |  | +0.导诊(根据用户基本情况,引导选择合适的训练计划) 
 | 
	
		
			
				|  |  | +1.预设的问询方式(根据学员自述情况进行引导)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- 打招呼,以学员自述为主
 | 
	
		
			
				|  |  | +- 当信息充足时,确认学员的目标与需求,并进入下一个环节 
 | 
	
		
			
				|  |  | +2.拓展的问询细节 
 | 
	
		
			
				|  |  | +例如:学员反映想要锻炼腹肌,拓展出:目前的锻炼频率;饮食习惯;是否有受伤历史等其他需要的问题。
 | 
	
		
			
				|  |  | +- 当问询细节补充完成后进入下一个环节 
 | 
	
		
			
				|  |  | +3.初步的训练方案,并且同时列出需要的器械与注意事项 初步方案:确定需要的训练动作与频率 器械与注意事项:获取训练所需的器械信息
 | 
	
		
			
				|  |  | +- 等待学员确认并准备器械,进入下一阶段 
 | 
	
		
			
				|  |  | +4.给出详细的训练计划并提供指导
 | 
	
		
			
				|  |  | +- 完成训练计划时,请在消息结尾附带: [交流完成]
 | 
	
		
			
				|  |  | +# 开始话语
 | 
	
		
			
				|  |  | +当您准备好了,可以以一个健身教练的身份,向来访的学员打招呼。
 | 
	
		
			
				|  |  | +你好!欢迎来到健身房,我是${coach?.get("name")}教练。今天你想要专注锻炼哪个部位呢?或者有什么具体的健身目标吗?`);
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      onMessage: (chat: FmodeChat, message: FmodeChatMessage) => {
 | 
	
		
			
				|  |  | +        console.log("onMessage", message)
 | 
	
		
			
				|  |  | +        let content: any = message?.content
 | 
	
		
			
				|  |  | +        if (typeof content == "string") {
 | 
	
		
			
				|  |  | +          if (content?.indexOf("[交流完成]") > -1) {
 | 
	
		
			
				|  |  | +            console.log("交流已完成")
 | 
	
		
			
				|  |  | +            consult.set({
 | 
	
		
			
				|  |  | +              content: content // 处方内容
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +            consult.save();
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      onChatSaved: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        // chat?.chatSession?.id 本次会话的 chatId
 | 
	
		
			
				|  |  | +        console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  openChat() {
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      onChatSaved: (chat: FmodeChat) => {
 | 
	
		
			
				|  |  | +        // chat?.chatSession?.id 本次会话的 chatId
 | 
	
		
			
				|  |  | +        console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id)
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  restoreChat(chatId: string) {
 | 
	
		
			
				|  |  | +    let options: ChatPanelOptions = {
 | 
	
		
			
				|  |  | +      roleId: "2DXJkRsjXK",
 | 
	
		
			
				|  |  | +      chatId: chatId
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    openChatPanelModal(this.modalCtrl, options)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  goChat() {
 | 
	
		
			
				|  |  | +    this.router.navigateByUrl("/chat/session/role/2DXJkRsjXK")
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // audioModalHeightPoint:number = 0.35;
 | 
	
		
			
				|  |  | +  // async startTalk(){
 | 
	
		
			
				|  |  | +  //   // 根据手机兼容性,适配组件弹出高度
 | 
	
		
			
				|  |  | +  //   let height = document.body.clientHeight || 960;
 | 
	
		
			
				|  |  | +  //   this.audioModalHeightPoint = Number((165/height).toFixed(2));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  constructor() {}
 | 
	
		
			
				|  |  | +  //   // 弹出组件
 | 
	
		
			
				|  |  | +  //   let modal:any
 | 
	
		
			
				|  |  | +  //   let chat:any
 | 
	
		
			
				|  |  | +  //   modal = await this.modalCtrl.create({
 | 
	
		
			
				|  |  | +  //     component:ModalAudioMessageComponent,
 | 
	
		
			
				|  |  | +  //     componentProps:{
 | 
	
		
			
				|  |  | +  //       chat:chat,
 | 
	
		
			
				|  |  | +  //       modal:modal,
 | 
	
		
			
				|  |  | +  //       onBreakPointSet:()=>{
 | 
	
		
			
				|  |  | +  //         modal?.setCurrentBreakpoint(this.audioModalHeightPoint)
 | 
	
		
			
				|  |  | +  //       }
 | 
	
		
			
				|  |  | +  //     }
 | 
	
		
			
				|  |  | +  //   })
 | 
	
		
			
				|  |  | +  //   modal.present();
 | 
	
		
			
				|  |  | +  // }
 | 
	
		
			
				|  |  | +  // 页面跳转功能
 | 
	
		
			
				|  |  | +  goToPage(page: string) {
 | 
	
		
			
				|  |  | +    // 更新选中的tab
 | 
	
		
			
				|  |  | +    this.selectedTab = page;
 | 
	
		
			
				|  |  | +    this.router.navigate([`/tabs/${page}`]);  // 然后再进行路由跳转
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // 手动检测视图变化,确保数据绑定正确
 | 
	
		
			
				|  |  | +    this.cdr.detectChanges();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 |