PageSourceSearch

https://rideyrbike.com/assets/LeaderboardPage-CNxa9zjO.js

js rideyrbike.com collected 2026-10-04 13:46:31 UTC 35,340 bytes, 1 lines download raw bytes

1var be=Object.defineProperty;var o=(c,l)=>be(c,"name",{value:l,configurable:!0});import{r as b,h as xe,j as t,a_ as de,d as oe,e as le,a1 as ke,b as Ne,u as ve,F as Se,a8 as ee,W as we,f as je,X as te}from"./index-Cx-wwxL2.js";import{c as Ce,d as Te,o as Ie}from"./shareOgMeta-NI8I_Pk9.js";import{k as se,q as ae,j as re,w as ne,l as Fe}from"./firebase-vendor-DrK1eMGA.js";import{g as Le}from"./generateInitialsIcon-5w_1JrQn.js";import{p as Me}from"./riderAvatarDisplay-DzOLsn3X.js";import{e as ie}from"./eventCrowDistance-B-T6Qc5I.js";import{d as Re}from"./debounce-CdocHAIz.js";import{a as Ae,f as De,i as ue,c as Ee}from"./riderAdminStatus-DboaYbQX.js";import{l as Pe,e as Ue}from"./eventStatisticsCompute-B0pPZtqw.js";import{r as $e}from"./riderMileagerDisplay-B4WDNbCK.js";import{c as Be}from"./liveCrowDistance-BNyCGPe5.js";import{c as me}from"./riderMarkerDetailDisplay-DMBzIW-Z.js";import{a as He,L as We}from"./publicReadMode-DRWm_0En.js";import{f as _e}from"./liveLeaderboardSnapshot-BwOav7-I.js";import{a as Oe}from"./liveLeaderboardSnapshotConvert-DrBwdaMm.js";import"./riderDisplayName-DcOlGv56.js";import"./formatCheckpointDuration-CyH_0aMS.js";import"./routeSplitGeo-Cano5D2j.js";import"./historyStopDetection-BlvT1gqq.js";import"./routeProjection-5bSdAT-I.js";function ce(c){const l=c.trim();return/^https?:\/\//i.test(l)?l:`https://${l}`}o(ce,"normalizeWeblinkHref");function qe(c,l){const n=l.data.historyUrlId?.trim()||typeof l.data.uniqueId=="string"&&l.data.uniqueId.trim()||l.userId;return`/rider-history/${c}/${n}`}o(qe,"leaderboardRiderHistoryPath");function Ge(c){return typeof c=="string"&&(c.startsWith("http")||c.startsWith("data:")||c.includes("firebasestorage.googleapis.com"))}o(Ge,"isValidLeaderboardImageUrl");const fe=o(({riderName:c,imageUrl:l,sizePx:n,className:N})=>{const[x,I]=b.useState(!1),S=b.useMemo(()=>Le(c,n),[c,n]);return b.useEffect(()=>{I(!1)},[l]),l&&Ge(l)&&!x?t.jsx("img",{src:l,alt:c||"Rider photo",width:n,height:n,className:N??"object-cover",style:{width:n,height:n,borderRadius:"4px"},onError:o(()=>I(!0),"onError")}):t.jsx("img",{src:S,alt:`${c} initials`,width:n,height:n,className:N??"object-cover",style:{width:n,height:n,borderRadius:"4px"}})},"LeaderboardRiderAvatar"),Ve=o(()=>{const[c,l]=b.useState(window.innerWidth<768);return b.useEffect(()=>{const n=o(()=>{l(window.innerWidth<768)},"handleResize");return window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[]),c},"useIsMobile"),ze=o(c=>`lb-status-badge lb-status-${String(c||"pre-race").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"pre-race"}`,"statusBadgeClass"),he=o(({status:c})=>{const l=String(c||"pre-race").trim().toUpperCase()||"PRE-RACE";return t.jsx("span",{className:ze(c),"data-status":l,children:l})},"StatusBadge"),Xe=o(({instagram:c,weblink:l,compact:n=!1})=>{const N=oe(c),x=le(c),I=typeof l=="string"?l.trim():"";return!N&&!I?null:t.jsxs("div",{className:n?"lb-rider-social-links lb-rider-social-links--compact":"lb-rider-social-links",children:[N&&x?t.jsx("a",{href:N,target:"_blank",rel:"noopener noreferrer",className:"lb-link",onClick:o(S=>S.stopPropagation(),"onClick"),children:n?"IG":x}):null,I?t.jsx("a",{href:ce(I),target:"_blank",rel:"noopener noreferrer",className:"lb-link",onClick:o(S=>S.stopPropagation(),"onClick"),children:"Web"}):null]})},"LeaderboardRiderSocialLinks"),ge=o(({rider:c,eventId:l,className:n})=>{const N=c.data.name||"Unknown Rider";return l?t.jsx(ke,{to:qe(l,c),className:`lb-rider-name-link ${n??""}`.trim(),title:"View rider history",children:N}):t.jsx("span",{className:n,children:N})},"LeaderboardRiderName"),pe=o(({riders:c,displayFields:l,sortColumn:n,onSort:N,formatValue:x,getDataType:I,eventRaceStartTime:S,eventId:i,isAdmin:e=!1,eventConfig:D,editingCell:w,setEditingCell:T,onUpdateCheckpointTime:L,saving:M,onUpdateRiderStatus:O,updatingStatus:A})=>{const[q,E]=b.useState(""),W=o(s=>["cp1","cp2","cp3","finish"].includes(s),"isCheckpointField"),X=o((s,F)=>{if(e&&W(F)){T({riderId:s,field:F});const m=c.find(j=>j.userId===s);if(m){const j=m.data[F];if(j&&S){const f=new Date(j*1e3),v=f.getFullYear(),_=String(f.getMonth()+1).padStart(2,"0"),B=String(f.getDate()).padStart(2,"0"),P=String(f.getHours()).padStart(2,"0"),z=String(f.getMinutes()).padStart(2,"0");E(`${v}-${_}-${B}T${P}:${z}`)}else E("")}}},"handleCellClick"),Y=o(async(s,F)=>{if(!D?.firestoreRidersCollection)return;let m=null;if(q){const j=new Date(q);m=Math.floor(j.getTime()/1e3)}await L(s,F,m,D.firestoreRidersCollection)},"handleSave"),$=o(()=>{T(null),E("")},"handleCancel"),J=Ve(),K=xe(s=>s.useAlternateMarkers),Z=o(s=>{if(!K)return Me({imageMarker:typeof s.imageMarker=="string"?s.imageMarker:void 0,image:typeof s.image=="string"?s.image:void 0})??void 0},"leaderboardProfileImageUrl");return J?t.jsx("div",{className:"space-y-2",style:{fontFamily:"'LeagueGothic', system-ui, Avenir, Helvetica, Arial, sans-serif"},children:c.map((s,F)=>{const m=Z(s.data),j=s.data.name||"Unknown";return t.jsx("div",{className:"rounded-lg p-2.5 border-l-4 transition-all duration-300 hover:scale-[1.01]",style:{background:"rgba(0, 0, 0, 0.85)",borderLeftColor:"#dc2626",borderTopColor:"rgba(220, 38, 38, 0.3)",borderRightColor:"rgba(220, 38, 38, 0.3)",borderBottomColor:"rgba(220, 38, 38, 0.3)",boxShadow:"0 2px 8px rgba(220, 38, 38, 0.2)"},children:t.jsxs("div",{className:"flex items-start gap-2.5 mb-1.5",children:[t.jsx("div",{className:"flex-shrink-0",children:t.jsx("div",{style:{width:"50px",height:"50px",borderRadius:"4px",overflow:"hidden",border:"2px s
1olid rgba(220, 38, 38, 0.5)"},children:t.jsx(fe,{riderName:j,imageUrl:typeof m=="string"?m:void 0,sizePx:50,className:"w-full h-full object-cover"})})}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"flex items-center justify-between mb-1",children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsxs("span",{className:"text-white text-xl opacity-70",style:{fontWeight:"normal"},children:["#",F+1]}),t.jsx("h3",{className:"text-white text-2xl truncate",style:{fontWeight:"normal"},children:t.jsx(ge,{rider:s,eventId:i,className:"text-white text-2xl truncate"})})]})}),t.jsx(Xe,{instagram:s.data.instagram,weblink:s.data.weblink,compact:!0}),t.jsx("div",{className:"space-y-0.5",children:l.filter(f=>{if(f.key==="image"||f.key==="name"||f.key==="instagram"||f.key==="weblink")return!1;let v;return f.composite?(v=f.composite.map(B=>s.data[B]||"").filter(Boolean).join(f.separator||""),v||(v=null)):v=s.data[f.key],!(v==null||v===""||["cp1","cp2","cp3","finish"].includes(f.key)&&(v===0||v==="0"))}).map(f=>{let v;f.composite?(v=f.composite.map(H=>s.data[H]||"").filter(Boolean).join(f.separator||""),v||(v=null)):v=s.data[f.key];const _=w?.riderId===s.userId&&w?.field===f.key,B=W(f.key),P=s.data[`${f.key}_mysql`],z=s.data[`${f.key}_firestore`];let U=null,G=null;return f.format==="instagramLink"&&(U=de(v),G=oe(v)),t.jsxs("div",{className:`flex justify-between items-start text-lg ${e&&B?"cursor-pointer":""}`,onClick:o(()=>X(s.userId,f.key),"onClick"),style:{borderBottom:"1px solid rgba(220, 38, 38, 0.2)",paddingBottom:"0.25rem"},children:[t.jsxs("span",{className:"flex-shrink-0 mr-2",style:{color:"#ffffff",opacity:.7,fontWeight:"normal"},children:[f.label,":"]}),t.jsx("div",{className:"text-right flex-1 min-w-0 lb-mobile-value",children:_?t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx("input",{type:"datetime-local",value:q,onChange:o(H=>E(H.target.value),"onChange"),className:"px-2 py-1 bg-gray-700 text-white rounded text-xs w-full",autoFocus:!0,onClick:o(H=>H.stopPropagation(),"onClick")}),t.jsxs("div",{className:"flex gap-1",children:[t.jsx("button",{onClick:o(H=>{H.stopPropagation(),Y(s.userId,f.key)},"onClick"),disabled:M,className:"px-2 py-1 bg-green-600 text-white rounded text-xs hover:bg-green-700 disabled:opacity-50",children:M?"Saving...":"Save"}),t.jsx("button",{onClick:o(H=>{H.stopPropagation(),$()},"onClick"),className:"px-2 py-1 bg-gray-600 text-white rounded text-xs hover:bg-gray-700",children:"Cancel"})]})]}):e&&B?t.jsxs("div",{className:"flex flex-col gap-1 text-xs items-center",children:[t.jsxs("div",{className:"text-cyan-300",style:{fontWeight:"normal"},children:["MySQL:"," ",P!==void 0?x(P,I(P),f.format,s,S):"N/A"]}),t.jsxs("div",{className:"text-yellow-300",style:{fontWeight:"normal"},children:["Firestore:"," ",z!==void 0?x(z,I(z),f.format,s,S):"N/A"]}),t.jsx("div",{className:"text-gray-400 italic mt-1",children:"Tap to edit"})]}):f.format==="instagramLink"?U&&G?t.jsx("a",{href:G,target:"_blank",rel:"noopener noreferrer",className:"lb-link",children:le(v)}):t.jsx("span",{style:{color:"#ffffff",opacity:.5},children:"-"}):f.format==="weblink"?v?t.jsx("a",{href:ce(String(v)),target:"_blank",rel:"noopener noreferrer",className:"lb-link",children:"Web"}):t.jsx("span",{style:{color:"#ffffff",opacity:.5},children:"-"}):f.key==="status"&&!e?t.jsx(he,{status:v}):f.key==="status"&&e&&O?t.jsxs("select",{value:s.data.status||"pre-race",onChange:o(H=>{const Q=H.target.value;Q&&Q!==s.data.status&&O(s.userId,Q)},"onChange"),disabled:A===s.userId,className:`px-2 py-1 rounded text-xs ${s.data.status==="FINISH"?"bg-green-600 text-white":s.data.status==="SCRATCH"?"bg-red-600 text-white":s.data.status==="RIDING"?"bg-blue-600 text-white":"bg-gray-600 text-white"} disabled:opacity-50`,style:{fontWeight:"normal"},onClick:o(H=>H.stopPropagation(),"onClick"),children:[t.jsx("option",{value:"pre-race",children:"pre-race"}),t.jsx("option",{value:"RIDING",children:"RIDING"}),t.jsx("option",{value:"FINISH",children:"FINISH"}),t.jsx("option",{value:"SCRATCH",children:"SCRATCH"})]}):t.jsx("span",{className:"break-words",children:x(v,I(v),f.format,s,S)||"-"})})]},f.key)})})]})]})},s.userId)})}):t.jsxs("div",{className:"leaderboard-table-scroll",children:[t.jsx("p",{className:"leaderboard-table-scroll-hint","aria-hidden":"true",children:"Scroll horizontally for more columns →"}),t.jsxs("table",{className:"leaderboard-table",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsxs("th",{className:"lb-col-rank",onClick:o(()=>{const s=l.find(F=>F.key==="name");if(s){const F=l.findIndex(m=>m.key==="name");N(F,"name",s.sortType,s.composite)}},"onClick"),children:["#",n.key==="name"&&t.jsx("span",{className:"lb-sort-indicator",children:n.asc?"▲":"▼"})]}),l.map((s,F)=>t.jsxs("th",{"data-cell-type":s.key,className:s.key==="name"?"lb-col-name":void 0,onClick:o(()=>s.sortType&&N(F,s.key,s.sortType,s.composite),"onClick"),children:[s.label,n.key===s.key&&t.jsx("span",{className:"lb-sort-indicator",children:n.asc?"▲":"▼"})]},s.key))]})}),t.jsx("tbody",{children:c.map((s,F)=>t.jsxs("tr",{children:[t.jsx("td",{className:"lb-col-rank",children:F+1}),l.map(m=>{let j;m.composite?(j=m.composite.map(U=>
1s.data[U]||"").filter(Boolean).join(m.separator||""),j||(j=null)):j=s.data[m.key];const f=w?.riderId===s.userId&&w?.field===m.key,v=W(m.key),_=s.data[`${m.key}_mysql`],B=s.data[`${m.key}_firestore`];let P=null,z=null;return m.format==="instagramLink"&&(P=de(j),z=oe(j)),t.jsx("td",{"data-cell-type":m.key,"data-status":m.key==="status"?String(j||"pre-race").toUpperCase():void 0,className:m.key==="name"?"lb-col-name":e&&v?"lb-cell-editable":void 0,onClick:o(()=>X(s.userId,m.key),"onClick"),children:f?t.jsxs("div",{className:"flex flex-col gap-1 items-center",children:[t.jsx("input",{type:"datetime-local",value:q,onChange:o(U=>E(U.target.value),"onChange"),className:"px-2 py-1 bg-gray-700 text-white rounded text-xs",autoFocus:!0}),t.jsxs("div",{className:"flex gap-1",children:[t.jsx("button",{onClick:o(U=>{U.stopPropagation(),Y(s.userId,m.key)},"onClick"),disabled:M,className:"px-2 py-1 bg-green-600 text-white rounded text-xs hover:bg-green-700 disabled:opacity-50",children:M?"Saving...":"Save"}),t.jsx("button",{onClick:o(U=>{U.stopPropagation(),$()},"onClick"),className:"px-2 py-1 bg-gray-600 text-white rounded text-xs hover:bg-gray-700",children:"Cancel"})]})]}):e&&v?t.jsxs("div",{className:"flex flex-col gap-1 items-center",children:[t.jsxs("div",{className:"text-cyan-300 text-xs",style:{fontWeight:"normal"},children:["MySQL:"," ",_!==void 0?x(_,I(_),m.format,s,S):"N/A"]}),t.jsxs("div",{className:"text-yellow-300 text-xs",style:{fontWeight:"normal"},children:["Firestore:"," ",B!==void 0?x(B,I(B),m.format,s,S):"N/A"]}),t.jsx("div",{className:"text-gray-400 text-xs italic mt-1",children:"Click to edit Firestore time"})]}):m.key==="name"?t.jsx(ge,{rider:s,eventId:i}):m.key==="image"?t.jsx(fe,{riderName:s.data.name||"Unknown",imageUrl:Z(s.data),sizePx:48}):m.key==="status"&&!e?t.jsx(he,{status:j}):m.format==="instagramLink"&&P&&z?t.jsx("div",{className:"flex justify-center",children:t.jsx("a",{href:z,target:"_blank",rel:"noopener noreferrer",className:"lb-link",children:le(j)})}):m.format==="weblink"&&j?t.jsx("div",{className:"flex justify-center",children:t.jsx("a",{href:ce(String(j)),target:"_blank",rel:"noopener noreferrer",className:"lb-link",children:"Web"})}):m.key==="status"&&e&&O?t.jsxs("div",{className:"flex items-center justify-center gap-2",children:[t.jsxs("select",{value:s.data.status||"pre-race",onChange:o(U=>{const G=U.target.value;G&&G!==s.data.status&&O(s.userId,G)},"onChange"),disabled:A===s.userId,className:`px-2 py-1 rounded text-xs ${s.data.status==="FINISH"?"bg-green-600 text-white":s.data.status==="SCRATCH"?"bg-red-600 text-white":s.data.status==="RIDING"?"bg-blue-600 text-white":"bg-gray-600 text-white"} disabled:opacity-50`,style:{fontWeight:"normal"},children:[t.jsx("option",{value:"pre-race",children:"pre-race"}),t.jsx("option",{value:"RIDING",children:"RIDING"}),t.jsx("option",{value:"FINISH",children:"FINISH"}),t.jsx("option",{value:"SCRATCH",children:"SCRATCH"})]}),A===s.userId&&t.jsx("span",{className:"text-xs text-gray-400",children:"Updating..."})]}):t.jsx("div",{className:"flex justify-center",children:t.jsx("span",{className:"break-words",children:x(j,I(j),m.format,s,S)||"-"})})},m.key)})]},s.userId))})]})]})},"LeaderboardTable");function Ye(c,l){const n=typeof c.uniqueId=="string"?c.uniqueId.trim():"";return n&&n!==l?n:void 0}o(Ye,"historyUrlIdFromRiderDoc");function Ze(c,l,n){const N=n?.raceStartSec,x=[];return(Object.keys(c).length>0?Object.keys(c):Object.keys(l)).forEach(S=>{const i=c[S]||{},e=l[S]||{};if(Ae({...e,...i,userId:S},S,n?.eventId??null))return;const D=e.position,w=D?.latitude,T=D?.longitude,L=e.cp1,M=e.cp2,O=e.cp3,A=e.finish,q=i.name||e.name||`Rider ${S.substring(0,8)}`,E={...e,unixtime:e.lastActivityUnixtime||e.lastUpdated?.seconds||e.unixtime||null,routeMileMarker:e.routeMileMarker,routeMilesTotal:e.routeMilesTotal,routeMilesToFinish:e.routeMilesToFinish},W=N==null||N<=0||!Pe(E,N),X=W&&typeof e.routeMilesTotal=="number"?e.routeMilesTotal:void 0,Y=Ue(E,N);let $="";typeof Y=="number"&&typeof X=="number"?$=`${Math.round(Y)}/${Math.round(X)}`:W&&e.currentMile&&($=String(e.currentMile));const J=e.nextCheckpointRouteMiles,K=e.nextCheckpointCrowMiles,Z=e.nextCheckpointGroup;let s="";if(typeof J=="number"||typeof K=="number"){const m=typeof J=="number"?J.toFixed(1):"—",j=typeof K=="number"?K.toFixed(1):"—";s=`${Z?`${String(Z)} `:""}${m} / ${j}`.trim()}const F={...i,name:q,userId:S,latitude:w?.toString()||"",longitude:T?.toString()||"",position:D,cp1:L,cp2:M,cp3:O,finish:A,cp1_firestore:L,cp2_firestore:M,cp3_firestore:O,finish_firestore:A,adminStatus:e.adminStatus,adminStatusSetBy:e.adminStatusSetBy,adminStatusSetAt:e.adminStatusSetAt,adminStatusNote:e.adminStatusNote,status:(()=>{const m=e.status||i.currentRaceStatus||"pre-race";return De({adminStatus:e.adminStatus,status:m})??m})(),finishLocation:i.finishLocation||e.finishLocation,distanceToFinish:W?e.distanceToFinish:void 0,lastUpdatedDistanceToFinish:W?e.lastUpdatedDistanceToFinish:void 0,routeProgressMi:$,routeMilesToFinish:W?e.routeMilesToFinish:void 0,routeMilesTotal:W?e.routeMilesTotal:void 0,routeMileMarker:Y,distanceToFinishCrow:ie(n?.eventId)||W?e.distanceToFinishCrow:void 0,nextCpSummary:s,nextCheckpointGroup:Z,checkpointMilesRemaining:e.checkpointMilesRemaining,checkpointCrowMiles:e.checkpointCrowMiles,unixtime:e.lastActivityUnixtime||e.lastUpdated?.seconds||e.unixtime||null,speed:me(e.speed)??me(i.speed),altitude:e.altitude||i.altitude||"",batteryValue:e.batteryValue||i.batteryValue||"",charging:e.charging||i.charging||!1,locationName:e.locationName||i.locationName||"",mileager:$e(e),operatingSystem:e.operatingSystem||i.operatingSystem,lastLoginPlatform:i.lastLoginPlatform,lastLoginAppVersion:i.lastLoginAppVersion,versionBuild:e.versionBuild||i.versionBuild,image:i.image||e.image||"",imageMarker:i.imageMarker||e.imageMarker||"",instagram:i.instagram||e.instagram||"",weblink:i.weblink||e.weblink||"",uniqueId:typeof e.uniqueId=="string"&&e.uniqueId.trim()||S,historyUrlId:Ye(e,S),city:i.city||e.city||"",state:i.state||e.state||"",country:i.country||e.country||"",age:i.age,routeName:i.routeName||e.routeName||""};if(ie(n?.eventId)&&typeof w=="number"&&typeof T=="number"){const m=
1Be(w,T,n?.finishLocations,F.finishLocation);m!=null&&(F.distanceToFinishCrow=m)}x.push({userId:S,data:F})}),x}o(Ze,"buildMergedRidersFromFirestore");function ye(c,l){return c.some(n=>{const N=n.data[l];return typeof N=="number"&&Number.isFinite(N)})}o(ye,"riderHasNumericField");function Qe(c){return c.some(l=>{const n=l.data.distanceToFinish;if(n==null)return!1;const N=parseFloat(String(n).replace(/[^0-9.-]+/g,""));return Number.isFinite(N)})}o(Qe,"riderHasDistanceToFinishString");function Je(c,l){if(ie(c)){if(ye(l,"distanceToFinishCrow"))return"distanceToFinishCrow";if(Qe(l))return"distanceToFinish"}return ye(l,"routeMilesToFinish")?"routeMilesToFinish":"name"}o(Je,"resolveLeaderboardDefaultSortKey");function Ke(c,l){return c.find(n=>n.key===l)}o(Ke,"displayFieldForDefaultSort");function et(c,l,n,N,x,I,S,i){if(new Set(["distanceToFinishCrow","distanceToFinish","routeMilesToFinish","finish","cp1","cp2","cp3"]).has(n)&&i!=null&&i>0){const L=ue(c.data,{riderDocId:c.userId,raceStartSec:i}),M=ue(l.data,{riderDocId:l.userId,raceStartSec:i});if(L&&!M)return 1;if(!L&&M)return-1}const D=S(c,n,N,x,I),w=S(l,n,N,x,I);let T=0;if(typeof D=="number"&&typeof w=="number")D===1/0&&w===1/0?T=0:D===1/0&&w!==1/0?T=1:w===1/0&&D!==1/0?T=-1:isNaN(D)&&isNaN(w)?T=0:isNaN(D)?T=1:isNaN(w)?T=-1:T=D-w;else{const L=String(D),M=String(w);L===""&&M===""?T=0:L===""?T=1:M===""?T=-1:T=L.localeCompare(M,void 0,{numeric:!0,sensitivity:"base"})}return I?T:-T}o(et,"compareLeaderboardRows");function vt(){const{eventId:c}=Ne(),[l]=ve(),n=c||l.get("eventId")||void 0,{events:N,selectedEvent:x,setSelectedEvent:I}=Se();b.useEffect(()=>{if(!n)return;const r=N.find(u=>u.id===n);if(r&&!ee(r)){(r.id!==x?.id||ee(x))&&I(r);return}if(x?.id===n&&!ee(x))return;let a=!1;return we(n).then(u=>{!a&&u&&I(u)}),()=>{a=!0}},[n,N,x,I]);const S=b.useMemo(()=>{if(n&&x?.id===n&&!ee(x))return x;if(n&&N.length>0){const r=N.find(a=>a.id===n);if(r&&!ee(r))return r}return x&&!ee(x),x},[n,N,x]),i=n||S?.id,e=S,[D,w]=b.useState(!0),[T,L]=b.useState(null),[M,O]=b.useState([]),[A,q]=b.useState({index:-1,key:null,asc:!0}),[E,W]=b.useState("All"),X=b.useCallback(r=>je(r),[]),Y="USERS",$=b.useMemo(()=>[{key:"name",label:"Rider",sortType:"string",primaryInfo:!0},{key:"image",label:"Photo",sortType:null},{key:"cp1",label:"CP1",sortType:"number",format:"durationDHM"},{key:"cp2",label:"CP2",sortType:"number",format:"durationDHM"},{key:"cp3",label:"CP3",sortType:"number",format:"durationDHM"},{key:"finish",label:"FINISH",sortType:"number",format:"durationDHM"},{key:"status",label:"Status",sortType:"string"},{key:"finishLocation",label:"Finish Location",sortType:"string"},{key:"routeName",label:"Route",sortType:"string",format:"routeName"},{key:"unixtime",label:"Last Update",format:"timeAgo",sortType:"number"},{key:"speed",label:"Speed",suffix:" MPH",sortType:"numberFromString"},{key:"altitude",label:"Current Altitude",suffix:" ft",sortType:"numberFromString"},{key:"locationName",label:"Current Location",sortType:"string"},{key:"cityStateCountry",label:"Home Location",composite:["city","state","country"],separator:", ",sortType:"string"},{key:"age",label:"Age",sortType:"numberFromString"},{key:"distanceToFinish",label:"To Finish",suffix:" miles",sortType:"numberFromString"},{key:"routeProgressMi",label:"Along route",sortType:"string"},{key:"routeMilesToFinish",label:"Rt left",suffix:" mi",sortType:"number"},{key:"distanceToFinishCrow",label:"Crow Fin",suffix:" mi",sortType:"number"},{key:"nextCpSummary",label:"Next CP (rt/crow)",sortType:null},{key:"mileager",label:"Odometer",sortType:"numberFromString"},{key:"charging",label:"Charging",sortType:"string"},{key:"batteryPercent",label:"Battery",suffix:"%",sortType:"numberFromString"},{key:"instagram",label:"Instagram",sortType:"string",format:"instagramLink"},{key:"weblink",label:"Web Link",sortType:"string",format:"weblink"},{key:"source",label:"Source",sortType:"string"},{key:"versionBuild",label:"App Ver",sortType:"string"}],[]),J=b.useCallback(r=>{if(r==null||typeof r!="number"||r<0)return"";if(r===0)return"0m";const a=Math.floor(r/(1440*60));r%=1440*60;const u=Math.floor(r/3600);r%=3600;const k=Math.floor(r/60),d=[];return a>0&&d.push(a+"d"),u>0&&d.push(u+"h"),(k>0||a===0&&u===0)&&d.push(k+"m"),d.length>0?d.join(" "):"0m"},[]),K=b.useCallback(r=>
1{if(r==null)return"";let a;if(typeof r=="string"){if(a=parseFloat(r),isNaN(a)){const g=new Date(r);if(!isNaN(g.getTime()))a=Math.floor(g.getTime()/1e3);else return""}}else a=r;a>4102444800&&(a=Math.floor(a/1e3));const k=Math.floor(Date.now()/1e3)-a;if(k<0)return"";if(k<60)return`${k}s ago`;if(k<3600)return`${Math.floor(k/60)}m ago`;if(k<86400)return`${Math.floor(k/3600)}h ago`;const d=Math.floor(k/86400);return d===1?"1 day ago":d<=30?`${d} days ago`:new Date(a*1e3).toLocaleDateString()},[]),Z=b.useCallback(r=>{if(r===null)return"null";if(r===void 0)return"undefined";const a=typeof r;return a==="object"?Array.isArray(r)?"array":"object":a==="string"?!isNaN(r)&&!isNaN(parseFloat(r))&&r.trim()!==""?r.includes(".")||r.toLowerCase().includes("e")?"number (from string - float)":"number (from string - int)":r.startsWith("http")&&(r.endsWith(".jpg")||r.endsWith(".jpeg")||r.endsWith(".png")||r.endsWith(".gif")||r.includes("firebasestorage.googleapis.com"))?"imageURL (string)":r.toLowerCase()==="true"||r.toLowerCase()==="false"?"boolean (from string)":"string":a==="number"?Number.isInteger(r)?"number (int)":"number (float)":a},[]),s=b.useCallback((r,a,u,k,d)=>{if(r==null)return"";if(u==="durationDHM"){const p=Number(r),g=946684800,h=31536e3;if(p<=0||isNaN(p))return"";let y;const C=p>g,V=p>h;if(C||V)if(d){const R=Number(d);if(!isNaN(R)&&R>0)if(p>=R)y=p-R;else return console.warn(`Checkpoint time ${p} is before race start ${R}`),"";else return console.warn(`Invalid race start time: ${d}`),""}else if(p<=h)y=p;else return"";else y=p;return J(y)}if(u==="timeAgo")return K(Number(r));if(u==="routeName"){const p={TransAmBikeRace:"Trans Am Bike Race Classic",transAmBikeRace:"Trans Am Bike Race Classic",BikeNonstopUS:"Bike Nonstop US",bikeNonstopUS:"Bike Nonstop US",TABNSshort:"Trans Am Bike Nonstop Short Legal",TABNSshortRoute:"Trans Am Bike Nonstop Short Legal",NWNS:"Northwest Bike Nonstop",northwestNonstop:"Northwest Bike Nonstop",SNS:"Snoqualmie Bike Nonstop",snoqualmieNonstop:"Snoqualmie Bike Nonstop",WNS:"Willamt Bike Nonstop",willamtNonstop:"Willamt Bike Nonstop"},g=String(r).trim();return p[g]||g||""}if(a==="boolean (from string)")return r.toLowerCase();if(a==="boolean")return String(r);if(a==="object"||a==="array")try{const p=JSON.stringify(r);return p.length>30?p.substring(0,27)+"...":p}catch{return"[Object]"}if(typeof r=="number"&&u!=="durationDHM"&&u!=="timeAgo")return r%1!==0?r.toFixed(1):String(r);if(a&&a.startsWith("number (from string")&&u!=="durationDHM"&&u!=="timeAgo"){const p=parseFloat(String(r).replace(/[^0-9.-]+/g,""));if(!isNaN(p))return p%1!==0?p.toFixed(1):String(Math.round(p))}return String(r)},[J,K]),F=b.useCallback((r,a,u,k,d)=>{const p=r.data;let g;if(k){const h=$.find(y=>y.key===a);g=k?.map(y=>p[y]||"").filter(Boolean).join(h?.separator||"")}else g=p[a];if(g==null||String(g).trim()==="")return u==="number"||u==="numberFromString"||u==="date"?1/0:"";if(u==="number"){const h=Number(g);return isNaN(h)?1/0:h}if(u==="numberFromString"){const h=parseFloat(String(g).replace(/[^0-9.-]+/g,""));return isNaN(h)?1/0:h}if(u==="date"){const h=Number(g);return isNaN(h)?1/0:h}return a==="finishLocation"?X(g).toLowerCase():String(g).toLowerCase()},[$,X]),m=b.useCallback((r,a,u,k)=>{const d=e?.targetDateTime??null;try{O(p=>[...p].sort((h,y)=>et(h,y,r,a,u,k,F,d)))}catch(p){console.error("Error during sorting:",p)}},[F,e?.targetDateTime]),j=b.useCallback((r,a,u,k)=>{const d=A.index===r?!A.asc:!0;q({index:r,key:a,asc:d}),m(a,u,k,d)},[A,m]),f=b.useRef({}),v=b.useRef(!1),_=b.useRef(!0);b.useEffect(()=>{v.current=!1,_.current=!0},[i]);const B=b.useCallback(r=>{const a=Ze(f.current,r,{raceStartSec:e?.targetDateTime,eventId:i,finishLocations:e?.finishLocations});if(a.length===0){L(`No riders found for event: ${i}`),O([]),w(!1);return}if(L(null),O(a),console.log(`[LeaderboardPage] Merged ${a.length} riders for event ${i}`),!v.current){v.current=!0;const u=Je(i,a),k=Ke($,u);if(k?.sortType)m(u,k.sortType,k.composite,!0),q({index:-1,key:u,asc:!0});else{const d=$.find(p=>p.key==="name");d?.sortType&&(m("name",d.sortType,d.composite,!0),q({index:-1,key:"name",asc:!0}))}}w(!1)},[$,i,m,e?.targetDateTime]);b.useEffect(()=>{if(!i){L("No event selected."),w(!1),console.log("LeaderboardPage: No event selected. eventId from URL:",n,"selectedEvent:",x?.id);return}if(!e){console.log("LeaderboardPage: Waiting for event config to load..."),w(!0);return}const r=e.firestoreRidersCollection||i;if(!r){L("Event configuration is incomplete. Please try again."),w(!1);return}let a=!1,u=null,k=null;const d=Re(g=>{a||B(g)},900);w(!0),L(null),O([]);const p=e.targetDateTime!=null?e.targetDateTime>1e11?Math.floor(e.targetDateTime/1e3):Math.floor(e.targetDateTime):null;if(He(i,p)){const g=o(async()=>{try{let y=await se(ae(re(te,"users"),ne("events","array-contains",i)));if(y.empty&&(y=await se(ae(re(te,Y),ne("events","array-contains",i)))),a)return;const C={};
1y.forEach(V=>{const R=V.data();C[V.id]={...R,userId:V.id}}),f.current=C}catch(y){console.warn("[LeaderboardPage] USERS query failed in snapshot mode; country/profile columns may be incomplete",y)}},"loadEventUsers"),h=o(async()=>{try{const y=await _e(i);if(a||!y)return;const C=Oe(y);!a&&_.current?(_.current=!1,B(C)):a||d(C)}catch(y){console.error("Leaderboard snapshot poll error:",y),a||(L(`Failed to load leaderboard data: ${y.message}`),w(!1))}},"pollSnapshot");return(async()=>(await g(),a||(h(),k=setInterval(()=>{h()},We))))(),()=>{a=!0,d.cancel(),k&&clearInterval(k)}}return(async()=>{try{let g=await se(ae(re(te,"users"),ne("events","array-contains",i)));if(g.empty)try{g=await se(ae(re(te,Y),ne("events","array-contains",i)))}catch{console.log("[LeaderboardPage] USERS collection query failed, continuing with riders collection only")}if(a)return;const h={};g.forEach(y=>{const C=y.data();h[y.id]={...C,userId:y.id}}),f.current=h,u=Fe(re(te,r),y=>{const C={};y.forEach(V=>{C[V.id]=V.data()}),console.log(`[Firebase] Riders snapshot (${Object.keys(C).length}) from ${r}`),!a&&_.current?(_.current=!1,B(C)):a||d(C)},y=>{console.error("Leaderboard rider listener error:",y),a||(L(`Failed to load leaderboard data: ${y.message}`),w(!1))})}catch(g){console.error("LeaderboardPage: Data fetching error:",g),a||(L(`Failed to load leaderboard data: ${g.message}`),w(!1))}})(),()=>{a=!0,d.cancel(),u&&u()}},[i,e,B,n,x?.id]);const P=b.useMemo(()=>E==="All"?M:M.filter(r=>{const a=r.data.finishLocation;return X(a)===E}),[M,E,X]),{activeRiders:z,scratchedRiders:U}=b.useMemo(()=>{const r=[],a=[];for(const u of P)Ee(u.data)?a.push(u):r.push(u);return{activeRiders:r,scratchedRiders:a}},[P]),[G,H]=b.useState(!1),Q=b.useMemo(()=>{if(P.length===0)return $;const r=Date.now()/1e3,a=e?.targetDateTime,u=a?r>=a:!1,k=["status","cp1","cp2","cp3","finish","unixtime","speed","altitude","locationName","distanceToFinish","routeProgressMi","routeMilesToFinish","distanceToFinishCrow","nextCpSummary","mileager","charging","batteryPercent","source","versionBuild"];return $.filter(d=>d.key==="name"||d.key==="image"?!0:["cp1","cp2","cp3"].includes(d.key)&&!(e?.checkpoints&&e.checkpoints.length>0)||["routeProgressMi","routeMilesToFinish"].includes(d.key)&&!(e?.polylines&&e.polylines.length>0)||(d.key==="distanceToFinishCrow"||d.key==="distanceToFinish")&&!ie(i||e?.id)||d.key==="nextCpSummary"&&!(e?.checkpoints&&e.checkpoints.length>0)||!u&&k.includes(d.key)?!1:d.key==="instagram"||d.key==="weblink"?P.some(h=>{const y=h.data[d.key];return y!=null&&y!==""}):P.some(g=>{let h;return d.composite?(h=d.composite.map(C=>g.data[C]||"").filter(Boolean).join(d.separator||""),h||(h=null)):h=g.data[d.key],h==null||h===""||["cp1","cp2","cp3","finish"].includes(d.key)&&(h===0||h==="0")?!1:d.key==="charging"?typeof h=="boolean":!0}))},[P,$,e,i]);if(b.useEffect(()=>{if(A.key){const r=Q.findIndex(a=>a.key===A.key);if(r>=0&&r!==A.index)q(a=>({...a,index:r}));else if(r<0&&A.key!=="name"){const a=Q.findIndex(u=>u.key==="name");a>=0&&q({index:a,key:"name",asc:!0})}}},[Q,A.key,A.index]),b.useEffect(()=>{if(!i||typeof window>"u"||typeof document>"u")return;const r=window.location.href,a=e?{fullName:e.fullName,shortName:e.shortName,eventType:e.eventType,targetDateTime:e.targetDateTime,timeZone:e.timeZone,shareOgDescription:e.shareOgDescription,shareOgMeta:e.shareOgMeta}:void 0,u=Ce(i,a),k=Te(i,a),d=o((C,V)=>{let R=document.querySelector(`meta[property="${C}"]`);R||(R=document.createElement("meta"),R.setAttribute("property",C),document.head.appendChild(R)),R.setAttribute("content",V)},"setOg"),p=o((C,V)=>{let R=document.querySelector(`meta[name="${C}"]`);R||(R=document.createElement("meta"),R.setAttribute("name",C),document.head.appendChild(R)),R.setAttribute("content",V)},"setName");let g=document.querySelector('link[rel="canonical"]');g||(g=document.createElement("link"),g.setAttribute("rel","canonical"),document.head.appendChild(g)),g.setAttribute("href",r),d("og:url",r),d("og:title",u),d("og:description",k),p("twitter:title",u),p("twitter:description",k),document.title=u;let h=document.querySelector('meta[property="fb:app_id"]');h||(h=document.createElement("meta"),h.setAttribute("property","fb:app_id"),document.head.appendChild(h)),h.setAttribute("content","1439455923043906");const y=e?.sharePreviewOg?.leaderboardImageUrl;if(y){const C=Ie(y,e?.sharePreviewOg?.generatedAt);d("og:image",C),d("og:image:width","1200"),d("og:image:height","630"),p("twitter:image",C),p("twitter:card","summary_large_image")}},[i,e?.fullName,e?.shortName,e?.eventType,e?.targetDateTime,e?.timeZone,e?.shareOgDescription,e?.shareOgMeta,e?.sharePreviewOg?.leaderboardImageUrl,e?.sharePreviewOg?.generatedAt]),D)return t.jsxs("div",{id:"leaderboard-container",className:"leaderboard-page p-4 bg-gray-800 text-white min-h-screen",style:{fontFamily:"'LeagueGothic', system-ui, Avenir, Helvetica, Arial, sans-serif"},children:[t.jsx("h1",{className:"text-4xl mb-1",style:{fontWeight:"normal"},children:"Leaderboard"}),t.jsx("div",{className:"text-xl",children:"Loading Leaderboard..."}),t.jsxs("div",{style:{minHeight:400,marginTop:"1rem"},"aria-hidden":"true",children:[t.jsx("div",{style:{height:48,backgroundColor:"rgba(255,255,255,0.1)",borderRadius:4,marginBottom:8}}),[1,2,3,4,5,6,7,8].map(r=>
1t.jsx("div",{style:{height:56,backgroundColor:"rgba(255,255,255,0.05)",borderRadius:4,marginBottom:4}},r))]})]});if(T)return t.jsxs("div",{id:"leaderboard-container",className:"leaderboard-page p-4 bg-gray-800 text-white min-h-screen",style:{fontFamily:"'LeagueGothic', system-ui, Avenir, Helvetica, Arial, sans-serif"},children:[t.jsx("h1",{className:"text-4xl mb-1",style:{fontWeight:"normal"},children:"Leaderboard"}),t.jsxs("div",{className:"p-1 text-xl text-red-500",children:["Error: ",T]})]});if(P.length===0){let r=`No riders data available for ${i||"selected event"}.`;return E!=="All"&&(r=`No riders found for Finish Location: ${E} in ${i||"selected event"}.`),t.jsxs("div",{id:"leaderboard-container",className:"leaderboard-page p-4 bg-gray-800 text-white min-h-screen",style:{fontFamily:"'LeagueGothic', system-ui, Avenir, Helvetica, Arial, sans-serif"},children:[t.jsx("h1",{className:"text-4xl mb-1",style:{fontWeight:"normal"},children:"Leaderboard"}),t.jsx("div",{className:"p-4 text-white",children:r}),t.jsxs("div",{className:"p-4 text-gray-400 text-sm",children:["Debug info: allRidersDataCache length = ",M.length,", eventIdToUse = ",i||"undefined"]})]})}return t.jsxs("div",{id:"leaderboard-container",className:"leaderboard-page p-4 bg-gray-800 text-white min-h-screen",style:{width:"100%",maxWidth:"100vw",overflowX:"hidden",boxSizing:"border-box",padding:"clamp(0.5rem, 1.5vw, 1rem)",fontFamily:"'LeagueGothic', system-ui, Avenir, Helvetica, Arial, sans-serif"},children:[t.jsx("h1",{className:"text-4xl mb-1",style:{color:"#ffffff",textShadow:"0 0 20px rgba(220, 38, 38, 0.8), 0 2px 4px rgba(0, 0, 0, 0.5)",filter:"drop-shadow(0 2px 4px rgba(0,0,0,0.5))",fontWeight:"normal"},children:"Leaderboard"}),t.jsxs("div",{className:"lb-filters",children:[t.jsxs("label",{children:[t.jsx("input",{type:"radio",name:"finishFilter",value:"All",checked:E==="All",onChange:o(r=>W(r.target.value),"onChange"),className:"mr-1 accent-red-600"}),t.jsx("span",{className:"text-white",style:{fontWeight:"normal"},children:"All"})]}),e?.finishLocations&&e.finishLocations.length>0?e.finishLocations.filter(r=>r?.name).map(r=>{const a=r.name||"";return t.jsxs("label",{children:[t.jsx("input",{type:"radio",name:"finishFilter",value:a,checked:E===a,onChange:o(u=>W(u.target.value),"onChange"),className:"mr-1 accent-red-600"}),t.jsx("span",{className:"text-white",style:{fontWeight:"normal"},children:a})]},a)}):null]}),t.jsx(pe,{riders:z,displayFields:Q,sortColumn:A,onSort:j,formatValue:s,getDataType:Z,eventRaceStartTime:e?.targetDateTime,eventId:i,isAdmin:!1,eventConfig:e||void 0,editingCell:null,setEditingCell:o(()=>{},"setEditingCell"),onUpdateCheckpointTime:o(async()=>{},"onUpdateCheckpointTime"),saving:!1,onUpdateRiderStatus:o(async()=>{},"onUpdateRiderStatus"),updatingStatus:null}),U.length>0&&t.jsxs("div",{className:"mt-6",style:{border:"1px solid rgba(255,255,255,0.12)",borderRadius:"8px",background:"rgba(0,0,0,0.6)"},children:[t.jsxs("button",{type:"button",onClick:o(()=>H(r=>!r),"onClick"),className:"w-full text-left px-3 py-2 flex items-center justify-between text-white/80 hover:text-white","aria-expanded":G,children:[t.jsxs("span",{style:{fontWeight:500},children:[G?"▼":"▶"," Scratched (",U.length,")"]}),t.jsxs("span",{className:"text-white/40 text-xs",children:["click to ",G?"hide":"show"]})]}),G&&t.jsx("div",{className:"px-2 pb-3",style:{opacity:.6},"aria-label":"Scratched riders",children:t.jsx(pe,{riders:U,displayFields:Q,sortColumn:A,onSort:j,formatValue:s,getDataType:Z,eventRaceStartTime:e?.targetDateTime,eventId:i,isAdmin:!1,eventConfig:e||void 0,editingCell:null,setEditingCell:o(()=>{},"setEditingCell"),onUpdateCheckpointTime:o(async()=>{},"onUpdateCheckpointTime"),saving:!1,onUpdateRiderStatus:o(async()=>{},"onUpdateRiderStatus"),updatingStatus:null})})]})]})}o(vt,"LeaderboardPage");export{vt as LeaderboardPage,vt 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.