PageSourceSearch

https://naemo.ai/_next/static/chunks/4908-137b422e5bd83a76.js

js naemo.ai collected 2026-09-24 14:29:54 UTC 17,871 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4908,6214],{4908:function(e,t,a){a.d(t,{Pl:function(){return y},fc:function(){return v},AF:function(){return w}});var r=a(57437),s=a(98319),n=a(2265),u=a(73369),i=a(29827),o=a(11713),l=a(83008),c=a(67920),d=a(27526),m=a(54696);function f(e){let{reloadStudents:t}=e,{data:a}=(0,d.kP)(),{createStudent:r}=(0,u.N)(),{addClass:s}=(0,u.Kw)(),i=(0,n.useRef)(!1);return(0,n.useEffect)(()=>{(null==a?void 0:a.user)&&!i.current&&(async()=>{i.current=!0;let e=!1,n={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 s.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 u;await r.mutateAsync({number:a.number,name:a.name,memo:a.memo,homeClassId:null!==(u=a.homeClassId)&&void 0!==u?u: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"),c=i||o;if(c){let t=await (0,l.X)("getDashboardMemo",{},n);t.success&&t.data||(await (0,l.X)("saveDashboardMemo",{content:c},n),e=!0),localStorage.removeItem("saemo-guest-dashboard-memo"),localStorage.removeItem("dashboard-memo")}let d=localStorage.getItem("teacher-timetable")||localStorage.getItem("saemo-guest-timetable-my");if(d){let t=JSON.parse(d),a=await (0,l.X)("getTimetable",{type:"teacher"},n);a.success&&a.data&&0!==Object.keys(a.data).length||(await (0,l.X)("saveTimetable",{type:"teacher",data:t},n),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,l.X)("getTimetable",{type:"class"},n);a.success&&a.data&&0!==Object.keys(a.data).length||(await (0,l.X)("saveTimetable",{type:"class",data:t},n),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,s,t]),null}let g=(0,n.createContext)(void 0);function y(e){let{children:t}=e,a=(0,u.wh)(),o=(0,u.tH)(),l=(0,u.N)(),c=(0,u.Kw)(),y=(0,i.NL)(),{showToast:w}=(0,s.p)(),{status:v}=(0,d.kP)(),h=(0,m.Dv)(),I=(0,n.useRef)(v);(0,n.useEffect)(()=>{if(("loading"===I.current||"unauthenticated"===I.current)&&"authenticated"===v){let e=setTimeout(()=>{console.log("[StudentProvider] Session transition detected:",I.current,"→ authenticated. Invalidating queries."),y.invalidateQueries({queryKey:u.bs.all}),y.invalidateQueries({queryKey:u.ic.all})},300);return I.current=v,()=>clearTimeout(e)}I.current=v},[v,y]),(0,n.useEffect)(()=>{if("authenticated"!==v||!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."),y.invalidateQueries({queryKey:u.bs.all}),y.invalidateQueries({queryKey:u.ic.all})},2e3);return()=>clearTimeout(e)},[v,a.isError,o.isError,y]);let S=(0,n.useMemo)(()=>{var e;return null!==(e=a.data)&&void 0!==e?e:[]},[a.data]),b=(0,n.useMemo)(()=>{var e;return null!==(e=o.data)&&void 0!==e?e:["담임 학급"]},[o.data]),C=(0,n.useMemo)(()=>!!h||a.isSuccess&&o.isSuccess||a.isFetched&&void 0!==a.data,[h,a.isSuccess,o.isSuccess,a.isFetched,a.data]),p=a.isLoading||o.isLoading,k=a.isError||o.isError?a.error||o.error:null,D=c.addClass.mutateAsync,N=c.removeClass.mutateAsync,E=c.renameClass.mutateAsync,A=c.updateClassOrder.mutateAsync,F=l.createStudent.mutateAsync,T=l.deleteStudent.mutateAsync,O=l.updateStudent.mutateAsync,M=l.bulkCreateStudents.mutateAsync,X=(0,n.useCallback)(async e=>{b.includes(e)||await D(e)},[b,D]),G=(0,n.useCallback)(async e=>{"담임 학급"!==e&&"담임학급"!==e&&await N(e)},[N]),K=(0,n.useCallback)(async(e,t)=>{"담임 학급"!==e&&"담임학급"!==e&&t.trim()&&e!==t&&await E({oldName:e,newName:t.trim()})},[E]),q=(0,n.useCallback)(async e=>{await A(e)},[A]),J=(0,n.useCallback)(async e=>{try{return await F(e),!0}catch(e){return console.error("Failed to add student:",e),w(e.message||"요청을 처리하지 못했습니다.","error"),!1}},[F,w]),R=(0,n.useCallback)(async e=>{try{return await T(e),!0}catch(e){return console.error("Failed to remove student:",e),!1}},[T]),Q=(0,n.useCallback)(async(e,t)=>{try{return await O({id:e,...t}),!0}catch(e){return console.error("Failed to update student:",e),!1}},[O]),x=(0,n.useCallback)(async e=>{let t=S.length>0?Math.max(...S.map(e=>e.number)):0,a=e.map((e,a)=>({name:e,number:t+1+a}));await M({students:a})},[S,M]),z=a.refetch,P=(0,n.useCallback)(async()=>{await z()},[z]);(0,n.useEffect)(()=>{let e=()=>{y.invalidateQueries()};return window.addEventListener("refresh-active-view",e),()=>window.removeEventListener("refresh-active-view",e)},[y]);let _=(0,n.useMemo)(()=>({students:S,classes:b,addClass:X,removeClass:G,renameClass:K,updateClassOrder:q,addStudent:J,removeStudent:R,updateStudent:Q,bulkAddStudents:x,reloadStudents:P,isLoaded:C,isLoading:p,error:k}),[S,b,X,G,K,q,J,R,Q,x,P,C,p,k]);return(0,r.jsxs)(g.Provider,{value:_,children:[(0,r.jsx)(f,{reloadStudents:P}),t]})}function w(){let e=(0,n.useContext)(g);if(!e)throw Error("useStudents must be used within a StudentProvider");return e}function v(){var e;let{students:t,isLoaded:a}=w(),{data:r,status:s}=(0,d.kP)(),n=(0,c.XC)(),i=(0,m.Dv)(),f=a&&t.length>0,{data:g}=(0,o.a)({queryKey:[...u.bs.all,"has-roster",null==r?void 0:null===(e=r.user)||void 0===e?void 0:e.id],enabled:a&&!f&&!i&&"authenticated"===s,staleTime:6e5,queryFn:async()=>{var e;let t=await (0,l.X)("hasStudentRoster",{},n);return!!(t.success&&(null===(e=t.data)||void 0===e?void 0:e.hasRoster))}});return f||!0===g}},73369:function(e,t,a){a.d(t,{Kw:function(){return h},N:function(){return v},bs:function(){return f},ic:function(){return g},tH:function(){return w},wh:function(){return y}});var r=a(11713),s=a(29827),n=a(21770),u=a(83008),i=a(67920),o=a(27526),l=a(2265),c=a(54392),d=a(54696);let m=(e,t)=>
1{let a=(Number(e.grade)||0)-(Number(t.grade)||0);if(0!==a)return a;let r=(Number(e.classNum)||0)-(Number(t.classNum)||0);return 0!==r?r:(Number(e.number)||0)-(Number(t.number)||0)},f={all:["students"],lists:()=>[...f.all,"list"],list:e=>[...f.lists(),e],details:()=>[...f.all,"detail"],detail:e=>[...f.details(),e]},g={all:["classes"]};function y(e){var t,a,s,n;let{data:g,status:y}=(0,o.kP)(),w=(0,i.XC)(),v=(0,d.Dv)(),h=(0,l.useRef)(null==g?void 0:null===(t=g.user)||void 0===t?void 0:t.id);return(null==g?void 0:null===(a=g.user)||void 0===a?void 0:a.id)&&(h.current=g.user.id),(0,r.a)({queryKey:[...f.lists(),{userId:v?"guest":null!==(n=null==g?void 0:null===(s=g.user)||void 0===s?void 0:s.id)&&void 0!==n?n:h.current,...e}],enabled:"loading"!==y,staleTime:3e5,gcTime:6e5,refetchOnWindowFocus:!1,queryFn:async()=>{if(v){let t=(await c.Jb()).sort(m);if((null==e?void 0:e.take)!==void 0){let a=e.skip||0;return t.slice(a,a+e.take)}return t}let t={...e},a=await (0,u.X)("listStudents",t,w);if(a.success&&a.data)return a.data.sort(m);if("Session Expired"===a.message)throw Error("Session Expired");throw Error(a.error||a.message||"Failed to load students")}})}function w(){var e,t,a,s;let{data:n,status:m}=(0,o.kP)(),f=(0,i.XC)(),y=(0,d.Dv)(),w=(0,l.useRef)(null==n?void 0:null===(e=n.user)||void 0===e?void 0:e.id);return(null==n?void 0:null===(t=n.user)||void 0===t?void 0:t.id)&&(w.current=n.user.id),(0,r.a)({queryKey:[...g.all,{userId:y?"guest":null!==(s=null==n?void 0:null===(a=n.user)||void 0===a?void 0:a.id)&&void 0!==s?s:w.current}],enabled:"loading"!==m,staleTime:3e5,gcTime:6e5,refetchOnWindowFocus:!1,queryFn:async()=>{if(y)return await c.CI();let e=await (0,u.X)("getClasses",{},f);if(e.success&&e.data)return e.data;throw Error(e.error||"Failed to load classes")}})}function v(){let e=(0,s.NL)(),t=(0,i.XC)(),a=(0,d.Dv)(),r=()=>{e.invalidateQueries({queryKey:f.all})},o=(0,n.D)({mutationFn:async e=>{if(a)return await c.av(e);let r=await (0,u.X)("createStudent",{number:e.number,name:e.name,memo:e.memo,homeClassId:e.homeClassId,customClassIds:e.customClassIds||[],grade:e.grade,classNum:e.classNum},t);if(!r.success)throw Error(r.error||"Failed to create student");return r.data},onSuccess:r}),l=(0,n.D)({mutationFn:async e=>{let{id:r,...s}=e;if(a){let e=await c.Jb(),t=e.findIndex(e=>e.id===r);if(-1!==t)return e[t]={...e[t],...s},await c.Vt(e),e[t];throw Error("Student not found locally")}let n=await (0,u.X)("updateStudent",{studentId:r,...s},t);if(!n.success)throw Error(n.error||"Failed to update student");return n.data},onSuccess:t=>{if(!t||"object"!=typeof t||!("id"in t)){r();return}e.setQueriesData({queryKey:f.lists()},e=>null==e?void 0:e.map(e=>e.id===t.id?{...e,...t}:e))}});return{createStudent:o,updateStudent:l,deleteStudent:(0,n.D)({mutationFn:async e=>{if(a){let t=(await c.Jb()).filter(t=>t.id!==e);return await c.Vt(t),{success:!0}}let r=await (0,u.X)("deleteStudent",{studentId:e,confirm:!0},t);if(!r.success)throw Error(r.error||"Failed to delete student");return r.data},onSuccess:r}),bulkCreateStudents:(0,n.D)({mutationFn:async e=>{let{students:r}=e;if(a)return await c.JY(r.map(e=>{var t;return{...e,homeClassId:null!==(t=e.homeClassId)&&void 0!==t?t:void 0,customClassIds:e.customClassIds||[],grade:e.grade||1,classNum:e.classNum,number:e.number,name:e.name}})),{success:!0,count:r.length,results:[]};let s=await (0,u.X)("bulkCreateStudents",{students:r.map(e=>({number:e.number,name:e.name,grade:e.grade,classNum:e.classNum,homeClassId:e.homeClassId,customClassIds:e.customClassIds||[],memo:e.memo}))},t);if(!s.success)throw Error(s.error||"Failed to bulk create students");return s.data},onSuccess:r}),clearClassStudents:(0,n.D)({mutationFn:async e=>{let{homeClassId:r}=e;if(a){let e=(await c.Jb()).filter(e=>{var t;return e.homeClassId!==r&&!(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(r))});return await c.Vt(e),{success:!0}}let s=await (0,u.X)("clearClassStudents",{homeClassId:r},t);if(!s.success)throw Error(s.error||"Failed to clear students");return s.data},onSuccess:r})}}function h(){let e=(0,s.NL)(),t=(0,i.XC)(),a=(0,d.Dv)(),r=()=>
1{e.invalidateQueries({queryKey:g.all})},o=(0,n.D)({mutationFn:async e=>{if(a)return await c.QM(e),{success:!0};let r=await (0,u.X)("createClass",{name:e},t);if(!r.success)throw Error(r.error||"Failed to create class");return r.data},onSuccess:r});return{addClass:o,removeClass:(0,n.D)({mutationFn:async e=>{if(a){let t=(await c.CI()).filter(t=>t!==e);return await c.fh(t),{success:!0}}let r=await (0,u.X)("deleteClass",{name:e},t);if(!r.success)throw Error(r.error||"Failed to delete class");return r.data},onSuccess:r}),renameClass:(0,n.D)({mutationFn:async e=>{let{oldName:r,newName:s}=e;if(a){let e=await c.CI(),t=e.indexOf(r);-1!==t&&(e[t]=s,await c.fh(e));let a=(await c.KO()).students.map(e=>{var t;let a={...e};return e.homeClassId===r&&(a.homeClassId=s),(null===(t=e.customClassIds)||void 0===t?void 0:t.includes(r))&&(a.customClassIds=e.customClassIds.map(e=>e===r?s:e)),a});return await c.Ww("students",a),{success:!0}}let n=await (0,u.X)("renameClass",{oldName:r,newName:s},t);if(!n.success)throw Error(n.error||"Failed to rename class");return n.data},onSuccess:()=>{r(),e.invalidateQueries({queryKey:f.all})}}),updateClassOrder:(0,n.D)({mutationFn:async e=>{if(a){let t=["담임 학급",...e.filter(e=>"담임 학급"!==e)];return await c.fh(t),{success:!0}}let r=await (0,u.X)("updateClassOrder",{orderedClassNames:e},t);if(!r.success)throw Error(r.error||"Failed to update class order");return r.data},onSuccess:r})}}},54392:function(e,t,a){a.d(t,{CI:function(){return c},JY:function(){return d},Jb:function(){return s},KO:function(){return r.getGuestData},LI:function(){return g},QM:function(){return l},Qn:function(){return y},Vt:function(){return n}
1,Ww:function(){return r.saveGuestData},av:function(){return u},fh:function(){return o},iT:function(){return m}});var r=a(96214);let s=async()=>(await (0,r.getGuestData)()).students||[],n=async e=>{await (0,r.saveGuestData)("students",e)},u=async e=>{let t=await s(),a={...e,id:crypto.randomUUID()};return t.push(a),await n(t),a},i=async()=>{let e=await s(),t=new Set(["담임 학급"]);return e.forEach(e=>{e.homeClassId&&t.add(e.homeClassId),e.customClassIds&&e.customClassIds.forEach(e=>t.add(e))}),Array.from(t)},o=async e=>{await (0,r.saveGuestData)("classes",e)},l=async e=>{let t=(await (0,r.getGuestData)()).classes||[];if(!t.includes(e)){let a=[...t,e];await (0,r.saveGuestData)("classes",a)}},c=async()=>Array.from(new Set([...await i(),...(await (0,r.getGuestData)()).classes||[]])),d=async e=>{let t=[...await s(),...e.map(e=>({...e,id:crypto.randomUUID()}))];await n(t)},m=async()=>{let e=await (0,r.getGuestData)();return[...(e.autonomousActivities||[]).map(e=>({id:e.id,studentId:e.studentId,category:"autonomous",activityName:e.title||e.activityName,details:e.content||e.details||"",createdAt:e.date||e.createdAt||new Date().toISOString()})),...(e.careerActivities||[]).map(e=>({id:e.id,studentId:e.studentId,category:"career",activityName:e.title||e.activityName,details:e.content||e.details||"",createdAt:e.date||e.createdAt||new Date().toISOString()}))]},f=async e=>{let t=e.filter(e=>"autonomous"===e.category).map(e=>({id:e.id,studentId:e.studentId,title:e.activityName,content:e.details,date:e.createdAt})),a=e.filter(e=>"career"===e.category).map(e=>({id:e.id,studentId:e.studentId,title:e.activityName,content:e.details,date:e.createdAt}));await (0,r.saveGuestData)("autonomousActivities",t),await (0,r.saveGuestData)("careerActivities",a)},g=async e=>{let t=await m(),a=t.findIndex(t=>t.id===e.id);a>=0?t[a]=e:t.push(e),await f(t)},y=async e=>{let t=(await m()).filter(t=>t.id!==e);await f(t)}},96214:function(e,t,a){a.r(t),a.d(t,{DEMO_DATA_VERSION:function(){return n},DEMO_NAMETAG_CONFIG:function(){return v},STORAGE_KEY:function(){return r},VERSION_KEY:function(){return s},generateMockCleaningZones:function(){return c},generateMockData:function(){return l},getGuestCleaningZones:function(){return f},getGuestData:function(){return d},getGuestWorkNotes:function(){return y},saveGuestCleaningZones:function(){return g},saveGuestData:function(){return m},saveGuestWorkNotes:function(){return w}});let r="saemo-guest-data",s="saemo-guest-data-version",n="2.1",u=e=>{let t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return"".concat(t,"-").concat(a,"-").concat(r)},i=e=>new Date("".concat(e,"T00:00:00")),o=e=>{if(!Array.isArray(e)||0===e.length)return e;let t=e.map(e=>i(e.date).getTime()).filter(e=>Number.isFinite(e));if(0===t.length)return e;let a=Math.min(...t),r=Math.max(...t)-a,s=new Date;s.setHours(0,0,0,0);let n=s.getDate(),o=n>=10?n-1:20,l=s.getTime()-864e5*o,c=e=>{let t=i(e).getTime();return Number.isFinite(t)?u(new Date(Math.min(l+864e5*Math.round((0===r?1:(t-a)/r)*o),s.getTime()))):e};return e.map(e=>{let t=c(e.date),a={...e,date:t};if(e.endDate){let r=Math.max(0,Math.round((i(e.endDate).getTime()-i(e.date).getTime())/864e5)),n=Math.min(i(t).getTime()+864e5*r,s.getTime());a.endDate=u(new Date(n))}return"string"==typeof e.createdAt&&e.createdAt.length>=10&&(a.createdAt="".concat(t).concat(e.createdAt.slice(10))),a})},l=async()=>{try{let e=await fetch("/demo-data.json"),t=(await e.json()).DEMO_GUEST_DATA;return t.students&&Array.isArray(t.students)&&(t.students=t.students.map(e=>{var t;return{...e,homeClassId:null!==(t=e.homeClassId)&&void 0!==t?t:e.classId}})),t.attendanceRecords&&(t.attendanceRecords=o(t.attendanceRecords)),t}catch(e){return console.error("Failed to fetch demo data",e),{students:[]}}},c=async()=>[{id:"zone-1",name:"교실 쓸기",studentIds:["mock-student-1","mock-student-2","mock-student-11","mock-student-12"],order:0,locked:!1,columnId:0,capacity:4},{id:"zone-2",name:"교실 바닥 (뒤)",studentIds:["mock-student-3"],order:1,locked:!1,columnId:0,capacity:2},{id:"zone-3",name:"복도 쓸기",studentIds:["mock-student-4","mock-student-13"],order:2,locked:!1,columnId:1,capacity:3},{id:"zone-4",name:"칠판/교탁",studentIds:["mock-student-5"],order:3,locked:!1,columnId:1,capacity:2},{id:"zone-5",name:"창틀/창문",studentIds:["mock-student-6","mock-student-14"],order:4,locked:!1,columnId:2,capacity:2},{id:"zone-6",name:"특별 구역",studentIds:["mock-student-7"],order:5,locked:!1,columnId:2,capacity:2},{id:"zone-7",name:"분리수거",studentIds:["mock-student-8","mock-student-15"],order:6,locked:!1,columnId:3,capacity:2},{id:"zone-8",name:"사물함 위",studentIds:["mock-student-9"],order:7,locked:!1,columnId:3,capacity:2},{id:"zone-9",name:"급식실 도우미",studentIds:["mock-student-10"],order:8,locked:!1,columnId:3,capacity:2}],d=async()=>{let e=localStorage.getItem(r),t=localStorage.getItem(s);if(e&&t===n)try{return JSON.parse(e)}catch(e){console.error("Failed to parse guest data",e)}let a=await l();return localStorage.setItem(r,JSON.stringify(a)),localStorage.setItem(s,n),a},m=async(e,t)=>{let a={...await d(),[e]:t};localStorage.setItem(r,JSON.stringify(a))},f=async()=>{let e=await d();if(e.cleaningZones)return e.cleaningZones;let t=await c();return await m("cleaningZones",t),t},g=async e=>{await m("cleaningZones",e)},y=async()=>(await d()).workNotes||[],w=async e=>{await m("workNotes",e)},v={paperSize:"A4",rows:8,cols:4,showNumber:!0,showName:!0,fontSize:40,gap:2,padding:10,orientation:"horizontal",numberFormat:"2-digit",numberPosition:"above",borderRadius:4,fontFamily:"sans",backgroundColor:"#ffffff"}}}]);

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.