PageSourceSearch

https://www.medalo.ai/js/Chat.BFh4Yr5b.js

js medalo.ai collected 2026-10-05 12:15:49 UTC 208,780 bytes, 21 lines download raw bytes

1import{_ as Se}from"./LoadingPage.6ru2eo8t.js";import{_ as ie,a as ae,b as ne,c as _e,d as xe}from"./PersonaCareCalendar.D56VuQ8Y.js";import{m as Fe,i as Y,p as dt,a as ct,h as ut,n as ht,b as pt,f as mt,t as gt,c as yt,s as ye,d as ft,e as kt,g as vt,j as bt,k as $,l as z,o as It,q as Mt,r as Dt,u as fe,v as Ct,w as Rt,x as wt,y as Pt,z as Tt,A as ke,B as St,C as _t,D as xt,E as ve,F as Ft}from"./personaWorkflow.NMqIlIKg.js";import{c as d,z as i,s as u,B as P,g as M,a1 as G,A as D,F as C,l as S,j as m,G as j,D as q,V,a2 as be,b as o,a3 as At,k as Et,p as pe,t as Nt,W as R,T as Ot}from"./vendor-vue.DQyCMu5a.js";import{_ as x,c as Lt}from"./index.VRUltArI.js";import{e as T,f as qt,g as ce}from"./vendor-vuetify.Dvtop9lb.js";import{ai as O,ag as y,b3 as h,aA as ue}from"./vendor-misc.DlM92jT6.js";import{u as te,i as se,_ as Ae,p as Ut,c as Bt,C as Ht}from"./ChatMessage.B8bai_tE.js";import{_ as re}from"./PersonaDoctorProfileModal.BdwkRR_f.js";import{_ as Ee,n as Vt}from"./ChatFooter.BsE9NgPY.js";import Qt from"./PopMyAccountMgmt.oN1CD4LM.js";import Kt from"./PopMyRecommendCode.DSKGkSu4.js";import{P as jt,_ as zt}from"./PopNotice.cR4jWwmB.js";import Yt from"./PopEvent.YwLO0oGd.js";import{P as Gt,_ as Wt}from"./PopEventReward.Da8l2L3u.js";import{P as Jt,_ as Xt}from"./PopHairLossNews.NY1CVxaU.js";import{_ as Zt}from"./eventIcon.Oo4tJZyi.js";import{f as $t}from"./chatSourceDisplay.B-TFY0D6.js";import es from"./PopReservation2.Dsa0DWLJ.js";import ts from"./PopMediInfo.DdezaymK.js";import ss from"./PopHairThick.Bwo7XiAB.js";import is from"./PopThesis.ByG58l5b.js";import as from"./PopSearch.BluMfZHj.js";import ns from"./PopPredict.DeJSH_r2.js";import rs from"./PopPredictHistory.CgU345Hz.js";import os from"./PopVideo.C8dbf_Fk.js";import ls from"./PopEvaluation.D2uffiYO.js";import ds from"./PopReport.DT8-8PhA.js";import{C as cs}from"./ClinicalList.B_HgO3vF.js";import us from"./PopChangeTell.DLHNBVRs.js";import hs from"./PopThesisList.xfrSxGQ9.js";import ps from"./PopReservationStatus.DxFLMW1Z.js";import ms from"./PopHairCount.CZ-vBfUA.js";import gs from"./PopCheckLogin.BpIFDON3.js";import ys from"./PopAloLiteLogin.d0-S2fWg.js";import fs from"./PopHospitalInfo.C8jM7IG9.js";import ks from"./PopHospitalMap.OgfGOJs2.js";import vs from"./PopHairTickCount2.t1m4arYC.js";import bs from"./PopProductList.BVch88SK.js";import Is from"./PopHairLossBlog.BX9FyODK.js";import Ms from"./PopEventModal.AzO_zjAb.js";import"./vendor-axios.B9ygI19o.js";import"./vendor-moment.C5S46NFB.js";import"./vendor-quill.BiOiM682.js";import"./vendor-date-io.C_LH91PS.js";import"./vendor-maps.B8dKhpM0.js";/* empty css                     */import"./Loading.BO8yG02s.js";import"./PopAccountLeave.CTTByzNf.js";import"./signupProfile.BUvuRDhn.js";import"./postImageFit.JOhy3yhf.js";import"./ImagePreviewViewer.Cr6eFrpR.js";import"./eventRewardImageZoom.DpuLUYCL.js";import"./Paging.Codo259r.js";import"./eventThumbPreview.gmIvojJ9.js";import"./PopConfirm.DybWBYpV.js";import"./PopPredictImg.DaKF-Bwq.js";import"./PopVideoInfo.Cgxuu1fW.js";import"./PopVideoChat.ChcfbeHG.js";import"./vendor-filepond.Bl2UwE-T.js";import"./PopApproval.CDHrJH1d.js";import"./PopThesisSave.BOfNLXZn.js";import"./PopExpandHairTick.D_-S7RWu.js";import"./PopProductListPdf.mOP15uq1.js";const Q=[{key:"cleanliness",badge:"ì²­ê²°",title:"[세정] 저자극 약산성 샴푸로 두피 ì²­ê²° 관리하기",description:"저자극 약산성 샴푸로 세정 자극을 줄이고, 두피에 1~2분 이상 도포해 피지와 노폐물 분리를 돕습니다. 이후 손끝이나 부드러운 샴푸 브러시로 두피를 마사지한 뒤 깨끗이 헹궈냅니다."},{key:"management",badge:"관리",title:"[관리] 샴푸 후 두피까지 충분히 건조하기",description:"샴푸 후 수건으로 물기를 가볍게 제거하고, 찬바람으로 두피부터 충분히 말려 보송한 두피 환경을 유지합니다."},{key:"lifestyle",badge:"생활",title:"[영양] 단백질 식사와 수분 섭취 챙기기",description:"모발 건강을 위해 단백질이 포함된 균형 잡힌 식사를 하고, 하루 동안 충분한 수분 섭취를 챙ê¹
1ë‹ˆë‹¤."},{key:"treatment",badge:"치료",title:"[치료] 처방·외용 탈모 치료제 정해진 용법 지키기",description:"현재 사용 중인 치료제가 있다면 정해진 시간과 용법에 맞춰 복용하거나 도포합니다."}],B={ORAL:["프로페시아","아보다트","미녹시딜"],TOPICAL:["미녹시딜 계열"]};function Ds(t){return t==="프로페시아"?"프로페시아 계열":t==="아보다트"?"아보다트 계열":t||""}const Ne=[30,60,90,120,180],ee="처방 약 일정 추가 후 진행할 수 있습니다.",Oe="오늘의 맞춤 케어 루틴을 완료해 주세요.",Ie={DAILY_CARE:1,MEDICATION_PRESCRIBED:2,MEDICATION_REFILL:3,AI_CARE_RECORD:4},Le="AI 의사 진료";function f(t=new Date){if(typeof t=="string"&&/^\d{4}-\d{2}-\d{2}/.test(t))return t.slice(0,10);const e=new Date(t);if(Number.isNaN(e.getTime()))return"";const n=e.getFullYear(),c=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${n}-${c}-${a}`}function Cs(t=[],e=Q){const n=Array.isArray(e)&&e.length?e.length:Q.length,c=new Set((e||Q).map(l=>l.key)),a=new Set((t||[]).filter(l=>c.has(l))).size,s=n?Math.round(a/n*100):0;return{checkedCount:a,totalCount:n,percent:s,label:`${a}/${n} 완료`}}function Rs(t=[],e=new Date){const n=new Set((t||[]).map(s=>f(s?.careDate||s?.date)).filter(Boolean)),c=new Date(f(e));let a=0;for(;!Number.isNaN(c.getTime())&&n.has(f(c));)a+=1,c.setDate(c.getDate()-1);return a}function he(t=new Date,e=[]){const n=f(t);return n?(e||[]).some(c=>{const a=f(c?.prescribedDate),s=f(c?.refillDate);return!!(a&&s&&a<=n&&n<=s)}):!1}function Z(t="",e=0){const n=Number(e);if(!Ne.includes(n))return"";const c=f(t);if(!c)return"";const a=new Date(`${c}T00:00:00`);return Number.isNaN(a.getTime())?"":(a.setDate(a.getDate()+n),f(a))}function Me(t=[]){return(t||[]).filter(e=>e?.medicationActive===!0||e?.medicationActiveYn==="Y"||e?.medication_active_yn==="Y").length}function qe({medications:t=[],calendarEvents:e=[]}={}){const n=[...t||[]];return(e||[]).forEach(c=>{const a=c?.type;if(a!=="MEDICATION_PRESCRIBED"&&a!=="MEDICATION_REFILL")return;const s=f(c?.prescribedDate),l=f(c?.refillDate);!s||!l||n.push({...c,prescribedDate:s,refillDate:l})}),n}function ws({careDate:t=new Date,medications:e=[],calendarEvents:n=[],checkedItemKeys:c=[]}={}){return he(t,qe({medications:e,calendarEvents:n}))?(c||[]).length?{canSubmit:!0,reason:"",message:""}:{canSubmit:!1,reason:"NO_ROUTINE_CHECKED",message:Oe}:{canSubmit:!1,reason:"NO_ACTIVE_MEDICATION",message:ee}}function Ps(t=0,e=!1){return e?{label:"오늘 출석 완료",showFire:!0}:{label:"오늘의 맞춤 케어 루틴을 완료해 주세요.",showFire:!1}}function De({careRecords:t=[],aiCareRecords:e=[],medications:n=[],calendarEvents:c=[]}={}){const a=Ts(c);
1if(a.length)return Re(a);const s=[];return(t||[]).forEach(l=>{const p=f(l?.careDate||l?.date);p&&s.push({date:p,type:"DAILY_CARE",label:"데일리 케어",sourceId:l.dailyCareRecordIdx,sourceType:"DAILY_CARE",title:"데일리 케어 완료"})}),(e||[]).forEach(l=>{const p=f(l?.recordDate||l?.date);p&&s.push({date:p,type:"AI_CARE_RECORD",label:Le,sourceId:l.personaCareMonthRecordIdx,sourceType:"AI_CARE_RECORD",title:l.visitLabel||"AI 진료 기록"})}),(n||[]).forEach(l=>{const p=l.dailyCareMedicationIdx,r=l.medicationName||l.name||"처방 약",g=f(l.prescribedDate),k=f(l.refillDate);g&&s.push({date:g,type:"MEDICATION_PRESCRIBED",label:"약 수령 일",sourceId:p,sourceType:"DAILY_CARE_MEDICATION",title:r,medicationType:l.medicationType,medicationName:r,prescribedDate:g,refillDate:k}),k&&s.push({date:k,type:"MEDICATION_REFILL",label:"다음 약 타는 날",sourceId:p,sourceType:"DAILY_CARE_MEDICATION",title:r,medicationType:l.medicationType,medicationName:r,prescribedDate:g,refillDate:k})}),Re(s)}function Ts(t=[]){return(t||[]).map(e=>{const n=f(e?.date);return n?{...e,date:n,label:e.type==="AI_CARE_RECORD"||e.type==="MEDICATION_PRESCRIBED"||e.type==="MEDICATION_REFILL"?Ce(e.type):e.label||Ce(e.type),prescribedDate:e.prescribedDate?f(e.prescribedDate):"",refillDate:e.refillDate?f(e.refillDate):""}:null}).filter(Boolean)}function Ce(t=""){return t==="DAILY_CARE"?"데일리 케어":t==="AI_CARE_RECORD"?Le:t==="MEDICATION_PRESCRIBED"?"약 수령 일":t==="MEDICATION_REFILL"?"다음 약 타는 날":"일정"}function Re(t=[]){return[...t].sort((e,n)=>f(e.date).localeCompare(f(n.date))||(Ie[e.type]||99)-(Ie[n.type]||99)||String(e.title||"").localeCompare(String(n.title||"")))}const we="medaloDailyCareStreakCoachMarkSeen",Ss={name:"DailyCare",components:{PersonaCareRecordTabs:ae,PersonaRecordDateCalendar:ie},emits:["close","auth-expired"],data(){const t=f(new Date);return{shellStyle:{"--persona-shell-max-width":"860px"},visibleDate:t,selectedDate:t,checkedItemKeys:[],loading:!1,saving:!1,medicationSaving:!1,selectedMedicationSaving:!1,medicationDeleting:!1,monthRequestSeq:0,message:"",messageType:"info",monthData:{routineItems:Q,careRecords:[],aiCareRecords:[],medications:[],medicationCoverageItems:[],calendarEvents:[],streakDays:0},todayCareData:{routineItems:Q,careRecords:[],aiCareRecords:[],medications:[],medicationCoverageItems:[],calendarEvents:[],streakDays:0},medicationForm:{dailyCareMedicationIdx:null,medicationType:"ORAL",medicationName:B.ORAL[0],prescribedDate:t,refillDate:""},medicationDurationDays:null,selectedMedicationForm:{dailyCareMedicationIdx:null,medicationType:"ORAL",medicationName:B.ORAL[0],prescribedDate:"",refillDate:""},selectedMedicationDurationDays:null,medicationModalOpen:!1,medicationRefillPickerOpen:!1,medicationRefillPickerTarget:"",medicationRefillPickerMode:"duration",medicationNameDropdownTarget:"",medicationNameDropdownStyle:{},medicationDeleteConfirmOpen:!1,medicationValidationModalOpen:!1,medicationValidationMessage:"",quickMenuOpen:!1,quickMenuContext:"",calendarQuickMenuViewportLocked:!1,calendarQuickMenuPosition:null,calendarQuickMenuDrag:null,suppressNextQuickMenuClick:!1,routineModalOpen:!1,infoModalOpen:!1,infoModalMessage:"",medicationRequiredModalOpen:!1,initialMedicationGateChecked:!1,streakCoachMarkOpen:!1,selectedMedicationEvent:null,selectedCalendarRecordId:"",dayEventsModalOpen:!1,dayEventsDate:"",aiRecordViewMode:"daily",aiHistorySummary:{},aiCarePlan:null,aiSessionDetail:{},aiRecordSummary:null,aiRecordDetail:null,aiSelectedStatusMonthIndex:-1,aiActiveRecordTab:"images",aiImageUrls:{},aiImageFileIds:{},aiImageErrors:{},aiImageRequestSeq:{}}},computed:{routineItems(){return this.monthData.routineItems?.length?this.monthData.routineItems:Q},progress(){return Cs(this.checkedItemKeys,this.routineItems)},progressStyle(){return{"--progress-offset":2*Math.PI*74*(1-this.progress.percent/100)}},calendarQuickMenuStyle(){return!this.calendarQuickMenuViewportLocked||!this.calendarQuickMenuPosition?null:{left:`${this.calendarQuickMenuPosition.left}px`,top:`${this.calendarQuickMenuPosition.top}px`,right:"auto",bottom:"auto"}}
1,calendarQuickMenuNearTop(){return!!(this.calendarQuickMenuViewportLocked&&this.calendarQuickMenuPosition&&this.calendarQuickMenuPosition.top<210)},streakDays(){return Number(this.monthData.streakDays??Rs(this.monthData.careRecords,new Date))},streakStatusText(){return this.streakStatus.label},streakStatus(){return Ps(this.streakDays,!!this.todayRecord)},totalCareDays(){return Number(this.monthData.totalCareDays??this.monthData.careRecords?.length??0)},medicationPeriodCareDays(){return Number(this.monthData.medicationPeriodCareDays??Me(this.monthData.careRecords))},medications(){return this.monthData.medications||[]},medicationCoverageItems(){return this.monthData.medicationCoverageItems?.length?this.monthData.medicationCoverageItems:this.medications},todayMedicationCoverageItems(){return this.todayCareData.medicationCoverageItems?.length?this.todayCareData.medicationCoverageItems:this.todayCareData.medications},submitMedicationCoverageItems(){return this.todayMedicationCoverageItems},medicationNameOptions(){return B[this.medicationForm.medicationType]||[]},selectedMedicationNameOptions(){return B[this.selectedMedicationForm.medicationType]||[]},medicationDurationOptions(){return Ne},isSelectedMedicationRefillPicker(){return this.medicationRefillPickerTarget==="selected"},medicationRefillPickerDate(){return this.isSelectedMedicationRefillPicker?this.selectedMedicationForm.refillDate:this.medicationForm.refillDate},medicationRefillPickerDurationDays(){return this.isSelectedMedicationRefillPicker?this.selectedMedicationDurationDays:this.medicationDurationDays},showMedicationFormRequiredNote(){return!this.isMedicationScheduleOpenToday(this.medicationForm)&&!this.hasExistingMedicationScheduleOpenToday},hasExistingMedicationScheduleOpenToday(){return he(this.todayKey,qe({medications:this.submitMedicationCoverageItems,calendarEvents:this.submitCalendarEvents}))},calendarEvents(){return De({careRecords:this.monthData.careRecords,aiCareRecords:this.monthData.aiCareRecords,medications:this.monthData.medications,calendarEvents:this.monthData.calendarEvents})},todayCalendarEvents(){return De({careRecords:this.todayCareData.careRecords,aiCareRecords:this.todayCareData.aiCareRecords,medications:this.todayCareData.medications,calendarEvents:this.todayCareData.calendarEvents})},submitCalendarEvents(){return this.todayCalendarEvents},calendarRecords(){return this.calendarEvents.map((t,e)=>({calendarRecordId:this.calendarRecordId(t,e),calendarLabel:t.label,visitLabel:t.label,recordDate:t.date,monthIndex:e,visitRound:e,dailyCareEvent:t}))},selectedDateLabel(){const t=new Date(this.selectedDate);return Number.isNaN(t.getTime())?this.selectedDate:`${t.getMonth()+1}월 ${t.getDate()}일`},dayEventsDateLabel(){const t=new Date(this.dayEventsDate);return Number.isNaN(t.getTime())?this.dayEventsDate:`${t.getMonth()+1}월 ${t.getDate()}일`},selectedDayEventRecords(){return this.dayEventsDate?this.calendarRecords.filter(t=>f(t.recordDate)===this.dayEventsDate):[]},selectedRecord(){return((this.isTodaySelectedDate?this.todayCareData.careRecords:this.monthData.careRecords)||[]).find(e=>f(e.careDate)===this.selectedDate)||null},todayRecord(){return(this.todayCareData.careRecords||[]).find(t=>f(t.careDate)===this.todayKey)||null},todayKey(){return f(new Date)},isTodaySelectedDate(){return f(this.selectedDate)===this.todayKey},isPastSelectedDate(){const t=f(this.selectedDate);return!!t&&t<this.todayKey},isDefaultActionState(){return!this.actionMessage&&!this.isPastSelectedDate},actionMessage(){return this.message||(!this.isPastSelectedDate&&this.dailyCareBlockedByMedication?ee:"")},actionMessageIsError(){return this.messageType==="error"||!this.isPastSelectedDate&&this.dailyCareBlockedByMedication},submitAvailability(){return ws({careDate:this.todayKey,medications:this.submitMedicationCoverageItems,calendarEvents:this.submitCalendarEvents,checkedItemKeys:this.checkedItemKeys})},dailyCareBlockedByMedication(){return this.submitAvailability.reason==="NO_ACTIVE_MEDICATION"},isSubmitDisabled(){return this.dailyCareBlockedByMedication},aiCareRecords(){const t=this.aiCarePlan?.months||[];return t.length?t:this.monthData.aiCareRecords||[]},aiSelectedRecord(){return this.aiRecordDetail||this.aiRecordSummary},selectedMedicationView(){const t=this.selectedMedicationEvent;return t?{eventLabel:t.label||(t.type==="MEDICATION_PRESCRIBED"?"처방일":"다음 약 타는 날"),sourceLabel:t.sourceType==="AI_CARE_RECORD_MEDICATION"?"AI 의사 진료 약 일정":"데일리 케어 약 일정"}:null},selectedMedicationEditable(){return this.selectedMedicationEvent?.sourceType==="DAILY_CARE_MEDICATION"&&!!(this.selectedMedicationForm.dailyCareMedicationIdx||this.selectedMedicationEvent?.sourceId)},aiComparisonRecords(){const t=new Map;
1if(this.aiCareRecords.forEach(e=>{t.set(Number(e.personaCareMonthRecordIdx),e)}),this.aiSelectedRecord?.personaCareMonthRecordIdx){const e=Number(this.aiSelectedRecord.personaCareMonthRecordIdx);t.set(e,{...t.get(e)||{},...this.aiSelectedRecord})}return Array.from(t.values()).sort((e,n)=>Number(e.visitRound??e.monthIndex)-Number(n.visitRound??n.monthIndex))},aiSelectedRecordImageUrls(){const t=this.aiSelectedRecord;return t?{hairType:this.aiImageUrls[this.aiMonthImageKey(t,"scalp")]||"",thickness:this.aiImageUrls[this.aiMonthImageKey(t,"thickness")]||""}:{hairType:"",thickness:""}},aiSessionImageUrls(){return{hairType:this.aiSelectedRecordImageUrls.hairType||this.aiImageUrls.sessionHairType||"",thickness:this.aiSelectedRecordImageUrls.thickness||this.aiImageUrls.sessionThickness||""}},aiStatusImageOptions(){return this.aiComparisonRecords.map(t=>({monthIndex:Number(t.visitRound??t.monthIndex),recordId:Number(t.personaCareMonthRecordIdx),label:t.visitLabel||this.aiMonthLabel(t.visitRound??t.monthIndex),recordDate:t.recordDate,scalpUrl:this.aiImageUrls[this.aiMonthImageKey(t,"scalp")]||"",thicknessUrl:this.aiImageUrls[this.aiMonthImageKey(t,"thickness")]||"",thicknessResult:t.thicknessResult}))},aiImageErrorMessage(){return Object.values(this.aiImageErrors||{}).some(Boolean)?"일부 의료 이미지를 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.":""}},mounted(){this.loadMonth(),this.loadAiHistorySummary(),this.syncCalendarQuickMenuViewportLock(),document.addEventListener("pointerdown",this.handleQuickMenuOutsideClick,!0),window.addEventListener("resize",this.syncCalendarQuickMenuViewportLock),window.addEventListener("resize",this.updateMedicationNameDropdownPosition),window.addEventListener("scroll",this.updateMedicationNameDropdownPosition,!0)},beforeUnmount(){document.removeEventListener("pointerdown",this.handleQuickMenuOutsideClick,!0),window.removeEventListener("resize",this.syncCalendarQuickMenuViewportLock),window.removeEventListener("resize",this.updateMedicationNameDropdownPosition),window.removeEventListener("scroll",this.updateMedicationNameDropdownPosition,!0),this.revokeAiImageUrls()},methods:{medicationDisplayName:Ds,calendarRecordId(t,e){return`${t.type}-${t.sourceType||""}-${t.sourceId||t.title||""}-${t.date}-${e}`},isTodayMonth(t){return f(t).slice(0,7)===this.todayKey.slice(0,7)},monthKey(t){return f(t).slice(0,7)},isCurrentMonthRequest(t,e){return t===this.monthRequestSeq&&this.monthKey(e)===this.monthKey(this.visibleDate)},changeVisibleDate(t){this.visibleDate=t,this.clearDailyCareMessage(),this.aiRecordViewMode="daily",this.routineModalOpen=!1,this.selectedMedicationEvent=null,this.selectedMedicationDurationDays=null,this.medicationDeleteConfirmOpen=!1,this.closeMedicationRefillPicker(),this.closeQuickMenu(),this.closeDayEventsModal(),this.loadMonth()},selectDate(t){this.clearDailyCareMessage(),this.selectedDate=t;const e=new Date(t),n=new Date(this.visibleDate);!Number.isNaN(e.getTime())&&e.getMonth()!==n.getMonth()&&(this.visibleDate=f(new Date(e.getFullYear(),e.getMonth(),1)),this.loadMonth()),this.syncSelectedRecord()},selectCalendarEntry(t){this.openDayEventsModal(t)},openDayEventsModal(t){const e=t?.dailyCareEvent;e&&(this.clearDailyCareMessage(),this.selectedCalendarRecordId=t.calendarRecordId,this.dayEventsDate=f(t.recordDate||e.date),this.dayEventsModalOpen=!0,this.aiRecordViewMode="daily",this.routineModalOpen=!1,this.selectedMedicationEvent=null,this.selectedMedicationDurationDays=null,this.medicationDeleteConfirmOpen=!1,this.closeMedicationNameDropdown(),this.closeQuickMenu())},closeDayEventsModal(){this.closeQuickMenu(),this.dayEventsModalOpen=!1,this.dayEventsDate=""},openDayEventDetail(t){t?.dailyCareEvent&&(this.selectedCalendarRecordId=t.calendarRecordId,this.dayEventsModalOpen=!1,this.openCalendarEventDetail(t))},openCalendarEventDetail(t){const e=t?.dailyCareEvent;if(e){if(this.clearDailyCareMessage(),this.selectedCalendarRecordId=t.calendarRecordId,e.type==="AI_CARE_RECORD"){this.openAiCareRecord(e);return}if(this.isMedicationEvent(e)){this.showMedicationEvent(e);return}this.openDailyCareRoutine(e.date)}},dayEventLabel(t){return t?.dailyCareEvent?.label||t?.calendarLabel||"일정"},dayEventTitle(t){const e=t?.dailyCareEvent||{};return e.title||e.medicationName||t?.visitLabel||this.dayEventLabel(t)},dayEventBadgeClass(t){const e=t?.dailyCareEvent?.type||"";return e?`daily-care-day-event--${e.toLowerCase().replace(/_/g,"-")}`:""},isMedicationEvent(t){return t?.type==="MEDICATION_PRESCRIBED"||t?.type==="MEDICATION_REFILL"},showMedicationEvent(t){this.clearDailyCareMessage(),this.aiRecordViewMode="daily",this.routineModalOpen=!1,this.medicationDeleteConfirmOpen=!1,this.closeQuickMenu(),this.closeDayEventsModal(),this.selectedMedicationEvent=t,this.selectedDate=f(t.date),this.selectedMedicationForm=this.buildSelectedMedicationForm(t),this.selectedMedicationDurationDays=null,this.medicationForm.prescribedDate=this.selectedMedicationForm.prescribedDate||this.selectedDate}
1,openDailyCareRoutine(t=this.todayKey){this.clearDailyCareMessage(),this.aiRecordViewMode="daily",this.selectedMedicationEvent=null,this.selectedMedicationDurationDays=null,this.medicationDeleteConfirmOpen=!1,this.closeQuickMenu(),this.closeDayEventsModal(),this.routineModalOpen=!0,this.selectedDate=f(t),this.medicationForm.prescribedDate=this.selectedDate,this.syncSelectedRecord()},loadMonth(){const t=this.visibleDate,e=++this.monthRequestSeq,n=new Date(t);this.loading=!0,this.$api.chat.getPersonaDailyCareMonth({year:n.getFullYear(),month:n.getMonth()+1},{success:c=>{if(!this.isCurrentMonthRequest(e,t))return;const a=this.normalizeMonthData(c||{});this.monthData=a,this.isTodayMonth(t)&&(this.todayCareData=a),this.loading=!1,this.syncSelectedRecord(),this.maybeShowInitialMedicationRequiredModal(),this.maybeShowStreakCoachMark(),this.aiRecordViewMode==="detail"&&this.refreshSelectedAiRecordSummary()},error:c=>{if(this.isCurrentMonthRequest(e,t)){if(this.isAuthExpiredError(c)){this.loading=!1,this.$emit("auth-expired");return}this.loading=!1,this.messageType="error",this.message="데일리 케어 정보를 불러오지 못했습니다."}}})},loadAiHistorySummary(){this.$api.chat.getPersonaHistorySummary({success:t=>{this.aiHistorySummary=t||{},this.aiCarePlan=t?.latestCarePlan||null,this.aiSessionDetail=t?.initialSession||t?.latestSession||{},this.loadAllAiImages()},error:t=>{if(this.isAuthExpiredError(t)){this.$emit("auth-expired");return}this.aiHistorySummary={},this.aiCarePlan=null,this.aiSessionDetail={}}})}
1,normalizeMonthData(t){return{routineItems:t.routineItems?.length?t.routineItems:Q,careRecords:t.careRecords||[],aiCareRecords:t.aiCareRecords||[],medications:t.medications||[],medicationCoverageItems:t.medicationCoverageItems||t.medications||[],calendarEvents:t.calendarEvents||[],streakDays:t.streakDays??0,totalCareDays:t.totalCareDays??t.careRecords?.length??0,medicationPeriodCareDays:t.medicationPeriodCareDays??Me(t.careRecords||[])}},syncSelectedRecord(){const t=this.selectedRecord;if(this.checkedItemKeys=t?.checkedItemKeys?.length?[...t.checkedItemKeys]:[],t){const e=this.calendarRecords.find(n=>n.dailyCareEvent?.type==="DAILY_CARE"&&f(n.dailyCareEvent.date)===this.selectedDate);e&&(this.selectedCalendarRecordId=e.calendarRecordId)}},maybeShowInitialMedicationRequiredModal(){this.initialMedicationGateChecked||(this.initialMedicationGateChecked=!0,this.dailyCareBlockedByMedication&&this.showMedicationRequiredModal())},clearCalendarSelection(){this.selectedCalendarRecordId=""},clearDailyCareMessage(){this.message="",this.messageType="info"},isAuthExpiredError(t){return Y(t)},openAiCareRecord(t){const e=Number(t.sourceId),n=this.findAiRecord(e);if(!n){this.messageType="error",this.message="AI 진료 기록을 찾지 못했습니다.";return}this.aiRecordViewMode="detail",this.routineModalOpen=!1,this.selectedMedicationEvent=null,this.selectedMedicationDurationDays=null,this.medicationDeleteConfirmOpen=!1,this.closeQuickMenu(),this.closeDayEventsModal(),this.selectedDate=f(t.date),this.aiRecordSummary=n,this.aiRecordDetail=null,this.aiSelectedStatusMonthIndex=this.previousAiStatusMonthIndex(n),this.aiActiveRecordTab="images",this.loadAiRecordImages(n);const c=n.personaCarePlanIdx||this.aiCarePlan?.personaCarePlanIdx;c&&(this.loading=!0,this.$api.chat.getPersonaCareRecord(c,e,{success:a=>{this.aiRecordDetail={...n,...a||{}},this.loading=!1,this.loadAiRecordImages(this.aiRecordDetail),this.loadAllAiImages()},error:()=>{this.loading=!1,this.messageType="error",this.message="AI 진료 기록을 불러오지 못했습니다."}}))},refreshSelectedAiRecordSummary(){if(!this.aiSelectedRecord?.personaCareMonthRecordIdx)return;const t=this.findAiRecord(this.aiSelectedRecord.personaCareMonthRecordIdx);t&&(this.aiRecordSummary=t)},closeDetailModal(){this.returnToTodayDailyCare()},returnToTodayDailyCare(){const t=this.todayKey,e=f(this.visibleDate).slice(0,7),n=t.slice(0,7);if(this.clearDailyCareMessage(),this.aiRecordViewMode="daily",this.routineModalOpen=!1,this.selectedMedicationEvent=null,this.selectedMedicationDurationDays=null,this.medicationDeleteConfirmOpen=!1,this.closeQuickMenu(),this.closeDayEventsModal(),this.aiRecordSummary=null,this.aiRecordDetail=null,this.aiActiveRecordTab="images",this.selectedDate=t,this.medicationForm.prescribedDate=t,this.clearCalendarSelection(),this.syncSelectedRecord(),e!==n){this.visibleDate=t,this.loadMonth();return}},findAiRecord(t){return this.aiCareRecords.find(e=>Number(e.personaCareMonthRecordIdx)===Number(t))||(this.monthData.aiCareRecords||[]).find(e=>Number(e.personaCareMonthRecordIdx)===Number(t))||null},findDailyCareMedication(t){return(this.monthData.medications||[]).find(e=>String(e.dailyCareMedicationIdx)===String(t))||null},buildSelectedMedicationForm(t){const e=t?.sourceType==="DAILY_CARE_MEDICATION"?this.findDailyCareMedication(t.sourceId):null,n=e?.medicationType||t?.medicationType||"ORAL",c=e?.medicationName||t?.medicationName||t?.title||(B[n]||[])[0]||"";return{dailyCareMedicationIdx:e?.dailyCareMedicationIdx||(t?.sourceType==="DAILY_CARE_MEDICATION"?t.sourceId:null),medicationType:n,medicationName:c,prescribedDate:f(e?.prescribedDate||t?.prescribedDate||(t?.type==="MEDICATION_PRESCRIBED"?t.date:"")),refillDate:f(e?.refillDate||t?.refillDate||(t?.type==="MEDICATION_REFILL"?t.date:""))}},saveDailyCare(){if(this.saving)return;if(this.isPastSelectedDate){this.messageType="error",this.message="지난 날짜의 데일리 케어는 수정할 수 없습니다.";return}const t=this.submitAvailability;if(t.reason==="NO_ACTIVE_MEDICATION"){this.messageType="error",this.message=ee,this.showMedicationRequiredModal(),this.focusQuickMenu();return}if(t.reason==="NO_ROUTINE_CHECKED"){this.messageType="error",this.message=Oe;return}this.saving=!0,this.$api.chat.savePersonaDailyCareRecord({careDate:this.selectedDate,checkedItemKeys:this.checkedItemKeys},{success:()=>{this.saving=!1,this.messageType="info",this.message="출석 체크가 완료되었습니다.",this.loadMonth()},error:()=>{this.saving=!1,this.messageType="error",this.message="출석 체크 저장에 실패했습니다."}})},saveMedication(){this.medicationSaving||this.validateMedicationForm(this.medicationForm,{showModal:!0})&&(this.medicationSaving=!0,this.$api.chat.savePersonaDailyCareMedication({...this.medicationForm},{success:()=>{this.medicationSaving=!1,this.clearDailyCareMessage(),this.resetMedicationForm(this.selectedDate),this.medicationModalOpen=!1,this.loadMonth()},error:()=>{this.medicationSaving=!1,this.messageType="error",this.message="처방 약 일정 저장에 실패했습니다."}}))},validateMedicationForm(t,e={}){const n=this.medicationFormValidationMessage(t);return n?(this.messageType="error",this.message=n,e.showModal&&this.showMedicationValidationModal(n),!1):!0},medicationFormValidationMessage(t){return!t.medicationName||!t.prescribedDate||!t.refillDate?"처방약, 약 수령 일, 다음 약 타는 날을 모두 입력해 주세요.":!this.isValidMedicationDate(t.prescribedDate)||!this.isValidMedicationDate(t.refillDate)?"약 수령 일과 다음 약 타는 날을 올바른 날짜로 입력해 주세요.":t.refillDate<t.prescribedDate?"다음 약 타는 날은 약 수령 일과 같거나 이후 날짜로 입력해 주세요.":""},applyMedicationDuration(t){const e=Number(t);if(!this.medicationDurationOptions.includes(e))return;this.medicationDurationDays=e;const n=Z(this.medicationForm.prescribedDate,e);n&&(this.medicationForm.refillDate=n)},syncMedicationDurationRefill(){if(!this.medicationDurationDays)return;const t=Z(this.medicationForm.prescribedDate,this.medicationDurationDays);t&&(this.medicationForm.refillDate=t)},clearMedicationDuration(){this.medicationDurationDays=null},applySelectedMedicationDuration(t){if(!this.selectedMedicationEditable)return;const e=Number(t);if(!this.medicationDurationOptions.includes(e))return;this.selectedMedicationDurationDays=e;const n=Z(this.selectedMedicationForm.prescribedDate,e);n&&(this.selectedMedicationForm.refillDate=n)},syncSelectedMedicationDurationRefill(){if(!this.selectedMedicationDurationDays)return;const t=Z(this.selectedMedicationForm.prescribedDate,this.selectedMedicationDurationDays);t&&(this.selectedMedicationForm.refillDate=t)},clearSelectedMedicationDuration(){this.selectedMedicationDurationDays=null},isMedicationNameDropdownOpen(t){return this.medicationNameDropdownTarget===t},toggleMedicationNameDropdown(t){if(t==="selected"&&!this.selectedMedicationEditable||t!=="new"&&t!=="selected")return;this.closeMedicationRefillPicker();const e=this.isMedicationNameDropdownOpen(t)?"":t;this.medicationNameDropdownTarget=e,e?(this.medicationNameDropdownStyle={position:"fixed",visibility:"hidden"},this.updateMedicationNameDropdownPosition()):this.medicationNameDropdownStyle={}},closeMedicationNameDropdown(){this.medicationNameDropdownTarget="",this.medicationNameDropdownStyle={}},normalizedMedicationNameDropdownRef(t){return Array.isArray(t)?t[0]:t},medicationNameDropdownElement(t=this.medicationNameDropdownTarget){const e=t==="selected"?this.$refs.selectedMedicationNameDropdown:this.$refs.medicationNameDropdown;return this.normalizedMedicationNameDropdownRef(e)},medicationNameDropdownListElement(t=this.medicationNameDropdownTarget){const e=t==="selected"?this.$refs.selectedMedicationNameDropdownList:this.$refs.medicationNameDropdownList;return this.normalizedMedicationNameDropdownRef(e)},updateMedicationNameDropdownPosition(){if(!this.medicationNameDropdownTarget)return;const t=this.medicationNameDropdownTarget;this.$nextTick(()=>
1{if(!this.medicationNameDropdownTarget||this.medicationNameDropdownTarget!==t)return;const e=this.medicationNameDropdownElement(t),n=this.medicationNameDropdownListElement(t),c=e?.querySelector(".daily-care-select-trigger");if(!c||!n)return;const a=c.getBoundingClientRect(),s=window.innerWidth||document.documentElement.clientWidth||a.right,l=window.innerHeight||document.documentElement.clientHeight||a.bottom,p=6,r=10,g=n.offsetHeight||0,k=Math.max(0,a.width),_=Math.min(Math.max(r,a.left),Math.max(r,s-r-k)),v=a.bottom+p,I=l-a.bottom-r-p,U=a.top-r-p;let L=v;g&&I<g&&U>I?L=Math.max(r,a.top-g-p):g&&(L=Math.min(v,Math.max(r,l-r-g))),this.medicationNameDropdownStyle={position:"fixed",top:`${Math.round(L)}px`,left:`${Math.round(_)}px`,width:`${Math.round(k)}px`}})},closeMedicationNameDropdownFromOutside(t){if(!this.medicationNameDropdownTarget)return;const e=this.medicationNameDropdownElement(),n=this.medicationNameDropdownListElement();e?.contains(t.target)||n?.contains(t.target)||this.closeMedicationNameDropdown()},selectMedicationName(t,e){if(e){if(t==="new")this.medicationForm.medicationName=e;else if(t==="selected"){if(!this.selectedMedicationEditable)return;this.selectedMedicationForm.medicationName=e}else return;this.closeMedicationNameDropdown()}},openMedicationRefillPicker(t){if(!(t==="selected"&&!this.selectedMedicationEditable)&&!(t!=="new"&&t!=="selected")){if(this.medicationRefillPickerTarget=t,t==="new"){this.medicationRefillPickerMode="duration",this.applyMedicationRefillPickerDuration(60),this.medicationRefillPickerOpen=!0;return}this.medicationRefillPickerMode="manual",this.medicationRefillPickerOpen=!0,this.openMedicationRefillDatePicker("medicationRefillPickerDateInput")}},closeMedicationRefillPicker(){this.medicationRefillPickerOpen=!1,this.medicationRefillPickerTarget="",this.medicationRefillPickerMode="duration"},updateMedicationRefillPickerDate(t){const e=t?.target?.value||"";if(this.isSelectedMedicationRefillPicker){if(!this.selectedMedicationEditable)return;this.selectedMedicationForm.refillDate=e,this.clearSelectedMedicationDuration();return}this.medicationForm.refillDate=e,this.clearMedicationDuration()},applyMedicationRefillPickerDuration(t){this.medicationRefillPickerMode="duration",this.isSelectedMedicationRefillPicker?this.applySelectedMedicationDuration(t):this.applyMedicationDuration(t),this.openMedicationRefillDatePicker("medicationRefillPickerDateInput")},openMedicationRefillDatePicker(t){this.$nextTick(()=>{const e=this.$refs[t],n=Array.isArray(e)?e[0]:e;if(!(!n||typeof n.focus!="function")){try{n.focus({preventScroll:!0})}catch{n.focus()}if(typeof n.showPicker=="function")try{n.showPicker()}catch{}}})},isValidMedicationDate(t){if(!/^\d{4}-\d{2}-\d{2}$/.test(t||""))return!1;const e=new Date(`${t}T00:00:00`);return!Number.isNaN(e.getTime())&&f(e)===t},isMedicationScheduleOpenToday(t){return he(this.todayKey,[t])},showMedicationValidationModal(t){this.medicationValidationMessage=t,this.medicationValidationModalOpen=!0},closeMedicationValidationModal(){this.medicationValidationModalOpen=!1,this.medicationValidationMessage=""},resetMedicationForm(t=this.selectedDate){this.medicationForm={dailyCareMedicationIdx:null,medicationType:"ORAL",medicationName:B.ORAL[0],prescribedDate:t,refillDate:""},this.medicationDurationDays=null},openMedicationModal(){this.closeQuickMenu(),this.closeDayEventsModal(),this.medicationModalOpen=!0,this.medicationForm.prescribedDate||(this.medicationForm.prescribedDate=this.selectedDate),this.medicationForm.medicationName||(this.medicationForm.medicationName=this.medicationNameOptions[0]||"")},closeMedicationModal(){this.medicationModalOpen=!1,this.closeMedicationRefillPicker(),this.closeMedicationNameDropdown(),this.closeMedicationValidationModal()},syncCalendarQuickMenuViewportLock(){if(typeof window>"u")return;const t=window.matchMedia("(max-width: 1024px), (hover: none) and (pointer: coarse), (max-height: 536px)").matches;this.calendarQuickMenuViewportLocked=t,t&&this.clampExistingCalendarQuickMenuPosition()},clampCalendarQuickMenuPosition(t,e,n=42,c=42){if(typeof window>"u")return{left:t,top:e};const a=12,s=Math.max(a,window.innerWidth-n-a),l=Math.max(a,window.innerHeight-c-a);return{left:Math.min(Math.max(t,a),s),top:Math.min(Math.max(e,a),l)}}
1,clampExistingCalendarQuickMenuPosition(){if(!this.calendarQuickMenuPosition)return;const t=this.$refs.quickMenuArea?.getBoundingClientRect();this.calendarQuickMenuPosition=this.clampCalendarQuickMenuPosition(this.calendarQuickMenuPosition.left,this.calendarQuickMenuPosition.top,t?.width||42,t?.height||42)},startCalendarQuickMenuDrag(t){if(!this.calendarQuickMenuViewportLocked||t.button!==void 0&&t.button!==0)return;const e=this.$refs.quickMenuArea?.getBoundingClientRect();e&&(this.calendarQuickMenuDrag={pointerId:t.pointerId,startX:t.clientX,startY:t.clientY,startLeft:e.left,startTop:e.top,width:e.width,height:e.height,moved:!1},t.currentTarget?.setPointerCapture?.(t.pointerId))},moveCalendarQuickMenuDrag(t){const e=this.calendarQuickMenuDrag;if(!e||e.pointerId!==t.pointerId)return;const n=t.clientX-e.startX,c=t.clientY-e.startY;!e.moved&&Math.hypot(n,c)<6||(e.moved=!0,this.calendarQuickMenuPosition=this.clampCalendarQuickMenuPosition(e.startLeft+n,e.startTop+c,e.width,e.height),t.preventDefault())},finishCalendarQuickMenuDrag(t){const e=this.calendarQuickMenuDrag;!e||e.pointerId!==t.pointerId||(t.currentTarget?.releasePointerCapture?.(t.pointerId),e.moved&&(this.suppressNextQuickMenuClick=!0,window.setTimeout(()=>{this.suppressNextQuickMenuClick=!1},0)),this.calendarQuickMenuDrag=null)},handleQuickMenuOutsideClick(t){this.closeMedicationNameDropdownFromOutside(t),this.streakCoachMarkOpen&&!this.$refs.streakLegendArea?.contains(t.target)&&(this.streakCoachMarkOpen=!1),!(!this.quickMenuOpen||[this.$refs.quickMenuArea,this.$refs.dayEventsQuickMenuArea].some(n=>n?.contains(t.target)))&&this.closeQuickMenu()},closeQuickMenu(){this.quickMenuOpen=!1,this.quickMenuContext=""},toggleQuickMenu(t="calendar"){if(t==="calendar"&&this.suppressNextQuickMenuClick){this.suppressNextQuickMenuClick=!1;return}if(this.quickMenuOpen&&this.quickMenuContext===t){this.closeQuickMenu();return}this.quickMenuOpen=!0,this.quickMenuContext=t},openTodayDailyCare(){if(this.clearDailyCareMessage(),this.closeQuickMenu(),this.closeDayEventsModal(),this.dailyCareBlockedByMedication){this.showMedicationRequiredModal();return}this.openDailyCareRoutine(this.todayKey)},openCareDaysInfo(){this.openInfoModal(`총 케어 일수는 ${this.medicationPeriodCareDays}일 입니다.`)},openStreakInfo(){this.openInfoModal(`오늘 기준 연속 출석일은 ${this.streakDays}일입니다.`)},openInfoModal(t){this.closeQuickMenu(),this.closeDayEventsModal(),this.infoModalMessage=t,this.infoModalOpen=!0},closeInfoModal(){this.infoModalOpen=!1,this.infoModalMessage=""},openMedicationFromQuickMenu(){this.openMedicationModal()},showMedicationRequiredModal(){this.medicationRequiredModalOpen=!0},closeMedicationRequiredModal(){this.medicationRequiredModalOpen=!1,this.maybeShowStreakCoachMark()},openMedicationFromRequiredModal(){this.medicationRequiredModalOpen=!1,this.openMedicationModal()},toggleStreakCoachMark(){this.streakCoachMarkOpen=!this.streakCoachMarkOpen,this.streakCoachMarkOpen&&this.markStreakCoachMarkSeen()},closeStreakCoachMark(){this.streakCoachMarkOpen=!1},markStreakCoachMarkSeen(){try{localStorage.setItem(we,"Y")}catch{}},maybeShowStreakCoachMark(){if(this.streakCoachMarkOpen||this.medicationRequiredModalOpen||this.medicationModalOpen||this.routineModalOpen||this.todayRecord)return;let t="Y";try{t=localStorage.getItem(we)||""}catch{t="Y"}t!=="Y"&&(this.streakCoachMarkOpen=!0,this.markStreakCoachMarkSeen())},selectMedicationType(t){this.medicationForm.medicationType=t,this.medicationForm.medicationName=(B[t]||[])[0]||"",this.closeMedicationNameDropdown()},selectSelectedMedicationType(t){this.selectedMedicationEditable&&(this.selectedMedicationForm.medicationType=t,this.selectedMedicationForm.medicationName=(B[t]||[])[0]||"",this.closeMedicationNameDropdown())},saveSelectedMedication(){this.selectedMedicationSaving||!this.selectedMedicationEditable||!this.validateMedicationForm(this.selectedMedicationForm)||(this.selectedMedicationSaving=!0,this.$api.chat.savePersonaDailyCareMedication({...this.selectedMedicationForm},{success:()=>{this.selectedMedicationSaving=!1,this.clearDailyCareMessage(),this.loadMonth()},error:()=>{this.selectedMedicationSaving=!1,this.messageType="error",this.message="처방 약 일정 저장에 실패했습니다."}}))},deleteSelectedMedication(){this.selectedMedicationEditable&&(this.clearDailyCareMessage(),this.medicationDeleteConfirmOpen=!0)},confirmMedicationDelete(){if(!this.selectedMedicationEditable){this.medicationDeleteConfirmOpen=!1;return}this.medicationDeleteConfirmOpen=!1,this.deleteMedication(this.selectedMedicationForm,{returnToToday:!0})},cancelMedicationDelete(){this.medicationDeleteConfirmOpen=!1},handleSubmitAttempt(){this.dailyCareBlockedByMedication&&(this.messageType="error",this.message=ee,this.showMedicationRequiredModal(),this.focusQuickMenu())},focusQuickMenu(){this.$nextTick(()=>{this.$refs.dailyCareBody?.scrollTo({top:0,behavior:"smooth"}),this.$refs.dailyCareScroll?.scrollTo({top:0,behavior:"smooth"}),this.quickMenuOpen=!0,this.quickMenuContext="calendar"})},deleteMedication(t,e={}){if(this.medicationDeleting||!t?.dailyCareMedicationIdx)return;this.medicationDeleting=!0;const n=e.returnToToday&&f(this.visibleDate).slice(0,7)===this.todayKey.slice(0,7);this.$api.chat.deletePersonaDailyCareMedication(t.dailyCareMedicationIdx,{success:()=>{this.medicationDeleting=!1,this.clearDailyCareMessage(),e.returnToToday&&this.returnToTodayDailyCare(),(!e.returnToToday||n)&&this.loadMonth()},error:()=>{this.medicationDeleting=!1,this.messageType="error",this.message="처방 약 일정 삭제에 실패했습니다."}})},selectAiStatusMonth(t){this.aiSelectedStatusMonthIndex=Number(t)},loadAllAiImages(){this.loadAiImage("sessionHairType",this.aiSessionImageFileId("hairType")),this.loadAiImage("sessionThickness",this.aiSessionImageFileId("thickness")),this.aiComparisonRecords.forEach(t=>this.loadAiRecordImages(t))},loadAiRecordImages(t){t&&(this.loadAiImage(this.aiMonthImageKey(t,"scalp"),this.aiRecordImageFileId(t,"scalp")),this.loadAiImage(this.aiMonthImageKey(t,"thickness"),this.aiRecordImageFileId(t,"thickness")))},loadAiImage(t,e){if(!e){this.invalidateAiImageRequest(t),this.revokeAiImageUrl(t),this.aiImageFileIds[t]="",this.aiImageErrors[t]=!1;return}const n=this.aiImageFileIds[t];if(this.aiImageUrls[t]&&String(n)===String(e))return;this.aiImageUrls[t]&&this.revokeAiImageUrl(t),this.aiImageFileIds[t]=String(e);const c=this.nextAiImageRequestId(t);this.aiImageErrors[t]=!1,this.$api.chat.getPersonaMedicalFile(e,{success:a=>{this.isCurrentAiImageRequest(t,c)&&(this.aiImageUrls[t]=URL.createObjectURL(a))},error:a=>{if(this.isCurrentAiImageRequest(t,c)){if(this.isAuthExpiredError(a)){this.$emit("auth-expired");return}this.aiImageErrors[t]=!0}}})},revokeAiImageUrl(t){this.aiImageUrls[t]&&URL.revokeObjectURL(this.aiImageUrls[t]),this.aiImageUrls[t]=""},nextAiImageRequestId(t){const e=Number(this.aiImageRequestSeq[t]||0)+1;return this.aiImageRequestSeq[t]=e,e},invalidateAiImageRequest(t){this.aiImageRequestSeq[t]=Number(this.aiImageRequestSeq[t]||0)+1},isCurrentAiImageRequest(t,e){return Number(this.aiImageRequestSeq[t]||0)===Number(e)},revokeAiImageUrls(){Object.keys(this.aiImageRequestSeq||{}
1).forEach(t=>this.invalidateAiImageRequest(t)),Object.keys(this.aiImageUrls||{}).forEach(t=>this.revokeAiImageUrl(t)),this.aiImageFileIds={}},aiRecordImageFileId(t,e){return e==="scalp"?t.scalpImageFileId||t.hairTypeResult?.imageFileId||t.hairTypeResult?.medicalFileId||"":t.thicknessImageFileId||t.thicknessResult?.imageFileId||t.thicknessResult?.medicalFileId||""},aiSessionImageFileId(t){return t==="hairType"?this.aiSessionDetail.hairTypeImageFileId||this.aiSessionDetail.hairTypeResult?.imageFileId||this.aiSessionDetail.hairTypeResult?.medicalFileId||"":this.aiSessionDetail.thicknessImageFileId||this.aiSessionDetail.thicknessResult?.imageFileId||this.aiSessionDetail.thicknessResult?.medicalFileId||""},aiMonthImageKey(t,e){return`daily-ai-record-${t.personaCareMonthRecordIdx||t.monthIndex}-${e}`},aiMonthLabel(t){return Fe(t)},latestAiStatusMonthIndex(){const t=this.aiComparisonRecords.map(e=>Number(e?.visitRound??e?.monthIndex)).filter(e=>Number.isFinite(e));return t.length?Math.max(...t):-1},previousAiStatusMonthIndex(t){const e=Number(t?.visitRound??t?.monthIndex??0);return e<=0?this.latestAiStatusMonthIndex():Math.max(0,e-1)}}},_s={class:"popup-wrap persona-popup-wrap",role:"dialog","aria-modal":"true"},xs={class:"pop-head persona-pop-head"},Fs={ref:"dailyCareBody",class:"persona-pop-body daily-care-pop-body"},As={class:"daily-care-step"},Es={ref:"dailyCareScroll",class:"daily-care-scroll"},Ns={class:"daily-care-calendar-stack"},Os=["aria-expanded"],Ls={key:0,class:"daily-care-quick-menu"},qs={key:0,class:"daily-care-fire","aria-hidden":"true"},Us={ref:"streakLegendArea",class:"daily-care-calendar-legend","aria-label":"캘린더 항목 색상 안내"},Bs=["aria-expanded"],Hs={key:0,class:"daily-care-streak-coach-mark",role:"dialog","aria-label":"출석 조건 안내"},Vs={key:0,class:"daily-care-loading"},Qs={class:"daily-care-detail-modal daily-care-routine-modal",role:"dialog","aria-modal":"true"},Ks={class:"daily-care-ai-detail-head daily-care-routine-detail-head"},js={class:"daily-care-routine-title-line"},zs={key:0,class:"daily-care-state"},Ys={class:"daily-care-routine-panel-body"},Gs={class:"daily-care-routines"},Ws=["value","disabled"],Js={class:"daily-care-routine-copy"},Xs={class:"daily-care-badge"},Zs={key:0,class:"daily-care-side-panels daily-care-side-panels--routine"},$s={class:"daily-care-panel daily-care-progress-panel"},ei={class:"daily-care-progress-text"},ti={class:"daily-care-panel daily-care-status-panel"},si={class:"daily-care-streak"},ii={key:0,class:"daily-care-message daily-care-message--error"},ai={key:1},ni={key:0,class:"daily-care-fire","aria-hidden":"true"},ri=["disabled"],oi={key:2,class:"daily-care-readonly-note"},li={class:"daily-care-detail-modal daily-care-ai-detail",role:"dialog","aria-modal":"true"},di={class:"daily-care-ai-detail-head"},ci={key:1,class:"daily-care-empty"},ui={key:2,class:"daily-care-message daily-care-message--error daily-care-image-error",role:"alert"},hi={class:"daily-care-detail-modal daily-care-panel daily-care-medication-view",role:"dialog","aria-modal":"true"},pi={class:"daily-care-ai-detail-head daily-care-medication-detail-head"},mi={class:"daily-care-medication-view-body"},gi={class:"daily-care-field daily-care-field--type"},yi={class:"daily-care-segment"},fi=["disabled"],ki=["disabled"],vi={class:"daily-care-field"},bi=["aria-expanded"],Ii={class:"daily-care-select-value"},Mi=["aria-selected"],Di=["onClick"],Ci=["value"],Ri={class:"daily-care-medication-date-row"},wi={class:"daily-care-field"},Pi=["readonly"],Ti={class:"daily-care-field"},Si=["readonly"],_i={key:0,class:"daily-care-medication-detail-actions"},xi=["disabled"],Fi=["disabled"],Ai={class:"daily-care-detail-modal daily-care-day-events-modal",role:"dialog","aria-modal":"true"},Ei={class:"daily-care-ai-detail-head"},Ni={class:"daily-care-day-events"},Oi={ref:"dayEventsQuickMenuArea",class:"daily-care-day-events-actions"},Li=["aria-expanded"],qi={key:0,class:"daily-care-quick-menu daily-care-day-events-quick-menu"},Ui={key:0,class:"daily-care-fire","aria-hidden":"true"},Bi={class:"daily-care-day-events-list"},Hi=["onClick"],Vi={class:"daily-care-confirm-modal daily-care-info-modal",role:"dialog","aria-modal":"true"},Qi={class:"daily-care-confirm-actions"},Ki={class:"daily-care-confirm-modal daily-care-medication-required-modal",role:"dialog","aria-modal":"true"},ji={class:"daily-care-confirm-actions"},zi={class:"daily-care-medication-modal",role:"dialog","aria-modal":"true"},Yi={class:"daily-care-medication-modal-head"},Gi={class:"daily-care-medication-form"},Wi={class:"daily-care-field daily-care-field--type"},Ji={class:"daily-care-segment"},Xi={class:"daily-care-field"},Zi=["aria-expanded"],$i={class:"daily-care-select-value"},ea=["aria-selected"],ta=["onClick"],sa={class:"daily-care-medication-date-row"},ia={class:"daily-care-field"},aa={class:"daily-care-field"},na=["disabled"],ra={key:0,class:"daily-care-medication-required-note"},oa={class:"daily-care-refill-picker-modal",role:"dialog","aria-modal":"true","aria-label":"다음 약 타는 날 선택"},la={class:"daily-care-refill-picker-head"},da={class:"daily-care-segment daily-care-refill-picker-mode",role:"radiogroup","aria-label":"다음 약 타는 날 선택 방식"},ca={key:0,class:"daily-care-refill-picker-date-field"},ua=["value"],ha={key:1,class:"daily-care-medication-duration daily-care-medication-duration--picker","aria-label":"다음 약 타는 날 자동 계산"},pa=["onClick"],ma={class:"daily-care-confirm-modal",role:"dialog","aria-modal":"true"},ga={class:"daily-care-confirm-actions"},ya={class:"daily-care-confirm-modal daily-care-validation-modal",role:"dialog","aria-modal":"true"},fa={class:"daily-care-confirm-actions"};function ka(t,e,n,c,a,s){const l=ie,p=ae;return o(),d("div",_s,[i("div",{class:"popup persona-shell daily-care-shell",style:O(a.shellStyle)},[i("div",xs,[e[69]||(e[69]=i("span",{class:"title"},[i("i",{class:"mdi mdi-heart-pulse title-icon","aria-hidden":"true"}),P("데일리 케어")],-1)),i("button",{type:"button",class:"popup-close persona-close",title:"닫기",onClick:e[0]||(e[0]=r=>t.$emit("close"))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",Fs,[i("section",As,[i("div",Es,[i("div",Ns,[M(l,{records:s.calendarRecords,"visible-date":a.visibleDate,"selected-record-id":a.selectedCalendarRecordId,"expanded-records":"","show-attendance-streak":"","swipe-navigation":"",onSelectRecord:s.selectCalendarEntry,onChangeVisibleDate:s.changeVisibleDate},null,8,["records","visible-date","selected-record-id","onSelectRecord","onChangeVisibleDate"]),i("div",{ref:"quickMenuArea",class:y(["daily-care-calendar-actions",{"daily-care-calendar-actions--near-top":s.calendarQu
1ickMenuNearTop}]),style:O(s.calendarQuickMenuStyle)},[i("button",{type:"button",class:y(["daily-care-plus-button",{active:a.quickMenuOpen&&a.quickMenuContext==="calendar"}]),title:"데일리 케어 메뉴","aria-label":"데일리 케어 메뉴","aria-expanded":a.quickMenuOpen&&a.quickMenuContext==="calendar"?"true":"false",onPointerdown:e[1]||(e[1]=(...r)=>s.startCalendarQuickMenuDrag&&s.startCalendarQuickMenuDrag(...r)),onPointermove:e[2]||(e[2]=(...r)=>s.moveCalendarQuickMenuDrag&&s.moveCalendarQuickMenuDrag(...r)),onPointerup:e[3]||(e[3]=(...r)=>s.finishCalendarQuickMenuDrag&&s.finishCalendarQuickMenuDrag(...r)),onPointercancel:e[4]||(e[4]=(...r)=>s.finishCalendarQuickMenuDrag&&s.finishCalendarQuickMenuDrag(...r)),onClick:e[5]||(e[5]=r=>s.toggleQuickMenu("calendar"))},[M(T,{icon:"mdi:mdi-plus"})],42,Os),a.quickMenuOpen&&a.quickMenuContext==="calendar"?(o(),d("div",Ls,[i("button",{type:"button",class:y(["daily-care-quick-action daily-care-quick-action--medication",{"daily-care-quick-action--blocked":s.dailyCareBlockedByMedication,"daily-care-quick-action--highlight":s.dailyCareBlockedByMedication}]),onClick:e[6]||(e[6]=(...r)=>s.openMedicationFromQuickMenu&&s.openMedicationFromQuickMenu(...r))},[e[70]||(e[70]=i("span",null,"처방 약 일정 관리",-1)),i("strong",null,h(s.dailyCareBlockedByMedication?"등록 필요":"일정 추가"),1)],2),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[7]||(e[7]=(...r)=>s.openTodayDailyCare&&s.openTodayDailyCare(...r))},[e[71]||(e[71]=i("span",null,"오늘 데일리 케어",-1)),i("strong",null,h(s.todayRecord?"완료됨":"진행하기"),1)]),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[8]||(e[8]=(...r)=>s.openCareDaysInfo&&s.openCareDaysInfo(...r))},[e[72]||(e[72]=i("span",null,"총 케어 일수",-1)),i("strong",null,h(s.medicationPeriodCareDays)+"일",1)]),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[9]||(e[9]=(...r)=>s.openStreakInfo&&s.openStreakInfo(...r))},[e[73]||(e[73]=i("span",null,"연속 출석일",-1)),i("strong",null,[s.streakDays>0?(o(),d("span",qs,"🔥")):u("",!0),P(" "+h(s.streakDays)+"일",1)])])])):u("",!0)],6)]),i("div",Us,[e[79]||(e[79]=G('<span class="daily-care-legend-chip daily-care-legend-chip--daily-care" data-v-99440a26><i class="daily-care-legend-dot" data-v-99440a26></i>데일리 케어</span><span class="daily-care-legend-chip daily-care-legend-chip--medication-prescribed" data-v-99440a26><i class="daily-care-legend-dot" data-v-99440a26></i>약 수령 일</span><span class="daily-care-legend-chip daily-care-legend-chip--medication-refill" data-v-99440a26><i class="daily-care-legend-dot" data-v-99440a26></i>다음 약 타는 날</span><span class="daily-care-legend-chip daily-care-legend-chip--ai-care-record" data-v-99440a26><i class="daily-care-legend-dot" data-v-99440a26></i>AI 의사 진료</span>',4)),i("button",{type:"button",class:y(["daily-care-legend-chip daily-care-legend-chip--streak",{active:a.streakCoachMarkOpen,"daily-care-legend-chip--pulse":!s.todayRecord&&!a.streakCoachMarkOpen}]),"aria-haspopup":"dialog","aria-expanded":a.streakCoachMarkOpen?"true":"false",onClick:e[10]||(e[10]=(...r)=>s.toggleStreakCoachMark&&s.toggleStreakCoachMark(...r))},e[74]||(e[74]=[i("i",{class:"daily-care-legend-streak"},null,-1),P("출석")]),10,Bs),a.streakCoachMarkOpen?(o(),d("div",Hs,[e[75]||(e[75]=i("strong",null,"출석은 이렇게 인정돼요",-1)),e[76]||(e[76]=i("p",null,"캘린더의 '+' 버튼을 누르고 '오늘 데일리 케어'를 선택한 뒤, 오늘의 맞춤 케어 루틴을 체크하고 '케어 제출하기'까지 완료하면 그날 출석으로 기록됩니다.",-1)),e[77]||(e[77]=i("p",null,"출석한 날은 캘린더에 초록색으로 표시되고, 매일 이어가면 연속 출석일(🔥)이 쌓여요.",-1)),i("button",{type:"button",class:"daily-care-streak-coach-confirm",onClick:e[11]||(e[11]=(...r)=>s.closeStreakCoachMark&&s.closeStreakCoachMark(...r))},"확인"),e[78]||(e[78]=i("i",{class:"daily-care-streak-coach-arrow","aria-hidden":"true"}
1,null,-1))])):u("",!0)],512)],512),a.loading?(o(),d("div",Vs,"불러오는 중...")):u("",!0)])],512),a.routineModalOpen?(o(),d("div",{key:0,class:"daily-care-detail-modal-backdrop daily-care-routine-modal-backdrop",onClick:e[16]||(e[16]=D((...r)=>s.closeDetailModal&&s.closeDetailModal(...r),["self"]))},[i("section",Qs,[i("div",Ks,[i("div",null,[i("div",js,[e[80]||(e[80]=i("h2",null,"오늘의 맞춤 케어 루틴",-1)),s.selectedRecord?(o(),d("span",zs,"출석 완료")):u("",!0)]),i("p",null,h(s.selectedDateLabel)+" 기준",1)]),i("button",{type:"button",class:"persona-close daily-care-detail-close",title:"닫기",onClick:e[12]||(e[12]=(...r)=>s.closeDetailModal&&s.closeDetailModal(...r))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",Ys,[i("div",{class:y(["daily-care-routine-content",{"daily-care-routine-content--summary":s.isTodaySelectedDate}])},[i("div",Gs,[(o(!0),d(C,null,S(s.routineItems,r=>(o(),d("label",{key:r.key,class:y(["daily-care-routine",{"daily-care-routine--checked":a.checkedItemKeys.includes(r.key),"daily-care-routine--readonly":s.isPastSelectedDate}])},[q(i("input",{"onUpdate:modelValue":e[13]||(e[13]=g=>a.checkedItemKeys=g),type:"checkbox",value:r.key,disabled:s.isPastSelectedDate},null,8,Ws),[[At,a.checkedItemKeys]]),e[81]||(e[81]=i("span",{class:"daily-care-check"},null,-1)),i("span",Js,[i("span",Xs,h(r.badge),1),i("strong",null,h(r.title),1),i("span",null,h(r.description),1)])],2))),128))]),s.isTodaySelectedDate?(o(),d("div",Zs,[i("section",$s,[e[83]||(e[83]=i("h2",null,"오늘의 데일리 케어 진행률",-1)),i("div",{class:"daily-care-progress-ring",style:O(s.progressStyle)},[e[82]||(e[82]=i("svg",{viewBox:"0 0 200 200","aria-hidden":"true"},[i("circle",{class:"daily-care-progress-bg",cx:"100",cy:"100",r:"74"}),i("circle",{class:"daily-care-progress-value",cx:"100",cy:"100",r:"74"})],-1)),i("div",ei,[i("strong",null,h(s.progress.percent)+"%",1),i("span",null,h(s.progress.label),1)])],4)]),i("section",ti,[e[84]||(e[84]=i("h2",null,"출석 현황",-1)),i("div",si,[s.streakStatus.showFire?(o(),d("strong",ai,[s.streakStatus.showFire?(o(),d("span",ni,"🔥")):u("",!0),P(" "+h(s.streakStatus.label),1)])):(o(),d("p",ii,h(s.streakStatus.label),1))])])])):u("",!0)],2),i("div",{class:y(["daily-care-action-row",{"daily-care-action-row--full":s.isDefaultActionState}])},[s.actionMessage?(o(),d("p",{key:0,class:y(["daily-care-message",{"daily-care-message--error":s.actionMessageIsError}])},h(s.actionMessage),3)):u("",!0),s.isPastSelectedDate?(o(),d("p",oi,"지난 날짜의 데일리 케어는 수정할 수 없습니다.")):(o(),d("span",{key:1,class:"daily-care-submit-control",onClick:e[15]||(e[15]=(...r)=>s.handleSubmitAttempt&&s.handleSubmitAttempt(...r))},[i("button",{type:"button",class:"daily-care-submit",disabled:a.saving||s.isSubmitDisabled,onClick:e[14]||(e[14]=D((...r)=>s.saveDailyCare&&s.saveDailyCare(...r),["stop"]))},h(a.saving?"저장 중...":"케어 제출하기"),9,ri)]))],2)])])])):u("",!0),a.aiRecordViewMode==="detail"?(o(),d("div",{key:1,class:"daily-care-detail-modal-backdrop daily-care-ai-detail-modal",onClick:e[19]||(e[19]=D((...r)=>s.closeDetailModal&&s.closeDetailModal(...r),["self"]))},[i("section",li,[i("div",di,[i("div",null,[i("h2",null,h(s.aiSelectedRecord?.visitLabel||"AI 진료")+" 기록",1),i("p",null,h(s.aiSelectedRecord?.recordDate||a.selectedDate),1)]),i("button",{type:"button",class:"persona-close daily-care-detail-close",title:"닫기",onClick:e[17]||(e[17]=(...r)=>s.closeDetailModal&&s.closeDetailModal(...r))},[M(T,{icon:"mdi:mdi-close"})])]),s.aiSelectedRecord?(o(),m(p,{key:0,"session-detail":a.aiSessionDetail,"selected-record":s.aiSelectedRecord,"month-index":s.aiSelectedRecord.visitRound||0,"session-image-urls":s.aiSessionImageUrls,"status-image-options":s.aiStatusImageOptions,"selected-status-month-index":a.aiSelectedStatusMonthIndex,"active-tab-key":a.aiActiveRecordTab,onSelectStatusMonth:s.selectAiStatusMonth,onActiveTabChange:e[18]||(e[18]=r=>a.aiActiveRecordTab=r)},null,8,["session-detail","selected-record","month-index","session-image-urls","status-image-options","selected-status-month-index","active-tab-key","onSelectStatusMonth"])):(o(),d("div",ci,"AI 진료 기록을 불러오는 중입니다.")),s.aiImageErrorMessage?(o(),d("p",ui,h(s.aiImageErrorMessage),1)):u("",!0)])])):u("",!0),s.selectedMedicationView?(o(),d("div",{key:2,class:"daily-care-detail-modal-backdrop daily-care-medication-detail-modal",onClick:e[32]||(e[32]=D((...r)=>s.closeDetailModal&&s.closeDetailModal(...r),["self"]))},[i("section",hi,[i("div",pi,[i("div",null,[i("h2",null,h(s.selectedMedicationView.eventLabel)+" 상세",1),i("p",null,h(s.selectedMedicationView.sourceLabel),1)]),i("button",{type:"button",class:"persona-close daily-care-detail-close",title:"닫기",onClick:e[20]||(e[20]=(...r)=>s.closeDetailModal&&s.closeDetailModal(...r))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",mi,[i("div",{class:y(["daily-care-medication-form daily-care-medication-form--detail",{"daily-care-medication-form--readonly":!s.selectedMedicationEditable}])},[i("div",gi,[e[85]||(e[85]=i("span",null,"약 종류",-1)),i("div",yi,[i("button",{type:"button",class:y({active:a.selectedMedicationForm.medicationType==="ORAL"}),disabled:!s.selectedMedicationEditable,onClick:e[21]||(e[21]=r=>s.selectSelectedMedicationType("ORAL"))}," 먹는 약 ",10,fi),i("button",{type:"button",class:y({active:a.selectedMedicationForm.medicationType==="TOPICAL"}),disabled:!s.selectedMedicationEditable,onClick:e[22]||(e[22]=r=>s.selectSelectedMedicationType("TOPICAL"))}," 바르는 약 ",10,ki)])]),i("div",vi,[e[86]||(e[86]=i("span",{id:"selected-medication-name-label"},"처방약",-1)),s.selectedMedicationEditable?(o(),d("div",{key:0,ref:"selectedMedicationNameDropdown",class:y(["daily-care-select",{active:s.isMedicationNameDropdownOpen("selected")}])},[i("button",{type:"button",class:"daily-care-select-trigger","aria-haspopup":"listbox","aria-expanded":s.isMedicationNameDropdownOpen("selected"),"aria-labelledby":"selected-medication-name-label",onClick:e[23]||(e[23]=r=>s.toggleMedicationNameDropdown("selected")),onKeydown:e[24]||(e[24]=j(D((...r)=>s.closeMedicationNameDropdown&&s.closeMedicationNameDropdown(...r),["stop","prevent"]),["escape"]))},[i("em",Ii,h(s.medicationDisplayName(a.selectedMedicationForm.medicationName)||"약 선택"),1),M(T,{icon:"mdi:mdi-chevron-down"})],40,bi),s.isMedicationNameDropdownOpen("selected")?(o(),d("ul",{key:0,ref:"selectedMedicationNameDropdownList",class:"daily-care-select-list",style:O(a.medicationNameDropdownStyle),role:"listbox","aria-label":"처방약 선택"},[(o(!0),d(C,null,S(s.selectedMedicationNameOptions,r=>(o(),d("li",{key:r,role:"option","aria-selected":a.selectedMedicationForm.medicationName===r},[i("button",{type:"button",class:y(["daily-care-select-option",{active:a.selectedMedicationForm.medicationName===r}]),onClick:g=>s.selectMedicationName("selected",r)},[P(h(s.medicationDisplayName(r))+" ",1),a.selectedMedicationForm.medicationName===r?(o(),m(T,{key:0,icon:"mdi:mdi-check"})):u("",!0)],10,Di)],8,Mi))),128))],4)):u("",!0)],2)):(o(),d("input",{key:1,value:s.medicationDisplayName(a.selectedMedicationForm.medicationName),type:"text",placeholder:"약 이름 입력",readonly:""},null,8,Ci))]),i("div",Ri,[i("label",wi,[e[87]||(e[87]=i("span",null,"약 수령 일",
1-1)),q(i("input",{"onUpdate:modelValue":e[25]||(e[25]=r=>a.selectedMedicationForm.prescribedDate=r),type:"date",readonly:!s.selectedMedicationEditable,onChange:e[26]||(e[26]=(...r)=>s.syncSelectedMedicationDurationRefill&&s.syncSelectedMedicationDurationRefill(...r))},null,40,Pi),[[V,a.selectedMedicationForm.prescribedDate]])]),i("label",Ti,[e[88]||(e[88]=i("span",null,"다음 약 타는 날",-1)),q(i("input",{"onUpdate:modelValue":e[27]||(e[27]=r=>a.selectedMedicationForm.refillDate=r),type:"date",readonly:!s.selectedMedicationEditable,onInput:e[28]||(e[28]=(...r)=>s.clearSelectedMedicationDuration&&s.clearSelectedMedicationDuration(...r)),onClick:e[29]||(e[29]=D(r=>s.openMedicationRefillPicker("selected"),["prevent"]))},null,40,Si),[[V,a.selectedMedicationForm.refillDate]])])])],2),s.selectedMedicationEditable?(o(),d("div",_i,[i("button",{type:"button",class:"daily-care-medication-save",disabled:a.selectedMedicationSaving,onClick:e[30]||(e[30]=(...r)=>s.saveSelectedMedication&&s.saveSelectedMedication(...r))},"저장",8,xi),i("button",{type:"button",class:"daily-care-medication-delete",disabled:a.medicationDeleting,onClick:e[31]||(e[31]=(...r)=>s.deleteSelectedMedication&&s.deleteSelectedMedication(...r))},"삭제",8,Fi)])):u("",!0),a.message?(o(),d("p",{key:1,class:y(["daily-care-message daily-care-medication-detail-message",{"daily-care-message--error":s.actionMessageIsError}])},h(a.message),3)):u("",!0)])])])):u("",!0),a.dayEventsModalOpen?(o(),d("div",{key:3,class:"daily-care-detail-modal-backdrop daily-care-day-events-modal-backdrop",onClick:e[39]||(e[39]=D((...r)=>s.closeDayEventsModal&&s.closeDayEventsModal(...r),["self"]))},[i("section",Ai,[i("div",Ei,[i("div",null,[i("h2",null,h(s.dayEventsDateLabel)+" 일정",1),e[89]||(e[89]=i("p",null,"캘린더 항목을 선택해 상세를 확인하세요.",-1))]),i("button",{type:"button",class:"persona-close daily-care-detail-close",title:"닫기",onClick:e[33]||(e[33]=(...r)=>s.closeDayEventsModal&&s.closeDayEventsModal(...r))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",Ni,[i("div",Oi,[i("button",{type:"button",class:y(["daily-care-plus-button daily-care-day-events-plus-button",{active:a.quickMenuOpen&&a.quickMenuContext==="dayEvents"}]),title:"데일리 케어 메뉴","aria-label":"데일리 케어 메뉴","aria-expanded":a.quickMenuOpen&&a.quickMenuContext==="dayEvents"?"true":"false",onClick:e[34]||(e[34]=r=>s.toggleQuickMenu("dayEvents"))},[M(T,{icon:"mdi:mdi-plus"})],10,Li),a.quickMenuOpen&&a.quickMenuContext==="dayEvents"?(o(),d("div",qi,[i("button",{type:"button",class:y(["daily-care-quick-action daily-care-quick-action--medication",{"daily-care-quick-action--blocked":s.dailyCareBlockedByMedication,"daily-care-quick-action--highlight":s.dailyCareBlockedByMedication}]),onClick:e[35]||(e[35]=(...r)=>s.openMedicationFromQuickMenu&&s.openMedicationFromQuickMenu(...r))},[e[90]||(e[90]=i("span",null,"처방 약 일정 관리",-1)),i("strong",null,h(s.dailyCareBlockedByMedication?"등록 필요":"일정 추가"),1)],2),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[36]||(e[36]=(...r)=>s.openTodayDailyCare&&s.openTodayDailyCare(...r))},[e[91]||(e[91]=i("span",null,"오늘 데일리 케어",-1)),i("strong",null,h(s.todayRecord?"완료됨":"진행하기"),1)]),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[37]||(e[37]=(...r)=>s.openCareDaysInfo&&s.openCareDaysInfo(...r))},[e[92]||(e[92]=i("span",null,"총 케어 일수",-1)),i("strong",null,h(s.medicationPeriodCareDays)+"일",1)]),i("button",{type:"button",class:"daily-care-quick-action",onClick:e[38]||(e[38]=(...r)=>s.openStreakInfo&&s.openStreakInfo(...r))},[e[93]||(e[93]=i("span",null,"연속 출석일",-1)),i("strong",null,[s.streakDays>0?(o(),d("span",Ui,"🔥")):u("",!0),P(" "+h(s.streakDays)+"일",1)])])])):u("",!0)],512),i("div",Bi,[(o(!0),d(C,null,S(s.selectedDayEventRecords,r=>(o(),d("button",{key:r.calendarRecordId,type:"button",class:y(["daily-care-day-event",s.dayEventBadgeClass(r)]),onClick:g=>s.openDayEventDetail(r)},[i("span",null,h(s.dayEventLabel(r)),1),i("strong",null,h(s.dayEventTitle(r)),1)],10,Hi))),128))])])])])):u("",!0),a.infoModalOpen?(o(),d("div",{key:4,class:"daily-care-info-modal-backdrop",onClick:e[41]||(e[41]=D((...r)=>s.closeInfoModal&&s.closeInfoModal(...r),["self"]))},[i("section",Vi,[i("p",null,h(a.infoModalMessage),1),i("div",Qi,[i("button",{type:"button",class:"daily-care-confirm-no",onClick:e[40]||(e[40]=(...r)=>s.closeInfoModal&&s.closeInfoModal(...r))},"확인")])])])):u("",!0),a.medicationRequiredModalOpen?(o(),d("div",{key:5,class:"daily-care-medication-required-modal-backdrop",onClick:e[44]||(e[44]=D((...r)=>s.closeMedicationRequiredModal&&s.closeMedicationRequiredModal(...r),["self"]))},[i("section",Ki,[e[94]||(e[94]=i("p",null,"약 등록을 먼저 해주세요.",-1)),e[95]||(e[95]=i("span",null,"처방 약 일정 관리에서 약 수령 일과 다음 약 타는 날을 등록하면 데일리 케어를 진행할 수 있습니다.",-1)),i("div",ji,[i("button",{type:"button",class:"daily-care-confirm-yes",onClick:e[42]||(e[42]=(...r)=>s.openMedicationFromRequiredModal&&s.openMedicationFromRequiredModal(...r))},"약 일정 등록"),i("button",{type:"button",class:"daily-care-confirm-no",onClick:e[43]||(e[43]=(...r)=>s.closeMedicationRequiredModal&&s.closeMedicationRequiredModal(...r))},"확인")])])])):u("",!0),a.medicationModalOpen?(o(),d("div",{key:6,class:"daily-care-medication-modal-backdrop",onClick:e[56]||(e[56]=D((...r)=>s.closeMedicationModal&&s.closeMedicationModal(...r),["self"]))},[i("section",zi,[i("div",Yi,[e[96]||(e[96]=i("div",null,[i("h2",null,"처방 약 일정 관리"),i("p",null,"약 수령 일과 다음 약 타는 날이 캘린더에 함께 표시됩니다.")],-1)),i("button",{type:"button",class:"persona-close daily-care-medication-close",title:"닫기",onClick:e[45]||
1(e[45]=(...r)=>s.closeMedicationModal&&s.closeMedicationModal(...r))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",Gi,[i("div",Wi,[e[97]||(e[97]=i("span",null,"약 종류",-1)),i("div",Ji,[i("button",{type:"button",class:y({active:a.medicationForm.medicationType==="ORAL"}),onClick:e[46]||(e[46]=r=>s.selectMedicationType("ORAL"))}," 먹는 약 ",2),i("button",{type:"button",class:y({active:a.medicationForm.medicationType==="TOPICAL"}),onClick:e[47]||(e[47]=r=>s.selectMedicationType("TOPICAL"))}," 바르는 약 ",2)])]),i("div",Xi,[e[98]||(e[98]=i("span",{id:"medication-name-label"},"처방약",-1)),i("div",{ref:"medicationNameDropdown",class:y(["daily-care-select",{active:s.isMedicationNameDropdownOpen("new")}])},[i("button",{type:"button",class:"daily-care-select-trigger","aria-haspopup":"listbox","aria-expanded":s.isMedicationNameDropdownOpen("new"),"aria-labelledby":"medication-name-label",onClick:e[48]||(e[48]=r=>s.toggleMedicationNameDropdown("new")),onKeydown:e[49]||(e[49]=j(D((...r)=>s.closeMedicationNameDropdown&&s.closeMedicationNameDropdown(...r),["stop","prevent"]),["escape"]))},[i("em",$i,h(s.medicationDisplayName(a.medicationForm.medicationName)||"약 선택"),1),M(T,{icon:"mdi:mdi-chevron-down"})],40,Zi),s.isMedicationNameDropdownOpen("new")?(o(),d("ul",{key:0,ref:"medicationNameDropdownList",class:"daily-care-select-list",style:O(a.medicationNameDropdownStyle),role:"listbox","aria-label":"처방약 선택"},[(o(!0),d(C,null,S(s.medicationNameOptions,r=>(o(),d("li",{key:r,role:"option","aria-selected":a.medicationForm.medicationName===r},[i("button",{type:"button",class:y(["daily-care-select-option",{active:a.medicationForm.medicationName===r}]),onClick:g=>s.selectMedicationName("new",r)},[P(h(s.medicationDisplayName(r))+" ",1),a.medicationForm.medicationName===r?(o(),m(T,{key:0,icon:"mdi:mdi-check"})):u("",!0)],10,ta)],8,ea))),128))],4)):u("",!0)],2)]),i("div",sa,[i("label",ia,[e[99]||(e[99]=i("span",null,"약 수령 일",-1)),q(i("input",{"onUpdate:modelValue":e[50]||(e[50]=r=>
1a.medicationForm.prescribedDate=r),type:"date",onChange:e[51]||(e[51]=(...r)=>s.syncMedicationDurationRefill&&s.syncMedicationDurationRefill(...r))},null,544),[[V,a.medicationForm.prescribedDate]])]),i("label",aa,[e[100]||(e[100]=i("span",null,"다음 약 타는 날",-1)),q(i("input",{"onUpdate:modelValue":e[52]||(e[52]=r=>a.medicationForm.refillDate=r),type:"date",onInput:e[53]||(e[53]=(...r)=>s.clearMedicationDuration&&s.clearMedicationDuration(...r)),onClick:e[54]||(e[54]=D(r=>s.openMedicationRefillPicker("new"),["prevent"]))},null,544),[[V,a.medicationForm.refillDate]])])]),i("button",{type:"button",class:"daily-care-medication-save",disabled:a.medicationSaving,onClick:e[55]||(e[55]=(...r)=>s.saveMedication&&s.saveMedication(...r))},"일정 추가",8,na)]),s.showMedicationFormRequiredNote?(o(),d("p",ra,"처방 약 일정 관리를 진행해야 데일리 케어 진행이 가능합니다.")):u("",!0)])])):u("",!0),a.medicationRefillPickerOpen?(o(),d("div",{key:7,class:"daily-care-refill-picker-modal-backdrop",onClick:e[63]||(e[63]=D((...r)=>s.closeMedicationRefillPicker&&s.closeMedicationRefillPicker(...r),["self"]))},[i("section",oa,[i("div",la,[e[101]||(e[101]=i("div",null,[i("h3",null,"다음 약 타는 날")],-1)),i("button",{type:"button",class:"persona-close daily-care-refill-picker-close",title:"닫기",onClick:e[57]||(e[57]=(...r)=>s.closeMedicationRefillPicker&&s.closeMedicationRefillPicker(...r))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",da,[i("label",{class:y({active:a.medicationRefillPickerMode==="duration"})},[q(i("input",{type:"radio",value:"duration","onUpdate:modelValue":e[58]||(e[58]=r=>a.medicationRefillPickerMode=r)},null,512),[[be,a.medicationRefillPickerMode]]),e[102]||(e[102]=i("span",null,"자동 계산",-1))],2),i("label",{class:y({active:a.medicationRefillPickerMode==="manual"})},[q(i("input",{type:"radio",value:"manual","onUpdate:modelValue":e[59]||(e[59]=r=>a.medicationRefillPickerMode=r),onChange:e[60]||(e[60]=r=>s.openMedicationRefillDatePicker("medicationRefillPickerDateInput"))},null,544),[[be,a.medicationRefillPickerMode]]),e[103]||(e[103]=i("span",null,"날짜 직접 선택",-1))],2)]),a.medicationRefillPickerMode==="manual"?(o(),d("div",ca,[i("input",{ref:"medicationRefillPickerDateInput",value:s.medicationRefillPickerDate,type:"date","aria-label":"다음 약 타는 날 날짜 직접 선택",onInput:e[61]||(e[61]=(...r)=>s.updateMedicationRefillPickerDate&&s.updateMedicationRefillPickerDate(...r))},null,40,ua)])):u("",!0),a.medicationRefillPickerMode==="duration"?(o(),d("div",ha,[e[104]||(e[104]=i("span",null,"약 수령 일 기준 자동 계산",-1)),(o(!0),d(C,null,S(s.medicationDurationOptions,r=>(o(),d("button",{key:`picker-${r}`,type:"button",class:y({active:s.medicationRefillPickerDurationDays===r}),onClick:g=>s.applyMedicationRefillPickerDuration(r)},h(r)+"일 ",11,pa))),128))])):u("",!0),i("button",{type:"button",class:"daily-care-refill-picker-confirm",onClick:e[62]||(e[62]=(...r)=>s.closeMedicationRefillPicker&&s.closeMedicationRefillPicker(...r))},"확인")])])):u("",!0),a.medicationDeleteConfirmOpen?(o(),d("div",{key:8,class:"daily-care-confirm-modal-backdrop",onClick:e[66]||(e[66]=D((...r)=>s.cancelMedicationDelete&&s.cancelMedicationDelete(...r),["self"]))},[i("section",ma,[e[105]||(e[105]=i("p",null,"정말 삭제하시겠습니까?",-1)),i("div",ga,[i("button",{type:"button",class:"daily-care-confirm-yes",onClick:e[64]||(e[64]=(...r)=>s.confirmMedicationDelete&&s.confirmMedicationDelete(...r))},"예"),i("button",{type:"button",class:"daily-care-confirm-no",onClick:e[65]||(e[65]=(...r)=>s.cancelMedicationDelete&&s.cancelMedicationDelete(...r))},"아니오")])])])):u("",!0),a.medicationValidationModalOpen?(o(),d("div",{key:9,class:"daily-care-validation-modal-backdrop",onClick:e[68]||(e[68]=D((...r)=>s.closeMedicationValidationModal&&s.closeMedicationValidationModal(...r),["self"]))},[i("section",ya,[i("p",null,h(a.medicationValidationMessage),1),i("div",fa,[i("button",{type:"button",class:"daily-care-confirm-no",onClick:e[67]||(e[67]=(...r)=>s.closeMedicationValidationModal&&s.closeMedicationValidationModal(...r))},"확인")])])])):u("",!0)],4)])}const Ue=x(Ss,[["render",ka],["__scopeId","data-v-99440a26"]]),va={name:"PersonaResult",components:{PersonaHairGaugeSlim:_e,PersonaHairDensityStat:ne},props:{doctor:{type:Object,required:!0},hairTypeResult:{type:Object,required:!0},thicknessResult:{type:Object,default:()=>({})},questionnaireAnswers:{type:Object,default:()=>({})},finalDiagnosis:{type:Object,default:()=>({})},treatmentPlans:{type:Array,default:()=>[]},isRepeatVisit:{type:Boolean,default:!1}},emits:["back","saved"],data(){return{saving:!1,error:""}},computed:{safeThicknessResult(){return this.thicknessResult&&typeof this.thicknessResult=="object"?this.thicknessResult:{}},treatmentPlan(){return this.finalDiagnosis?.treatmentPlanSnapshot||null},treatmentItems(){const t=yt(this.treatmentPlan);return t.length?t:["전문의 상담 후 약물 치료 여부 결정","진료일별 사진 기록 유지","두피 자극을 줄이는 생활 습관 관리"]},treatmentPlanText(){return gt(this.treatmentPlan,this.treatmentItems)},diagnosis(){const t=this.finalDiagnosis?.doctorFeedback||`${this.doctor.diagStyle||"근거 중심으로 차분하게"} 분석한 ê²°ê³¼, ${this.hairTypeResult.primaryType} 가능성이 가장 높습니다. 진료 기록을 남기면 치료 반응을 계속 비교할 수 있습니다.`,e=this.finalDiagnosis?.doctorFeedbackSources||this.finalDiagnosis?.doctor_feedback_sources||"";return{primaryType:this.finalDiagnosis?.primaryType||this.hairTypeResult.primaryType||"탈모 유형 분석 완료",thicknessUm:this.finalDiagnosis?.thicknessUm??this.safeThicknessResult.thicknessUm??null,doctorFeedback:mt(t),doctorFeedbackSources:e,tags:Array.isArray(this.finalDiagnosis?.tags)?this.finalDiagnosis.tags:[]}},doctorFeedbackParts(){return pt(this.diagnosis.doctorFeedback,this.diagnosis.doctorFeedbackSources)},hasThicknessResult(){return!!(this.safeThicknessResult.stepId||this.safeThicknessResult.thicknessUm||this.finalDiagnosis?.thicknessUm)},thicknessSummaryText(){const t=this.diagnosis.thicknessUm??this.safeThicknessResult.thicknessUm;return t?`${t}㎛`:"-"},thicknessGaugeValue(){const t=Number(this.diagnosis.thicknessUm??this.safeThicknessResult.thicknessUm??0);return Number.isFinite(t)&&t>0?t:null},isAndrogeneticDiagnosis(){return this.diagnosis.primaryType==="안드로겐성 탈모"},shouldShowThicknessGauge(){return this.isAndrogeneticDiagnosis&&!!this.thicknessGaugeValue},densityAnalysis(){return ht(this.hairTypeResult?.densityAnalysis||this.finalDiagnosis?.densityAnalysis)},densityValue(){return ut(this.densityAnalysis)},shouldShowDensityStat(){return this.densityValue!==null},defaultDiagnosisTags(){return this.hasThicknessResult?["유형 분석","모발 굵기","문진 반영"]:["ì
1œ í˜• 분석","문진 반영"]},diagnosisTags(){return this.diagnosis.tags.length?this.diagnosis.tags:this.defaultDiagnosisTags},saveButtonLabel(){return ct(this.isRepeatVisit,this.saving)}},methods:{saveSession(){this.saving=!0,this.error="";const t=this.safeThicknessResult,e={personaAiDoctorIdx:this.doctor.personaAiDoctorIdx,hairTypeDiagnosisStepIdx:this.hairTypeResult.stepId,thicknessDiagnosisStepIdx:t.stepId||null,personaDiagnosisStepIdxList:[this.hairTypeResult.stepId,t.stepId].filter(Boolean),questionnaire:this.questionnaireAnswers,hairTypeResult:this.hairTypeResult,thicknessResult:this.hasThicknessResult?t:null,finalDiagnosis:this.diagnosis,treatmentPlanSnapshot:this.treatmentPlan||{planItems:this.treatmentItems}};this.$api.chat.savePersonaSession(e,{success:n=>{this.saving=!1,this.$emit("saved",n)},error:()=>{this.saving=!1,this.error=dt(this.isRepeatVisit)}})}}},ba={class:"persona-step"},Ia={class:"persona-step-head"},Ma={class:"persona-step-scroll"},Da={class:"persona-result-main"},Ca={key:0},Ra={class:"persona-card"},wa={class:"persona-doctor-feedback"},Pa={key:0,class:"persona-doctor-feedback-body"},Ta={key:1,class:"persona-doctor-feedback-source"},Sa={class:"persona-doctor-feedback-source-label"},_a={class:"persona-doctor-feedback-sources"},xa=["href"],Fa={class:"persona-card"},Aa={class:"persona-treatment-plan-text"},Ea={key:2,class:"persona-error",role:"alert"},Na={class:"persona-step-action"},Oa=["disabled"];function La(t,e,n,c,a,s){const l=_e,p=ne;return o(),d("section",ba,[i("div",Ia,[i("button",{type:"button",onClick:e[0]||(e[0]=r=>t.$emit("back"))},"‹"),e[2]||(e[2]=i("div",null,[i("h2",null,"AI 종합 진단"),i("p",null,"유형 구분 중심으로 결과를 저장합니다.")],-1))]),i("div",Ma,[i("div",Da,[e[3]||(e[3]=i("span",null,"AI 종합 진단",-1)),i("h3",null,h(s.diagnosis.primaryType||"탈모 유형 분석 완료"),1),s.hasThicknessResult?(o(),d("p",Ca,"모발 굵기 "+h(s.thicknessSummaryText),1)):u("",!0),i("div",null,[(o(!0),d(C,null,S(s.diagnosisTags,r=>(o(),d("em",{key:r},h(r),1))),128))])]),s.shouldShowThicknessGauge?(o(),m(l,{key:0,"thickness-um":s.thicknessGaugeValue,class:"persona-result-hair-gauge"},null,8,["thickness-um"])):u("",!0),s.shouldShowDensityStat?(o(),m(p,{key:1,"density-analysis":s.densityAnalysis,class:"persona-result-hair-density"},null,8,["density-analysis"])):u("",!0),i("div",Ra,[i("h4",null,"AI "+h(n.doctor.name)+" 의사 소견",1),i("div",wa,[s.doctorFeedbackParts.body?(o(),d("p",Pa,h(s.doctorFeedbackParts.body),1)):u("",!0),s.doctorFeedbackParts.sourceText?(o(),d("div",Ta,[i("span",Sa,h(s.doctorFeedbackParts.sourceLabel),1),i("div",_a,[(o(!0),d(C,null,S(s.doctorFeedbackParts.sourceLines,(r,g)=>(o(),d("p",{key:g,class:y({"persona-doctor-feedback-source-line--nested":r.nested})},[(o(!0),d(C,null,S(r.segments,(k,_)=>(o(),d("span",{key:_},[k.href?(o(),d("a",{key:0,href:k.href,target:"_blank",rel:"noopener noreferrer"},h(k.text),9,xa)):(o(),d(C,{key:1},[P(h(k.text),1)],64))]))),128))],2))),128))])])):u("",!0),e[4]||(e[4]=i("div",{class:"persona-doctor-feedback-notice"},[i("p",null,[P("탈모에 대한 정확한 진단과 치료는 반드시 의료 전문가의 상담을 통해 이루어져야 합니다."),i("br"),P("보다 정밀한 확인을 원하실 경우 전문 의료 기관의 검진을 권장드립니다.")])],-1))])]),i("div",Fa,[e[5]||(e[5]=i("h4",null,"권고 치료 계획",-1)),i("p",Aa,h(s.treatmentPlanText),1)]),a.error?(o(),d("div",Ea,h(a.error),1)):u("",!0)]),i("div",Na,[i("button",{type:"button",class:"persona-primary",disabled:a.saving,onClick:e[1]||(e[1]=(...r)=>s.saveSession&&s.saveSession(...r))},h(s.saveButtonLabel),9,Oa)])])}const Be=x(va,[["render",La],["__scopeId","data-v-00b3430c"]]),qa=[{id:"gender",q:"성별을 선택해 주세요.",hint:"",options:["남성","여성"]},{id:"fullAge",q:"만 나이를 입력해 주세요.",hint:"",inputType:"number"},{id:"pregnancyStatus",q:"현재 임신 중이거나 임신을 준비 중이신가요?",hint:"",pregnancyEligible:!0,options:["해당 없음","임신 준비중","임신 중"]},{id:"location",q:"머리카락이 얇아지거나 빠지는 부ì
1œ„는 주로 어디인가요?",hint:"복수 선택 가능",multi:!0,options:["앞머리ㆍ헤어라인","정수리ㆍ두정부(가르마 부근)","옆머리ㆍ측두부(관자놀이 부근)","전체적으로 머리 숱이 줄어듦","부분적으로 동그랗게 빠짐(원형/타원형)"]},{id:"onset",q:"머리카락이 얇아지거나 빠지는 증상이 언제부터 시작되었나요?",hint:"",options:["1개월 이내","1~3개월 전","3~6개월 전","6개월~1년 전","1~3년 전","3년 이상"]},{id:"pattern",q:"머리카락이 얇아지거나 빠지는 주된 양상은 어떻게 나타나고 있나요?",hint:"",options:["갑자기 머리카락이 많이 빠짐","머리카락이 점점 가늘어짐","특정 부위가 동그랗게 비어 보임","전체적으로 숱이 고르게 줄어듦"]},{id:"quantity",q:"하루 평균 머리카락이 얼마나 빠지나요?",hint:"",options:["50개 미만 (정상 범위)","50~100개","100~150개","150개 이상 (과다 탈락)"]},{id:"symptoms",q:"두피에 다른 증상이 있나요?",hint:"복수 선택 가능",multi:!0,exclusiveOption:"증상 없음",options:["가려움증","두피 따가움ㆍ열감","비듬이 많다","두피 붉어짐","증상 없음","눈썹ㆍ체모도 빠짐"]},{id:"family",q:"가족 중 머리카락이 얇아지거나 빠지는 분이 계신가요?",hint:"",options:["부계 쪽에 있음","모계 쪽에 있음","양쪽 모두 있음","가족력 없음","모르겠다"]},{id:"health",q:"현재 앓고 있거나 과거에 앓은 질환이 있나요?",hint:"복수 선택 가능",multi:!0,exclusiveOption:"해당 없음",otherOption:"기타",otherAnswerId:"healthOther",otherPlaceholder:"질환명을 직접 입력해 주세요",options:["갑상선 질환","빈혈","당뇨","고지혈증","지루성피부염","해당 없음","기타"]},{id:"lifestyle",q:"최근 6개월 이내 해당되는 것이 있나요?",hint:"복수 선택 가능",multi:!0,exclusiveOption:"해당 없음",options:["극심한 스트레스ㆍ사건","급격한 체중 감량","출산ㆍ산후 (여성)","불규칙한 식사","수면 부족ㆍ불면증","강한 파마ㆍ염색 반복","해당 없음"]},{id:"treatment",q:"현재 머리카락이 얇아지거나 빠지는 증상에 대한 치료를 받고 있거나 받은 적이 있나요?",hint:"복수 선택 가능",multi:!0,exclusiveOption:"치료 경험 없음",options:["치료 경험 없음","병원 처방약 복용 중","탈모 전용 샴푸 사용 중","탈모 영양제 복용 중","한방 치료 중"]},{id:"goal",q:"이번 AI 진료를 통해 가장 원하시는 것은 무엇인가요?",hint:"",options:["현재 상태 정확한 진단","진행 억제","모발 굵기 개선","자연스러운 모발 회복","최적 치료 방법 안내"]}],Ua={name:"PersonaQuestionnaire",props:{doctor:{type:Object,required:!0},modelValue:{type:Object,default:()=>({})}},emits:["back","complete","update:modelValue"],data(){return{currentIndex:0,answers:{...this.modelValue}}},computed:{questions(){return qa.filter(t=>!t.pregnancyEligible||ye(this.answers))},currentQuestion(){return this.questions[this.currentIndex]||this.questions[this.questions.length-1]||{}},currentAnswer(){return this.answers[this.currentQuestion.id]},canContinue(){if(this.currentQuestion.inputType==="number"){const t=Number(this.currentAnswer);return Number.isFinite(t)&&t>=10&&t<=120}return this.showOtherInput&&!String(this.otherAnswer||"").trim()?!1:Array.isArray(this.currentAnswer)?this.currentAnswer.length>0:!!this.currentAnswer},otherAnswer(){return this.currentQuestion.otherAnswerId&&this.answers[this.currentQuestion.otherAnswerId]||""},showOtherInput(){return!!(this.currentQuestion.otherOption&&Array.isArray(this.currentAnswer)&&this.currentAnswer.includes(this.currentQuestion.otherOption))},progress(){return(this.currentIndex+1)/this.questions.length*100}},methods:{isSelected(t){return Array.isArray(this.currentAnswer)?this.currentAnswer.includes(t):this.currentAnswer===t},nextMultiAnswer(t){const e=Array.isArray(this.currentAnswer)?this.currentAnswer:[],n=this.currentQuestion.exclusiveOption;if(t===n)return e.includes(t)?[]:[t];const c=n?e.filter(a=>a!==n):e;return e.includes(t)?c.filter(a=>a!==t):[...c,t]},selectOption(t){if(this.currentQuestion.multi){const e=this.nextMultiAnswer(t);this.answers[this.currentQuestion.id]=e,this.currentQuestion.otherOption&&!e.includes(this.currentQuestion.otherOption)&&delete this.answers[this.currentQuestion.otherAnswerId]}else this.answers[this.currentQuestion.id]=t,this.clearUnsupportedPregnancyStatus();this.$emit("update:modelValue",this.answers)},setInputAnswer(t){this.answers[this.currentQuestion.id]=t,this.clearUnsupportedPregnancyStatus(),this.$emit("update:modelValue",this.answers)},setOtherAnswer(t){this.answers[this.currentQuestion.otherAnswerId]=t,this.$emit("update:modelValue",this.answers)},next(){if(this.canContinue){if(this.currentIndex<this.questions.length-1){this.currentIndex+=1;return}this.$emit("complete",this.answers)}},goBack(){this.currentIndex>0?this.currentIndex-=1:this.$emit("back")},clearUnsupportedPregnancyStatus(){ye(this.answers)||delete this.answers.pregnancyStatus}}},Ba={class:"persona-step"},Ha={class:"persona-step-head"},Va={class:"persona-step-scroll"},Qa={class:"persona-progress"},Ka={class:"persona-question"},ja={key:0,class:"persona-options"},za=["value"],Ya={key:1,class:"persona-options"},Ga=["onClick"],Wa=["placeholder","value"],Ja={class:"persona-actions"},Xa=["disabled"];function Za(t,e,n,c,a,s){return o(),d("section",Ba,[i("div",Ha,[i("button",{type:"button",onClick:e[0]||(e[0]=(...l)=>s.goBack&&s.goBack(...l))}
1,"‹"),i("div",null,[e[5]||(e[5]=i("h2",null,"병력 ì²­ì·¨ 문진",-1)),i("p",null,h(a.currentIndex+1)+" / "+h(s.questions.length),1)]),e[6]||(e[6]=i("span",null,"3/3",-1))]),i("div",Va,[i("div",Qa,[i("em",{style:O({width:`${s.progress}%`})},null,4)]),i("div",Ka,[i("p",null,"AI "+h(n.doctor.name)+" 의사",1),i("h3",null,h(s.currentQuestion.q),1),i("small",null,h(s.currentQuestion.hint),1),s.currentQuestion.inputType==="number"?(o(),d("div",ja,[i("input",{type:"number",inputmode:"numeric",min:"10",max:"120",placeholder:"예: 34",value:s.currentAnswer||"",onInput:e[1]||(e[1]=l=>s.setInputAnswer(l.target.value))},null,40,za)])):(o(),d("div",Ya,[(o(!0),d(C,null,S(s.currentQuestion.options,l=>(o(),d("button",{key:l,type:"button",class:y({selected:s.isSelected(l)}),onClick:p=>s.selectOption(l)},h(l),11,Ga))),128)),s.showOtherInput?(o(),d("input",{key:0,type:"text",placeholder:s.currentQuestion.otherPlaceholder,value:s.otherAnswer,onInput:e[2]||(e[2]=l=>s.setOtherAnswer(l.target.value))},null,40,Wa)):u("",!0)]))])]),i("div",Ja,[a.currentIndex>0?(o(),d("button",{key:0,type:"button",class:"persona-secondary",onClick:e[3]||(e[3]=l=>a.currentIndex-=1)},"이전")):u("",!0),i("button",{type:"button",class:"persona-primary",disabled:!s.canContinue,onClick:e[4]||(e[4]=(...l)=>s.next&&s.next(...l))},h(a.currentIndex===s.questions.length-1?"AI 진단 받기":"다음"),9,Xa)])])}const He=x(Ua,[["render",Za],["__scopeId","data-v-0444b3cf"]]),$a="/images/sethairthicknessImg.png",en={name:"PersonaThicknessStep",props:{skipQuestionnaire:{type:Boolean,default:!1},doctor:{type:Object,default:()=>({})}},emits:["back","complete"],data(){return{file:null,previewUrl:"",loading:!1,error:"",result:null,analysisRequestSeq:0}},computed:{uploadLabel(){return te(se())},replaceUploadLabel(){return te(se(),!0)},analysisButtonLabel(){return this.result?"모발 굵기 다시 분석 시작":"모발 굵기 분석 시작"},nextButtonLabel(){return kt(this.skipQuestionnaire)},isUploadDisabled(){return this.loading}},beforeUnmount(){this.revokePreviewUrl()},methods:{openFileDialog(){this.isUploadDisabled||this.$refs.fileInput?.click()},onFileChange(t){this.selectImageFile(t.target.files?.[0])},onDrop(t){this.selectImageFile(t.dataTransfer?.files?.[0])},selectImageFile(t){if(!this.isUploadDisabled&&t){if(!t.type.startsWith("image/")){this.error="이미지 파일만 업로드할 수 있습니다.";return}this.file=t,this.analysisRequestSeq+=1,this.error="",this.result=null,this.revokePreviewUrl(),this.previewUrl=URL.createObjectURL(t),this.resetFileInput()}},clearImage(){this.isUploadDisabled||(this.revokePreviewUrl(),this.file=null,this.analysisRequestSeq+=1,this.previewUrl="",this.result=null,this.error="",this.resetFileInput())},revokePreviewUrl(){this.previewUrl&&URL.revokeObjectURL(this.previewUrl)},resetFileInput(){this.$refs.fileInput&&(this.$refs.fileInput.value="")},isCurrentAnalysisRequest(t,e){return t===this.analysisRequestSeq&&e===this.file},scrollAnalysisResultIntoView(){this.$nextTick(()=>{const t=this.$refs.stepScroll;!t||typeof t.scrollTo!="function"||t.scrollHeight<=t.clientHeight||t.scrollTo({top:t.scrollHeight,behavior:"smooth"})})},diagnose(){if(!this.file)return;const t=this.file,e=++this.analysisRequestSeq;this.loading=!0,this.error="",this.result=null;const n=new FormData;n.append("userHairLossImage",this.file),this.$api.chat.diagnosePersonaThickness(n,{success:c=>{this.isCurrentAnalysisRequest(e,t)&&(this.result=ft(c),this.loading=!1,this.scrollAnalysisResultIntoView())},error:c=>{this.isCurrentAnalysisRequest(e,t)&&(this.error=c?.response?.data?.message||"모발 굵기 분석에 실패했습니다. 다시 시도해 주세요.",this.loading=!1)}})},complete(){this.$emit("complete",{...this.result,sourceFileName:this.file?.name||"",sourceFile:this.file})}}},tn={class:"persona-step"},sn={class:"persona-step-head"},an={ref:"stepScroll",class:"persona-step-scroll"},nn={class:"persona-upload"},rn=["disabled"],on=["tabindex","aria-disabled"],ln={class:"persona-upload-preview"},dn=["src"],cn=["disabled"],un={key:0,class:"persona-error",role:"alert"},hn={class:"persona-inline-action"},pn=["disabled"],mn={key:1,class:"persona-thickness-skeleton","aria-label":"모발 굵기 분석 ê²°ê³¼ 미리보기"},gn={key:2,class:"persona-thickness-card"},yn={key:0,class:"persona-step-action"};function fn(t,e,n,c,a,s){return o(),d("section",tn,[i("div",sn,[i("button",{type:"button",onClick:e[0]||(e[0]=l=>t.$emit("back"))},"‹"),e[10]||(e[10]=i("div",null,[i("h2",null,"모발 굵기 분석"),i("p",null,"모발 확대 사진으로 평균 굵기를 저장합니다.")],-1)),e[11]||(e[11]=i("span",null,"2/3",-1))]),i("div",an,[i("div",nn,[i("input",{ref:"fileInput",type:"file",accept:"image/*",disabled:s.isUploadDisabled,onChange:e[1]||(e[1]=(...l)=>s.onFileChange&&s.onFileChange(...l))},null,40,rn),i("div",{class:y(["persona-upload-box",{"persona-upload-box--disabled":s.isUploadDisabled}]),role:"button",tabindex:s.isUploadDisabled?-1:0,"aria-disabled":s.isUploadDisabled?"true":"false",onClick:e[3]||(e[3]=(...l)=>s.openFileDialog&&s.openFileDialog(...l)),onKeydown:[e[4]||(e[4]=j(D((...l)=>s.openFileDialog&&s.openFileDialog(...l),["prevent"]),["enter"])),e[5]||(e[5]=j(D((...l)=>s.openFileDialog&&s.openFileDialog(...l),["prevent"]),["space"]))],onDragover:e[6]||(e[6]=D(()=>{},["prevent"])),onDrop:e[7]||(e[7]=D((...l)=>s.onDrop&&s.onDrop(...l),["prevent"]))},[a.previewUrl?(o(),d(C,{key:0},[i("div",ln,[i("img",{src:a.previewUrl,alt:"업로드 이미지 미리보기"},null,8,dn),i("button",{type:"button",class:"persona-upload-remove","aria-label":"선택한 이미지 삭제",disabled:s.isUploadDisabled,onClick:e[2]||(e[2]=D((...l)=>s.clearImage&&s.clearImage(...l),["stop"]))},e[12]||(e[12]=[i("i",{class:"mdi mdi-close"},null,-1)]),8,cn)]),i("strong",null,h(a.file.name),1),e[14]||(e[14]=i("span",{class:"persona-upload-copy"},"다른 이미지를 선택하거나 X 버튼으로 현재 이미지를 삭제하세요.",-1)),i("em",null,[e[13]||(e[13]=i("i",{class:"mdi mdi-camera"},null,-1)),P(h(s.replaceUploadLabel),1)])],64)):(o(),d(C,{key:1},[e[16]||(e[16]=i("img",{class:"persona-upload-guide-image",src:$a,alt:"모발 굵기 촬영 예ì‹
1œ"},null,-1)),e[17]||(e[17]=i("p",{class:"persona-guide-text"},[i("strong",null,"정수리 또는 탈모 부위의 두피를 위에서 내려다본 사진만 업로드해 주세요."),i("span",null,"촬영할 때 머리카락이 부위를 가리지 않도록 주의해 주세요.")],-1)),i("em",null,[e[15]||(e[15]=i("i",{class:"mdi mdi-camera"},null,-1)),P(h(s.uploadLabel),1)])],64))],42,on)]),a.error?(o(),d("div",un,h(a.error),1)):u("",!0),i("div",hn,[i("button",{type:"button",class:"persona-primary",disabled:!a.file||a.loading,onClick:e[8]||(e[8]=(...l)=>s.diagnose&&s.diagnose(...l))},h(a.loading?"AI 측정 중...":s.analysisButtonLabel),9,pn)]),a.loading&&!a.result?(o(),d("div",mn,e[18]||(e[18]=[i("div",{class:"persona-analysis-status",role:"status","aria-live":"polite"},[i("span",{class:"persona-analysis-status-dot","aria-hidden":"true"}),i("div",null,[i("strong",null,"AI 측정 중"),i("p",null,"모발 굵기를 측정하고 있습니다. 잠시만 기다려 주세요.")])],-1),i("div",{class:"persona-loading-progress",role:"progressbar","aria-label":"모발 굵기 분석 진행 중"},[i("i")],-1),G('<div class="persona-thickness-skeleton-card" data-v-5d26de66><div class="persona-skeleton-label" data-v-5d26de66>평균 모발 굵기</div><div class="persona-skeleton-thickness-row" data-v-5d26de66><div class="persona-skeleton-thickness-value persona-skeleton-pulse" data-v-5d26de66></div><div class="persona-skeleton-thickness-unit persona-skeleton-pulse" data-v-5d26de66></div></div><div class="persona-skeleton-line persona-skeleton-pulse" data-v-5d26de66></div></div>',1)]))):u("",!0),a.result?(o(),d("div",gn,[e[20]||(e[20]=i("p",null,"평균 모발 굵기",-1)),i("strong",null,[P(h(a.result.thicknessUm||"-"),1),e[19]||(e[19]=i("small",null,"㎛",-1))]),i("span",null,"정상 기준 "+h(a.result.normalUm||80)+"㎛",1)])):u("",!0)],512),a.result?(o(),d("div",yn,[i("button",{type:"button",class:"persona-primary",onClick:e[9]||(e[9]=(...l)=>s.complete&&s.complete(...l))},h(s.nextButtonLabel),1)])):u("",!0)])}const Ve=x(en,[["render",fn],["__scopeId","data-v-5d26de66"]]),kn="/images/img-dianosis.png",vn={name:"PersonaHairTypeStep",components:{PersonaHairDensityStat:ne},props:{doctor:{type:Object,required:!0},repeatVisit:{type:Boolean,default:!1},lockedPrimaryType:{type:String,default:""}},emits:["back","complete"],data(){return{file:null,previewUrl:"",loading:!1,error:"",result:null,analysisRequestSeq:0}},computed:{uploadLabel(){return te(se())},replaceUploadLabel(){return te(se(),!0)},stepDescription(){return this.repeatVisit?"초진 유형을 유지하고 현재 두피 이미지를 저장합니다.":bt()},analysisButtonLabel(){return this.repeatVisit?this.result?"이미지 다시 저장 준비":"현재 이미지 저장 준비":this.result?"탈모 유형 다시 분석 시작":"탈모 유형 분석 시작"},nextButtonLabel(){return this.repeatVisit?"다음":this.result?.primaryType==="안드로겐성 탈모"?"다음: 모발 굵기 분석":"다음: 병력 ì²­ì·¨ 문진"},isUploadDisabled(){return this.loading}},beforeUnmount(){this.revokePreviewUrl()},methods:{openFileDialog(){this.isUploadDisabled||this.$refs.fileInput?.click()},onFileChange(t){this.selectImageFile(t.target.files?.[0])},onDrop(t){this.selectImageFile(t.dataTransfer?.files?.[0])},selectImageFile(t){if(!this.isUploadDisabled&&t){if(!t.type.startsWith("image/")){this.error="이미지 파일만 업로드할 수 있습니다.";return}this.file=t,this.analysisRequestSeq+=1,this.error="",this.result=null,this.revokePreviewUrl(),this.previewUrl=URL.createObjectURL(t),this.resetFileInput()}},clearImage(){this.isUploadDisabled||(this.revokePreviewUrl(),this.file=null,this.analysisRequestSeq+=1,this.previewUrl="",this.result=null,this.error="",this.resetFileInput())},revokePreviewUrl(){this.previewUrl&&URL.revokeObjectURL(this.previewUrl)},resetFileInput(){this.$refs.fileInput&&(this.$refs.fileInput.value="")},isCurrentAnalysisRequest(t,e){return t===this.analysisRequestSeq&&e===this.file},scrollAnalysisResultIntoView(){this.$nextTick(()=>{const t=this.$refs.stepScroll;!t||typeof t.scrollTo!="function"||t.scrollHeight<=t.clientHeight||t.scrollTo({top:t.scrollHeight,behavior:"smooth"})})},diagnose(){if(!this.file)return;const t=this.file,e=++this.analysisRequestSeq;if(this.repeatVisit){this.result={stepId:"repeat-hairtype-image",primaryType:this.lockedPrimaryType||"탈모 유형 유지",candidates:[],summary:"초진 탈모 유형을 유지하고 현재 두피 이미지를 추적 비교용으로 저장합니다."},this.scrollAnalysisResultIntoView();return}this.loading=!0,this.error="",this.result=null;const n=new FormData;n.append("user_hair_loss_image",this.file),n.append("questionnaire_context",""),this.$api.chat.diagnosePersonaHairType(n,{success:c=>{this.isCurrentAnalysisRequest(e,t)&&(this.result=vt(c),this.loading=!1,this.scrollAnalysisResultIntoView())},error:c=>{this.isCurrentAnalysisRequest(e,t)&&(this.error=c?.response?.data?.message||"탈모 유형 분석에 실패했습니다. 다시 시도해 주세요.",this.loading=!1)}})},complete(){this.$emit("complete",{...this.result,sourceFileName:this.file?.name||"",sourceFile:this.file})}}},bn={class:"persona-step"},In={class:"persona-step-head"},Mn={ref:"stepScroll",class:"persona-step-scroll"},Dn={class:"persona-doctor-banner"},Cn={class:"persona-upload"},Rn=["disabled"],wn=["tabindex","aria-disabled"],Pn={class:"persona-upload-preview"},Tn=["src"],Sn=["disabled"],_n={key:0,class:"persona-error",role:"alert"},xn={class:"persona-inline-action"},Fn=["disabled"],An={key:1,class:"persona-analysis-skeleton","aria-label":"탈모 유형 분석 ê²°ê³¼ 미리보기"},En={key:2,class:"persona-result-card"},Nn={key:0,class:"persona-step-action"};function On(t,e,n,c,a,s){const l=ne;return o(),d("section",bn,[i("div",In,[i("button",{type:"button",onClick:e[0]||(e[0]=p=>t.$emit("back"))},"‹"),i("div",null,[e[10]||(e[10]=i("h2",null,"탈모 유형 분석",-1)),i("p",null,h(s.stepDescription),1)]),e[11]||(e[11]=i("span",null,"1/3",-1))]),i("div",Mn,[i("div",Dn,"AI "+h(n.doctor.name)+" 의사가 분석합니다.",1),i("div",Cn,[i("input",{ref:"fileInput",type:"file",accept:"image/*",disabled:s.isUploadDisabled,onChange:e[1]||(e[1]=(...p)=>s.onFileChange&&s.onFileChange(...p))},null,40,Rn),i("div",{class:y(["persona-upload-box",{"persona-upload-box--disabled":s.isUploadDisabled}]),role:"button",tabindex:s.isUploadDisabled?-1:0,"aria-disabled":s.isUploadDisabled?"true":"false",onClick:e[3]||(e[3]=(...p)=>s.openFileDialog&&s.openFileDialog(...p)),onKeydown:[e[4]||(e[4]=j(D((...p)=>s.openFileDialog&&s.openFileDialog(...p),["prevent"]),["enter"])),e[5]||(e[5]=j(D((...p)=>s.openFileDialog&&s.openFileDialog(...p),["prevent"]),["space"]))],onDragover:e[6]||(e[6]=D(()=>{},["prevent"])),onDrop:e[7]||(e[7]=D((...p)=>s.onDrop&&s.onDrop(...p),["prevent"]))},[a.previewUrl?(o(),d(C,{key:0},[i("div",Pn,[i("img",{src:a.previewUrl,alt:"업로드 이미지 미리보기"},null,8,Tn),i("button",{type:"button",class:"persona-upload-remove","aria-label":"선택한 이미지 삭제",disabled:s.isUploadDisabled,onClick:e[2]||(e[2]=D((...p)=>s.clearImage&&s.clearImage(...p),["stop"]))},e[12]||(e[12]=[i("i",{class:"mdi mdi-close"},null,-1)]),8,Sn)]),i("strong",null,h(a.file.name),1),e[14]||(e[14]=i("span",{class:"persona-upload-copy"},"다른 이미지를 선택하거나 X 버튼으로 현재 이미지를 삭제하세요.",-1)),i("em",null,[e[13]||(e[13]=i("i",{class:"mdi mdi-camera"},null,-1)),P(h(s.replaceUploadLabel),1)])],64)):(o(),d(C,{key:1},[e[16]||(e[16]=i("img",{class:"persona-upload-guide-image",src:kn,alt:"탈모 의심 부위 촬영 예ì‹
1œ"},null,-1)),e[17]||(e[17]=i("p",{class:"persona-guide-text"},[i("strong",null,"탈모가 의심되는 부위는 가까운 거리에서 선명하게 촬영해 주세요."),i("span",null,"촬영할 때 머리카락이 부위를 가리지 않도록 주의해 주세요.")],-1)),i("em",null,[e[15]||(e[15]=i("i",{class:"mdi mdi-camera"},null,-1)),P(h(s.uploadLabel),1)])],64))],42,wn)]),a.error?(o(),d("div",_n,h(a.error),1)):u("",!0),i("div",xn,[i("button",{type:"button",class:"persona-primary",disabled:!a.file||a.loading,onClick:e[8]||(e[8]=(...p)=>s.diagnose&&s.diagnose(...p))},h(a.loading?"AI 분석 중...":s.analysisButtonLabel),9,Fn)]),a.loading&&!a.result?(o(),d("div",An,e[18]||(e[18]=[i("div",{class:"persona-analysis-status",role:"status","aria-live":"polite"},[i("span",{class:"persona-analysis-status-dot","aria-hidden":"true"}),i("div",null,[i("strong",null,"AI 분석 중"),i("p",null,"이미지를 분석하고 있습니다. 잠시만 기다려 주세요.")])],-1),i("div",{class:"persona-loading-progress",role:"progressbar","aria-label":"탈모 유형 분석 진행 중"},[i("i")],-1),G('<div class="persona-skeleton-card" data-v-246e0a77><div class="persona-skeleton-label" data-v-246e0a77>탈모 유형 ê²°ê³¼</div><div class="persona-skeleton-title persona-skeleton-pulse" data-v-246e0a77></div><div class="persona-skeleton-line persona-skeleton-line--wide persona-skeleton-pulse" data-v-246e0a77></div><div class="persona-skeleton-line persona-skeleton-pulse" data-v-246e0a77></div></div><div class="persona-skeleton-density-stat" data-v-246e0a77><div class="persona-skeleton-label" data-v-246e0a77>모발 밀도 분석</div><div class="persona-skeleton-stat-row" data-v-246e0a77><div class="persona-skeleton-stat-value persona-skeleton-pulse" data-v-246e0a77></div><div class="persona-skeleton-unit persona-skeleton-pulse" data-v-246e0a77></div></div><div class="persona-skeleton-line persona-skeleton-line--short persona-skeleton-pulse" data-v-246e0a77></div></div>',2)]))):u("",!0),a.result?(o(),d("div",En,[i("h3",null,h(a.result.primaryType),1),i("p",null,h(a.result.summary),1)])):u("",!0),a.result?.densityAnalysis?(o(),m(l,{key:3,"density-analysis":a.result.densityAnalysis,class:"persona-hair-density-result"},null,8,["density-analysis"])):u("",!0)],512),a.result?(o(),d("div",Nn,[i("button",{type:"button",class:"persona-primary",onClick:e[9]||(e[9]=(...p)=>s.complete&&s.complete(...p))},h(s.nextButtonLabel),1)])):u("",!0)])}const Qe=x(vn,[["render",On],["__scopeId","data-v-246e0a77"]]);function Ln(t){return typeof t=="string"?t.trim():t&&typeof t=="object"?String(t.text||t.title||t.name||t.label||"").trim():String(t??"").trim()}function Ke(t={}){return(Array.isArray(t.tags)?t.tags:[]).map(n=>Ln(n).replace(/^#+\s*/,"").trim()).filter(Boolean)}function je(t={}){return Ke(t).join(" · ")}const qn={name:"PersonaDoctorRecommendModal",props:{doctors:{type:Array,default:()=>[]}},emits:["close","select-doctor"],data(){return{draft:"",loading:!1,errorMessage:"",messages:[]}},methods:{recommendedDoctorFor(t){const e=t?.recommendation||{},n=e.recommendedDoctor||{},c=e.personaAiDoctorIdx||e.recommendedDoctorIdx||n.personaAiDoctorIdx;if(c!=null){const s=this.doctors.find(l=>Number(l.personaAiDoctorIdx)===Number(c));if(s)return s}const a=e.doctorName||e.name||n.name;return a&&this.doctors.find(s=>this.normalizeDoctorName(s.name)===this.normalizeDoctorName(a))||null},recommendationText(t){return t?.answer||t?.recommendation||t?.reason||""},recentMessages(){return this.messages.slice(-3).map(t=>({role:t.role,content:t.content}))},sendExample(t){this.loading||(this.draft=t,this.sendMessage())},scrollRecommendationToBottom(){this.$nextTick(()=>{const t=this.$refs.recommendBody;if(t){if(typeof t.scrollTo=="function"){t.scrollTo({top:t.scrollHeight,behavior:"smooth"});return}t.scrollTop=t.scrollHeight}})},sendMessage(){const t=this.draft.trim();if(!t||this.loading)return;const e=this.recentMessages();this.messages=[...this.messages,{role:"user",content:t}],this.draft="",this.loading=!0,this.errorMessage="",this.$api.chat.recommendPersonaDoctor({question:t,messages:e},{success:n=>{this.loading=!1;const c=this.recommendationText(n)||"추천 의사를 확인했습니다.";this.messages=[...this.messages,{role:"assistant",content:c,recommendation:n||null}],this.scrollRecommendationToBottom()},error:()=>{this.loading=!1,this.errorMessage="의사 추천을 불러오지 못했습니다. 다시 입력해 주세요."}})},selectRecommendedDoctor(t){const e=this.recommendedDoctorFor(t);this.loading||!e||this.$emit("select-doctor",e)}
1,normalizeDoctorName(t){return String(t||"").replace(/^AI\s*/i,"").replace(/\s*의사$/g,"").replace(/\s+/g,"").trim()},doctorSummary(t){return je(t)},photoStyle(t){return t.photoUrl||t.photoFileUrl?{backgroundImage:`url(${t.photoUrl||t.photoFileUrl})`,backgroundSize:"contain",backgroundPosition:"center",backgroundRepeat:"no-repeat"}:{backgroundColor:"#eef1f6"}}}},Un={class:"persona-recommend-modal",role:"dialog","aria-modal":"true","aria-labelledby":"persona-recommend-title"},Bn={class:"persona-recommend-head"},Hn={ref:"recommendBody",class:"persona-recommend-body"},Vn={class:"persona-recommend-messages","aria-live":"polite"},Qn={key:0,class:"persona-recommend-empty"},Kn={class:"persona-recommend-examples","aria-label":"입력 예시"},jn={key:0,class:"persona-recommend-result"},zn={key:0,class:"persona-recommend-doctor"},Yn={key:0},Gn={key:1},Wn=["disabled","onClick"],Jn={key:1,class:"persona-recommend-message persona-recommend-message--assistant persona-recommend-message--loading"},Xn={key:2,class:"persona-recommend-error"},Zn=["disabled"],$n=["disabled"];function er(t,e,n,c,a,s){return o(),d("div",{class:"persona-recommend-backdrop",onClick:e[6]||(e[6]=D(l=>t.$emit("close"),["self"]))},[i("section",Un,[i("div",Bn,[e[7]||(e[7]=i("div",null,[i("h2",{id:"persona-recommend-title"},"AI 의사 추천")],-1)),i("button",{type:"button",class:"persona-recommend-close",title:"닫기",onClick:e[0]||(e[0]=l=>t.$emit("close"))},[M(T,{icon:"mdi:mdi-close"}
1)])]),i("div",Hn,[i("div",Vn,[!a.messages.length&&!a.loading?(o(),d("div",Qn,[e[8]||(e[8]=i("strong",null,"어떤 AI 의사가 맞을지 편하게 적어주세요",-1)),e[9]||(e[9]=i("p",null,"나이와 성별, 고민 부위, 원하는 설명 방식을 한두 문장으로 입력하면 됩니다.",-1)),i("div",Kn,[i("button",{type:"button",onClick:e[1]||(e[1]=l=>s.sendExample("초기 탈모가 의심되는 젊은 사용자를 대상으로 진단 하는 의사"))},"초기 탈모가 의심되는 젊은 사용자를 대상으로 진단 하는 의사"),i("button",{type:"button",onClick:e[2]||(e[2]=l=>s.sendExample("중장년층의 오래된 탈모 고민을 가진 사용자를 대상으로 진단하는 의사"))},"중장년층의 오래된 탈모 고민을 가진 사용자를 대상으로 진단하는 의사"),i("button",{type:"button",onClick:e[3]||(e[3]=l=>s.sendExample("여성형 탈모와 산후 탈모 고민이 있는 사용자를 대상으로 진단하는 의사"))},"여성형 탈모와 산후 탈모 고민이 있는 사용자를 대상으로 진단하는 의사")])])):u("",!0),(o(!0),d(C,null,S(a.messages,(l,p)=>(o(),d("div",{key:`${l.role}-${p}`,class:y(["persona-recommend-message",`persona-recommend-message--${l.role}`])},[i("p",null,h(l.content),1),l.recommendation?(o(),d("div",jn,[s.recommendedDoctorFor(l)?(o(),d("div",zn,[i("div",{class:"persona-recommend-photo",style:O(s.photoStyle(s.recommendedDoctorFor(l)))},null,4),s.recommendedDoctorFor(l).name?(o(),d("strong",Yn,"AI "+h(s.recommendedDoctorFor(l).name)+" 의사",1)):u("",!0),s.doctorSummary(s.recommendedDoctorFor(l))?(o(),d("span",Gn,h(s.doctorSummary(s.recommendedDoctorFor(l))),1)):u("",!0)])):u("",!0),s.recommendedDoctorFor(l)?(o(),d("button",{key:1,type:"button",class:"persona-primary persona-recommend-select",disabled:a.loading,onClick:r=>s.selectRecommendedDoctor(l)}," AI "+h(s.recommendedDoctorFor(l).name)+" 의사 선택하기 ",9,Wn)):u("",!0)])):u("",!0)],2))),128)),a.loading?(o(),d("div",Jn,e[10]||(e[10]=[i("span",{class:"persona-recommend-loading-spinner","aria-hidden":"true"},null,-1),P(" 추천 의사를 확인하고 있습니다. 잠시만 기다려 주세요. ")]))):u("",!0),a.errorMessage?(o(),d("p",Xn,h(a.errorMessage),1)):u("",!0)])],512),i("form",{class:"persona-recommend-form",onSubmit:e[5]||(e[5]=D((...l)=>s.sendMessage&&s.sendMessage(...l),["prevent"]))},[q(i("input",{"onUpdate:modelValue":e[4]||(e[4]=l=>a.draft=l),type:"text",disabled:a.loading,placeholder:"원하는 AI 의사를 설명해 주세요"},null,8,Zn),[[V,a.draft]]),i("button",{type:"submit",disabled:a.loading||!a.draft.trim()},"전송",8,$n)],32)])])}const oe=x(qn,[["render",er],["__scopeId","data-v-5f743db2"]]),tr={name:"PersonaDoctorList",components:{PersonaDoctorProfileModal:re,PersonaDoctorRecommendModal:oe},props:{doctors:{type:Array,default:()=>[]}},emits:["back","select-doctor"],data(){return{activeDoctor:null,recommendModalOpen:!1}},computed:{canRecommendDoctor(){return this.doctors.length>=2}},methods:{doctorKeywordSummary:je,photoStyle(t){return t.photoUrl||t.photoFileUrl?{backgroundImage:`url(${t.photoUrl||t.photoFileUrl})`,backgroundSize:"contain",backgroundPosition:"center",backgroundRepeat:"no-repeat"}:{backgroundColor:"#eef1f6"}}}},sr={class:"persona-step"},ir={class:"persona-step-head"},ar={key:0,class:"persona-empty"},nr={key:1,class:"persona-doctor-grid"},rr=["onClick"],or={key:0},lr={key:1};function dr(t,e,n,c,a,s){const l=re,p=oe;return o(),d("section",sr,[i("div",ir,[i("button",{type:"button",onClick:e[0]||(e[0]=r=>t.$emit("back"))},"‹"),e[6]||(e[6]=i("div",null,[i("h2",null,"AI 의사 선택"),i("p",null,"카드를 눌러 소개와 이력을 확인하세요.")],-1)),s.canRecommendDoctor?(o(),d("button",{key:0,type:"button",class:"persona-recommend-open",onClick:e[1]||(e[1]=r=>a.recommendModalOpen=!0)}," 의사 추천 ")):u("",!0)]),n.doctors.length?(o(),d("div",nr,[(o(!0),d(C,null,S(n.doctors,r=>(o(),d("button",{key:r.personaAiDoctorIdx||r.id,type:"button",class:"persona-doctor-card",onClick:g=>a.activeDoctor=r},[i("div",{class:"persona-doctor-photo",style:O(s.photoStyle(r))},null,4),i("div",null,[r.name?(o(),d("strong",or,"AI "+h(r.name)+" 의사",1)):u("",!0),s.doctorKeywordSummary(r)?(o(),d("span",lr,h(s.doctorKeywordSummary(r)),1)):u("",!0)])],8,rr))),128))])):(o(),d("div",ar," 등록된 AI 의사가 없습니다. ")),a.activeDoctor?(o(),m(l,{key:2,doctor:a.activeDoctor,onClose:e[2]||(e[2]=r=>a.activeDoctor=null),onSelect:e[3]||(e[3]=r=>t.$emit("select-doctor",r))},null,8,["doctor"])):u("",!0),a.recommendModalOpen?(o(),m(p,{key:3,doctors:n.doctors,onClose:e[4]||(e[4]=r=>a.recommendModalOpen=!1),onSelectDoctor:e[5]||(e[5]=r=>t.$emit("select-doctor",r))},null,8,["doctors"])):u("",!0)])}const ze=x(tr,[["render",dr],["__scopeId","data-v-5eab59a1"]]),cr={name:"PersonaCareMonthForm",props:{carePlanId:{type:Number,required:!0},monthIndex:{type:Number,default:0},doctor:{type:Object,required:!0},initialMedicalFiles:{type:Object,default:()=>({})},diagnosisResults:{type:Object,default:()=>({})},editableRecord:{type:Object,default:null},existingRecords:{type:Array,default:()=>[]},formMode:{type:String,default:"full"},hideTitle:{type:Boolean,default:!1},hideSubmit:{type:Boolean,default:!1}},emits:["saved","auth-expired"],data(){return{recordDate:new Date().toISOString().slice(0,10),oralMeds:[{name:"",weeks:"",refillDate:"",refillDateTouched:!1}],topicalMeds:[{name:"",weeks:"",refillDate:"",refillDateTouched:!1}],legacyTreatmentText:"",changeText:"",scalpImage:null,thicknessImage:null,existingScalpImageFileId:"",existingScalpImageName:"",existingThicknessImageFileId:"",existingThicknessImageName:"",scalpPreviewUrl:"",thicknessPreviewUrl:"",previewFileIds:{},previewRequestSeq:{},saving:!1,successMessage:"",error:"",showOverwriteConfirm:!1,pendingDuplicateRecord:null}},computed:{isEditMode(){return!!this.editableRecord?.personaCareMonthRecordIdx},isEmbeddedMode(){return this.formMode!=="full"},showInputFields(){return this.formMode!=="images"},showImageFields(){return this.formMode!=="record"},showThicknessImageFields(){return this.showImageFields&&$(this.primaryHairType)},primaryHairType(){return this.diagnosisResults?.hairTypeResult?.primaryType||this.diagnosisResults?.finalDiagnosis?.primaryType||this.editableRecord?.hairTypeResult?.primaryType||""},canSubmit(){return!this.saving},submitLabel(){return this.saving?"저장 중...":this.formMode==="images"||this.isEditMode?"저장":"현재 진료 기록 저장"},saveSuccessMessage(){return this.formMode==="images"?"이미지 변경 저장이 완료되었습니다.":this.formMode==="record"&&this.isEditMode?"입력 정보 수정 저장이 완료되었습니다.":""},saveFailureMessage(){return this.formMode==="images"?"이미지 변경 저장에 실패했습니다.":this.formMode==="record"&&this.isEditMode?"입력 정보 수정 저장에 실패했습니다.":""},formTitle(){return this.formMode==="images"?`${this.editableRecord?.visitLabel||"진료"} 이미지 변경`:this.isEditMode?`${this.editableRecord.visitLabel||"진료"} 입력 정보 수정`:"새 진료 기록 입력"},scalpImageLabel(){return this.scalpImage?.name||this.existingScalpImageName||(this.existingScalpImageFileId?"탈모 유형 분석 이미지":"선택된 파일 없음")},thicknessImageLabel(){return this.thicknessImage?.name||this.existingThicknessImageName||(this.existingThicknessImageFileId?"모발 굵기 이미지":"선택된 파일 없음")},scalpImageHelp(){return this.scalpImage?"새 이미지가 이번 달 기록으로 저장됩니다.":this.existingScalpImageFileId?"":"이번 달 탈모 유형 분석 이미지를 선택할 수 있습니다."},thicknessImageHelp(){return this.thicknessImage?"새 이미지가 이번 달 기록으로 저장됩니다.":this.existingThicknessImageFileId?"":"이번 달 모발 굵기 이미지를 선택할 수 있습니다."}},mounted(){this.applyEditableRecord()}
1,watch:{recordDate(){this.syncMedicationRefillDates()}},beforeUnmount(){this.invalidatePreviewRequest("scalp"),this.invalidatePreviewRequest("thickness"),this.revokePreviewUrl("scalp"),this.revokePreviewUrl("thickness")},methods:{applyEditableRecord(){if(this.isEditMode){this.recordDate=this.dateKey(this.editableRecord.recordDate)||this.recordDate,this.legacyTreatmentText=this.extractText(this.editableRecord.treatmentRecord),this.oralMeds=this.extractMedicationList(this.editableRecord.treatmentRecord,"oralMeds","oralMed"),this.topicalMeds=this.extractMedicationList(this.editableRecord.treatmentRecord,"topicalMeds","topicalMed"),this.changeText=this.extractText(this.editableRecord.changeMemo),this.existingScalpImageFileId=this.editableRecord.scalpImageFileId||"",this.existingScalpImageName=this.editableRecord.scalpImageName||"",this.existingThicknessImageFileId=this.showThicknessImageFields&&this.editableRecord.thicknessImageFileId||"",this.existingThicknessImageName=this.showThicknessImageFields&&this.editableRecord.thicknessImageName||"",this.loadExistingPreview("scalp",this.existingScalpImageFileId),this.showThicknessImageFields&&this.loadExistingPreview("thickness",this.existingThicknessImageFileId);return}this.applyInitialMedicalFiles()},applyInitialMedicalFiles(){this.existingScalpImageFileId=this.initialMedicalFiles?.scalpImageFileId||"",this.existingScalpImageName=this.initialMedicalFiles?.scalpImageName||"",this.existingThicknessImageFileId=this.showThicknessImageFields&&this.initialMedicalFiles?.thicknessImageFileId||"",this.existingThicknessImageName=this.showThicknessImageFields&&this.initialMedicalFiles?.thicknessImageName||"",this.loadExistingPreview("scalp",this.existingScalpImageFileId),this.showThicknessImageFields&&this.loadExistingPreview("thickness",this.existingThicknessImageFileId)},extractText(t){return t?typeof t=="string"?t:typeof t=="object"&&t.text?t.text:"":""},emptyMedication(){return{name:"",weeks:"",refillDate:"",refillDateTouched:!1}},extractMedicationList(t,e,n){const c=t&&typeof t=="object"&&!Array.isArray(t)?t:{},s=(Array.isArray(c[e])?c[e]:[]).map(l=>({name:l?.name||"",weeks:l?.weeks||"",refillDate:l?.refillDate||"",refillDateTouched:!!l?.refillDate})).map(l=>({...l,refillDate:l.refillDate||this.calculateMedicationRefillDate(l.weeks)})).filter(l=>l.name||l.weeks||l.refillDate);return s.length?s:c[n]?[{name:c[n],weeks:"",refillDate:"",refillDateTouched:!1}]:[this.emptyMedication()]},updateMedication(t,e,n,c){const a=[...this[t]],s={...a[e]||this.emptyMedication(),[n]:c};n==="weeks"&&!s.refillDateTouched&&(s.refillDate=this.calculateMedicationRefillDate(c)),a[e]=s,this[t]=a},updateMedicationRefillDate(t,e,n){const c=[...this[t]];c[e]={...c[e]||this.emptyMedication(),refillDate:n,refillDateTouched:!0},this[t]=c},addMedication(t){this[t]=[...this[t],this.emptyMedication()]},removeMedication(t,e){const n=[...this[t]];if(n.length<=1){this[t]=[this.emptyMedication()];return}n.splice(e,1),this[t]=n},cleanMedicationList(t){return(t||[]).map(e=>({name:String(e?.name||"").trim(),weeks:String(e?.weeks||"").trim(),refillDate:String(e?.refillDate||this.calculateMedicationRefillDate(e?.weeks)).trim()})).filter(e=>e.name||e.weeks||e.refillDate)},buildTreatmentRecord(){const t={oralMeds:this.cleanMedicationList(this.oralMeds),topicalMeds:this.cleanMedicationList(this.topicalMeds)};return this.legacyTreatmentText&&(t.text=this.legacyTreatmentText),t},calculateMedicationRefillDate(t){const e=Number(t);if(!e||Number.isNaN(e))return"";const n=String(this.recordDate||"").split("-").map(Number);if(n.length!==3||n.some(a=>!a))return"";const c=new Date(n[0],n[1]-1,n[2]);return Number.isNaN(c.getTime())?"":(c.setDate(c.getDate()+e*7),this.formatDateKey(c))},formatDateKey(t){const e=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),c=String(t.getDate()).padStart(2,"0");return`${e}-${n}-${c}`},syncMedicationRefillDates(){this.syncMedicationGroupRefillDates("oralMeds"),this.syncMedicationGroupRefillDates("topicalMeds")},syncMedicationGroupRefillDates(t){this[t]=this[t].map(e=>e.refillDateTouched?e:{...e,refillDate:this.calculateMedicationRefillDate(e.weeks)})},dateKey(t){if(!t)return"";const e=new Date(t);return Number.isNaN(e.getTime())?"":e.toISOString().slice(0,10)},duplicateRecord(){const t=this.recordDate||new Date().toISOString().slice(0,10),e=Number(this.editableRecord?.personaCareMonthRecordIdx||0);return this.existingRecords.find(n=>Number(n.personaCareMonthRecordIdx||0)!==e&&this.dateKey(n.recordDate)===t)||null}
1,openImageDialog(t){const e=t==="scalp"?"scalpFileInput":"thicknessFileInput";this.$refs[e]?.click()},onImageChange(t,e){const n=e.target.files?.[0]||null;if(t==="scalp"?this.scalpImage=n:this.thicknessImage=n,this.error="",this.revokePreviewUrl(t),n)this.invalidatePreviewRequest(t),this.previewFileIds[t]="",this.setPreviewUrl(t,URL.createObjectURL(n));else{const c=t==="scalp"?this.existingScalpImageFileId:this.existingThicknessImageFileId;this.loadExistingPreview(t,c)}},loadExistingPreview(t,e){if(!e){this.invalidatePreviewRequest(t),this.revokePreviewUrl(t),this.previewFileIds[t]="";return}const n=this.previewFileIds[t];if(this.previewUrlForKind(t)&&String(n)===String(e))return;this.previewUrlForKind(t)&&this.revokePreviewUrl(t),this.previewFileIds[t]=String(e);const c=this.nextPreviewRequestId(t);this.$api.chat.getPersonaMedicalFile(e,{success:a=>{this.isCurrentPreviewRequest(t,c)&&(this.error="",this.setPreviewUrl(t,URL.createObjectURL(a)))},error:a=>{if(this.isCurrentPreviewRequest(t,c)){if(Y(a)){this.$emit("auth-expired");return}this.error="기존 이미지를 불러오지 못했습니다."}}})},nextPreviewRequestId(t){const e=Number(this.previewRequestSeq[t]||0)+1;return this.previewRequestSeq[t]=e,e},invalidatePreviewRequest(t){this.previewRequestSeq[t]=Number(this.previewRequestSeq[t]||0)+1},isCurrentPreviewRequest(t,e){return Number(this.previewRequestSeq[t]||0)===Number(e)},previewUrlForKind(t){return t==="scalp"?this.scalpPreviewUrl:this.thicknessPreviewUrl},setPreviewUrl(t,e){t==="scalp"?this.scalpPreviewUrl=e:this.thicknessPreviewUrl=e},revokePreviewUrl(t){const e=t==="scalp"?"scalpPreviewUrl":"thicknessPreviewUrl";this[e]&&URL.revokeObjectURL(this[e]),this[e]=""},save(){if(!this.canSubmit)return;this.error="",this.successMessage="";const t=this.duplicateRecord();if(t){this.pendingDuplicateRecord=t,this.showOverwriteConfirm=!0;return}this.persistRecord(null)},confirmOverwrite(){const t=this.pendingDuplicateRecord;this.showOverwriteConfirm=!1,this.pendingDuplicateRecord=null,this.persistRecord(t)},cancelOverwrite(){this.showOverwriteConfirm=!1,this.pendingDuplicateRecord=null},persistRecord(t){const e=t?t.personaCareMonthRecordIdx:this.isEditMode?this.editableRecord.personaCareMonthRecordIdx:null,n=this.isEditMode;this.saving=!0;const c={recordDate:this.recordDate||new Date().toISOString().slice(0,10),treatmentRecord:this.buildTreatmentRecord(),changeMemo:{text:this.changeText},aiFeedback:n?null:{text:`AI ${this.doctor.name} 의사가 진료 기록을 확인했습니다. 같은 조건으로 사진과 치료 기록을 계속 남겨 주세요.`},scalpImageFileId:this.scalpImage?null:this.existingScalpImageFileId,thicknessImageFileId:this.showThicknessImageFields?this.thicknessImage?null:this.existingThicknessImageFileId:null,hairTypeResult:n?null:this.diagnosisResults.hairTypeResult,thicknessResult:n||!this.showThicknessImageFields?null:this.diagnosisResults.thicknessResult,status:"SAVED"},a=new FormData;a.append("request",new Blob([JSON.stringify(c)],{type:"application/json"})),this.scalpImage&&a.append("scalpImage",this.scalpImage),this.thicknessImage&&this.showThicknessImageFields&&a.append("thicknessImage",this.thicknessImage);const s=e?this.$api.chat.updatePersonaCareRecord:this.$api.chat.savePersonaCareRecord,l=e?[this.carePlanId,e,a]:[this.carePlanId,a];s(...l,{success:p=>{this.saving=!1,this.error="",this.successMessage=this.saveSuccessMessage,this.$emit("saved",p)},error:()=>{this.saving=!1,this.successMessage="",this.error=this.saveFailureMessage||"진료 기록 저장에 실패했습니다."}})}}},ur={key:0},hr={key:1,class:"persona-form-section"},pr={key:2,class:"persona-form-section persona-medication-section"},mr={class:"persona-medication-heading"},gr={class:"persona-medication-field"},yr=["value","onInput"],fr={class:"persona-medication-field"},kr=["value","onInput"],vr={class:"persona-medication-field"},br=["value","onInput"],Ir=["onClick"],Mr={key:3,class:"persona-form-section persona-medication-section"},Dr={class:"persona-medication-heading"},Cr={class:"persona-medication-field"},Rr=["value","onInput"],wr={class:"persona-medication-field"},Pr=["value","onInput"],Tr={class:"persona-medication-field"},Sr=["value","onInput"],_r=["onClick"],xr={key:4,class:"persona-form-section"},Fr={key:5},Ar={class:"persona-file-picker"},Er={key:0,class:"persona-file-preview"},Nr=["src"],Or={class:"persona-file-meta"},Lr={key:0},qr={key:6},Ur={class:"persona-file-picker"},Br={key:0,class:"persona-file-preview"},Hr=["src"],Vr={class:"persona-file-meta"},Qr={key:0},Kr={key:7,class:"persona-success",role:"status"},jr={key:8,class:"persona-error",role:"alert"},zr=["disabled","aria-busy"],Yr={key:10,class:"persona-modal-backdrop",role:"alertdialog","aria-modal":"true"},Gr={class:"persona-confirm-modal"},Wr={class:"persona-confirm-actions"};function Jr(t,e,n,c,a,s){return o(),d("form",{class:y(["persona-month-form",{"persona-month-form--embedded":s.isEmbeddedMode}]),onSubmit:e[10]||(e[10]=D((...l)=>s.save&&s.save(...l),["prevent"]))},[n.hideTitle?u("",!0):(o(),d("h3",ur,h(s.formTitle),1)),s.showInputFields?(o(),d("label",hr,[e[11]||(e[11]=P(" 진료일 ")),q(i("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>a.recordDate=l),type:"date"},null,512),[[V,a.recordDate]])])):u("",!0),s.showInputFields?(o(),d("div",pr,[i("div",mr,[e[12]||(e[12]=i("strong",null,"먹는 약",-1)),i("button",{type:"button",onClick:e[1]||(e[1]=l=>s.addMedication("oralMeds"))},"약 추가")]),(o(!0),d(C,null,S(a.oralMeds,(l,p)=>(o(),d("div",{key:`oral-${p}`,class:"persona-medication-row"},[i("div",gr,[e[13]||(e[13]=i("span",{class:"persona-medication-column-label"},"약 이름",-1)),i("input",{value:l.name,type:"text",placeholder:"예: 피나스테리드 1mg 매일 복용",onInput:r=>s.updateMedication("oralMeds",p,"name",r.target.value)}
1,null,40,yr)]),i("div",fr,[e[14]||(e[14]=i("span",{class:"persona-medication-column-label"},"몇 주치",-1)),i("input",{value:l.weeks,type:"number",min:"1",inputmode:"numeric",placeholder:"몇 주치",onInput:r=>s.updateMedication("oralMeds",p,"weeks",r.target.value)},null,40,kr)]),i("div",vr,[e[15]||(e[15]=i("span",{class:"persona-medication-column-label"},"약 타가야 하는 날짜",-1)),i("input",{value:l.refillDate,type:"date",onInput:r=>s.updateMedicationRefillDate("oralMeds",p,r.target.value)},null,40,br)]),i("button",{type:"button",class:"persona-medication-remove",onClick:r=>s.removeMedication("oralMeds",p)},"삭제",8,Ir)]))),128))])):u("",!0),s.showInputFields?(o(),d("div",Mr,[i("div",Dr,[e[16]||(e[16]=i("strong",null,"바르는 약",-1)),i("button",{type:"button",onClick:e[2]||(e[2]=l=>s.addMedication("topicalMeds"))},"약 추가")]),(o(!0),d(C,null,S(a.topicalMeds,(l,p)=>(o(),d("div",{key:`topical-${p}`,class:"persona-medication-row"},[i("div",Cr,[e[17]||(e[17]=i("span",{class:"persona-medication-column-label"},"약 이름",-1)),i("input",{value:l.name,type:"text",placeholder:"예: 미녹시딜 5% 하루 1회",onInput:r=>s.updateMedication("topicalMeds",p,"name",r.target.value)},null,40,Rr)]),i("div",wr,[e[18]||(e[18]=i("span",{class:"persona-medication-column-label"},"몇 주치",-1)),i("input",{value:l.weeks,type:"number",min:"1",inputmode:"numeric",placeholder:"몇 주치",onInput:r=>s.updateMedication("topicalMeds",p,"weeks",r.target.value)},null,40,Pr)]),i("div",Tr,[e[19]||(e[19]=i("span",{class:"persona-medication-column-label"},"약 타가야 하는 날짜",-1)),i("input",{value:l.refillDate,type:"date",onInput:r=>s.updateMedicationRefillDate("topicalMeds",p,r.target.value)},null,40,Sr)]),i("button",{type:"button",class:"persona-medication-remove",onClick:r=>s.removeMedication("topicalMeds",p)},"삭제",8,_r)]))),128))])):u("",!0),s.showInputFields?(o(),d("label",xr,[e[20]||(e[20]=P(" 메모 ")),q(i("textarea",{"onUpdate:modelValue":e[3]||(e[3]=l=>a.changeText=l),placeholder:"이번 달 탈락량, 두피 상태, 부작용 등을 입력하세요."},null,512),[[V,a.changeText]])])):u("",!0),s.showImageFields?(o(),d("label",Fr,[e[21]||(e[21]=P(" 탈모 유형 분석 이미지 ")),i("div",Ar,[i("input",{ref:"scalpFileInput",class:"persona-file-input",type:"file",accept:"image/*",onChange:e[4]||(e[4]=l=>s.onImageChange("scalp",l))},null,544),a.scalpPreviewUrl?(o(),d("div",Er,[i("img",{src:a.scalpPreviewUrl,alt:"탈모 유형 분석 이미지 미리보기"},null,8,Nr)])):u("",!0),i("div",Or,[i("strong",null,h(s.scalpImageLabel),1),s.scalpImageHelp?(o(),d("span",Lr,h(s.scalpImageHelp),1)):u("",!0)]),i("button",{type:"button",class:"persona-file-button",onClick:e[5]||(e[5]=l=>s.openImageDialog("scalp"))},h(a.existingScalpImageFileId||a.scalpImage?"이미지 변경":"이미지 선택"),1)])])):u("",!0),s.showThicknessImageFields?(o(),d("label",qr,[e[22]||(e[22]=P(" 모발 굵기 이미지 ")),i("div",Ur,[i("input",{ref:"thicknessFileInput",class:"persona-file-input",type:"file",accept:"image/*",onChange:e[6]||(e[6]=l=>s.onImageChange("thickness",l))},null,544),a.thicknessPreviewUrl?(o(),d("div",Br,[i("img",{src:a.thicknessPreviewUrl,alt:"모발 굵기 이미지 미리보기"},null,8,Hr)])):u("",!0),i("div",Vr,[i("strong",null,h(s.thicknessImageLabel),1),s.thicknessImageHelp?(o(),d("span",Qr,h(s.thicknessImageHelp),1)):u("",!0)]),i("button",{type:"button",class:"persona-file-button",onClick:e[7]||(e[7]=l=>s.openImageDialog("thickness"))},h(a.existingThicknessImageFileId||a.thicknessImage?"이미지 변경":"이미지 선택"),1)])])):u("",!0),a.successMessage?(o(),d("div",Kr,h(a.successMessage),1)):u("",!0),a.error?(o(),d("div",jr,h(a.error),1)):u("",!0),n.hideSubmit?u("",!0):(o(),d("button",{key:9,type:"submit",class:"persona-primary",disabled:!s.canSubmit,"aria-busy":a.saving?"true":"false"},h(s.submitLabel),9,zr)),a.showOverwriteConfirm?(o(),d("div",Yr,[i("div",Gr,[e[23]||(e[23]=i("h4",null,"이미 저장된 진료일",-1)),e[24]||(e[24]=i("p",null,"선택한 진료일에 이미 저장된 기록이 있습니다. 기존 기록을 덮어쓰시겠습니까?",-1)),i("div",Wr,[i("button",{type:"button",class:"persona-secondary",onClick:e[8]||(e[8]=(...l)=>s.cancelOverwrite&&s.cancelOverwrite(...l))},"아니오"),i("button",{type:"button",class:"persona-confirm",onClick:e[9]||(e[9]=(...l)=>s.confirmOverwrite&&s.confirmOverwrite(...l))},"예")])])])):u("",!0)],34)}const Ye=x(cr,[["render",Jr],["__scopeId","data-v-28609ece"]]),Xr={name:"PersonaCarePlan",components:{PersonaCareCalendar:xe,PersonaCareMonthForm:Ye,PersonaCareRecordTabs:ae,PersonaRecordDateCalendar:ie},props:{doctor:{type:Object,default:()=>({name:"이전 진료"})},initialMedicalFiles:{type:Object,default:()=>({})},initialCarePlan:{type:Object,default:null},sessionDetail:{type:Object,default:()=>({})},readonly:{type:Boolean,default:!1},allowNewRecord:{type:Boolean,default:!0},openNewRecordOnLoad:{type:Boolean,default:!0},title:{type:String,default:"진료 기록 관리"},subtitle:{type:String,default:"저장된 진료일을 누르면 기록을 확인합니다."},summaryText:{type:String,default:""}},emits:["back","auth-expired","record-deleted"],data(){return{loading:!1,carePlan:null,selectedRecordId:-1,monthDetail:null,recordViewMode:"calendar",calendarVisibleDate:"",selectedStatusMonthIndex:-1,activeRecordTab:"images",imageUrls:{},imageFileIds:{},imageErrors:{},imageRequestSeq:{},actionError:""}},computed:{carePlanId(){return this.carePlan?.personaCarePlanIdx},records(){return this.carePlan?.months||[]},selectedRecordSummary(){return this.records.find(t=>Number(t.personaCareMonthRecordIdx)===Number(this.selectedRecordId))||null},selectedCareRecord(){return this.monthDetail||this.selectedRecordSummary},comparisonRecords(){const t=new Map;
1if(this.records.forEach(e=>{t.set(Number(e.personaCareMonthRecordIdx),e)}),this.selectedCareRecord){const e=Number(this.selectedCareRecord.personaCareMonthRecordIdx);t.set(e,{...t.get(e)||{},...this.selectedCareRecord})}return Array.from(t.values()).sort((e,n)=>Number(e.visitRound??e.monthIndex)-Number(n.visitRound??n.monthIndex))},currentTitle(){return this.recordViewMode==="detail"?`${this.selectedCareRecord?.visitLabel||"진료"} 기록`:this.recordViewMode==="form"?"새 진료 기록 입력":this.title},currentSubtitle(){return this.recordViewMode==="detail"||this.recordViewMode==="form"?"뒤로 버튼을 누르면 진료 기록 캘린더로 돌아갑니다.":this.subtitle},summaryTitle(){const t=this.safeDoctor.name||"이전 진료";return t==="이전 진료"?"이전 AI 진료 기록":`AI ${t} 의사와 함께하는 월별 관리`},safeDoctor(){return this.doctor||{name:"이전 진료"}},safeSessionDetail(){return this.sessionDetail||{}},diagnosisResults(){return{hairTypeResult:this.safeSessionDetail.hairTypeResult,thicknessResult:this.safeSessionDetail.thicknessResult}},selectedRecordImageUrls(){const t=this.selectedCareRecord;return t?{hairType:this.imageUrls[this.monthImageKey(t,"scalp")]||"",thickness:this.imageUrls[this.monthImageKey(t,"thickness")]||""}:{hairType:"",thickness:""}},sessionImageUrls(){return{hairType:this.selectedRecordImageUrls.hairType||this.imageUrls.sessionHairType||"",thickness:this.selectedRecordImageUrls.thickness||this.imageUrls.sessionThickness||""}},statusImageOptions(){return this.comparisonRecords.map(t=>({monthIndex:Number(t.visitRound??t.monthIndex),recordId:Number(t.personaCareMonthRecordIdx),label:t.visitLabel||this.monthLabel(t.visitRound??t.monthIndex),recordDate:t.recordDate,scalpUrl:this.imageUrls[this.monthImageKey(t,"scalp")]||"",thicknessUrl:this.imageUrls[this.monthImageKey(t,"thickness")]||"",thicknessResult:t.thicknessResult}))},showRecordForm(){return!!(this.selectedCareRecord&&!this.readonly&&this.carePlanId)},hideComparisonImages(){return this.recordViewMode==="form"},canDeleteRecord(){return!!(this.showRecordForm&&!this.allowNewRecord&&this.selectedCareRecord?.personaCareMonthRecordIdx)},activeEditFormRef(){return this.showRecordForm&&this.activeRecordTab==="images"?"imageEditForm":""},activeEditSubmitLabel(){return this.activeEditFormRef?"저장":""},showDetailActions(){return!!(this.recordViewMode==="detail"&&this.showRecordForm&&(this.activeEditFormRef||this.canDeleteRecord))},imageErrorMessage(){return Object.values(this.imageErrors||{}).some(Boolean)?"일부 의료 이미지를 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.":""}},mounted(){this.loadCarePlan()},beforeUnmount(){this.revokeImageUrls()},watch:{sessionDetail:{handler(){this.loadAllImages()},deep:!0}},methods:{loadCarePlan(t={}){if(this.initialCarePlan?.personaCarePlanIdx){this.setCarePlan(this.initialCarePlan,t);return}this.loading=!0,this.$api.chat.getLatestPersonaCarePlan({success:e=>{this.setCarePlan(e,t)},error:()=>{this.loading=!1}})},setCarePlan(t,e={}){if(this.carePlan=t,this.loading=!1,this.loadAllImages(),e.selectedRecordId){const c=this.records.find(a=>Number(a.personaCareMonthRecordIdx)===Number(e.selectedRecordId));c&&(e.openDetail===!1?(this.selectedRecordId=Number(c.personaCareMonthRecordIdx),this.selectedStatusMonthIndex=this.previousStatusMonthIndex(c),this.calendarVisibleDate=z(c.recordDate||new Date),this.monthDetail=null,this.recordViewMode="calendar"):this.applyRecordSelection(c,!0,e));return}if(this.allowNewRecord&&this.openNewRecordOnLoad&&!this.initialCarePlan?.personaCarePlanIdx&&!this.readonly){this.recordViewMode="form",this.calendarVisibleDate=z(new Date);return}const n=It(this.records);if(n){this.selectedRecordId=Number(n.personaCareMonthRecordIdx),this.selectedStatusMonthIndex=this.previousStatusMonthIndex(n),this.calendarVisibleDate=z(n.recordDate||new Date);return}this.calendarVisibleDate=z(new Date)},selectRecord(t){this.actionError="",this.applyRecordSelection(t,!0)},applyRecordSelection(t,e,n={}){t&&(this.selectedRecordId=Number(t.personaCareMonthRecordIdx),this.selectedStatusMonthIndex=this.previousStatusMonthIndex(t),this.calendarVisibleDate=z(t.recordDate||new Date),this.monthDetail
1=null,e&&(n.preserveActiveTab||(this.activeRecordTab="images"),this.recordViewMode="detail"),this.carePlanId&&e&&this.$api.chat.getPersonaCareRecord(this.carePlanId,this.selectedRecordId,{success:c=>{this.monthDetail=c,this.loadRecordImages(c)}}))},selectCalendarRecord(t){this.selectRecord(t)},selectStatusMonth(t){this.selectedStatusMonthIndex=Number(t)},handleSaved(t){this.actionError="";const e=this.recordViewMode==="form";this.monthDetail=e?null:t,this.selectedRecordId=Number(t?.personaCareMonthRecordIdx||this.selectedRecordId),this.selectedStatusMonthIndex=this.previousStatusMonthIndex(t),this.recordViewMode=e?"calendar":"detail",this.loadRecordImages(t),this.loadAllImages(),this.refreshCarePlan({selectedRecordId:t?.personaCareMonthRecordIdx||this.selectedRecordId,openDetail:!e,preserveActiveTab:!0})},refreshCarePlan(t={}){this.$api.chat.getLatestPersonaCarePlan({success:e=>{this.setCarePlan(e,t)}})},submitActiveEditForm(){if(!this.activeEditFormRef)return;const t=this.$refs[this.activeEditFormRef];(Array.isArray(t)?t[0]:t)?.save()},deleteSelectedRecord(){if(!this.canDeleteRecord||!confirm("선택한 진료 기록을 삭제하시겠습니까? 삭제 후 복구할 수 없습니다."))return;this.actionError="";const t=this.selectedCareRecord.personaCareMonthRecordIdx,e=this.carePlanId;this.$api.chat.deletePersonaCareRecord(e,t,{success:()=>{this.monthDetail=null,this.selectedRecordId=-1,this.selectedStatusMonthIndex=-1,this.recordViewMode="calendar",this.revokeImageUrls(),this.imageUrls={},this.$emit("record-deleted",{carePlanId:e,recordId:t}),this.refreshCarePlan()},error:()=>{this.actionError="진료 기록 삭제에 실패했습니다."}})},handleBack(){if(this.recordViewMode!=="calendar"){this.backToCalendar();return}this.$emit("back")},backToCalendar(){this.recordViewMode="calendar"},loadAllImages(){this.loadImage("sessionHairType",this.sessionImageFileId("hairType")),this.loadImage("sessionThickness",this.sessionImageFileId("thickness")),this.comparisonRecords.forEach(t=>this.loadRecordImages(t))},loadRecordImages(t){t&&(this.loadImage(this.monthImageKey(t,"scalp"),this.recordImageFileId(t,"scalp")),this.loadImage(this.monthImageKey(t,"thickness"),this.recordImageFileId(t,"thickness")))},recordImageFileId(t,e){return e==="scalp"?t.scalpImageFileId||t.hairTypeResult?.imageFileId||t.hairTypeResult?.medicalFileId||"":t.thicknessImageFileId||t.thicknessResult?.imageFileId||t.thicknessResult?.medicalFileId||""},sessionImageFileId(t){return t==="hairType"?this.safeSessionDetail.hairTypeImageFileId||this.safeSessionDetail.hairTypeResult?.imageFileId||this.safeSessionDetail.hairTypeResult?.medicalFileId||this.initialMedicalFiles?.scalpImageFileId||"":this.safeSessionDetail.thicknessImageFileId||this.safeSessionDetail.thicknessResult?.imageFileId||this.safeSessionDetail.thicknessResult?.medicalFileId||this.initialMedicalFiles?.thicknessImageFileId||""},monthImageKey(t,e){return`record-${t.personaCareMonthRecordIdx||t.monthIndex}-${e}`},monthLabel(t){return Fe(t)},latestStatusMonthIndex(){const t=this.comparisonRecords.map(e=>Number(e?.visitRound??e?.monthIndex)).filter(e=>Number.isFinite(e));return t.length?Math.max(...t):-1},previousStatusMonthIndex(t){const e=Number(t?.visitRound??t?.monthIndex??0);return e<=0?this.latestStatusMonthIndex():Math.max(0,e-1)},loadImage(t,e){if(!e){this.invalidateImageRequest(t),this.revokeImageUrl(t),this.imageFileIds[t]="",this.imageErrors[t]=!1;return}const n=this.imageFileIds[t];if(this.imageUrls[t]&&String(n)===String(e))return;this.imageUrls[t]&&this.revokeImageUrl(t),this.imageFileIds[t]=String(e);const c=this.nextImageRequestId(t);this.imageErrors[t]=!1,this.$api.chat.getPersonaMedicalFile(e,{success:a=>{this.isCurrentImageRequest(t,c)&&(this.imageUrls[t]=URL.createObjectURL(a))},error:a=>{if(this.isCurrentImageRequest(t,c)){if(Y(a)){this.$emit("auth-expired");return}this.imageErrors[t]=!0}}})},revokeImageUrl(t){this.imageUrls[t]&&URL.revokeObjectURL(this.imageUrls[t]),this.imageUrls[t]=""},nextImageRequestId(t){const e=Number(this.imageRequestSeq[t]||0)+1;return this.imageRequestSeq[t]=e,e},invalidateImageRequest(t){this.imageRequestSeq[t]=Number(this.imageRequestSeq[t]||0)+1},isCurrentImageRequest(t,e){return Number(this.imageRequestSeq[t]||0)===Number(e)},revokeImageUrls(){Object.keys(this.imageRequestSeq||{}
1).forEach(t=>this.invalidateImageRequest(t)),Object.keys(this.imageUrls||{}).forEach(t=>this.revokeImageUrl(t)),this.imageFileIds={}}}},Zr={class:"persona-step"},$r={class:"persona-step-head"},eo={class:"persona-step-scroll"},to={key:0,class:"persona-care-summary"},so={key:0},io={key:1,class:"persona-loading"},ao={key:2,class:"persona-action-error",role:"alert"},no={key:0,class:"persona-image-error",role:"alert"},ro={key:2,class:"persona-empty"},oo={key:1,class:"persona-empty"},lo={key:6,class:"persona-empty"};function co(t,e,n,c,a,s){const l=ie,p=xe,r=Ye,g=ae;return o(),d("section",Zr,[i("div",$r,[i("button",{type:"button",onClick:e[0]||(e[0]=(...k)=>s.handleBack&&s.handleBack(...k))},"‹"),i("div",null,[i("h2",null,h(s.currentTitle),1),i("p",null,h(s.currentSubtitle),1)])]),i("div",eo,[a.recordViewMode==="calendar"?(o(),d("div",to,[i("strong",null,h(s.summaryTitle),1),n.summaryText?(o(),d("span",so,h(n.summaryText),1)):u("",!0)])):u("",!0),a.loading?(o(),d("div",io,"케어 플랜을 불러오는 중...")):u("",!0),a.actionError?(o(),d("div",ao,h(a.actionError),1)):a.recordViewMode==="calendar"?(o(),d(C,{key:3},[M(l,{records:s.records,"visible-date":a.calendarVisibleDate,"selected-record-id":a.selectedRecordId,onSelectRecord:s.selectCalendarRecord,onChangeVisibleDate:e[1]||(e[1]=k=>a.calendarVisibleDate=k)},null,8,["records","visible-date","selected-record-id","onSelectRecord"]),M(p,{records:s.records,"selected-record-id":a.selectedRecordId,readonly:n.readonly,onSelectRecord:s.selectRecord},null,8,["records","selected-record-id","readonly","onSelectRecord"]),e[7]||(e[7]=i("div",{class:"persona-empty"},"확인할 진료 회차를 선택해 주세요.",-1))],64)):a.recordViewMode==="detail"?(o(),d(C,{key:4},[s.imageErrorMessage?(o(),d("div",no,h(s.imageErrorMessage),1)):u("",!0),s.selectedCareRecord?(o(),m(g,{key:1,"session-detail":s.safeSessionDetail,"selected-record":s.selectedCareRecord,"month-index":s.selectedCareRecord.visitRound||0,"session-image-urls":s.sessionImageUrls,"status-image-options":s.statusImageOptions,"selected-status-month-index":a.selectedStatusMonthIndex,"hide-comparison-images":s.hideComparisonImages,"active-tab-key":a.activeRecordTab,onSelectStatusMonth:s.selectStatusMonth,onActiveTabChange:e[3]||(e[3]=k=>a.activeRecordTab=k)},Et({_:2},[s.showRecordForm?{name:"image-edit",fn:pe(()=>[(o(),m(r,{ref:"imageEditForm",key:`edit-images-${s.selectedCareRecord.personaCareMonthRecordIdx}`,"form-mode":"images","hide-submit":"","care-plan-id":s.carePlanId,doctor:s.safeDoctor,"editable-record":s.selectedCareRecord,"existing-records":s.records,onSaved:s.handleSaved,onAuthExpired:e[2]||(e[2]=k=>t.$emit("auth-expired"))},null,8,["care-plan-id","doctor","editable-record","existing-records","onSaved"]))]),key:"0"}:void 0]),1032,["session-detail","selected-record","month-index","session-image-urls","status-image-options","selected-status-month-index","hide-comparison-images","active-tab-key","onSelectStatusMonth"])):u("",!0),s.selectedCareRecord?u("",!0):(o(),d("div",ro,"기록을 불러오는 중입니다."))],64)):a.recordViewMode==="form"?(o(),d(C,{key:5},[!n.readonly&&n.allowNewRecord&&s.carePlanId?(o(),m(r,{key:"new-record","hide-title":"","care-plan-id":s.carePlanId,doctor:s.safeDoctor,"initial-medical-files":n.initialMedicalFiles,"diagnosis-results":s.diagnosisResults,"existing-records":s.records,onSaved:s.handleSaved,onAuthExpired:e[4]||(e[4]=k=>t.$emit("auth-expired"))},null,8,["care-plan-id","doctor","initial-medical-files","diagnosis-results","existing-records","onSaved"])):(o(),d("div",oo,"새 진료 기록은 AI 진료 저장 후 입력할 수 있습니다."))],64)):(o(),d("div",lo,"아직 입력할 수 없는 진료 기록입니다."))]),s.showDetailActions?(o(),d("div",{key:0,class:y(["persona-care-action",{"persona-care-action--split":s.activeEditFormRef&&s.canDeleteRecord}])},[s.canDeleteRecord?(o(),d("button",{key:0,type:"button",class:"persona-care-delete",onClick:e[5]||(e[5]=(...k)=>s.deleteSelectedRecord&&s.deleteSelectedRecord(...k))}," 진료 기록 삭제 ")):u("",!0),s.activeEditFormRef?(o(),d("button",{key:1,type:"button",class:"persona-care-save",onClick:e[6]||(e[6]=(...k)=>s.submitActiveEditForm&&s.submitActiveEditForm(...k))}
1,h(s.activeEditSubmitLabel),1)):u("",!0)],2)):u("",!0)])}const Ge=x(Xr,[["render",co],["__scopeId","data-v-42aa0d4e"]]),uo={name:"PersonaIntro",components:{PersonaDoctorProfileModal:re,PersonaDoctorRecommendModal:oe},props:{doctors:{type:Array,default:()=>[]},hasHistory:{type:Boolean,default:!1}},emits:["start","select-doctor","open-history"],data(){return{activeDoctor:null,recommendModalOpen:!1,introStage:"poster"}},computed:{previewDoctors(){return this.doctors},showPoster(){return Dt(this.introStage)},canRecommendDoctor(){return!this.hasHistory&&this.doctors.length>=2}},methods:{doctorKeywordItems:Ke,revealDetails(){this.introStage=Mt(this.introStage),this.$nextTick(()=>{this.$refs.introDetails?.scrollIntoView({behavior:"smooth",block:"start"})})},photoStyle(t){return t.photoUrl||t.photoFileUrl?{backgroundImage:`url(${t.photoUrl||t.photoFileUrl})`,backgroundSize:"contain",backgroundPosition:"center",backgroundRepeat:"no-repeat"}:{backgroundColor:"#eef1f6"}}}},ho={class:"persona-intro"},po={key:0,class:"persona-poster-stage"},mo={key:1,ref:"introDetails",class:"persona-intro-details"},go={class:"persona-intro-scroll"},yo={key:0,class:"persona-doctor-preview"},fo={class:"persona-doctor-preview-head"},ko=["onClick"],vo={key:0},bo={key:1,class:"persona-doctor-badges"},Io={class:"persona-intro-action"};function Mo(t,e,n,c,a,s){const l=re,p=oe;return o(),d("section",ho,[s.showPoster?(o(),d("div",po,[e[8]||(e[8]=i("div",{class:"persona-poster-scroll"},[i("picture",{class:"persona-poster-picture"},[i("source",{media:"(min-width:431px)",srcset:"/images/persona/poster-pc.png"}),i("img",{class:"persona-poster",src:"/images/persona/poster-mobile.png",alt:"AI 의사 진료 소개"})])],-1)),i("div",{class:y(["persona-poster-action",{"persona-poster-action--split":n.hasHistory}])},[n.hasHistory?(o(),d("button",{key:0,type:"button",class:"persona-poster-history",onClick:e[0]||(e[0]=r=>t.$emit("open-history"))}," 내 AI 진료 기록 ")):u("",!0),i("button",{type:"button",class:"persona-poster-next",onClick:e[1]||(e[1]=(...r)=>s.revealDetails&&s.revealDetails(...r))}," 다음 ")],2)])):u("",!0),a.introStage==="details"?(o(),d("div",mo,[i("div",go,[e[10]||(e[10]=G('<div class="persona-intro-copy" data-v-2399b03a><p class="persona-eyebrow" data-v-2399b03a>MEDALO AI DOCTOR</p><h2 data-v-2399b03a>AI 탈모 의사와<br data-v-2399b03a>초진부터 지속 관리까지</h2><p data-v-2399b03a>탈모 유형과 모발 굵기 분석, 문진 기록을 바탕으로 환자별 케어 플랜을 저장합니다.</p></div><div class="persona-feature-grid" data-v-2399b03a><div data-v-2399b03a><strong data-v-2399b03a>탈모 유형 분석</strong><span data-v-2399b03a>탈모 유형 분류</span></div><div data-v-2399b03a><strong data-v-2399b03a>모발 굵기 분석</strong><span data-v-2399b03a>㎛ 단위 기록</span></div><div data-v-2399b03a><strong data-v-2399b03a>AI 종합 진단</strong><span data-v-2399b03a>등급 없이 유형 중심</span></div><div data-v-2399b03a><strong data-v-2399b03a>진료 기록 관리</strong><span data-v-2399b03a>진료일별 기록 저장</span></div></div>',2)),n.hasHistory?u("",!0):(o(),d("div",yo,[i("div",fo,[e[9]||(e[9]=i("h3",null,"AI 탈모 의사 소개",-1)),s.canRecommendDoctor?(o(),d("button",{key:0,type:"button",class:"persona-recommend-open",onClick:e[2]||(e[2]=r=>a.recommendModalOpen=!0)}," 의사 추천 ")):u("",!0)]),(o(!0),d(C,null,S(s.previewDoctors,r=>(o(),d("button",{key:r.personaAiDoctorIdx||r.id,type:"button",class:"persona-doctor-row",onClick:g=>a.activeDoctor=r},[i("div",{class:"persona-doctor-photo",style:O(s.photoStyle(r))},null,4),r.name?(o(),d("span",vo,"AI "+h(r.name)+" 의사",1)):u("",!0),s.doctorKeywordItems(r).length?(o(),d("div",bo,[(o(!0),d(C,null,S(s.doctorKeywordItems(r),g=>(o(),d("em",{key:g},h(g),1))),128))])):u("",!0)],8,ko))),128))]))]),i("div",Io,[i("button",{type:"button",class:"persona-primary",onClick:e[3]||(e[3]=r=>t.$emit("start"))},"AI 의사 진료 시작하기")])],512)):u("",!0),a.activeDoctor&&!n.hasHistory?(o(),m(l,{key:2,doctor:a.activeDoctor,onClose:e[4]||(e[4]=r=>a.activeDoctor=null),onSelect:e[5]||(e[5]=r=>t.$emit("select-doctor",r))},null,8,["doctor"])):u("",!0),a.recommendModalOpen?(o(),m(p,{key:3,doctors:n.doctors,onClose:e[6]||(e[6]=r=>a.recommendModalOpen=!1),onSelectDoctor:e[7]||(e[7]=r=>t.$emit("select-doctor",r))},null,8,["doctors"])):u("",!0)])}const We=x(uo,[["render",Mo],["__scopeId","data-v-2399b03a"]]),Do={name:"PersonaWorkflow",components:{PersonaIntro:We,PersonaDoctorList:ze,PersonaHairTypeStep:Qe,PersonaThicknessStep:Ve,PersonaQuestionnaire:He,PersonaResult:Be,PersonaCarePlan:Ge},emits:["close","auth-expired"],data(){return{screen:"intro",doctors:[],treatmentPlans:[],historySummary:{hasHistory:!1},selectedDoctor:null,loading:!1,authExpiredHandled:!1,visitLockNotice:{open:!1,message:""},actionNotice:{open:!1,message:""},state:{hairTypeResult:null,thicknessResult:null,hairTypeFile:null,thicknessFile:null,questionnaireAnswers:{},finalDiagnosis:null,session:null}}},mounted(){this.loadInitialData()},computed:{shellTitle(){return ve().title},shellClass(){return Ft(this.screen)},shellStyle(){return{"--persona-shell-max-width":`${ve().maxWidthPx}px`}},initialCareImages(){return xt(this.state.hairTypeResult,this.state.thicknessResult)},hasVisitHistory(){return ke(this.historySummary)},isRepeatVisit(){return this.hasVisitHistory},activeInitialHairType(){return _t(this.historySummary)||this.state.hairTypeResult?.primaryType||""},canChooseDoctor(){return!this.hasVisitHistory},historyCarePlan(){return this.historySummary?.latestCarePlan||null},historySessionDetail(){return this.historySummary?.initialSession||this.historySummary?.latestSession||{}},historyDoctor(){const t=this.historySessionDetail?.personaAiDoctorIdx;return this.doctors.find(e=>Number(e.personaAiDoctorIdx)===Number(t))||this.selectedDoctor||{personaAiDoctorIdx:t,name:"이전 진료"}}},methods:{loadInitialData(){this.loading=!0;const t=this.hasCustomerToken();let e=t?3:2;
1const n=()=>{e-=1,e<=0&&(this.loading=!1)};this.$api.chat.getPersonaDoctors({success:c=>{const a=Array.isArray(c)?c:c?.list;Array.isArray(a)&&a.length&&(this.doctors=a),n()},error:c=>{if(this.isAuthExpiredError(c)){this.handleAuthExpired();return}n()}}),this.$api.chat.getPersonaTreatmentPlans({success:c=>{const a=Array.isArray(c)?c:c?.list;this.treatmentPlans=Array.isArray(a)?a:[],n()},error:c=>{if(this.isAuthExpiredError(c)){this.handleAuthExpired();return}n()}}),t&&this.$api.chat.getPersonaHistorySummary({success:c=>{this.applyHistorySummary(c),n()},error:c=>{if(this.isAuthExpiredError(c)){this.handleAuthExpired();return}this.historySummary={hasHistory:!1},n()}})},hasCustomerToken(){if(this.$store?.getters?.["chat/GET_USER_INFO"]?.token)return!0;try{return!!JSON.parse(localStorage.getItem("user-info")||"{}")?.token}catch{return!1}},isAuthExpiredError(t){return Y(t)},handleAuthExpired(){this.authExpiredHandled||(this.authExpiredHandled=!0,this.loading=!1,this.$emit("auth-expired"))},clearVisitState(){this.selectedDoctor=null,this.state={hairTypeResult:null,thicknessResult:null,hairTypeFile:null,thicknessFile:null,questionnaireAnswers:{},finalDiagnosis:null,session:null}},applyHistorySummary(t){const e=t||{hasHistory:!1};if(!ke(e)){this.historySummary={hasHistory:!1},this.clearVisitState();return}this.historySummary=e;const n=St(this.historySessionDetail);Object.keys(n).length&&(this.state.questionnaireAnswers={...n}),this.hasVisitHistory&&(this.selectedDoctor=this.historyDoctor)},handleCareRecordDeleted(){if(!this.hasCustomerToken()){this.historySummary={hasHistory:!1},this.clearVisitState(),this.screen="intro";return}this.$api.chat.getPersonaHistorySummary({success:t=>{this.applyHistorySummary(t),this.hasVisitHistory||(this.screen="intro")},error:t=>{if(this.isAuthExpiredError(t)){this.handleAuthExpired();return}this.historySummary={hasHistory:!1},this.clearVisitState(),this.screen="intro"}})},openPersonaHistory(){this.screen="history"},startPersona(){if(this.isRepeatVisit){const t=Tt(this.historyCarePlan?.months||[]);if(!t.canStart){this.visitLockNotice={open:!0,message:t.message};return}this.selectedDoctor=this.historyDoctor,this.screen="hairtype";return}if(!this.doctors.length){this.showActionNotice("등록된 AI 의사가 없습니다. 병원 관리자에게 문의해 주세요.");return}this.screen="doctors"},closeVisitLockNotice(){this.visitLockNotice={open:!1,message:""}},showActionNotice(t){this.actionNotice={open:!0,message:t}},closeActionNotice(){this.actionNotice={open:!1,message:""}},backFromHairType(){this.screen=this.isRepeatVisit?"intro":"doctors"},selectDoctor(t){if(!this.canChooseDoctor){this.selectedDoctor=this.historyDoctor,this.screen="hairtype";return}this.selectedDoctor=t,this.screen="hairtype"},completeHairType(t){const{sourceFile:e,...n}=t||{};if(this.state.hairTypeFile=e||null,this.state.hairTypeResult=this.isRepeatVisit?fe(this.historySummary,n):n,$(this.activeInitialHairType)){this.screen="thickness";return}if(this.isRepeatVisit){this.saveRepeatCareRecord();return}this.screen="questionnaire"},completeThickness(t){const{sourceFile:e,...n}=t||{};if(this.state.thicknessFile=e||null,this.state.thicknessResult=n,this.isRepeatVisit){this.saveRepeatCareRecord();return}if(this.canSkipQuestionnaire()){this.generateComprehensiveDiagnosis();return}this.screen="questionnaire"},completeQuestionnaire(t){this.state.questionnaireAnswers=this.withQuestionnaireDemographics(t),this.generateComprehensiveDiagnosis()},withQuestionnaireDemographics(t={}){const e={...t||{}};delete e.birthDate,delete e.birth_date,e.gender!=="여성"&&(delete e.pregnancyStatus,delete e.pregnancy_status);const c=Pt(e.fullAge??e.full_age??e.age)||e.ageGroup;return{...e,ageGroup:c}},generateComprehensiveDiagnosis(){const t=this.selectedTreatmentPlan();this.loading=!1,this.screen="result-loading",this.$api.chat.generatePersonaComprehensiveDiagnosis({personaAiDoctorIdx:this.selectedDoctor.personaAiDoctorIdx,hairTypeResult:this.state.hairTypeResult,thicknessResult:this.state.thicknessResult,questionnaire:this.state.questionnaireAnswers,treatmentPlanSnapshot:t},{success:e=>{this.state.finalDiagnosis=this.normalizeComprehensiveDiagnosis(e,t),this.screen="result"},error:()=>
1{this.state.finalDiagnosis=this.fallbackComprehensiveDiagnosis(t),this.screen="result"}})},selectedTreatmentPlan(){return Rt(this.treatmentPlans,{hairLossType:this.state.hairTypeResult?.primaryType,gender:this.state.questionnaireAnswers?.gender,ageGroup:this.state.questionnaireAnswers?.ageGroup,pregnancyStatus:wt(this.state.questionnaireAnswers)})},normalizeComprehensiveDiagnosis(t,e){return{primaryType:t?.primaryType||this.state.hairTypeResult?.primaryType||"탈모 유형 분석 완료",thicknessUm:t?.thicknessUm??this.state.thicknessResult?.thicknessUm??null,doctorFeedback:t?.doctorFeedback||`AI ${this.selectedDoctor.name} 의사가 월별 변화를 계속 확인하도록 권고했습니다.`,doctorFeedbackSources:t?.doctorFeedbackSources||t?.doctor_feedback_sources||"",tags:Array.isArray(t?.tags)&&t.tags.length?t.tags:this.defaultDiagnosisTags(t),treatmentPlanSnapshot:t?.treatmentPlanSnapshot||e}},defaultDiagnosisTags(t={}){return t?.thicknessUm!=null||this.state.thicknessResult?.thicknessUm!=null?["유형 분석","모발 굵기","문진 반영"]:["유형 분석","문진 반영"]},fallbackComprehensiveDiagnosis(t){return this.normalizeComprehensiveDiagnosis({},t)},canSkipQuestionnaire(){return Ct(this.historySummary,this.state.questionnaireAnswers)},backFromResult(){this.screen=this.canSkipQuestionnaire()?"thickness":"questionnaire"},completeSessionSave(t){this.state.session=t,this.screen="care"},saveRepeatCareRecord(){const t=this.historyCarePlan?.personaCarePlanIdx;if(!t){this.showActionNotice("저장할 AI 진료 케어 플랜을 찾을 수 없습니다.");return}this.loading=!0;const e={recordDate:new Date().toISOString().slice(0,10),treatmentRecord:{},changeMemo:null,aiFeedback:null,scalpImageFileId:null,thicknessImageFileId:null,hairTypeResult:fe(this.historySummary,this.state.hairTypeResult),thicknessResult:$(this.activeInitialHairType)?this.state.thicknessResult:null,status:"SAVED"},n=new FormData;n.append("request",new Blob([JSON.stringify(e)],{type:"application/json"})),this.state.hairTypeFile&&n.append("scalpImage",this.state.hairTypeFile),this.state.thicknessFile&&$(this.activeInitialHairType)&&n.append("thicknessImage",this.state.thicknessFile),this.$api.chat.savePersonaCareRecord(t,n,{success:c=>{this.loading=!1,this.state.session={...this.historySessionDetail||{},hairTypeResult:e.hairTypeResult,thicknessResult:e.thicknessResult},this.screen="care",this.historySummary={...this.historySummary,latestCarePlan:{...this.historyCarePlan||{},months:[...this.historyCarePlan&&this.historyCarePlan.months||[],c]}}},error:c=>{if(this.loading=!1,this.isAuthExpiredError(c)){this.handleAuthExpired();return}this.showActionNotice("현재 진료 기록 저장에 실패했습니다. 분석 이미지를 다시 확인해 주세요.")}})},hasUnsavedData(){return!!(this.state.hairTypeResult||this.state.thicknessResult||this.state.finalDiagnosis)},confirmClose(){this.hasUnsavedData()&&this.screen!=="care"&&!window.confirm("저장되지 않은 진료 정보가 있습니다. 닫으시겠습니까?")||this.$emit("close")}}},Co={class:"popup-wrap persona-popup-wrap",role:"dialog","aria-modal":"true"},Ro={class:"pop-head persona-pop-head"},wo={class:"title"},Po={class:"persona-pop-body"},To={key:6,class:"persona-step persona-comprehensive-skeleton","aria-label":"AI 종합 진단 생성 중","aria-busy":"true"},So={key:0,class:"persona-loading-overlay"},_o={class:"persona-notice-modal",role:"alertdialog","aria-modal":"true","aria-labelledby":"persona-visit-lock-title"},xo={class:"persona-notice-modal",role:"alertdialog","aria-modal":"true","aria-labelledby":"persona-action-notice-title"};function Fo(t,e,n,c,a,s){const l=We,p=Ge,r=ze,g=Qe,k=Ve,_=He,v=Be;return o(),d("div",Co,[i("div",{class:y(["popup persona-shell",s.shellClass]),style:O(s.shellStyle)},[i("div",Ro,[i("span",wo,[e[10]||(e[10]=i("i",{class:"mdi mdi-robot-outline title-icon","aria-hidden":"true"},null,-1)),P(h(s.shellTitle),1)]),i("button",{type:"button",class:"popup-close persona-close",title:"닫기",onClick:e[0]||(e[0]=(...I)=>s.confirmClose&&s.confirmClose(...I))},[M(T,{icon:"mdi:mdi-close"})])]),i("div",Po,[a.screen==="intro"?(o(),m(l,{key:0,doctors:a.doctors,"has-history":s.hasVisitHistory,onOpenHistory:s.openPersonaHistory,onStart:s.startPersona,onSelectDoctor:s.selectDoctor},null,8,["doctors","has-history","onOpenHistory","onStart","onSelectDoctor"])):a.screen==="history"?(o(),m(p,{key:1,doctor:s.historyDoctor,"initial-care-plan":s.historyCarePlan,"session-detail":s.historySessionDetail,title:"내 AI 진료 기록 관리",subtitle:"저장된 회차를 누르면 이전 기록을 확인하고 입력 정보를 수정할 수 있습니다.","allow-new-record":!1,onBack:e[1]||(e[1]=I=>a.screen="intro"),onAuthExpired:s.handleAuthExpired,onRecordDeleted:s.handleCareRecordDeleted},null,8,["doctor","initial-care-plan","session-detail","onAuthExpired","onRecordDeleted"])):a.screen==="doctors"?(o(),m(r,{key:2,doctors:a.doctors,onBack:e[2]||(e[2]=I=>a.screen="intro"),onSelectDoctor:s.selectDoctor},null,8,["doctors","onSelectDoctor"])):a.screen==="hairtype"?(o(),m(g,{key:3,doctor:a.selectedDoctor,"repeat-visit":s.isRepeatVisit,"locked-primary-type":s.activeInitialHairType,onBack:s.backFromHairType,onComplete:s.completeHairType},null,8,["doctor","repeat-visit","locked-primary-type","onBack","onComplete"])):a.screen==="thickness"?(o(),m(k,{key:4,doctor:a.selectedDoctor,"skip-questionnaire":s.isRepeatVisit||s.canSkipQuestionnaire(),onBack:e[3]||(e[3]=I=>a.screen="hairtype"),onComplete:s.completeThickness},null,8,["doctor","skip-questionnaire","onComplete"])):a.screen==="questionnaire"?(o(),m(_,{key:5,modelValue:a.state.questionnaireAnswers,"onUpdate:modelValue":e[4]||(e[4]=I=>a.state.questionnaireAnswers=I),doctor:a.selectedDoctor,onBack:e[5]||(e[5]=I=>a.screen="thickness"),onComplete:s.completeQuestionnaire},null,8,["modelValue","doctor","onComplete"])):a.screen==="result-loading"?(o(),d("section",To,e[11]||(e[11]=[G('<div class="persona-comprehe
1nsive-skeleton-head" data-v-04530ef8><span class="persona-comprehensive-skeleton-back" aria-hidden="true" data-v-04530ef8>‹</span><div data-v-04530ef8><h2 data-v-04530ef8>AI 종합 진단</h2><p data-v-04530ef8>병력 청취 내용을 종합해 결과를 생성하고 있습니다.</p></div></div><div class="persona-comprehensive-skeleton-scroll" data-v-04530ef8><div class="persona-comprehensive-skeleton-main" data-v-04530ef8><span data-v-04530ef8>AI 종합 진단</span><div class="persona-comprehensive-skeleton-title persona-comprehensive-skeleton-pulse" data-v-04530ef8></div><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-line--short persona-comprehensive-skeleton-pulse" data-v-04530ef8></div><div class="persona-comprehensive-skeleton-tags" data-v-04530ef8><i class="persona-comprehensive-skeleton-pulse" data-v-04530ef8></i><i class="persona-comprehensive-skeleton-pulse" data-v-04530ef8></i><i class="persona-comprehensive-skeleton-pulse" data-v-04530ef8></i></div></div><div class="persona-comprehensive-skeleton-card" data-v-04530ef8><h4 data-v-04530ef8>AI 의사 소견</h4><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-line--wide persona-comprehensive-skeleton-pulse" data-v-04530ef8></div><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-pulse" data-v-04530ef8></div><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-line--mid persona-comprehensive-skeleton-pulse" data-v-04530ef8></div></div><div class="persona-comprehensive-skeleton-card" data-v-04530ef8><h4 data-v-04530ef8>권고 치료 계획</h4><div class="persona-comprehensive-skeleton-list" data-v-04530ef8><span class="persona-comprehensive-skeleton-dot persona-comprehensive-skeleton-pulse" data-v-04530ef8></span><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-line--wide persona-comprehensive-skeleton-pulse" data-v-04530ef8></div></div><div class="persona-comprehensive-skeleton-list" data-v-04530ef8><span class="persona-comprehensive-skeleton-dot persona-comprehensive-skeleton-pulse" data-v-04530ef8></span><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-line--mid persona-comprehensive-skeleton-pulse" data-v-04530ef8></div></div><div class="persona-comprehensive-skeleton-list" data-v-04530ef8><span class="persona-comprehensive-skeleton-dot persona-comprehensive-skeleton-pulse" data-v-04530ef8></span><div class="persona-comprehensive-skeleton-line persona-comprehensive-skeleton-pulse" data-v-04530ef8></div></div></div></div><div class="persona-comprehensive-skeleton-action" data-v-04530ef8><div class="persona-comprehensive-skeleton-button persona-comprehensive-skeleton-pulse" data-v-04530ef8></div></div>',3)]))):a.screen==="result"?(o(),m(v,{key:7,doctor:a.selectedDoctor,"hair-type-result":a.state.hairTypeResult,"thickness-result":a.state.thicknessResult,"questionnaire-answers":a.state.questionnaireAnswers,"final-diagnosis":a.state.finalDiagnosis,"treatment-plans":a.treatmentPlans,"is-repeat-visit":s.hasVisitHistory,onBack:s.backFromRe
1sult,onSaved:s.completeSessionSave},null,8,["doctor","hair-type-result","thickness-result","questionnaire-answers","final-diagnosis","treatment-plans","is-repeat-visit","onBack","onSaved"])):a.screen==="care"?(o(),m(p,{key:8,doctor:a.selectedDoctor,"initial-medical-files":s.initialCareImages,"session-detail":a.state.session,"allow-new-record":!1,"open-new-record-on-load":!1,onBack:s.confirmClose,onAuthExpired:s.handleAuthExpired,onRecordDeleted:s.handleCareRecordDeleted},null,8,["doctor","initial-medical-files","session-detail","onBack","onAuthExpired","onRecordDeleted"])):u("",!0)]),a.loading&&a.screen!=="result-loading"?(o(),d("div",So,"불러오는 중...")):u("",!0),a.visitLockNotice.open?(o(),d("div",{key:1,class:"persona-notice-backdrop",onClick:e[7]||(e[7]=D((...I)=>s.closeVisitLockNotice&&s.closeVisitLockNotice(...I),["self"]))},[i("section",_o,[e[12]||(e[12]=i("h2",{id:"persona-visit-lock-title"},"AI 의사 진료 안내",-1)),i("p",null,h(a.visitLockNotice.message),1),i("button",{type:"button",class:"persona-primary",onClick:e[6]||(e[6]=(...I)=>s.closeVisitLockNotice&&s.closeVisitLockNotice(...I))},"확인")])])):u("",!0),a.actionNotice.open?(o(),d("div",{key:2,class:"persona-notice-backdrop",onClick:e[9]||(e[9]=D((...I)=>s.closeActionNotice&&s.closeActionNotice(...I),["self"]))},[i("section",xo,[e[13]||(e[13]=i("h2",{id:"persona-action-notice-title"},"AI 의사 진료 안내",-1)),i("p",null,h(a.actionNotice.message),1),i("button",{type:"button",class:"persona-primary",onClick:e[8]||(e[8]=(...I)=>s.closeActionNotice&&s.closeActionNotice(...I))},"확인")])])):u("",!0)],6)])}const Je=x(Do,[["render",Fo],["__scopeId","data-v-04530ef8"]]),Ao={props:{currentPage:{type:[Object,Function],required:!0}},emits:["closePopup"],data(){return{setPage:null,clinicalIdx:null,type:null}},mounted(){this.setPage=this.currentPage},methods:{closePopup(){this.$emit("closePopup","clincal")},setMovePage({page:t,id:e,type:n}){e&&(this.clinicalIdx=e),n&&(this.type=n),this.setPage=ue(t)}}},Eo={class:"popup-wrap"},No={class:"popup w1000"};function Oo(t,e,n,c,a,s){return o(),d("div",Eo,[i("div",No,[i("button",{type:"button",class:"popup-close",onClick:e[0]||(e[0]=l=>s.closePopup())},[M(T,{icon:"mdi:mdi-close"})]),(o(),m(Nt(a.setPage),{"clinical-idx":a.clinicalIdx,type:a.type,onMovePage:s.setMovePage},null,40,["clinical-idx","type","onMovePage"]))])])}const Xe=x(Ao,[["render",Oo]]),Lo={emits:["open-predict","open-hair-count","open-check-login","open-self-hairLoss","open-hospital-map","open-product-list","open-hair-thick-status","open-hair-loss-blog","open-persona-workflow","open-daily-care"],data(){return{userType:0,loginFlag:!1,isMobile:!1,hasMobileCarouselOverflow:!1,onBoardBtn:[{id:"btn_07",text:"AI 의사 진료",type:[4],icon:"mdi mdi-doctor",tooltip:"AI 의사 진료",img:"/images/buttons/persona.png",info:"AI 의사 진료",callback:()=>{this.loginFlag?this.$emit("open-persona-workflow"):this.$emit("open-check-login")}},{id:"btn_08",text:"데일리 케어",type:[4],icon:"mdi mdi-calendar-check",tooltip:"데일리 케어",img:"/images/buttons/dailycare.png",info:"데일리 케어",callback:()=>{this.loginFlag?this.$emit("open-daily-care"):this.$emit("open-check-login")}},{id:"btn_02",text:"수술, 치료 후 내 모습",type:[4],icon:"mdi-account-box-multiple-outline",tooltip:"수술(치료)후 변화된 모습을 미리 확인할 수 있습니다.",img:"/images/buttons/surgery.png",info:"수술(치료)후 내 모습 미리보기",callback:()=>{this.loginFlag?this.$emit("open-predict"):this.$emit("open-check-login")}},{id:"btn_04",text:"주변 병원 추천",type:[4],icon:"mdi mdi-hospital-marker",tooltip:"현재 위치를 기준으로 가까운 탈모 병원을 추천해드려요.",img:"/images/buttons/hospital.png",info:"가까운 탈모 병원 검색",callback:()=>{this.$emit("open-hospital-map")}},{id:"btn_06",text:"탈모 블로그",type:[4],icon:"mdi mdi-store-plus",tooltip:"탈모 관련 소식을 업데이트합니다.",img:"/images/buttons/blog.png",info:"탈모 블로그",callback:()=>{this.loginFlag?this.$emit("open-hair-loss-blog"):this.$emit("open-check-login")}}
1,{id:"btn_05",text:"탈모 제품 추천",type:[4],icon:"mdi mdi-store-plus",tooltip:"탈모 관리 제품을 추천해드려요.",img:"/images/buttons/product.png",info:"탈모 관리 제품 추천",callback:()=>{this.$emit("open-product-list")}}]}},computed:{filteredOnboardBtns(){return this.onBoardBtn.filter(t=>t.type.indexOf(this.userType)>-1)},userInfo(){return this.$__GET_USER_INFO}},watch:{userInfo(t){this.loginFlag=this.hasValidLogin(t)}},updated(){this.$nextTick(this.updateMobileCarouselOverflow)},mounted(){this.loginFlag=this.hasValidLogin(this.getLoginInfo()),this.userType=4,this.checkIsMobile(),window.addEventListener("resize",this.checkIsMobile)},methods:{hasValidLogin(t){return!!t?.token},checkIsMobile(){this.isMobile=window.innerWidth<768,this.$nextTick(this.updateMobileCarouselOverflow)},updateMobileCarouselOverflow(){const t=this.$refs.mobileCarousel;this.hasMobileCarouselOverflow=!!(this.isMobile&&t&&t.scrollWidth>t.clientWidth)},scrollMobileCarousel(t){const e=this.$refs.mobileCarousel;e&&e.scrollBy({left:t*e.clientWidth*.8,behavior:"smooth"})}},beforeUnmount(){window.removeEventListener("resize",this.checkIsMobile)}},qo={class:"on-board"},Uo={key:0,class:"welcome-mobileCarousel"},Bo={ref:"mobileCarousel",class:"welcome-mobileList"},Ho=["onClick"],Vo=["title"],Qo={key:1,class:"welcome-list"},Ko=["onClick"],jo=["title"],zo=["src"];function Yo(t,e,n,c,a,s){return o(),d("div",qo,[e[4]||(e[4]=i("div",{class:"welcome-desc"},[P(" 당신의 머리카락이 빠지는 이유?"),i("br"),P(" 혹시 나도 탈모일까 걱정되시나요?"),i("br"),i("p",null,[i("span",{class:"point1"},"MedAlo"),P("로 먼저 확인해보세요."),i("br")]),i("p",{class:"noticeInfo"},"MedAlo는 의학적 진단 또는 치료 목적의 서비스가 아니며, 탈모 관련 정보를 제공합니다.")],-1)),a.isMobile?(o(),d("div",Uo,[a.hasMobileCarouselOverflow?(o(),d("button",{key:0,type:"button",class:"welcome-mobileCarousel__arrow welcome-mobileCarousel__arrow--prev","aria-label":"이전 버튼 보기",onClick:e[0]||(e[0]=l=>s.scrollMobileCarousel(-1))},e[2]||(e[2]=[i("i",{class:"mdi mdi-chevron-left"},null,-1)]))):u("",!0),i("ul",Bo,[(o(!0),d(C,null,S(s.filteredOnboardBtns,l=>(o(),d("li",{key:l.id,onClick:p=>l.callback()},[i("button",{type:"button",class:y(["btn-welcome",[l.id,"group"]]),title:l.tooltip,style:O({backgroundImage:`url(${l.img})`})},null,14,Vo),i("span",{class:y(["text",`text-${l.id}`])},h(l.text),3)],8,Ho))),128))],512),a.hasMobileCarouselOverflow?(o(),d("button",{key:1,type:"button",class:"welcome-mobileCarousel__arrow welcome-mobileCarousel__arrow--next","aria-label":"다음 버튼 보기",onClick:e[1]||(e[1]=l=>s.scrollMobileCarousel(1))},e[3]||(e[3]=[i("i",{class:"mdi mdi-chevron-right"},null,-1)]))):u("",!0)])):(o(),d("ul",Qo,[(o(!0),d(C,null,S(s.filteredOnboardBtns,l=>(o(),d("li",{key:l.id,onClick:p=>l.callback()},[i("button",{type:"button",class:y(["btn-welcome",[l.id,"group"]]),title:l.tooltip},[i("img",{src:l.img,alt:"buttonIcon",class:y(["btnImage",`btnImage-${l.id}`])},null,10,zo)],10,jo),i("span",{class:y(["text",`text-${l.id}`])},h(l.text),3)],8,Ko))),128))]))])}const Ze=x(Lo,[["render",Yo]]),Go="/images/bulletin.png",Wo="/images/friendIcon.png",Jo="/images/userIcon.png",Xo={props:{loginName:{type:String,required:!1},rewardBadgeCnt:{type:Number,default:0},initialPopup:{type:String,default:null},initialIdx:{type:Number,default:null}},components:{PopMyAccountMgmt:Qt,PopMyRecommendCode:Kt,PopNotice:jt,PopEvent:Yt,PopEventReward:Gt,PopHairLossNews:Jt},emits:["openPop","closePop","open-lite-login","refresh-reward-badge"],data(){return{userName:null,name:null,fontSize:"medium",theme:"light",userType:0,myaccountmgmtFlag:!1,myrecommendCodeFlag:!1,noticeFlag:!1,eventFlag:!1,eventRewardFlag:!1,hairLossNewsFlag:!1}},computed:{safeLoginName(){return console.log("setting-loginName-props:",this.loginName),this.loginName||""}},mounted(){this.fontSize=this.getUserFont()||"medium",this.theme=this.getUserTheme()||"light",this.userType=this.$__GET_USER_INFO.groupIdx,this.initialPopup==="couponbook"?this.eventRewardFlag=!0:this.initialPopup==="notice"?this.noticeFlag=!0:this.initialPopup==="event"&&(this.eventFlag=!0)},methods:{openLoginPop(){this.$emit("open-lite-login")},setLogout(){confirm("로그아웃 하시겠습니까?")&&(this.$__SET_USER_INFO({token:null}),this.removeLoginInfo(),sessionStorage.removeItem("event-popup-shown"),this.setPopupClose(),this.$router.go(0))},setPopupClose(){this.$emit("closePop",!1)},setFont(t){switch(this.setUserFont(t),t){case"small":this.fontSize="small";break;case"big":this.fontSize="big";break;default:this.fontSize="medium";break}document.querySelector("html").setAttribute("data-font-size",this.fontSize)},setTheme(t){switch(this.setUserTheme(t),t){case"dark":this.theme="dark";break;default:this.theme="light";break}document.body.className=this.theme},myAccountPop(){this.myaccountmgmtFlag=!0},closeMyAccountPop(){this.myaccountmgmtFlag=!1},myRecommendCodePop(){this.myrecommendCodeFlag=!0},closeMyRecommendCodePop(){this.myrecommendCodeFlag=!1},noticePop(){this.noticeFlag=!0},closeNoticePop(){this.noticeFlag=!1},eventPop(){this.eventFlag=!0},closeEventPop(){this.eventFlag=!1},eventRewardPop(){this.eventRewardFlag=!0},closeEventRewardPop(){this.eventRewardFlag=!1,this.$emit("refresh-reward-badge")},hairLossNewsPop(){this.hairLossNewsFlag=!0},closeHairLossNewsPop(){this.hairLossNewsFlag=!1}}},Zo={class:"chat-setting"},$o={class:"setting-wrap"},el={class:"setting-top"},tl={class:"setting-top-info"},sl={class:"chat-user"},il={class:"setting-content"},al={key:0,class:"setting-box"},nl={class:"setting-box-categories"},rl={key:0,class:"reward-badge"},ol={class:"setting-box"},ll={class:"setting-box-tit"},dl={key:1,class:"setting-box"};function cl(t,e,n,c,a,s){const l=R("PopMyAccountMgmt"),p=R("PopMyRecommendCode"),r=R("PopNotice"),g=R("PopEvent"),k=R("PopEventReward"),_=R("PopHairLossNews");return o(),d("div",Zo,[i("div",{class:"chat-setting__bg",onClick:e[0]||(e[0]=v=>s.setPopupClose())}),i("div",$o,[i("div",el,[i("div",tl,[i("span",sl,h(s.safeLoginName?s.safeLoginName+"님 환영합니다.":""),1),s.safeLoginName?(o(),d("button",{key:0,t
1ype:"button",class:"btn-line btn-line-xs",onClick:e[1]||(e[1]=v=>s.setLogout())}," 로그아웃 ")):(o(),d("button",{key:1,type:"button",class:"btn-line btn-line-xs",onClick:e[2]||(e[2]=v=>s.openLoginPop())}," 로그인 "))]),i("button",{type:"button",class:"btn-close",title:"창닫기",onClick:e[3]||(e[3]=v=>s.setPopupClose())},[M(T,{icon:"mdi:mdi-close"})])]),i("div",il,[s.safeLoginName?(o(),d("div",al,[e[20]||(e[20]=i("div",{class:"setting-box-tit arrayCenter"},[i("img",{src:Go,alt:"bulletinBoardIcon",class:"userIcon"}),i("span",{class:"txt"},"게시판")],-1)),i("ul",nl,[i("li",null,[i("button",{type:"button",class:"clickBtn",onClick:e[4]||(e[4]=(...v)=>s.noticePop&&s.noticePop(...v))},e[14]||(e[14]=[i("img",{src:zt,alt:"noticeIcon",class:"userIcon"},null,-1),i("span",null,"공지사항",-1)]))]),i("li",null,[i("button",{type:"button",class:"clickBtn",onClick:e[5]||(e[5]=(...v)=>s.eventPop&&s.eventPop(...v))},e[15]||(e[15]=[i("img",{src:Zt,alt:"eventIcon",class:"userIcon"},null,-1),i("span",null,"이벤트",-1)]))]),i("li",null,[i("button",{type:"button",class:"clickBtn reward-menu-btn",onClick:e[6]||(e[6]=(...v)=>s.eventRewardPop&&s.eventRewardPop(...v))},[e[16]||(e[16]=i("img",{src:Wt,alt:"couponIcon",class:"userIcon"},null,-1)),e[17]||(e[17]=i("span",null,"쿠폰함",-1)),n.rewardBadgeCnt>0?(o(),d("span",rl,h(n.rewardBadgeCnt),1)):u("",!0)])]),i("li",null,[i("button",{type:"button",class:"clickBtn",onClick:e[7]||(e[7]=(...v)=>s.hairLossNewsPop&&s.hairLossNewsPop(...v))},e[18]||(e[18]=[i("img",{src:Xt,alt:"newsIcon",class:"userIcon"},null,-1),i("span",null,"탈모 뉴스",-1)]))]),i("li",null,[i("button",{type:"button",class:"clickBtn",onClick:e[8]||(e[8]=(...v)=>s.myRecommendCodePop&&s.myRecommendCodePop(...v))},e[19]||(e[19]=[i("img",{src:Wo,alt:"friendIcon",class:"userIcon"},null,-1),i("span",null,"친구 추천",-1)]))])])])):u("",!0),i("div",ol,[i("div",ll,[M(T,{icon:"mdi:mdi-format-size"}),e[21]||(e[21]=i("span",{class:"txt"},"글자 크기 조절",-1))]),M(qt,{modelValue:a.fontSize,"onUpdate:modelValue":e[12]||(e[12]=v=>a.fontSize=v),class:"setting-box-cont"},{default:pe(()=>[M(ce,{color:"primary",label:"작게",value:"small",onChange:e[9]||(e[9]=v=>s.setFont("small"))}),M(ce,{color:"primary",label:"중간",value:"medium",checked:"",onChange:e[10]||(e[10]=v=>s.setFont("medium"))}),M(ce,{color:"primary",label:"크게",value:"big",onChange:e[11]||(e[11]=v=>s.setFont("big"))})]),_:1},8,["modelValue"])]),s.safeLoginName?(o(),d("div",dl,[i("button",{type:"button",class:"setting-box-tit type2 arrayCenter",onClick:e[13]||(e[13]=(...v)=>s.myAccountPop&&s.myAccountPop(...v))},e[22]||(e[22]=[i("img",{src:Jo,alt:"userIcon",class:"userIcon"},null,-1),i("span",{class:"txt"},"내 정보 관리",-1)]))])):u("",!0),e[23]||(e[23]=i("div",{class:"policy-links",style:{padding:"5px"}},[i("a",{href:"/privacyPolicy",target:"blank"},"개인정보처리방침"),i("span",{class:"separator"}," | "),i("a",{href:"/termsOfService",target:"blank"},"서비스 이용약관")],-1))])]),a.myaccountmgmtFlag?(o(),m(l,{key:0,onClosePopup:s.closeMyAccountPop},null,8,["onClosePopup"])):u("",!0),a.myrecommendCodeFlag?(o(),m(p,{key:1,onClosePopup:s.closeMyRecommendCodePop},null,8,["onClosePopup"])):u("",!0),a.noticeFlag?(o(),m(r,{key:2,"initial-idx":n.initialPopup==="notice"?n.initialIdx:null,onClosePopup:s.closeNoticePop},null,8,["initial-idx","onClosePopup"])):u("",!0),a.eventFlag?(o(),m(g,{key:3,"initial-idx":n.initialPopup==="event"?n.initialIdx:null,onClosePopup:s.closeEventPop},null,8,["initial-idx","onClosePopup"])):u("",!0),a.eventRewardFlag?(o(),m(k,{key:4,onClosePopup:s.closeEventRewardPop},null,8,["onClosePopup"])):u("",!0),a.hairLossNewsFlag?(o(),m(_,{key:5,onClosePopup:s.closeHairLossNewsPop},null,8,["onClosePopup"])):u("",!0)])}const $e=x(Xo,[["render",cl],["__scopeId","data-v-f5810a20"]]),ul={props:{userFirstChar:{type:String,required:!0},rewardBadgeCnt:{type:Number,default:0}},emits:["reset-chat","toggle-setting"],methods:{resetChat(){this.$emit("reset-chat")},toggleSetting(){this.$emit("toggle-setting",!0)}}},hl={class:"chat-info"},pl={class:"chat-title"},ml={class:"chat-util"},gl={key:0,class:"reward-alert-dot","aria-label":"받을 수 있는 보상 있음"};function yl(t,e,n,c,a,s){return o(),d("div",hl,[i("h2",pl,[i("button",{type:"button",onClick:e[0]||(e[0]=l=>s.resetChat())},e[2]||(e[2]=[i("span",{class:"s-logo"},[i("em",{class:"blind"},"MEDALO")],-1),i("span",{class:"txt addTitle"},"인공지능기반 탈모자가분석",-1)]))]),i("div",ml,[i("button",{type:"button",class:"btn-set btn-menu reward-alert-anchor",title:"설정",onClick:e[1]||(e[1]=l=>s.toggleSetting())},[M(T,{icon:"mdi-menu"}),n.rewardBadgeCnt>0?(o(),d("span",gl,"!")):u("",!0)])])])}const et=x(ul,[["render",yl],["__scopeId","data-v-b7791ec5"]]);function Pe(t){return!t||!t.token?null:t.name||null}function fl(t){const e=String(t||"").replace(/-/g,"+").replace(/_/g,"/"),n=e+"=".repeat((4-e.length%4)%4);if(typeof atob=="function")return atob(n);const c=globalThis.Buffer;return c?c.from(n,"base64").toString("binary"):""}function kl(t){if(typeof t!="string")return null;const e=t.split(".");if(e.length<2)return null;try{const n=JSON.parse(decodeURIComponent(fl(e[1]).split("").map(c=>"%"+c.charCodeAt(0).toString(16).padStart(2,"0")).join("")));return Number.isFinite(n?.exp)?n.exp*1e3:null}catch{return null}}function vl(t,e=Date.now(),n=0){const c=kl(t);return c===null?!1:c-n<=e}function bl(t,e=Date.now()){return!t||typeof t!="object"||!t.token?!1:!vl(t.token,e)}const Te="https://www.medalo.ai/backend",Il={components:{PopSearch:as,PopThesisList:hs,PopChangeTell:us,ChatHeader:et,ChatOnBoard:Ze,ChatMessage:Ae,ChatFooter:Ee,Setting:$e,PopReservation:es,PopMediInfo:ts,PopupPage:Xe,PopHairThick:ss,PopThesis:is,PopPredict:ns,PopPredictHistory:rs,PopVideo:os,PopEvaluation:ls,PopReport:ds,LoadingPage:Se,PopReservationStatus:ps,PopHairCount:ms,PopCheckLogin:gs,PopAloLiteLogin:ys,PopHospitalInfo:fs,PopHospitalMap:ks,PopHairTickCount:vs,PopProductList:bs,PopHairLossBlog:Is,PopEventModal:Ms,PersonaWorkflow:Je,DailyCare:Ue},data(){return{username:null,userFirstChar:"",setFlag:!1,eventModalFlag:!1,rewardBadgeCnt:0,initialPopup:null,initialId
1x:null,message:[],userMessage:"",popupFlag:{reservation:!1,mediinfo:!1,clincal:!1,counsel:!1,hospital:!1,theisList:!1,hair:!1,search:!1,predict:!1,predictHistory:!1,video:!1,evaluation:!1,report:!1,changeTell:!1,reservationStatus:!1,hairCount:!1,checkLogin:!1,aloLiteLoginFlag:!1,hospitalMap:!1,hairTickCount:!1,productList:!1,hairlossBlog:!1},selectedComponent:ue(cs),selectedFile:null,chatIdx:null,chatEvaluation:!1,chatReport:!1,faqFlag:!1,predictionFlag:!1,predictImgUrl:null,predictChatHistoryIdx:null,beforeImgUrl:null,mergeType:null,disabledFlag:!1,focusFlag:!1,loadingPageFlag:!1,personaWorkflowFlag:!1,dailyCareFlag:!1,selfHairLossFlag:!1,hairThickness:{beforeHairThickness:0,afterHairThickness:0},afterValue:null,theisTitle:"논문검색",theisUrl:"/files/Steroid 5a-Reductase Deficiency in Man An InheritedForm of Male Pseudohermaphroditism.pdf",relatedQuestions:[],questionTemplates:{1:{title:"Q2. 연령대를 선택해주세요",buttons:[{text:"10대",type:"chat",args:"10",questionIdx:2},{text:"20대",type:"chat",args:"20",questionIdx:2},{text:"30대",type:"chat",args:"30",questionIdx:2},{text:"40대이상",type:"chat",args:"40",questionIdx:2}]},2:{title:"Q3. 증상을 선택해주세요",buttons:[{text:"앞머리가 점점 넓어지고 모발이 가늘어졌어요",type:"chat",args:"1",questionIdx:3},{text:"갑자기 머리가 많이 빠지기 시작했어요",type:"chat",args:"2",questionIdx:3},{text:"머리에 동그랗게 빠진 부분이 있어요",type:"chat",args:"3",questionIdx:3},{text:"두피에 염증이나 상처가 있고 털이 안나요",type:"chat",args:"4",questionIdx:3}]},3:{title:"Q4. 가족 중에 탈모를 겪은 분이 있으신가요?",buttons:[{text:"예",type:"chat",args:"Y",questionIdx:4},{text:"아니오",type:"chat",args:"N",questionIdx:4}]}},questionnaire:[],againDiagnosisFlag:!1}},computed:{loginInfo(){return this.$store.getters["chat/GET_USER_INFO"]},isMobile(){return/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent)}},watch:{loginInfo:{handler(t){this.username=Pe(t)},deep:!0}},mounted(){this.setFirstChar(),this.chatIdx=this.setChatIdx(),this.setRelatedQuestions(),this.preventNavigationEvet(),this.openEventModal(),this.fetchRewardBadge(),this.handleRewardDeepLink()},beforeUnmount(){this._chatAbortController?.abort()},methods:{fetchRewardBadge(){if(!this.username)return;const t={success:e=>{e.code==="S"&&(this.rewardBadgeCnt=e.badgeCnt||0)},error:()=>{}};this.$api.chat.getEventRewardBadgeCount(t)},handleRewardDeepLink(){const t=this.$route?this.$route.query:{};if(t){if(t.couponbook==="Y")this.username&&(this.initialPopup="couponbook",this.setFlag=!0);else if(t.notice){const e=parseInt(t.notice,10);isNaN(e)||(this.initialPopup="notice",this.initialIdx=e,this.setFlag=!0)}else if(t.event){const e=parseInt(t.event,10);isNaN(e)||(this.initialPopup="event",this.initialIdx=e,this.setFlag=!0)}else return;this.$router.replace({query:{}}).catch(()=>{})}},setFirstChar(){const t=this.getLoginInfo();if(!t){this.username=null;return}if(!bl(t)){Lt({pathname:window.location.pathname,storage:localStorage,store:this.$store}),this.username=null;return}this.$__SET_USER_INFO(t),this.username=Pe(t)},openEventModal(){this.username&&sessionStorage.getItem("event-popup-shown")!=="Y"&&(this.eventModalFlag=!0)},toggleSetting(t){this.setFlag=t,t||(this.initialPopup=null,this.initialIdx=null,this.fetchRewardBadge())},applyBold(t){return t?$t(t,{expertSource:"MedAlo 자문닥터 원장"}).replace(/✅[ \t]*\*\*(.+?)\*\*/g,'✅ <strong class="msg-title">$1</strong>').replace(/📌[ \t]*\*\*(.+?)\*\*/g,'📌 <strong class="msg-subtitle">$1</strong>').replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"):""},async fetchProChat(){if(!this.userMessage||this.userMessage.trim()===""||this.disabledFlag)return;this._chatAbortController?.abort();const t=new AbortController;this._chatAbortController=t,this.chatEvaluation=!1,this.chatReport=!1,this.disabledFlag=!0,this.focusFlag=!1;const e={userQuestion:this.userMessage,chatIdx:this.chatIdx,streamProtocol:"events-v1"};this.message.push({text:this.userMessage,type:"client"}),this.userMessage=null,this.$nextTick(this.scrollToBottom);const n=this.message.length;this.message.push({text:"",type:"provider",loading:!0,progress:{stage:"understanding",startedAt:Date.now()}});const c=this.$store.getters["chat/GET_USER_INFO"]?.token,a={"Content-Type":"application/json",...c?{Authorization:`Bearer ${c}`}:{}};let s=!1,l=()=>{};try{const p=await fetch(Te+"/api/chat/pro_chat",{method:"POST",headers:a,body:JSON.stringify(e),signal:t.signal});if(!p.ok)throw this.message[n].loading=!1,new Error(`네트워크 에러: ${p.status}`);const r=p.body.getReader(),g=new TextDecoder("utf-8"),k=this.message[n];let _="",v=null,I=null,U=!1;const L=()=>
1{if(!_.trim())throw new Error("Empty answer");const b=_.replace(/\n|<\/?br\s*\/?>/gi,"<br>").split("##########");I=[n];const N=[],A=b[0]||"",K=this.applyBold(A),W=this.linkify(K),le=/<br\s*\/?>/i.test(A);if(W!==A||K!==A||le?this.message[n]={text:null,htmlYn:!0,html:W,type:"provider",loading:!1,relatedQuestions:N}:this.message[n]={text:A,type:"provider",loading:!1,relatedQuestions:N},b[1]){N&&I.push(n+1);const H=b[1],J=this.applyBold(H),X=this.linkify(J),de=/<br\s*\/?>/i.test(H);X!==H||J!==H||de?this.message[n+1]={text:null,htmlYn:!0,html:X,type:"provider",loading:!1,relatedQuestions:N}:this.message[n+1]={text:H,type:"provider",loading:!1,relatedQuestions:N}}this.chatEvaluation=!0,this.chatReport=!0,this.disabledFlag=!1,this.isMobile||(this.focusFlag=!0),this.$nextTick(this.scrollToBottom)};l=()=>{if(U||!I)return;U=!0;const F=Ut({generated:v,fallback:this.relatedQuestions,asked:e.userQuestion});for(const b of I)this.message[b]&&(this.message[b].relatedQuestions=F)};const E=Bt({onToken:F=>{_+=F},onStatus:F=>{Ht[F]&&(k.progress.stage=F)},onDone:()=>{s||(L(),s=!0,l())},onRelated:F=>{v=F}});try{for(;;){const{value:F,done:b}=await r.read();if(b)break;const N=_.length;if(E.push(g.decode(F,{stream:!0})),_.length!==N){const A=_.replace(/\n|<\/?br\s*\/?>/gi,"<br>");k.htmlYn=!0,k.html=this.linkify(this.applyBold(A)),k.text=A,k.loading=!1,this.$nextTick(this.scrollToBottom)}}E.push(g.decode()),E.finish()}finally{r.releaseLock()}s||(L(),s=!0),l()}catch(p){if(p.name==="AbortError"||s)return;this.message[n]={text:"오류가 발생했습니다. 다시 시도해주세요.",type:"provider",loading:!1},this.$nextTick(this.scrollToBottom),this.disabledFlag=!1}finally{this._chatAbortController===t&&(this._chatAbortController=null)}},scrollToBottom(){this.$nextTick(()=>{const t=this.$refs.chatBody;t&&(t.scrollTop=t.scrollHeight)})},scrollToTop(){this.$nextTick(()=>{const t=this.$refs.chatBody;t&&(t.scrollTop=0)})},resetChat(){this.message=[],this.chatEvaluation=!1,this.chatReport=!1,this.chatIdx=this.setChatIdx(),this.$nextTick(()=>{this.scrollToTop()})},openReservation(){this.popupFlag.reservation=!0},openReservationStatus(){this.popupFlag.reservationStatus=!0},openMediInfo(){this.popupFlag.mediinfo=!0},openSearch(){this.popupFlag.search=!0},openCounsel(){const t={text:"얼굴과 두피가 잘 보이도록 정면 사진을 찍어 주신 후, 촬영하신 이미지를 파일로 첨부해 주세요.",img:"/images/img-ai-front.png"};this.message.push({text:t.text,type:"provider",img:t.img,selfDiagnosis:!0}),setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100)},openHospital(){this.message.push({text:"병원 정보",type:"client"}),this.message.push({text:`맥스웰클리닉의 운영 시간, 위치, 주차 안내 등
2병원 정보를 확인하실 수 있습니다.
3궁금하신 내용은 채팅창에 입력해주세요.`,type:"provider"}),this.$nextTick(this.scrollToBottom)},openVideo(){this.popupFlag.video=!0},openPopup(t){console.log("page",t),this.selectedComponent=ue(t),this.popupFlag.clincal=!0},openHairThick(){this.popupFlag.hair=!0},openHairCount(){this.popupFlag.hairCount=!0},openThesisList(){this.popupFlag.theisList=!0},openEvaluation(){this.popupFlag.evaluation=!0},openReport(){this.popupFlag.report=!0},openChangeTell(){this.popupFlag.changeTell=!0},openCheckLogin(){this.popupFlag.checkLogin=!0},isAuthExpiredError(t){return Y(t)},handleLoginRequiredAuthExpired(){this.personaWorkflowFlag=!1,this.dailyCareFlag=!1,this.popupFlag.predict=!1,this.popupFlag.predictHistory=!1,this.loadingPageFlag=!1,this.openCheckLogin()},handlePersonaWorkflowAuthExpired(){this.handleLoginRequiredAuthExpired()},handlePredictAuthExpired(){this.handleLoginRequiredAuthExpired()},openAloLiteLogin(){this.popupFlag.aloLiteLoginFlag=!0},openHospitalMap(){this.popupFlag.hospitalMap=!0},openHariTickCount(){this.popupFlag.hairTickCount=!0},openProductList(){this.popupFlag.productList=!0},openHairLossBlog(){this.popupFlag.hairlossBlog=!0},openPersonaWorkflow(){this.personaWorkflowFlag=!0},openDailyCare(){this.dailyCareFlag=!0},handleDailyCareAuthExpired(){this.handleLoginRequiredAuthExpired()},closePopup(t){if(t==="reportFinish"){this.popupFlag.report=!1;const e=this.message.length;if(e){const n=this.message[e-1];(n.againDiagnosisFlag===!0||n.title&&n.title.includes("이미지에 따라 결과가 달라질 수 있습니다"))&&e>=3?this.message.splice(e-3,2):this.message.splice(e-1,1),this.message.push({text:"메세지가 삭제되었습니다.",type:"provider"})}this.chatEvaluation=!1,this.chatReport=!1}this.popupFlag[t]=!1},inputFaq(t){this.userMessage=t,this.fetchProChat()},inputFuture(t,e){if(this.message.push({text:t,type:"client"}),e==="history"){this.popupFlag.predictHistory=!0,this.$nextTick(this.scrollToBottom);return}const n={firstText:"앞머리(헤어라인)의 현재 상태가 잘 보이도록 사진을 업로드해 주세요.",strongText:"정면에서 이마 라인이 잘 보이도록, 예시 이미지와 같은 각도로 촬영해 주세요.",lastText:"다른 각도나 구도로 찍을 경우, 예측 결과가 실제와 달라질 수 있습니다.",img:"/images/img-ai-front.png"};e==="therapy"&&(n.firstText="정수리의 현재 상태가 잘 보이도록 사진을 업로드해 주세요.",n.strongText="머리 위에서 정수리 중심이 잘 보이도록, 예시 이미지와 같은 각도로 촬영해 주세요.",n.lastText="다른 각도나 구도로 찍을 경우, 예측 결과가 실제와 달라질 수 있습니다.",n.img="/images/img-ai-top.png"),this.message.push({emphasizedText:!0,firstText:n.firstText,strongText:n.strongText,lastText:n.lastText,type:"provider",img:n.img,file:!0,args:e}),setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100)},selfHairLossQuestions(t){this.selfHairLossFlag=!0;const e=this.questionTemplates[t]||{text:"해당 질문이 존재하지 않습니다."};this.message.push({...e,type:"provider",selfHairLossFlag:!0,loading:!1}),setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100)},inputSelfHairLoss(t,e,n){this.chatEvaluation=!1,this.chatReport=!1;const c={strongText:"탈모가 의심되는 부위는 가까운 거리에서 선명하게 촬영해 주세요.",lastText:"촬영할 때 머리카락이 부위를 가리지 않도록 주의해 주세요.",img:"/images/img-dianosis.png"};this.questionnaire.push(t),this.message.push({text:t,type:"client"}),n===1?this.selfHairLossQuestions(n):n===2?this.selfHairLossQuestions(n):n===3?this.selfHairLossQuestions(n):this.message.push({emphasizedText:!0,strongText:c.strongText,lastText:c.lastText,type:"provider",img:c.img,selfDiagnosis:!0,args:"diagnosis"}),setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100)},addMergeFile(t="therapy"){this.mergeType=t,this.$refs.mergeImg.click()},addDianosisFile(){if(console.log("addDianosisFile-questionnaires유무",this.questionnaire.length),this.questionnaire.length<4){alert("파일ì
3„ 첨부할 수 없습니다. 진단을 처음부터 다시 시작해주세요.");return}this.$refs.diagnosisImg.click()},dragDiagnosis(t,e){if(console.log("addDianosisFile-questionnaires유무",this.questionnaire.length),this.questionnaire.length<4){alert("파일을 첨부할 수 없습니다. 진단을 처음부터 다시 시작해주세요.");return}this.diagnosisImg(t,e)},resetPredictImg(t){t.target.value=null},resetDiagnosisImg(t){t.target.value=null},resetHairThickStatusImg(t){t.target.value=null},predictImg(t,e=!1,n="therapy"){if(this.loadingPageFlag=!0,e===!0&&(this.mergeType=n,t.dataTransfer.files.length>1)){this.loadingPageFlag=!1,alert("여러 개의 이미지가 감지되었습니다. 한 개만 선택 가능합니다.");return}const c=e?t.dataTransfer.files[0]:t.target.files[0];if(!c){this.loadingPageFlag=!1;return}if(!c.type.startsWith("image/")){t.target.value="",alert("이미지 파일만 선택 가능합니다."),this.loadingPageFlag=!1;return}const a=new FormData;a.append("user_hair_loss_image",c),a.append("type",this.mergeType),a.append("chatIdx",this.chatIdx);const s={success:l=>{this.loadingPageFlag=!1,this.beforeImgUrl=URL.createObjectURL(c),this.predictImgUrl="data:image/png;base64,"+l.base64Image,this.hairThickness.beforeHairThickness=l.hairThickness.beforeHairThickness,this.hairThickness.afterHairThickness=l.hairThickness.afterHairThickness,this.afterValue=l.afterValue,this.predictChatHistoryIdx=l.chatHistoryIdx||null,this.popupFlag.predict=!0},error:l=>{if(this.isAuthExpiredError(l)){this.handlePredictAuthExpired();return}if(l){this.loadingPageFlag=!1,this.message.push({text:l?.response?.data?.message||"사진 분석 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.",type:"provider",loading:!1}),this.$nextTick(this.scrollToBottom);return}this.loadingPageFlag=!1}};this.$api.chat.merge(a,s)},openDiagnosis(t){const e={text:`AI를 통해 탈모 상태를 정확히 진단받으려면, 탈모가 의심되는 부위를 가까이에서 또렷하게 촬영해 주세요.
4촬영 시 머리카락이 가려지지 않도록 주의해 주세요.`,img:"/images/img-dianosis.png"};this.message.push({text:e.text,type:"provider",img:e.img,selfDiagnosis:!0,args:"diagnosis"}),t===!0&&this.$nextTick(this.scrollToBottom)},beforeIntroCard(){this.chatEvaluation=!1,this.chatReport=!1,this.questionnaire=[],this.message.push({text:"나의 탈모 정도 안내사항",type:"client"}),this.message.push({type:"provider",selfHairLossNoticeFlag:!0}),this.$nextTick(this.scrollToBottom)},openSelfHairLoss(t){this.selfHairLossFlag=!0,this.questionnaire=[],t===!0&&(this.chatEvaluation=!1,this.chatReport=!1,this.message.push({text:"나의 탈모 정도",type:"client"})),this.message.push({title:"Q1. 성별을 선택해주세요",type:"provider",selfHairLossFlag:!0,buttons:[{text:"남성",type:"chat",args:"man",questionIdx:1},{text:"여성",type:"chat",args:"woman",questionIdx:1}],loading:!1}),t===!0&&this.$nextTick(this.scrollToBottom)},againDiagnosisQuestion(t,e){this.againDiagnosisFlag=!0,e==="againQuestionY"?this.openSelfHairLoss(!0):e==="againQuestionN"&&(this.message.push({text:t,type:"client"}),this.message.push({text:`답변에 대해 궁금한 점이 있으시면 알려주세요.
5탈모에 대한 다른 궁금증도 자유롭게 질문해주세요.`,type:"provider",relatedQuestions:this.relatedQuestions}),this.chatEvaluation=!0,this.chatReport=!0,setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100))},async diagnosisImg(t,e=!1){if(this.loadingPageFlag=!0,e===!0&&t.dataTransfer.files.length>1){this.loadingPageFlag=!1,alert("여러 개의 이미지가 감지되었습니다. 한 개만 선택 가능합니다.");return}const n=e?t.dataTransfer.files[0]:t.target.files[0];if(!n){this.loadingPageFlag=!1;return}if(!n.type.startsWith("image/")){t.target.value="",alert("이미지 파일만 선택 가능합니다."),this.loadingPageFlag=!1;return}const c=new FormData;c.append("user_hair_loss_image",n),c.append("questionnaire",this.questionnaire.join(",")),this.loadingPageFlag=!1;const a=new FileReader;a.onloadend=async()=>{const s=a.result,l=this.message.length;this.message.push({notice:`정확한 진단을 위해서는 병원 방문 및 전문의 상담이 필요합니다. 가까운 병원 방문을 권장드립니다.
6
7`,diagnosisSelfImg:s,text:"",type:"provider",diagnosisResultImgFlag:!0,diagnosisTypeOfM:!1,buttons:[{text:"수술 후 내 모습 보러가기",type:"chat"}],loading:!0}),this.$nextTick(()=>this.scrollToBottom());const p=this.$store.getters["chat/GET_USER_INFO"]?.token,r=p?{Authorization:`Bearer ${p}`}:{};try{const g=await fetch(Te+"/api/diagnose",{method:"POST",headers:r,body:c});if(!g.ok)throw this.message[l].loading=!1,new Error(`HTTP ${g.status}`);const k=g.body.getReader(),_=new TextDecoder("utf-8");let v=!1,I="";for(this.message[l].loading=!1;!v;){const{value:E,done:F}=await k.read();if(v=F,E){I+=_.decode(E,{stream:!0}).replaceAll("data:","");let b=I.replace(/\n\n/g,"").replace(/(?<!\d)1(?!\d|μ)/g,"__BR__1").replace(/(?<!\d)2(?!\d|μ)/g,"__BR__2").replace(/(?<!\d)3(?!\d|μ)/g,"__BR__3").replace(/(?<!\d)4(?!\d|μ)/g,"__BR__4").replace(/(?<!\d)5(?!\d|μ)/g,"__BR__5").replace(/(?<!\d)※(?!\d|μ)/g,"__BR__※");b=b.replace(/<\/br>/gi,"__BR__").replace(/<br\s*\/?>/gi,"__BR__"),b=b.replace(/[ \t]+/g," "),b=b.replace(/^[\s_]*(__BR__)*[\s_]*(✅)/m,"<br>$2"),b=b.replace(/[\s_]*(__BR__)*[\s_]*(📌)/g,"<br><br>$2"),b=b.replace(/(✅[^📌]*?)<br><br>(📌)/u,"$1<br>$2"),b=b.replace(/(📌[^ㆍ📌]*?)[\s_]*(__BR__)*[\s_]*(ㆍ)/gu,"$1<br>$3"),b=b.replace(/(ㆍ[^📌ㆍ]*?)[\s_]*(__BR__)*[\s_]*(ㆍ)/gu,"$1<br>$3"),b=b.replace(/[\s_]*(__BR__)*[\s_]*(\[출처\])/g,"<br><br>$2"),b=b.replace(/[\s_]*(__BR__)*[\s_]*(※)/g,"<br>$2"),b=b.replace(/__BR__/g,"<br>");const N=b.replace(/(<br>){3,}/gi,"<br><br>").replace(/^\s*(<br>)+/i,"").trim(),A=this.applyBold(N),K=this.linkify(A);this.message[l].htmlYn=!0,this.message[l].html=K,this.message[l].text=null,this.$nextTick(()=>this.scrollToBottom())}}if(I.includes("<!--DIAGNOSE_ERROR-->"))throw this.message[l].htmlYn=!1,this.message[l].html=null,new Error("diagnose stream error");let U=I.replace(/\n\n/g,"").replace(/<\/br>/gi,`
8`).replace(/<br\s*\/?>/gi,`
9`).replace(/\n{3,}/g,`
10
11`).replace(/^\s+|\s+$/g,"").trim();const L={chatIdx:this.chatIdx,userQuestion:this.questionnaire.join(","),response:U};this.saveChat(L),this.$nextTick(()=>{const E=I.includes("M자 탈모");console.log(E,"diagonosisType"),E==!0&&(this.message[l].diagnosisTypeOfM=!0),this.message[l].loading=!1,this.questionnaire=[],this.chatEvaluation=!0,this.chatReport=!0,this.message.push({title:`이미지에 따라 결과가 달라질 수 있습니다.
12다시 확인해보시겠어요?`,type:"provider",againDiagnosisFlag:!0,buttons:[{text:"예, 다시 해볼게요",type:"chat",args:"againQuestionY"},{text:"아니오, 괜찮습니다",type:"chat",args:"againQuestionN"}
12],loading:!1}),this.scrollToBottom()})}catch(g){console.error(g),alert("진단 요청 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),this.message[l].loading=!1,this.message[l].text="진단 요청 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."}finally{this.loadingPageFlag=!1,this.questionnaire=[]}},a.readAsDataURL(n)},openPredict(){this.predictionFlag=!0,this.chatEvaluation=!1,this.chatReport=!1,this.message.push({text:"수술(치료)후 내모습",type:"client"}),this.message.push({text:`수술 또는 치료 후 달라질 모습을 예측해드립니다.
13궁금하신 부위를 선택해주세요.`,type:"provider",predictionFlag:!0,buttons:[{text:"수술 - 앞머리(헤어라인)",type:"chat",args:"surgery"},{text:"치료 - 정수리",type:"chat",args:"therapy"},{text:"이전 결과 보기",type:"chat",args:"history"}],loading:!1}),this.$nextTick(this.scrollToBottom)},linkify(t){const e=/((?:https?:\/\/|www\.)[^\s<>()]+?(?=[\s<>()]|$))/gi,n=/(\d{2,3}-\d{3,4}-\d{4})/g;return t.split(/(<a\b[^>]*>[\s\S]*?<\/a>)/gi).map(c=>/^<a\b/i.test(c)?c:c.replace(e,a=>{let s=a;return/^https?:\/\//i.test(s)||(s="http://"+s),`<a href="${s}" target="_blank" rel="noopener noreferrer">${a}</a>`}).replace(n,a=>`<a href="tel:${a.replace(/-/g,"")}">${a}</a>`)).join("")},getPage(t){return(()=>{const e=t.match(/페이지:\s*([\d,\s]+)/);return e?e[1].split(",")[0].trim():null})()},setRelatedQuestions(){const t={},e={success:n=>{this.relatedQuestions=Vt(n.relatedQuestions)},error:()=>{this.relatedQuestions=[]}};this.$api.chat.getRelatedQuestions(t,e)},saveChat(t){const e={success:n=>{},error:n=>{}};this.$api.chat.saveChat(t,e)},setHairThicknessStatus(){this.chatEvaluation=!1,this.chatReport=!1;const t={strongText:"탈모 부위(앞머리 또는 정수리)가 잘 보이도록 예시 사진처럼 촬영해주세요.",lastText:"촬영할 때 머리카락이 부위를 가리지 않도록 주의해 주세요.",guide:"탈모부위(앞머리 또는 정수리)를 촬영해주세요.",img:"/images/sethairthicknessImg.png"};this.message.push({text:t.guide,type:"client"}),this.message.push({emphasizedText:!0,strongText:t.strongText,lastText:t.lastText,type:"provider",img:t.img,setHairThicknessStatusFlag:!0}),this.$nextTick(this.scrollToBottom)},resetSetHairThicknessImg(t){t.target.value=null},addSetHairThicknessFile(){this.$refs.setHairThicknessImg.click()},againSetHairThicknessStatus(t,e){e==="againThicknessStatusY"?this.setHairThicknessStatus(!0):e==="againThicknessStatusN"&&(this.message.push({text:t,type:"client"}),this.message.push({text:`답변에 대해 궁금한 점이 있으시면 알려주세요.
14탈모에 대한 다른 궁금증도 자유롭게 질문해주세요.`,type:"provider",relatedQuestions:this.relatedQuestions}),this.chatEvaluation=!0,this.chatReport=!0,setTimeout(()=>{this.$nextTick(this.scrollToBottom)},100))},setHairThicknessImg(t,e=!1){if(this.loadingPageFlag=!0,e===!0&&t.dataTransfer.files.length>1){this.loadingPageFlag=!1,alert("여러 개의 이미지가 감지되었습니다. 한 개만 선택 가능합니다.");return}const n=e?t.dataTransfer.files[0]:t.target.files[0];if(!n){this.loadingPageFlag=!1;return}if(!n.type.startsWith("image/")){!e&&t.target&&(t.target.value=""),alert("이미지 파일만 선택 가능합니다."),this.loadingPageFlag=!1;return}const c=new FormData;c.append("userHairLossImage",n),this.loadingPageFlag=!1;const a=new FileReader;a.onloadend=async()=>{const s=a.result,l=this.message.length;this.message.push({setHairThicknessnotice:`정확한 진단을 위해서는 병원 방문 및 전문의 상담이 필요합니다. 가까운 병원 방문을 권장드립니다.
15
16`,setHairThicknessStatusImg:s,text:"진단 중입니다…",type:"provider",loading:!0,setHairThicknessPopFlag:!1,thicknessValue:""}),this.$nextTick(()=>this.scrollToBottom());const p={success:r=>{console.log("모발굵기현황 response:",r);const g=typeof r=="number"?r:typeof r?.int=="number"?r.int:null;if(g==null)throw new Error("Unexpected response shape");this.message[l].text=`
17동양인의 평균 모발 굵기는 약 80~100μm(마이크로미터) 입니다.
18
19현재 사진 분석 결과
20- 탈모 부위(앞머리 또는 정수리) 모발 굵기: ${g}μm`,this.message[l].loading=!1,this.message[l].setHairThicknessPopFlag=!0,this.message[l].thicknessValue=`${g}`,this.$nextTick(()=>{this.chatEvaluation=!0,this.chatReport=!0,this.message.push({title:`이미지에 따라 결과가 달라질 수 있습니다.
21다시 확인해보시겠어요?`,type:"provider",againSetHairThicknessFlag:!0,buttons:[{text:"예, 다시 해볼게요",type:"chat",args:"againThicknessStatusY"},{text:"아니오, 괜찮습니다",type:"chat",args:"againThicknessStatusN"}],loading:!1}),this.scrollToBottom()})},error:r=>{if(r){console.log("모발굵기현황err-response",r),this.loadingPageFlag=!1,this.message[l].loading=!1,this.message[l].text=r.response.data.message||"진단 요청 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.",this.$nextTick(this.scrollToBottom);return}this.loadingPageFlag=!1}};this.$api.chat.getHairThicknessImg(c,p)},a.readAsDataURL(n)},preventNavigationEvet(){history.pushState(null,null,location.href),window.onpopstate=()=>{console.log("windowPrevent 동작"),history.go(1)}}}},Ml={class:"chat-wrap"},Dl={ref:"chatBody",class:"chat-body"},Cl={class:"chat-body-inner"},Rl={class:"message-area"},wl={key:0,class:"chip-list"},Pl=["onClick"],Tl={class:"d-flex"};function Sl(t,e,n,c,a,s){const l=et,p=$e,r=Ze,g=Ae,k=Ee,_=R("PopReservation"),v=R("PopMediInfo"),I=Xe,
21U=R("PopHairThick"),L=R("PopThesisList"),E=R("PopSearch"),F=R("PopVideo"),b=R("PopPredict"),N=R("PopPredictHistory"),A=R("PopEvaluation"),K=R("PopReport"),W=R("PopChangeTell"),le=R("PopReservationStatus"),H=R("PopHairCount"),J=R("PopCheckLogin"),X=R("PopAloLiteLogin"),de=R("PopHospitalMap"),tt=R("PopHairTickCount"),st=R("PopProductList"),it=R("PopHairLossBlog"),at=Je,nt=Ue,rt=R("PopEventModal"),ot=Se;return o(),d("div",Ml,[M(l,{"user-first-char":a.userFirstChar,"reward-badge-cnt":a.rewardBadgeCnt,onResetChat:s.resetChat,onToggleSetting:s.toggleSetting},null,8,["user-first-char","reward-badge-cnt","onResetChat","onToggleSetting"]),M(Ot,{name:"chat-setting-transition"},{default:pe(()=>[a.setFlag?(o(),m(p,{key:0,onOpenPop:s.openPopup,onClosePop:s.toggleSetting,onOpenLiteLogin:s.openAloLiteLogin,onRefreshRewardBadge:s.fetchRewardBadge,loginName:a.username,"reward-badge-cnt":a.rewardBadgeCnt,"initial-popup":a.initialPopup,"initial-idx":a.initialIdx},null,8,["onOpenPop","onClosePop","onOpenLiteLogin","onRefreshRewardBadge","loginName","reward-badge-cnt","initial-popup","initial-idx"])):u("",!0)]),_:1}),i("div",Dl,[i("div",Cl,[i("input",{ref:"mergeImg",type:"file",class:"form-file-hidden",accept:"image/*",onChange:e[0]||(e[0]=(...w)=>s.predictImg&&s.predictImg(...w)),onClick:e[1]||(e[1]=(...w)=>s.resetPredictImg&&s.resetPredictImg(...w))},null,544),i("input",{ref:"diagnosisImg",type:"file",class:"form-file-hidden",accept:"image/*",onChange:e[2]||(e[2]=(...w)=>s.diagnosisImg&&s.diagnosisImg(...w)),onClick:e[3]||(e[3]=(...w)=>s.resetDiagnosisImg&&s.resetDiagnosisImg(...w))},null,544),i("input",{ref:"setHairThicknessImg",type:"file",class:"form-file-hidden",accept:"image/*",onChange:e[4]||(e[4]=(...w)=>s.setHairThicknessImg&&s.setHairThicknessImg(...w)),onClick:e[5]||(e[5]=(...w)=>s.resetSetHairThicknessImg&&s.resetSetHairThicknessImg(...w))},null,544),M(r,{onOpenPredict:s.openPredict,onOpenHairCount:s.openHairCount,onOpenCheckLogin:s.openCheckLogin,onOpenSelfHairLoss:s.beforeIntroCard,onOpenHospitalMap:s.openHospitalMap,onOpenHairThickStatus:s.setHairThicknessStatus,onOpenProductList:s.openProductList,onOpenHairLossBlog:s.openHairLossBlog,onOpenPersonaWorkflow:s.openPersonaWorkflow,onOpenDailyCare:s.openDailyCare},null,8,["onOpenPredict","onOpenHairCount","onOpenCheckLogin","onOpenSelfHairLoss","onOpenHospitalMap","onOpenHairThickStatus","onOpenProductList","onOpenHairLossBlog","onOpenPersonaWorkflow","onOpenDailyCare"]),i("div",Rl,[(o(!0),d(C,null,S(a.message,(w,me)=>(o(),d("div",{key:me,class:y(["message-box",w.type])},[M(g,{message:w,onMerge:s.addMergeFile,onDiagnosis:s.addDianosisFile,onChat:s.inputFuture,onSelfHairLoss:s.inputSelfHairLoss,onAgainDiagnosisQuestion:s.againDiagnosisQuestion,onOpenDiagnosisTypeM:s.openPredict,onDragFiles:s.predictImg,onDragDiagnosis:s.dragDiagnosis,onSelfDiagnosis:s.openSelfHairLoss,onSetHairThicknessFiles:s.setHairThicknessImg,onSetHairThicknessDefalutFiles:s.addSetHairThicknessFile,onAgainSetHairThicknessStatus:s.againSetHairThicknessStatus},null,8,["message","onMerge","onDiagnosis","onChat","onSelfHairLoss","onAgainDiagnosisQuestion","onOpenDiagnosisTypeM","onDragFiles","onDragDiagnosis","onSelfDiagnosis","onSetHairThicknessFiles","onSetHairThicknessDefalutFiles","onAgainSetHairThicknessStatus"]),w.relatedQuestions?.length?(o(),d("ul",wl,[(o(!0),d(C,null,S(w.relatedQuestions,(ge,lt)=>(o(),d("li",{key:`${me}-${lt}`,class:"item",onClick:_l=>s.inputFaq(ge)},h(ge),9,Pl))),128))])):u("",!0)],2))),128)),i("div",Tl,[a.chatEvaluation?(o(),d("button",{key:0,type:"button",class:"btn-evaluation mr-5",onClick:e[6]||(e[6]=(...w)=>s.openEvaluation&&s.openEvaluation(...w))},[M(T,{icon:"mdi:mdi-thumb-up-outline"})])):u("",!0),a.chatReport?(o(),d("button",{key:1,type:"button",class:"btn-evaluation",onClick:e[7]||(e[7]=(...w)=>s.openReport&&s.openReport(...w))},[M(T,{icon:"mdi:mdi-thumb-down-outline"})])):u("",!0)])])])],512),M(k,{modelValue:a.userMessage,"onUpdate:modelValue":e[8]||(e[8]=w=>a.userMessage=w),disabled:a.disabledFlag,focused:a.focusFlag,onSubmit:s.fetchProChat,onSetMerge:s.addMergeFile,onInputFaq:s.inputFaq},null,8,["modelValue","disabled","focused","onSubmit","onSetMerge","onInputFaq"]),a.popupFlag.reservation?(o(),m(_,{key:0,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.mediinfo?(o(),m(v,{key:1,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.clincal?(o(),m(I,{key:2,"current-page":a.selectedComponent,onClosePopup:s.closePopup},null,8,["current-page","onClosePopup"])):u("",!0),a.popupFlag.hair?(o(),m(U,{key:3,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.theisList?(o(),m(L,{key:4,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.search?(o(),m(E,{key:5,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.video?(o(),m(F,{key:6,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.predict?(o(),m(b,{key:7,"img-url":a.predictImgUrl,"before-img-url":a.beforeImgUrl,"merge-type":a.mergeType,"before-hair-thickness":a.hairThickness.beforeHairThickness,"after-hair-thickness":a.hairThickness.afterHairThickness,"after-value":a.afterValue,"chat-history-idx":a.predictChatHistoryIdx,onClosePopup:s.closePopup,onAuthExpired:s.handlePredictAuthExpired},null,8,["img-url","before-img-url","merge-type","before-hair-thickness","after-hair-thickness","after-value","chat-history-idx","onClosePopup","onAuthExpired"])):u("",!0),a.popupFlag.predictHistory?(o(),m(N,{key:8,onClosePopup:s.closePopup,onAuthExpired:s.handlePredictAuthExpired},null,8,["onClosePopup","onAuthExpired"])):u("",!0),a.popupFlag.evaluation?(o(),m(A,{key:9,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.report?(o(),m(K,{key:10,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.changeTell?(o(),m(W,{key:11,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.reservationStatus?(o(),m(le,{key:12,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.hairCount?(o(),m(H,{key:13,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.checkLogin?(o(),m(J,{key:14,onOpenLiteLogin:s.openAloLiteLogin,onClosePopup:s.closePopup},null,8,["onOpenLiteLogin","onClosePopup"])):u("",!0),a.popupFlag.aloLiteLoginFlag?(o(),m(X,{key:15,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.hospitalMap?(o(),m(de,{key:16,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.hairTickCount?(o(),m(tt,{key:17,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.productList?(o(),m(st,{key:18,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.popupFlag.hairlossBlog?(o(),m(it,{key:19,onClosePopup:s.closePopup},null,8,["onClosePopup"])):u("",!0),a.personaWorkflowFlag?(o(),m(at,{key:20,onClose:e[9]||(e[9]=w=>a.personaWorkflowFlag=!1),onAuthExpired:s.handlePersonaWorkflowAuthExpired},null,8,["onAuthExpired"])):u("",!0),a.dailyCareFlag?(o(),m(nt,{key:21,onClose:e[10]||(e[10]=w=>a.dailyCareFlag=!1),onAuthExpired:s.handleDailyCareAuthExpired},null,8,["onAuthExpired"])):u("",!0),a.eventModalFlag?(o(),m(rt,{key:22,onClosePopup:e[11]||(e[11]=w=>a.eventModalFlag=!1)})):u("",!0),a.loadingPageFlag?(o(),m(ot,{key:23})):u("",!0)])}const Hd=x(Il,[["render",Sl]]);export{Hd as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.