1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1602,401],{30401:function(t,e,s){s.d(e,{Z:function(){return a}});let a=(0,s(79205).Z)("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},99397:function(t,e,s){s.d(e,{Z:function(){return a}});let a=(0,s(79205).Z)("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]])},69076:function(t,e,s){s.d(e,{Z:function(){return a}});let a=(0,s(79205).Z)("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]])},18930:function(t,e,s){s.d(e,{Z:function(){return a}});let a=(0,s(79205).Z)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},91455:function(t,e,s){s.d(e,{s:function(){return n}});var a=s(57437),r=s(2265),i=s(93448);function n(t){let{options:e,value:s,onChange:n,className:o,itemClassName:u,activeItemClassName:c,inactiveItemClassName:l,indicatorClassName:h,variant:d="pill",underlineThickness:m=2,disabled:f=!1,equalWidth:y=!1,"aria-label":p}=t,v=(0,r.useRef)(null),b=(0,r.useRef)({}),[g,w]=(0,r.useState)(null),[C,S]=(0,r.useState)(!1),k=e.map(t=>t.key).join("\0"),x=(0,r.useCallback)(()=>{let t=v.current,e=b.current[s];if(!t||!e||0===e.offsetWidth){w(t=>null===t?t:null);return}let a={left:e.offsetLeft,top:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight};w(t=>t&&t.left===a.left&&t.top===a.top&&t.width===a.width&&t.height===a.height?t:a)},[s]);(0,r.useLayoutEffect)(()=>{x()},[x,k,d]),(0,r.useEffect)(()=>{if(!g||C)return;let t=requestAnimationFrame(()=>S(!0));return()=>cancelAnimationFrame(t)},[g,C]),(0,r.useEffect)(()=>{let t=v.current;if(!t||"undefined"==typeof ResizeObserver)return;let e=new ResizeObserver(()=>x());return e.observe(t),Object.values(b.current).forEach(t=>{t&&e.observe(t)}),()=>e.disconnect()},[x,k]),(0,r.useEffect)(()=>{let t=document.fonts;if(!(null==t?void 0:t.ready))return;let e=!1;return t.ready.then(()=>{e||x()}).catch(()=>{}),()=>{e=!0}},[x]);let M=!!g&&!f;return(0,a.jsxs)("div",{ref:v,role:"group","aria-label":p,className:(0,i.cn)("relative flex items-center",o),children:[(0,a.jsx)("div",{"aria-hidden":!0,className:(0,i.cn)("absolute left-0 top-0 pointer-events-none","pill"===d?"rounded-lg":"rounded-full",C&&"transition-[transform,width,opacity] duration-300 ease-out motion-reduce:transition-none",M?"opacity-100":"opacity-0",h),style:g?{transform:"translate3d(".concat(g.left,"px, ").concat("underline"===d?g.top+g.height-m:g.top,"px, 0)"),width:g.width,height:"underline"===d?m:g.height}:void 0}),e.map(t=>{let e=t.key===s;return(0,a.jsx)("button",{ref:e=>
1{b.current[t.key]=e},type:"button","aria-pressed":e,title:t.title,"aria-label":t.ariaLabel,disabled:f,onClick:()=>n(t.key),className:(0,i.cn)("relative z-10 flex items-center justify-center transition-colors duration-200 motion-reduce:transition-none",y&&"flex-1",u,e?c:l,t.className),children:t.label},t.key)})]})}},4908:function(t,e,s){s.d(e,{Pl:function(){return y},fc:function(){return v},AF:function(){return p}});var a=s(57437),r=s(98319),i=s(2265),n=s(73369),o=s(29827),u=s(71632),c=s(83008),l=s(67920),h=s(27526),d=s(54696);function m(t){let{reloadStudents:e}=t,{data:s}=(0,h.kP)(),{createStudent:a}=(0,n.N)(),{addClass:r}=(0,n.Kw)(),o=(0,i.useRef)(!1);return(0,i.useEffect)(()=>{(null==s?void 0:s.user)&&!o.current&&(async()=>{o.current=!0;let t=!1,i={user:{id:s.user.id,name:s.user.name||"User",role:"admin"}};try{let e=localStorage.getItem("saemo-guest-classes");if(e){let s=JSON.parse(e).filter(t=>"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t);if(s.length>0)for(let e of s)try{await r.mutateAsync(e),t=!0}catch(t){}localStorage.removeItem("saemo-guest-classes")}let s=localStorage.getItem("saemo-guest-students");if(s){let e=JSON.parse(s);if(Array.isArray(e)&&e.length>0)for(let s of e)try{var n;await a.mutateAsync({number:s.number,name:s.name,memo:s.memo,homeClassId:null!==(n=s.homeClassId)&&void 0!==n?n:s.classId,customClassIds:s.customClassIds||[],grade:s.grade,classNum:s.classNum}),t=!0}catch(t){}localStorage.removeItem("saemo-guest-students")}let o=localStorage.getItem("saemo-guest-dashboard-memo"),u=localStorage.getItem("dashboard-memo"),l=o||u;if(l){let e=await (0,c.X)("getDashboardMemo",{},i);e.success&&e.data||(await (0,c.X)("saveDashboardMemo",{content:l},i),t=!0),localStorage.removeItem("saemo-guest-dashboard-memo"),localStorage.removeItem("dashboard-memo")}let h=localStorage.getItem("teacher-timetable")||localStorage.getItem("saemo-guest-timetable-my");if(h){let e=JSON.parse(h),s=await (0,c.X)("getTimetable",{type:"teacher"},i);s.success&&s.data&&0!==Object.keys(s.data).length||(await (0,c.X)("saveTimetable",{type:"teacher",data:e},i),t=!0),localStorage.removeItem("teacher-timetable"),localStorage.removeItem("saemo-guest-timetable-my")}let d=localStorage.getItem("class-timetable")||localStorage.getItem("saemo-guest-timetable-class");if(d){let e=JSON.parse(d),s=await (0,c.X)("getTimetable",{type:"class"},i);s.success&&s.data&&0!==Object.keys(s.data).length||(await (0,c.X)("saveTimetable",{type:"class",data:e},i),t=!0),localStorage.removeItem("class-timetable"),localStorage.removeItem("saemo-guest-timetable-class")}}catch(t){console.error("Guest migration error:",t)}finally{t&&e(),o.current=!1}})()},[s,a,r,e]),null}let f=(0,i.createContext)(void 0);function y(t){let{children:e}=t,s=(0,n.wh)(),u=(0,n.tH)(),c=(0,n.N)(),l=(0,n.Kw)(),y=(0,o.NL)(),{showToast:p}=(0,r.pm)(),{status:v}=(0,h.kP)(),b=(0,d.Dv)(),g=(0,i.useRef)(v);(0,i.useEffect)(()=>{if(("loading"===g.current||"unauthenticated"===g.current)&&"authenticated"===v){let t=setTimeout(()=>{console.log("[StudentProvider] Session transition detected:",g.current,"â authenticated. Invalidating queries."),y.invalidateQueries({queryKey:n.bs.all}),y.invalidateQueries({queryKey:n.ic.all})},300);return g.current=v,()=>clearTimeout(t)}g.current=v},[v,y]),(0,i.useEffect)(()=>{if("authenticated"!==v||!s.isError&&!u.isError)return;console.warn("[StudentProvider] Self-healing: Query in error state while authenticated. Scheduling retry...");let t=setTimeout(()=>{console.log("[StudentProvider] Self-healing: Retrying failed queries."),y.invalidateQueries({queryKey:n.bs.all}),y.invalidateQueries({queryKey:n.ic.all})},2e3);return()=>clearTimeout(t)},[v,s.isError,u.isError,y]);let w=(0,i.useMemo)(()=>{var t;return null!==(t=s.data)&&void 0!==t?t:[]},[s.data]),C=(0,i.useMemo)(()=>{var t;return null!==(t=u.data)&&void 0!==t?t:["ë´ì íê¸"]},[u.data]),S=(0,i.useMemo)(()=>!!b||s.isSuccess&&u.isSuccess||s.isFetched&&void 0!==s.data,[b,s.isSuccess,u.isSuccess,s.isFetched,s.data]),k=s.isLoading||u.isLoading,x=s.isError||u.isError?s.error||u.error:null,M=l.addClass.mutateAsync,R=l.removeClass.mutateAsync,O=l.renameClass.mutateAsync,E=l.updateClassOrder.mutateAsync,P=c.createStudent.mutateAsync,I=c.deleteStudent.mutateAsync,j=c.updateStudent.mutateAsync,A=c.bulkCreateStudents.mutateAsync,N=(0,i.useCallback)(async t=>{C.includes(t)||await M(t)},[C,M]),K=(0,i.useCallback)(async t=>{"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t&&await R(t)},[R]),T=(0,i.useCallback)(async(t,e)=>{"ë´ì íê¸"!==t&&"ë´ìíê¸"!==t&&e.trim()&&t!==e&&await O({oldName:t,newName:e.trim()})},[O]),F=(0,i.useCallback)(async t=>{await E(t)},[E]),L=(0,i.useCallback)(async t=>{try{return await P(t),!0}catch(t){return console.error("Failed to add student:",t),p(t.message||"ìì²ì ì²ë¦¬íì§ ëª»íìµëë¤.","error"),!1}},[P,p]),q=(0,i.useCallback)(async t=>{try{return await I(t),!0}catch(t){return console.error("Failed to remove student:",t),!1}},[I]),Z=(0,i.useCallback)(async(t,e)=>{try{return await j({id:t,...e}),!0}catch(t){return console.error("Failed to update student:",t),!1}},[j]),D=(0,i.useCallback)(async t=>{let e=w.length>0?Math.max(...w.map(t=>t.number)):0,s=t.map((t,s)=>({name:t,number:e+1+s}));await A({students:s})},[w,A]),X=s.refetch,G=(0,i.useCallback)(async()=>{await X()},[X]);(0,i.useEffect)(()=>{let t=()=>{y.invalidateQueries()};return window.addEventListener("refresh-active-view",t),()=>window.removeEventListener("refresh-active-view",t)},[y]);let Q=(0,i.useMemo)(()=>({students:w,classes:C,addClass:N,removeClass:K,renameClass:T,updateClassOrder:F,addStudent:L,removeStudent:q,updateStudent:Z,bulkAddStudents:D,reloadStudents:G,isLoaded:S,isLoading:k,error:x}),[w,C,N,K,T,F,L,q,Z,D,G,S,k,x]);return(0,a.jsxs)(f.Provider,{value:Q,children:[(0,a.jsx)(m,{reloadStudents:G}),e]})}function p(){let t=(0,i.useContext)(f);if(!t)throw Error("useStudents must be used within a StudentProvider");return t}function v(){var t;let{students:e,isLoaded:s}=p(),{data:a,status:r}=(0,h.kP)(),i=(0,l.XC)(),o=(0,d.Dv)(),m=s&&e.length>0,{data:f}=(0,u.a)({queryKey:[...n.bs.all,"has-roster",null==a?void 0:null===(t=a.user)||void 0===t?void 0:t.id],enabled:s&&!m&&!o&&"authenticated"===r,staleTime:6e5,queryFn:async()=>{var t;let e=await (0,c.X)("hasStudentRoster",{},i);return!!(e.success&&(null===(t=e.data)||void 0===t?void 0:t.hasRoster))}});return m||!0===f}}
1,2894:function(t,e,s){s.d(e,{R:function(){return o},m:function(){return n}});var a=s(18238),r=s(7989),i=s(11255),n=class extends r.F{#t;#e;#s;#a;constructor(t){super(),this.#t=t.client,this.mutationId=t.mutationId,this.#s=t.mutationCache,this.#e=[],this.state=t.state||o(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){this.#e.includes(t)||(this.#e.push(t),this.clearGcTimeout(),this.#s.notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){this.#e=this.#e.filter(e=>e!==t),this.scheduleGc(),this.#s.notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){this.#e.length||("pending"===this.state.status?this.scheduleGc():this.#s.remove(this))}continue(){return this.#a?.continue()??this.execute(this.state.variables)}async execute(t){let e=()=>{this.#r({type:"continue"})},s={client:this.#t,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#a=(0,i.Mz)({fn:()=>this.options.mutationFn?this.options.mutationFn(t,s):Promise.reject(Error("No mutationFn found")),onFail:(t,e)=>{this.#r({type:"failed",failureCount:t,error:e})},onPause:()=>{this.#r({type:"pause"})},onContinue:e,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#s.canRun(this)});let a="pending"===this.state.status,r=!this.#a.canStart();try{if(a)e();else{this.#r({type:"pending",variables:t,isPaused:r}),this.#s.config.onMutate&&await this.#s.config.onMutate(t,this,s);let e=await this.options.onMutate?.(t,s);e!==this.state.context&&this.#r({type:"pending",context:e,variables:t,isPaused:r})}let i=await this.#a.start();return await this.#s.config.onSuccess?.(i,t,this.state.context,this,s),await this.options.onSuccess?.(i,t,this.state.context,s),await this.#s.config.onSettled?.(i,null,this.state.variables,this.state.context,this,s),await this.options.onSettled?.(i,null,t,this.state.context,s),this.#r({type:"success",data:i}),i}catch(e){try{await this.#s.config.onError?.(e,t,this.state.context,this,s)}catch(t){Promise.reject(t)}try{await this.options.onError?.(e,t,this.state.context,s)}catch(t){Promise.reject(t)}try{await this.#s.config.onSettled?.(void 0,e,this.state.variables,this.state.context,this,s)}catch(t){Promise.reject(t)}try{await this.options.onSettled?.(void 0,e,t,this.state.context,s)}catch(t){Promise.reject(t)}throw this.#r({type:"error",error:e}),e}finally{this.#s.runNext(this)}}#r(t){this.state=(e=>{switch(t.type){case"failed":return{...e,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...e,isPaused:!0};case"continue":return{...e,isPaused:!1};case"pending":return{...e,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...e,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...e,data:void 0,error:t.error,failureCount:e.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}})(this.state),a.Vr.batch(()=>{this.#e.forEach(e=>{e.onMutationUpdate(t)}),this.#s.notify({mutation:this,type:"updated",action:t})})}};function o(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}},21770:function(t,e,s){s.d(e,{D:function(){return l}});var a=s(2265),r=s(2894),i=s(18238),n=s(24112),o=s(45345),u=class extends n.l{#t;#i=void 0;#n;#o;constructor(t,e){super(),this.#t=t,this.setOptions(e),this.bindMethods(),this.#u()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){let e=this.options;this.options=this.#t.defaultMutationOptions(t),(0,o.VS)(this.options,e)||this.#t.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#n,observer:this}),e?.mutationKey&&this.options.mutationKey&&(0,o.Ym)(e.mutationKey)!==(0,o.Ym)(this.options.mutationKey)?this.reset():this.#n?.state.status==="pending"&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(t){this.#u(),this.#c(t)}getCurrentResult(){return this.#i}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#u(),this.#c()}mutate(t,e){return this.#o=e,this.#n?.removeObserver(this),this.#n=this.#t.getMutationCache().build(this.#t,this.options),this.#n.addObserver(this),this.#n.execute(t)}#u(){let t=this.#n?.state??(0,r.R)();this.#i={...t,isPending:"pending"===t.status,isSuccess:"success"===t.status,isError:"error"===t.status,isIdle:"idle"===t.status,mutate:this.mutate,reset:this.reset}}#c(t){i.Vr.batch(()=>
1{if(this.#o&&this.hasListeners()){let e=this.#i.variables,s=this.#i.context,a={client:this.#t,meta:this.options.meta,mutationKey:this.options.mutationKey};if(t?.type==="success"){try{this.#o.onSuccess?.(t.data,e,s,a)}catch(t){Promise.reject(t)}try{this.#o.onSettled?.(t.data,null,e,s,a)}catch(t){Promise.reject(t)}}else if(t?.type==="error"){try{this.#o.onError?.(t.error,e,s,a)}catch(t){Promise.reject(t)}try{this.#o.onSettled?.(void 0,t.error,e,s,a)}catch(t){Promise.reject(t)}}}this.listeners.forEach(t=>{t(this.#i)})})}},c=s(29827);function l(t,e){let s=(0,c.NL)(e),[r]=a.useState(()=>new u(s,t));a.useEffect(()=>{r.setOptions(t)},[r,t]);let n=a.useSyncExternalStore(a.useCallback(t=>r.subscribe(i.Vr.batchCalls(t)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),l=a.useCallback((t,e)=>{r.mutate(t,e).catch(o.ZT)},[r]);if(n.error&&(0,o.L3)(r.options.throwOnError,[n.error]))throw n.error;return{...n,mutate:l,mutateAsync:n.mutate}}},71632:function(t,e,s){s.d(e,{a:function(){return i}});var a=s(86900),r=s(68873);function i(t,e){return(0,r.r)(t,a.z,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.