PageSourceSearch

https://loothing.xyz/assets/Characters-BBx3rCpL.js

js loothing.xyz collected 2026-09-24 15:16:24 UTC 8,969 bytes, 1 lines download raw bytes

1import{j as a,r as e}from"./react-vendor-BR2bEzcq.js";import{d as s,f as r,am as t,M as o,T as i,b as l,m as c,aD as n,U as d,B as m,e as p}from"./index-We6CJOzg.js";import{a as g,z as h}from"./axios-DY9rj2-D.js";import{P as x}from"./PageHeader-DmlBxJgr.js";import{F as u}from"./FilterBar-BwHxp4cb.js";import{P as j}from"./Pagination-DgUuTC8_.js";import{E as v}from"./EmptyState-atJS5GGA.js";import{u as y,R as f}from"./useServerPagination-Ciwf7cwk.js";import"./Toggle-76_ISnGG.js";import{T as b}from"./Tooltip-DWyVQmsu.js";import{C as N}from"./CharacterName-RZSABTuA.js";import{A as S}from"./ActivityScoreBar-CQUbgzJr.js";import{S as k}from"./StatusBadge-CxpZ-aQj.js";import{U as C}from"./user-x-Cl3pq0wM.js";import{H as P}from"./heart-JdAkW1XG.js";import{A as w}from"./award-vkDyPs2G.js";import{C as M}from"./chart-column-YeWoEYQN.js";import"./FormInput-CRpcn1_o.js";import"./ExclamationCircleIcon-CunFTGPY.js";import"./CheckCircleIcon-Cby2gbWo.js";import"./EyeSlashIcon-5yKjBYTw.js";import"./EyeIcon-D3kwsJLA.js";import"./StandardDropdown-BTdJSuUI.js";import"./CheckIcon-911ghGV7.js";import"./arrow-up-down-Bc3UoPYo.js";import"./chevron-up-xxcaJfQW.js";import"./ChevronUpIcon-DGxTOnck.js";import"./useDebounce-MHmjDw2G.js";import"./flame-DV3whGQS.js";const D=a=>"left_discord"===a?"Left Discord":"left_wow_guild"===a?"Left Guild":"Departed",I=a=>a>=1e6?`${(a/1e6).toFixed(1)}M`:a>=1e3?`${(a/1e3).toFixed(1)}k`:a?.toFixed(0)||"0",z=["Death Knight","Demon Hunter","Druid","Evoker","Hunter","Mage","Monk","Paladin","Priest","Rogue","Shaman","Warlock","Warrior"],F=["Tank","Healer","DPS"],A=[{value:"characterName",label:"Name"},{value:"class",label:"Class"},{value:"role",label:"Role"},{value:"level",label:"Level"},{value:"activityScore",label:"Activity"},{value:"mythicPlusScore",label:"M+ Score"},{value:"totalItems",label:"Items"}];function B(){const B=l(),[E,R]=e.useState(""),[H,L]=e.useState(""),[T,$]=e.useState(!1),K=y({pageSize:50,sortBy:"totalItems",sortDir:"desc"}),{sortBy:W,toggleSortDir:_,setSortBy:q,resetPage:U}=K,{data:Q,totalItems:G,totalPages:X,isLoading:Y,isError:J}=(({page:a=1,pageSize:e=50,search:o="",sortBy:i="totalItems",sortDir:l="desc",filters:c={}}={})=>{const{selectedGuild:n}=s(),d=n?.id,{data:m,isLoading:p,isError:h,error:x}=r({queryKey:["characters",d,a,e,o,i,l,c.class,c.role],queryFn:async()=>{const s={limit:e,page:a,sortBy:i,sortOrder:l};o&&(s.search=o),c.class&&(s.class=c.class),c.role&&(s.role=c.role);const r=await g.get("/api/characters",{params:s});return r.data?.pagination?r.data:Array.isArray(r.data)?{data:r.data,pagination:{total:r.data.length,page:1,pageSize:e,totalPages:1}}:{data:r.data?.data||[],pagination:{total:0,page:1,pageSize:e,totalPages:0}}},enabled:!!d,placeholderData:t});return{data:m?.data||[],totalItems:m?.pagination?.total??0,totalPages:m?.pagination?.totalPages??1,isLoading:p,isError:h,error:x}})({page:K.page,pageSize:K.pageSize,search:K.debouncedSearch,sortBy:W,sortDir:K.sortDir,filters:{class:E,role:H}});e.useEffect(()=>{J&&h.error("Failed to load characters")},[J]);const{data:O}=r({queryKey:["combat-rankings"],queryFn:async()=>{try{const[a,e]=await Promise.all([g.get("/api/combat/rankings",{params:{role:"DPS",limit:50}}),g.get("/api/combat/rankings",{params:{role:"Healer",limit:50}})]);return{dpsMap:new Map((a.data.rankings||[]).map(a=>[a.characterId,a])),hpsMap:new Map((e.data.rankings||[]).map(a=>[a.characterId,a]))}}catch{return{dpsMap:new Map,hpsMap:new Map}}},enabled:T}),V=e.useMemo(()=>T&&O?Q.map(a=>({...a,combatStats:{avgDps:O.dpsMap.get(a.id)?.averageDps||0,avgHps:O.hpsMap.get(a.id)?.averageHps||0,avgParse:Math.max(parseFloat(O.dpsMap.get(a.id)?.averageParse)||0,parseFloat(O.hpsMap.get(a.id)?.averageParse)||0),encounters:Math.max(O.dpsMap.get(a.id)?.encounters||0,O.hpsMap.get(a.id)?.encounters||0),dpsRank:O.dpsMap.get(a.id)?.rank,hpsRank:O.hpsMap.get(a.id)?.rank}})):Q,[T,O,Q]),Z=e.useMemo(()=>(({showCombatStats:e=!1}={})=>[{header:"Character",accessor:"characterName",render:(e,s)=>{const r=!(!s?.departedAt&&!s?.departed_at),t=s?.departureReason||s?.departure_reason;return a.jsxs("div",{className:"flex flex-col gap-1 "+(r?"opacity-60":""),children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx(N,{name:e||s.displayName,className:s.class,linkTo:`/characters/${s.id}`,extraClassName:"text-base font-semibold"}),r&&a.jsx(b,{content:`This character has been flagged as departed: ${D(t)}`,children:a.jsxs("span",{className:"text-[10px] px-1 py-px rounded-sm bg-orange-500/20 text-orange-400 border border-orange-500/30 flex items-center gap-0.5 cursor-help",children:[a.jsx(C,{className:"h-3 w-3"}),D(t)]})})]}),a.jsxs("div",{className:"flex items-center gap-1.5",children:[s.role&&a.jsx(k,{variant:"role",value:s.role,size:"sm",showIcon:!0}),s.spec&&a.jsx("span",{className:"text-xs text-gray-400",children:s.spec})]})]})}},{header:"Items",accessor:"totalItems",render:e=>a.jsx("span",{className:"text-base font-bold",children:e??0})},{header:"Activity",accessor:"activityScore",render:e=>a.jsx(S,{score:parseFloat(e)||0,size:"sm",className:"min-w-[120px]"})},...e?[{header:"DPS",accessor:"combatStats",render:e=>e?.avgDps>0?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(o,{size:14,className:"text-red-400"}),a.jsx("span",{className:"text-red-400 font-mono text-sm",children:I(e.avgDps)}),e.dpsRank&&a.jsxs("span",{className:"text-gray-500 text-xs",children:["#",e.d
1psRank]})]}):a.jsx("span",{className:"text-gray-500",children:"—"})},{header:"HPS",accessor:"combatStats",render:e=>e?.avgHps>0?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(P,{size:14,className:"text-green-400"}),a.jsx("span",{className:"text-green-400 font-mono text-sm",children:I(e.avgHps)}),e.hpsRank&&a.jsxs("span",{className:"text-gray-500 text-xs",children:["#",e.hpsRank]})]}):a.jsx("span",{className:"text-gray-500",children:"—"})},{header:"Parse",accessor:"combatStats",render:e=>{return e?.avgParse>0?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(w,{size:14,className:"text-gray-400"}),a.jsx("span",{className:"font-mono text-sm font-bold",style:{color:(s=e.avgParse,s>=95?"#ff8000":s>=75?"#a335ee":s>=50?"#0070ff":s>=25?"#1eff00":"#9d9d9d")},children:(Number(e.avgParse)||0).toFixed(0)})]}):a.jsx("span",{className:"text-gray-500",children:"—"});var s}},{header:"Encounters",accessor:"combatStats",render:e=>a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(i,{size:14,className:"text-primary"}),a.jsx("span",{className:"text-primary text-sm",children:e?.encounters??0})]})}]:[]])({showCombatStats:T}),[T]),aa=[E,H,K.search].filter(Boolean).length,ea=e.useCallback(a=>{a===W?_():q(a)},[W,_,q]),sa=e.useCallback(()=>{R(""),L(""),K.setSearch("")},[K.setSearch]);return a.jsxs(c.div,{className:"space-y-4",variants:n,initial:"initial",animate:"animate",children:[a.jsx(x,{icon:d,title:"Characters",subtitle:G>0?`${G} character${1!==G?"s":""}`:void 0,actions:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(m,{variant:"ghost",size:"sm",to:"/raid/warcraftlogs",leftIcon:a.jsx(M,{size:14}),children:"WCL"}),a.jsx(m,{variant:T?"success":"ghost",size:"sm",onClick:()=>$(a=>!a),leftIcon:a.jsx(p,{size:14}),children:"Combat"})]})}),a.jsx(u,{search:{value:K.search,onChange:K.setSearch,placeholder:"Search characters…"},filters:[{key:"class",label:"All Classes",type:"select",value:E,onChange:a=>{R(a),U()},options:z.map(a=>({value:a,label:a}))},{key:"role",label:"All Roles",type:"select",value:H,onChange:a=>{L(a),U()},options:F.map(a=>({value:a,label:a}))}],sort:{options:A,value:W,direction:K.sortDir,onSort:ea},onClear:sa,activeCount:aa}),Y?a.jsxs("div",{className:"animate-pulse bg-gray-800/30 rounded-lg border border-gray-700",children:[a.jsx("div",{className:"bg-gray-900/50 px-6 py-4 border-b border-gray-700 hidden lg:flex gap-6",children:[80,60,48,56,64,48].map((e,s)=>a.jsx("div",{className:"h-3 bg-gray-700 rounded-sm",style:{width:e}},s))}),Array.from({length:8}).map((e,s)=>a.jsxs("div",{className:"px-6 py-4 border-b border-gray-700/30 last:border-0 flex items-center gap-4",children:[a.jsx("div",{className:"h-4 w-28 bg-gray-700 rounded-sm"}),a.jsx("div",{className:"h-4 w-16 bg-gray-700/60 rounded-sm hidden lg:block"}),a.jsx("div",{className:"h-6 w-12 bg-gray-700/50 rounded-full"}),a.jsx("div",{className:"h-4 w-10 bg-gray-700 rounded-sm ml-auto"}),a.jsx("div",{className:"h-4 w-12 bg-gray-700 rounded-sm"}),a.jsx("div",{className:"h-4 w-10 bg-gray-700 rounded-sm"})]},s))]}):J||0!==V.length?a.jsx(f,{data:V,columns:Z,loading:!1,emptyMessage:"No characters found",pageSize:0,onSort:ea,sortKey:W,sortDirection:K.sortDir,onRowClick:a=>B(`/characters/${a.id}`),cardLayout:"vertical",mobileBreakpoint:"lg"}):a.jsx(v,{icon:d,title:"No characters found",description:aa>0?"Try adjusting your filters.":"No characters have been imported yet.",action:aa>0?{label:"Clear Filters",onClick:sa}:void 0}),a.jsx(j,{...K.paginationProps(X,G)})]})}export{B 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.