1import{u as ge,a2 as pe,r as i,j as a,L as H,H as xe,M as ye}from"./index-D1aKNduO.js";import{d as be,w as ve}from"./worldMill-C6OL4pcH.js";import{b as qe}from"./RequestService-CYJ_tVm3.js";import{g as we}from"./ArchiveService-u6WPu0tO.js";import{g as $}from"./request-CsEOAxak.js";import"./firebase-DGovvYsO.js";import"./DocumentType-DfzLkOxU.js";import"./format-DJFnJxm-.js";const _=1,L=22,re=1.45,Ce=2.4,X="#10B981",oe=(s,x,k)=>Math.min(k,Math.max(x,s)),G=s=>{if(s instanceof Date)return s;if(s&&typeof s=="object"&&"toDate"in s&&typeof s.toDate=="function"){const x=s.toDate();return x instanceof Date?x:null}return null},ie=s=>G(s.dateSubmitted)??G(s.createdAt)??G(s.updatedAt),se=s=>ie(s)?.getTime()??0,Ne=s=>{const x=s;return s.type==="REPROGRAPHY"&&!!x.archiveRepositoryId},ke=(s,x,k)=>{const l=oe(s,-85,85),y=(x+180)/360*k,F=l*Math.PI/180,d=(.5-Math.log((1+Math.sin(F))/(1-Math.sin(F)))/(4*Math.PI))*k;return{x:y,y:d}},ne=s=>s<=1?7:s<=3?11:s<=10?14:s<=25?17:20,ae=s=>s?Array.isArray(s)?s.length>=2&&Number.isFinite(s[0])&&Number.isFinite(s[1])?{x:s[0],y:s[1]}:null:Number.isFinite(s.x)&&Number.isFinite(s.y)?s:null:null,Fe=(s,x)=>{if(!s.length)return[];const k=1024*Math.max(x,_),l=74,y=l,F=new Map,d=[];return s.forEach(u=>{const{x:f,y:P}=ke(u.lat,u.lng,k),g=Math.floor(f/y),O=Math.floor(P/y);let v=-1,z=Number.POSITIVE_INFINITY;for(let q=-1;q<=1;q+=1)for(let j=-1;j<=1;j+=1){const M=`${g+q}:${O+j}`;(F.get(M)??[]).forEach(E=>{const N=d[E],S=N.sumX/N.requestPoints.length,D=N.sumY/N.requestPoints.length,p=Math.hypot(S-f,D-P);p<=l&&p<z&&(z=p,v=E)})}if(v<0){const q={requestPoints:[u],archiveIds:new Set([u.archive.id]),sumLat:u.lat,sumLng:u.lng,sumX:f,sumY:P},j=d.push(q)-1,M=`${g}:${O}`,R=F.get(M)??[];R.push(j),F.set(M,R);return}const m=d[v];m.requestPoints.push(u),m.archiveIds.add(u.archive.id),m.sumLat+=u.lat,m.sumLng+=u.lng,m.sumX+=f,m.sumY+=P}),d.map((u,f)=>({id:`cluster-${f}`,requestPoints:u.requestPoints,requestCount:u.requestPoints.length,archiveCount:u.archiveIds.size,latitude:u.sumLat/u.requestPoints.length,longitude:u.sumLng/u.requestPoints.length}))},Le=({className:s="",maxModalRequestsPerCluster:x=10,requests:k})=>{const{t:l,i18n:y}=ge(),{isRepositoryAvailable:F}=pe(),[d,u]=i.useState(!0),[f,P]=i.useState(null),[g,O]=i.useState([]),[v,z]=i.useState(_),[m,q]=i.useState(null),[j,M]=i.useState([]),R=i.useRef(null),E=i.useRef(null),N=i.useRef(null),[S,D]=i.useState(!1),p=i.useRef(v),B=i.useRef([]),Z=i.useRef(new Map);i.useEffect(()=>{let e=!1;return(async()=>{u(!0),P(null);try{const n=(k??await qe({publicOnly:!0})).filter(Ne);if(n.length===0){e||O([]);return}const c=Array.from(new Set(n.map(C=>C.archiveRepositoryId).filter(C=>!!C))),o=await we(c),b=new Map;o.forEach(C=>{b.set(C.id,C)});const A=n.flatMap(C=>{const h=b.get(C.archiveRepositoryId);return!h||!F(h)||typeof h.latitude!="number"||typeof h.longitude!="number"||!Number.isFinite(h.latitude)||!Number.isFinite(h.longitude)?[]:[{request:C,archive:h,lat:h.latitude,lng:h.longitude}]});e||O(A)}catch(t){console.error("[OpenDocumentCopyRequestsMapWidget] Failed to load requests map data",t),e||P(l("requests.map.error","Unable to load open document copy requests right now."))}finally{e||u(!1)}})(),()=>{e=!0}},[F,k,l]);const w=i.useMemo(()=>Fe(g,v),[g,v]);i.useEffect(()=>{p.current=v},[v]),i.useEffect(()=>{B.current=w},[w]),i.useEffect(()=>{const e=new Map;w.forEach(r=>{e.set(r.id,r)}),Z.current=e},[w]),i.useEffect(()=>{if(!m)return;w.some(r=>r.id===m.id)||q(null)},[w,m]),i.useEffect(()=>{const e=R.current;if(!e){D(!1);return}const r=()=>{const{width:c,height:o}=e.getBoundingClientRect(),b=c>0&&o>0;D(A=>A||b)};r();const t=window.requestAnimationFrame(r),n=new ResizeObserver(()=>{r()});return n.observe(e),()=>{window.cancelAnimationFrame(t),n.disconnect()}},[d,f,g.length]),i.useEffect(()=>{(d||f||g.length===0||!S)&&(E.current=null,N.current=null)},[d,f,g.length,S]);const le=i.useMemo(()=>w.map(e=>({latLng:[e.latitude,e.longitude],name:e.requestCount>1?l("requests.map.cluster_name",{defaultValue:"{{count}} open requests",count:e.requestCount}):$(e.requestPoints[0].request,y.language),style:{fill:X,r:ne(e.requestCount),stroke:"#FFFFFF",strokeWidth:2}})),[w,y.language,l]),U=i.useMemo(()=>Object.fromEntries(w.map((e,r)=>[e.id||String(r),{latLng:[e.latitude,e.longitude],name:e.requestCount>1?l("requests.map.cluster_name",{defaultValue:"{{count}} open requests",count:e.requestCount}):$(e.requestPoints[0].request,y.language),style:{fill:X,r:ne(e.requestCount),stroke:"#FFFFFF",strokeWidth:2}}])),[w,y.language,l]),K=e=>{const r=Z.current.get(e);if(r)return r;const t=Number(e);return Number.isInteger(t)&&t>=0?B.current[t]??null:null},ce=i.useMemo(()=>
1{if(!m)return[];const e=new Map;return m.requestPoints.forEach(r=>{const t=e.get(r.archive.id);if(t){t.requests.push(r.request);return}e.set(r.archive.id,{archive:r.archive,requests:[r.request]})}),Array.from(e.values()).map(r=>({...r,requests:[...r.requests].sort((t,n)=>se(n)-se(t))})).sort((r,t)=>t.requests.length!==r.requests.length?t.requests.length-r.requests.length:r.archive.name.localeCompare(t.archive.name))},[m]),V=()=>{document.querySelectorAll(".jvectormap-tip").forEach(r=>{r.style.display="none"})},Q=()=>{V(),q(null)},I=()=>{const e=R.current?.querySelector(".jvectormap-container")??null,r=window.jQuery,t=e?r?.(e).data("mapObject"):void 0;if(t)return N.current!==t&&(N.current=t),t;const n=N.current??E.current;if(!n)return null;const c=n.container?.[0];return c&&!c.isConnected?(N.current=null,null):n},T=e=>{const r=R.current?.getBoundingClientRect(),t=r?.width??0,n=r?.height??0,c=t>0?t:Number.isFinite(e.width)?Number(e.width):0,o=n>0?n:Number.isFinite(e.height)?Number(e.height):0;return c<=0||o<=0?null:{x:c/2,y:o/2}},J=e=>{if(typeof e.pointToLatLng!="function")return null;const r=T(e);if(!r)return null;const t=e.pointToLatLng(r.x,r.y);return!t||!Array.isArray(t)||t.length<2||!Number.isFinite(t[0])||!Number.isFinite(t[1])?null:{lat:t[0],lng:t[1]}},W=()=>{const e=I();if(!e||typeof e.latLngToPoint!="function"){M([]);return}const r=B.current.filter(t=>t.requestCount>1).flatMap(t=>{const n=ae(e.latLngToPoint?.(t.latitude,t.longitude));return n?[{id:t.id,left:n.x,top:n.y,count:t.requestCount}]:[]});M(r)};i.useEffect(()=>{const e=I();!e||!S||d||f||g.length===0||(typeof e.removeAllMarkers=="function"&&e.removeAllMarkers(),typeof e.addMarkers=="function"&&e.addMarkers(U,[]),W())},[U,S,d,f,g.length]),i.useEffect(()=>{if(!S||d||f||g.length===0){M([]);return}const e=window.requestAnimationFrame(()=>{W()});return()=>{window.cancelAnimationFrame(e)}},[S,d,f,g.length,w]);const ue=(e,r)=>{V();const t=K(r);if(t){if(t.requestCount>x&&p.current<L){const n=p.current,c=Math.min(L,Math.max(n*Ce,n+1.6)),o=I();if(o){const b=Number.isFinite(o.baseScale)?Number(o.baseScale):1,A=c*b,C=p.current,h=Number.isFinite(t.latitude)&&Number.isFinite(t.longitude)&&typeof o.latLngToPoint=="function"?ae(o.latLngToPoint(t.latitude,t.longitude)):!1,ee=!!(h&&Number.isFinite(h.x)&&Number.isFinite(h.y));if(typeof o.setScale=="function")if(ee&&h)o.setScale(A,h.x,h.y,!1,!1);else{const Y=T(o);o.setScale(A,Y?.x,Y?.y,!1,!1)}else if(typeof o.setFocus=="function")o.setFocus({scale:c,...ee?{lat:t.latitude,lng:t.longitude}:{x:.5,y:.5},animate:!0});else{q(t);return}window.setTimeout(()=>{if(!(Math.abs(p.current-C)>1e-4)){if(typeof o.setScale=="function"){const te=T(o);o.setScale(A,te?.x,te?.y,!1,!1);return}typeof o.setFocus=="function"&&o.setFocus({scale:c,x:.5,y:.5,animate:!1})}},450);return}q(t);return}q(t)}},de=(e,r,t)=>{const n=K(t);if(!n)return;const c=r;if(n.requestCount===1){const o=n.requestPoints[0];c.html(`${o.archive.name}: ${$(o.request,y.language)}`);return}c.html(l("requests.map.cluster_tooltip",{defaultValue:"{{requestCount}} open requests in {{archiveCount}} archives",requestCount:n.requestCount,archiveCount:n.archiveCount}))},me=()=>{V();const e=I();if(!e)return;const r=p.current,t=Math.min(L,r*re),n=J(e),c=Number.isFinite(e.baseScale)?Number(e.baseScale):1,o=t*c;if(typeof e.setScale=="function"){const b=T(e);e.setScale(o,b?.x,b?.y,!1,!1);return}typeof e.setFocus=="function"&&e.setFocus({scale:t,...n?{lat:n.lat,lng:n.lng}:{x:.5,y:.5},animate:e.params?.zoomAnimate??!0})},fe=()=>{V();const e=I();if(!e)return;const r=p.current,t=Math.max(_,r/re),n=J(e),c=Number.isFinite(e.baseScale)?Number(e.baseScale):1,o=t*c;if(typeof e.setScale=="function"){const b=T(e);e.setScale(o,b?.x,b?.y,!1,!1);return}typeof e.setFocus=="function"&&e.setFocus({scale:t,...n?{lat:n.lat,lng:n.lng}:{x:.5,y:.5},animate:e.params?.zoomAnimate??!0})},he=(...e)=>{const r=e[1],t=e[2],n=e[3],c=Number.isFinite(t)&&Number.isFinite(n);if(typeof r=="number"&&Number.isFinite(r)&&c){const o=oe(r,_,L);z(o),p.current=o}else if(typeof r=="number"&&Number.isFinite(r)&&!c){const o=I();o&&typeof o.setFocus=="function"&&o.setFocus({scale:p.current,x:.5,y:.5,animate:!1})}window.requestAnimationFrame(()=>{W()})};return a.jsxs("section",{className:`rounded-2xl border border-gray-200 bg-white p-5 shadow-sm dark:border-gray-700 dark:bg-gray-800 ${s}`,children:[a.jsx("div",{className:"mb-4",children:a.jsx("div",{children:a.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-white",children:l("requests.map.title","Open Document Requests Around the World. Can You Help?")})})}),a.jsxs("div",{className:"relative overflow-hidden rounded-xl border border-gray-200 bg-gradient-to-b from-sky-50 to-white dark:border-gray-700 dark:from-gray-900 dark:to-gray-950",children:[a.jsxs("div",{className:"absolute right-3 top-3 z-20 flex flex-col gap-2",children:[a.jsx("button",{type:"button",onClick:me,className:"inline-flex h-8 w-8 items-center justify-center rounded-md bg-white text-lg font-semibold text-gray-700 shadow-sm ring-1 ring-gray-200 transition-colors hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-gray-200 dark:ring-gray-700 dark:hover:bg-gray-700",disabled:d||v>=L,"aria-label":l("requests.map.zoom_in","Zoom in"),children:"+"}),a.jsx("button",{type:"button",onClick:fe,className:"inline-flex h-8 w-8 items-center justify-center rounded-md bg-white text-lg font-semibold text-gray-700 shadow-sm ring-1 ring-gray-200 transition-colors hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-gray-800 dark:text-gray-200 dark:ring-gray-700 dark:hover:bg-gray-700",disabled:d||v<=_,"aria-label":l("requests.map.zoom_out","Zoom out"),children:"-"})]}),d?a.jsx("div",{className:"flex h-[440px] items-center justify-center",children:a.jsx("span",{className:"inline-flex h-7 w-7 animate-spin rounded-full border-2 border-brand-500 border-t-transparent"})}):f?a.jsx("div",{className:"flex h-[440px] items-center justify-center px-6 text-center text-sm text-red-600 dark:text-red-300",children:f}):g.length===0?a.jsxs("div",{className:"flex h-[440px] flex-col items-center justify-center gap-2 px-6 text-center",children:[a.jsx("p",{className:"text-base font-medium text-gray-900 dark:text-gray-100",children:l("requests.map.empty_title","No open document copy requests to show yet.")}),a.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400",children:l("requests.map.empty_subt
1itle","New requests will appear here as soon as they are posted.")})]}):a.jsxs("div",{ref:R,className:"h-[440px] w-full",children:[S?a.jsx(be.VectorMap,{mapRef:E,map:ve,backgroundColor:"transparent",className:"w-full [&_.jvectormap-zoomin]:hidden [&_.jvectormap-zoomout]:hidden",style:{width:"100%",height:"100%"},panOnDrag:!0,zoomOnScroll:!0,zoomMin:_,zoomMax:L,markers:le,markerStyle:{initial:{fill:X,r:6,stroke:"#FFFFFF",strokeWidth:2},hover:{cursor:"pointer",fillOpacity:.95}},regionStyle:{initial:{fill:"#DDE7F6",fillOpacity:1,stroke:"#FFFFFF",strokeWidth:1},hover:{fill:"#C6D7F3",cursor:"default"}},onViewportChange:he,onMarkerClick:ue,onMarkerTipShow:de}):a.jsx("div",{className:"flex h-full items-center justify-center",children:a.jsx("span",{className:"inline-flex h-7 w-7 animate-spin rounded-full border-2 border-brand-500 border-t-transparent"})}),j.length>0&&a.jsx("div",{className:"pointer-events-none absolute inset-0 z-10",children:j.map(e=>a.jsx("span",{className:"absolute -translate-x-1/2 -translate-y-1/2 select-none text-[11px] font-bold text-white",style:{left:`${e.left}px`,top:`${e.top}px`},children:e.count},e.id))})]})]}),a.jsxs("div",{className:"mt-3 flex flex-wrap items-center justify-between gap-3",children:[a.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:l("requests.map.interaction_hint","Click a cluster: more than 10 requests zooms in, 10 or fewer opens grouped details.")}),a.jsxs(H,{to:"/archives",className:"inline-flex items-center justify-center gap-1 text-xs font-semibold text-emerald-600 underline underline-offset-2 transition-colors hover:text-emerald-700 dark:text-emerald-400 dark:hover:text-emerald-300",children:[a.jsx("span",{children:l("requests.map.see_all_archives","See all archives")}),a.jsx(xe,{className:"h-4 w-4"})]})]}),a.jsxs(ye,{isOpen:!!m,onClose:Q,className:"max-w-3xl p-5 sm:p-7",children:[a.jsxs("div",{className:"pr-10",children:[a.jsx("h4",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100",children:l("requests.map.modal.title","Open Document Copy Requests")}),a.jsx("p",{className:"mt-1 text-sm text-gray-600 dark:text-gray-300",children:m?l("requests.map.modal.subtitle",{defaultValue:"{{requestCount}} requests across {{archiveCount}} archives",requestCount:m.requestCount,archiveCount:m.archiveCount}):""})]}),a.jsx("div",{className:"mt-5 max-h-[60vh] space-y-4 overflow-y-auto pr-1",children:ce.map(e=>a.jsxs("div",{className:"rounded-xl border border-gray-200 bg-gray-50/70 p-4 dark:border-gray-700 dark:bg-gray-800/50",children:[a.jsxs("div",{className:"mb-2 flex items-start justify-between gap-3",children:[a.jsxs("div",{children:[a.jsx("h5",{className:"text-sm font-semibold text-gray-900 dark:text-gray-100",children:e.archive.name}),a.jsx("p",{className:"text-xs text-gray-600 dark:text-gray-400",children:l("requests.map.modal.archive_request_count",{defaultValue:"{{count}} open requests",count:e.requests.length})})]}),a.jsx(H,{to:`/archives/${e.archive.countryISOA3}/${e.archive.id}`,className:"text-xs font-semibold text-brand-600 hover:text-brand-700 dark:text-brand-400 dark:hover:text-brand-300",children:l("requests.map.modal.view_archive","View archive")})]}),a.jsx("div",{className:"space-y-2",children:e.requests.map(r=>{const t=ie(r),n=t?new Intl.DateTimeFormat(y.language||"en",{year:"numeric",month:"short",day:"numeric"}).format(t):null;return a.jsxs(H,{to:`/requests/${r.id}`,onClick:Q,className:"flex items-center justify-between gap-3 rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm transition-colors hover:border-brand-300 hover:bg-brand-50/40 dark:border-gray-700 dark:bg-gray-900/70 dark:hover:border-brand-500/50 dark:hover:bg-brand-900/10",children:[a.jsx("span",{className:"min-w-0 truncate text-gray-800 dark:text-gray-100",children:$(r,y.language)}),n&&a.jsx("span",{className:"whitespace-nowrap text-xs text-gray-500 dark:text-gray-400",children:n})]},r.id)})})]},e.archive.id))})]})]})};export{Le 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.