1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6011],{73348:function(e,t,a){a.d(t,{Z:function(){return i}});var r=a(57437),n=a(2265),l=a(76865),s=a(46977);function i(e){let{open:t,title:a,description:i,consequences:o,confirmLabel:c="ìì ",cancelLabel:d="ì·¨ì",tone:u="danger",busy:m=!1,onConfirm:b,onCancel:x}=e,f="danger"===u,h=(0,n.useRef)(null),g=(0,s.a)(t,()=>{m||x()});return((0,n.useEffect)(()=>{var e;t&&(null===(e=h.current)||void 0===e||e.focus())},[t]),t)?(0,r.jsx)("div",{className:"modal-viewport z-[200] flex items-center justify-center p-4 bg-black/50",onKeyDown:e=>{if("Tab"!==e.key||!g.current)return;let t=g.current.querySelectorAll('button:not([disabled]), [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');if(0===t.length)return;let a=t[0],r=t[t.length-1];e.shiftKey&&document.activeElement===a?(e.preventDefault(),r.focus()):e.shiftKey||document.activeElement!==r||(e.preventDefault(),a.focus())},children:(0,r.jsxs)("div",{ref:g,role:"dialog","aria-modal":"true","aria-labelledby":"danger-confirm-title",className:"w-full max-w-md rounded-2xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 shadow-xl p-5",children:[(0,r.jsxs)("div",{className:"flex items-start gap-2.5",children:[f&&(0,r.jsx)(l.Z,{size:18,className:"shrink-0 mt-[3px] text-red-600 dark:text-red-400","aria-hidden":"true"}),(0,r.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,r.jsx)("h2",{id:"danger-confirm-title",className:"text-[15px] font-bold text-zinc-900 dark:text-zinc-100 leading-snug break-keep",children:a}),i&&(0,r.jsx)("p",{className:"mt-1 text-[13px] text-zinc-600 dark:text-zinc-400 leading-relaxed break-keep",children:i})]})]}),o&&o.length>0&&(0,r.jsxs)("div",{className:"mt-4 rounded-xl bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900/40 px-4 py-3",children:[(0,r.jsx)("p",{className:"text-[12px] font-semibold text-red-700 dark:text-red-300 mb-1.5",children:"í¨ê» ì¬ë¼ì§ë 기ë¡"}),(0,r.jsx)("ul",{className:"space-y-0.5",children:o.map(e=>(0,r.jsxs)("li",{className:"text-[13px] text-red-800 dark:text-red-200 break-keep",children:["\xb7 ",e]},e))}),(0,r.jsx)("p",{className:"mt-2 text-[12px] font-medium text-red-700 dark:text-red-300",children:"í ë² ìì íë©´ ëë릴 ì ììµëë¤."})]}),(0,r.jsxs)("div",{className:"mt-5 flex gap-2 justify-end",children:[(0,r.jsx)("button",{ref:h,type:"button",onClick:x,disabled:m,className:"px-4 py-2 rounded-xl text-[13px] font-semibold text-zinc-700 dark:text-zinc-300 bg-zinc-100 dark:bg-zinc-800 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition disabled:opacity-50",children:d}),(0,r.jsx)("button",{type:"button",onClick:b,disabled:m,className:f?"px-4 py-2 rounded-xl text-[13px] font-semibold text-white bg-red-600 hover:bg-red-700 transition disabled:opacity-50":"btn-primary-solid px-4 py-2 rounded-xl text-[13px] font-semibold transition",children:m?"ì²ë¦¬íë ì¤â¦":c})]})]})}):null}},78529:function(e,t,a){a.d(t,{A:function(){return n}});var r=a(57437);function n(e){let{message:t,onRetry:a}=e;return(0,r.jsxs)("div",{role:"alert",className:"p-4 text-sm text-red-700 dark:text-red-300",children:[(0,r.jsx)("p",{children:t}),(0,r.jsx)("button",{type:"button",onClick:a,className:"mt-2 min-h-11 rounded-lg border border-current px-3 font-medium focus-visible:outline focus-visible:outline-2",children:"ë¤ì ë¶ë¬ì¤ê¸°"})]})}},95539:function(e,t,a){a.d(t,{z:function(){return s}});var r=a(57437),n=a(46977),l=a(48313);function s(e){let{open:t,busy:a,onSave:s,onDiscard:i,onCancel:o}=e,c=(0,n.a)(t,()=>{a||o()});return t?(0,r.jsx)(l.Z,{children:(0,r.jsx)("div",{className:"modal-viewport z-[1000] flex items-center justify-center bg-black/50 p-4",children:(0,r.jsxs)("div",{ref:c,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":"ì ì¥íì§ ìì ë³ê²½ì¬í",className:"w-full max-w-md rounded-2xl bg-white p-6 text-zinc-900 dark:bg-zinc-900 dark:text-zinc-100",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:"ë³ê²½ì¬íì ì ì¥í ê¹ì?"}),(0,r.jsx)("p",{className:"mt-2 text-sm text-zinc-600 dark:text-zinc-300",children:"ì ì¥íì§ ìê³ ì´ëíë©´ ì´ë²ì í¸ì§í ë´ì©ì´ ì¬ë¼ì§ëë¤."}),(0,r.jsxs)("div",{className:"mt-6 flex flex-wrap justify-end gap-2",children:[(0,r.jsx)("button",{disabled:a,onClick:o,className:"min-h-11 rounded-lg px-3 hover:bg-zinc-100 dark:hover:bg-zinc-800",children:"ê³ì í¸ì§"}),(0,r.jsx)("button",{disabled:a,onClick:i,className:"min-h-11 rounded-lg px-3 text-red-600 dark:text-red-400",children:"ë²ë¦¬ê³ ì´ë"}),(0,r.jsx)("button",{disabled:a,onClick:s,className:"min-h-11 rounded-lg bg-blue-600 px-3 text-white",children:a?"ì ì¥ ì¤â¦":"ì ì¥ í ì´ë"})]})]})})}):null}},10136:function(e,t,a){a.d(t,{N:function(){return i},W:function(){return o}});var r=a(57437),n=a(2265),l=a(73348);let s=(0,n.createContext)(null);function i(){let e=(0,n.useContext)(s);if(!e)throw Error("useConfirmì ConfirmProvider ìììë§ ì¸ ì ììµëë¤.");return e}function o(e){var t,a;let{children:i}
1=e,[o,c]=(0,n.useState)(null),d=(0,n.useRef)(null),u=(0,n.useCallback)(e=>{var t;return null===(t=d.current)||void 0===t||t.call(d,!1),c(e),new Promise(e=>{d.current=e})},[]),m=(0,n.useCallback)(e=>{let t=d.current;d.current=null,c(null),null==t||t(e)},[]),b=null!==(t=null==o?void 0:o.tone)&&void 0!==t?t:"danger";return(0,r.jsxs)(s.Provider,{value:u,children:[i,o&&(0,r.jsx)(l.Z,{open:!0,title:o.title,description:o.description,consequences:"danger"===b?o.consequences:void 0,confirmLabel:null!==(a=o.confirmLabel)&&void 0!==a?a:"danger"===b?"ìì ":"íì¸",cancelLabel:o.cancelLabel,tone:b,onConfirm:()=>m(!0),onCancel:()=>m(!1)})]})}},4908:function(e,t,a){a.d(t,{Pl:function(){return f},fc:function(){return g},AF:function(){return h}});var r=a(57437),n=a(98319),l=a(2265),s=a(73369),i=a(29827),o=a(71632),c=a(83008),d=a(67920),u=a(27526),m=a(54696);function b(e){let{reloadStudents:t}=e,{data:a}=(0,u.kP)(),{createStudent:r}=(0,s.N)(),{addClass:n}=(0,s.Kw)(),i=(0,l.useRef)(!1);return(0,l.useEffect)(()=>{(null==a?void 0:a.user)&&!i.current&&(async()=>{i.current=!0;let e=!1,l={user:{id:a.user.id,name:a.user.name||"User",role:"admin"}};try{let t=localStorage.getItem("saemo-guest-classes");if(t){let a=JSON.parse(t).filter(e=>"ë´ì íê¸"!==e&&"ë´ìíê¸"!==e);if(a.length>0)for(let t of a)try{await n.mutateAsync(t),e=!0}catch(e){}localStorage.removeItem("saemo-guest-classes")}let a=localStorage.getItem("saemo-guest-students");if(a){let t=JSON.parse(a);if(Array.isArray(t)&&t.length>0)for(let a of t)try{var s;await r.mutateAsync({number:a.number,name:a.name,memo:a.memo,homeClassId:null!==(s=a.homeClassId)&&void 0!==s?s:a.classId,customClassIds:a.customClassIds||[],grade:a.grade,classNum:a.classNum}),e=!0}catch(e){}localStorage.removeItem("saemo-guest-students")}let i=localStorage.getItem("saemo-guest-dashboard-memo"),o=localStorage.getItem("dashboard-memo"),d=i||o;if(d){let t=await (0,c.X)("getDashboardMemo",{},l);t.success&&t.data||(await (0,c.X)("saveDashboardMemo",{content:d},l),e=!0),localStorage.removeItem("saemo-guest-dashboard-memo"),localStorage.removeItem("dashboard-memo")}let u=localStorage.getItem("teacher-timetable")||localStorage.getItem("saemo-guest-timetable-my");if(u){let t=JSON.parse(u),a=await (0,c.X)("getTimetable",{type:"teacher"},l);a.success&&a.data&&0!==Object.keys(a.data).length||(await (0,c.X)("saveTimetable",{type:"teacher",data:t},l),e=!0),localStorage.removeItem("teacher-timetable"),localStorage.removeItem("saemo-guest-timetable-my")}let m=localStorage.getItem("class-timetable")||localStorage.getItem("saemo-guest-timetable-class");if(m){let t=JSON.parse(m),a=await (0,c.X)("getTimetable",{type:"class"},l);a.success&&a.data&&0!==Object.keys(a.data).length||(await (0,c.X)("saveTimetable",{type:"class",data:t},l),e=!0),localStorage.removeItem("class-timetable"),localStorage.removeItem("saemo-guest-timetable-class")}}catch(e){console.error("Guest migration error:",e)}finally{e&&t(),i.current=!1}})()},[a,r,n,t]),null}let x=(0,l.createContext)(void 0);function f(e){let{children:t}=e,a=(0,s.wh)(),o=(0,s.tH)(),c=(0,s.N)(),d=(0,s.Kw)(),f=(0,i.NL)(),{showToast:h}=(0,n.pm)(),{status:g}=(0,u.kP)(),v=(0,m.Dv)(),y=(0,l.useRef)(g);(0,l.useEffect)(()=>{if(("loading"===y.current||"unauthenticated"===y.current)&&"authenticated"===g){let e=setTimeout(()=>{console.log("[StudentProvider] Session transition detected:",y.current,"â authenticated. Invalidating queries."),f.invalidateQueries({queryKey:s.bs.all}),f.invalidateQueries({queryKey:s.ic.all})},300);return y.current=g,()=>clearTimeout(e)}y.current=g},[g,f]),(0,l.useEffect)(()=>{if("authenticated"!==g||!a.isError&&!o.isError)return;console.warn("[StudentProvider] Self-healing: Query in error state while authenticated. Scheduling retry...");let e=setTimeout(()=>{console.log("[StudentProvider] Self-healing: Retrying failed queries."),f.invalidateQueries({queryKey:s.bs.all}),f.invalidateQueries({queryKey:s.ic.all})},2e3);return()=>clearTimeout(e)},[g,a.isError,o.isError,f]);let p=(0,l.useMemo)(()=>{var e;return null!==(e=a.data)&&void 0!==e?e:[]},[a.data]),k=(0,l.useMemo)(()=>{var e;return null!==(e=o.data)&&void 0!==e?e:["ë´ì íê¸"]}
1,[o.data]),w=(0,l.useMemo)(()=>!!v||a.isSuccess&&o.isSuccess||a.isFetched&&void 0!==a.data,[v,a.isSuccess,o.isSuccess,a.isFetched,a.data]),S=a.isLoading||o.isLoading,N=a.isError||o.isError?a.error||o.error:null,j=d.addClass.mutateAsync,C=d.removeClass.mutateAsync,z=d.renameClass.mutateAsync,I=d.updateClassOrder.mutateAsync,E=c.createStudent.mutateAsync,A=c.deleteStudent.mutateAsync,P=c.updateStudent.mutateAsync,q=c.bulkCreateStudents.mutateAsync,K=(0,l.useCallback)(async e=>{k.includes(e)||await j(e)},[k,j]),T=(0,l.useCallback)(async e=>{"ë´ì íê¸"!==e&&"ë´ìíê¸"!==e&&await C(e)},[C]),L=(0,l.useCallback)(async(e,t)=>{"ë´ì íê¸"!==e&&"ë´ìíê¸"!==e&&t.trim()&&e!==t&&await z({oldName:e,newName:t.trim()})},[z]),X=(0,l.useCallback)(async e=>{await I(e)},[I]),D=(0,l.useCallback)(async e=>{try{return await E(e),!0}catch(e){return console.error("Failed to add student:",e),h(e.message||"ìì²ì ì²ë¦¬íì§ ëª»íìµëë¤.","error"),!1}},[E,h]),F=(0,l.useCallback)(async e=>{try{return await A(e),!0}catch(e){return console.error("Failed to remove student:",e),!1}},[A]),M=(0,l.useCallback)(async(e,t)=>{try{return await P({id:e,...t}),!0}catch(e){return console.error("Failed to update student:",e),!1}},[P]),O=(0,l.useCallback)(async e=>{let t=p.length>0?Math.max(...p.map(e=>e.number)):0,a=e.map((e,a)=>({name:e,number:t+1+a}));await q({students:a})},[p,q]),R=a.refetch,Q=(0,l.useCallback)(async()=>{await R()},[R]);(0,l.useEffect)(()=>{let e=()=>{f.invalidateQueries()};return window.addEventListener("refresh-active-view",e),()=>window.removeEventListener("refresh-active-view",e)},[f]);let J=(0,l.useMemo)(()=>({students:p,classes:k,addClass:K,removeClass:T,renameClass:L,updateClassOrder:X,addStudent:D,removeStudent:F,updateStudent:M,bulkAddStudents:O,reloadStudents:Q,isLoaded:w,isLoading:S,error:N}),[p,k,K,T,L,X,D,F,M,O,Q,w,S,N]);return(0,r.jsxs)(x.Provider,{value:J,children:[(0,r.jsx)(b,{reloadStudents:Q}),t]})}function h(){let e=(0,l.useContext)(x);if(!e)throw Error("useStudents must be used within a StudentProvider");return e}function g(){var e;let{students:t,isLoaded:a}=h(),{data:r,status:n}=(0,u.kP)(),l=(0,d.XC)(),i=(0,m.Dv)(),b=a&&t.length>0,{data:x}=(0,o.a)({queryKey:[...s.bs.all,"has-roster",null==r?void 0:null===(e=r.user)||void 0===e?void 0:e.id],enabled:a&&!b&&!i&&"authenticated"===n,staleTime:6e5,queryFn:async()=>{var e;let t=await (0,c.X)("hasStudentRoster",{},l);return!!(t.success&&(null===(e=t.data)||void 0===e?void 0:e.hasRoster))}});return b||!0===x}}}]);
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.