PageSourceSearch

https://xynergy.ai/_next/static/chunks/5189-224c0739e79a0ee6.js

js xynergy.ai collected 2026-10-05 16:01:50 UTC 46,406 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5189,7014],{575:(e,t,a)=>{a.d(t,{D:()=>c});var s=a(31615),r=a(73521),l=a(21),i=a(8958);function n(e){try{let t={...e,lastSynced:new Date().toISOString()};localStorage.setItem(i.RZ,JSON.stringify(t))}catch(e){console.warn("[useSoundPreferences] 儲存 localStorage 失敗:",e)}}function c(){let{user:e}=(0,r.A)(),[t,a]=(0,s.useState)({...i.wK}),[c,o]=(0,s.useState)(!0),[d,u]=(0,s.useState)(null),m=(0,s.useRef)(!1);(0,s.useEffect)(()=>{!async function(){o(!0),u(null);try{let t=function(){try{let e=localStorage.getItem(i.RZ);if(e){let t=JSON.parse(e);return{enabled:t.enabled??i.wK.enabled,categories:{alerts:t.categories?.alerts??i.wK.categories.alerts,tasks:t.categories?.tasks??i.wK.categories.tasks},volume:t.volume??i.wK.volume}}}catch(e){console.warn("[useSoundPreferences] 讀取 localStorage 失敗:",e)}return null}();if(t&&a(t),e?.uid)try{let t=await l.s.getSoundSettings(e.uid);a(t),n(t)}catch(e){console.warn("[useSoundPreferences] Firestore 讀取失敗,使用 localStorage 設定:",e)}}catch(e){console.error("[useSoundPreferences] 載入設定失敗:",e),u("載入音效設定失敗")}finally{o(!1),m.current=!0}}()},[e?.uid]);let h=(0,s.useCallback)(async s=>{let r={enabled:s.enabled??t.enabled,categories:{alerts:s.categories?.alerts??t.categories.alerts,tasks:s.categories?.tasks??t.categories.tasks},volume:s.volume??t.volume};if(a(r),n(r),e?.uid)try{await l.s.setSoundSettings(e.uid,r)}catch(e){console.error("[useSoundPreferences] Firestore 同步失敗:",e)}},[t,e?.uid]),p=(0,s.useCallback)(async()=>{await h({enabled:!t.enabled})},[t.enabled,h]),x=(0,s.useCallback)(async e=>{let t=Math.max(0,Math.min(1,e));await h({volume:t})},[h]),g=(0,s.useCallback)(async e=>{await h({categories:{...t.categories,[e]:!t.categories[e]}})},[t.categories,h]);return{preferences:t,isLoading:c,error:d,updatePreferences:h,toggleEnabled:p,setVolume:x,toggleCategory:g,refresh:(0,s.useCallback)(async()=>{if(e?.uid){o(!0);try{let t=await l.s.getSoundSettings(e.uid);a(t),n(t)}catch(e){console.error("[useSoundPreferences] 重新載入失敗:",e),u("重新載入音效設定失敗")}finally{o(!1)}}},[e?.uid])}}},9234:(e,t,a)=>{a.d(t,{sN:()=>x,MV:()=>p});var s=a(4153),r=a(15418);let l=r.KC([r.p6(),r.Ik({seconds:r.ai(),nanoseconds:r.ai()}),r.bz()]),i=r.k5(["D","M","Y"]),n=r.k5(["onetime","monthly"]),c=r.k5(["pending","active","failed","cancelled","completed"]),o=r.Ik({displayOnWall:r.zM().default(!1),displayName:r.Yj().min(1).max(50).optional(),message:r.Yj().max(200).optional()});r.Ik({id:r.Yj(),amount:r.ai().int().positive(),name:r.Yj(),description:r.Yj().optional(),isActive:r.zM().default(!0),sortOrder:r.ai().int().nonnegative().default(0),periodType:i.default("M"),frequency:r.ai().int().positive().default(1),execTimes:r.ai().int().positive().default(99),createdAt:l.optional(),updatedAt:l.optional()}),r.Ik({userId:r.Yj(),type:n,tierId:r.Yj().optional(),amount:r.ai().nonnegative(),merchantTradeNo:r.Yj().min(1),status:c.default("pending"),sponsorProfile:o.optional(),periodType:i.optional(),frequency:r.ai().int().positive().optional(),execTimes:r.ai().int().positive().optional(),currentExecTimes:r.ai().int().nonnegative().default(0),nextPaymentDate:l.optional(),createdAt:l.optional(),updatedAt:l.optional(),cancelledAt:l.optional(),cancellationReason:r.Yj().optional(),renewalFailure:r.Ik({consecutiveFailures:r.ai().int().positive(),lastFailedAt:l.optional(),lastFailureMessage:r.Yj().nullable().optional()}).optional(),chargedAfterCancel:r.zM().optional()}),r.Ik({id:r.Yj(),sponsorshipId:r.Yj(),userId:r.Yj(),merchantTradeNo:r.Yj(),ecpayTradeNo:r.Yj().nullable().optional(),gwsr:r.Yj().nullable().optional(),amount:r.ai().nonnegative(),paymentDate:l,status:r.k5(["success","failed","pending","refunded"]),paymentType:r.Yj().optional(),amountMismatch:r.zM().optional(),chargedAfterCancel:r.zM().optional(),ecpayResponse:r.g1(r.Yj(),r.bz()).optional(),createdAt:l.optional()}),r.Ik({type:n,amount:r.ai().int().min(200),tierId:r.Yj().nullish(),displayOnWall:r.zM().default(!1),displayName:r.Yj().max(50).nullish(),message:r.Yj().max(200).nullish(),clientBackURL:r.Yj().url().nullish(),orderResultURL:r.Yj().url().nullish()}),r.Ik({sponsorshipId:r.Yj().min(1)}).passthrough();let d=r.k5(["monthly","yearly"]),u=r.Ik({id:r.Yj().min(1),label:r.Yj().min(1),description:r.Yj().min(1),billingPeriod:d,amountTwd:r.ai().int().nonnegative().nullable(),monthlyAmountTwd:r.ai().int().nonnegative().nullable()}),m=r.Ik({lastUpdated:r.Yj().regex(/^\d{4}-\d{2}-\d{2}$/),updateCadence:r.Yj().min(1),items:r.YO(u).min(1)}),h=r.Ik({id:r.Yj().min(1),amountTwd:r.ai().int().nonnegative().nullable().optional(),billingPeriod:d.optional(),monthlyAmountTwd:r.ai().int().nonnegative().nullable().optional()});function p(e,t){return null===e?null:"yearly"===t?Math.round(e/12):e}function x(){let{lastUpdated:e,updateCadence:t,items:a}=s.Bm.costBreakdown;return m.parse({lastUpdated:e,updateCadence:t,items:a.map(e=>{let t;return t=(void 0)??e.defaultBillingPeriod,{id:e.id,label:e.label,description:e.description,billingPeriod:t,amountTwd:null,monthlyAmountTwd:p(null,t)}})})}r.Ik({items:r.YO(h),lastUpdated:r.Yj().regex(/^\d{4}-\d{2}-\d{2}$/),updatedBy:r.Yj().optional()}),r.Ik({items:r.YO(r.Ik({id:r.Yj().min(1),amountTwd:r.ai().int().nonnegative().nullable(),billingPeriod:d})).min(1)}),a(27703)},27012:(e,t,a)=>{a.d(t,{A:()=>u});var s=a(85047),r=a(31615),l=a(82520),i=a(21410),n=a(21016),c=a(2416),o=a(85183);class d extends r.Component{constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e,errorInfo:null}}componentDidCatch(e,t){this.setState({error:e,errorInfo:t}),this.props.onError&&this.props.onError(e,t)}handleRetry=()=>{this.setState({hasError:!1,error:null,errorInfo:null})};render(){return this.state.hasError?this.props.fallback?this.props.fallback:(0,s.jsxs)(l.Zp,{className:"border-red-200 bg-red-50 dark:border-red-800 dark:bg-red-950",children:[(0,s.jsxs)(l.aR,{children:[(0,s.jsxs)(l.ZB,{className:"flex items-center gap-2 text-red-800 dark:text-red-200",children:[(0,s.jsx)(c.A,{className:"h-5 w-5"}),"發生錯誤"]}),(0,s.jsx)(l.BT,{className:"text-red-600 dark:text-red-400",children:"管理頁面載入時發生未預期的錯誤"})]}),(0,s.jsxs)(l.Wu,{className:"space-y-4",children:[(0,s.jsxs)(n.Fc,{children:[(0,s.jsx)(c.A,{className:"h-4 w-4"}),(0,s.jsxs)(n.TN,{children:[(0,s.jsx)("strong",{children:"錯誤詳情:"}),(0,s.jsx)("div",{className:"mt-2 text-sm font-mono bg-red-100 dark:bg-red-900 p-2 rounded",children:this.state.error?.message||"未知錯誤"})]})]}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)(i.$,{onClick:this.handleRetry,variant:"outline",className:"border-red-300 text-red-700 hover:bg-red-100",children:[(0,s.jsx)(o.A,{className:"h-4 w-4 mr-2"}),"重新載入"]}),(0,s.jsx)(i.$,{onClick:()=>window.location.reload(),variant:"default",children:"刷新頁面"})]}),!1]})]}):this.props.children}}let u=d},37014:(e,t,a)=>{a.d(t,{callFn:()=>i,callPublicFn:()=>n});var s=a(71931),r=a(76458),l=a(19548);async function i(e,t){if(!r.functions)throw Error("Firebase Functions 未初始化");if(!r.auth)throw Error("Firebase Auth 未初始化");if(!r.auth.currentUser)throw Error("用戶未登入,請先登入後再使用此功能");try{if(!await r.auth.currentUser.getIdToken(!0))throw Error("無法取得認證 token")}catch(t){let e=t instanceof Error?t:Error(String(t));throw l.Cp(e,{level:"error",extra:{message:"刷新 ID Token 失敗",operation:"callFn.getIdToken"},tags:{source:"firebase.callFn"}}),Error("認證失敗,請重新登入")}if(!r.app)throw Error("Firebase App 未初始化");if(r.functions&&"app"in r.functions&&r.auth&&"app"in r.auth){let e=r.functions.app,t=r.auth.app;if(e!==t)throw l.Cp(Error("Firebase App mismatch"),{level:"error",extra:{message:"Firebase App 實例不一致",functionsAppName:e?.name,authAppName:t?.name,appName:r.app?.name},tags:{source:"firebase.callFn"}}),Error("Firebase App 實例不一致,請重新初始化")}let a=(0,s.httpsCallable)(r.functions,e);try{return await a(t)}catch(n){let a=n?.code||"",i=String(n?.message||"");if("unauthenticated"===a||"permission-denied"===a||i.includes("unauth")||i.includes("401")||i.includes("Unauthorized"))try{if(!r.auth.currentUser)throw Error("用戶已登出,請重新登入");await r.auth.currentUser.getIdToken(!0),await new Promise(e=>setTimeout(e,100));let a=(0,s.httpsCallable)(r.functions,e);return await a(t)}catch(t){throw l.Cp(t instanceof Error?t:Error(String(t)),{level:"error",extra:{message:`重試失敗: ${e}`,operation:"callFn.retry",code:t?.code},tags:{source:"firebase.callFn"}}),Error(t?.message||"認證失敗,請重新登入後再試")}throw n}}async function n(e,t){if(!r.functions)throw Error("Firebase Functions 未初始化");return(0,s.httpsCallable)(r.functions,e)(t)}},42603:(e,t,a)=>{a.d(t,{f:()=>i});var s=a(31615),r=a(575),l=a(28979);function i(){let{preferences:e}=(0,r.D)(),t=(0,s.useRef)(e);(0,s.useEffect)(()=>{t.current=e},[e]),(0,s.useEffect)(()=>{e.enabled&&l.jY.preloadSounds()},[e.enabled]);let a=(0,s.useCallback)(async e=>l.jY.playSound(e,t.current),[]),i=(0,s.useCallback)(async()=>a("NOTIFICATION"),[a]),n=(0,s.useCallback)(async()=>a("SUCCESS"),[a]),c=(0,s.useCallback)(async()=>a("ERROR"),[a]),o=(0,s.useCallback)(async()=>a("WARNING"),[a]),d=(0,s.useCallback)(async()=>a("FINANCIAL"),[a]),u=(0,s.useCallback)(async()=>a("COMPLETE"),[a]),m=(0,s.useCallback)(async()=>l.jY.playTestSound(t.current.volume),[]);return{playSound:a,playNotification:i,playSuccess:n,playError:c,playWarning:o,playFinancialAlert:
1d,playTaskComplete:u,playTestSound:m,playSoundForTest:(0,s.useCallback)(async e=>l.jY.playSoundForTest(e,t.current.volume),[]),preloadSounds:(0,s.useCallback)(e=>{l.jY.preloadSounds(e)},[]),isAudioUnlocked:l.jY.isAudioUnlocked(),isEnabled:e.enabled,volume:e.volume}}},57966:(e,t,a)=>{a.d(t,{Ke:()=>o,Nt:()=>n,R6:()=>c});var s=a(85047),r=a(31615),l=a(37323),i=a(34961);let n=l.bL,c=l.l9,o=r.forwardRef(({className:e,...t},a)=>(0,s.jsx)(l.UC,{ref:a,className:(0,i.cn)("overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",e),...t}));o.displayName=l.UC.displayName},90508:(e,t,a)=>{a.d(t,{A:()=>H});var s=a(85047),r=a(31615),l=a(21410),i=a(96968),n=a(866),c=a(41178),o=a(18654),d=a(73521),u=a(8947),m=a(79982),h=a(19548),p=a(79705),x=a(18534),g=a(42176),f=a(61997);let b=async(e,t,a=0)=>{let s=await new Promise((t,a)=>{let s=new Image;s.addEventListener("load",()=>t(s)),s.addEventListener("error",e=>a(e)),s.src=e}),r=document.createElement("canvas"),l=r.getContext("2d");if(!l)throw Error("無法取得 Canvas 2D 上下文");let i=a*Math.PI/180,n=Math.abs(Math.sin(i)),c=Math.abs(Math.cos(i)),o=s.width*c+s.height*n,d=s.width*n+s.height*c;r.width=o,r.height=d,l.imageSmoothingEnabled=!0,l.imageSmoothingQuality="high",l.translate(o/2,d/2),0!==a&&l.rotate(i),l.drawImage(s,-s.width/2,-s.height/2);let u=document.createElement("canvas"),m=u.getContext("2d");if(!m)throw Error("無法取得裁剪 Canvas 2D 上下文");return u.width=t.width,u.height=t.height,m.imageSmoothingEnabled=!0,m.imageSmoothingQuality="high",m.drawImage(r,t.x,t.y,t.width,t.height,0,0,t.width,t.height),new Promise((e,t)=>{u.toBlob(a=>{a?e(URL.createObjectURL(a)):t(Error("無法生成圖片 blob"))},"image/jpeg",.95)})};function v({imageSrc:e,open:t,onOpenChange:a,onSave:i,aspect:n=1,cropShape:c="round"}){let[o,d]=(0,r.useState)({x:0,y:0}),[u,j]=(0,r.useState)(1),[y,N]=(0,r.useState)(0),[k,w]=(0,r.useState)(null),[C,S]=(0,r.useState)(!1),T=(0,r.useCallback)((e,t)=>{w(t)},[]),D=(0,r.useCallback)(async()=>{if(k)try{S(!0);let t=await b(e,k,y);i(t),a(!1)}catch(e){h.Cp(e instanceof Error?e:Error(String(e)),{level:"error",extra:{message:"圖片處理失敗"},tags:{source:"ImageEditor.handleSave"}})}finally{S(!1)}},[k,e,y,i,a]),A=(0,r.useCallback)(()=>{d({x:0,y:0}),j(1),N(0)},[]);return(0,s.jsx)(x.lG,{open:t,onOpenChange:a,children:(0,s.jsxs)(x.Cf,{className:"sm:max-w-[600px]",children:[(0,s.jsxs)(x.c7,{children:[(0,s.jsx)(x.L3,{children:"編輯頭像"}),(0,s.jsx)(x.rr,{children:"調整圖片位置、縮放和旋轉,然後點擊確認儲存"})]}),(0,s.jsx)("div",{className:"relative w-full h-[400px] bg-black rounded-lg overflow-hidden",children:(0,s.jsx)(m.Ay,{image:e,crop:o,zoom:u,rotation:y,aspect:n,cropShape:c,onCropChange:d,onZoomChange:j,onRotationChange:N,onCropComplete:T,style:{containerStyle:{width:"100%",height:"100%",position:"relative"}}})}),(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between text-sm",children:[(0,s.jsxs)("span",{className:"flex items-center gap-2",children:[(0,s.jsx)(g.A,{className:"h-4 w-4"}),"縮放"]}),(0,s.jsxs)("span",{className:"text-muted-foreground",children:[Math.round(100*u),"%"]})]}),(0,s.jsx)(p.A,{value:[u],min:1,max:3,step:.1,onValueChange:e=>j(e[0])})]}),(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsxs)("div",{className:"flex items-center justify-between text-sm",children:[(0,s.jsxs)("span",{className:"flex items-center gap-2",children:[(0,s.jsx)(f.A,{className:"h-4 w-4"}),"旋轉"]}),(0,s.jsxs)("span",{className:"text-muted-foreground",children:[y,"\xb0"]})]}),(0,s.jsx)(p.A,{value:[y],min:0,max:360,step:1,onValueChange:e=>N(e[0])})]})]}),(0,s.jsxs)(x.Es,{className:"flex justify-between",children:[(0,s.jsx)(l.$,{variant:"outline",onClick:A,children:"重置"}),(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)(l.$,{variant:"outline",onClick:()=>a(!1),children:"取消"}),(0,s.jsx)(l.$,{onClick:D,disabled:C,children:C?"處理中...":"確認儲存"})]})]})]})})}var j=a(82520),y=a(24571),N=a(76458),k=a(2134),w=a(38187),C=a(60373),S=a(78828),T=a(20290),D=a(42165),A=a(88660),I=a(93674),E=a(34961);let M=["退休規劃","投資策略","稅務規劃","保險規劃","風險管理","家庭財務","資產配置","股票投資","ETF策略","稅務優化","傳承規劃","財富傳承","債務管理","現金流規劃","預算編制","職涯財務","投資入門"],O=["台北市","新北市","桃園市","新竹市","基隆市","台中市","彰化縣","南投縣","苗栗縣","雲林縣","高雄市","台南市","屏東縣","嘉義市"];function Y({formData:e,onFormDataChange:t,avatarPreview:a,avatarInputId:r,onAvatarChange:c,onAvatarClear:o,onAvatarEdit:d,avatarFile:u,onSpecialtyChange:m,onAreaChange:h,onCertificationChange:p,certificationsLockedUntil:x}){let g=e.specialties.length>=3,f=e.serviceAreas.length>=3,b=!!x;return(0,s.jsxs)("div",{className:"space-y-6 text-base",children:[(0,s.jsxs)(j.Zp,{children:[(0,s.jsxs)(j.aR,{children:[(0,s.jsx)(j.ZB,{className:"text-lg",children:"個人資料"}),(0,s.jsx)(j.BT,{className:"text-sm",children:"基本個人資訊"})]}),(0,s.jsxs)(j.Wu,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsxs)(i.J,{htmlFor:"name",className:"text-left text-base",children:["姓名 ",(0,s.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,s.jsx)(n.p,{id:"name",value:e.name,onChange:e=>t({name:e.target.value}),className:"md:col-span-3 text-base",placeholder:"請輸入顧問姓名"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-start gap-4",children:[(0,s.jsx)(i.J,{htmlFor:r,className:"text-left pt-2 text-base",children:"頭像"}),(0,s.jsxs)("div",{className:"md:col-span-3 flex flex-col gap-3",children:[a&&(0,s.jsxs)("div",{className:"relative inline-block",children:[(0,s.jsxs)(C.eu,{className:"h-32 w-32 border-2 border-border",children:[(0,s.jsx)(C.BK,{src:a,alt:"頭像預覽"}),(0,s.jsx)(C.q5,{className:"text-lg",children:e.name?e.name.substring(0,2):"預覽"})]}),u&&(0,s.jsx)("div",{className:"absolute -top-2 -right-2 bg-primary text-primary-foreground rounded-full p-1",children:(0,s.jsx)(S.A,{className:"h-3 w-3"})})]}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsxs)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{let e=document.getElementById(r);e?.click()},className:"flex items-center gap-2",children:[(0,s.jsx)(T.A,{className:"h-4 w-4"}),a?"更換頭像":"上傳頭像"]}),a&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(l.$,{type:"button",variant:"outline",size:"sm",onClick:d,className:"flex items-center gap-2",children:[(0,s.jsx)(S.A,{className:"h-4 w-4"}),"編輯頭像"]}),(0,s.jsxs)(l.$,{type:"button",variant:"outline",size:"sm",onClick:o,className:"flex items-center gap-2",children:[(0,s.jsx)(D.A,{className:"h-4 w-4"}),"清除頭像"]})]}),(0,s.jsx)("input",{id:r,type:"file",accept:"image/*",onChange:c,className:"hidden"})]})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsx)(i.J,{htmlFor:"company",className:"text-left text-base",children:"公司名稱"}),(0,s.jsx)(n.p,{id:"company",value:e.company||"",onChange:e=>t({company:e.target.value}),className:"md:col-span-3 text-base",placeholder:"獨立理財顧問請填:IFA"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsx)(i.J,{htmlFor:"officeAddress",className:"text-left text-base",children:"辦公室地址"}),(0,s.jsx)(n.p,{id:"officeAddress",value:e.officeAddress||"",onChange:e=>t({officeAddress:e.target.value}),className:"md:col-span-3 text-base",placeholder:"面對面諮詢用:例如 台北市信義區市府路 45 號"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsx)(i.J,{htmlFor:"yearsOfExperience",className:"text-left text-base",children:"年資"}),(0,s.jsxs)("div",{className:"md:col-span-3 space-y-2",children:[(0,s.jsx)(n.p,{id:"yearsOfExperience",type:"number",min:"0",max:"30",step:"1",value:e.yearsOfExperience,onChange:e=>{t({yearsOfExperience:Math.max(0,Math.min(30,Math.floor(Number(e.target.value)||0)))})},className:"text-base",placeholder:"請輸入年資(0-30年)"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"請輸入您的專業年資,範圍為 0-30 年"})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsxs)(i.J,{htmlFor:"website",className:"text-left flex items-center gap-1 text-base",children:[(0,s.jsx)(A.A,{className:"h-4 w-4"}),"個人網站"]}),(0,s.jsx)(n.p,{id:"website",type:"url",value:e.website,onChange:e=>t({website:e.target.value}),className:"md:col-span-3 text-base",placeholder:"https://example.com"})]})]})]}),(0,s.jsxs)(j.Zp,{children:[(0,s.jsxs)(j.aR,{children:[(0,s.jsx)(j.ZB,{className:"text-lg",children:"業務資訊"}),(0,s.jsx)(j.BT,{className:"text-sm",children:"專業服務相關資訊"})]}),(0,s.jsxs)(j.Wu,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-start gap-4",children:[(0,s.jsxs)(i.J,{className:"text-left pt-2 text-base",children:["專長 ",(0,s.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,s.jsxs)("div",{className:"md:col-span-3",children:[(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:M.map(t=>{let a=e.specialties.includes(t),r=!a&&g;return(0,s.jsx)(w.E,{variant:a?"default":"outline",className:(0,E.cn)("cursor-pointer transition-opacity text-sm",r&&"opacity-50 cursor-not-allowed"),onClick:()=>!r&&m(t),children:t},t)})}),(0,s.jsxs)("p",{className:"text-sm text-muted-foreground mt-2",children:["最多可選擇 3 項專長",e.specialties.length>0&&(0,s.jsxs)("span",{className:"ml-2",children:["(已選 ",e.specialties.length," 項)"]})]})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-start gap-4",children:[(0,s.jsxs)(i.J,{className:"text-left pt-2 text-base",children:["服務地區 ",(0,s.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,s.jsxs)("div",{className:"md:col-span-3",children:[(0,s.jsx)("div",{className:"flex flex-wrap gap-2",children:O.map(t=>{let a=e.serviceAreas.includes(t),r=!a&&f;return(0,s.jsx)(w.E,{variant:a?"default":"outline",className:(0,E.cn)("cursor-pointer transition-opacity text-sm",r&&"opacity-50 cursor-not-allowed"),onClick:()=>!r&&h(t),children:t},t)})}),(0,s.jsxs)("p",{className:"text-sm text-muted-foreground mt-2",children:["最多可選擇 3 項地區",e.serviceAreas.length>0&&(0,s.jsxs)("span",{className:"ml-2",children:["(已選 ",e.serviceAreas.length," 項)"]})]})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-start gap-4",children:[(0,s.jsxs)(i.J,{className:"text-left pt-2 text-base",children:["證照 ",(0,s.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,s.jsxs)("div",{className:"md:col-span-3",children:[(0,s.jsx)("div",{className:(0,E.cn)("flex flex-wrap gap-2",b&&"pointer-events-none opacity-80"),children:(0,I.L2)().map(t=>{let a=(e.certifications||[]).includes(t.id);return(0,s.jsx)(w.E,{variant:a?"default":"outline",className:(0,E.cn)("text-sm",!b&&"cursor-pointer"),onClick:()=>!b&&p(t.id),children:t.abbreviation},t.id)})}),(0,s.jsxs)("p",{className:"text-sm text-muted-foreground mt-2",children:[b&&x?`證照於一週內僅可更新一次,可再次編輯日期:${x}
1`:null,!b&&"至少需選擇 1 項證照",!b&&e.certifications.length>0&&(0,s.jsxs)("span",{className:"ml-2",children:["(已選 ",e.certifications.length," 項)"]})]})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsxs)(i.J,{htmlFor:"fee",className:"text-left text-base",children:["諮詢費用 ",(0,s.jsx)("span",{className:"text-destructive",children:"*"})]}),(0,s.jsx)(n.p,{id:"fee",type:"number",min:"1",max:"100000",step:"100",value:0===e.fee?"":e.fee,onChange:e=>{let a=e.target.value;t({fee:""===a?0:Number(a)})},className:"md:col-span-3 text-base",placeholder:"請輸入諮詢費用"})]})]})]})]})}var U=a(57966),F=a(92788),$=a(26345),B=a(13144),W=a(95513),R=a(2416);let _=Array.from({length:48},(e,t)=>{let a=Math.floor(t/2);return`${String(a).padStart(2,"0")}:${String(t%2*30).padStart(2,"0")}`}),P=["日","一","二","三","四","五","六"];function z({weeklySchedule:e={},specificDates:t={},bookedSlots:a={},conflicts:l=[],selectedWeekStart:i,onTimeSlotToggle:n,onTimeRangeSelect:c}){(0,r.useEffect)(()=>{},[a]);let[o,d]=(0,r.useState)(null),[u,m]=(0,r.useState)(null),h=(0,r.useMemo)(()=>{let e=i.getUTCFullYear(),t=i.getUTCMonth(),a=i.getUTCDate();return Array.from({length:7},(s,r)=>new Date(Date.UTC(e,t,a+r,0,0,0,0)))},[i]),p=(0,r.useCallback)(e=>{let t=e.getUTCFullYear(),a=String(e.getUTCMonth()+1).padStart(2,"0"),s=String(e.getUTCDate()).padStart(2,"0");return`${t}-${a}-${s}`},[]),x=(0,r.useCallback)((e,t)=>{let a=new Date,s=e.getUTCFullYear(),r=e.getUTCMonth(),l=e.getUTCDate(),[i,n]=t.split(":").map(Number),c=new Date(s,r,l,i,n,0,0);return c<a},[]),g=(0,r.useCallback)((s,r)=>{let i=p(s),n=s.getUTCDay(),c=x(s,r),o=t[i]?.includes(r),d=e[n]?.includes(r),u=a[i.includes("T")?i.split("T")[0]:i],m=!!u&&u.has(r);!m&&u&&u.has(r);let h=l.some(e=>e.date===i&&e.time===r),g=Object.keys(a).length>0;return Object.keys(a).filter(e=>e===i),g,{isSpecificDate:o,isWeekly:d,isBooked:m,hasConflict:h,isPast:c,isAvailable:o||d}},[t,e,a,l,p,x]),f=(0,r.useCallback)((e,t)=>{let a=p(e),s=g(e,t);s.isBooked||s.hasConflict||(s.isSpecificDate?n(a,t,!1,"remove"):s.isWeekly?n(a,t,!1,"to-specific"):n(a,t,!0,"add-weekly"))},[g,n,p]),b=(0,r.useCallback)((e,t,a)=>{if(o)return;let s=p(e),r=g(e,t);r.isBooked||r.hasConflict||(a.preventDefault(),m({startDate:s,startTime:t,endDate:null,endTime:null}),d(null))},[o,g,p]),v=(0,r.useCallback)((e,t)=>{if(!u)return;let a=p(e),s=g(e,t);s.isBooked||s.hasConflict||m(e=>e?{...e,endDate:a,endTime:t}:null)},[u,g,p]),j=(0,r.useCallback)(()=>{if(!u||!u.endDate||!u.endTime)return void m(null);let e=h.findIndex(e=>p(e)===u.startDate),t=h.findIndex(e=>p(e)===u.endDate);if(-1===e||-1===t)return void m(null);let a=Math.min(e,t),s=Math.max(e,t),r=_.indexOf(u.startTime),l=_.indexOf(u.endTime);if(-1===r||-1===l)return void m(null);let i=Math.min(r,l),c=Math.max(r,l);for(let e=a;e<=s;e++){let t=h[e],a=p(t);for(let e=i;e<=c;e++){let s=_[e],r=g(t,s);r.isBooked||r.hasConflict||r.isPast||(r.isWeekly||r.isSpecificDate?r.isWeekly&&!r.isSpecificDate?n(a,s,!1,"to-specific"):r.isSpecificDate&&n(a,s,!1,"remove"):n(a,s,!0,"add-weekly"))}}m(null)},[u,h,g,p,n]),y=(0,r.useRef)(null),N=(0,r.useCallback)((e,t,a)=>{let s=g(e,t);s.isPast||s.isBooked||s.hasConflict||(y.current={date:p(e),time:t,x:a.clientX,y:a.clientY,moved:!1})},[g,p]),k=(0,r.useCallback)((e,t,a)=>{if(!y.current){u&&j();return}let s=Math.abs(a.clientX-y.current.x),r=Math.abs(a.clientY-y.current.y);if(s<5&&r<5&&!y.current.moved){let e=h.find(e=>p(e)===y.current.date);if(e){let t=g(e,y.current.time);t.isPast||t.isBooked||t.hasConflict||(m(null),d(null),a.preventDefault(),a.stopPropagation(),f(e,y.current.time))}y.current=null;return}if(u){j(),y.current=null;return}o&&o.endTime&&c&&c(o.date,o.startTime,o.endTime,o.isWeekly),d(null),y.current=null},[o,u,h,p,g,f,c,j]),w=(0,r.useCallback)((e,t,a)=>{if(y.current&&!y.current.moved){let e=Math.abs(a.clientX-y.current.x),t=Math.abs(a.clientY-y.current.y);if(e>=5||t>=5){y.current.moved=!0;let e=h.find(e=>p(e)===y.current.date);e&&b(e,y.current.time,a)}}u?v(e,t):o&&p(e)===o.date&&d(e=>e?{...e,endTime:t}:null)},[o,u,h,p,v,b]),C=(0,r.useCallback)((e,t)=>{if(!u||!u.endDate||!u.endTime)return!1;let a=p(e),s=h.findIndex(e=>p(e)===u.startDate),r=h.findIndex(e=>p(e)===u.endDate),l=h.findIndex(e=>p(e)===a);if(-1===s||-1===r||-1===l)return!1;let i=Math.min(s,r),n=Math.max(s,r);if(l<i||l>n)return!1;let c=_.indexOf(u.startTime),o=_.indexOf(u.endTime),d=_.indexOf(t);if(-1===c||-1===o||-1===d)return!1;let m=Math.min(c,o),x=Math.max(c,o);return d>=m&&d<=x},[u,h,p]);return(0,s.jsx)("div",{className:"w-full overflow-x-auto scrollbar-hide",children:(0,s.jsxs)("div",{className:"min-w-[800px]",children:[(0,s.jsxs)("div",{className:"grid gap-2 mb-2",style:{gridTemplateColumns:`auto repeat(${h.length}, 1fr)`},children:[(0,s.jsx)("div",{className:"text-sm font-medium text-center",children:"時段"}),h.map((e,t)=>{let a=e.getUTCMonth()+1,r=e.getUTCDate(),l=e.getUTCDay();return(0,s.jsxs)("div",{className:"text-sm font-medium text-center",children:[(0,s.jsx)("div",{children:P[l]}),(0,s.jsxs)("div",{className:"text-xs text-muted-foreground",children:[a,"/",r]})]},t)})]}),(0,s.jsx)("div",{className:"space-y-1",children:_.map(e=>h.some(t=>!g(t,e).isPast)&&0!==h.filter(t=>(p(t),!g(t,e).isPast)).length?(0,s.jsxs)("div",{className:"grid gap-2",style:{gridTemplateColumns:`auto repeat(${h.length}, 1fr)`},children:[(0,s.jsx)("div",{className:"text-xs text-muted-foreground text-right pr-2 flex items-center justify-end",children:e}),h.map((t,a)=>{let r=p(t),l=g(t,e);if(l.isPast)return(0,s.jsx)("div",{className:"h-10"},`${r}-${e}`);let i=o&&o.date===r&&o.endTime&&e>=(o.startTime<o.endTime?o.startTime:o.endTime)&&e<=(o.startTime<o.endTime?o.endTime:o.startTime),n=C(t,e);return"2025-12-07"===r,(0,s.jsx)("button",{type:"button",className:(0,E.cn)("h-10 rounded-md border-2 transition-all duration-200 relative group",l.isBooked&&"bg-red-50 dark:bg-red-950/30 border-red-400 dark:border-red-700 cursor-not-allowed opacity-60",!l.isBooked&&l.hasConflict&&"bg-yellow-50 dark:bg-yellow-950/30 border-yellow-400 dark:border-yellow-700",!l.isBooked&&!l.hasConflict&&l.isSpecificDate&&["bg-blue-50 dark:bg-blue-950/30 border-blue-400 dark:border-blue-700","hover:bg-blue-100 dar
1k:hover:bg-blue-900/40 hover:border-blue-500 dark:hover:border-blue-600","hover:shadow-sm hover:scale-[1.02]"],!l.isBooked&&!l.hasConflict&&l.isWeekly&&!l.isSpecificDate&&["bg-green-50 dark:bg-green-950/30 border-green-400 dark:border-green-700","hover:bg-green-100 dark:hover:bg-green-900/40 hover:border-green-500 dark:hover:border-green-600","hover:shadow-sm hover:scale-[1.02]"],!l.isBooked&&!l.hasConflict&&!l.isAvailable&&["bg-gray-50 dark:bg-gray-900/20 border-gray-300 dark:border-gray-700","hover:bg-accent hover:border-primary/50","hover:shadow-sm"],i&&"ring-2 ring-primary ring-offset-2 shadow-md",n&&"ring-2 ring-blue-500 dark:ring-blue-400 ring-offset-2 bg-blue-100 dark:bg-blue-900/50 shadow-md"),onMouseDown:a=>{a.preventDefault(),a.stopPropagation(),N(t,e,a)},onMouseUp:a=>{a.preventDefault(),a.stopPropagation(),k(t,e,a)},onMouseMove:a=>w(t,e,a),disabled:l.isBooked||l.hasConflict,title:l.isBooked?"已預約(無法修改)":l.hasConflict?"衝突:已有預約":l.isSpecificDate?"特定日期可預約(點擊切換)":l.isWeekly?"每週重複可預約(點擊切換)":"不可預約(點擊設為可預約)",children:l.hasConflict&&(0,s.jsx)(R.A,{className:"h-3 w-3 text-yellow-600 dark:text-yellow-400 absolute top-0 right-0"})},`${r}-${e}`)})]},e):null)})]})})}function K({weeklySchedule:e,specificDates:t,bookedSlots:a,onWeeklyScheduleChange:n,onSpecificDatesChange:c,onTimeSlotToggle:o,onTimeRangeSelect:d}){let[u,m]=(0,r.useState)(!1),[h,p]=(0,r.useState)(()=>{let e=new Date,t=e.getUTCDay(),a=e.getUTCDate()-t+(0===t?-6:1);return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),a,0,0,0,0))}),x=(0,r.useCallback)((t,a,s)=>{let r=[],[l,i]=a.split(":").map(Number),[c,o]=s.split(":").map(Number),d=60*l+i,u=60*c+o;for(let e=d;e<=u;e+=30){let t=Math.floor(e/60),a=e%60;r.push(`${String(t).padStart(2,"0")}:${String(a).padStart(2,"0")}`)}let m={...e};("weekday"===t?[1,2,3,4,5]:"weekend"===t?[0,6]:[0,1,2,3,4,5,6]).forEach(e=>{m[e]=r}),n(m)},[e,n]),g=(0,r.useCallback)(()=>{n({}),c({})},[n,c]),f=(0,r.useCallback)(e=>{p(t=>{let a=new Date(t);return a.setUTCDate(t.getUTCDate()+e),a})},[]),b=(0,r.useCallback)(e=>{let t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/864e5+t.getUTCDay()+1)/7)},[]),v=(0,r.useCallback)(()=>{let e=new Date(h);e.setUTCDate(h.getUTCDate()+6);let t=h.getUTCMonth()+1,a=h.getUTCDate(),s=e.getUTCMonth()+1,r=e.getUTCDate(),l=b(h);return`第 ${l} 週 (${t}/${a} - ${s}/${r})`},[h,b]),j=(0,r.useMemo)(()=>{let e=new Date,t=e.getUTCDay(),a=e.getUTCDate()-t+(0===t?-6:1),s=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),a,0,0,0,0));return h.getTime()>=s.getTime()},[h]);return(0,s.jsxs)("div",{className:"grid grid-cols-4 items-start gap-4 text-base",children:[(0,s.jsx)(i.J,{className:"text-left pt-2 text-base",children:"可用時間表"}),(0,s.jsxs)("div",{className:"col-span-3",children:[(0,s.jsxs)(U.Nt,{open:u,onOpenChange:m,children:[(0,s.jsx)(U.R6,{asChild:!0,children:(0,s.jsx)(l.$,{variant:"outline",size:"icon",children:u?(0,s.jsx)(F.A,{className:"h-4 w-4"}):(0,s.jsx)($.A,{className:"h-4 w-4"})})}),(0,s.jsxs)(U.Ke,{className:"mt-4",children:[(0,s.jsx)("div",{className:"mb-4 p-4 bg-muted/50 rounded-lg",children:(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("div",{className:"flex items-center gap-2 text-base font-medium",children:"操作說明"}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-3 text-sm",children:[(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("div",{className:"w-4 h-4 rounded border-2 border-green-400 bg-green-50 dark:bg-green-900/20"}),(0,s.jsx)("span",{children:"每週重複"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("div",{className:"w-4 h-4 rounded border-2 border-blue-400 bg-blue-50 dark:bg-blue-900/20"}),(0,s.jsx)("span",{children:"特定日期"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("div",{className:"w-4 h-4 rounded border-2 border-red-400 bg-red-50 dark:bg-red-900/20"}),(0,s.jsx)("span",{children:"已預約"})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,s.jsx)("div",{className:"w-4 h-4 rounded border-2 border-gray-300 bg-gray-50 dark:bg-gray-700"}),(0,s.jsx)("span",{children:"不可預約"})]})]}),(0,s.jsxs)("div",{className:"space-y-1 text-sm text-muted-foreground",children:[(0,s.jsx)("p",{children:"• 點擊時段:切換該時段的可用性"}),(0,s.jsx)("p",{children:"• 拖曳框選:點擊並拖曳可快速選擇多個時段(可跨日期和時間)"}),(0,s.jsx)("p",{children:"• 每週重複:在每週該星期的這個時段都可預約"}),(0,s.jsx)("p",{children:"• 特定日期:僅在選定的日期該時段可預約"})]})]})}),(0,s.jsxs)("div",{className:"mb-4 flex flex-wrap gap-2",children:[(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>x("weekday","09:00","17:00"),children:"工作日 9-17點"}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>x("weekday","09:00","21:00"),children:"工作日 9-21點"}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>x("all","09:00","21:00"),children:"每天 9-21點"}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>x("weekend","10:00","18:00"),children:"僅週末 10-18點"}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"sm",onClick:g,children:"清除全部"})]}),(0,s.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"icon",onClick:()=>f(-7),disabled:!j,children:(0,s.jsx)(B.A,{className:"h-4 w-4"})}),(0,s.jsx)("div",{className:"text-sm font-medium",children:v()}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"icon",onClick:()=>f(7),children:(0,s.jsx)(W.A,{className:"h-4 w-4"})})]}),(0,s.jsx)(z,{weeklySchedule:e,specificDates:t,bookedSlots:a,conflicts:[],selectedWeekStart:h,onTimeSlotToggle:o,onTimeRangeSelect:d})]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground mt-2",children:"點擊圖示展開/收合時間表設定。點擊時段循環切換:不可預約 → 每週重複 → 特定日期 → 不可預約"})]})]})}var L=a(21582),J=a(51475),V=a(54296),X=a(42119);let G=[{value:"facebook",label:"Facebook"},{value:"instagram",label:"Instagram"},{value:"threads",label:"Threads"},{value:"linkedin",label:"LinkedIn"},{value:"twitter",label:"Twitter/X"},{value:"youtube",label:"YouTube"},{value:"line",label:"LINE"}];function Z({socialMedia:e,onSocialMediaChange:t}){let a=(a,s,r)=>{let l=[...e];l[a]={...l[a],[s]:r},t(l)};return(0,s.jsxs)("div",{className:"grid grid-cols-4 items-start gap-4 text-base",children:[(0,s.jsxs)(i.J,{className:"text-left pt-2 flex items-center gap-1 text-base",children:[(0,s.jsx)(J.A,{className:"h-4 w-4"}),"社群媒體"]}),(0,s.jsxs)("div",{className:"col-span-3 space-y-2",children:[e.map((r,i)=>(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsxs)(L.l6,{value:r.platform,onValueChange:e=>a(i,"platform",e),children:[(0,s.jsx)(L.bq,{className:"w-[140px] text-base",children:(0,s.jsx)(L.yv,{placeholder:"選擇平台"})}),(0,s.jsx)(L.gC,{children:G.map(e=>(0,s.jsx)(L.eb,{value:e.value,className:"text-base",children:e.label},e.value))})]}),(0,s.jsx)(n.p,{type:"url",value:r.url,onChange:e=>a(i,"url",e.target.value),placeholder:"https://...",className:"flex-1 text-base"}),(0,s.jsx)(l.$,{type:"button",variant:"outline",size:"icon",onClick:()=>{t(e.filter((e,t)=>
1t!==i))},children:(0,s.jsx)(V.A,{className:"h-4 w-4"})})]},i)),(0,s.jsxs)(l.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{t([...e,{platform:"",url:""}])},className:"w-full text-base",children:[(0,s.jsx)(X.A,{className:"h-4 w-4 mr-2"}),"新增社群媒體"]})]})]})}var q=a(48113),Q=a(74265);let H=(0,r.forwardRef)(function({initialData:e,userId:t,onSave:m,onCancel:h,isSaving:p=!1,showCancelButton:x=!1,avatarInputId:g="advisor-avatar",hideSaveButton:f=!1,showDeleteButton:b=!1,onDelete:w,isDeleting:C=!1,deleteButtonText:S="刪除顧問",requireDeleteConfirmation:T=!0,certificationsLockedUntil:D},A){let{toast:I}=(0,c.dj)(),{user:E}=(0,d.A)(),M=(0,r.useCallback)(()=>E?E.getIdToken():Promise.reject(Error("未登入")),[E]),[O,U]=(0,r.useState)({name:e?.name||"",company:e?.company||"",officeAddress:e?.officeAddress||"",specialties:e?.specialties||[],serviceAreas:e?.serviceAreas||[],certifications:e?.certifications||[],fee:e?.fee||0,yearsOfExperience:e?.yearsOfExperience||0,website:e?.website||""}),[F,$]=(0,r.useState)(e?.socialMedia||[]),[B,W]=(0,r.useState)(!1),[R,_]=(0,r.useState)(e?.weeklySchedule||{}),[P,z]=(0,r.useState)(e?.specificDates||{}),[L,J]=(0,r.useState)("number"==typeof e?.advanceBookingDays?e.advanceBookingDays:Q.X.ADVANCE_BOOKING_DAYS),[V,X]=(0,r.useState)("number"==typeof e?.bookingWindowDays?e.bookingWindowDays:Q.X.BOOKING_WINDOW_DAYS),{bookedSlots:G,isLoadingBookedSlots:H,setWeeklySchedule:ee,setSpecificDates:et}=function({advisorId:e,scheduleExpanded:t=!1}){let[a,s]=(0,r.useState)({}),[l,i]=(0,r.useState)({}),[n,c]=(0,r.useState)({}),[d,u]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(!t||!e||!N.db){c({}),u(!1);return}let a=null,s=!1,r=(0,k.ri)(),l=(0,y.P)((0,y.rJ)(N.db,N.BOOKINGS),(0,y._M)("advisorId","==",e),(0,y._M)("date",">=",r));return u(!0),a=(0,y.aQ)(l,t=>{if(s||e!=e)return;let a=new Set(["draft","pending","authorized","paid"]),r={};t.forEach(e=>{let t=e.data(),s=String(t.status||"").toLowerCase();if(!a.has(s))return;let l=t.date,i=t.time;if(!l||!i)return;let n=l.includes("T")?l.split("T")[0]:l;r[n]||(r[n]=new Set),r[n].add(i)}),s||e!=e||(c(r),u(!1))},t=>{if(s||e!=e||u(!1),(0,o.vV)("監聽預約變化失敗:",t),a)try{a()}catch(e){(0,o.vV)("清理錯誤監聽器失敗:",e)}}),()=>{if(s=!0,a)try{a()}catch(e){(0,o.vV)("清理預約監聽器失敗:",e)}}},[e,t]),{weeklySchedule:a,specificDates:l,bookedSlots:n,isLoadingBookedSlots:d,setWeeklySchedule:s,setSpecificDates:i}}({advisorId:e?.id,scheduleExpanded:B});(0,r.useEffect)(()=>{ee(R)},[R,ee]),(0,r.useEffect)(()=>{et(P)},[P,et]);let[ea,es]=(0,r.useState)(null),[er,el]=(0,r.useState)(e?.avatar||""),[ei,en]=(0,r.useState)(!1),[ec,eo]=(0,r.useState)(!1),[ed,eu]=(0,r.useState)(!1),em=(0,r.useCallback)(async()=>{if(w)try{eu(!0),await w(),eo(!1)}catch(e){}finally{eu(!1)}},[w]),eh=(0,r.useCallback)(()=>{T?eo(!0):em()},[T,em]),[ep,ex]=(0,r.useState)(!1),[eg,ef]=(0,r.useState)(""),[eb,ev]=(0,r.useState)(!1),ej=(0,r.useRef)(void 0),ey=p||eb;(0,r.useEffect)(()=>{if(e){let t=e.name||"";(void 0===ej.current||ej.current!==t)&&(U({name:e.name||"",company:e?.company||"",officeAddress:e?.officeAddress||"",specialties:e.specialties||[],serviceAreas:e.serviceAreas||[],certifications:e?.certifications||[],fee:e.fee||0,yearsOfExperience:e.yearsOfExperience||0,website:e.website||""}),$(e.socialMedia||[]),el(e.avatar||""),_(e.weeklySchedule||{}),z(e.specificDates||{}),J("number"==typeof e?.advanceBookingDays?e.advanceBookingDays:Q.X.ADVANCE_BOOKING_DAYS),X("number"==typeof e?.bookingWindowDays?e.bookingWindowDays:Q.X.BOOKING_WINDOW_DAYS),ej.current=t)}else ej.current=void 0},[e]);let eN=(0,r.useCallback)(e=>{if(e.target.files&&e.target.files[0]){let t=e.target.files[0];es(t),en(!1);let a=new FileReader;a.onloadend=()=>{ef(a.result),ex(!0)},a.readAsDataURL(t)}},[]),ek=(0,r.useCallback)(e=>{el(e),en(!1),fetch(e).then(e=>e.blob()).then(e=>{es(new File([e],"avatar.jpg",{type:"image/jpeg"}))}).catch(e=>{(0,o.vV)("轉換圖片失敗:",e)})},[]),ew=(0,r.useCallback)(e=>{U(t=>t.specialties.includes(e)?{...t,specialties:t.specialties.filter(t=>t!==e)}:t.specialties.length>
1=3?(I({variant:"destructive",title:"專長選擇限制",description:"最多只能選擇3項專長"}),t):{...t,specialties:[...t.specialties,e]})},[I]),eC=(0,r.useCallback)(e=>{U(t=>t.serviceAreas.includes(e)?{...t,serviceAreas:t.serviceAreas.filter(t=>t!==e)}:t.serviceAreas.length>=3?(I({variant:"destructive",title:"地區選擇限制",description:"最多只能選擇3項地區"}),t):{...t,serviceAreas:[...t.serviceAreas,e]})},[I]),eS=(0,r.useCallback)(e=>{U(t=>{let a=t.certifications||[],s=a.includes(e)?a.filter(t=>t!==e):[...a,e];return{...t,certifications:s}})},[]);(0,r.useCallback)(()=>{$(e=>[...e,{platform:"",url:""}])},[]),(0,r.useCallback)((e,t,a)=>{$(s=>{let r=[...s];return r[e]={...r[e],[t]:a},r})},[]),(0,r.useCallback)(e=>{$(t=>t.filter((t,a)=>a!==e))},[]);let eT=(0,r.useCallback)((e,t,a,s)=>{let[r,l,i]=e.split("-").map(Number),n=new Date(Date.UTC(r,l-1,i,0,0,0,0)).getUTCDay();"add-weekly"===s?_(e=>{let a=e[n]||[];return{...e,[n]:[...a,t].sort()}}):"to-specific"===s?(_(e=>{let a=(e[n]||[]).filter(e=>e!==t),s={...e};return a.length>0?s[n]=a:delete s[n],s}),z(a=>{let s=a[e]||[];return{...a,[e]:[...s,t].sort()}})):"remove"===s&&(z(a=>{let s=(a[e]||[]).filter(e=>e!==t),r={...a};return s.length>0?r[e]=s:delete r[e],r}),_(e=>{let a=e[n]||[];if(a.includes(t)){let s=a.filter(e=>e!==t),r={...e};return s.length>0?r[n]=s:delete r[n],r}return e}))},[]),eD=(0,r.useCallback)((e,t,a,s)=>{let r=e=>
1{let[t,a]=e.split(":").map(Number);return 60*t+a},l=r(t),i=r(a),n=Math.min(l,i),c=Math.max(l,i),o=[];for(let e=n;e<=c;e+=30){let t=Math.floor(e/60),a=e%60;o.push(`${String(t).padStart(2,"0")}:${String(a).padStart(2,"0")}`)}if(s){let t=new Date(e+"T00:00:00").getDay();_(e=>{let a=[...new Set([...e[t]||[],...o])].sort();return{...e,[t]:a}})}else z(t=>{let a=[...new Set([...t[e]||[],...o])].sort();return{...t,[e]:a}})},[]),eA=(0,r.useCallback)(async()=>{if(!O.name||0===O.specialties.length||0===O.serviceAreas.length||0===O.certifications.length)return void I({variant:"destructive",title:"請填寫必要資訊",description:"姓名、專長、服務地區和證照為必填欄位"});if(!O.fee||O.fee<=0)return void I({variant:"destructive",title:"請填寫諮詢費用",description:"諮詢費用必須大於 0"});if(e?.id)try{let t=await fetch(`/api/advisor/tier?advisorId=${e.id}`);if(t.ok){let e=await t.json();if(e.tier){let{getTierConfig:t}=await a.e(1641).then(a.bind(a,14022)),s=t(e.tier);null!==s.maxFee&&O.fee>s.maxFee&&(O.fee=s.maxFee,I({title:"價格已自動調整",description:`價格超過等級上限,已自動調整為 NT$ ${s.maxFee.toLocaleString()}`}))}}}catch(e){console.error("驗證價格上限失敗:",e)}if(O.name.includes("@"))return void I({variant:"destructive",title:"姓名格式錯誤",description:"請輸入您的真實姓名,而不是電子郵件地址"});try{ev(!0);let a=er;if(ei&&e?.avatar){try{let a=t||e?.userId;a&&await (0,u.Dm)(e.avatar,a,M)}catch(e){(0,o.vV)("刪除頭像失敗(不影響保存):",e)}a=""}else if(ea)try{let s=t||e?.userId;if(!s)throw Error("缺少 userId,無法上傳頭像");a=(await (0,u.Jp)({file:ea,userId:s,oldAvatarUrl:e?.avatar,getToken:M})).downloadURL}catch(e){(0,o.vV)("頭像上傳失敗:",e),I({variant:"destructive",title:"頭像上傳失敗",description:e instanceof Error?e.message:"無法上傳頭像,請稍後再試。"}),ev(!1);return}let s=Math.max(0,Math.floor(Number(L))||0),r=Math.max(Q.X.MIN_BOOKING_WINDOW_DAYS,Math.floor(Number(V))||Q.X.BOOKING_WINDOW_DAYS),l={name:O.name,company:O.company||"",officeAddress:O.officeAddress||"",specialties:O.specialties,serviceAreas:O.serviceAreas,certifications:O.certifications,fee:O.fee,yearsOfExperience:O.yearsOfExperience||0,weeklySchedule:Object.keys(R).length>0?R:{},specificDates:Object.keys(P).length>0?P:{},avatar:a,website:O.website||"",socialMedia:F.filter(e=>e.platform&&e.url),advanceBookingDays:s,bookingWindowDays:r};await m(l)}catch(e){throw(0,o.vV)("儲存顧問資料時發生錯誤:",e),e}finally{ev(!1)}},[O,R,P,F,ea,er,ei,e,t,m,I,M,L,V]);return(0,r.useImperativeHandle)(A,()=>({save:eA}),[eA]),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:"space-y-6 py-4",children:[(0,s.jsx)(Y,{formData:O,onFormDataChange:e=>U(t=>({...t,...e})),avatarPreview:er,avatarInputId:g,onAvatarChange:eN,onAvatarClear:()=>{es(null),el(""),en(!0);let e=document.getElementById(g);e&&(e.value="")},onAvatarEdit:()=>{ef(er),ex(!0)},avatarFile:ea,onSpecialtyChange:ew,onAreaChange:eC,onCertificationChange:eS,certificationsLockedUntil:D}),(0,s.jsxs)(j.Zp,{children:[(0,s.jsxs)(j.aR,{children:[(0,s.jsx)(j.ZB,{className:"text-lg",children:"預約規則"}),(0,s.jsx)(j.BT,{className:"text-sm",children:"設定用戶可預約的日期範圍"})]}),(0,s.jsxs)(j.Wu,{className:"space-y-4",children:[(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsx)(i.J,{htmlFor:"advanceBookingDays",className:"text-base",children:"提前預約天數"}),(0,s.jsxs)("div",{className:"md:col-span-3 space-y-2",children:[(0,s.jsx)(n.p,{id:"advanceBookingDays",type:"number",min:Q.X.MIN_ADVANCE_BOOKING_DAYS,value:L,onChange:e=>{J(Math.max(0,Math.floor(Number(e.target.value))||0))},className:"text-base max-w-[8rem]"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"用戶必須提前多少天預約(例如:7 表示最早只能預約 7 天後的時段)"})]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-4 items-center gap-4",children:[(0,s.jsx)(i.J,{htmlFor:"bookingWindowDays",className:"text-base",children:"開放預約時間範圍(天)"}),(0,s.jsxs)("div",{className:"md:col-span-3 space-y-2",children:[(0,s.jsx)(n.p,{id:"bookingWindowDays",type:"number",min:Q.X.MIN_BOOKING_WINDOW_DAYS,value:V,onChange:e=>{X(Math.max(Q.X.MIN_BOOKING_WINDOW_DAYS,Math.floor(Number(e.target.value))||Q.X.MIN_BOOKING_WINDOW_DAYS))},className:"text-base max-w-[8rem]"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"開放預約的時間範圍(例如:90 表示用戶最遠只能預約 90 天後的時段)"})]})]})]})]}),(0,s.jsx)(K,{weeklySchedule:R,specificDates:P,bookedSlots:G,onWeeklyScheduleChange:_,onSpecificDatesChange:z,onTimeSlotToggle:eT,onTimeRangeSelect:eD}),(0,s.jsx)(Z,{socialMedia:F,onSocialMediaChange:$})]}),!f&&(0,s.jsxs)("div",{className:"flex justify-between items-center pt-4",children:[b&&w&&(0,s.jsx)(l.$,{variant:"destructive",onClick:eh,disabled:C||ed||ey,className:"bg-red-500 hover:bg-red-600 text-white",children:C||ed?"刪除中...":S}),(0,s.jsxs)("div",{className:"flex gap-2 ml-auto",children:[x&&h&&(0,s.jsx)(l.$,{variant:"outline",onClick:h,children:"取消"}),(0,s.jsx)(l.$,{onClick:eA,disabled:ey||C||ed,children:ey?"儲存中...":"儲存"})]})]}),eg&&(0,s.jsx)(v,{imageSrc:eg,open:ep,onOpenChange:ex,onSave:ek,aspect:1,cropShape:"round"}),(0,s.jsx)(q.Lt,{open:ec,onOpenChange:eo,children:(0,s.jsxs)(q.EO,{children:[(0,s.jsxs)(q.wd,{children:[(0,s.jsx)(q.r7,{children:"確認刪除顧問"}),(0,s.jsx)(q.$v,{children:"此操作無法復原,確定要刪除這位顧問嗎?所有相關資料(包括預約記錄)都將被刪除。"})]}),(0,s.jsxs)(q.ck,{children:[(0,s.jsx)(q.Zr,{children:"取消"}),(0,s.jsx)(q.Rx,{onClick:em,className:"bg-red-500 hover:bg-red-600",disabled:C||ed,children:C||ed?"刪除中...":"刪除"})]})]})})]})})}}]);

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.