1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9635],{7061:function(e,t,a){(window.__NEXT_P=window.__NEXT_P||[]).push(["/admin/users",function(){return a(78723)}])},5577:function(e,t,a){"use strict";a.d(t,{x:function(){return l}});var s=a(87066);let n="/api",r="api_rate_limited_until";class i{constructor(){this.client=s.Z.create({baseURL:n,headers:{"Content-Type":"application/json"},timeout:3e4}),this.uploadClient=s.Z.create({baseURL:n,headers:{"Content-Type":"application/json"},timeout:12e4,maxBodyLength:104857600,maxContentLength:104857600});let e=e=>{let t=function(){let e=sessionStorage.getItem(r),t=e?Number(e):0;return!t||Number.isNaN(t)?0:Math.max(0,t-Date.now())}();if(t>0){let e=Error(`Rate limited. Retry after ${t}ms`);return e.code="ERR_RATE_LIMITED_COOLDOWN",e.isRateLimitedCooldown=!0,Promise.reject(e)}{let t=localStorage.getItem("admin_token")||localStorage.getItem("auth_token");t&&e.headers&&(e.headers.Authorization=`Bearer ${t}`)}return e},t=e=>{if(e.response?.status===429&&sessionStorage.setItem(r,String(Date.now()+15e3)),e.response?.status===401){localStorage.removeItem("auth_token"),localStorage.removeItem("admin_token"),localStorage.removeItem("admin_user");let e=window.location.pathname,t=e.includes("/login");e.startsWith("/admin")&&!t&&(window.location.href="/admin/login")}return Promise.reject(e)};this.client.interceptors.request.use(e,e=>Promise.reject(e)),this.client.interceptors.response.use(e=>e,t),this.uploadClient.interceptors.request.use(e,e=>Promise.reject(e)),this.uploadClient.interceptors.response.use(e=>e,t)}async requestPresignedUrl(e){return(await this.client.post("/upload/presigned",e)).data}async completeUpload(e){return(await this.client.post("/upload/complete",e)).data}async getMediaFiles(e){return(await this.client.get("/upload",{params:e})).data}async getMediaFile(e){return(await this.client.get(`/upload/${e}`)).data}async updateMediaFile(e,t){return(await this.client.put(`/upload/${e}`,t)).data}async deleteMediaFile(e){return(await this.client.delete(`/upload/${e}`)).data}async batchDeleteMediaFiles(e){return(await this.client.post("/upload/batch-delete",{ids:e})).data}async getStorageStats(e){return(await this.client.get("/upload/stats",{params:{folder:e}})).data}async getBlogArticles(e){return(await this.client.get("/blog/articles",{params:e})).data}async getBlogArticle(e){return(await this.client.get(`/blog/articles/${e}`)).data}async getBlogArticleBySlug(e){return(await this.client.get(`/blog/slug/${e}`)).data}async createBlogArticle(e){return(await this.client.post("/blog/articles",e)).data}async updateBlogArticle(e,t){return(await this.client.put(`/blog/articles/${e}`,t)).data}async deleteBlogArticle(e){return(await this.client.delete(`/blog/articles/${e}`)).data}async getBlogCategories(e){return(await this.client.get("/blog/categories",{params:{is_active:e}})).data}async getBlogTags(){return(await this.client.get("/blog/tags")).data}async getCurrentUser(){return(await this.client.get("/admin-users/me")).data}async getAdminUsers(){return(await this.client.get("/admin-users")).data}async getAdminUser(e){return(await this.client.get(`/admin-users/${e}`)).data}async createAdminUser(e){return(await this.client.post("/admin-users",e)).data}async updateAdminUser(e,t){return(await this.client.put(`/admin-users/${e}`,t)).data}async toggleAdminUserStatus(e){return(await this.client.patch(`/admin-users/${e}/toggle-active`)).data}async deleteAdminUser(e){return(await this.client.delete(`/admin-users/${e}`)).data}async uploadToS3(e,t,a){return await s.Z.put(e,t,{headers:{"Content-Type":a},onUploadProgress:e=>{e.total&&(e.loaded,e.total)}})}async getFocusSeoEntries(e){return(await this.client.get("/focus-seo",{params:e})).data}async getFocusSeoById(e){return(await this.client.get(`/focus-seo/${e}`)).data}async getFocusSeoByKeyword(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];return(await this.client.get(`/focus-seo/keyword/${encodeURIComponent(e)}`,{params:{is_active:t}})).data}async getFocusSeoBySlug(e){return(await this.client.get(`/focus-seo/slug/${encodeURIComponent(e)}`)).data}async getFocusSeoByArticleId(e){return(await this.client.get(`/focus-seo/article/${e}`)).data}async getRelatedArticlesByKeyword(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;return(await this.client.get(`/focus-seo/related/${encodeURIComponent(e)}`,{params:{exclude_slug:t,limit:a}})).data}async getFocusSeoKeywordStats(){return(await this.client.get("/focus-seo/stats/keywords")).data}async createFocusSeo(e){return(await this.client.post("/focus-seo",e)).data}
1async syncFocusSeoForArticle(e,t,a){return(await this.client.post(`/focus-seo/sync/${e}`,{slug:t,keywords:a})).data}async updateFocusSeo(e,t){return(await this.client.put(`/focus-seo/${e}`,t)).data}async toggleFocusSeoActive(e){return(await this.client.put(`/focus-seo/${e}/toggle`)).data}async deleteFocusSeo(e){return(await this.client.delete(`/focus-seo/${e}`)).data}async deleteFocusSeoByArticleId(e){return(await this.client.delete(`/focus-seo/article/${e}`)).data}}let l=new i;t.Z=l},60322:function(e,t,a){"use strict";a.d(t,{_:function(){return s},u:function(){return n}});let s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"vi",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"vi";if(!e)return"";if("string"==typeof e)return e;let s=e[t];if(s&&s.trim())return s;let n=e[a];return n&&n.trim()?n:e.vi||e.en||""},n=e=>e?"string"==typeof e?{vi:e,en:"",zh:""}:{vi:e.vi||"",en:e.en||"",zh:e.zh||"",...e}:{vi:"",en:"",zh:""}},78723:function(e,t,a){"use strict";a.r(t),a.d(t,{__N_SSP:function(){return v},default:function(){return N}});var s=a(85893),n=a(67294),r=a(9008),i=a.n(r),l=a(25675),c=a.n(l),d=a(11163),o=a(29882),u=a(31412),m=a(14879),h=a(40971),g=a(2066),x=a(5577),y=a(3628),p=a(51740),f=a(30190),j=a(60322);let w=e=>{if(Array.isArray(e))return e;if(!e||"object"!=typeof e)return[];let t=e.data;if(Array.isArray(t))return t;let a=e.users;if(Array.isArray(a))return a;let s=e.items;return Array.isArray(s)?s:[]},b=e=>{if(!e||"object"!=typeof e)return null;if("id"in e&&"role"in e)return e;let t=e.data;return t&&"object"==typeof t&&"id"in t&&"role"in t?t:null};var v=!0;function N(){let{showToast:e}=(0,h.p)(),t=(0,d.useRouter)(),{locale:a}
1=t,r=(0,y.NL)(),[l,v]=(0,n.useState)(""),[N,_]=(0,n.useState)(!1),[k,A]=(0,n.useState)(!1),[S,C]=(0,n.useState)(null),[$,T]=(0,n.useState)(null),[F,U]=(0,n.useState)(null);(0,n.useEffect)(()=>{(async()=>{try{let e=await x.x.getCurrentUser();U(b(e))}catch(e){}})()},[]);let{data:B,isLoading:D}=(0,p.a)({queryKey:["admin-users"],queryFn:async()=>await x.x.getAdminUsers()}),I=(0,f.D)({mutationFn:e=>x.x.toggleAdminUserStatus(e),onSuccess:()=>{r.invalidateQueries({queryKey:["admin-users"]}),e("success","â
Cáºp nháºt trạng th\xe1i t\xe0i khoản th\xe0nh c\xf4ng!")},onError:t=>{e("error",`â ${t?.response?.data?.message||"Cáºp nháºt thất bại"}`)}}),Z=(0,f.D)({mutationFn:e=>x.x.deleteAdminUser(e),onSuccess:()=>{r.invalidateQueries({queryKey:["admin-users"]}),e("success","\uD83D\uDDD1ï¸ T\xe0i khoản Ä\xe3 ÄÆ°á»£c x\xf3a!")},onError:t=>{e("error",`â ${t?.response?.data?.message||"X\xf3a thất bại"}`)}}),E=w(B),R=F?.role==="admin",L=E.filter(e=>(0,j._)(e.full_name,a).toLowerCase().includes(l.toLowerCase())||e.email.toLowerCase().includes(l.toLowerCase())),K=(e,t,a)=>{T({id:e,name:t,is_active:a}),A(!0)},M=async()=>{if($)try{await I.mutateAsync($.id)}finally{A(!1),T(null)}},z=(e,t)=>{C({id:e,name:t}),_(!0)},P=async()=>{if(S)try{await Z.mutateAsync(S.id)}finally{_(!1),C(null)}},q=e=>(0,s.jsxs)("span",{className:`px-3 py-1 rounded-full text-xs font-medium border ${{admin:"bg-red-100 text-red-800 border-red-200",employee:"bg-blue-100 text-blue-800 border-blue-200"}[e]}`,children:[(0,s.jsx)(o.Z,{name:"shield",className:"w-3 h-3 inline mr-1"}),{admin:"Admin",employee:"Employee"}[e]]}),O=e=>e?(0,s.jsxs)("span",{className:"px-3 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800 border border-green-200",children:[(0,s.jsx)(o.Z,{name:"unlock",className:"w-3 h-3 inline mr-1"}),"Hoạt Äá»ng"]}):(0,s.jsxs)("span",{className:"px-3 py-1 rounded-full text-xs font-medium bg-gray-100 text-gray-800 border border-gray-200",children:[(0,s.jsx)(o.Z,{name:"lock",className:"w-3 h-3 inline mr-1"}),"Ä\xe3 kh\xf3a"]});return(0,s.jsxs)(u.default,{title:"Quản l\xfd T\xe0i khoản",children:[(0,s.jsxs)(i(),{children:[(0,s.jsx)("title",{children:"Quản l\xfd T\xe0i khoản - RedAI Admin"}),(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})]}),(0,s.jsxs)("div",{className:"mx-auto",children:[(0,s.jsxs)("div",{className:"mb-6 flex items-center justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{className:"text-2xl font-bold text-gray-900",children:"Quản L\xfd T\xe0i Khoản Admin"}),(0,s.jsx)("p",{className:"text-gray-600 mt-1",children:"Quản l\xfd ngưá»i d\xf9ng quản trá» há» thá»ng"})]}),R&&(0,s.jsxs)(m.zx,{onClick:()=>t.push("/admin/users/new"),variant:"primary",children:[(0,s.jsx)(o.Z,{name:"plus",className:"w-4 h-4 mr-2"}),"Th\xeam T\xe0i Khoản"]})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6",children:[(0,s.jsx)("div",{className:"bg-gradient-to-br from-red-50 to-red-100 rounded-lg p-6 border border-red-200",children:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-red-600 text-sm font-medium",children:"Tá»ng Admin"}),(0,s.jsx)("div",{className:"text-3xl font-bold text-red-900 mt-2",children:E.filter(e=>"admin"===e.role).length})]}),(0,s.jsx)(o.Z,{name:"shield",className:"w-12 h-12 text-red-300"})]})}),(0,s.jsx)("div",{className:"bg-gradient-to-br from-blue-50 to-blue-100 rounded-lg p-6 border border-blue-200",children:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-blue-600 text-sm font-medium",children:"Tá»ng Employee"}),(0,s.jsx)("div",{className:"text-3xl font-bold text-blue-900 mt-2",children:E.filter(e=>"employee"===e.role).length})]}),(0,s.jsx)(o.Z,{name:"user",className:"w-12 h-12 text-blue-300"})]})}),(0,s.jsx)("div",{className:"bg-gradient-to-br from-green-50 to-green-100 rounded-lg p-6 border border-green-200",children:(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-green-600 text-sm font-medium",children:"Äang hoạt Äá»ng"}),(0,s.jsx)("div",{className:"text-3xl font-bold text-green-900 mt-2",children:E.filter(e=>e.is_active).length})]}),(0,s.jsx)(o.Z,{name:"unlock",className:"w-12 h-12 text-green-300"})]})})]}),(0,s.jsx)("div",{className:"bg-white rounded-lg shadow-sm border border-gray-200 p-4 mb-6",children:(0,s.jsx)(m.II,{type:"text",value:l,onCh
1ange:e=>v(e.target.value),placeholder:"\uD83D\uDD0D T\xecm kiếm theo t\xean hoặc email..."})}),D&&(0,s.jsxs)("div",{className:"bg-white rounded-lg shadow-sm border border-gray-200 p-12 text-center",children:[(0,s.jsx)("div",{className:"inline-block animate-spin rounded-full h-12 w-12 border-4 border-gray-200 border-t-red-500"}),(0,s.jsx)("p",{className:"mt-4 text-gray-600",children:"Äang tải..."})]}),!D&&L.length>0&&(0,s.jsx)("div",{className:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden",children:(0,s.jsx)("div",{className:"overflow-x-auto",children:(0,s.jsxs)("table",{className:"w-full",children:[(0,s.jsx)("thead",{className:"bg-gray-50 text-left text-sm font-medium text-gray-600",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{className:"px-6 py-4",children:"T\xean"}),(0,s.jsx)("th",{className:"px-6 py-4",children:"Vai tr\xf2"}),(0,s.jsx)("th",{className:"px-6 py-4",children:"Trạng th\xe1i"}),(0,s.jsx)("th",{className:"px-6 py-4",children:"ÄÄng nháºp gần nhất"}),(0,s.jsx)("th",{className:"px-6 py-4 text-right",children:"Thao t\xe1c"})]})}),(0,s.jsx)("tbody",{className:"divide-y divide-gray-200",children:L.map(e=>(0,s.jsxs)("tr",{className:"hover:bg-gray-50 transition-colors",children:[(0,s.jsx)("td",{className:"px-6 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-3",children:[e.avatar_url?(0,s.jsx)("div",{className:"w-10 h-10 rounded-full overflow-hidden border-2 border-gray-200 bg-gray-100",children:(0,s.jsx)(c(),{src:e.avatar_url,alt:(0,j._)(e.full_name,a),width:40,height:40,className:"w-full h-full object-cover"})}):(0,s.jsx)("div",{className:"w-10 h-10 rounded-full bg-gradient-to-br from-red-400 to-orange-500 flex items-center justify-center text-white font-semibold text-sm",children:(0,j._)(e.full_name,a).charAt(0).toUpperCase()}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:" flex items-center justify-start space-x-1",children:[(0,s.jsx)("div",{className:"font-medium text-gray-900",children:(0,j._)(e.full_name,a)}),e.id===F?.id&&(0,s.jsx)("span",{className:"text-xs text-orange-600 font-medium",children:"(Bạn)"})]}),(0,s.jsx)("span",{className:"text-gray-600 text-sm",children:e.email})]})]})}),(0,s.jsx)("td",{className:"px-6 py-4",children:q(e.role)}),(0,s.jsx)("td",{className:"px-6 py-4",children:O(e.is_active)}),(0,s.jsx)("td",{className:"px-6 py-4",children:(0,s.jsxs)("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[(0,s.jsx)(o.Z,{name:"clock",className:"w-4 h-4"}),e.last_login_at?(0,g.WU)(new Date(e.last_login_at),"dd/MM/yyyy HH:mm"):"Chưa ÄÄng nháºp"]})}),(0,s.jsx)("td",{className:"px-6 py-4",children:(0,s.jsxs)("div",{className:"flex items-center justify-end gap-2",children:[(R||e.id===F?.id)&&(0,s.jsx)(m.zx,{variant:"secondary",onClick:()=>t.push(`/admin/users/${e.id}/edit`),className:"text-sm",children:(0,s.jsx)(o.Z,{name:"edit",className:"w-3 h-3 mr-1"})}),R&&e.id!==F?.id&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(m.zx,{variant:"secondary",onClick:()=>K(e.id,(0,j._)(e.full_name,a),e.is_active),className:"text-sm",children:e.is_active?(0,s.jsx)(s.Fragment,{children:(0,s.jsx)(o.Z,{name:"lock",className:"w-3 h-3 mr-1"})}):(0,s.jsx)(s.Fragment,{children:(0,s.jsx)(o.Z,{name:"unlock",className:"w-3 h-3 mr-1"})})}),(0,s.jsx)(m.zx,{variant:"danger",onClick:()=>z(e.id,(0,j._)(e.full_name,a)),className:"text-sm",children:(0,s.jsx)(o.Z,{name:"trash",className:"w-3 h-3 mr-1"})})]})]})})]},e.id))})]})})}),!D&&0===L.length&&(0,s.jsxs)("div",{className:"bg-white rounded-lg shadow-sm border border-gray-200 p-12 text-center",children:[(0,s.jsx)(o.Z,{name:"user",className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),(0,s.jsx)("h3",{className:"text-lg font-medium text-gray-900 mb-2",children:"Kh\xf4ng t\xecm thấy t\xe0i khoản"}),(0,s.jsx)("p",{className:"text-gray-600",children:l?"Thá» t\xecm kiếm vá»i từ kh\xf3a kh\xe1c":"Chưa c\xf3 t\xe0i khoản n\xe0o trong há» thá»ng"})]}),(0,s.jsx)(m.sm,{isOpen:N,onClose:()=>_(!1),onConfirm:P,title:"X\xe1c nháºn x\xf3a t\xe0i khoản",message:`Bạn c\xf3 chắc chắn muá»n x\xf3a t\xe0i khoản "${S?.name}"? H\xe0nh Äá»ng n\xe0y kh\xf4ng thá» ho\xe0n t\xe1c.`,confirmText:"X\xf3a",cancelText:"Há»§y",variant:"danger"}),(0,s.jsx)(m.sm,{isOpen:k,onClose:()=>A(!1),onConfirm:M,title:`X\xe1c nháºn ${$?.is_active?"kh\xf3a":"má» kh\xf3a"} t\xe0i khoản`,message:`Bạn c\xf3 chắc chắn muá»n ${$?.is_active?"kh\xf3a":"má» kh\xf3a"} t\xe0i khoản "${$?.name}"?`,confirmText:$?.is_active?"Kh\xf3a":"Má» kh\xf3a",cancelText:"Há»§y",variant:$?.is_active?"danger":"primary"})]})]})}}},function(e){e.O(0,[1664,5675,7066,1740,6227,9882,1412,4879,2888,9774,179],function(){return e(e.s=7061)}),_N_E=e.O()}]);
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.