1import{c as L,s as P,P as Q,r as m,u as y,F as b,j as e,C,h as k,i as T,d as S,A as j,I as q,J as $,B as E,x as D,T as K,t as I}from"./index-B1Dqzo5J.js";import{B as u}from"./badge-BMocXsDX.js";import{u as _}from"./use-accounts-pTj67hgz.js";import{C as M}from"./circle-check-BWAwCnof.js";import{C as O}from"./clock-vYorjXDH.js";import{T as H}from"./trash-2-CkEccJ5c.js";import{f as U}from"./formatDistanceToNow-HYtYLUgw.js";import"./routes-DmFrXDg0.js";import"./en-US-BddybvhD.js";const z=L("Repeat2",[["path",{d:"m2 9 3-3 3 3",key:"1ltn5i"}],["path",{d:"M13 18H7a2 2 0 0 1-2-2V6",key:"1r6tfw"}],["path",{d:"m22 15-3 3-3-3",key:"4rnwn2"}],["path",{d:"M11 6h6a2 2 0 0 1 2 2v10",key:"2f72bc"}]]);function J(i){const s=String(i||"").trim();if(!s)return null;if(/^\d{5,25}$/.test(s))return s;const c=s.match(/(?:^|https?:\/\/)(?:www\.)?(?:mobile\.)?(?:x|twitter)\.com\/[^/]+\/status(?:es)?\/(\d{5,25})/i);return c?c[1]:null}function ae(){const{toast:i}=P(),s=Q(),{data:c}=_(),[o,w]=m.useState(""),[N,f]=m.useState(""),[a,x]=m.useState([]),[h,v]=m.useState(null),{data:p}=y({queryKey:["/api/retweets"],refetchInterval:1e4}),{data:R}=y({queryKey:[`/api/retweets/${h}`],enabled:!!h,refetchInterval:1e4}),n=(c||[]).filter(t=>t.isActive),d=J(o),B=!!d&&a.length>0,g=b({mutationFn:async()=>(await I("POST","/api/retweets",{tweetUrl:o,accountIds:a,note:N})).json(),onSuccess:t=>{i({title:"Queued",description:`${t.accounts} account${t.accounts===1?"":"s"} will retweet it.`}),w(""),f(""),x([]),s.invalidateQueries({queryKey:["/api/retweets"]})},onError:t=>i({title:"Could not queue",description:t.message,variant:"destructive"})}),A=b({mutationFn:async t=>(await I("DELETE",`/api/retweets/${t}`)).json(),onSuccess:()=>{i({title:"Campaign deleted"}),v(null),s.invalidateQueries({queryKey:["/api/retweets"]})}}),F=t=>x(l=>l.includes(t)?l.filter(r=>r!==t):[...l,t]);return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-3xl font-display font-bold flex items-center gap-3",children:[e.jsx(z,{className:"h-8 w-8 text-primary"}),"Retweet Bot"]}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"Paste a tweet and pick which of your connected accounts should retweet it. Each retweet runs from that account's own browser session, spaced out like normal use."})]}),e.jsxs(C,{children:[e.jsx(k,{children:e.jsx(T,{className:"text-lg",children:"New retweet"})}),e.jsxs(S,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{htmlFor:"tweet-url",children:"Tweet link"}),e.jsx(q,{id:"tweet-url",placeholder:"https://x.com/someone/status/1839283845678901234",value:o,onChange:t=>w(t.target.value)}),o&&!d&&e.jsx("p",{className:"text-xs text-destructive",children:"That does not look like a link to a tweet."}),d&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Tweet ",d]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{htmlFor:"rt-note",children:"Note (optional)"}),e.jsx(q,{id:"rt-note",placeholder:"What this is for",value:N,onChange:t=>f(t.target.value),maxLength:200})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(j,{children:"Accounts"}),e.jsx("button",{type:"button",className:"text-xs text-primary hover:underline",onClick:()=>x(a.length===n.length?[]:n.map(t=>t.id)),children:a.length===n.length&&n.length>0?"Clear all":"Select all"})]}),n.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"No connected accounts."}):e.jsx("div",{className:"grid grid-cols-2 lg:grid-cols-3 gap-2",children:n.map(t=>e.jsxs("label",{className:"flex items-center gap-2 rounded-md border border-border/50 px-3 py-2 cursor-pointer hover:bg-muted/40",children:[e.jsx($,{checked:a.includes(t.id),onCheckedChange:()=>F(t.id)}),e.jsxs("span",{className:"text-sm truncate",children:["@",t.handle]})]},t.id))})]}),e.jsxs(E,{disabled:!B||g.isPending,onClick:()=>g.mutate(),children:[g.isPending&&e.jsx(D,{className:"h-4 w-4 mr-2 animate-spin"}),"Retweet from ",a.length||0," account",a.length===1?"":"s"]})]})]}),e.jsxs(C,{children:[e.jsx(k,{children:e.jsx(T,{className:"text-lg",children:"Campaigns"})}),e.jsx(S,{children:!p||p.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:"Nothing queued yet."}):e.jsx("div",{className:"space-y-2",children:p.map(t=>{const l=h===t.id;return e.jsxs("div",{className:"rounded-lg border border-border/50",children:[e.jsxs("div",{className:"flex items-center gap-3 p-3",children:[e.jsxs("button",{className:"flex-1 min-w-0 text-left",onClick:()=>v(l?null:t.id),children:[e.jsx("p",{className:"text-sm font-medium truncate",children:t.note||t.tweet_url}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[U(new Date(t.created_at))," ago · ",t.total," account",t.total==="1"?"":"s"]})]}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[Number(t.retweeted)>0&&e.jsxs(u,{variant:"outline",className:"text-xs gap-1 border-emerald-500/40 text-emerald-600",children:[e.jsx(M,{className:"h-3 w-3"}),t.retweeted]}),Number(t.pending)>0&&e.jsxs(u,{variant:"outline",className:"text-xs gap-1",children:[e.jsx(O,{className:"h-3 w-3"}),t.pending]}),Number(t.failed)>0&&e.jsxs(u,{variant:"outline",className:"text-xs gap-1 border-destructive/40 text-destructive",children:[e.jsx(K,{className:"h-3 w-3"}),t.failed]}),e.jsx(E,{size:"icon",variant:"ghost",className:"text-muted-foreground hover:text-destructive",onClick:()=>A.mutate(t.id),title:"Delete campaign",children:e.jsx(H,{className:"h-4 w-4"})})]})]}),l&&e.jsx("div",{className:"border-t border-border/40 px-3 py-2 space-y-1",children:(R||[]).map(r=>e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsxs("span",{className:"w-40 truncate",children:["@",r.handle]}),e.jsx(u,{variant:"outline",className:"text-xs",children:r.status}),r.error_message&&e.jsx("span",{className:"text-destructive truncate",children:r.error_message})]},r.id))})]},t.id)})})})]})]})}export{ae 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.