PageSourceSearch

https://maidinhk.com/assets/js/AiInterviewRoom-DfKNLaAF.js

js maidinhk.com collected 2026-09-24 14:15:55 UTC 65,320 bytes, 1 lines download raw bytes

1var p=(S,t,F)=>new Promise((e,oe)=>{var b=I=>{try{P(F.next(I))}catch(T){oe(T)}},w=I=>{try{P(F.throw(I))}catch(T){oe(T)}},P=I=>I.done?e(I.value):Promise.resolve(I.value).then(b,w);P((F=F.apply(S,t)).next())});import{c as _,r as v,R as ja,B as za,e as l,d as r,h as n,f as g,t as s,F as O,l as Y,n as N,z as Le,q as te,k as Bn,p as Un,m as qn,C as cn,b as Fn,g as ie,o as Oa,j as Wa,y as un,a as Ha}from"./vue-vendor-MWsMX6xc.js";import{_ as Va,b as D}from"./admin-ClYIr6YZ.js";const gn={en:{code:"en",label:"English",labelNative:"English"},fil:{code:"fil",label:"Filipino",labelNative:"Filipino"},id:{code:"id",label:"Indonesian",labelNative:"Bahasa Indonesia"}},Da="en";function Ka(){try{const S=localStorage.getItem("ai_interview_language");if(S&&gn[S])return S}catch(S){console.warn("Failed to read language from localStorage:",S)}return Da}const Ge=v(Ka()),W={required:{en:"Required",fil:"Kailangan",id:"Wajib"},optional:{en:"Optional",fil:"Opsyonal",id:"Opsional"},categories:{introduction:{en:"Introduction",fil:"Pagpapakilala",id:"Perkenalan"},experience:{en:"Experience",fil:"Karanasan",id:"Pengalaman"},skills:{en:"Skills",fil:"Kasanayan",id:"Keterampilan"},attitude:{en:"Attitude",fil:"Sikap",id:"Sikap"},safety:{en:"Safety",fil:"Kaligtasan",id:"Keselamatan"},language:{en:"Language",fil:"Wika",id:"Bahasa"},cooking:{en:"Cooking",fil:"Pagluluto",id:"Memasak"},cleaning:{en:"Cleaning",fil:"Paglilinis",id:"Membersihkan"},baby_care:{en:"Baby Care",fil:"Pag-aalaga ng Sanggol",id:"Perawatan Bayi"},childcare:{en:"Childcare",fil:"Pag-aalaga ng Bata",id:"Perawatan Anak"},elderly_care:{en:"Elderly Care",fil:"Pag-aalaga sa Matanda",id:"Perawatan Lansia"},work_ethic:{en:"Work Ethics",fil:"Etika sa Trabaho",id:"Etika Kerja"},adaptability:{en:"Adaptability",fil:"Kakayahang Umayon",id:"Adaptabilitas"},integrity:{en:"Integrity",fil:"Integridad",id:"Integritas"},follow_up:{en:"Follow-up",fil:"Kasunod na Tanong",id:"Tindak Lanjut"}},ui:{requiredBadge:{en:"Required Question",fil:"Kailangang Sagutin",id:"Pertanyaan Wajib"},optionalBadge:{en:"Optional Question",fil:"Opsyonal na Tanong",id:"Pertanyaan Opsional"},questionOverview:{en:"Interview Questions",fil:"Mga Tanong sa Interview",id:"Pertanyaan Wawancara"},requiredCount:{en:"Required",fil:"Kailangan",id:"Wajib"},optionalCount:{en:"Optional",fil:"Opsyonal",id:"Opsional"},totalCount:{en:"Total",fil:"Kabuuan",id:"Total"},languageHint:{en:"You may answer in English, Mandarin, or Cantonese",fil:"Maaari kang sumagot sa English, Mandarin, o Cantonese",id:"Anda dapat menjawab dalam bahasa Inggris, Mandarin, atau Kanton"},interviewRoom:{en:"AI Interview Room",fil:"AI Interview Room",id:"Ruang Wawancara AI"},practiceMode:{en:"Practice Mode",fil:"Practice Mode",id:"Mode Latihan",zh:"練習模式"},interviewInfo:{en:"Interview Info",fil:"Impormasyon sa Interview",id:"Info Wawancara"},employer:{en:"Employer",fil:"Employer",id:"Pemberi Kerja"},employerInfo:{en:"Employer Information",fil:"Impormasyon ng Employer",id:"Informasi Pemberi Kerja"},name:{en:"Name",fil:"Pangalan",id:"Nama"},phone:{en:"Phone",fil:"Telepono",id:"Telepon"},email:{en:"Email",fil:"Email",id:"Email"},notProvided:{en:"Not provided",fil:"Hindi ibinigay",id:"Tidak diberikan"},interviewSchedule:{en:"Interview Schedule",fil:"Iskedyul ng Interview",id:"Jadwal Wawancara"},time:{en:"Time",fil:"Oras",id:"Waktu"},type:{en:"Type",fil:"Uri",id:"Tipe"},location:{en:"Location",fil:"Lokasyon",id:"Lokasi"},meetingLink:{en:"Meeting Link",fil:"Link ng Meeting",id:"Tautan Rapat"},online:{en:"Online",fil:"Online",id:"Daring"},inPerson:{en:"In Person",fil:"Personal",id:"Tatap Muka"},notSet:{en:"Not set",fil:"Hindi nakatakda",id:"Belum diatur"},pending:{en:"Pending",fil:"Naghihintay",id:"Tertunda"},inProgress:{en:"In Progress",fil:"Nagpapatuloy",id:"Sedang Berlangsung"},completed:{en:"Completed",fil:"Nakumpleto",id:"Selesai"},back:{en:"Back",fil:"Bumalik",id:"Kembali"},startInterview:{en:"Start Interview",fil:"Simulan ang Interview",id:"Mulai Wawancara"},startAnswerShort:{en:"Start",fil:"Simulan",id:"Mulai"},finishAnswerShort:{en:"Finish",fil:"Tapusin",id:"Selesai"},endInterviewShort:{en:"End",fil:"Tapusin",id:"Akhiri"},startAnswering:{en:"Start Answering (Record)",fil:"Simulan ang Pagsagot (Record)",id:"Mulai Menjawab (Rekam)"},finishAnswering:{en:"Finish Answering (Send)",fil:"Tapusin ang Pagsagot (I-send)",id:"Selesai Menjawab (Kirim)"},recording:{en:"Recording...",fil:"Nagre-record...",id:"Merekam..."}
1,recordingWithTime:{en:"Recording (remaining ",fil:"Nagre-record (natitira ",id:"Merekam (tersisa "},processing:{en:"Processing...",fil:"Nagproproseso...",id:"Memproses..."},retrying:{en:"Retrying...",fil:"Naguulit...",id:"Mencoba Ulang..."},readyToAnswer:{en:'Press "Start Answering" to record (max 60s per round), press "Finish" when done',fil:'Pindutin ang "Simulan ang Pagsagot" para mag-record (max 60s kada round), pindutin ang "Tapos" kapag tapos na',id:'Tekan "Mulai Menjawab" untuk merekam (maks 60s per putaran), tekan "Selesai" saat selesai'},longPressToEnd:{en:"Long press to end",fil:"Long press para matapos",id:"Tekan lama untuk mengakhiri"},interviewSummary:{en:"Interview Summary",fil:"Buod ng Interview",id:"Ringkasan Wawancara"},keyStrengths:{en:"Key Strengths",fil:"Mga Kalakasan",id:"Kekuatan Utama"},areasForAttention:{en:"Areas for Attention",fil:"Mga Bagay na Dapat Pansinin",id:"Area yang Perlu Perhatian"},evaluation:{en:"Evaluation",fil:"Pagsusuri",id:"Evaluasi"},returnToHome:{en:"Return to Home",fil:"Bumalik sa Home",id:"Kembali ke Beranda"},redoInterview:{en:"Redo Interview (24h)",fil:"Ulitin ang Interview (24h)",id:"Ulangi Wawancara (24j)"},deadline:{en:"Deadline",fil:"Deadline",id:"Batas Waktu"},retryAnswer:{en:"Retry Answer",fil:"Ulitin ang Sagot",id:"Ulangi Jawaban"},micTestButton:{en:"Test Microphone",fil:"Subukan ang Mikropono",id:"Tes Mikrofon"},micTestShortButton:{en:"Test Mic",fil:"Test Mic",id:"Tes Mic"},micLevelTitle:{en:"Microphone Level",fil:"Antas ng Mikropono",id:"Level Mikrofon"},micReadyTitle:{en:"Microphone Ready",fil:"Handa ang Mikropono",id:"Mikrofon Siap"},micModalTitle:{en:"Microphone Test",fil:"Pagsubok ng Mikropono",id:"Tes Mikrofon"},micWarningTitle:{en:"Microphone Check",fil:"Suriin ang Mikropono",id:"Periksa Mikrofon"},micModalInstruction:{en:"Speak normally for a few seconds. If the bar barely moves, your microphone may not be working or the volume is too low.",fil:"Magsalita nang normal sa loob ng ilang segundo. Kung halos hindi gumagalaw ang bar, maaaring may problema ang mikropono o masyadong mahina ang volume.",id:"Bicaralah dengan normal selama beberapa detik. Jika batang hampir tidak bergerak, mikrofon Anda mungkin bermasalah atau volumenya terlalu rendah."},micTestStart:{en:"Start Test",fil:"Simulan ang Test",id:"Mulai Tes"},micTestRunning:{en:"Testing...",fil:"Sinusubukan...",id:"Menguji..."},close:{en:"Close",fil:"Isara",id:"Tutup"},continue:{en:"Continue",fil:"Magpatuloy",id:"Lanjutkan"},micStatusActiveGood:{en:"Microphone is picking up your voice",fil:"Naririnig ng mikropono ang iyong boses",id:"Mikrofon menangkap suara Anda"},micStatusActiveLow:{en:"Voice detected, but volume is low",fil:"May nadedetect na boses, pero mahina ang volume",id:"Suara terdeteksi, tetapi volumenya rendah"},micStatusActiveSilent:{en:"No clear voice detected",fil:"Walang malinaw na boses na nadetect",id:"Tidak ada suara yang terdeteksi dengan jelas"},micStatusActiveIdle:{en:"Start answering to verify live microphone input",fil:"Simulan ang pagsagot para masuri ang live microphone input",id:"Mulai menjawab untuk memeriksa input mikrofon secara langsung"},micStatusIdle:{en:"Use the test button before answering if needed",fil:"Gamitin ang test button bago sumagot kung kailangan",id:"Gunakan tombol tes sebelum menjawab jika perlu"},micTestStatusGood:{en:"Good signal detected",fil:"Magandang signal ang nadetect",id:"Sinyal bagus terdeteksi"},micTestStatusLow:{en:"Signal detected, but it is weak",fil:"May signal, pero mahina ito",id:"Sinyal terdeteksi, tetapi lemah"},micTestStatusSilent:{en:"No clear sound detected",fil:"Walang malinaw na tunog na nadetect",id:"Tidak ada suara jelas yang terdeteksi"},micTestStatusIdle:{en:"Press Start Test and speak normally",fil:"Pindutin ang Simulan ang Test at magsalita nang normal",id:"Tekan Mulai Tes lalu bicara dengan normal"},micWarningSilent:{en:"We are not detecting your voice clearly. Please check whether the microphone is blocked, muted, or connected to the wrong device.",fil:"Hindi namin malinaw na nadedetect ang iyong boses. Pakisuri kung natatakpan, naka-mute, o maling device ang nakakonekta sa mikropono.",id:"Kami tidak mendeteksi suara Anda dengan jelas. Periksa apakah mikrofon tertutup, mute, atau terhubung ke perangkat yang salah."},micWarningLow:{en:"Your voice is very quiet. Please move closer to the microphone or increase the microphone input volume.",fil:"Masyadong mahina ang iyong boses. Lumapit sa mikropono o lakasan ang microphone input volume.",id:"Suara Anda sangat pelan. Silakan mendekat ke mikrofon atau tingkatkan volume input mikrofon."},question:{en:"Question",fil:"Tanong",id:"Pertanyaan"}}};function Nn(){const S=_(()=>Ge.value),t=w=>{if(gn[w]){Ge.value=w;try{localStorage.setItem("ai_interview_language",w)}catch(P){console.warn("Failed to save language to localStorage:",P)}}},F=(w,P=null)=>{var T,H,A,o,k,K;const I=Ge.value;return P==="category"?((T=W.categories[w])==null?void 0:T[I])||((H=W.categories[w])==null?void 0:H.en)||w:P==="ui"?((A=W.ui[w])==null?void 0:A[I])||((o=W.ui[w])==null?void 0:o.en)||w:((k=W[w])==null?void 0:k[I])||((K=W[w])==null?void 0:K.en)||w};return{currentLanguage:S,setLanguage:t,supportedLanguages:gn,getLabel:F,getQuestionTypeLabel:w=>{const P=Ge.value;return w===!0?W.required[P]||W.required.en:w===!1?W.optional[P]||W.optional.en:""},getCategoryLabel:w=>F(w,"category"),getUILabel:w=>F(w,"ui")}}Nn();const Ga={name:"AiInterviewRoom",components:{Loader2:ja},props:{interviewId:{type:String,required:!0}},setup(S){const{currentLanguage:t,setLanguage:F,getQuestionTypeLabel:e,getCategoryLabel:oe,getUILabel:b,supportedLanguages:w}=Nn(),P=_(()=>Object.values(w)),I=v(!0),T=v(""),H=v(!1),A=v(!1),o=v(!1),k=v(!1),K=v(!1),U=v(!1),Ae=v(!1),Je=v(!1),Qe=v(!1),se=v(!1),me=v(null),re=v(null),C=v("pending"),x=v([]),G=v(null),E=v(null),jn=_(()=>{var a;return((a=E.value)==null?void 0:a.interview_source)==="self"}),Ce=v(null),he=v(0);let Pe=null,q=null,R=null,we=[],V=[],X=null,le=null,fe=null,ye=null,vn=0,ke=null,de=null,Z=null,xe=null,ce=null,$=null,Re=null,pe=null,Ee=!1;const be=_(()=>`ai-interview-reset-on-load:${S.interviewId}`),_e=v(60);let Be=null;const zn=60,mn=v(!1),Ye=v(!1),hn=v(!1),Xe=v(!1),Ze=v(!1),Ue=v(0),ee=v("idle"),$e=v(""),en=v(0),ue=v("idle"),qe=v(!1),wn=v(""),fn=v("en"),On=[{code:"en",label:"English"},{code:"fil",label:"Filipino"},{code:"id",label:"Bahasa"},{code:"hi",label:"हिन्दी"}],yn={en:{title:"Before You Start",subtitle:"Welcome to the AI Interview",intro1:"You will be asked questions about your background, work experience, housekeeping skills, caregiving skills, communication, and work attitude.",intro2:"Please stay in a quiet place with a stable internet connection and answer clearly.",tip1_title:"Be Honest & Specific",tip1_desc:'Give real examples from your past work experience. Avoid answering only "yes" or "no."',tip2_title:"Speak Clearly",tip2_desc:"Stay calm and speak at a steady pace. You may answer in English, Mandarin, or Cantonese.",tip3_title:"About 10–15 Minutes",tip3_desc:"The interview covers your experience, skills, and availability. A clear and sincere answer will help employers understand you better."},fil:{title:"Bago Ka Magsimula",subtitle:"Maligayang pagdating sa AI Interview",intro1:"Tatanungin ka tungk
1ol sa iyong background, karanasan sa trabaho, kasanayan sa paglilinis ng bahay, pag-aalaga, komunikasyon, at attitude sa trabaho.",intro2:"Mangyaring manatili sa tahimik na lugar na may matatag na koneksyon sa internet at sumagot nang malinaw.",tip1_title:"Maging Tapat at Tiyak",tip1_desc:'Magbigay ng totoong halimbawa mula sa iyong nakaraang karanasan sa trabaho. Iwasang sumagot ng "oo" o "hindi" lamang.',tip2_title:"Magsalita nang Malinaw",tip2_desc:"Manatiling kalmado at magsalita sa steady na bilis. Maaari kang sumagot sa English, Mandarin, o Cantonese.",tip3_title:"Mga 10–15 Minuto",tip3_desc:"Saklaw ng interview ang iyong karanasan, kasanayan, at availability. Ang malinaw at tapat na sagot ay makakatulong sa employer na mas maintindihan ka."},id:{title:"Sebelum Anda Mulai",subtitle:"Selamat datang di Wawancara AI",intro1:"Anda akan ditanya tentang latar belakang, pengalaman kerja, keterampilan rumah tangga, keterampilan merawat, komunikasi, dan sikap kerja Anda.",intro2:"Harap tetap di tempat yang tenang dengan koneksi internet yang stabil dan jawab dengan jelas.",tip1_title:"Jujur & Spesifik",tip1_desc:'Berikan contoh nyata dari pengalaman kerja Anda sebelumnya. Hindari menjawab hanya "ya" atau "tidak."',tip2_title:"Bicara dengan Jelas",tip2_desc:"Tetap tenang dan bicara dengan kecepatan yang stabil. Anda boleh menjawab dalam Bahasa Inggris, Mandarin, atau Kanton.",tip3_title:"Sekitar 10–15 Menit",tip3_desc:"Wawancara mencakup pengalaman, keterampilan, dan ketersediaan Anda. Jawaban yang jelas dan tulus akan membantu majikan memahami Anda lebih baik."},hi:{title:"शुरू करने से पहले",subtitle:"AI इंटरव्यू में आपका स्वागत है",intro1:"आपसे आपकी पृष्ठभूमि, कार्य अनुभव, गृह कार्य कौशल, देखभाल कौशल, संवाद और कार्य दृष्टिकोण के बारे में प्रश्न पूछे जाएंगे।",intro2:"कृपया शांत जगह पर रहें जहाँ स्थिर इंटरनेट कनेक्शन हो और स्पष्ट रूप से उत्तर दें।",tip1_title:"ईमानदार और विशिष्ट रहें",tip1_desc:'अपने पिछले कार्य अनुभव से वास्तविक उदाहरण दें। केवल "हाँ" या "नहीं" में उत्तर देने से बचें।',tip2_title:"स्पष्ट बोलें",tip2_desc:"शांत रहें और एक स्थिर गति से बोलें। आप अंग्रेजी, मंदारिन या कैंटोनीज़ में उत्तर दे सकते हैं।",tip3_title:"लगभग 10–15 मिनट",tip3_desc:"इंटरव्यू में आपके अनुभव, कौशल और उपलब्धता को शामिल किया जाएगा। स्पष्ट और ईमानदार उत्तर नियोक्ता को आपको बेहतर समझने में मदद करेगा।"}},Wn=_(()=>yn[fn.value]||yn.en),Hn={communication_skill:"Communication Skill / 溝通能力",experience:"Experience / 工作經驗",work_attitude_responsibility:"Work Attitude and Responsibility / 工作態度與責任感",housekeeping_skills:"Housekeeping Skills / 家務技能",safety_awareness_response:"Safety Awareness and Response Ability / 安全意識與應變能力",integrity_work_motivation:"Integrity and Work Motivation / 誠信與工作動力",overall:"Overall Fit / 整體配合度"},Vn={childcare:"Childcare / 照顧小孩",baby_care:"Baby Care / 嬰兒照顧",elderly_care:"Elderly Care / 長者照顧",cooking:"Cooking / 烹飪"},Dn=a=>{if(!a)return 0;const i=[a.communication_skill,a.experience,a.work_attitude_responsibility,a.housekeeping_skills,a.safety_awareness_response,a.integrity_work_motivation],d=i.reduce((c,u)=>c+(u||0),0);return Math.round(d/(i.length*5)*100)},Kn=a=>{const i=Number(a);return Number.isFinite(i)?Math.max(0,Math.min(100,Math.round(i))):0},Gn=a=>a?{communication_skill:a.communication_skill||0,experience:a.experience||0,work_attitude_responsibility:a.work_attitude_responsibility||0,housekeeping_skills:a.housekeeping_skills||0,safety_awareness_response:a.safety_awareness_response||0,integrity_work_motivation:a.integrity_work_motivation||0,overall:a.overall||0}:{},Jn=()=>{Ye.value=!Ye.value},Te=v(!1),Me=v(0),Fe=v(3),nn=3e3;let an=null,ne=null;const Qn=_(()=>E.value?E.value.interview_date||b("notSet"):""),Yn=_(()=>{if(!E.value)return"";const a=E.value.interview_time||"";return a?a.substring(0,5):b("notSet")}),Xn=_(()=>{var d,c;const a=(c=(d=E.value)==null?void 0:d.user)==null?void 0:c.phone;if(!a)return"";const i=String(a).replace(/\D/g,"");return i.length>=8?`${i.slice(0,4)}****${i.slice(-2)}`:i.length>=4?`${i.slice(0,2)}****${i.slice(-1)}`:"****"}),Zn=_(()=>{var u,f;const a=(f=(u=E.value)==null?void 0:u.user)==null?void 0:f.email;if(!a)return"";const[i,d]=String(a).split("@");return d?`${(i==null?void 0:i.slice(0,1))||"*"}***@${d}`:""}),$n=_(()=>{var i;const a=(i=E.value)==null?void 0:i.interview_type;return a?a==="online"?b("online"):a==="offline"?b("inPerson"):a:""}),ea=_(()=>{var i;const a=(i=E.value)==null?void 0:i.interview_location;return!a||a==="線上"||a==="Online"?"":a}),na=_(()=>{var i;const a=(i=E.value)==null?void 0:i.online_meeting_url;return a||""}),aa=_(()=>
1{switch(C.value){case"pending":return b("pending");case"in_progress":return b("inProgress");case"completed":return b("completed");default:return""}}),ta=a=>{const i=Math.floor(a/60),d=a%60;return`${i}:${d.toString().padStart(2,"0")}`},ia=a=>({introduction:"自我介紹",experience:"工作經驗",skills:"家務技能",attitude:"工作態度",safety:"安全意識",language:"語言能力",cooking:"烹飪技能",cleaning:"清潔技能",baby_care:"嬰兒護理",childcare:"兒童照顧",elderly_care:"老人護理",work_ethic:"職業道德",adaptability:"應變能力",integrity:"誠信動機",follow_up:"追問"})[a]||a,oa=a=>a==="overall",sa=_(()=>{var a;return!!((a=G.value)!=null&&a.focus_scores&&Object.keys(G.value.focus_scores).length>0)}),ra=a=>a==="ai"?"AI Interviewer":a==="system"?"System":"Your Answer",Se=a=>{const i=t.value||"en";return a[i]||a.en},kn=a=>{const i=String(a||"").toLowerCase();return i.includes("stt_rate_limit")||i.includes("resource exhausted")||i.includes("quota")||i.includes("gemini")||i.includes("ai response failed")||i.includes("stt service")||i.includes("tts service")||i.includes("model")||i.includes("429")},pn=()=>Se({en:"System notice: AI service is busy right now. Please wait 5-10 seconds and try again.",fil:"Paalala ng system: Abala ngayon ang AI service. Maghintay ng 5-10 segundo at subukan muli.",id:"Pemberitahuan sistem: Layanan AI sedang sibuk sekarang. Tunggu 5-10 detik lalu coba lagi."}),bn=()=>Se({en:"System notice: Processing failed. Please try again.",fil:"Paalala ng system: Nabigo ang pagproseso. Pakisubukang muli.",id:"Pemberitahuan sistem: Pemrosesan gagal. Silakan coba lagi."}),la=()=>Se({en:"(No clear voice detected. Please try again.)",fil:"(Walang malinaw na boses na na-detect. Pakisubukang muli.)",id:"(Tidak ada suara yang terdeteksi dengan jelas. Silakan coba lagi.)"}),da=a=>{const i=((a==null?void 0:a.message)||"").trim();return kn(i)?pn():i?`${bn()} (${i})`:bn()},Ie=(a,i="generic")=>{const d=((a==null?void 0:a.message)||"").trim();return kn(d)?pn():i==="end"?Se({en:d||"Failed to end interview. Please try again.",fil:d||"Hindi natapos ang interview. Pakisubukang muli.",id:d||"Gagal mengakhiri wawancara. Silakan coba lagi."}):d||Se({en:"Operation failed. Please try again.",fil:"Nabigo ang operasyon. Pakisubukang muli.",id:"Operasi gagal. Silakan coba lagi."})},ca=_(()=>x.value.filter(a=>a.role==="ai").length),ua=_(()=>x.value.filter(a=>a.role==="helper").length),ga=_(()=>{var i,d;const a=Number((d=(i=re.value)==null?void 0:i.summary)==null?void 0:d.totalCount);return Number.isFinite(a)&&a>0?a:3}),_n=_(()=>x.value.filter(i=>i.role==="helper").length>0&&C.value==="in_progress"),va=_(()=>{const a=Math.max(0,_e.value||0),i=String(Math.floor(a/60)).padStart(2,"0"),d=String(a%60).padStart(2,"0");return`${i}:${d}`}),ma=_(()=>U.value?en.value:Ue.value),ha=_(()=>U.value?ue.value==="good"?b("micStatusActiveGood"):ue.value==="low"?b("micStatusActiveLow"):ue.value==="silent"?b("micStatusActiveSilent"):b("micStatusActiveIdle"):b("micStatusIdle")),wa=_(()=>ee.value==="good"?b("micTestStatusGood"):ee.value==="low"?b("micTestStatusLow"):ee.value==="silent"?b("micTestStatusSilent"):b("micTestStatusIdle")),Ne=()=>{Be&&(clearInterval(Be),Be=null)},fa=()=>{Ne(),_e.value=zn,Be=setInterval(()=>{_e.value=Math.max(0,(_e.value||0)-1),_e.value<=0&&xn(!0)},1e3)},J=()=>p(this,null,function*(){yield un(),Ce.value&&(Ce.value.scrollTop=Ce.value.scrollHeight)}),ge=v(null),tn=v(null);let j=null;const ya=a=>p(this,null,function*(){if(ge.value===a.turn_number){j&&(j.pause(),j=null),ge.value=null;return}j&&(j.pause(),j=null),ge.value=null,tn.value=a.turn_number;try{const{data:i}=yield D("/api/interviews/speech",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"tts",text:a.content_text_en||a.content_text,question_id:a.question_id||null,language_code:t.value==="en"||!a.question_id?"en-US":"yue-HK"})});if(i.audio_base64){const d=i.audio_mime_type||"audio/wav";j=new Audio(`data:${d};base64,${i.audio_base64}`),ge.value=a.turn_number,j.onended=()=>{ge.value=null,j=null},j.play()}}catch(i){console.error("TTS error:",i)}finally{tn.value=null}}),ae=()=>localStorage.getItem("auth_token"),Tn=a=>{const i=new Uint8Array(a.fftSize);a.getByteTimeDomainData(i);let d=0;for(let u=0;u<i.length;u+=1){const f=(i[u]-128)/128;d+=f*f}const c=Math.sqrt(d/i.length);return Math.min(1,c*6)},Mn=a=>a>=.12?"good":a>=.035?"low":"silent",Sn=()=>typeof window=="undefined"?null:window.AudioContext||window.webkitAudioContext||null,on=()=>p(this,null,function*(){if(xe&&(cancelAnimationFrame(xe),xe=null),ke&&(ke.getTracks().forEac
1h(a=>a.stop()),ke=null),de){try{yield de.close()}catch(a){}de=null}Z=null,Ze.value=!1}),je=()=>p(this,null,function*(){if(Re&&(cancelAnimationFrame(Re),Re=null),ce){try{yield ce.close()}catch(a){}ce=null}$=null,en.value=0,ue.value="idle",pe=null,Ee=!1}),ka=a=>{qe.value||Ee||(Ee=!0,wn.value=a,qe.value=!0)},pa=a=>p(this,null,function*(){yield je();const i=a.getAudioTracks(),d=Sn();if(!i.length||!d)return;const c=new MediaStream(i);ce=new d;const u=ce.createMediaStreamSource(c);$=ce.createAnalyser(),$.fftSize=1024,$.smoothingTimeConstant=.85,u.connect($);const f=()=>{if(!$)return;const L=Tn($);en.value=L;const y=Mn(L);ue.value=y;const h=Date.now();y==="silent"||y==="low"?pe?!Ee&&h-pe>3500&&ka(b(y==="silent"?"micWarningSilent":"micWarningLow")):pe=h:pe=null,Re=requestAnimationFrame(f)};f()}),In=()=>p(this,null,function*(){$e.value="",ee.value="idle",Ue.value=0;try{yield on();const a=Sn();if(!a)throw new Error("This browser does not support microphone analysis.");ke=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!1}),de=new a;const i=de.createMediaStreamSource(ke);Z=de.createAnalyser(),Z.fftSize=1024,Z.smoothingTimeConstant=.85,i.connect(Z),Ze.value=!0;const d=()=>{if(!Z)return;const c=Tn(Z);Ue.value=c,ee.value=Mn(c),xe=requestAnimationFrame(d)};d()}catch(a){$e.value=(a==null?void 0:a.message)||"Unable to access microphone.",ee.value="silent"}}),Ln=()=>p(this,null,function*(){Xe.value=!0,yield In()}),ba=()=>p(this,null,function*(){Xe.value=!1,yield on()}),An=()=>{qe.value=!1},_a=()=>p(this,null,function*(){An(),yield Ln()}),Q=v(null),Ta=v(null),sn=v(""),rn=v(!1),Ma=()=>{Q.value&&(Q.value.srcObject=null),rn.value=!1},ze=()=>{fe&&fe!==ye&&fe.getTracks().forEach(a=>a.stop()),ye&&ye.getTracks().forEach(a=>a.stop()),fe=null,ye=null,U.value||Ma()},Cn=a=>p(this,null,function*(){if(Q.value){Q.value.srcObject=a,rn.value=!0;try{yield Q.value.play()}catch(i){}}}),Pn=()=>p(this,null,function*(){if(C.value!=="in_progress"||U.value||A.value)return;const a=++vn;ze();const i=yield navigator.mediaDevices.getUserMedia({audio:!1,video:{width:{ideal:640},height:{ideal:480},frameRate:{ideal:15,max:30},facingMode:"user"}});if(a!==vn){i.getTracks().forEach(d=>d.stop());return}ye=i,fe=i,yield Cn(i)}),Oe=_(()=>typeof window!="undefined"&&typeof window.MediaRecorder!="undefined"),We=a=>{if(!Oe.value)return null;for(const i of a)try{if(MediaRecorder.isTypeSupported(i))return i}catch(d){console.warn(`Mime type check failed for ${i}:`,d)}return null},He=()=>{C.value==="in_progress"?sessionStorage.setItem(be.value,"1"):sessionStorage.removeItem(be.value)},Sa=()=>{const a=sessionStorage.getItem(be.value)==="1";return a&&sessionStorage.removeItem(be.value),a},Ia=()=>p(this,null,function*(){try{const a=ae(),{response:i,data:d}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"reset"})});return i.ok?(x.value=[],G.value=null,C.value="pending",re.value=null,sessionStorage.removeItem(be.value),!0):(console.error("Reset interview failed:",d==null?void 0:d.error),!1)}catch(a){return console.error("Reset interview error:",a),!1}}),ln=()=>p(this,null,function*(){var a,i,d,c,u,f;I.value=!0,T.value="";try{const L=ae(),{response:y,data:h}=yield D(`/api/interviews/ai-session?interview_id=${S.interviewId}`,{method:"GET",headers:{Authorization:`Bearer ${L}`}});if(!y.ok)throw new Error((h==null?void 0:h.error)||"Failed to load session");const M=Sa(),z=((a=h.result)==null?void 0:a.status)||"pending",m=(((i=h.conversations)==null?void 0:i.length)||0)>0;M&&z==="in_progress"||z==="pending"&&m?(console.log("Resetting stale interview state...",{shouldResetFromRefresh:M,status:z,hasConversations:m}),(yield Ia())?(E.value=h.interview||null,se.value=!1,me.value=null):(console.warn("Failed to reset interview, showing original data"),x.value=h.conversations||[],G.value=h.result||null,E.value=h.interview||null,C.value=z,se.value=h.can_redo||!1,me.value=h.redo_deadline||null,re.value=((d=h.result)==null?void 0:d.question_bank)||h.question_bank||null,C.value==="in_progress"&&dn((c=h.result)==null?void 0:c.started_at))):(x.value=h.conversations||[],G.value=h.result||null,E.value=h.interview||null,C.value=z,se.value=h.can_redo||!1,me.value=h.redo_deadline||null,re.value=((u=h.result)==null?void 0:u.question_bank)||h.question_bank||null,C.value==="in_progress"&&dn((f=h.result)==null?void 0:f.started_at))}
1catch(L){T.value=Ie(L)}finally{I.value=!1}}),La=()=>p(this,null,function*(){var a;H.value=!0;try{const i=ae(),{response:d,data:c}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"start",language:t.value})});if(!d.ok)throw new Error((c==null?void 0:c.error)||"Failed to start session");C.value="in_progress",re.value=c.question_bank||null,c.status==="resumed"?x.value=c.conversations||[]:x.value=[{turn_number:c.turn_number||1,role:"ai",content_text:c.ai_response,is_required:c.is_required,category:c.category,question_id:c.question_id}],dn(((a=c.result)==null?void 0:a.started_at)||new Date().toISOString()),yield un(),yield Pn(),J()}catch(i){T.value=Ie(i),console.error("Session start error:",i)}finally{H.value=!1}}),Aa=()=>p(this,null,function*(){if(!(A.value||U.value||Ae.value)){mn.value=!1,Ae.value=!0;try{ze(),yield Pa(),fa()}catch(a){console.error("Failed to start answer:",a)}finally{Ae.value=!1}}}),xn=(a=!1)=>{!U.value||A.value||(mn.value=a,Ne(),xa())},Ca=()=>p(this,null,function*(){if(!R)return;if(R.state!=="recording"){yield new Promise(i=>setTimeout(i,150));return}const a=R;yield new Promise(i=>{let d=!1;const c=()=>{d||(d=!0,setTimeout(i,150))};try{a.addEventListener("stop",c,{once:!0}),a.stop()}catch(u){console.warn("Failed to stop video recorder cleanly:",u),c()}setTimeout(c,1200)})}),Pa=()=>p(this,null,function*(){try{sn.value="",hn.value=!1;const a={audio:!0,video:{width:{ideal:640},height:{ideal:480},frameRate:{ideal:15,max:30},facingMode:"user"}},i=yield navigator.mediaDevices.getUserMedia(a);X=i,yield pa(i),yield Cn(i),we=[],V=[];const d=i.getAudioTracks(),c=i.getVideoTracks(),u=d.length?new MediaStream(d):new MediaStream,f=c.length?new MediaStream([...c,...d]):null;console.log("[Video Debug] Recording streams prepared:",{audioTrackCount:u.getAudioTracks().length,videoTrackCount:c.length,processedStreamAudioTrackCount:(f==null?void 0:f.getAudioTracks().length)||0,hasProcessedStream:!!f});const L=/iPhone|iPad|iPod|Android/i.test(navigator.userAgent);let y="";L?y=We(["audio/mp4","audio/webm",""]):y=We(["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus",""])||"",L?le=We(["video/mp4","video/webm"]):le=We(["video/webm;codecs=vp8,opus","video/webm;codecs=vp9,opus","video/webm",""]);const h={};y&&(h.mimeType=y);try{q=new MediaRecorder(u,h)}catch(M){console.warn("Failed to create MediaRecorder with audioMime:",y,M),q=new MediaRecorder(u)}if(q.ondataavailable=M=>{M.data.size>0&&we.push(M.data)},Oe.value)try{if(!f)throw new Error("No processed video stream available for recording");le?R=new MediaRecorder(f,{mimeType:le,videoBitsPerSecond:52e4}):R=new MediaRecorder(f,{videoBitsPerSecond:52e4}),R.ondataavailable=M=>{M.data.size>0&&V.push(M.data)},console.log("[Video Debug] Video recorder initialized:",{requestedMimeType:le||"(browser default)",actualVideoTrackCount:f.getVideoTracks().length,actualAudioTrackCount:f.getAudioTracks().length})}catch(M){console.warn("Video recorder initialization failed, will proceed with audio only:",M),R=null,V=[]}else R=null,V=[];q.onstop=()=>p(this,null,function*(){U.value=!1,yield Ca(),yield new Promise(Ke=>setTimeout(Ke,250)),console.log("[Video Debug] MediaRecorder stopped."),console.log(`[Video Debug] Collected audio chunks: ${we.length}, video chunks: ${V.length}`);const M=()=>{X&&(X.getTracks().forEach(Ke=>Ke.stop()),X=null),je(),Q.value&&(Q.value.srcObject=null)},z=q.mimeType||y||"audio/webm",m=we.length?new Blob(we,{type:z}):null,ve=R?R.mimeType||le||"video/webm":null,B=V.length?new Blob(V,{type:ve}):null;console.log("[Video Debug] Blob summary:",{audioMime:z,audioBlobSize:(m==null?void 0:m.size)||0,videoMime:ve,videoBlobSize:(B==null?void 0:B.size)||0,videoChunkCount:V.length}),B?console.log(`[Video Debug] Created Video Blob - Size: ${(B.size/1024).toFixed(2)} KB, Type: ${B.type}`):console.warn("[Video Debug] No video blob was created. Video chunks may be empty."),M(),m?yield Ra(m,B,ve):(console.warn("No audio data recorded"),A.value=!1)});try{q.start()}
1catch(M){throw new Error("無法啟動主錄音程序: "+M.message)}if(R&&Oe.value)try{R.start()}catch(M){console.warn("Video recorder start failed, but audio will continue:",M),R=null,V=[]}U.value=!0}catch(a){Ne(),U.value=!1,je();let i="請允許權限後再試。";a.name==="NotAllowedError"||a.name==="PermissionDeniedError"?i="權限被拒絕,請在瀏覽器設定中允許使用鏡頭和麥克風。":a.name==="NotFoundError"||a.name==="DevicesNotFoundError"?i="找不到鏡頭或麥克風設備。":a.name==="NotReadableError"||a.name==="TrackStartError"?i="鏡頭或麥克風正被其他程式使用中。":i=a.message||i;const d=`無法使用鏡頭/麥克風 (${a.name}):${i}`;T.value=d,sn.value=d,console.error("Microphone/Camera error:",a)}}),xa=()=>{U.value=!1,q&&q.state==="recording"&&q.stop()},Rn=a=>new Promise((i,d)=>{const c=new Blob([a],{type:a.type});try{const u=new FileReader;u.onloadend=()=>{if(typeof u.result=="string")try{const f=u.result.indexOf("base64,");if(f!==-1){const L=u.result.substring(f+7);i(L)}else{const L=u.result.split(",");i(L[L.length-1]||"")}}catch(f){console.error("[Video Debug] Error extracting base64:",f),i(null)}else i(null)},u.onerror=d,u.readAsDataURL(c)}catch(u){console.error("[Video Debug] FileReader setup failed:",u),i(null)}}),Ra=(a,i=null,d=null)=>p(this,null,function*(){A.value=!0,k.value=!0;try{console.log("[Video Debug] ProcessAudio started...");let c=null;try{c=yield Rn(a),console.log(`[Video Debug] Audio converted to Base64, length: ${c==null?void 0:c.length}`)}catch(B){throw new Error("Failed to process audio data")}let u=null;if(i&&i.size>0)try{console.log("[Video Debug] Starting video to Base64 conversion..."),u=yield Rn(i),console.log(`[Video Debug] Video converted to Base64 successfully, length: ${u==null?void 0:u.length}`),u&&u.length<100&&console.log("[Video Debug] WARNING: base64Video is suspiciously short:",u)}catch(B){console.error("[Video Debug] Failed to convert video blob to base64:",B)}else console.log("[Video Debug] No valid videoBlob provided to processAudio, skipping Base64 conversion");console.log("[Video Debug] Pre-send payload summary:",{hasAudioBlob:!!a,audioBlobSize:(a==null?void 0:a.size)||0,hasVideoBlob:!!i,videoBlobSize:(i==null?void 0:i.size)||0,videoMimeType:d||null,hasBase64Video:!!u,base64VideoLength:(u==null?void 0:u.length)||0}),J();const f=ae(),{response:L,data:y}=yield D("/api/interviews/speech",{method:"POST",headers:{Authorization:`Bearer ${f}`,"Content-Type":"application/json"},body:JSON.stringify({action:"stt",audio_base64:c})});if(k.value=!1,!L.ok)throw(y==null?void 0:y.code)==="STT_RATE_LIMIT"||L.status===429?new Error("STT_RATE_LIMIT"):new Error((y==null?void 0:y.error)||(y==null?void 0:y.warning)||`Could not transcribe audio (HTTP ${L.status}).`);y!=null&&y.transcript||(console.warn("STT returned empty transcript or warning:",y),y.transcript=la());const h=y.transcript,M=x.value.length+1;x.value.push({turn_number:M,role:"helper",content_text:h}),J(),K.value=!0,J(),console.log("[Video Debug] Sending POST request to /api/interviews/ai-session with video data");const{response:z,data:m}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${f}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"send_message",helper_text:h,audio_base64:c,video_base64:u,video_mime:d,language:t.value})});if(K.value=!1,!z.ok)throw new Error((m==null?void 0:m.error)||"AI response failed");console.log("[Video Debug] AI session upload result:",{turn_number:m==null?void 0:m.turn_number,video_uploaded:m==null?void 0:m.video_uploaded,video_path:(m==null?void 0:m.video_path)||null,video_upload_error:(m==null?void 0:m.video_upload_error)||null,audio_uploaded:m==null?void 0:m.audio_uploaded,audio_path:(m==null?void 0:m.audio_path)||null,audio_upload_error:(m==null?void 0:m.audio_upload_error)||null}),m&&m.audio_uploaded===!1&&console.warn("[AI Interview] Audio provided but not uploaded:",{audio_path:m.audio_path,turn_number:m.turn_number});const ve={turn_number:m.turn_number,role:"ai",content_text:m.ai_response,is_required:m.is_required,
1category:m.category,question_id:m.question_id};x.value.push(ve),J(),m.should_end&&Ve().catch(B=>console.error("Failed to auto-end session:",B))}catch(c){T.value="";const u=x.value.length+1;x.value.push({turn_number:u,role:"system",content_text:da(c)}),J(),console.error("Audio processing error:",c)}finally{k.value=!1,K.value=!1,A.value=!1}}),Ea=()=>{if(A.value||C.value!=="in_progress")return;Te.value=!0,Me.value=0,Fe.value=3,an=Date.now();const a=()=>{const i=Date.now()-an;if(Me.value=Math.min(i/nn,1),Fe.value=Math.max(0,Math.ceil((nn-i)/1e3)),i>=nn){Te.value=!1,Me.value=0,En();return}ne=requestAnimationFrame(a)};ne=requestAnimationFrame(a)},Ba=()=>{Te.value&&(Te.value=!1,Me.value=0,Fe.value=3,an=null,ne&&(cancelAnimationFrame(ne),ne=null))},Ve=()=>p(this,null,function*(){if(C.value!=="completed"){A.value=!0,o.value=!0;try{const a=ae(),{response:i,data:d}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"end"})});if(!i.ok)throw new Error((d==null?void 0:d.error)||"Failed to end session");C.value="completed",G.value=d,De(),J()}catch(a){T.value=Ie(a,"end"),console.error("Session end error:",a)}finally{A.value=!1,o.value=!1}}}),dn=a=>{if(a){const i=new Date(a);he.value=Math.floor((Date.now()-i.getTime())/1e3)}else he.value=0;De(),Pe=setInterval(()=>{he.value++,he.value>=1800&&C.value==="in_progress"&&(console.log("Auto-ending session after 30 minutes"),Ve())},1e3)},De=()=>{Pe&&(clearInterval(Pe),Pe=null)},Ua=()=>{De(),window.history.pushState({page:"helper-dashboard"},"","/helper-dashboard"),window.dispatchEvent(new CustomEvent("page-change",{detail:{page:"helper-dashboard"}}))},En=()=>Ve(),qa=a=>a?new Date(a).toLocaleString("zh-HK",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"",Fa=()=>p(this,null,function*(){if(se.value&&confirm("確定要重新面試嗎?之前的面試記錄將被刪除,且只能重做一次。")){Qe.value=!0,T.value="";try{const a=ae(),{response:i,data:d}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"redo"})});if(!i.ok)throw new Error((d==null?void 0:d.error)||"Failed to redo interview");x.value=[],G.value=null,C.value="pending",se.value=!1,me.value=null,yield ln()}catch(a){T.value=Ie(a),console.error("Redo interview error:",a)}finally{Qe.value=!1}}}),Na=()=>p(this,null,function*(){if(_n.value){Je.value=!0,T.value="";try{const a=ae(),{response:i,data:d}=yield D("/api/interviews/ai-session",{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({interview_id:S.interviewId,action:"retry_turn"})});if(!i.ok)throw new Error((d==null?void 0:d.error)||"Failed to retry turn");x.value=d.conversations||[],d.current_question&&console.log("Retry ready. Current question:",d.current_question),J()}catch(a){T.value=Ie(a),console.error("Retry turn error:",a)}finally{Je.value=!1}}});return Oa(()=>{window.addEventListener("beforeunload",He),window.addEventListener("pagehide",He),ln()}),Wa(C,a=>p(this,null,function*(){if(a==="in_progress"&&!U.value&&!A.value)try{yield un(),yield Pn()}catch(i){console.error("Failed to start camera preview:",i)}else a!=="in_progress"&&ze()})),Ha(()=>{if(window.removeEventListener("beforeunload",He),window.removeEventListener("pagehide",He),De(),Ne(),on(),je(),q&&q.state==="recording"&&q.stop(),R&&R.state==="recording")try{R.stop()}catch(a){}X&&(X.getTracks().forEach(a=>a.stop()),X=null),ze(),ne&&cancelAnimationFrame(ne)}),{loading:I,errorMsg:T,starting:H,processing:A,isEndingSession:o,isTranscribing:k,isAiThinking:K,isRecording:U,isCameraLoading:Ae,sessionStatus:C,conversations:x,result:G,interviewDetails:E,isSelfPractice:jn,helperAnswerCount:ua,interviewDate:Qn,interviewTime:Yn,maskedEmployerPhone:Xn,maskedEmployerEmail:Zn,interviewTypeLabel:$n,interviewLocationText:ea,interviewMeetingUrl:na,chatAreaRef:Ce,elapsedSeconds:he,statusLabel:aa,answerCountdownLabel:va,displayMicLevel:ma,micStatusText:ha,micTestStatusText:wa,cameraVideoRef:Q,processingCanvasRef:Ta,cameraError:sn,hasCameraPreview:rn,showMicTestModal:Xe,micTestRunning:Ze,micTestVolume:Ue,micTestStatus:ee,micTestError:$e,liveMicStatus:ue,showMicWarningModal:qe,micWarningMessage:wn,isMediaRecorderSupported:Oe,endHoldActive:Te,endHoldProgress:Me,endHoldCountdown:Fe,formatElapsed:ta,formatCategory:ia,showInterviewInfo:Ye,toggleInterviewInfo:Jn,loadSession:ln,startSession:La,openMicTestModal:Ln,closeMicTestModal:ba,startMicTest:In,startAnswer:Aa,finishAnswer:xn,dismissMicWarningModal:An,handleMicWarningTest:_a,startEndHold:Ea,cancelEndHold:Ba,endSession:Ve,endSessionUnified:En,retryCurrentTurn:Na,redoInterview:Fa,formatRedoDeadline:qa,handleBack:Ua,scoreLabels:Hn,focusScoreLabels:Vn,formatInterviewScore:Kn,calculateTotalScore:Dn,displayEvaluation:Gn,isFocusDimension:oa,hasFocusScores:sa,aiQuestionCount:ca,plannedQuestionCount:ga,retrying:Je,canRetry:_n,redoing:Qe,canRedoInterview:se,redoDeadline:me,questionBank:re,interviewLang:t,setInterviewLang:F,interviewLanguages:P,getQuestionTypeLabel:e,getCategoryLabel:oe,getUILabel:b,getMe
1ssageRoleLabel:ra,welcomeLang:fn,welcomeLangs:On,welcomeText:Wn,cameraCollapsed:hn,ttsPlayingTurn:ge,ttsLoadingTurn:tn,playTTS:ya}}},Ja={class:"ai-interview-room"},Qa={class:"room-header"},Ya={class:"header-info"},Xa={key:0,class:"elapsed-timer"},Za={class:"interview-lang-switcher"},$a=["onClick","title"],et={key:0,class:"interview-progress"},nt={class:"progress-text"},at={class:"progress-track"},tt={key:1,class:"practice-mode-badge"},it={key:2,class:"interview-info-banner"},ot={class:"info-cards"},st={class:"info-card"},rt={class:"card-title"},lt={class:"card-body"},dt={class:"card-row"},ct={class:"card-label"},ut={class:"card-value"},gt={key:0,class:"card-row"},vt={class:"card-label"},mt={class:"card-value"},ht={key:1,class:"card-row"},wt={class:"card-label"},ft={class:"card-value"},yt={class:"info-card"},kt={class:"card-title"},pt={class:"card-body"},bt={class:"card-row"},_t={class:"card-label"},Tt={class:"card-value"},Mt={key:0,class:"card-row"},St={class:"card-label"},It={class:"card-value"},Lt={key:1,class:"card-row"},At={class:"card-label"},Ct={class:"card-value"},Pt={key:2,class:"card-row"},xt={class:"card-label"},Rt=["href"],Et={key:3,class:"room-loading"},Bt={key:4,class:"room-error"},Ut={key:0,class:"interview-main-content"},qt={key:0,class:"active-border"},Ft={class:"interview-inner"},Nt={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},jt={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},zt={class:"camera-frame"},Ot={key:0,class:"camera-loading-overlay"},Wt={key:1,class:"camera-idle-hint"},Ht={ref:"cameraVideoRef",class:"camera-video",autoplay:"",muted:"",playsinline:""},Vt={ref:"processingCanvasRef",style:{display:"none"}},Dt={class:"chat-area",ref:"chatAreaRef"},Kt={key:0,class:"welcome-screen"},Gt={class:"welcome-title"},Jt={class:"welcome-subtitle"},Qt={class:"before-you-start-text"},Yt={key:0,class:"question-bank-overview"},Xt={class:"question-stats"},Zt={class:"stat-item"},$t={class:"stat-number required"},ei={class:"stat-label"},ni={class:"stat-item"},ai={class:"stat-number optional"},ti={class:"stat-label"},ii={class:"stat-item"},oi={class:"stat-number total"},si={class:"stat-label"},ri={key:0,class:"question-categories"},li={class:"welcome-instructions"},di={class:"instruction-item"},ci={class:"instruction-item"},ui={class:"instruction-item"},gi={key:0,class:"instruction-item"},vi={key:1,class:"language-hint"},mi={class:"message-avatar"},hi={key:0},wi={key:1},fi={key:2},yi={class:"message-content"},ki={class:"message-role-label"},pi={key:0,class:"question-badges"},bi={key:0,class:"badge required"},_i={key:1,class:"badge optional"},Ti={key:2,class:"badge category"},Mi={key:1,class:"bilingual-content"},Si={class:"question-en"},Ii={class:"question-native"},Li={key:2},Ai=["onClick","disabled"],Ci={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor"},Pi={key:2,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},xi={key:2,class:"chat-message helper transcribing"},Ri={key:3,class:"chat-message ai processing"},Ei={key:1,class:"interview-main-content"},Bi={class:"ending-session-overlay"},Ui={key:2,class:"interview-main-content"},qi={key:0,class:"summary-section"},Fi={class:"summary-content"},Ni={class:"summary-text"},ji={key:0,class:"summary-text summary-zh"},zi={key:1,class:"key-strengths"},Oi={key:2,class:"areas-for-attention"},Wi={key:3,class:"evaluation-scores"},Hi={class:"total-score-display"},Vi={class:"total-score-value"},Di={key:0,class:"focus-reminders"},Ki={class:"score-label"},Gi={class:"score-bar"},Ji={class:"score-value"},Qi={key:1,class:"focus-reminders"},Yi={class:"score-label"},Xi={class:"score-bar"},Zi={class:"score-value"},$i={key:3,class:"controls-area"},eo={key:0,class:"controls-start"},no=["disabled"],ao=["disabled"],to={key:1,class:"controls-active"},io={class:"recording-status"},oo={key:0,class:"status-recording"},so={key:1,class:"status-processing"},ro={key:2,class:"status-retrying"},lo={key:3,class:"status-ready"},co={class:"mic-live-header"},uo={class:"mic-live-title"},go=["disabled"],vo={class:"mic-meter"},mo={class:"mic-live-meta"},ho={key:0},wo={class:"controls-buttons"},fo=["disabled"],yo={class:"end-progress-ring",width:"48",height:"48",viewBox:"0 0 48 48"},ko=["stroke-dasharray","stroke-dashoffset"],po={class:"end-label"},bo=["disabled"],_o=["disabled"],To={class:"btn-answer-text"},Mo={class:"controls-footnote"},So={key:4,class:"controls-area"},Io={class:"completed-controls"},Lo=["disabled"],Ao={key:0,class:"redo-deadline"},Co={class:"interview-modal-content mic-modal"},Po={class:"interview-modal-header"},xo={class:"interview-modal-body mic-modal-body"},Ro={class:"mic-modal-text"},Eo={class:"mic-meter large"},Bo={class:"mic-live-meta"},Uo={key:0,class:"mic-warning-text"},qo={class:"mic-modal-actions"},Fo=["disabled"],No={class:"interview-modal-content mic-warning-modal"},jo={class:"interview-modal-header"},zo={class:"interview-modal-body mic-modal-body"},Oo={class:"mic-warning-text"},Wo={class:"mic-modal-actions"};function Ho(S,t,F,e,oe,b){var P,I,T,H,A;const w=za("Loader2");return r(),l("div",Ja,[n("div",Qa,[n("button",{class:"btn-back",onClick:t[0]||(t[0]=(...o)=>e.handleBack&&e.handleBack(...o))},[...t[25]||(t[25]=[n("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none"},[n("path",{d:"M19 12H5M12 19l-7-7 7-7",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1)])]),n("div",Ya,[n("h2",null,s(e.getUILabel("interviewRoom")),1),e.sessionStatus==="in_progress"?(r(),l("span",Xa,s(e.formatElapsed(e.elapsedSeconds)),1)):g("",!0)]),n("div",Za,[(r(!0),l(O,null,Y(e.interviewLanguages,o=>
1(r(),l("button",{key:o.code,class:N(["lang-btn",{active:e.interviewLang===o.code}]),onClick:k=>e.setInterviewLang(o.code),title:o.labelNative},s(o.code==="fil"?"FIL":o.code.toUpperCase()),11,$a))),128))])]),e.sessionStatus==="in_progress"&&(e.aiQuestionCount>0||e.helperAnswerCount>0)?(r(),l("div",et,[n("div",nt,"已回答 "+s(e.helperAnswerCount)+" / "+s(e.plannedQuestionCount),1),n("div",at,[n("div",{class:"progress-fill",style:Le({width:Math.min(e.helperAnswerCount/Math.max(e.plannedQuestionCount,1)*100,100)+"%"})},null,4)])])):g("",!0),e.isSelfPractice?(r(),l("div",tt,[t[26]||(t[26]=n("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"}),n("path",{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"})],-1)),te(" "+s(e.getUILabel("practiceMode")||"Practice Mode"),1)])):g("",!0),e.interviewDetails&&!e.isSelfPractice&&e.sessionStatus!=="completed"?(r(),l("div",it,[n("div",{class:"info-banner-header",onClick:t[1]||(t[1]=(...o)=>e.toggleInterviewInfo&&e.toggleInterviewInfo(...o))},[n("span",null,s(e.getUILabel("interviewInfo"))+" ("+s(e.interviewDetails.employer_name||e.getUILabel("employer"))+")",1),(r(),l("svg",{class:N({"rotate-180":e.showInterviewInfo}),width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...t[27]||(t[27]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Bn(n("div",ot,[n("div",st,[n("div",rt,[t[28]||(t[28]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),n("circle",{cx:"12",cy:"7",r:"4"})],-1)),n("span",null,s(e.getUILabel("employerInfo")),1)]),n("div",lt,[n("div",dt,[n("span",ct,s(e.getUILabel("name")),1),n("span",ut,s(e.interviewDetails.employer_name||e.getUILabel("notProvided")),1)]),e.maskedEmployerPhone?(r(),l("div",gt,[n("span",vt,s(e.getUILabel("phone")),1),n("span",mt,s(e.maskedEmployerPhone),1)])):g("",!0),e.maskedEmployerEmail?(r(),l("div",ht,[n("span",wt,s(e.getUILabel("email")),1),n("span",ft,s(e.maskedEmployerEmail),1)])):g("",!0)])]),n("div",yt,[n("div",kt,[t[29]||(t[29]=qn('<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-cc8b3ed3><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-cc8b3ed3></rect><line x1="16" y1="2" x2="16" y2="6" data-v-cc8b3ed3></line><line x1="8" y1="2" x2="8" y2="6" data-v-cc8b3ed3></line><line x1="3" y1="10" x2="21" y2="10" data-v-cc8b3ed3></line></svg>',1)),n("span",null,s(e.getUILabel("interviewSchedule")),1)]),n("div",pt,[n("div",bt,[n("span",_t,s(e.getUILabel("time")),1),n("span",Tt,s(e.interviewDate)+" "+s(e.interviewTime),1)]),e.interviewTypeLabel?(r(),l("div",Mt,[n("span",St,s(e.getUILabel("type")),1),n("span",It,s(e.interviewTypeLabel),1)])):g("",!0),e.interviewLocationText?(r(),l("div",Lt,[n("span",At,s(e.getUILabel("location")),1),n("span",Ct,s(e.interviewLocationText),1)])):g("",!0),e.interviewMeetingUrl?(r(),l("div",Pt,[n("span",xt,s(e.getUILabel("meetingLink")),1),n("a",{class:"card-link",href:e.interviewMeetingUrl,target:"_blank",rel:"noopener noreferrer"},"會議連結",8,Rt)])):g("",!0)])])],512),[[Un,e.showInterviewInfo]])])):g("",!0),e.loading?(r(),l("div",Et,[cn(w,{size:48,class:"spinner",style:{color:"#007FFF","margin-bottom":"16px"}}),t[30]||(t[30]=n("p",null,"載入面試中...",-1))])):e.errorMsg?(r(),l("div",Bt,[n("p",null,s(e.errorMsg),1),n("button",{class:"btn-retry",onClick:t[2]||(t[2]=(...o)=>e.loadSession&&e.loadSession(...o))},"重試")])):(r(),l(O,{key:5},[e.sessionStatus!=="completed"&&!e.isEndingSession?(r(),l("div",Ut,[n("div",{class:N(["interactive-border-wrapper",{"is-recording":e.isRecording,"is-processing":e.processing}])},[e.isRecording||e.processing?(r(),l("div",qt)):g("",!0),n("div",Ft,[e.sessionStatus==="in_progress"?(r(),l("div",{key:0,class:N(["camera-preview",{collapsed:e.cameraCollapsed}])},[n("button",{class:"camera-toggle",onClick:t[3]||(t[3]=o=>e.cameraCollapsed=!e.cameraCollapsed)},[e.cameraCollapsed?(r(),l("svg",Nt,[...t[31]||(t[31]=[n("path",{d:"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"},null,-1)])])):(r(),l("svg",jt,[...t[32]||(t[32]=[n("path",{d:"M4 14h6v6M14 4h6v6M20 4l-7 7M4 20l7-7"},null,-1)])]))]),Bn(n("div",zt,[n("div",{class:N(["camera-status-chip",{live:e.isRecording||e.hasCameraPreview}])},[t[33]||(t[33]=n("span",{class:"camera-status-dot"},null,-1)),n("span",null,s(e.isRecording?"Live":"Preview"),1)],2),e.isCameraLoading?(r(),l("div",Ot,[cn(w,{size:24,class:"spinner"}
1),t[34]||(t[34]=n("span",null,"Loading...",-1))])):g("",!0),!e.isRecording&&!e.isCameraLoading&&!e.hasCameraPreview?(r(),l("div",Wt,[...t[35]||(t[35]=[n("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[n("path",{d:"M15 10l4.553-2.069A1 1 0 0121 8.82v6.36a1 1 0 01-1.447.894L15 14M3 8a2 2 0 012-2h8a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z"})],-1),n("span",null,"Camera will turn on automatically when you start answering",-1)])])):g("",!0),n("video",Ht,null,512)],512),[[Un,!e.cameraCollapsed]]),n("canvas",Vt,null,512)],2)):g("",!0),n("div",Dt,[e.sessionStatus==="pending"?(r(),l("div",Kt,[n("h3",Gt,s(e.welcomeText.title),1),n("p",Jt,s(e.welcomeText.subtitle),1),n("div",Qt,[n("p",null,s(e.welcomeText.intro1),1),n("p",null,s(e.welcomeText.intro2),1)]),e.questionBank?(r(),l("div",Yt,[n("h4",null,s(e.getUILabel("questionOverview")),1),n("div",Xt,[n("div",Zt,[n("span",$t,s(((P=e.questionBank.summary)==null?void 0:P.requiredCount)||6),1),n("span",ei,[te(s(e.getUILabel("requiredCount")),1),t[36]||(t[36]=n("br",null,null,-1)),t[37]||(t[37]=te("Required",-1))])]),t[42]||(t[42]=n("div",{class:"stat-divider"},"+",-1)),n("div",ni,[n("span",ai,s(((I=e.questionBank.summary)==null?void 0:I.randomCount)||4),1),n("span",ti,[te(s(e.getUILabel("optionalCount")),1),t[38]||(t[38]=n("br",null,null,-1)),t[39]||(t[39]=te("Optional",-1))])]),t[43]||(t[43]=n("div",{class:"stat-divider"},"=",-1)),n("div",ii,[n("span",oi,s(((T=e.questionBank.summary)==null?void 0:T.totalCount)||10),1),n("span",si,[te(s(e.getUILabel("totalCount")),1),t[40]||(t[40]=n("br",null,null,-1)),t[41]||(t[41]=te("Total",-1))])])]),(H=e.questionBank.summary)!=null&&H.categories?(r(),l("div",ri,[(r(!0),l(O,null,Y(e.questionBank.summary.categories,o=>(r(),l("span",{class:"category-tag",key:o},s(e.getCategoryLabel(o)),1))),128))])):g("",!0)])):g("",!0),n("div",li,[n("div",di,[t[44]||(t[44]=n("div",{class:"instruction-icon"},[n("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[n("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"}),n("polyline",{points:"22 4 12 14.01 9 11.01"})])],-1)),n("div",null,[n("strong",null,s(e.welcomeText.tip1_title),1),n("p",null,s(e.welcomeText.tip1_desc),1)])]),n("div",ci,[t[45]||(t[45]=n("div",{class:"instruction-icon"},[n("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[n("path",{d:"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"}),n("path",{d:"M19 10v2a7 7 0 0 1-14 0v-2"})])],-1)),n("div",null,[n("strong",null,s(e.welcomeText.tip2_title),1),n("p",null,s(e.welcomeText.tip2_desc),1)])]),n("div",ui,[t[46]||(t[46]=n("div",{class:"instruction-icon"},[n("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[n("circle",{cx:"12",cy:"12",r:"10"}),n("polyline",{points:"12 6 12 12 16 14"})])],-1)),n("div",null,[n("strong",null,s(e.welcomeText.tip3_title),1),n("p",null,s(e.welcomeText.tip3_desc),1)])]),e.isMediaRecorderSupported?g("",!0):(r(),l("div",gi,[...t[47]||(t[47]=[qn('<div class="instruction-icon" style="color:#ef4444;background:rgba(239, 68, 68, 0.1);" data-v-cc8b3ed3><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-v-cc8b3ed3><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" data-v-cc8b3ed3></path><line x1="12" y1="9" x2="12" y2="13" data-v-cc8b3ed3></line><line x1="12" y1="17" x2="12.01" y2="17" data-v-cc8b3ed3></line></svg></div><div data-v-cc8b3ed3><strong style="color:#ef4444;" data-v-cc8b3ed3>Browser Not Supported</strong><p style="color:#ef4444;" data-v-cc8b3ed3>Your browser may not support recording. Please use Android Chrome or another modern browser.</p></div>',2)])]))])])):g("",!0),e.conversations.length>0&&e.sessionStatus==="in_progress"?(r(),l("div",vi,s(e.getUILabel("languageHint")),1)):g("",!0),(r(!0),l(O,null,Y(e.conversations,o=>{var k;return r(),l("div",{key:o.turn_number,class:N(["chat-message",[o.role,{"latest-ai":o.role==="ai"&&o.turn_number===((k=e.conversations[e.conversations.length-1])==null?void 0:k.turn_number)}]])},[n("div",mi,[o.role==="ai"?(r(),l("span",hi,"AI")):o.role==="system"?(r(),l("span",wi,"!")):(r(),l("span",fi,"我"))]),n("div",yi,[n("div",ki,s(e.getMessageRoleLabel(o.role)),1),o.role==="ai"?(r(),l("div",pi,[o.is_required?(r(),l("span",bi,s(e.getQuestionTypeLabel(!0)),1)):o.is_required===!1?(r(),l("span",_i,s(e.getQuestionTypeLabel(!1)),1)):g("",!0),o.category?(r(),l("span",Ti,s(e.getCategoryLabel(o.category)),1)):g("",!0)])):g("",!0),o.role==="ai"&&o.content_text_en&&o.content_text_native&&e.interviewLang!=="en"?(r(),l("div",Mi,[n("p",Si,s(o.content_text_en),1),t[48]||(t[48]=n("div",{class:"lang-divider"},null,-1)),n("p",Ii,s(o.content_text_native),1)])):(r(),l("p",Li,s(o.content_text),1)),o.role==="ai"?(r(),l("button",{key:3,class:"tts-play-btn",onClick:K=>e.playTTS(o),disabled:e.ttsLoadingTurn===o.turn_number},[e.ttsLoadingTurn===o.turn_number?(r(),Fn(w,{key:0,size:14,class:"spinner"})):e.ttsPlayingTurn===o.turn_number?(r(),l("svg",Ci,[...t[49]||(t[49]=[n("rect",{x:"6",y:"4",width:"4",height:"16"},null,-1),n("rect",{x:"14",y:"4",width:"4",height:"16"}
1,null,-1)])])):(r(),l("svg",Pi,[...t[50]||(t[50]=[n("polygon",{points:"11 5 6 9 2 9 2 15 6 15 11 19 11 5"},null,-1),n("path",{d:"M15.54 8.46a5 5 0 0 1 0 7.07"},null,-1),n("path",{d:"M19.07 4.93a10 10 0 0 1 0 14.14"},null,-1)])]))],8,Ai)):g("",!0)])],2)}),128)),e.isTranscribing?(r(),l("div",xi,[...t[51]||(t[51]=[n("div",{class:"message-avatar"},[n("span",null,"我")],-1),n("div",{class:"message-content"},[n("div",{class:"typing-dots"},[n("span"),n("span"),n("span")])],-1)])])):g("",!0),e.isAiThinking?(r(),l("div",Ri,[...t[52]||(t[52]=[n("div",{class:"message-avatar"},[n("span",null,"AI")],-1),n("div",{class:"message-content"},[n("div",{class:"typing-dots"},[n("span"),n("span"),n("span")])],-1)])])):g("",!0)],512)])],2)])):g("",!0),e.isEndingSession?(r(),l("div",Ei,[n("div",Bi,[cn(w,{size:36,class:"spinner"}),t[53]||(t[53]=n("h3",null,"Generating Interview Results...",-1)),t[54]||(t[54]=n("p",null,"正在生成面試結果,請稍候",-1))])])):g("",!0),e.sessionStatus==="completed"&&!e.isEndingSession?(r(),l("div",Ui,[e.result?(r(),l("div",qi,[n("div",Fi,[t[61]||(t[61]=n("h3",null,"Interview Summary / 面試總結",-1)),n("p",Ni,s(e.result.summary),1),e.result.summary_zh?(r(),l("p",ji,s(e.result.summary_zh),1)):g("",!0),e.result.key_strengths&&e.result.key_strengths.length?(r(),l("div",zi,[t[55]||(t[55]=n("h4",null,"Key Strengths / 關鍵優勢",-1)),n("ul",null,[(r(!0),l(O,null,Y(e.result.key_strengths,(o,k)=>(r(),l("li",{key:k},s(o),1))),128))])])):g("",!0),e.result.areas_for_attention&&e.result.areas_for_attention.length?(r(),l("div",Oi,[t[56]||(t[56]=n("h4",null,"Areas for Attention / 注意事項",-1)),n("ul",null,[(r(!0),l(O,null,Y(e.result.areas_for_attention,(o,k)=>(r(),l("li",{key:k},s(o),1))),128))])])):g("",!0),e.result.evaluation?(r(),l("div",Wi,[t[60]||(t[60]=n("h4",null,"Evaluation / 評分 (6 Core Dimensions / 6個核心維度, Total / 總分 100)",-1)),n("div",Hi,[t[57]||(t[57]=n("span",{class:"total-score-label"},"Total Score / 總分",-1)),n("span",Vi,s(e.formatInterviewScore((A=e.result.total_score)!=null?A:e.calculateTotalScore(e.result.evaluation)))+"/100",1)]),e.hasFocusScores?(r(),l("div",Di,[t[58]||(t[58]=n("div",{class:"focus-reminder-title"},"Important Focus Scores / 重點專項評分",-1)),(r(!0),l(O,null,Y(e.result.focus_scores,(o,k)=>(r(),l("div",{key:`focus-${k}`,class:"score-item score-highlight"},[n("span",Ki,s(e.focusScoreLabels[k]||k),1),n("div",Gi,[n("div",{class:"score-fill",style:Le({width:o/5*100+"%"})},null,4)]),n("span",Ji,s(o)+"/5",1)]))),128))])):g("",!0),e.result.focus_reminders&&e.result.focus_reminders.length?(r(),l("div",Qi,[t[59]||(t[59]=n("div",{class:"focus-reminder-title"},"Important Focus Areas / 重點關注",-1)),n("ul",null,[(r(!0),l(O,null,Y(e.result.focus_reminders,(o,k)=>(r(),l("li",{key:k},s(o),1))),128))])])):g("",!0),(r(!0),l(O,null,Y(e.displayEvaluation(e.result.evaluation),(o,k)=>(r(),l("div",{key:k,class:N(["score-item",{"score-highlight":e.isFocusDimension(k)}])},[n("span",Yi,s(e.scoreLabels[k]||k),1),n("div",Xi,[n("div",{class:"score-fill",style:Le({width:o/5*100+"%"})},null,4)]),n("span",Zi,s(o)+"/5",1)],2))),128))])):g("",!0)])])):g("",!0)])):g("",!0),e.sessionStatus!=="completed"&&!e.isEndingSession?(r(),l("div",$i,[e.sessionStatus==="pending"?(r(),l("div",eo,[n("button",{class:"btn-mic-test secondary",onClick:t[4]||(t[4]=(...o)=>e.openMicTestModal&&e.openMicTestModal(...o)),disabled:e.starting},s(e.getUILabel("micTestButton")),9,no),n("button",{class:"btn-start",onClick:t[5]||(t[5]=o=>e.startSession()),disabled:e.starting},[e.starting?(r(),Fn(w,{key:0,size:20,class:"spinner"})):(r(),l(O,{key:1},[t[62]||(t[62]=n("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor"},[n("path",{d:"M8 5v14l11-7z"})],-1)),n("span",null,s(e.getUILabel("startInterview")),1)],64))],8,ao)])):e.sessionStatus==="in_progress"?(r(),l("div",to,[n("div",io,[e.isRecording?(r(),l("span",oo,s(e.getUILabel("recordingWithTime"))+s(e.answerCountdownLabel)+")",1)):e.processing?(r(),l("span",so,s(e.getUILabel("processing")),1)):e.retrying?(r(),l("span",ro,s(e.getUILabel("retrying")),1)):(r(),l("span",lo,s(e.getUILabel("readyToAnswer")),1))]),n("div",{class:N(["mic-live-panel",[`mic-${e.liveMicStatus}`]])},[n("div",co,[n("div",uo,[t[63]||(t[63]=n("span",{class:"mic-dot"},null,-1)),n("span",null,s(e.isRecording?e.getUILabel("micLevelTitle"):e.getUILabel("micReadyTitle")),1)]),n("button",{class:"btn-mic-test inline",onClick:t[6]||(t[6]=(...o)=>e.openMicTestModal&&e.openMicTestModal(...o)),disabled:e.processing||e.retrying||e.isRecording},s(e.getUILabel("micTestShortButton")),9,go)]),n("div",vo,[n("div",{class:"mic-meter-fill",style:Le({width:`${Math.max(6,Math.round(e.displayMicLevel*100))}%`})},null,4)]),n("div",mo,[n("span",null,s(e.micStatusText),1),e.isRecording?(r(),l("span",ho,s(Math.round(e.displayMicLevel*100))+"%",1)
1):g("",!0)])],2),n("div",wo,[n("button",{class:N(["btn-end-longpress",{holding:e.endHoldActive}]),onTouchstart:t[7]||(t[7]=ie((...o)=>e.startEndHold&&e.startEndHold(...o),["prevent"])),onTouchend:t[8]||(t[8]=ie((...o)=>e.cancelEndHold&&e.cancelEndHold(...o),["prevent"])),onTouchcancel:t[9]||(t[9]=ie((...o)=>e.cancelEndHold&&e.cancelEndHold(...o),["prevent"])),onMousedown:t[10]||(t[10]=ie((...o)=>e.startEndHold&&e.startEndHold(...o),["prevent"])),onMouseup:t[11]||(t[11]=ie((...o)=>e.cancelEndHold&&e.cancelEndHold(...o),["prevent"])),onMouseleave:t[12]||(t[12]=(...o)=>e.cancelEndHold&&e.cancelEndHold(...o)),disabled:e.processing||e.retrying},[(r(),l("svg",yo,[t[64]||(t[64]=n("circle",{class:"end-progress-bg",cx:"24",cy:"24",r:"21",fill:"none",stroke:"#e5e7eb","stroke-width":"3"},null,-1)),n("circle",{class:"end-progress-fill",cx:"24",cy:"24",r:"21",fill:"none",stroke:"#ef4444","stroke-width":"3","stroke-dasharray":2*Math.PI*21,"stroke-dashoffset":2*Math.PI*21*(1-e.endHoldProgress),"stroke-linecap":"round",transform:"rotate(-90 24 24)"},null,8,ko)])),n("span",po,s(e.endHoldActive?e.endHoldCountdown:e.getUILabel("endInterviewShort")),1)],42,fo),e.canRetry?(r(),l("button",{key:0,class:"btn-retry",onClick:t[13]||(t[13]=(...o)=>e.retryCurrentTurn&&e.retryCurrentTurn(...o)),disabled:e.processing||e.retrying||e.isRecording},s(e.getUILabel("retryAnswer")),9,bo)):g("",!0),n("button",{class:N(["btn-answer",{recording:e.isRecording}]),onClick:t[14]||(t[14]=o=>e.isRecording?e.finishAnswer():e.startAnswer()),disabled:e.processing||e.retrying},[n("span",To,s(e.isRecording?e.getUILabel("finishAnswerShort"):e.getUILabel("startAnswerShort")),1)],10,_o)]),n("div",Mo,s(e.getUILabel("longPressToEnd")),1)])):g("",!0)])):g("",!0),e.sessionStatus==="completed"?(r(),l("div",So,[n("div",Io,[e.canRedoInterview?(r(),l("button",{key:0,class:"btn-redo",onClick:t[15]||(t[15]=(...o)=>e.redoInterview&&e.redoInterview(...o)),disabled:e.redoing},s(e.getUILabel("redoInterview")),9,Lo)):g("",!0),n("button",{class:"btn-done",onClick:t[16]||(t[16]=(...o)=>e.handleBack&&e.handleBack(...o))},s(e.getUILabel("returnToHome")),1)]),e.canRedoInterview&&e.redoDeadline?(r(),l("div",Ao,s(e.getUILabel("deadline"))+": "+s(e.formatRedoDeadline(e.redoDeadline)),1)):g("",!0)])):g("",!0)],64)),e.showMicTestModal?(r(),l("div",{key:6,class:"interview-modal-overlay",onClick:t[20]||(t[20]=ie((...o)=>e.closeMicTestModal&&e.closeMicTestModal(...o),["self"]))},[n("div",Co,[n("div",Po,[n("h2",null,s(e.getUILabel("micModalTitle")),1),n("button",{class:"modal-close",onClick:t[17]||(t[17]=(...o)=>e.closeMicTestModal&&e.closeMicTestModal(...o))},[...t[65]||(t[65]=[n("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none"},[n("path",{d:"M18 6L6 18M6 6L18 18",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"})],-1)])])]),n("div",xo,[n("p",Ro,s(e.getUILabel("micModalInstruction")),1),n("div",{class:N(["mic-test-status",[`mic-${e.micTestStatus}`]])},[n("div",Eo,[n("div",{class:"mic-meter-fill",style:Le({width:`${Math.max(6,Math.round(e.micTestVolume*100))}%`})},null,4)]),n("div",Bo,[n("span",null,s(e.micTestStatusText),1),n("span",null,s(Math.round(e.micTestVolume*100))+"%",1)])],2),e.micTestError?(r(),l("p",Uo,s(e.micTestError),1)):g("",!0),n("div",qo,[n("button",{class:"btn-mic-test",onClick:t[18]||(t[18]=(...o)=>e.startMicTest&&e.startMicTest(...o)),disabled:e.micTestRunning},s(e.micTestRunning?e.getUILabel("micTestRunning"):e.getUILabel("micTestStart")),9,Fo),n("button",{class:"btn-retry",onClick:t[19]||(t[19]=(...o)=>e.closeMicTestModal&&e.closeMicTestModal(...o))},s(e.getUILabel("close")),1)])])])])):g("",!0),e.showMicWarningModal?(r(),l("div",{key:7,class:"interview-modal-overlay",onClick:t[24]||(t[24]=ie((...o)=>e.dismissMicWarningModal&&e.dismissMicWarningModal(...o),["self"]))},[n("div",No,[n("div",jo,[n("h2",null,s(e.getUILabel("micWarningTitle")),1),n("button",{class:"modal-close",onClick:t[21]||(t[21]=(...o)=>e.dismissMicWarningModal&&e.dismissMicWarningModal(...o))},[...t[66]||(t[66]=[n("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none"},[n("path",{d:"M18 6L6 18M6 6L18 18",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"})],-1)])])]),n("div",zo,[n("p",Oo,s(e.micWarningMessage),1),n("div",Wo,[n("button",{class:"btn-mic-test",onClick:t[22]||(t[22]=(...o)=>e.handleMicWarningTest&&e.handleMicWarningTest(...o))}
1,s(e.getUILabel("micTestButton")),1),n("button",{class:"btn-answer mic-continue-btn",onClick:t[23]||(t[23]=(...o)=>e.dismissMicWarningModal&&e.dismissMicWarningModal(...o))},s(e.getUILabel("continue")),1)])])])])):g("",!0)])}const Go=Va(Ga,[["render",Ho],["__scopeId","data-v-cc8b3ed3"]]);export{Go 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.