PageSourceSearch

https://naemo.ai/_next/static/chunks/2360.66c4d47bb5da79ae.js

js naemo.ai collected 2026-10-02 01:14:04 UTC 16,475 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2360],{84519:function(e,t,r){r.d(t,{H:function(){return i}});var n=r(57437),s=r(48013),a=r(93448);function i(e){let{children:t,className:r}=e;return t?(0,n.jsxs)("div",{className:(0,a.cn)("flex items-center gap-2.5 px-4 py-3 rounded-xl text-[13px] text-zinc-700 dark:text-zinc-300 bg-zinc-50 dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 animate-in fade-in duration-200",r),children:[(0,n.jsx)(s.Rj,{size:18,className:"shrink-0"}),(0,n.jsx)("span",{className:"whitespace-pre-line leading-relaxed",children:t})]}):null}},35596:function(e,t,r){r.d(t,{Z:function(){return z}});var n=r(57437),s=r(2265),a=r(52345),i=r(59717),l=r(81906),o=r(33728),c=r(57586),d=r(13100),u=r(32489),h=r(46977),x=r(93448),m=r(21652),b=r(8345),f=r(82941);let p=0,v=[],w=0,k=!1;function g(){w++,window.history.back()}let y="";function z(e){let{isOpen:t,onClose:r,title:z,children:j,footer:N,className:E}=e,C=(0,s.useId)(),S=(0,a.J)(),I=(0,i.o)(),T=(0,l.c)(0);(0,s.useEffect)(()=>{t&&T.set(0)},[t,T]);let _=(0,o.H)(T,[0,240],[1,0]),L=(0,s.useRef)(r),R=(0,s.useRef)(!1);(0,s.useEffect)(()=>{L.current=r},[r]),(0,s.useEffect)(()=>{if(!t)return;p||(y=document.body.style.overflow),p++,k||(k=!0,window.addEventListener("popstate",e=>{var t;if((w>0||v.length>0)&&(0,b.l)(e),w>0){w--;return}null===(t=v.at(-1))||void 0===t||t.onPop()},{capture:!0}));let e={id:C,onPop:()=>{R.current&&(R.current=!1,L.current())}};v.push(e),document.body.style.overflow="hidden";let r=(0,m.UM)(),n=window.history.state||{};return r&&!R.current&&(window.history.pushState({...n,isBottomSheet:!0,sheetId:C},""),R.current=!0),()=>{var t;R.current&&(null===(t=window.history.state)||void 0===t?void 0:t.sheetId)===C&&(R.current=!1,g()),v.splice(v.indexOf(e),1),--p<=0&&(p=0,document.body.style.overflow=y)}},[t,C]);let D=(0,s.useCallback)(()=>{R.current&&(R.current=!1,g()),r()},[r]),Z=(0,h.a)(t,D),M=(0,s.useCallback)((e,t)=>{"pointercancel"!==e.type&&"touchcancel"!==e.type&&(t.velocity.y>500||t.offset.y>100)&&D()},[D]),A=(0,s.useRef)(null),H=(0,s.useRef)(null);return(0,s.useEffect)(()=>{if(!t)return;let e=A.current;if(!e)return;let r=[],n=function(t){let r=!(arguments.length>1)||void 0===arguments[1]||arguments[1];if(!e.contains(t)||H.current!==t)return;let n=e.getBoundingClientRect(),s=t.getBoundingClientRect(),a=(0,f.Wk)({top:s.top-n.top,bottom:s.bottom-n.top},e.clientHeight,12,12);0!==a&&e.scrollTo({top:Math.max(0,e.scrollTop+a),behavior:r?"smooth":"auto"})},s=e=>{let t=e.target;t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName||"SELECT"===t.tagName||t.isContentEditable)&&(H.current=t,n(t,!1),r.push(setTimeout(()=>n(t,!0),120)),r.push(setTimeout(()=>n(t,!0),300)),r.push(setTimeout(()=>n(t,!0),500)))},a=()=>{H.current=null},i=()=>{H.current&&n(H.current,!0)};e.addEventListener("focusin",s),e.addEventListener("focusout",a);let l=window.visualViewport;return null==l||l.addEventListener("resize",i),()=>{r.forEach(clearTimeout),e.removeEventListener("focusin",s),e.removeEventListener("focusout",a),null==l||l.removeEventListener("resize",i)}},[t]),(0,n.jsx)(c.M,{children:t&&(0,n.jsxs)("div",{className:"md:hidden fixed inset-x-0 z-[100] flex items-end",style:{top:"var(--vv-offset-top, 0px)",height:"var(--app-height)"},children:[(0,n.jsx)(d.E.div,{initial:{opacity:0}
1,animate:{opacity:1},exit:{opacity:0},transition:{duration:.22,ease:[.22,1,.36,1]},className:"absolute inset-0",children:(0,n.jsx)(d.E.div,{style:{opacity:_},onClick:D,className:"absolute inset-0 bg-black/50 backdrop-blur-sm"})}),(0,n.jsxs)(d.E.div,{style:{y:T,maxHeight:"90%"},initial:S?{opacity:0}:{y:"100%"},animate:{y:0,opacity:1},exit:S?{opacity:0}:{y:"100%"},transition:S?{duration:.12}:{type:"spring",damping:30,stiffness:320,mass:.8},drag:"y",dragListener:!1,dragControls:I,dragConstraints:{top:0},dragSnapToOrigin:!0,dragMomentum:!1,dragElastic:{top:.12,bottom:.75},onDragEnd:M,ref:Z,tabIndex:-1,"aria-label":z||"상세 설정",role:"dialog","aria-modal":"true",className:(0,x.cn)("relative w-full bg-white dark:bg-[#18181b] border-t border-transparent dark:border-white/[0.08] rounded-t-2xl","flex flex-col overflow-hidden mobile-sheet-pad shadow-2xl",E),children:[(0,n.jsxs)("div",{onPointerDown:e=>{e.target.closest("button")||I.start(e)},className:"shrink-0 cursor-grab active:cursor-grabbing touch-none select-none",children:[(0,n.jsx)("div",{className:"flex justify-center pt-3 pb-2",children:(0,n.jsx)("div",{className:"w-9 h-1 rounded-full bg-zinc-400/70 dark:bg-zinc-700"})}),(0,n.jsxs)("div",{className:"flex items-center justify-between px-4 pb-2 border-b border-zinc-200/40 dark:border-zinc-800/60",children:[(0,n.jsx)("h3",{className:"text-[var(--mobile-font-h2)] font-semibold text-zinc-900 dark:text-zinc-100",children:z}),(0,n.jsx)("button",{type:"button",onClick:D,"aria-label":"닫기",className:"flex h-11 w-11 items-center justify-center rounded-lg text-zinc-600 dark:text-zinc-300",children:(0,n.jsx)(u.Z,{size:20})})]})]}),(0,n.jsx)("div",{ref:A,className:"flex-1 overflow-y-auto overflow-x-hidden px-4 pt-3 pb-2 mobile-scroll mobile-sheet-scroll",children:j}),N&&(0,n.jsx)("div",{className:"shrink-0 px-4 pt-2.5 pb-1 border-t border-zinc-100 dark:border-zinc-800/80 bg-white/95 dark:bg-[#18181b]/95 backdrop-blur-md",children:N})]})]})})}},67650:function(e,t,r){r.d(t,{h:function(){return f},k:function(){return p}});var n=r(57437),s=r(2265),a=r(92934),i=r(88501),l=r(32489),o=r(73247),c=r(51817),d=r(60850),u=r(83008),h=r(67920),x=r(93448),m=r(84519);function b(e){let{item:t}=e;return t.endDate&&t.endDate!==t.date?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{children:t.date}),(0,n.jsxs)("span",{children:["~ ",t.endDate]})]}):(0,n.jsx)("span",{children:t.date})}function f(e){let{count:t,onClose:r,className:i}=e;return(0,s.useEffect)(()=>{let e=window.setTimeout(r,3500);return()=>window.clearTimeout(e)},[r]),(0,s.useEffect)(()=>{let e=e=>{"Escape"===e.key&&r()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[r]),(0,n.jsx)("div",{className:(0,x.cn)("pointer-events-none z-[120000] flex justify-center px-4",i),children:(0,n.jsxs)("div",{className:"academic-schedule-import-toast pointer-events-auto flex min-h-12 max-w-[calc(100vw-2rem)] items-center gap-2 rounded-full border border-zinc-300 bg-white px-4 py-3 text-sm font-semibold text-zinc-950 shadow-[0_18px_50px_rgba(0,0,0,0.18)] dark:border-white/15 dark:bg-[#1C1C1E] dark:text-white dark:shadow-black/40",role:"status","aria-live":"polite",children:[(0,n.jsx)(a.Z,{size:17,className:"shrink-0 text-zinc-700 dark:text-zinc-200"}),(0,n.jsxs)("span",{className:"truncate",children:["신규 ",t,"개 일정을 가져왔습니다."]})]})})}function p(e){let{isOpen:t,onClose:r,onImported:a}=e,f=(0,h.XC)(),p=(0,s.useRef)(null),v=(0,s.useRef)({version:0}),[w,k]=(0,s.useState)(!0),[g,y]=(0,s.useState)(""),[z,j]=(0,s.useState)([]),[N,E]=(0,s.useState)(null),[C,S]=(0,s.useState)(!1),[I,T]=(0,s.useState)(!1),[_,L]=(0,s.useState)(!1),[R,D]=(0,s.useState)(!1),[Z,M]=(0,s.useState)(null),[A,H]=(0,s.useState)(()=>new Set),[P,O]=(0,s.useState)(null),X=(0,s.useCallback)(async e=>{let t=++v.current.version;L(!0),M(null),O(null);try{let r=await (0,u.X)("previewAcademicScheduleImport",{schoolCode:e.schoolCode,officeCode:e.officeCode,schoolName:e.schoolName},f,{timeout:9e4});if(t!==v.current.version)return;r.success&&r.data?(M(r.data),H(new Set)):O(r.error||"일정 목록을 불러오지 못했습니다. 다시 시도해 주세요.")}catch(e){t===v.current.version&&O("일정 목록을 불러오지 못했습니다. 다시 시도해 주세요.")}finally{t===v.current.version&&L(!1)}},[f]);(0,s.useEffect)(()=>
1{if(!t)return;let e=document.activeElement;return()=>{(null==e?void 0:e.isConnected)&&e.focus()}},[t]),(0,s.useEffect)(()=>{if(!t)return;let e=!1,r=v.current;return k(!0),L(!1),y(""),j([]),E(null),M(null),H(new Set),O(null),S(!0),(async()=>{try{let t=await (0,d.T9)(),r=t.success?t.data:null;if(!e&&(null==r?void 0:r.neisSchoolCode)&&(null==r?void 0:r.neisOfficeCode)){let e={schoolName:r.schoolName||"저장된 학교",schoolCode:r.neisSchoolCode,officeCode:r.neisOfficeCode};E(e),y(e.schoolName),k(!1),S(!1),await X(e)}}catch(t){e||O("학교 정보를 불러오지 못했습니다. 학교 이름으로 검색해 주세요.")}finally{if(!e){var t;S(!1),null===(t=p.current)||void 0===t||t.focus()}}})(),()=>{e=!0,r.version++}},[t,X]),(0,s.useEffect)(()=>{if(!t)return;let e=e=>{"Escape"===e.key&&r()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[t,r]),(0,s.useEffect)(()=>{if(!t)return;let e=g.trim();if(T(!1),e.length<2||N&&e===N.schoolName){j([]);return}let r=!1,n=setTimeout(async()=>{T(!0);try{let t=await (0,d.R2)(e);r||j(t.success?t.data:[])}catch(e){r||j([])}finally{r||T(!1)}},300);return()=>{r=!0,clearTimeout(n)}},[t,g,N]);let B=(0,s.useMemo)(()=>N?{schoolCode:N.schoolCode,officeCode:N.officeCode,schoolName:N.schoolName,startDate:null==Z?void 0:Z.summary.startDate,endDate:null==Z?void 0:Z.summary.endDate,excludedExternalIds:Array.from(A)}:null,[A,Z,N]),F=(0,s.useMemo)(()=>(null==Z?void 0:Z.items.filter(e=>"new"===e.status))||[],[Z]),U=F.filter(e=>!A.has(e.externalId)).length,J=(null==Z?void 0:Z.summary.duplicateCount)||0,V=F.length>0&&U>0,W=e=>{E(e),y(e.schoolName),k(!1),j([]),M(null),H(new Set),O(null),X(e)};(0,s.useEffect)(()=>{var e;t&&w&&!C&&(null===(e=p.current)||void 0===e||e.focus())},[t,w,C]);let q=async()=>{if(B&&Z&&N){D(!0),O(null);try{let e=await (0,u.X)("commitAcademicScheduleImport",B,f,{timeout:9e4});if(e.success&&e.data){let{schoolCode:t,officeCode:n}=N;(0,d.fk)(t,n).then(e=>{e.success&&window.dispatchEvent(new CustomEvent("school-settings-updated"))}).catch(e=>console.warn("[AcademicScheduleImportModal] Failed to sync school:",e)),r(),a(e.data.createdCount)}else O(e.error||"학사일정을 가져오지 못했습니다.")}finally{D(!1)}}},G=e=>{H(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})};return t?(0,n.jsx)("div",{className:"modal-viewport z-[120000] flex items-center justify-center bg-black/40 p-4 backdrop-blur-sm dark:bg-black/60",onClick:r,children:(0,n.jsxs)("div",{className:"w-full max-w-2xl overflow-hidden rounded-2xl border border-zinc-200 bg-white shadow-2xl dark:border-white/10 dark:bg-[#1C1C1E]",onClick:e=>e.stopPropagation(),children:[(0,n.jsxs)("div",{className:"flex items-start justify-between px-6 py-5",children:[(0,n.jsx)("div",{children:(0,n.jsxs)("div",{className:"flex items-center gap-2 text-zinc-950 dark:text-white",children:[(0,n.jsx)(i.Z,{size:18}),(0,n.jsx)("h2",{className:"text-lg font-bold",children:"우리학교 학사일정 가져오기"})]})}),(0,n.jsx)("button",{type:"button",onClick:r,className:"rounded-lg p-1.5 text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-900 dark:text-[#8E8E93] dark:hover:bg-white/10 dark:hover:text-white","aria-label":"닫기",children:(0,n.jsx)(l.Z,{size:18})})]}),(0,n.jsxs)("div",{className:"space-y-4 px-6 py-5",children:[C?(0,n.jsx)("p",{role:"status",className:"text-sm text-zinc-500",children:"저장된 학교를 확인하고 있어요."}):w?(0,n.jsxs)("div",{children:[(0,n.jsx)("label",{htmlFor:"academic-school-search",className:"mb-2 block text-xs font-medium text-zinc-500 dark:text-[#8E8E93]",children:"학교 검색"}),(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)(o.Z,{size:15,className:"pointer-events-none absolute left-3.5 top-1/2 -translate-y-1/2 text-zinc-400"}),(0,n.jsx)("input",{id:"academic-school-search",ref:p,value:g,onChange:e=>{y(e.target.value),O(null)},placeholder:"학교 이름을 입력하세요",className:"h-11 w-full rounded-xl border border-zinc-200 bg-zinc-50 pl-9 pr-10 text-sm text-zinc-950 outline-none focus:border-zinc-400 dark:border-white/10 dark:bg-[#111113] dar
1k:text-white"}),I&&(0,n.jsx)(c.Z,{size:15,"aria-label":"학교 검색 중",className:"absolute right-3.5 top-3.5 animate-spin text-zinc-400"})]}),z.length>0&&(0,n.jsx)("div",{className:"mt-2 max-h-52 overflow-y-auto rounded-xl border border-zinc-200 dark:border-white/10",children:z.map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>W(e),className:"block w-full border-b border-zinc-100 px-3 py-2.5 text-left last:border-b-0 hover:bg-zinc-50 dark:border-white/5 dark:hover:bg-white/5",children:[(0,n.jsx)("p",{className:"text-sm font-semibold text-zinc-950 dark:text-white",children:e.schoolName}),(0,n.jsx)("p",{className:"mt-0.5 text-xs text-zinc-500 dark:text-[#8E8E93]",children:e.address||e.schoolCode})]},"".concat(e.officeCode,"-").concat(e.schoolCode)))})]}):N&&(0,n.jsxs)("div",{className:"flex items-center justify-between gap-3 text-sm",children:[(0,n.jsx)("span",{className:"font-semibold text-zinc-950 dark:text-white",children:N.schoolName}),(0,n.jsx)("button",{type:"button",onClick:()=>{v.current.version++,k(!0),E(null),y(""),j([]),M(null),L(!1),T(!1),O(null)},disabled:R,className:"rounded-lg px-2 py-1.5 text-xs text-zinc-500 hover:bg-zinc-100 dark:text-zinc-400 dark:hover:bg-white/5",children:"학교 변경"})]}),_&&(0,n.jsx)("p",{role:"status",className:"text-sm text-zinc-500 dark:text-zinc-400",children:"학사일정을 불러오고 있어요."}),Z&&(0,n.jsxs)("div",{className:"rounded-xl border border-zinc-200 bg-zinc-50 dark:border-white/10 dark:bg-[#111113]",children:[(0,n.jsxs)("div",{className:"grid grid-cols-[7rem_minmax(0,1fr)_3rem] gap-3 border-b border-zinc-200 px-4 py-3 text-xs text-zinc-500 dark:border-white/10 dark:text-[#8E8E93] sm:grid-cols-[9rem_minmax(0,1fr)_3rem]",children:[(0,n.jsxs)("span",{className:"col-span-2 min-w-0 truncate",children:[U,"개 일정이 추가됩니다",J>0?" \xb7 중복 ".concat(J,"개는 자동 제외"):""]}),(0,n.jsx)("button",{type:"button",onClick:()=>{0!==F.length&&H(e=>F.some(t=>!e.has(t.externalId))?new Set(F.map(e=>e.externalId)):new Set)},className:"pr-3 text-center font-semibold transition-colors hover:text-zinc-900 dark:hover:text-white","aria-label":V?"전체 선택 해제":"전체 선택",children:"선택"})]}),(0,n.jsx)("div",{className:"max-h-72 overflow-y-auto py-1 custom-scrollbar",children:0===F.length?(0,n.jsx)("p",{className:"py-8 text-center text-sm text-zinc-500 dark:text-[#8E8E93]",children:"새로 가져올 학사일정이 없습니다."}):F.map(e=>(0,n.jsxs)("div",{className:(0,x.cn)("grid grid-cols-[7rem_minmax(0,1fr)_3rem] items-center gap-3 px-4 py-2 text-sm transition-colors hover:bg-white","dark:hover:bg-white/[0.03] sm:grid-cols-[9rem_minmax(0,1fr)_3rem]"),children:[(0,n.jsx)("span",{className:(0,x.cn)("flex flex-col text-xs leading-tight text-zinc-500 dark:text-[#8E8E93]",A.has(e.externalId)&&"opacity-45"),children:(0,n.jsx)(b,{item:e})}),(0,n.jsx)("span",{className:(0,x.cn)("min-w-0 truncate font-medium text-zinc-900 dark:text-white",A.has(e.externalId)&&"opacity-45"),children:e.title}),(0,n.jsx)("label",{className:"flex items-center justify-center",children:(0,n.jsx)("input",{type:"checkbox",checked:!A.has(e.externalId),onChange:()=>G(e.externalId),className:"h-4 w-4 rounded border-zinc-300 accent-zinc-900 focus:ring-zinc-400 dark:border-zinc-600 dark:bg-zinc-900 dark:accent-white","aria-label":"".concat(e.title," 선택")})})]},e.externalId))})]}),P&&(0,n.jsx)(m.H,{children:P})]}),(0,n.jsxs)("div",{className:"flex items-center justify-end gap-2 border-t border-zinc-200 px-6 py-4 dark:border-white/10",children:[(0,n.jsx)("button",{type:"button",onClick:r,className:"rounded-xl px-4 py-2 text-sm font-semibold text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-950 dark:text-[#8E8E93] dark:hover:bg-white/10 dark:hover:text-white",children:"닫기"}),!Z&&N?(0,n.jsx)("button",{type:"button",onClick:()=>{N&&X(N)},disabled:!N||_||R,className:"academic-schedule-import-primary rounded-xl border border-zinc-950 bg-zinc-950 px-4 py-2 text-sm font-bold text-white transition-colors hover:bg-zinc-800 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white dark:bg-white dark:text-black dark:hover:bg-white/90",children:_?"불러오는 중…":"다시 불러오기"}):Z?(0,n.jsx)("button",{type:"button",onClick:q,disabled:0===U||R||_,className:"academic-schedule-import-primary rounded-xl border border-zinc-950 bg-zinc-950 px-4 py-2 text-sm font-bold text-white transition-colors hover:bg-zinc-800 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white dark:bg-white dark:text-black dark:hover:bg-white/90",children:R?(0,n.jsx)(c.Z,{size:16,className:"animate-spin"}
1):"가져오기"}):null]})]})}):null}}}]);

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.