PageSourceSearch

https://xynergy.ai/_next/static/chunks/6162-b66d870afbe32686.js

js xynergy.ai collected 2026-10-05 16:00:49 UTC 35,880 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6162,6458],{3379:(e,t,r)=>{r.d(t,{R7:()=>m,jR:()=>u,gU:()=>d});var a=r(30274),n=r(24571),i=r(76458),s=r(18654);async function o(e,t=6){let r="ABCDEFGHJKLMNPQRSTUVWXYZ23456789",a="",i=!0;for(;i;){a=Array.from({length:t},()=>r.charAt(Math.floor(Math.random()*r.length))).join("");let s=(0,n.P)((0,n.rJ)(e,"users"),(0,n._M)("referralCode","==",a));i=!(await (0,n.GG)(s)).empty}return a}let l=new a.GoogleAuthProvider;l.addScope("email"),l.addScope("profile"),l.setCustomParameters({prompt:"select_account"});let d=async()=>{if(!i.auth)throw Error("Firebase Auth 尚未初始化");try{let e=await (0,a.signInWithPopup)(i.auth,l);return await c(e.user),e}catch(t){let e=t?.code??"";if("auth/multi-factor-auth-required"===e)throw t;if("auth/popup-closed-by-user"===e)throw(0,s.MD)("Google 登入:使用者關閉彈窗",{code:e}),Error("登入視窗被關閉,請重試");if("auth/popup-blocked"===e)throw(0,s.MD)("Google 登入:彈窗被瀏覽器阻擋",{code:e}),Error("彈出視窗被瀏覽器阻擋,請允許彈出視窗後重試");if((0,s.vV)("Google 登入失敗:",t),"auth/network-request-failed"===e)throw Error("網路連線失敗,請檢查網路連線後重試");throw Error(`Google 登入失敗: ${t.message}`)}},c=async e=>{if(!i.db)return void(0,s.vV)("Firestore 尚未初始化");try{await e.getIdToken(!0),(0,s.fH)("開始同步使用者資料到 Firestore",{uid:e.uid});let t=(0,n.doc)(i.db,i.USERS,e.uid),r=await (0,n.getDoc)(t),a="string"==typeof e.displayName&&e.displayName.trim()?e.displayName.trim().slice(0,80):"",l={uid:e.uid,email:e.email,displayName:e.displayName,photoURL:e.photoURL,emailVerified:e.emailVerified,providerData:e.providerData.map(e=>({providerId:e.providerId,uid:e.uid,displayName:e.displayName,email:e.email,photoURL:e.photoURL})),lastSignInTime:e.metadata.lastSignInTime,creationTime:e.metadata.creationTime,updatedAt:(0,n.serverTimestamp)()};if(r.exists()){let i=r.data(),o="string"==typeof i?.name?i.name.trim():"",d={...l};!o&&a&&(d.name=a),await (0,n.setDoc)(t,d,{merge:!0}),(0,s.fH)("Google 使用者資料已更新",{uid:e.uid})}else{let r=await o(i.db,6);await (0,n.setDoc)(t,{...l,name:a,createdAt:(0,n.serverTimestamp)(),isActive:!0,profile:{firstName:e.displayName?.split(" ")[0]||"",lastName:e.displayName?.split(" ").slice(1).join(" ")||"",phone:"",address:"",city:"",country:"TW",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone},preferences:{language:"zh-TW",currency:"TWD",notifications:{email:!0,push:!0,sms:!1}},referralCode:r}),(0,s.fH)("新 Google 使用者資料已建立",{uid:e.uid})}}catch(e){(0,s.vV)("同步使用者資料到 Firestore 失敗:",e.message)}},u=e=>e.providerData.some(e=>"google.com"===e.providerId),m=e=>{let t=e.providerData.find(e=>"google.com"===e.providerId);return t?{displayName:t.displayName,email:t.email,photoURL:t.photoURL,uid:t.uid}:null}},4963:(e,t,r)=>{r.d(t,{NC:()=>d,jg:()=>o,C5:()=>l});var a=r(15418),n=r(81321);let i=a.k5(["draft","pending","authorized","paid","cancelled"]),s=a.k5(["面對面諮詢","線上諮詢","電話諮詢"]);i.options,s.options;let o=a.Ik({userId:a.Yj().min(1,"缺少 userId"),userEmail:a.Yj().email("無效的用戶 Email"),userDisplayName:a.Yj().min(1,"缺少用戶名稱"),advisorId:a.Yj().min(1,"缺少顧問 ID"),advisorName:a.Yj().min(1,"缺少顧問名稱"),advisorEmail:a.Yj().email("無效的顧問 Email").optional().or(a.eu("")),advisorFee:a.ai().min(0,"顧問費用需為正數"),date:a.Yj().regex(/^\d{4}-\d{2}-\d{2}$/,"日期格式需為 YYYY-MM-DD"),time:a.Yj().regex(/^\d{2}:\d{2}$/,"時間格式需為 HH:mm"),method:s,location:a.Yj().max(200).optional().default(""),topic:a.Yj().min(1,"請選擇諮詢項目"),note:a.Yj().max(800).optional().default(""),status:i.default("pending"),calendarLink:a.Yj().url().optional().nullable(),consentId:a.Yj().optional().nullable(),paymentReference:a.Yj().optional().nullable(),paymentAmount:a.ai().nonnegative().optional().nullable(),paymentType:a.Yj().optional().nullable(),notificationSentAt:a.Yj().optional().nullable(),refundRequired:a.zM().optional().nullable(),refundAmount:a.ai().nonnegative().optional().nullable(),cancelledAt:a.Yj().optional().nullable(),cancelledBy:a.Yj().optional().nullable(),cancellationReason:a.Yj().optional().nullable(),createdAt:a.Yj().optional(),updatedAt:a.Yj().optional(),bookingContext:a.Ik({source:a.k5(["retirement","insurance","other"]),entry:a.Yj(),summary:a.Yj(),riskLevel:a.Yj().optional(),category:a.Yj().optional()}).optional()}).superRefine((e,t)=>
1{"面對面諮詢"!==e.method||e.location?.trim()||t.addIssue({code:n.eq.custom,path:["location"],message:"面對面諮詢需要提供地點"})}),l=o.safeExtend({createdAt:a.KC([a.Yj(),a.bz()]),updatedAt:a.KC([a.Yj(),a.bz()])}),d=a.Ik({bookingId:a.Yj().min(1),userId:a.Yj().min(1),advisorId:a.Yj().min(1),userEmail:a.Yj().email(),advisorEmail:a.Yj().email().optional().or(a.eu("")),personalDataAgreement:a.zM().refine(Boolean,"必須同意個資運用告知"),financialDataAgreement:a.zM().refine(Boolean,"必須同意財務資料授權"),financialDataEditAgreement:a.zM().optional().default(!1),privacyAgreement:a.zM().refine(Boolean,"必須同意隱私權政策"),consentVersion:a.Yj().min(1),consentContentHash:a.Yj().min(1),acceptedAt:a.Yj()})},8958:(e,t,r)=>{r.d(t,{RZ:()=>o,Wi:()=>i,Z6:()=>s,t9:()=>a,wK:()=>n});let a={ALERTS:{NOTIFICATION:"/sounds/alerts/notification.mp3",FINANCIAL:"/sounds/alerts/financial-alert.mp3",ERROR:"/sounds/alerts/error.mp3",WARNING:"/sounds/alerts/warning.mp3",SUCCESS:"/sounds/alerts/success.mp3"},TASKS:{COMPLETE:"/sounds/tasks/complete.mp3",BACKTEST_COMPLETE:"/sounds/tasks/backtest-complete.mp3"}},n={enabled:!1,categories:{alerts:!0,tasks:!0},volume:.7},i={NOTIFICATION:"alerts",FINANCIAL:"alerts",ERROR:"alerts",WARNING:"alerts",SUCCESS:"alerts",COMPLETE:"tasks",BACKTEST_COMPLETE:"tasks"};function s(e){return"alerts"===i[e]?a.ALERTS[e]:a.TASKS[e]}let o="soundPreferences_v1"},18654:(e,t,r)=>{r.d(t,{JE:()=>o,MD:()=>i,fH:()=>s,vV:()=>l});var a=r(94558),n=r(32407);function i(e,t){"true"===n.env.NEXT_PUBLIC_ENABLE_DEBUG_LOGS&&(void 0===t?console.log(`[DEBUG] ${e}`):console.log(`[DEBUG] ${e}`,t))}function s(e,t){if("true"===n.env.NEXT_PUBLIC_ENABLE_INFO_LOGS){if(void 0===t)return console.log(`[INFO] ${e}`);console.log(`[INFO] ${e}`,t)}}function o(e,t){console.warn(`[WARN] ${e}`,t||"")}function l(e,t){console.error(`[ERROR] ${e}`,void 0===t?"":(0,a.T)(t))}},21410:(e,t,r)=>{r.d(t,{$:()=>d,r:()=>l});var a=r(85047),n=r(31615),i=r(94397),s=r(63610),o=r(34961);let l=(0,s.F)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),d=n.forwardRef(({className:e,variant:t,size:r,asChild:n=!1,...s},d)=>{let c=n?i.DX:"button";return(0,a.jsx)(c,{className:(0,o.cn)(l({variant:t,size:r,className:e})),ref:d,...s})});d.displayName="Button"},27703:(e,t,r)=>{r.d(t,{$O:()=>S,Cr:()=>g,Dx:()=>i,GW:()=>o,I:()=>a,Jr:()=>n,L:()=>y,MK:()=>_,Nw:()=>u,QR:()=>v,RQ:()=>A,Sp:()=>I,Wr:()=>m,bJ:()=>R,cT:()=>p,e6:()=>l,kf:()=>s,l7:()=>d,lR:()=>c,r3:()=>h,s_:()=>b,uI:()=>f,yC:()=>E,ys:()=>T});let a={sponsorships:"sponsorships",sponsorshipPayments:"sponsorshipPayments",sponsorTiers:"sponsorTiers",sponsorshipSponsors:"sponsorshipSponsors",sponsorshipStats:"sponsorshipStats",publicConfig:"publicConfig",users:"users",userLoginLogs:"userLoginLogs",user_init_queue:"user_init_queue",user_preferences:"user_preferences",push_tokens:"push_tokens",bookings:"bookings",bookingConsents:"bookingConsents",advisors:"advisors",advisorReports:"advisorReports",advisor_clients:"advisor_clients",consultation_revenues:"consultation_revenues",advisor_tier_history:"advisor_tier_history",referrals:"referrals",referralEvents:"referral_events",referral_usage:"referral_usage",xpLedger:"xp_ledger",emailLogs:"emailLogs",emailCooldowns:"emailCooldowns",emailTemplates:"emailTemplates",emailQueue:"emailQueue",resource_shares:"resource_shares",resource_share_links:"resource_share_links",monitoringEvents:"monitoringEvents",adminLogs:"admin_logs",advisor_financial_edits:"advisor_financial_edits",deleted_user_emails:"deleted_user_emails",registration_attempts:"registration_attempts",ragDocuments:"rag_documents",ragAnalytics:"rag_analytics",accounts:"accounts",assets:"assets",liabilities:"liabilities",transactions:"transactions",ledger_entries:"ledger_entries",goals:"goals",financial_indicators:"financial_indicators",monthly_unallocated:"monthly_unallocated",account_monthly_balances:"account_monthly_balances",income_distribution_rules:"income_distribution_rules",investments:"investments",budgets:"budgets",trusts:"trusts",commission_settlements:"commission_settlements",account_links:"account_links",credit_cards:"credit_cards",credit
1CardTemplates:"credit_card_templates",creditCardBenefitVerifications:"credit_card_benefit_verifications",creditCardBenefitSuggestions:"credit_card_benefit_suggestions",creditCardTemplateRequests:"credit_card_template_requests",creditCardTemplateErrorReports:"credit_card_template_error_reports",creditCardCrawlConfig:"credit_card_crawl_config",creditCardBenefitJobs:"credit_card_benefit_jobs",helpArticles:"help_articles",suggestions:"suggestions",reviews:"reviews",changelog:"changelog",chatRooms:"chatRooms",taxReminders:"taxReminders",userDocuments:"userDocuments",insuranceDocuments:"insuranceDocuments",insurancePolicies:"insurancePolicies",insuranceProducts:"insuranceProducts",insuranceProductSuggestions:"insuranceProductSuggestions",insuranceProductIngestJobs:"insuranceProductIngestJobs",advanceDirectives:"advanceDirectives",guardianshipMandates:"guardianshipMandates",productSubmissions:"productSubmissions",contributorProfiles:"contributorProfiles",catalogGapTasks:"catalogGapTasks"},n=a.users,i=a.accounts,s=a.assets,o=a.liabilities,l=a.transactions,d=a.ledger_entries,c=a.goals,u=a.bookings,m=a.bookingConsents,p=a.advisors,f=a.advisor_clients,g=a.reviews,_=a.suggestions,I=a.taxReminders,E=a.credit_cards,S=a.creditCardTemplates,v=a.creditCardBenefitVerifications,h=a.creditCardBenefitSuggestions,A=a.creditCardTemplateRequests,y=a.creditCardTemplateErrorReports,R=a.budgets,b=a.trusts;a.advisor_financial_edits;let T=a.chatRooms;a.resource_shares,a.resource_share_links},28979:(e,t,r)=>{r.d(t,{jY:()=>c});var a=r(8958);let n=new Map,i=0,s=!1;function o(){return"u">typeof Audio}function l(e){if(!o())return null;let t=n.get(e);if(!t)try{(t=new Audio(e)).preload="auto",n.set(e,t)}catch(e){return console.warn("[SoundService] 無法建立 Audio 實例:",e),null}return t}function d(){o()&&(n.forEach(e=>{try{e.pause(),e.currentTime=0}catch(e){}}),i=0)}let c={playSound:async function e(t,r=a.wK){if(!o()||!r.enabled)return!1;let n=a.Wi[t];if(!r.categories[n])return!1;if(i>=3)return console.warn("[SoundService] 已達最大同時播放數量限制"),!1;let d=l((0,a.Z6)(t));if(!d)return!1;try{d.volume=Math.max(0,Math.min(1,r.volume)),d.currentTime=0,i++;let e=()=>{i=Math.max(0,i-1),d.removeEventListener("ended",e),d.removeEventListener("error",t)},t=()=>{i=Math.max(0,i-1),d.removeEventListener("ended",e),d.removeEventListener("error",t)};return d.addEventListener("ended",e),d.addEventListener("error",t),await d.play(),s=!0,!0}catch(e){return i=Math.max(0,i-1),console.warn("[SoundService] 播放音效失敗:",e),!1}},playTestSound:async function e(t=.7){if(!o())return!1;let r=l(a.t9.ALERTS.SUCCESS);if(!r)return!1;try{return r.volume=Math.max(0,Math.min(1,t)),r.currentTime=0,await r.play(),s=!0,!0}catch(e){return console.warn("[SoundService] 播放測試音效失敗:",e),!1}},playSoundForTest:async function e(t,r=.7){if(!o())return!1;let n=l((0,a.Z6)(t));if(!n)return!1;try{return n.volume=Math.max(0,Math.min(1,r)),n.currentTime=0,await new Promise(e=>{let t=()=>{n.removeEventListener("error",t),e(!1)};n.addEventListener("error",t),n.play().then(()=>{s=!0,e(!0)}).catch(()=>e(!1))})}catch(e){return console.warn("[SoundService] 播放測試失敗:",t,e),!1}},preloadSounds:function(e){o()&&(e||["NOTIFICATION","ERROR","SUCCESS","COMPLETE"]).forEac
1h(e=>{l((0,a.Z6)(e))})},unlockAudio:async function e(){if(!o())return!1;if(s)return!0;try{let e=new Audio;return e.volume=0,e.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA",await e.play(),e.pause(),s=!0,!0}catch(e){return console.warn("[SoundService] 無法解鎖音效:",e),!1}},isAudioUnlocked:function(){return s},stopAllSounds:d,clearAudioCache:function(){d(),n.clear()},getPlayingCount:function(){return i}}},34961:(e,t,r)=>{r.d(t,{cn:()=>i});var a=r(82856),n=r(36864);function i(...e){return(0,n.QP)((0,a.$)(e))}},45762:(e,t,r)=>{r.d(t,{y:()=>u});var a=r(24571),n=r(71931),i=r(76458),s=r(4963),o=r(18654);let l=()=>{if(!i.db)throw Error("Firestore 尚未初始化");return i.db},d=e=>{let t=(e=>{if(!e||"object"!=typeof e)return e;let t={...e};if(t.createdAt&&(t.createdAt instanceof a.Timestamp||t.createdAt?.toDate)){let e=t.createdAt instanceof a.Timestamp?t.createdAt:a.Timestamp.fromMillis(1e3*t.createdAt.seconds+(t.createdAt.nanoseconds||0)/1e6);t.createdAt=e.toDate().toISOString()}else t.createdAt?.seconds&&(t.createdAt=new Date(1e3*t.createdAt.seconds).toISOString());if(t.updatedAt&&(t.updatedAt instanceof a.Timestamp||t.updatedAt?.toDate)){let e=t.updatedAt instanceof a.Timestamp?t.updatedAt:a.Timestamp.fromMillis(1e3*t.updatedAt.seconds+(t.updatedAt.nanoseconds||0)/1e6);t.updatedAt=e.toDate().toISOString()}else t.updatedAt?.seconds&&(t.updatedAt=new Date(1e3*t.updatedAt.seconds).toISOString());if(t.cancelledAt&&(t.cancelledAt instanceof a.Timestamp||t.cancelledAt?.toDate)){let e=t.cancelledAt instanceof a.Timestamp?t.cancelledAt:a.Timestamp.fromMillis(1e3*t.cancelledAt.seconds+(t.cancelledAt.nanoseconds||0)/1e6);t.cancelledAt=e.toDate().toISOString()}else t.cancelledAt?.seconds&&(t.cancelledAt=new Date(1e3*t.cancelledAt.seconds).toISOString());if(t.notificationSentAt&&(t.notificationSentAt instanceof a.Timestamp||t.notificationSentAt?.toDate)){let e=t.notificationSentAt instanceof a.Timestamp?t.notificationSentAt:a.Timestamp.fromMillis(1e3*t.notificationSentAt.seconds+(t.notificationSentAt.nanoseconds||0)/1e6);t.notificationSentAt=e.toDate().toISOString()}else t.notificationSentAt?.seconds&&(t.notificationSentAt=new Date(1e3*t.notificationSentAt.seconds).toISOString());return t})(e);return s.C5.parse(t)},c=["status","calendarLink","consentId","updatedAt"],u={async updateBooking(e,t){let r=l(),n=(0,a.doc)(r,i.BOOKINGS,e);if(!(await (0,a.getDoc)(n)).exists())throw Error("找不到預約資料");let s=new Set(c),o={updatedAt:a.Timestamp.now()};for(let[e,r]of Object.entries(t))"createdAt"!==e&&s.has(e)&&void 0!==r&&(o[e]=r);await (0,a.mZ)(n,o);let u=await (0,a.getDoc)(n);if(!u.exists())throw Error("找不到預約資料");return{id:e,...d(u.data())}},async getBookingById(e){let t=l(),r=(0,a.doc)(t,i.BOOKINGS,e),n=await (0,a.getDoc)(r);if(!n.exists())return null;try{return{id:n.id,...d(n.data())}}catch(e){throw(0,o.vV)("解析預約資料失敗:",e),e}},subscribeBookingById(e,t){let r=l(),n=(0,a.doc)(r,i.BOOKINGS,e);return(0,a.aQ)(n,e=>{if(!e.exists())return void t(null);try{let r={id:e.id,...d(e.data())};t(r)}catch(e){(0,o.vV)("解析預約資料失敗:",e),t(null)}},e=>{(0,o.vV)("訂閱預約失敗:",e),t(null)})},async getUserBookings(e){let t=l(),r=(0,a.P)((0,a.rJ)(t,i.BOOKINGS),(0,a._M)("userId","==",e),(0,a.My)("date","desc"));return(await (0,a.GG)(r)).docs.map(e=>({id:e.id,...d(e.data())}))},async getAdvisorBookings(e){let t=l(),r=(0,a.P)((0,a.rJ)(t,i.BOOKINGS),(0,a._M)("advisorId","==",e),(0,a.My)("date","desc"));return(await (0,a.GG)(r)).docs.map(e=>({id:e.id,...d(e.data())}))},async cancelBooking(e){if(!i.functions)throw Error("Firebase Functions 尚未初始化");let t=(0,n.httpsCallable)(i.functions,"cancelBooking");await t({bookingId:e})}}},47026:(e,t,r)=>{r.d(t,{A7:()=>f,ME:()=>m,NZ:()=>a,WC:()=>o,Y9:()=>u,hZ:()=>_,v:()=>g});let a={twd:1,usd:31.5,jpy:.22,eur:34.2},n=0,i=null,s="system/exchangeRates",o=e=>{let t=(e||"").trim().toLowerCase(),r={twd:"twd",ntd:"twd",nt$:"twd",ntd$:"twd",台幣:"twd",新台幣:"twd",元:"twd",usd:"usd",$:"usd",us$:"usd",美金:"usd",美元:"usd",jpy:"jpy",日圓:"jpy",日元:"jpy","\xa5":"jpy","jp\xa5":"jpy",eur:"eur",歐元:"eur","€":"eur"};if(r[t])return r[t];let a=t.replace(/[^a-z]/g,"");return r[a]?r[a]:"twd"};async function l(){try{let{db:e}=await Promise.resolve().then(r.bind(r,76458)),{doc:t,getDoc:a,Timestamp:n}=await Promise.resolve().then(r.bind(r,24571));if(!e)return null;let i=t(e,s),o=await a(i);if(!o.exists())return null;let l=o.data(),d=l.expiresAt instanceof n?l.expiresAt.toMillis():"number"==typeof l.expiresAt?l.expiresAt:0;return{rates:l.rates||{usd:0,jpy:0,eur:0},expiresAt:d}}catch{return null}}async function d(e){try{let{db:t}=await Promise.resolve().then(r.bind(r,76458)),{doc:a,setDoc:n,serverTimestamp:i,Timestamp:o}=await Promise.resolve().then(r.bind(r,24571));if(!t)return;let l=Date.now(),d=a(t,s);await n(d,{rates:e,timestamp:i(),expiresAt:o.fromMillis(l+108e5)},{merge:!0})}catch{}}function c(e){return Date.now()>e}
1async function u(e=!1){return i||(!e&&Date.now()-n<=108e5?void 0:i=(async()=>{try{let e=await fetch("/api/exchange-rates");if(!e.ok)return;let t=await e.json().catch(()=>null),r=t?.data?.rates||null;if(!r)return;"number"==typeof r.usd&&r.usd>0&&(a.usd=r.usd),"number"==typeof r.jpy&&r.jpy>0&&(a.jpy=r.jpy),"number"==typeof r.eur&&r.eur>0&&(a.eur=r.eur),n=Date.now(),await d({usd:a.usd,jpy:a.jpy,eur:a.eur})}catch{}finally{i=null}})())}async function m(){try{let e=await l();if(e&&!c(e.expiresAt)){"number"==typeof e.rates.usd&&e.rates.usd>0&&(a.usd=e.rates.usd),"number"==typeof e.rates.jpy&&e.rates.jpy>0&&(a.jpy=e.rates.jpy),"number"==typeof e.rates.eur&&e.rates.eur>0&&(a.eur=e.rates.eur),n=e.expiresAt-108e5;return}await u(!0)}catch{}}let p=!1,f=(e,t)=>(!i&&!p&&Date.now()-n>108e5&&(p=!0,u().catch(()=>{}).finally(()=>{setTimeout(()=>{p=!1},1e3)})),e*a[t]),g=(e,t)=>e/a[t],_=(e,t,r)=>g(f(e,t),r);(async function e(){try{let e=await l();e&&!c(e.expiresAt)&&("number"==typeof e.rates.usd&&e.rates.usd>0&&(a.usd=e.rates.usd),"number"==typeof e.rates.jpy&&e.rates.jpy>0&&(a.jpy=e.rates.jpy),"number"==typeof e.rates.eur&&e.rates.eur>0&&(a.eur=e.rates.eur),n=e.expiresAt-108e5)}catch{}})().catch(()=>{})},48716:(e,t,r)=>{r.r(t),r.d(t,{cleanupLegacyFlags:()=>I,clearAllAuthFlags:()=>E,clearLoginState:()=>l,clearLogoutState:()=>m,clearOAuthRedirectState:()=>g,getLoginState:()=>o,getOAuthRedirectState:()=>f,hasLoggedInRecently:()=>d,isLogoutState:()=>u,isOAuthRedirectInProgress:()=>_,setLoginState:()=>s,setLogoutState:()=>c,setOAuthRedirectState:()=>p});let a="authState",n="logoutFlag",i="oauthRedirectState";function s(e){try{let t={isLoggedIn:!0,redirectPath:e,timestamp:Date.now()};sessionStorage.setItem(a,JSON.stringify(t))}catch(e){}}function o(){try{let e=sessionStorage.getItem(a);if(!e)return null;let t=JSON.parse(e);if(Date.now()-t.timestamp>3e5)return l(),null;return t}catch(e){return null}}function l(){try{sessionStorage.removeItem(a)}catch(e){}}function d(){let e=o();return e?.isLoggedIn===!0}function c(){try{sessionStorage.setItem(n,"1")}catch(e){}}function u(){try{return"1"===sessionStorage.getItem(n)}catch(e){return!1}}function m(){try{sessionStorage.removeItem(n)}catch(e){}}function p(e){let t=Date.now();try{let r={inProgress:!0,timestamp:t,...e&&{provider:e}}
1;sessionStorage.setItem(i,JSON.stringify(r))}catch(e){console.error("[OAuth] 設置 OAuth redirect 狀態時發生錯誤:",e)}}function f(){try{let e=sessionStorage.getItem(i);if(e){let t=JSON.parse(e);if(Date.now()-t.timestamp>3e4)return g(),null;return t}return null}catch(e){return console.error("[OAuth] 讀取 OAuth redirect 狀態時發生錯誤:",e),null}}function g(){try{sessionStorage.removeItem(i)}catch(e){}}function _(){let e=f();return e?.inProgress===!0}function I(){try{sessionStorage.removeItem("justLoggedIn"),sessionStorage.removeItem("authRedirected"),sessionStorage.removeItem("oauthRedirectInProgress"),sessionStorage.removeItem("oauthRedirectInProgressTimestamp")}catch{}try{localStorage.removeItem("oauthRedirectInProgress"),localStorage.removeItem("oauthRedirectInProgressTimestamp")}catch{}}function E(){l(),m(),g(),I()}I()},73521:(e,t,r)=>{r.d(t,{A:()=>p,O:()=>m});var a=r(85047),n=r(31615),i=r(30274),s=r(76458),o=r(18654),l=r(3379),d=r(47026),c=r(48716);let u=(0,n.createContext)({user:null,auth:void 0,loading:!0,isGoogleUser:!1,googleUserInfo:null,viewingUserId:null,viewingUserEmail:null,setViewingUser:()=>{},clearViewingUser:()=>{}}),m=({children:e})=>{let[t,m]=(0,n.useState)(null),[p,f]=(0,n.useState)(!0),[g,_]=(0,n.useState)(null),[I,E]=(0,n.useState)(null),S=s.auth,v=(0,n.useRef)(null);(0,n.useEffect)(()=>{try{let e=sessionStorage.getItem("viewingUserId"),t=sessionStorage.getItem("viewingUserEmail");e&&t&&(_(e),E(t))}catch(e){(0,o.vV)("恢復檢視模式狀態失敗:",e)}},[]),(0,n.useEffect)(()=>{let e;if(!S)return void f(!1);e=(0,i.onAuthStateChanged)(S,async e=>{let t=v.current,r=e&&!t;if((0,c.isOAuthRedirectInProgress)(),m(e),v.current=e,f(!1),e){if((0,c.clearLogoutState)(),r)try{await (0,d.ME)()}catch(e){(0,o.vV)("登入時更新匯率失敗:",e)}}else if((0,c.isOAuthRedirectInProgress)())(0,c.clearLogoutState)();else{(0,c.setLogoutState)(),localStorage.removeItem("lineLoginStatus"),localStorage.removeItem("lineUserId"),localStorage.removeItem("lineDisplayName"),localStorage.removeItem("linePictureUrl"),localStorage.removeItem("lineAccessToken"),localStorage.removeItem("lineLoginReturnUrl"),_(null),E(null);try{sessionStorage.removeItem("viewingUserId"),sessionStorage.removeItem("viewingUserEmail"),sessionStorage.removeItem("lineLoginSuccess"),(0,c.clearLoginState)()}catch(e){(0,o.vV)("清除檢視模式狀態失敗:",e)}}});let t=async()=>{try{let e=window.location.pathname;if("/auth"===e||e.startsWith("/auth/"))return;let{googleProvider:t}=await r.e(4982).then(r.bind(r,14982)),{authService:a}=await r.e(392).then(r.bind(r,60392)),n=await t.handleRedirectResult();n?.success&&n.user&&await a.handleAuthSuccess(n.user,n.credential)}catch(e){if(e?.code==="auth/multi-factor-auth-required")return;(0,o.vV)("處理重定向結果失敗:",e)}};return setTimeout(()=>{t()},100),()=>{e&&e()}},[S]);let h=!!t&&(0,l.jR)(t),A=t?(0,l.R7)(t):null;return(0,a.jsx)(u.Provider,{value:{user:t,auth:S,loading:p,isGoogleUser:h,googleUserInfo:A,viewingUserId:g,viewingUserEmail:I,setViewingUser:(e,t)=>{if(!e||"string"!=typeof e||""===e.trim())return void(0,o.vV)("setViewingUser: 無效的 UID",{uid:e});if(!t||"string"!=typeof t||""===t.trim())return void(0,o.vV)("setViewingUser: 無效的 Email",{email:t});_(e.trim()),E(t.trim());try{sessionStorage.setItem("viewingUserId",e.trim()),sessionStorage.setItem("viewingUserEmail",t.trim())}catch(e){(0,o.vV)("保存檢視模式狀態失敗:",e)}},clearViewingUser:()=>{_(null),E(null);try{sessionStorage.removeItem("viewingUserId"),sessionStorage.removeItem("viewingUserEmail")}catch(e){(0,o.vV)("清除檢視模式狀態失敗:",e)}}},children:e})},p=()=>(0,n.useContext)(u)},76458:(e,t,r)=>{let a,n,i,s,o,l,d;r.r(t),r.d(t,{ACCOUNTS:()=>h.Dx,ADVISORS:()=>h.cT,ADVISOR_CLIENTS:()=>h.uI,ASSETS:()=>h.kf,BOOKINGS:()=>h.Nw,BOOKING_CONSENTS:()=>h.Wr,BUDGETS:()=>h.bJ,CHAT_ROOMS:()=>h.ys,CREDIT_CARDS:()=>h.yC,CREDIT_CARD_BENEFIT_SUGGESTIONS:()=>h.r3,CREDIT_CARD_BENEFIT_VERIFICATIONS:()=>h.QR,CREDIT_CARD_TEMPLATES:()=>h.$O,CREDIT_CARD_TEMPLATE_ERROR_REPORTS:()=>h.L,CREDIT_CARD_TEMPLATE_REQUESTS:()=>h.RQ,GOALS:()=>h.lR,LIABILITIES:()=>h.GW,OIDC_LINE_PROVIDER_ID:()=>x,REVIEWS:()=>h.Cr,SUGGESTIONS:()=>h.MK,TAX_REMINDERS:()=>h.Sp,TRANSACTIONS:()=>h.e6,TRUSTS:()=>h.s_,USERS:()=>
1h.Jr,analytics:()=>P,app:()=>C,auth:()=>B,db:()=>D,functions:()=>U,getPerf:()=>O,messaging:()=>j,realtimeDb:()=>L});var c=r(87777),u=r(24571),m=r(30274),p=r(40372),f=r(71931),g=r(25072),_=r(18654),I=r(95861),E=r(15418),S=r(32407);function v(e){return e?.trim()||void 0}var h=r(27703),A=r(32407);let y=E.Ik({apiKey:E.Yj().min(1),authDomain:E.Yj().min(1),projectId:E.Yj().min(1),storageBucket:E.Yj().min(1),messagingSenderId:E.Yj().min(1),appId:E.Yj().min(1),measurementId:E.Yj().min(1).optional(),databaseURL:E.Yj().url().optional()}),R=(n=function(){let e=S.env.FIREBASE_WEBAPP_CONFIG;if(!e?.trim())return{};try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return{};return{apiKey:"string"==typeof t.apiKey?t.apiKey:void 0,authDomain:"string"==typeof t.authDomain?t.authDomain:void 0,projectId:"string"==typeof t.projectId?t.projectId:void 0,storageBucket:"string"==typeof t.storageBucket?t.storageBucket:void 0,messagingSenderId:"string"==typeof t.messagingSenderId?t.messagingSenderId:void 0,appId:"string"==typeof t.appId?t.appId:void 0,measurementId:"string"==typeof t.measurementId?t.measurementId:void 0,databaseURL:"string"==typeof t.databaseURL?t.databaseURL:void 0}}catch{return{}}}(),l=(o=(s={NEXT_PUBLIC_FIREBASE_API_KEY:(i=(e,t)=>v(S.env[t])??v(n[e]))("apiKey","NEXT_PUBLIC_FIREBASE_API_KEY"),NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN:i("authDomain","NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN"),NEXT_PUBLIC_FIREBASE_PROJECT_ID:i("projectId","NEXT_PUBLIC_FIREBASE_PROJECT_ID"),NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET:i("storageBucket","NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET"),NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID:i("messagingSenderId","NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID"),NEXT_PUBLIC_FIREBASE_APP_ID:i("appId","NEXT_PUBLIC_FIREBASE_APP_ID"),NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID:i("measurementId","NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID"),NEXT_PUBLIC_FIREBASE_DATABASE_URL:i("databaseURL","NEXT_PUBLIC_FIREBASE_DATABASE_URL")}).NEXT_PUBLIC_FIREBASE_API_KEY&&s.NEXT_PUBLIC_FIREBASE_PROJECT_ID?s:{NEXT_PUBLIC_FIREBASE_API_KEY:"AIzaSyB_r1_v5qmFmrnzJkpTZL3ryRWtSfDHD3E",NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN:"finance-app-263bf.firebaseapp.com",NEXT_PUBLIC_FIREBASE_PROJECT_ID:"finance-app-263bf",NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET:"finance-app-263bf.firebasestorage.app",NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID:"307877483016",NEXT_PUBLIC_FIREBASE_APP_ID:"1:307877483016:web:9287c046d1c533e254f7bd",NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID:"G-S5B380JDF7",NEXT_PUBLIC_FIREBASE_DATABASE_URL:"https://finance-app-263bf-default-rtdb.firebaseio.com"}).NEXT_PUBLIC_FIREBASE_PROJECT_ID,d=o.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN?.trim()||(l?`${l}.firebaseapp.com`:void 0),{apiKey:o.NEXT_PUBLIC_FIREBASE_API_KEY,authDomain:d,projectId:l,storageBucket:o.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,messagingSenderId:o.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,appId:o.NEXT_PUBLIC_FIREBASE_APP_ID,measurementId:o.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID?.trim()||void 0,databaseURL:o.NEXT_PUBLIC_FIREBASE_DATABASE_URL?.trim()||void 0}),b=()=>{let e=y.safeParse(R);if(e.success)return e.data;let t=e.error.issues.map(e=>e.path.join(".")).filter(Boolean);return(0,_.vV)("[Firebase Config] 驗證失敗,缺少或無效欄位:",t.join(", ")),null},T="true"===A.env.CI&&!1,N={apiKey:"build-placeholder",authDomain:"placeholder.firebaseapp.com",projectId:"placeholder",storageBucket:"placeholder.appspot.com",messagingSenderId:"0",appId:"1",measurementId:"G-0",databaseURL:"https://placeholder-default-rtdb.firebaseio.com"};function w(e,t){let n,i,s=!!R.measurementId,o=(0,m.getAuth)(e);t&&o?.app.options.authDomain&&o.app.options.authDomain!==t.authDomain&&(0,_.vV)(`[Firebase Config] ⚠️ authDomain 不一致!配置: ${t.authDomain}, 實際: ${o.app.options.authDomain}`);let l=(0,u.aU)(e),d=(0,I.C3)(e),c=(0,f.getFunctions)(e,"asia-east1");if(s)try{n=(0,p.P5)(e);try{(0,p.WV)(n,!0)}catch(e){(0,_.vV)("啟用 Analytics 收集失敗:",e)}}catch(e){(0,_.vV)("Firebase Analytics 初始化失敗:",e)}try{i=(0,g.dG)(e)}catch(e){(0,_.vV)("Firebase Messaging 初始化失敗:",e)}return r.e(2892).then(r.bind(r,42892)).then(({getPerformance:t})=>{try{a=t(e)}catch(e){(0,_.vV)("Firebase Performance 初始化失敗:",e)}}).catch(e=>(0,_.vV)("載入 Firebase Performance 模組失敗:",e)),(0,m.setPersistence)(o,m.browserLocalPersistence).catch(e=>{(0,_.vV)("設置身份驗證持久化時發生錯誤:",e)}),{app:e,auth:o,db:l,realtimeDb:d,analytics:n,functions:c,messaging:i}}let{app:C,auth:B,db:D,realtimeDb:L,analytics:P,functions:U,messaging:j}=(()=>
1{if(!(0,c.Dk)().length){let e=b(),t=e||(T?N:null);if(!t)return(0,_.vV)("Firebase config 驗證失敗,請檢查 .env 設定"),{app:void 0,auth:void 0,db:void 0,realtimeDb:void 0,analytics:void 0,functions:void 0,messaging:void 0};try{let r=(0,c.Wp)(t);return(0,c.He)("silent"),w(r,e)}catch(e){return(0,_.vV)("Firebase 初始化失敗:",e),{app:void 0,auth:void 0,db:void 0,realtimeDb:void 0,analytics:void 0,functions:void 0,messaging:void 0}}}try{let e=(0,c.Dk)()[0];(0,c.He)("silent");let t=b();return w(e,t)}catch(e){return(0,_.vV)("Firebase 取得現有實例失敗:",e),{app:void 0,auth:void 0,db:void 0,realtimeDb:void 0,analytics:void 0,functions:void 0,messaging:void 0}}})();function O(){return a}let x=A.env.NEXT_PUBLIC_OIDC_LINE_PROVIDER_ID||"oidc.mhk01"},93806:(e,t,r)=>{r.d(t,{clearAdvisorIdentityCached:()=>p,s:()=>f});var a=r(31615),n=r(24571),i=r(76458),s=r(73521),o=r(18654);let l=new Map,d="advisor_identity_";function c(e){return`${d}${e}`}function u(e){let t=l.get(e);if(t)return t;let r=function(e){try{let t=sessionStorage.getItem(c(e));if(!t)return;let r=JSON.parse(t);if(!r||"boolean"!=typeof r.isAdvisor)return;return r}catch{return}}(e);if(r)return l.set(e,r),r}function m(e,t){l.set(e,t);try{sessionStorage.setItem(c(e),JSON.stringify(t))}catch{}}function p(e){if(e){l.delete(e);try{sessionStorage.removeItem(c(e))}catch{}return}l.clear();try{let e=[];for(let t=0;t<sessionStorage.length;t++){let r=sessionStorage.key(t);r?.startsWith(d)&&e.push(r)}e.forEach(e=>sessionStorage.removeItem(e))}catch{}}function f(){let{user:e}=(0,s.A)(),t=e?.uid?u(e.uid):void 0,[r,l]=(0,a.useState)(()=>t?.isAdvisor??!1),[d,c]=(0,a.useState)(()=>t?.advisor??null),[p,f]=(0,a.useState)(()=>!t),[g,_]=(0,a.useState)(null);return(0,a.useEffect)(()=>{if(!e?.uid||!i.db){f(!1),l(!1),c(null);return}(async()=>{if(!i.db){_("Firestore 尚未初始化"),f(!1);return}let t=u(e.uid);try{t||f(!0),_(null);let r=(0,n.doc)(i.db,"users",e.uid),a=await (0,n.getDoc)(r);if(!a.exists()){l(!1),c(null),m(e.uid,{isAdvisor:!1,advisor:null}),f(!1);return}let s=a.data(),o=String(s?.role||"").toLowerCase(),d=s?.email||e?.email||"";if("admin"!==o&&"advisor"!==o){l(!1),c(null),m(e.uid,{isAdvisor:!1,advisor:null}),f(!1);return}let u=(0,n.P)((0,n.rJ)(i.db,"advisors"),(0,n._M)("userId","==",e.uid)),p=await (0,n.GG)(u);if(p.empty&&d&&(u=(0,n.P)((0,n.rJ)(i.db,"advisors"),(0,n._M)("email","==",d)),p=await (0,n.GG)(u)),p.empty){let t="admin"===o;l(t),c(null),m(e.uid,{isAdvisor:t,advisor:null})}else{let t=p.docs[0],r={...t.data(),id:t.id};c(r),l(!0),m(e.uid,{isAdvisor:!0,advisor:r})}}catch(e){(0,o.vV)("檢查顧問身份失敗:",e),_(e instanceof Error?e.message:"檢查顧問身份失敗"),t||(l(!1),c(null))}finally{f(!1)}})()},[e?.uid,e?.email]),{isAdvisor:r,advisor:d,loading:p,error:g}}},94558:(e,t,r)=>{r.d(t,{T:()=>a});function a(e){if(null==e)return e;let t=typeof e;if("string"===t||"number"===t||"boolean"===t||"bigint"===t)return e;if("function"===t||"symbol"===t)return String(e);if(e instanceof Error)return e.code?`${e.code}: ${e.message}`:e.message||e.name||String(e);if("object"===t){if("string"==typeof e.code||"string"==typeof e.message){let t="string"==typeof e.code?e.code:"",r="string"==typeof e.message?e.message:"";if(t&&r)return`${t}: ${r}`;if(t)return t;if(r)return r}try{return JSON.stringify(e)}catch{}}return String(e)}},97839:(e,t,r)=>{r.d(t,{SQ:()=>m,_2:()=>p,lp:()=>f,mB:()=>g,rI:()=>c,ty:()=>u});var a=r(85047),n=r(31615),i=r(76490),s=r(95513),o=r(68341),l=r(72723),d=r(34961);let c=i.bL,u=i.l9;i.YJ,i.ZL,i.Pb,i.z6,n.forwardRef(({className:e,inset:t,children:r,...n},o)=>(0,a.jsxs)(i.ZP,{ref:o,className:(0,d.cn)("flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",t&&"pl-8",e),...n,children:[r,(0,a.jsx)(s.A,{className:"ml-auto"})]})).displayName=i.ZP.displayName,n.forwardRef(({className:e,...t},r)=>(0,a.jsx)(i.G5,{ref:r,className:(0,d.cn)("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
1de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t})).displayName=i.G5.displayName;let m=n.forwardRef(({className:e,sideOffset:t=4,...r},n)=>(0,a.jsx)(i.ZL,{children:(0,a.jsx)(i.UC,{ref:n,sideOffset:t,className:(0,d.cn)("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...r})}));m.displayName=i.UC.displayName;let p=n.forwardRef(({className:e,inset:t,...r},n)=>(0,a.jsx)(i.q7,{ref:n,className:(0,d.cn)("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",t&&"pl-8",e),...r}));p.displayName=i.q7.displayName,n.forwardRef(({className:e,children:t,checked:r,...n},s)=>(0,a.jsxs)(i.H_,{ref:s,className:(0,d.cn)("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:r,...n,children:[(0,a.jsx)("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:(0,a.jsx)(i.VF,{children:(0,a.jsx)(o.A,{className:"h-4 w-4"})})}),t]})).displayName=i.H_.displayName,n.forwardRef(({className:e,children:t,...r},n)=>(0,a.jsxs)(i.hN,{ref:n,className:(0,d.cn)("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...r,children:[(0,a.jsx)("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:(0,a.jsx)(i.VF,{children:(0,a.jsx)(l.A,{className:"h-2 w-2 fill-current"})})}),t]})).displayName=i.hN.displayName;let f=n.forwardRef(({className:e,inset:t,...r},n)=>(0,a.jsx)(i.JU,{ref:n,className:(0,d.cn)("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...r}));f.displayName=i.JU.displayName;let g=n.forwardRef(({className:e,...t},r)=>(0,a.jsx)(i.wv,{ref:r,className:(0,d.cn)("-mx-1 my-1 h-px bg-muted",e),...t}));g.displayName=i.wv.displayName}}]);

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.