PageSourceSearch

https://xynergy.ai/_next/static/chunks/6323-0081e55835371947.js

js xynergy.ai collected 2026-10-05 16:00:53 UTC 20,732 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6323],{775:(e,t,a)=>{a.d(t,{n:()=>h});var r=a(24571),i=a(76458),n=a(15418);let o=e=>{if("string"!=typeof e)return"";let t=e.trim();if(!t)return"";let a=/^https?:\/\//i.test(t)?t:/^\/\//.test(t)?`https:${t}`:`https://${t}`;try{let e=new URL(a);if("http:"!==e.protocol&&"https:"!==e.protocol)return"";return e.toString()}catch{return""}},s=n.Ik({platform:n.Yj().min(1),url:n.Yj().url("必須是有效的 URL")}),l=n.Ik({name:n.Yj().min(1),rating:n.ai().min(0).max(5),comment:n.Yj()}),c=n.Ik({totalConsultations:n.ai().int().nonnegative().default(0),uniqueClients:n.ai().int().nonnegative().default(0),averageRating:n.ai().min(0).max(5).default(0),totalReviews:n.ai().int().nonnegative().default(0)}),u=n.Ik({userId:n.Yj().optional(),name:n.Yj().min(1,"顧問名稱不能為空"),avatar:n.Yj().url("頭像必須是有效的 URL").or(n.eu("")).optional().default(""),email:n.Yj().email("Email 格式無效").optional().or(n.eu("")).nullable(),company:n.Yj().optional(),officeAddress:n.Yj().max(200,"辦公室地址最多 200 字").optional().default(""),specialties:n.YO(n.Yj()).optional().default([]),serviceAreas:n.YO(n.Yj()).optional().default([]),rating:n.ai().min(0).max(5).optional().default(0),reviews:n.ai().int().nonnegative().optional().default(0),yearsOfExperience:n.ai().int().min(0).max(30).optional().default(0),experience:n.Yj().optional().default(""),fee:n.ai().nonnegative().optional().default(0),description:n.Yj().optional().default(""),website:n.KC([n.Yj(),n.ch(),n.Vx()]).transform(e=>o(e)).optional(),socialMedia:n.YO(s).optional().nullable(),weeklySchedule:n.g1(n.Yj(),n.YO(n.Yj())).optional(),specificDates:n.g1(n.Yj(),n.YO(n.Yj())).optional(),scheduleUpdatedAt:n.bz().optional(),advanceBookingDays:n.ai().int().min(0).default(7).optional(),bookingWindowDays:n.ai().int().min(7).default(90).optional(),customerReviews:n.YO(l).optional(),isActive:n.zM().default(!0),availability:n.Yj().optional(),tier:n.k5(["rookie","normal","elite","epic","legendary","special","gm"]).optional(),tierUpdatedAt:n.bz().optional(),tierStats:c.optional(),isGrandfatheredPrice:n.zM().optional(),certifications:n.YO(n.Yj()).default([]),certificationsUpdatedAt:n.Yj().datetime().optional(),createdAt:n.bz().optional(),updatedAt:n.bz().optional()}),d=n.Ik({userId:n.Yj().optional(),name:n.Yj().min(1,"顧問名稱不能為空").optional(),avatar:n.Yj().url("頭像必須是有效的 URL").or(n.eu("")).optional(),email:n.Yj().email("Email 格式無效").optional().or(n.eu("")).nullable(),company:n.Yj().optional(),officeAddress:n.Yj().max(200,"辦公室地址最多 200 字").optional(),specialties:n.YO(n.Yj()).optional(),serviceAreas:n.YO(n.Yj()).optional(),rating:n.ai().min(0).max(5).optional(),reviews:n.ai().int().nonnegative().optional(),yearsOfExperience:n.ai().int().min(0).max(30).optional(),experience:n.Yj().optional(),fee:n.ai().nonnegative().optional(),description:n.Yj().optional(),website:n.KC([n.Yj(),n.ch()]).optional().transform(e=>{if(void 0!==e)return null===e?"":o(e)}),socialMedia:n.YO(s).optional().nullable(),weeklySchedule:n.g1(n.Yj(),n.YO(n.Yj())).optional(),specificDates:n.g1(n.Yj(),n.YO(n.Yj())).optional(),scheduleUpdatedAt:n.bz().optional(),advanceBookingDays:n.ai().int().min(0).optional(),bookingWindowDays:n.ai().int().min(7).optional(),customerReviews:n.YO(l).optional(),isActive:n.zM().optional(),availability:n.Yj().optional(),tier:n.k5(["rookie","normal","elite","epic","legendary","special","gm"]).optional(),tierUpdatedAt:n.bz().optional(),tierStats:c.optional(),isGrandfatheredPrice:n.zM().optional(),certifications:n.YO(n.Yj()).optional(),certificationsUpdatedAt:n.Yj().datetime().optional(),createdAt:n.bz().optional(),updatedAt:n.bz().optional()});var f=a(18654),p=a(20814);let m=()=>{if(!i.db)throw Error("Firestore 尚未初始化");return i.db},g=(e,t)=>{let a=u.safeParse(t);return a.success?{id:e,...a.data}:((0,f.vV)("解析顧問資料失敗:",a.error),null)},h={async addAdvisor(e){let t=m(),a=u.parse(e);if(!a.certifications?.length)throw Error("至少需要一個證照");return(await (0,r.gS)((0,r.rJ)(t,i.ADVISORS),a)).id}
1,async updateAdvisor(e,t,a){let n=m();if(!e)throw Error("缺少顧問 ID");let o=Object.fromEntries(Object.entries(d.parse(t)).filter(([,e])=>void 0!==e));if(0!==Object.keys(o).length){if(a?.fromSelf===!0&&Array.isArray(t.certifications)){let t=(0,r.doc)(n,i.ADVISORS,e),a=await (0,r.getDoc)(t);if(!a.exists())throw Error("顧問資料不存在");let s=a.data(),l=s?.certificationsUpdatedAt,c="function"==typeof l?.toDate?l.toDate().toISOString():"string"==typeof l?l:void 0;if((0,p.iQ)(c)){let e=(0,p.AD)(c),t=e?e.toLocaleDateString("zh-TW",{year:"numeric",month:"2-digit",day:"2-digit"}):"";throw Error(`證照於一週內僅可更新一次,請於 ${t} 後再編輯`)}o.certificationsUpdatedAt=new Date().toISOString()}await (0,r.mZ)((0,r.doc)(n,i.ADVISORS,e),o)}},async deleteAdvisor(e){let t=m();if(!e)throw Error("缺少顧問 ID");await (0,r.kd)((0,r.doc)(t,i.ADVISORS,e))},async getAllAdvisors(e=!1){let t=m(),a=(0,r.P)((0,r.rJ)(t,i.ADVISORS)),n=(await (0,r.GG)(a)).docs.map(e=>g(e.id,e.data())).filter(e=>!!e);return e?n:n.filter(e=>e?.isActive!==!1)},async getAdvisorsBySpecialty(e,t=!1){let a=m();if(!e)return[];let n=(0,r.P)((0,r.rJ)(a,i.ADVISORS),(0,r._M)("specialties","array-contains",e)),o=(await (0,r.GG)(n)).docs.map(e=>g(e.id,e.data())).filter(e=>!!e);return t?o:o.filter(e=>e?.isActive!==!1)}}},866:(e,t,a)=>{a.d(t,{p:()=>o});var r=a(85047),i=a(31615),n=a(34961);let o=i.forwardRef(({className:e,type:t,...a},i)=>(0,r.jsx)("input",{type:t,className:(0,n.cn)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm font-normal shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:i,...a}));o.displayName="Input"},18977:(e,t,a)=>{function r(e){if(!e)return"";for(let t of[e.name,e.profile?.name,e.displayName])if("string"==typeof t&&t.trim())return t.trim().slice(0,80);return""}function i(e){let t="string"==typeof e?.photoURL?e.photoURL.trim():"";return!t||t.includes("googleusercontent.com")||t.includes("graph.facebook.com")?null:t}function n(e){return("string"==typeof e?.avatar?e.avatar.trim():"")||null}a.d(t,{$J:()=>n,Cm:()=>r,xK:()=>i})},20814:(e,t,a)=>{a.d(t,{AD:()=>i,iQ:()=>r});function r(e){if(!e)return!1;let t=new Date(e).getTime();return!Number.isNaN(t)&&Date.now()-t<6048e5}function i(e){if(!e)return;let t=new Date(e).getTime();if(Number.isNaN(t))return;let a=new Date(t+6048e5);if(!(Date.now()>=a.getTime()))return a}},25642:(e,t,a)=>{a.d(t,{y:()=>n});var r=a(15418);let i=r.Ik({brows:r.Yj().optional(),eyes:r.Yj().min(1,"眼睛不能為空"),glasses:r.Yj().optional(),lips:r.Yj().min(1,"嘴唇不能為空"),nose:r.Yj().optional(),hairStyle:r.Yj().optional(),skinColor:r.Yj().regex(/^#[0-9A-Fa-f]{6}$/,"膚色必須是有效的十六進位顏色碼").optional(),beard:r.Yj().optional(),mouth:r.Yj().optional()}).refine(e=>!!(e.eyes&&(e.lips||e.mouth)),{message:"必須提供眼睛和嘴巴配置"}),n=r.Ik({userId:r.Yj().min(1,"使用者 ID 不能為空"),avatarUrl:r.Yj().url().optional(),avatarConfig:i.optional(),createdAt:r.bz(),updatedAt:r.bz()}).passthrough()},31862:(e,t,a)=>{a.d(t,{M:()=>m,clearUserAvatarCached:()=>p});var r=a(31615),i=a(24571),n=a(76458),o=a(65834),s=a(54611),l=a(18654);let c=new Map,u="user_avatar_";function d(e){return`${u}${e}`}function f(e){let t=c.get(e);if(t)return t;let a=function(e){try{let t=sessionStorage.getItem(d(e));if(!t)return;let a=JSON.parse(t);if(!a||"object"!=typeof a)return;return a}catch{return}}(e);if(a)return c.set(e,a),a}function p(e){if(e){c.delete(e);try{sessionStorage.removeItem(d(e))}catch{}return}c.clear();try{let e=[];for(let t=0;t<sessionStorage.length;t++){let a=sessionStorage.key(t);a?.startsWith(u)&&e.push(a)}e.forEach(e=>sessionStorage.removeItem(e))}catch{}}function m(e){let t=e?f(e):void 0,[a,u]=(0,r.useState)(()=>t?.avatarUrl??null),[p,m]=(0,r.useState)(()=>t?.displayName??null),[g,h]=(0,r.useState)(()=>!!e&&!!n.db&&!t),[y,v]=(0,r.useState)(null),b=(0,r.useRef)(null),w=(0,r.useRef)(null);return(0,r.useEffect)(()=>
1{if(!e||!n.db)return void h(!1);let t=!1,a=!!f(e),r=async()=>{if(!n.db)return void h(!1);try{a||h(!0),v(null);let[r,i]=await Promise.all([(0,s.X)(e),(0,s.L)(e)]);if(t)return;let n=r??null;if(m(i),r){if(b.current&&b.current!==r){let e=b.current;e&&(0,o.hq)(e).catch(()=>{}),w.current?.startsWith("blob:")&&(URL.revokeObjectURL(w.current),w.current=null),await (0,o.hq)(r).catch(()=>{})}b.current=r;let e=await (0,o.P_)(r);e&&!t&&(w.current=e,u(e))}else w.current?.startsWith("blob:")&&(URL.revokeObjectURL(w.current),w.current=null),b.current=null,u(null);t||function(e,t){c.set(e,t);try{sessionStorage.setItem(d(e),JSON.stringify(t))}catch{}}(e,{avatarUrl:n,displayName:i})}catch(a){if(t)return;let e=a instanceof Error?a:Error("載入頭像失敗");(0,l.vV)("載入頭像失敗:",e),v(e)}finally{t||h(!1)}};r();let p=(0,i.doc)(n.db,"userAvatars",e),g=(0,i.doc)(n.db,"users",e),y=(0,i.P)((0,i.rJ)(n.db,"advisors"),(0,i._M)("userId","==",e),(0,i.AB)(1)),j=(0,i.aQ)(p,()=>{t||r()},e=>{t||((0,l.vV)("監聽頭像變化失敗:",e),v(e instanceof Error?e:Error(String(e))))}),S=(0,i.aQ)(g,()=>{t||r()},e=>{t||(0,l.vV)("監聽用戶資料失敗:",e)}),x=(0,i.aQ)(y,()=>{t||r()},e=>{t||(0,l.vV)("監聽顧問資料失敗:",e)});return()=>{t=!0,j(),S(),x(),w.current?.startsWith("blob:")&&(URL.revokeObjectURL(w.current),w.current=null)}},[e]),{avatarUrl:a,displayName:p,loading:g,error:y}}},35347:(e,t,a)=>{a.d(t,{b:()=>l});var r=a(31615),i=a(24571),n=a(73521),o=a(76458),s=a(18654);function l(){let{user:e,loading:t}=(0,n.A)(),[a,l]=(0,r.useState)(!1),[c,u]=(0,r.useState)(!0);return(0,r.useEffect)(()=>{if(!t){if(!e?.uid||!o.db){l(!1),u(!1);return}(async()=>{u(!0);try{if(!o.db){l(!1),u(!1);return}let t="";try{let a=await e.getIdTokenResult(!0);t=String(a.claims?.role||"").toLowerCase()}catch(e){(0,s.vV)("useAdvisorPermission: 讀取 claims 失敗",e)}let a=await (0,i.getDoc)((0,i.doc)(o.db,"users",e.uid)),r=String(a.data()?.role||"").toLowerCase(),n="advisor"===r||"advisor"===t||"admin"===r||"admin"===t;l(n)}catch(e){(0,s.vV)("useAdvisorPermission: 權限檢查失敗",e),l(!1)}finally{u(!1)}})()}},[t,e,e?.uid]),{isAdvisor:a,isLoading:c}}},41178:(e,t,a)=>{a.d(t,{dj:()=>p});var r=a(31615),i=a(28979),n=a(8958);let o=0,s=new Map,l=e=>{if(s.has(e))return;let t=setTimeout(()=>{s.delete(e),d({type:"REMOVE_TOAST",toastId:e})},3e3);s.set(e,t)},c=[],u={toasts:[]};function d(e){u=((e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,1)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(e=>e.id===t.toast.id?{...e,...t.toast}:e)};case"DISMISS_TOAST":{let{toastId:a}=t;return a?l(a):e.toasts.forEach(e=>{l(e.id)}),{...e,toasts:e.toasts.map(e=>e.id===a||void 0===a?{...e,open:!1}:e)}}case"REMOVE_TOAST":if(void 0===t.toastId)return{...e,toasts:[]};return{...e,toasts:e.toasts.filter(e=>e.id!==t.toastId)}}})(u,e),c.forEach(e=>{e(u)})}function f({...e}){var t;let a,r=(o=(o+1)%Number.MAX_VALUE).toString(),s=()=>d({type:"DISMISS_TOAST",toastId:r});return t=e.variant,a=function(){try{let e=localStorage.getItem(n.RZ);if(e){let t=JSON.parse(e);return{enabled:t.enabled??n.wK.enabled,categories:{alerts:t.categories?.alerts??n.wK.categories.alerts,tasks:t.categories?.tasks??n.wK.categories.tasks},volume:t.volume??n.wK.volume}}}catch(e){}return n.wK}(),"destructive"===t&&i.jY.playSound("ERROR",a).catch(()=>{}),d({type:"ADD_TOAST",toast:{...e,id:r,open:!0,onOpenChange:e=>{e||s()}}}),{id:r,dismiss:s,update:e=>d({type:"UPDATE_TOAST",toast:{...e,id:r}})}}function p(){let[e,t]=r.useState(u);return r.useEffect(()=>(c.push(t),()=>{let e=c.indexOf(t);e>-1&&c.splice(e,1)}),[e]),{...e,toast:f,dismiss:e=>d({type:"DISMISS_TOAST",toastId:e})}}},42451:(e,t,a)=>{function r(e){return`https://api.dicebear.com/9.x/notionists-neutral/${e}`}function i(e,t,a="svg"){return function(e,t=100,a="svg"){let i=new URLSearchParams;i.set("size",t.toString());let n=[e.brows||"default",e.eyes||"default",e.lips||e.mouth||"default",e.nose||"default",e.hairStyle||"default",(e.skinColor||"#FDBCB4").replace(/#/g,""),e.beard||"none"].join("-");i.set("seed",n),e.brows&&e.brows.startsWith("variant")&&i.set("brows",e.brows),e.eyes&&e.eyes.startsWith("variant")&&i.set("eyes",e.eyes);let o=e.lips||e.mouth;return o&&o.startsWith("variant")&&i.set("lips",o),e.nose&&e.nose.startsWith("variant")&&i.set("nose",e.nose),e.glasses&&e.glasses.startsWith("variant")?(i.set("glasses",e.glasses),i.set("glassesProbability","100")):i.set("glassesProbability","0"),`${r(a)}?${i.toString()}`}(e,t,a)}a.d(t,{qQ:()=>i}),r("svg")},48113:(e,t,a)=>{a.d(t,{$v:()=>g,EO:()=>d,Lt:()=>l,Rx:()=>h,Zr:()=>y,ck:()=>p,r7:()=>m,wd:()=>f});var r=a(85047),i=a(31615),n=a(40291),o=a(34961),s=a(21410);let l=n.bL;n.l9;let c=n.ZL,u=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.hJ,{className:(0,o.cn)("fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t,ref:
1a}));u.displayName=n.hJ.displayName;let d=i.forwardRef(({className:e,...t},a)=>(0,r.jsxs)(c,{children:[(0,r.jsx)(u,{}),(0,r.jsx)(n.UC,{ref:a,className:(0,o.cn)("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",e),...t})]}));d.displayName=n.UC.displayName;let f=({className:e,...t})=>(0,r.jsx)("div",{className:(0,o.cn)("flex flex-col space-y-2 text-center sm:text-left",e),...t});f.displayName="AlertDialogHeader";let p=({className:e,...t})=>(0,r.jsx)("div",{className:(0,o.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});p.displayName="AlertDialogFooter";let m=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.hE,{ref:a,className:(0,o.cn)("text-lg font-semibold",e),...t}));m.displayName=n.hE.displayName;let g=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.VY,{ref:a,className:(0,o.cn)("text-sm text-muted-foreground",e),...t}));g.displayName=n.VY.displayName;let h=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.rc,{ref:a,className:(0,o.cn)((0,s.r)(),e),...t}));h.displayName=n.rc.displayName;let y=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.ZD,{ref:a,className:(0,o.cn)((0,s.r)({variant:"outline"}),"mt-2 sm:mt-0",e),...t}));y.displayName=n.ZD.displayName},54611:(e,t,a)=>{a.d(t,{L:()=>u,X:()=>c});var r=a(24571),i=a(76458),n=a(42451),o=a(25642),s=a(18977);async function l(e){if(!i.db)return null;let t=await (0,r.GG)((0,r.P)((0,r.rJ)(i.db,"advisors"),(0,r._M)("userId","==",e),(0,r.AB)(1)));return t.empty?null:(0,s.$J)(t.docs[0].data())}async function c(e){if(!i.db)return null;let t=await l(e);if(t)return t;let a=await (0,r.getDoc)((0,r.doc)(i.db,"users",e)),c=(0,s.xK)(a.data());if(c)return c;let u=await (0,r.getDoc)((0,r.doc)(i.db,"userAvatars",e));if(!u.exists())return null;try{let t=o.y.parse({...u.data(),userId:e});if(t.avatarUrl)return t.avatarUrl;if(t.avatarConfig)return(0,n.qQ)(t.avatarConfig)}catch{}return null}async function u(e){if(!i.db)return null;let t=await (0,r.getDoc)((0,r.doc)(i.db,"users",e));return(0,s.Cm)(t.data())||null}},60373:(e,t,a)=>{a.d(t,{BK:()=>l,eu:()=>s,q5:()=>c});var r=a(85047),i=a(31615),n=a(48621),o=a(34961);let s=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.bL,{ref:a,className:(0,o.cn)("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",e),...t}));s.displayName=n.bL.displayName;let l=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n._V,{ref:a,className:(0,o.cn)("aspect-square h-full w-full",e),...t}));l.displayName=n._V.displayName;let c=i.forwardRef(({className:e,...t},a)=>(0,r.jsx)(n.H4,{ref:a,className:(0,o.cn)("flex h-full w-full items-center justify-center rounded-full bg-muted",e),...t}));c.displayName=n.H4.displayName},65834:(e,t,a)=>{a.d(t,{P_:()=>m,hq:()=>d});var r=a(93315);let i="avatars",n=null,o=new Set;async function s(){return n||new Promise((e,t)=>{let a=indexedDB.open("avatarCache",1);a.onerror=()=>{t(Error("無法打開 IndexedDB"))},a.onsuccess=()=>{e(n=a.result)},a.onupgradeneeded=e=>{let t=e.target.result;if(!t.objectStoreNames.contains(i)){let e=t.createObjectStore(i,{keyPath:"key"});e.createIndex("timestamp","timestamp",{unique:!1}),e.createIndex("url","url",{unique:!1})}}})}function l(e,t){let a=function(e){let t=0;for(let a=0;a<e.length;a++)t=(t<<5)-t+e.charCodeAt(a)|0;return Math.abs(t).toString(36)}(e);return t?`avatar_${a}_${t}`:`avatar_${a}`}async function c(e,t){try{let a=await s(),r=l(e,t);return new Promise((n,o)=>{let s=a.transaction([i],"readonly").objectStore(i).get(r);s.onsuccess=()=>{let a=s.result;if(!a)return void n(null);if(Date.now()-a.timestamp>6048e5){d(e,t),n(null);return}let r=URL.createObjectURL(a.blob);n(r)},s.onerror=()=>{o(s.error)}})}catch(e){return console.error("獲取緩存頭像失敗:",e),null}}async function u(e,t,a){try{let r=await s(),n=l(e,a);await p();let o={key:n,url:e,blob:t,timestamp:Date.now(),size:t.size};return new Promise((e,t)=>
1{let a=r.transaction([i],"readwrite").objectStore(i).put(o);a.onsuccess=()=>{e(!0)},a.onerror=()=>{t(a.error)}})}catch(e){return console.error("緩存頭像失敗:",e),!1}}async function d(e,t){try{let a=await s(),r=l(e,t);return new Promise((e,t)=>{let n=a.transaction([i],"readwrite").objectStore(i).delete(r);n.onsuccess=()=>{e(!0)},n.onerror=()=>{t(n.error)}})}catch(e){return console.error("刪除緩存失敗:",e),!1}}async function f(){try{let e=await s(),t=Date.now(),a=0;return new Promise((r,n)=>{let o=e.transaction([i],"readwrite").objectStore(i).index("timestamp").openCursor();o.onsuccess=e=>{let i=e.target.result;if(i){let e=i.value;t-e.timestamp>6048e5&&(i.delete(),a++),i.continue()}else r(a)},o.onerror=()=>{n(o.error)}})}catch(e){return console.error("清理過期緩存失敗:",e),0}}async function p(){try{let e=await s(),t=0,a=[];if(await new Promise((r,n)=>{let o=e.transaction([i],"readonly").objectStore(i).openCursor();o.onsuccess=e=>{let i=e.target.result;if(i){let e=i.value;t+=e.size,a.push(e),i.continue()}else r()},o.onerror=()=>{n(o.error)}}),t>0x3200000){a.sort((e,t)=>e.timestamp-t.timestamp);let r=e.transaction([i],"readwrite").objectStore(i);for(let e of a){if(t<=0x2800000)break;r.delete(e.key),t-=e.size}}}catch(e){console.error("檢查緩存大小失敗:",e)}}async function m(e,t){if(o.has(e))return e;try{let a,i=await c(e,t);if(i)return i;let n=(a=(0,r.jP)(e))||e,o=await fetch(n);if(!o.ok)throw Error(`HTTP error! status: ${o.status}`);let s=await o.blob();return await u(e,s,t),URL.createObjectURL(s)}catch{return o.add(e),e}}setInterval(()=>{f().catch(console.error)},36e5)},79579:(e,t,a)=>{a.d(t,{H:()=>u});var r=a(85047),i=a(31615),n=a(60373),o=a(31862),s=a(34961);let l={small:32,medium:48,large:64};function c(e){return e&&e.substring(0,2)||"用"}function u({userId:e,size:t="medium",className:a,showFallback:d=!0}){let{avatarUrl:f,displayName:p,loading:m}=(0,o.M)(e),g="number"==typeof t?t:l[t||"medium"]||l.medium,[h,y]=(0,i.useState)(!1);return((0,i.useEffect)(()=>{y(!1)},[f]),m)?(0,r.jsx)(n.eu,{className:(0,s.cn)("animate-pulse bg-muted",a),style:{width:g,height:g},children:(0,r.jsx)(n.q5,{className:"text-xs",children:(0,r.jsx)("div",{className:"w-full h-full bg-muted"})})}):f&&!h?(0,r.jsxs)(n.eu,{className:a,style:{width:g,height:g},children:[(0,r.jsx)(n.BK,{src:f,alt:p||"用戶頭像",onError:()=>y(!0)}),d&&(0,r.jsx)(n.q5,{className:"text-xs",children:c(p)})]}):d?(0,r.jsx)(n.eu,{className:a,style:{width:g,height:g},children:(0,r.jsx)(n.q5,{className:"text-xs",children:c(p)})}):null}},93315:(e,t,a)=>{function r(e){return!!e&&e.includes("/file?path=")}function i(e){if(!r(e))return null;try{let t=new URL(e,"https://local.invalid").searchParams.get("path");return t?decodeURIComponent(t):null}catch{return null}}function n(e){let t=i(e);return t?`/api/storage/file?path=${encodeURIComponent(t)}`:null}a.d(t,{ZF:()=>l,jP:()=>s,pG:()=>n,sK:()=>i,w2:()=>r});let o=["advisors/","user-avatars/","changelog/images/","learn-article-covers/"];function s(e){let t=i(e);return t&&!(!t||t.includes(".."))&&o.some(e=>
1t.startsWith(e))?`/api/public/storage/file?path=${encodeURIComponent(t)}`:null}function l(e){return s(e)??e}}}]);

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.