1import{N as W,ax as X,b as Y,T as Z,r as l,V as ee,ay as U,j as e,z as H,c as se,B as x,at as z,w as re,ap as ie,az as te,ao as ae,D as ne,E as le,J as oe,K as ce,f as de,aw as ue,s as j,av as d}from"./index-B2APkhoi.js";import{I as w}from"./input-CQAW836h.js";import{L as N}from"./label-nq2CrdXp.js";import{T as he}from"./textarea-C8MbzFir.js";import{A as me,b as xe,c as ge,d as pe,e as fe,f as je,g as ve,h as ye}from"./alert-dialog-CRVb5Xpj.js";import{S as P,a as M,b as O,c as B,d as p}from"./select-DW6Kyf27.js";import{d as F,R as be,n as D,i as A}from"./repoLinks-Cr1hLlh5.js";import{A as Ne}from"./arrow-left-BKQnevzw.js";import{P as we}from"./plus-CktZjkfy.js";import{P as Ce}from"./pencil-Cj0A8aWD.js";import{T as ke}from"./trash-2-DDuI5w-s.js";import"./index-BdQq_4o_.js";import"./index-Uvqmv1yD.js";import"./chevron-up-BGQh3zny.js";const f="__all__",_e={title:"",description:"",category:"기í",url:"",display_order:0,is_hidden:!1},Ue=()=>{const{user:C,loading:v}=W(),{isAdmin:y,loading:k}=X(),b=Y(),u=Z();l.useEffect(()=>{!v&&!C&&b("/auth")},[v,C,b]);const[i,_]=l.useState(""),[g,E]=l.useState(f),[o,h]=l.useState(f),[S,r]=l.useState(null),[a,m]=l.useState(null),{data:n=[],isLoading:V}=ee({queryKey:["admin-github-links"],queryFn:async()=>{const{data:s,error:t}=await j.from("github_links").select("*").order("display_order");if(t)throw t;return s},enabled:!!y}),q=l.useMemo(()=>{const s=new Set;return n.forEach(t=>s.add(t.category||"기í")),Array.from(s)},[n]),R=l.useMemo(()=>{const s=i.trim().toLowerCase();return n.filter(t=>g!==f&&(t.category||"기í")!==g||o!==f&&F(t.url)!==o?!1:s?t.title.toLowerCase().includes(s)||t.description.toLowerCase().includes(s)||t.url.toLowerCase().includes(s):!0)},[n,i,g,o]),L=l.useMemo(()=>{const s={github:0,huggingface:0,other:0};return n.forEach(t=>{s[F(t.url)]+=1}),s},[n]),G=U({mutationFn:async s=>{var Q,T;if(!((Q=s.url)!=null&&Q.trim()))throw new Error("URLì íìì
ëë¤");if(!((T=s.title)!=null&&T.trim()))throw new Error("ì 목ì íìì
ëë¤");if(!A(s.url))throw new Error("GitHub ëë Hugging Face ë§í¬ë§ ë±ë¡í ì ììµëë¤");const t=D(s.url);if(!t)throw new Error("URLì íì¸í´ì£¼ì¸ì");const I=n.find(c=>D(c.url)===t&&c.id!==s.id);if(I)throw new Error(`ì´ë¯¸ ë±ë¡ë ë§í¬ì
ëë¤: ${I.title}`);const K={title:s.title.trim(),description:s.description??"",category:(s.category||"기í").trim(),url:s.url.trim(),display_order:s.display_order??0,is_hidden:!!s.is_hidden};if(s.id){const{error:c}=await j.from("github_links").update(K).eq("id",s.id);if(c)throw c.code==="23505"?new Error("ì´ë¯¸ ë±ë¡ë ë§í¬ì
ëë¤"):c}else{const{error:c}=await j.from("github_links").insert(K);if(c)throw c.code==="23505"?new Error("ì´ë¯¸ ë±ë¡ë ë§í¬ì
ëë¤"):c}},onSuccess:()=>{d.success("ì ì¥ëììµëë¤"),u.invalidateQueries({queryKey:["admin-github-links"]}
1),u.invalidateQueries({queryKey:["github-links"]}),r(null)},onError:s=>d.error(s.message)}),$=U({mutationFn:async s=>{const{error:t}=await j.from("github_links").delete().eq("id",s);if(t)throw t},onSuccess:()=>{d.success("ìì ëììµëë¤"),u.invalidateQueries({queryKey:["admin-github-links"]}),u.invalidateQueries({queryKey:["github-links"]}),m(null)},onError:s=>d.error(s.message)}),J=async s=>{const{error:t}=await j.from("github_links").update({is_hidden:!s.is_hidden}).eq("id",s.id);if(t)return d.error(t.message);u.invalidateQueries({queryKey:["admin-github-links"]}),u.invalidateQueries({queryKey:["github-links"]})};return v||k?e.jsx("div",{className:"min-h-screen flex items-center justify-center",children:e.jsx(H,{className:"size-6 animate-spin text-muted-foreground"})}):y?e.jsxs("div",{className:"min-h-screen bg-background",children:[e.jsx(se,{}),e.jsxs("main",{className:"container mx-auto px-4 pt-24 pb-12 max-w-7xl",children:[e.jsxs("div",{className:"flex items-center justify-between mb-6 flex-wrap gap-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(x,{variant:"ghost",size:"sm",onClick:()=>b(-1),children:[e.jsx(Ne,{className:"size-4 mr-1"})," ë¤ë¡"]}),e.jsx("h1",{className:"text-2xl font-bold",children:"GitHub · Hugging Face ë§í¬ ê´ë¦¬"}),e.jsxs(z,{variant:"secondary",children:[n.length,"ê°"]})]}),e.jsxs(x,{size:"sm",onClick:()=>r({..._e,display_order:n.length}),children:[e.jsx(we,{className:"size-4 mr-1"})," ì ë§í¬"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-3 mb-5",children:[e.jsxs("div",{className:"relative flex-1 min-w-[220px]",children:[e.jsx(re,{className:"absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground"}),e.jsx(w,{value:i,onChange:s=>_(s.target.value),placeholder:"ì 목·ì¤ëª
·URL ê²ì",className:"pl-9"})]}),e.jsxs(P,{value:o,onValueChange:s=>h(s),children:[e.jsx(M,{className:"w-[200px]",children:e.jsx(O,{})}),e.jsxs(B,{children:[e.jsxs(p,{value:f,children:["ì ì²´ ìì¤ (",n.length,")"]}),e.jsxs(p,{value:"github",children:["GitHub (",L.github,")"]}),e.jsxs(p,{value:"huggingface",children:["Hugging Face (",L.huggingface,")"]}),L.other>0&&e.jsxs(p,{value:"other",children:["기í (",L.other,")"]})]})]}),e.jsxs(P,{value:g,onValueChange:E,children:[e.jsx(M,{className:"w-[200px]",children:e.jsx(O,{})}),e.jsxs(B,{children:[e.jsx(p,{value:f,children:"ì ì²´ ì¹´í
ê³ ë¦¬"}),q.map(s=>e.jsx(p,{value:s,children:s},s))]})]})]}),V?e.jsx("div",{className:"py-20 flex justify-center",children:e.jsx(H,{className:"size-6 animate-spin text-muted-foreground"})}):e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[R.map(s=>e.jsxs("div",{className:"bg-card rounded-lg border border-border p-3 flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx(z,{variant:"outline",className:"text-[10px]",children:be[F(s.url)]}),e.jsx(z,{variant:"secondary",className:"text-[10px]",children:s.category||"기í"}),s.is_hidden&&e.jsx(z,{variant:"outline",className:"text-[10px]",children:"ì¨ê¹"}),e.jsxs("span",{className:"text-[10px] text-muted-foreground ml-auto",children:["#",s.display_order]})]}),e.jsx("h3",{className:"text-sm font-semibold line-clamp-2",children:s.title}),e.jsx("p",{className:"text-xs text-muted-foreground line-clamp-3 flex-1 whitespace-pre-wrap",children:s.description}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-primary hover:underline truncate inline-flex items-center gap-1",children:[e.jsx(ie,{className:"size-3"})," ",s.url]}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(x,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:()=>r(s),children:e.jsx(Ce,{className:"size-3.5"})}),e.jsx(x,{size:"sm",variant:"ghost",className:"h-7 px-2",onClick:()=>J(s),children:s.is_hidden?e.jsx(te,{className:"size-3.5"}):e.jsx(ae,{className:"size-3.5"})}),e.jsx(x,{size:"sm",variant:"ghost",className:"h-7 px-2 text-destructive hover:text-destructive",onClick:()=>m(s.id),children:e.jsx(ke,{className:"size-3.5"})})]})]},s.id)),R.length===0&&e.jsx("p",{className:"text-center text-muted-foreground py-12 col-span-full",children:"ê²°ê³¼ê° ììµëë¤."})]})]}),S&&e.jsx(Ee,{value:S,categories:q,existing:n,onClose:()=>r(null),onSave:s=>G.mutate(s),saving:G.isPending}),e.jsx(me,{open:!!a,onOpenChange:s=>!s&&m(null),children:e.jsxs(xe,{children:[e.jsxs(ge,{children:[e.jsx(pe,{children:"ë§í¬ë¥¼ ìì í ê¹ì?"}),e.jsx(fe,{children:"ëë릴 ì ììµëë¤."})]}),e.jsxs(je,{children:[e.jsx(ve,{children:"ì·¨ì"}),e.jsx(ye,{onClick:()=>a&&$.mutate(a),children:"ìì "})]})]})})]}):e.jsx("div",{className:"min-h-screen flex items-center justify-center",children:e.jsx("p",{className:"text-muted-foreground",children:"ê´ë¦¬ìë§ ì ê·¼í ì ììµëë¤."})})};function Ee({value:C,categories:v,existing:y,onClose:k,onSave:b,saving:u}){const[i,_]=l.useState(C),[g,E]=l.useState(!1),o=(r,a)=>_(m=>({...m,[r]:a})),h=l.useMemo(()=>{const r=D(i.url??"");return r?y.find(a=>D(a.url)===r&&a.id!==i.id)??null:null},[i.url,i.id,y]),S=async()=>{var r;if(!((r=i.url)!=null&&r.trim()))return d.error("먼ì URLì ì
ë ¥íì¸ì");if(!A(i.url))return d.error("GitHub ëë Hugging Face ë§í¬ë§ ì§ìí©ëë¤");if(h)return d.error(`ì´ë¯¸ ë±ë¡ë ë§í¬ì
ëë¤: ${h.title}`);E(!0);try{const{data:a,error:m}=await j.functions.invoke("enrich-repo-link",{body:{url:i.url.trim()}});if(m)throw m;if(a!=null&&a.error)throw new Error(a.error);_(n=>
1({...n,title:a.title||n.title,description:a.description||n.description,category:a.category||n.category||"기í"})),d.success("AIê° ì 보를 ì±ì ìµëë¤")}catch(a){d.error(a.message)}finally{E(!1)}};return e.jsx(ne,{open:!0,onOpenChange:r=>!r&&k(),children:e.jsxs(le,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsx(oe,{children:e.jsx(ce,{children:i.id?"ë§í¬ ìì ":"ì ë§í¬ (GitHub · Hugging Face)"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(N,{children:"ë í¬ URL (GitHub · Hugging Face)"}),e.jsxs("div",{className:"flex gap-2 mt-1",children:[e.jsx(w,{value:i.url??"",onChange:r=>o("url",r.target.value),placeholder:"https://github.com/owner/repo ëë https://huggingface.co/owner/model"}),e.jsxs(x,{type:"button",onClick:S,disabled:g||!!h,variant:"secondary",children:[g?e.jsx(H,{className:"size-4 animate-spin"}):e.jsx(de,{className:"size-4 mr-1"}),"AI ìëì±ì"]})]}),h?e.jsxs("p",{className:"text-xs text-destructive mt-1.5",children:["ì´ë¯¸ ë±ë¡ë ë§í¬ì
ëë¤: ",h.title]}):i.url&&!A(i.url)?e.jsx("p",{className:"text-xs text-destructive mt-1.5",children:"GitHub ëë Hugging Face ë§í¬ë§ ë±ë¡í ì ììµëë¤"}):null]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-[1fr_180px_120px] gap-3",children:[e.jsxs("div",{children:[e.jsx(N,{children:"í목ëª
"}),e.jsx(w,{value:i.title??"",onChange:r=>o("title",r.target.value)})]}),e.jsxs("div",{children:[e.jsx(N,{children:"ì¹´í
ê³ ë¦¬(ìë¹ì¤)"}),e.jsx(w,{value:i.category??"",onChange:r=>o("category",r.target.value),placeholder:"ì: í´ë¡ë / ì½ë±ì¤ / 기í",list:"gh-cats"}),e.jsx("datalist",{id:"gh-cats",children:v.map(r=>e.jsx("option",{value:r},r))})]}),e.jsxs("div",{children:[e.jsx(N,{children:"ì ë ¬"}),e.jsx(w,{type:"number",value:i.display_order??0,onChange:r=>o("display_order",Number(r.target.value))})]})]}),e.jsxs("div",{children:[e.jsx(N,{children:"ë©ëª¨ / íêµì´ ìì½"}),e.jsx(he,{rows:6,value:i.description??"",onChange:r=>o("description",r.target.value),placeholder:"ì´ ë í¬ê° 무ìì íëì§ íë ë¬¸ì¥ + â
ë³í ì"})]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:!!i.is_hidden,onChange:r=>o("is_hidden",r.target.checked)}),"ì¨ê¹ ì²ë¦¬"]})]}),e.jsxs(ue,{children:[e.jsx(x,{variant:"ghost",onClick:k,children:"ì·¨ì"}),e.jsxs(x,{onClick:()=>b(i),disabled:u||!!h||!i.url||!A(i.url),children:[u&&e.jsx(H,{className:"size-4 animate-spin mr-1"}),"ì ì¥"]})]})]})})}export{Ue as default};
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.