(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,23883,77634,47801,e=>{"use strict";var t=e.i(50266),a=e.i(46146),s=e.i(8519);e.i(24856);var r=e.i(41014),i=e.i(13335),l=e.i(15149);async function n(t,a){try{let s=a;s||(s=localStorage.getItem("geohunter_anon_id")||void 0);let r=s?`/api/challenge/${t}?user_id=${s}`:`/api/challenge/${t}`,i=await fetch(r);if(!i.ok)return{error:(await i.json().catch(()=>({}))).error||"Challenge not found"};let l=await i.json();if(l.already_played)return{alreadyPlayed:!0};if(l.awaiting_accept)return{awaitingAccept:!0};let{decodeDailyPayload:n}=await e.A(69895),o=`challenge:${l.hash.slice(0,8)}`,d=n(l.payload,o);return{alreadyPlayed:!1,code:t,payload:d,creatorUsername:l.creator_username||null,baseMode:l.base_mode||"original"}}catch(e){return{error:"Failed to load challenge. Please try again."}}}function o(e,t,a){a&&a.trim()&&l.useGameStore.getState().setChallengeNickname(a.trim()),l.useGameStore.getState().startChallengeGame(e,t)}async function d(e,t,a){try{let s=await fetch(`/api/duels/${e}/respond`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:t,action:a})});if(!s.ok){let e=await s.json().catch(()=>({}));return{success:!1,error:e.error||"Failed to respond"}}return{success:!0}}catch(e){return{success:!1,error:"Network error"}}}async function c(e){try{let t=await fetch(`/api/duels/pending?user_id=${e}`);if(!t.ok)return[];let a=await t.json();return(Array.isArray(a?.pending)?a.pending:[]).map(e=>({code:e.code,creatorId:e.creator_id,creatorUsername:e.creator_username,baseMode:e.base_mode,createdAt:e.created_at}))}catch{return[]}}function h(){let e=(0,s.useSupabaseAuthStore)(e=>e.user),t=e?.id||localStorage.getItem("geohunter_anon_id")||void 0,[l,n]=(0,a.useState)([]),[o,d]=(0,a.useState)([]),[h,x]=(0,a.useState)(!1),[u,m]=(0,a.useState)(null),[f,g]=(0,a.useState)(null),p=(0,a.useCallback)(async()=>{x(!0);try{let a=new URLSearchParams;e?.id&&a.set("user_id",e.id);try{let e=JSON.parse(localStorage.getItem("geohunter_completed_challenges")||"[]").map(e=>e.code).filter(e=>e?.length===6);e.length>0&&a.set("extra_codes",e.join(","))}catch{}if(a.toString()){let e=await fetch(`/api/challenge/my-challenges?${a}`);if(e.ok){let t=await e.json();n(t.challenges||[])}}else n([]);t&&d(await c(t))}catch(e){console.error("[useActiveDuels] refresh failed:",e)}finally{x(!1)}},[e?.id,t]);(0,a.useEffect)(()=>{p()},[t]);let y=l.map(e=>{let a,s,l,n,o,d,c,h,x,u,m,f,g,p,y,b,w,j;return a=e.participants||[],l=!!(s=t?a.find(e=>e.user_id===t):null),n=!0===e.is_creator,o=a.find(e=>e.user_id!==t),d=o?.username||(n?e.recipient_username||null:e.creator_username||"Unknown"),c=o?.user_id||(n?e.recipient_id||null:e.creator_id||null),h=!!o,u=(x=(0,i.difficultyForBaseMode)(e.base_mode))?x.name:r.MODE_NAMES[e.base_mode]||e.base_mode,m=x?x.emoji:r.MODE_EMOJIS[e.base_mode]||"⚔️",f=a.length>=2&&l&&!!o?.score,g=e.current_round??1,p=e.series_scores??{},y=t?p[t]??0:0,b=c?p[c]??0:0,w=s?.score,j=o?.score,{code:e.code,baseMode:e.base_mode,modeName:u,modeEmoji:m,isCreator:n,hasPlayed:l,opponentPlayed:h,opponentId:c,opponentUsername:d,bothPlayed:f,currentRound:g,mySeriesWins:y,opponentSeriesWins:b,myScore:w,opponentScore:j,iWon:f&&null!=w&&null!=j&&w<j,recipientStatus:e.recipient_status??null,createdAt:e.created_at??null,raw:e}}),b=y.filter(e=>!e.bothPlayed),w=y.filter(e=>e.bothPlayed),j=(0,a.useCallback)(e=>{d(t=>t.filter(t=>t.code!==e))},[]),k=(0,a.useCallback)(async e=>{if(f)return{ok:!1,error:"Already in progress"};g(e);try{let a=await fetch(`/api/challenge/${e}/rematch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:t})}),s=await a.text();if(a.ok)return await p(),{ok:!0};let r="Could not start rematch";try{r=JSON.parse(s).error||r}catch{}return{ok:!1,error:r}}catch(e){return{ok:!1,error:"Failed to start rematch. Try again."}}finally{g(null)}},[t,p,f]);return{activeDuels:b,resultDuels:w,pendingInvites:o,removePendingInvite:j,loading:h,refresh:p,deleteDuel:(0,a.useCallback)(async e=>{m(e);try{let a=await fetch(`/api/challenge/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_id:t})});if(a.ok)return n(t=>t.filter(t=>t.code!==e)),{ok:!0};let s=(await a.json().catch(()=>({}))).error||"";if(s.toLowerCase().includes("creator")||s.toLowerCase().includes("created"))return n(t=>t.filter(t=>t.code!==e)),{ok:!0};return{ok:!1,error:s||"Could not remove challenge"}}catch(e){return{ok:!1,error:"Failed to remove challenge"}}finally{m(null)}},[t]),deletingCode:u,triggerRematch:k,rematchingCode:f,myId:t}}e.s(["fetchChallengeForPlay",()=>n,"fetchPendingInvites",()=>c,"launchChallengeGame",()=>o,"respondToDuelInvite",()=>d],77634),e.s(["useActiveDuels",()=>h],47801);var x=e.i(75262);function u(e){let t=(0,i.difficultyForBaseMode)(e);return t?{emoji:t.emoji,name:t.name}:{emoji:r.MODE_EMOJIS[e]||"⚔️",name:r.MODE_NAMES[e]||e}}function m({onNewDuel:e}){let r=(0,s.useSupabaseAuthStore)(e=>e.user),{activeDuels:i,resultDuels:l,pendingInvites:c,removePendingInvite:m,loading:f,refresh:g,deleteDuel:p,deletingCode:y,triggerRematch:b,rematchingCode:w,myId:j}=h(),[k,N]=(0,a.useState)(null),[v,_]=(0,a.useState)(null),[S,C]=(0,a.useState)(null),[P,E]=(0,a.useState)(null);(0,a.useEffect)(()=>{if(P){let e=setTimeout(()=>E(null),4e3);return()=>clearTimeout(e)}},[P]);let A=async e=>{if(r?.id){_(e);try{let t=await d(e,r.id,"accept");if(!t.success)return void E(t.error||"Could not accept invite");m(e);let a=await n(e,r.id);"alreadyPlayed"in a&&!1===a.alreadyPlayed?o(a.code,a.payload):"error"in a?E(a.error):await g()}finally{_(null)}}},T=async e=>{if(r?.id){_(e);try{await d(e,r.id,"decline"),m(e)}finally{_(null)}}},$=async e=>{C(e);try{let t=await n(e,j);"alreadyPlayed"in t&&!1===t.alreadyPlayed?o(t.code,t.payload):"alreadyPlayed"in t&&!0===t.alreadyPlayed?await g():"error"in t&&E(t.error)}finally{C(null)}},D=async e=>{let t=await b(e);t.ok||E(t.error||"Could not start rematch")},O=async e=>{let t=`${window.location.origin}/challenge/${e}`;try{navigator.share?await navigator.share({text:"Play GeoHunter with me!",url:t}):await navigator.clipboard.writeText(t)}catch{}},B=async e=>{if(!window.confirm("Remove this duel from your list?"))return;let t=await p(e);t.ok||E(t.error||"Could not remove duel")};return k?(0,t.jsx)(x.default,{challengeCode:k,onBack:()=>N(null)}):(0,t.jsxs)("div",{className:"flex flex-col gap-6 p-4",children:[P&&(0,t.jsx)("p",{className:"text-red-400 text-sm bg-red-400/10 rounded-lg p-2",children:P}),c.length>0&&(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("h3",{className:"text-xs font-extrabold text-slate-400 uppercase tracking-wide",children:"Pending Invites"}),c.map(e=>{let a=v===e.code;return(0,t.jsxs)("div",{className:"bg-white/5 border border-white/10 rounded-xl p-3 space-y-2.5",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("span",{className:"text-xl",children:u(e.baseMode).emoji}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsxs)("p",{className:"text-white/90 font-bold text-sm truncate",children:["@",e.creatorUsername]}),(0,t.jsxs)("p",{className:"text-white/40 text-xs mt-0.5",children:[u(e.baseMode).name," duel · challenged you"]})]})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("button",{disabled:a,onClick:()=>T(e.code),className:"flex-1 py-2 rounded-lg text-sm font-bold text-slate-400 bg-white/5 border border-white/10 hover:bg-white/10 transition disabled:opacity-50",children:"Decline"}),(0,t.jsx)("button",{disabled:a,onClick:()=>A(e.code),className:"flex-1 py-2 rounded-lg text-sm font-bold text-white bg-rose-600 hover:bg-rose-500 transition disabled:opacity-50",children:a?"...":"Accept"})]})]},e.code)})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("h3",{className:"text-xs font-extrabold text-slate-400 uppercase tracking-wide",children:"Active Duels"}),f&&0===i.length?(0,t.jsxs)("div",{className:"flex items-center gap-2 text-slate-500 text-sm py-2",children:[(0,t.jsx)("span",{className:"w-3.5 h-3.5 border-2 border-slate-500/40 border-t-slate-300 rounded-full animate-spin"}),"Loading…"]}):0===i.length?(0,t.jsx)("p",{className:"text-slate-500 text-sm py-2",children:"No active duels"}):i.map(e=>{let a=e.isCreator&&"pending"===e.recipientStatus,s=!e.hasPlayed&&!a,r=S===e.code,i=y===e.code,l=e.hasPlayed&&!e.opponentPlayed,n=!e.opponentUsername,o=e.opponentUsername?`@${e.opponentUsername}`:"Open invite",d=a?"Waiting to accept":s?"Your turn to play":l?"Waiting for them to play":"Their turn";return(0,t.jsxs)("div",{className:"relative bg-white/5 border border-white/10 rounded-xl p-3",children:[(0,t.jsx)("button",{onClick:()=>B(e.code),className:"absolute top-2.5 right-2.5 text-slate-500 hover:text-slate-300 transition text-sm","aria-label":"Remove duel",children:i?"…":"✕"}),(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("span",{className:"text-xl",children:e.modeEmoji}),(0,t.jsxs)("div",{className:"flex-1 min-w-0 pr-5",children:[(0,t.jsx)("p",{className:"text-white/90 font-bold text-sm truncate",children:o}),(0,t.jsxs)("p",{className:"text-white/40 text-xs mt-0.5",children:[e.modeName,e.currentRound>1?` \xb7 Rd ${e.currentRound}`:"",d?` \xb7 ${d}`:""]})]}),s?(0,t.jsx)("button",{disabled:r,onClick:()=>$(e.code),className:"px-3 py-1.5 rounded-lg text-xs font-bold text-white bg-rose-600 hover:bg-rose-500 transition disabled:opacity-50",children:r?"...":"▶ Play"}):n?(0,t.jsx)("button",{onClick:()=>O(e.code),className:"w-8 h-8 rounded-lg bg-blue-500/15 border border-blue-500/30 text-blue-300 flex items-center justify-center transition hover:bg-blue-500/25",title:"Copy invite link",children:"📋"}):(0,t.jsx)("span",{className:"text-lg",children:"⏳"})]})]},e.code)})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("h3",{className:"text-xs font-extrabold text-slate-400 uppercase tracking-wide",children:"Recent Results"}),f&&0===l.length?(0,t.jsxs)("div",{className:"flex items-center gap-2 text-slate-500 text-sm py-2",children:[(0,t.jsx)("span",{className:"w-3.5 h-3.5 border-2 border-slate-500/40 border-t-slate-300 rounded-full animate-spin"}),"Loading…"]}):0===l.length?(0,t.jsx)("p",{className:"text-slate-500 text-sm py-2",children:"No finished duels yet."}):l.map(e=>{let a=w===e.code,s=e.currentRound>1;return(0,t.jsxs)("div",{onClick:()=>N(e.code),className:"bg-white/5 border border-white/10 rounded-xl p-3 space-y-2.5 cursor-pointer hover:bg-white/[0.07] transition",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,t.jsx)("span",{className:"text-xl",children:e.modeEmoji}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-white/90 font-bold text-sm truncate",children:e.opponentUsername?`@${e.opponentUsername}`:"Unknown"}),(0,t.jsx)("p",{className:"text-white/40 text-xs mt-0.5",children:e.modeName})]}),(0,t.jsxs)("div",{className:"text-right",children:[(0,t.jsxs)("p",{className:`text-sm font-extrabold ${e.iWon?"text-green-400":"text-red-400"}`,children:[e.myScore," – ",e.opponentScore]}),s&&(0,t.jsxs)("p",{className:"text-white/40 text-[10px] mt-0.5",children:[e.mySeriesWins,"–",e.opponentSeriesWins," series"]})]})]}),e.opponentId&&(0,t.jsx)("button",{disabled:a,onClick:t=>{t.stopPropagation(),D(e.code)},className:"w-full py-1.5 rounded-lg text-xs font-bold text-rose-300 bg-red-500/10 border border-red-500/30 hover:bg-red-500/20 transition disabled:opacity-50",children:a?"...":"⚔️ Rematch"})]},e.code)})]}),(0,t.jsx)("button",{onClick:e,className:"w-full py-3.5 rounded-2xl font-extrabold text-white bg-rose-500 hover:bg-rose-400 transition tracking-wide",children:f?"…":"＋ New Duel"})]})}e.s(["default",()=>m],23883)},78460,e=>{"use strict";e.s(["VS_MODE_ENABLED",0,!1])},4412,e=>{"use strict";var t=e.i(50266),a=e.i(46146),s=e.i(70317),r=e.i(66691),i=e.i(8519),l=e.i(5208),n=e.i(9781),o=e.i(3331),d=e.i(78460),c=e.i(23883);e.i(24856);var h=e.i(13335),x=e.i(41014),u=e.i(47801);function m({friendId:e,friendUsername:s,onClose:r}){let l=(0,i.useSupabaseAuthStore)(e=>e.user),[n,o]=(0,a.useState)([]),[d,c]=(0,a.useState)(!0),{activeDuels:m,refresh:f}=(0,u.useActiveDuels)(),g=m.find(t=>t.opponentId===e&&t.hasPlayed&&!t.bothPlayed&&null!=t.myScore),p=(0,a.useCallback)(async()=>{if(!l?.id)return void c(!1);try{let t=await fetch(`/api/duels/history?user_id=${l.id}&friend_id=${e}`);if(t.ok){let e=await t.json();o(Array.isArray(e?.history)?e.history:[])}}catch{}finally{c(!1)}},[l?.id,e]);(0,a.useEffect)(()=>{p();let e=setInterval(()=>{p(),f()},15e3);return()=>clearInterval(e)},[p,f]);let y=n.filter(e=>e.i_won).length,b=n.filter(e=>!e.i_won&&!e.is_tie).length;return(0,t.jsx)("div",{className:"fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center z-[70] p-4",onClick:r,children:(0,t.jsxs)("div",{className:"bg-slate-900 rounded-2xl max-w-md w-full max-h-[80vh] overflow-hidden border border-slate-700/50 shadow-2xl flex flex-col",onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:"flex items-start justify-between p-5 pb-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("h2",{className:"text-lg font-black text-white",children:["vs @",s]}),n.length>0&&(0,t.jsxs)("p",{className:"text-indigo-300 text-[13px] font-semibold mt-0.5",children:[y,"–",b," all-time"]})]}),(0,t.jsx)("button",{onClick:r,className:"text-slate-400 hover:text-white text-xl leading-none p-1",children:"✕"})]}),(0,t.jsx)("div",{className:"px-5 pb-6 overflow-y-auto",children:d?(0,t.jsx)("div",{className:"py-10 flex justify-center",children:(0,t.jsx)("span",{className:"animate-spin w-6 h-6 border-2 border-indigo-400/30 border-t-indigo-400 rounded-full"})}):(0,t.jsxs)(t.Fragment,{children:[g&&(0,t.jsxs)("div",{className:"flex items-center gap-3 py-2.5 border-b border-white/[0.06] opacity-90",children:[(0,t.jsx)("span",{className:"w-8 h-8 rounded-lg bg-white/[0.08] flex items-center justify-center text-base",children:"⌛"}),(0,t.jsxs)("span",{className:"flex-1 text-amber-300 text-[13px] font-bold",children:["Waiting for @",s,"…"]}),(0,t.jsxs)("span",{className:"text-white/70 text-[13px] font-bold",children:["You ",g.myScore]})]}),0!==n.length||g?n.map(e=>{let a,r=function(e){if(!e)return{emoji:"⚔️",label:"Duel",color:"#64748b"};let t=(0,h.getDuelDifficulty)(e);return t?{emoji:t.emoji,label:t.name,color:t.color}:{emoji:x.MODE_EMOJIS[e]||"⚔️",label:x.MODE_NAMES[e]||e,color:"#64748b"}}(e.difficulty);return(0,t.jsxs)("div",{className:"flex items-center gap-3 py-2.5 border-b border-white/[0.06]",children:[(0,t.jsx)("span",{className:"w-8 h-8 rounded-lg flex items-center justify-center text-base",style:{backgroundColor:`${r.color}33`},children:r.emoji}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsxs)("p",{className:"text-slate-200 text-sm font-semibold",children:[(0,t.jsxs)("span",{className:e.i_won?"text-green-400 font-extrabold":"",children:["You ",e.my_score]}),"  –  ",(0,t.jsxs)("span",{className:e.i_won||e.is_tie?"":"text-green-400 font-extrabold",children:[e.opponent_score," @",s]})]}),(0,t.jsxs)("p",{className:"text-white/40 text-[11px] font-semibold mt-0.5",children:[r.label," · ",Number.isNaN((a=new Date(e.completed_at)).getTime())?"":a.toLocaleDateString(void 0,{month:"short",day:"numeric"})]})]}),(0,t.jsx)("span",{className:"text-base w-5 text-right",children:e.is_tie?"🤝":e.i_won?"🏆":""})]},`${e.challenge_code}-${e.round}`)}):(0,t.jsx)("p",{className:"text-slate-500 text-sm text-center py-8",children:"No finished duels yet. Send a challenge!"})]})})]})})}var f=e.i(24979),g=e.i(77634),p=e.i(99056),y=e.i(53596),b=e.i(59490);let w=(0,b.default)("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]),j=(0,b.default)("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);var k=e.i(52979);let N=(0,b.default)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);var v=e.i(49785);let _=(0,b.default)("Swords",[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]]);var S=e.i(51491);let C=(0,b.default)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);function P({homeCountry:e,username:a}){let s=function(e){if(!e)return null;try{return(0,l.countryCodeToEmoji)(e)||null}catch{return null}}(e);return(0,t.jsx)("div",{className:`w-9 h-9 rounded-full flex items-center justify-center flex-shrink-0 text-lg ${s?"bg-gray-100 dark:bg-white/10":"bg-purple-100 border border-purple-200 text-purple-700 font-bold text-sm dark:bg-[#9333ea]/40 dark:border-transparent dark:text-white"}`,children:s||a.charAt(0).toUpperCase()})}function E({isOpen:e,onClose:l,onChallengeFriend:n,onAcceptVSChallenge:o,initialTab:h,initialUserId:x}){let b=(0,i.useSupabaseAuthStore)(e=>e.user),C=(0,i.useSupabaseAuthStore)(e=>e.isAuthenticated),P=(0,i.useSupabaseAuthStore)(e=>e.fetchFollowingCount),E=(0,i.useSupabaseAuthStore)(e=>e.fetchFollowersCount),O=(0,i.useSupabaseAuthStore)(e=>e.fetchPendingRequestsCount),[B,M]=(0,a.useState)(h||"following"),[F,L]=(0,a.useState)([]),[R,I]=(0,a.useState)(!1),[U,z]=(0,a.useState)(null),{activeDuels:q,resultDuels:J,pendingInvites:W,triggerRematch:G}=(0,u.useActiveDuels)(),[V,Y]=(0,a.useState)(null),[H,X]=(0,a.useState)(null),[K,Q]=(0,a.useState)(null);(0,a.useEffect)(()=>{if(!K)return;let e=setTimeout(()=>Q(null),4e3);return()=>clearTimeout(e)},[K]);let Z=(0,a.useMemo)(()=>{let e=[...q,...J].map(e=>({code:e.code,opponentId:e.opponentId,isCreator:e.isCreator,hasPlayed:e.hasPlayed,bothPlayed:e.bothPlayed,recipientStatus:e.recipientStatus,mySeriesWins:e.mySeriesWins,opponentSeriesWins:e.opponentSeriesWins,createdAt:e.createdAt})),t=W.map(e=>({code:e.code,creatorId:e.creatorId}));return(0,f.buildFriendDuelStates)(e,t)},[q,J,W]),ee=(0,a.useCallback)(async(e,t,a)=>{Y(e.user_id);try{if(a&&b?.id){let e=await (0,g.respondToDuelInvite)(t,b.id,"accept");if(!e.success)return void Q(e.error||"Could not accept invite")}let s=await (0,g.fetchChallengeForPlay)(t,b?.id);if("error"in s)return void Q(s.error);if("awaitingAccept"in s)return void Q("Waiting for them to accept your invite");if("alreadyPlayed"in s&&!0===s.alreadyPlayed)return void X({id:e.user_id,username:e.username});if(!("payload"in s))return;(0,g.launchChallengeGame)(s.code,s.payload),l()}finally{Y(null)}},[b?.id,l]),et=(0,a.useCallback)(async(e,t)=>{Y(e.user_id);try{let e=await G(t);e.ok||Q(e.error||"Could not start rematch")}finally{Y(null)}},[G]),[ea,es]=(0,a.useState)([]),[er,ei]=(0,a.useState)(!1),[el,en]=(0,a.useState)(null),[eo,ed]=(0,a.useState)(null),[ec,eh]=(0,a.useState)(""),[ex,eu]=(0,a.useState)([]),[em,ef]=(0,a.useState)(!1),[eg,ep]=(0,a.useState)(null),[ey,eb]=(0,a.useState)(null),[ew,ej]=(0,a.useState)(!1),[ek,eN]=(0,a.useState)([]),[ev,e_]=(0,a.useState)(null),[eS,eC]=(0,a.useState)([]),[eP,eE]=(0,a.useState)(null),[eA,eT]=(0,a.useState)(null),[e$,eD]=(0,a.useState)(!1),eO=(0,a.useRef)(null),eB=(0,a.useRef)(new Set),eM=(0,a.useCallback)(async()=>{if(b?.id){I(!0),z(null);try{let e=await fetch(`/api/social/following?user_id=${b.id}`);if(!e.ok)throw Error();let t=await e.json();L(t.following||[])}catch{z("Could not load following list.")}finally{I(!1)}}},[b?.id]),eF=(0,a.useCallback)(async()=>{if(b?.id){ei(!0),en(null);try{let e=await fetch(`/api/social/followers?user_id=${b.id}`);if(!e.ok)throw Error();let t=await e.json();es(t.followers||[])}catch{en("Could not load followers list.")}finally{ei(!1)}}},[b?.id]),eL=(0,a.useCallback)(async()=>{if(b?.id&&d.VS_MODE_ENABLED)try{let e=await fetch(`/api/vs/challenges/pending?user_id=${b.id}`);if(!e.ok)return;let t=await e.json();eC(t.challenges||[])}catch{}},[b?.id]),eR=(0,a.useCallback)(async()=>{if(b?.id)try{let e=await fetch(`/api/social/friend-requests?user_id=${b.id}`);if(!e.ok)throw Error();let t=await e.json();eN(t.requests||[])}catch{}},[b?.id]);(0,a.useEffect)(()=>{e&&C&&(eR(),"following"===B&&(eM(),eF(),eL()))},[e,C,B,eM,eF,eL,eR]),(0,a.useEffect)(()=>{e&&h&&M(h)},[e,h]),(0,a.useEffect)(()=>{e&&x&&b?.id&&(eD(!0),M("add"),fetch(`/api/social/search?id=${x}&viewer_id=${b.id}`).then(e=>e.json()).then(e=>{e.users?.length>0&&eT(e.users[0])}).catch(()=>{}).finally(()=>eD(!1)))},[e,x,b?.id]),(0,a.useEffect)(()=>{e||(eh(""),eu([]),ep(null),M(h||"following"),eb(null),eT(null),ej(!1),eC([]),eE(null),eN([]),e_(null))},[e]),(0,a.useEffect)(()=>{if(eO.current&&clearTimeout(eO.current),ec.length<2){eu([]),ep(null);return}return eO.current=setTimeout(async()=>{if(b?.id){ef(!0),ep(null);try{let e=await fetch(`/api/social/search?q=${encodeURIComponent(ec)}&viewer_id=${b.id}`);if(!e.ok)throw Error();let t=await e.json();eu(t.users||[])}catch{ep("Search failed. Please try again.")}finally{ef(!1)}}},300),()=>{eO.current&&clearTimeout(eO.current)}},[ec,b?.id]);let eI=(0,a.useCallback)(async()=>{await Promise.all([P(),E(),O()])},[P,E,O]),eU=(0,a.useCallback)(async e=>{if(b?.id&&!ey){eb(e);try{let t=await fetch("/api/social/follow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({follower_id:b.id,following_id:e})});if(t.ok){let a=await t.json().catch(()=>({})),s=a?.status==="accepted"||a?.is_friend?"friends":"requested";eu(t=>t.map(t=>t.id===e?{...t,relationship:s,is_following:"friends"===s}:t)),eA?.id===e&&eT(e=>e?{...e,relationship:s,is_following:"friends"===s}:e),await eI(),"friends"===s&&(eR(),eM())}}catch{}finally{eb(null)}}},[b?.id,eI,eA?.id,eR,eM]),ez=(0,a.useCallback)(async e=>{if(b?.id&&!ey){eb(e);try{(await fetch("/api/social/follow",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({follower_id:b.id,following_id:e})})).ok&&(eu(t=>t.map(t=>t.id===e?{...t,relationship:"none",is_following:!1}:t)),eA?.id===e&&eT(e=>e?{...e,relationship:"none",is_following:!1}:e),await eI())}catch{}finally{eb(null)}}},[b?.id,eI,eA?.id]),eq=(0,a.useCallback)(async e=>{if(!(!b?.id||eB.current.has(e))){eB.current.add(e);try{(await fetch("/api/social/follow",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({follower_id:b.id,following_id:e})})).ok&&(L(t=>t.filter(t=>t.user_id!==e)),await eI())}catch{}finally{eB.current.delete(e)}}},[b?.id,eI]),eJ=(0,a.useCallback)(async e=>{if(b?.id&&!eo){ed(e);try{(await fetch("/api/social/follow",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({follower_id:b.id,following_id:e})})).ok&&(es(t=>t.map(t=>t.user_id===e?{...t,is_followed_back:!0}:t)),await eI())}catch{}finally{ed(null)}}},[b?.id,eI]),eW=(0,a.useCallback)(async e=>{if(b?.id&&!ev){e_(e);try{(await fetch("/api/social/friend-requests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"accept",user_id:b.id,requester_id:e})})).ok&&(eN(t=>t.filter(t=>t.user_id!==e)),eu(t=>t.map(t=>t.id===e?{...t,relationship:"friends",is_following:!0}:t)),eA?.id===e&&eT(e=>e?{...e,relationship:"friends",is_following:!0}:e),await Promise.all([eM(),eI()]))}catch{}finally{e_(null)}}},[b?.id,ev,eM,eI,eA?.id]),eG=(0,a.useCallback)(async e=>{if(b?.id&&!ev){e_(e);try{(await fetch("/api/social/friend-requests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"decline",user_id:b.id,requester_id:e})})).ok&&(eN(t=>t.filter(t=>t.user_id!==e)),eu(t=>t.map(t=>t.id===e?{...t,relationship:"none"}:t)),eA?.id===e&&eT(e=>e?{...e,relationship:"none"}:e),O())}catch{}finally{e_(null)}}},[b?.id,ev,eA?.id,O]),eV=b?.id?`${window.location.origin}/add/${b.id}`:"",eY=(0,a.useCallback)(async()=>{if(!b||!eV)return;let e=`Add me on GeoHunter! 🌍
${eV}`;if("u">typeof navigator&&navigator.share)try{await navigator.share({text:e,title:"Add me on GeoHunter"});return}catch{}try{await navigator.clipboard.writeText(eV),ej(!0),setTimeout(()=>ej(!1),2e3)}catch{}},[b,eV]),eH=(0,a.useCallback)(async()=>{if(eV)try{await navigator.clipboard.writeText(eV),ej(!0),setTimeout(()=>ej(!1),2e3)}catch{}},[eV]);if((0,a.useEffect)(()=>{let t=t=>{"Escape"===t.key&&e&&l()};if(e)return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[e,l]),!e)return null;let eX=[{id:"following",icon:y.Users,label:"Friends"},{id:"add",icon:w,label:"Add"},{id:"duels",icon:_,label:"Duels",mobileOnly:!0}],eK=ea.filter(e=>!e.is_followed_back);return(0,t.jsxs)("div",{className:"fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4",onClick:e=>{e.target===e.currentTarget&&l()},children:[(0,t.jsxs)(s.Card,{className:"w-full max-w-lg lg:max-w-3xl bg-white dark:bg-[#0f172a] max-h-[85vh] flex flex-col lg:flex-row overflow-hidden",children:[(0,t.jsxs)("div",{className:"flex flex-col min-h-0 flex-1 lg:w-[380px] lg:flex-none lg:border-r dark:border-white/10",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between p-4 border-b dark:border-white/10",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(y.Users,{className:"w-5 h-5 text-indigo-500 dark:text-[#a5b4fc]"}),(0,t.jsx)("h2",{className:"text-lg font-bold text-gray-800 dark:text-white",children:"Friends"})]}),(0,t.jsx)(r.Button,{variant:"ghost",size:"sm",onClick:l,className:"p-2 rounded-full hover:bg-gray-100 dark:bg-white/10 dark:hover:bg-white/20 dark:text-white",children:(0,t.jsx)(p.X,{className:"w-4 h-4"})})]}),C?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"flex border-b dark:border-white/10 px-3 pt-1",children:eX.map(e=>{let a=e.icon,s=B===e.id;return(0,t.jsxs)("button",{onClick:()=>M(e.id),className:`flex-1 flex items-center justify-center gap-1.5 py-2.5 text-sm font-medium rounded-t-lg transition-colors ${e.mobileOnly?"lg:hidden":""} ${s?"text-indigo-600 bg-indigo-50 dark:bg-[#a5b4fc]/15 dark:text-[#a5b4fc]":"text-gray-400 hover:text-gray-600 hover:bg-gray-50 dark:text-white/40 dark:hover:text-white/70 dark:hover:bg-white/5"}`,children:[(0,t.jsx)(a,{className:"w-3.5 h-3.5"}),e.label,"following"===e.id&&ek.length>0&&(0,t.jsx)("span",{className:"ml-0.5 min-w-[16px] h-4 px-1 rounded-full bg-red-500 text-white text-[10px] font-bold flex items-center justify-center",children:ek.length}),"duels"===e.id&&W.length>0&&(0,t.jsx)("span",{className:"ml-0.5 min-w-[16px] h-4 px-1 rounded-full bg-rose-500 text-white text-[10px] font-bold flex items-center justify-center",children:W.length})]},e.id)})}),(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto",children:["following"===B&&(0,t.jsxs)(A,{loading:R||er,error:U||el,onRetry:()=>{eM(),eF()},children:[ek.length>0&&(0,t.jsxs)("div",{className:"p-3 pb-0",children:[(0,t.jsxs)("p",{className:"text-xs font-bold text-indigo-500 dark:text-[#a5b4fc] uppercase tracking-widest px-1 mb-2",children:["Friend Requests (",ek.length,")"]}),(0,t.jsx)("div",{className:"space-y-2",children:ek.map(e=>(0,t.jsx)($,{username:e.username,homeCountry:e.home_country,stats:e.stats,badge:e.active_badge,children:ev===e.user_id?(0,t.jsx)(S.Loader2,{className:"w-4 h-4 animate-spin text-indigo-400"}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>eG(e.user_id),className:"w-7 h-7 rounded-full bg-gray-100 hover:bg-gray-200 dark:bg-white/10 dark:hover:bg-white/20 flex items-center justify-center flex-shrink-0","aria-label":"Decline",children:(0,t.jsx)(p.X,{className:"w-3 h-3 text-gray-400 dark:text-white/50"})}),(0,t.jsxs)(r.Button,{size:"sm",className:"bg-green-600 hover:bg-green-700 text-white text-xs h-8",onClick:()=>eW(e.user_id),children:[(0,t.jsx)(v.Check,{className:"w-3 h-3 mr-1"}),"Accept"]})]})},e.user_id))}),(F.length>0||eS.length>0)&&(0,t.jsx)("div",{className:"border-t border-gray-100 dark:border-white/10 mt-3"})]}),eS.length>0&&(0,t.jsxs)("div",{className:"p-3 pb-0 space-y-2",children:[(0,t.jsx)("p",{className:"text-xs font-bold text-violet-600 dark:text-[#a5b4fc] uppercase tracking-widest px-1",children:"⚔️ VS Challenges for You"}),eS.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-3 bg-gradient-to-r from-violet-50 to-indigo-50 border border-violet-200 dark:from-[#7c3aed]/10 dark:to-[#4f46e5]/10 dark:border-[#7c3aed]/40 rounded-xl px-3 py-2.5",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-bold text-gray-900 dark:text-white truncate",children:e.inviter_username}),(0,t.jsx)("p",{className:"text-xs text-gray-500 dark:text-white/50",children:"challenged you to a VS match!"})]}),(0,t.jsx)("button",{disabled:!!eP,onClick:async()=>{!eP&&o&&(l(),o(e.code))},className:"flex-shrink-0 bg-gradient-to-r from-violet-600 to-indigo-600 hover:from-violet-700 hover:to-indigo-700 disabled:opacity-50 text-white text-xs font-bold px-3 py-1.5 rounded-lg transition-colors",children:eP===e.code?(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(S.Loader2,{className:"w-3 h-3 animate-spin"}),"Joining…"]}):"Accept ⚔️"})]},e.code)),F.length>0&&(0,t.jsx)("div",{className:"border-t border-gray-100 dark:border-white/10 mt-1"})]}),K&&(0,t.jsx)("div",{className:"px-3 pt-2",children:(0,t.jsx)("p",{className:"text-red-400 text-sm bg-red-400/10 rounded-lg p-2",children:K})}),0===F.length&&0===eS.length&&0===ek.length&&0===eK.length?(0,t.jsx)(T,{icon:(0,t.jsx)(w,{className:"w-9 h-9 text-gray-300 dark:text-white/20"}),title:"No friends yet",subtitle:"Add friends to get started!",action:(0,t.jsx)(r.Button,{size:"sm",onClick:()=>M("add"),children:"Add Friends"})}):(0,t.jsxs)(t.Fragment,{children:[eK.length>0&&(0,t.jsxs)("div",{className:"p-3 pb-0",children:[(0,t.jsxs)("p",{className:"text-xs font-bold text-indigo-500 dark:text-[#a5b4fc] uppercase tracking-widest px-1 mb-2",children:["Follows You (",eK.length,")"]}),(0,t.jsx)("div",{className:"space-y-2",children:eK.map(e=>(0,t.jsx)($,{username:e.username,homeCountry:e.home_country,stats:e.stats,badge:e.active_badge,children:eo===e.user_id?(0,t.jsx)(S.Loader2,{className:"w-4 h-4 animate-spin text-indigo-400"}):(0,t.jsxs)(r.Button,{size:"sm",className:"bg-indigo-600 hover:bg-indigo-700 text-white text-xs h-8",onClick:()=>eJ(e.user_id),children:[(0,t.jsx)(w,{className:"w-3 h-3 mr-1"}),"Follow Back"]})},e.user_id))}),F.length>0&&(0,t.jsx)("div",{className:"border-t border-gray-100 dark:border-white/10 mt-3"})]}),F.length>0&&(0,t.jsx)("div",{className:"p-3 space-y-2",children:F.map(e=>{let a=Z.get(e.user_id)?.action??{kind:"challenge"},s=V===e.user_id;return(0,t.jsxs)($,{username:e.username,homeCountry:e.home_country,stats:e.stats,badge:e.active_badge,h2h:e.h2h,onViewHistory:()=>X({id:e.user_id,username:e.username}),children:[(()=>{if(s)return(0,t.jsx)(r.Button,{size:"sm",disabled:!0,className:"text-xs h-8 bg-white/10 text-white/60",children:(0,t.jsx)(S.Loader2,{className:"w-3 h-3 animate-spin"})});switch(a.kind){case"play":return(0,t.jsx)(r.Button,{size:"sm",className:"bg-rose-600 hover:bg-rose-500 text-white text-xs h-8",onClick:()=>ee(e,a.code,a.isInvite),children:"▶ Play"});case"sent":return(0,t.jsx)(r.Button,{size:"sm",disabled:!0,className:"text-xs h-8 bg-gray-200 dark:bg-white/10 text-gray-500 dark:text-white/50",children:"Sent"});case"waiting":return(0,t.jsx)(r.Button,{size:"sm",disabled:!0,className:"text-xs h-8 bg-gray-200 dark:bg-white/10 text-gray-500 dark:text-white/50",children:"Waiting"});case"rematch":return(0,t.jsxs)(r.Button,{size:"sm",className:"bg-indigo-600 hover:bg-indigo-500 text-white text-xs h-8",onClick:()=>et(e,a.code),children:[(0,t.jsx)(_,{className:"w-3 h-3 mr-1"}),"Rematch"]});default:return(0,t.jsxs)(r.Button,{size:"sm",className:"bg-gradient-to-r from-orange-500 to-red-500 hover:from-orange-600 hover:to-red-600 text-white text-xs h-8",onClick:()=>{n(e.user_id,e.username),l()},children:[(0,t.jsx)(_,{className:"w-3 h-3 mr-1"}),"Challenge"]})}})(),(0,t.jsx)("button",{onClick:()=>{window.confirm(`Remove @${e.username}? They'll be removed from your friends list. You can add them again later.`)&&eq(e.user_id)},className:"w-7 h-7 rounded-full bg-gray-100 hover:bg-gray-200 dark:bg-white/10 dark:hover:bg-white/20 flex items-center justify-center flex-shrink-0",children:(0,t.jsx)(p.X,{className:"w-3 h-3 text-gray-400 dark:text-white/50"})})]},e.user_id)})})]})]}),"add"===B&&(0,t.jsxs)("div",{className:"p-3 space-y-3",children:[(0,t.jsxs)("div",{className:"bg-indigo-50 border border-indigo-100 dark:bg-[#1e293b] dark:border-[#a5b4fc]/15 rounded-xl p-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-1.5",children:[(0,t.jsx)(k.Share2,{className:"w-4 h-4 text-indigo-500 dark:text-[#a5b4fc]"}),(0,t.jsx)("span",{className:"font-semibold text-gray-800 dark:text-white text-sm",children:"Invite Friends"})]}),(0,t.jsx)("p",{className:"text-xs text-gray-500 dark:text-white/60 mb-3",children:"Share your link so friends can follow you instantly"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsxs)(r.Button,{className:"flex-1 bg-gradient-to-r from-indigo-500 to-purple-500 hover:from-indigo-600 hover:to-purple-600 text-white text-sm",onClick:eY,children:[(0,t.jsx)(k.Share2,{className:"w-4 h-4 mr-2"}),"Share Profile Link"]}),(0,t.jsx)(r.Button,{variant:"outline",size:"sm",onClick:eH,className:"px-3",children:ew?(0,t.jsx)(v.Check,{className:"w-4 h-4 text-green-500"}):(0,t.jsx)(N,{className:"w-4 h-4"})})]})]}),e$&&(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-3",children:[(0,t.jsx)(S.Loader2,{className:"w-4 h-4 animate-spin text-indigo-400"}),(0,t.jsx)("span",{className:"text-sm text-gray-500 dark:text-white/50",children:"Loading player..."})]}),eA&&!e$&&(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-semibold text-indigo-500 dark:text-[#a5b4fc] mb-1 px-1",children:"From invite link"}),(0,t.jsx)(D,{item:eA,onFollow:()=>eU(eA.id),onUnfollow:()=>ez(eA.id),onAccept:()=>eW(eA.id),isPending:ey===eA.id||ev===eA.id})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 py-1",children:[(0,t.jsx)("div",{className:"flex-1 h-px bg-gray-200 dark:bg-white/10"}),(0,t.jsx)("span",{className:"text-xs text-gray-400 dark:text-white/50",children:"or search by username"}),(0,t.jsx)("div",{className:"flex-1 h-px bg-gray-200 dark:bg-white/10"})]}),(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)(j,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 dark:text-white/40"}),(0,t.jsx)("input",{type:"text",value:ec,onChange:e=>eh(e.target.value),placeholder:"Search by username...",className:"w-full pl-9 pr-8 py-2.5 bg-gray-100 border border-gray-200 rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-indigo-300 focus:border-indigo-300 dark:bg-[#1e293b] dark:border-white/10 dark:text-white dark:placeholder:text-white/40"}),ec.length>0&&(0,t.jsx)("button",{onClick:()=>eh(""),className:"absolute right-3 top-1/2 -translate-y-1/2",children:(0,t.jsx)(p.X,{className:"w-3.5 h-3.5 text-gray-400 dark:text-white/40"})})]}),em&&(0,t.jsx)("div",{className:"flex justify-center py-6",children:(0,t.jsx)(S.Loader2,{className:"w-5 h-5 animate-spin text-indigo-400"})}),!em&&eg&&(0,t.jsx)("p",{className:"text-center text-sm text-red-500 py-4",children:eg}),!em&&!eg&&ec.length>=2&&0===ex.length&&(0,t.jsx)("p",{className:"text-center text-sm text-gray-400 dark:text-white/40 py-4",children:"No users found"}),!em&&ec.length>0&&ec.length<2&&(0,t.jsx)("p",{className:"text-center text-sm text-gray-400 dark:text-white/40 py-4",children:"Type at least 2 characters"}),!em&&ex.length>0&&(0,t.jsx)("div",{className:"space-y-2",children:ex.map(e=>(0,t.jsx)(D,{item:e,onFollow:()=>eU(e.id),onUnfollow:()=>ez(e.id),onAccept:()=>eW(e.id),isPending:ey===e.id||ev===e.id},e.id))})]}),"duels"===B&&(0,t.jsx)("div",{className:"lg:hidden",children:(0,t.jsx)(c.default,{onNewDuel:()=>M("following")})})]})]}):(0,t.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-center p-8 gap-3",children:[(0,t.jsx)(y.Users,{className:"w-10 h-10 text-gray-300 dark:text-white/20"}),(0,t.jsx)("p",{className:"font-semibold text-gray-700 dark:text-white",children:"Sign in to follow players"}),(0,t.jsx)("p",{className:"text-sm text-gray-500 dark:text-white/60 text-center",children:"Sign in to follow players and challenge friends"}),(0,t.jsx)(r.Button,{onClick:l,variant:"outline",className:"mt-4",children:"Close"})]})]}),C&&(0,t.jsxs)("div",{className:"hidden lg:flex lg:flex-col lg:flex-1 lg:min-h-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 p-4 border-b dark:border-white/10",children:[(0,t.jsx)(_,{className:"w-5 h-5 text-rose-500 dark:text-rose-400"}),(0,t.jsx)("h3",{className:"text-lg font-bold text-gray-800 dark:text-white",children:"Duels"})]}),(0,t.jsx)("div",{className:"flex-1 overflow-y-auto",children:(0,t.jsx)(c.default,{onNewDuel:()=>M("following")})})]})]}),H&&(0,t.jsx)(m,{friendId:H.id,friendUsername:H.username,onClose:()=>X(null)})]})}function A({loading:e,error:a,onRetry:s,children:i}){return e?(0,t.jsx)("div",{className:"flex justify-center py-12",children:(0,t.jsx)(S.Loader2,{className:"w-5 h-5 animate-spin text-indigo-400"})}):a?(0,t.jsxs)("div",{className:"flex flex-col items-center py-12 gap-3",children:[(0,t.jsx)("p",{className:"text-sm text-red-500",children:a}),(0,t.jsxs)(r.Button,{variant:"outline",size:"sm",onClick:s,children:[(0,t.jsx)(C,{className:"w-3 h-3 mr-1"}),"Retry"]})]}):(0,t.jsx)(t.Fragment,{children:i})}function T({icon:e,title:a,subtitle:s,action:r}){return(0,t.jsxs)("div",{className:"flex flex-col items-center py-12 gap-2",children:[e,(0,t.jsx)("p",{className:"font-semibold text-gray-600 dark:text-white/70",children:a}),(0,t.jsx)("p",{className:"text-sm text-gray-400 dark:text-white/40 text-center max-w-[240px]",children:s}),r&&(0,t.jsx)("div",{className:"mt-3",children:r})]})}function $({username:e,homeCountry:a,stats:s,badge:r,h2h:i,onViewHistory:l,children:d}){let c,h=i?i.wins+i.losses+i.ties:0;return(0,t.jsxs)("div",{className:"flex items-center gap-3 bg-gray-50 dark:bg-[#1e293b] rounded-xl p-3",children:[(0,t.jsx)(P,{homeCountry:a,username:e}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsxs)("p",{className:"font-semibold text-gray-800 dark:text-white text-sm flex items-center gap-1",children:[(0,t.jsx)("span",{className:"truncate",children:e}),(0,o.isBadgeVariant)(r)&&(0,t.jsx)("span",{className:"inline-flex flex-shrink-0",children:(0,t.jsx)(n.PixelBadgeSVG,{variant:r,size:14,naked:!0})})]}),(0,t.jsxs)("p",{className:"text-xs text-gray-400 dark:text-white/40 flex items-center gap-1.5",children:["Best: ",(0,t.jsx)("span",{className:"font-medium text-gray-500 dark:text-white/40",children:null==(c=s?.bestOriginal)||c>=999?"NEW":String(c)}),h>0&&i&&(0,t.jsxs)("button",{onClick:l,className:"font-bold text-[11px] px-1.5 py-0.5 rounded bg-gray-200 dark:bg-white/10 text-gray-500 dark:text-white/60 hover:bg-gray-300 dark:hover:bg-white/20 transition",children:[i.wins,"–",i.losses]})]})]}),(0,t.jsx)("div",{className:"flex items-center gap-2 flex-shrink-0",children:d})]})}function D({item:e,onFollow:a,onUnfollow:s,onAccept:i,isPending:l}){let n=e.relationship??(e.is_following?"friends":"none");return(0,t.jsx)($,{username:e.username,homeCountry:e.home_country,stats:e.stats,badge:e.active_badge,children:l?(0,t.jsx)(S.Loader2,{className:"w-4 h-4 animate-spin text-indigo-400"}):"friends"===n?(0,t.jsxs)(r.Button,{variant:"outline",size:"sm",className:"text-xs h-8 border-green-300 text-green-700 hover:bg-green-50 dark:bg-[#4ade80]/12 dark:text-[#4ade80] dark:border-[#4ade80]/30 dark:hover:bg-[#4ade80]/20",onClick:()=>{window.confirm(`Remove @${e.username}? They'll be removed from your friends list. You can add them again later.`)&&s()},children:[(0,t.jsx)(v.Check,{className:"w-3 h-3 mr-1"}),"Friends"]}):"requested"===n?(0,t.jsx)(r.Button,{variant:"outline",size:"sm",className:"text-xs h-8 dark:bg-white/10 dark:text-white dark:border-white/15 dark:hover:bg-white/20",onClick:s,children:"Requested"}):"incoming"===n?(0,t.jsxs)(r.Button,{size:"sm",className:"bg-green-600 hover:bg-green-700 text-white text-xs h-8",onClick:i,children:[(0,t.jsx)(v.Check,{className:"w-3 h-3 mr-1"}),"Accept"]}):(0,t.jsxs)(r.Button,{size:"sm",className:"bg-indigo-600 hover:bg-indigo-700 text-white text-xs h-8",onClick:a,children:[(0,t.jsx)(w,{className:"w-3 h-3 mr-1"}),"Add"]})})}e.s(["FriendsModal",()=>E],4412)}]);