six-degrees 0.4.10 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +4 -4
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +13 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/crm/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/social/crm/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/social/crm/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/social/crm/route.js +10 -0
- package/.next/standalone/.next/server/app/api/social/crm/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/social/crm/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/social/messages/route.js +4 -3
- package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js +4 -3
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/import.html +1 -1
- package/.next/standalone/.next/server/app/import.rsc +15 -15
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/launch.html +2 -2
- package/.next/standalone/.next/server/app/launch.rsc +15 -15
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths.html +1 -1
- package/.next/standalone/.next/server/app/paths.rsc +15 -15
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/profile.html +1 -1
- package/.next/standalone/.next/server/app/profile.rsc +15 -15
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/queue.html +1 -1
- package/.next/standalone/.next/server/app/queue.rsc +15 -15
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/scores.html +1 -1
- package/.next/standalone/.next/server/app/scores.rsc +15 -15
- package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +15 -15
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +15 -15
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +15 -15
- package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06mi9k2._.js → [root-of-the-server]__05_3-22._.js} +7 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +8 -0
- package/.next/standalone/.next/server/chunks/_0ea9qwy._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +4 -4
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1oqfuh8._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1xh07bp._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_social_crm_route_actions_0d1aflv.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +7 -7
- package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_05gt5ya.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0-85h6g._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_08cfj2b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0c_y09g._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +2 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +3 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/15sjx07xhpn6p.js +1 -0
- package/.next/standalone/.next/static/chunks/1a74dky22dxd6.js +1 -0
- package/.next/standalone/.next/static/chunks/{1xptlvtcz6654.css → 1x_ysly42-teq.css} +1 -1
- package/.next/standalone/.next/static/chunks/297e1z34yi--z.js +1 -0
- package/.next/standalone/.next/static/chunks/2_ak6qjxb6oa5.js +1 -0
- package/.next/standalone/.next/static/chunks/3ui4d-uqkqj5d.js +2 -0
- package/.next/standalone/CHANGELOG.md +48 -0
- package/.next/standalone/app/api/data/export/route.js +2 -1
- package/.next/standalone/app/api/scraper/route.js +5 -1
- package/.next/standalone/app/api/social/crm/route.js +37 -0
- package/.next/standalone/app/api/social/messages/route.js +44 -8
- package/.next/standalone/app/api/social/route.js +80 -22
- package/.next/standalone/app/components/ScanStatusBar.js +1 -0
- package/.next/standalone/app/components/settings/DataSection.js +12 -3
- package/.next/standalone/app/globals.css +11 -0
- package/.next/standalone/app/social/Crm.js +683 -0
- package/.next/standalone/app/social/Thread.js +90 -0
- package/.next/standalone/app/social/page.js +71 -60
- package/.next/standalone/lib/data-export.js +10 -4
- package/.next/standalone/lib/data-folder.js +9 -0
- package/.next/standalone/lib/data-import.js +13 -3
- package/.next/standalone/lib/linkedin-export.js +267 -46
- package/.next/standalone/lib/social-crm.js +415 -0
- package/.next/standalone/lib/social-store.js +13 -6
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/scrape.py +126 -22
- package/.next/static/chunks/15sjx07xhpn6p.js +1 -0
- package/.next/static/chunks/1a74dky22dxd6.js +1 -0
- package/.next/static/chunks/{1xptlvtcz6654.css → 1x_ysly42-teq.css} +1 -1
- package/.next/static/chunks/297e1z34yi--z.js +1 -0
- package/.next/static/chunks/2_ak6qjxb6oa5.js +1 -0
- package/.next/static/chunks/3ui4d-uqkqj5d.js +2 -0
- package/CHANGELOG.md +48 -0
- package/lib/data-export.js +10 -4
- package/lib/data-folder.js +9 -0
- package/lib/data-import.js +13 -3
- package/lib/linkedin-export.js +267 -46
- package/lib/social-crm.js +415 -0
- package/lib/social-store.js +13 -6
- package/package.json +1 -1
- package/scripts/scrape.py +126 -22
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08f5awg._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_18cr1gi._.js +0 -8
- package/.next/standalone/.next/server/chunks/ssr/_0ezj4e0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1errbuf._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.js +0 -3
- package/.next/standalone/.next/static/chunks/07dyt47mp4s9-.js +0 -1
- package/.next/standalone/.next/static/chunks/206rm6j42gl_a.js +0 -1
- package/.next/standalone/.next/static/chunks/2coxzjm_k6ilr.js +0 -1
- package/.next/standalone/.next/static/chunks/2pw6_osz1n_te.js +0 -1
- package/.next/standalone/app/social/Conversations.js +0 -246
- package/.next/static/chunks/07dyt47mp4s9-.js +0 -1
- package/.next/static/chunks/206rm6j42gl_a.js +0 -1
- package/.next/static/chunks/2coxzjm_k6ilr.js +0 -1
- package/.next/static/chunks/2pw6_osz1n_te.js +0 -1
- /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_ssgManifest.js +0 -0
- /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_buildManifest.js +0 -0
- /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{7zWJnSkfSoRhRsqY6ZKtD → jqE2D3zWqSGz5su948Azf}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40643,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(22016),o=e.i(40996),l=e.i(68792),u=e.i(99883);let i={full:"Scanning your network",refresh:"Checking for new connections",bridge:"Scanning a circle",resume:"Carrying on with a circle","resume-all":"Carrying on with circles","auto-bridge":"Auto-Bridge","auto-bridge-retry":"Auto-Bridge",rescrape:"Re-scanning a circle",login:"Signing in to LinkedIn",setup:"Setting up the scanner",company:"Scanning a company",photos:"Saving photos",messages:"Reading your messages list"};e.s(["default",0,function(){let e,s,[c,d]=(0,r.useState)(()=>(0,o.scannerNow)()),[f,p]=(0,r.useState)(!1),[h,g]=(0,r.useState)(!1),[y,m]=(0,r.useState)(!1),b=(0,r.useSyncExternalStore)(l.watchAllDay,l.allDayNow,()=>!1),v=(0,r.useSyncExternalStore)(u.watchActivities,u.activitiesNow,u.noActivities);(0,r.useEffect)(()=>(0,o.watchScanner)(()=>{let e=(0,o.scannerNow)();d(e),e.running||p(!1)}),[]);let x=(0,n.usePathname)(),[_,S]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e=null,t=null,r=0,n=()=>{r=0;let n=document.querySelector("header");n!==e&&(t?.disconnect(),t=null,(e=n)&&(t=new ResizeObserver(a)).observe(e));let o=e?Math.round(e.getBoundingClientRect().bottom):null;S(e=>e===o?e:o)},a=()=>{r||(r=requestAnimationFrame(n))};a();let o=new MutationObserver(a);return o.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener("resize",a),()=>{cancelAnimationFrame(r),t?.disconnect(),o.disconnect(),window.removeEventListener("resize",a)}},[x]);let j=!!c?.running,P=v[v.length-1]||null;if(!j&&!P&&!b)return null;let O=c?.progress,w=O?.kind==="batch"&&O.total?`${O.current||O.done||0} of ${O.total}`:O?.kind==="walk"&&O.total?`${(O.done||0).toLocaleString()} of ${O.total.toLocaleString()}`:O?.kind==="saving"?"saving":null,C=O?.total?Math.min(1,(O.current||O.done||0)/O.total):P?.progress??null,E=c?.budget,R=j?[...c.log||[]].reverse().find(e=>e&&e.trim())?.trim():null,T=h||y,A=j?"#00ff88":P?"warn"===P.tone?"#FFD700":"#3498DB":"#556",N=j?i[c.action]||"Scanning":P?P.label:"Auto scan",M=j?w:P?P.detail:null;return(0,t.jsxs)("div",{role:"status","aria-live":"polite",onMouseEnter:()=>g(!0),onMouseLeave:()=>g(!1),style:{position:"fixed",left:"50%",top:_??"var(--scan-bar-top, 94px)",transform:"translateX(-50%)",zIndex:60,maxWidth:"calc(100vw - 32px)",minWidth:j||P?180:0,padding:T?"8px 14px 10px":"4px 12px 6px",borderRadius:"0 0 16px 16px",borderTop:"none",border:`1px solid ${j?"rgba(0,255,136,0.25)":"rgba(255,255,255,0.1)"}`,background:"rgba(8,10,22,0.96)",color:"#cfd8d8",fontSize:12,opacity:j||P||T?1:.55,boxShadow:j?"0 6px 20px rgba(0,0,0,0.35)":"none",transition:"padding 0.18s ease, opacity 0.18s ease"},children:[(0,t.jsxs)("button",{onClick:()=>m(e=>!e),"aria-expanded":T,title:T?"Close":"Open",style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"none",border:"none",color:"inherit",font:"inherit",cursor:"pointer",padding:0,whiteSpace:"nowrap"},children:[(0,t.jsx)("span",{className:j?"notch-pulse":void 0,style:{width:7,height:7,borderRadius:"50%",background:A,flexShrink:0}}),(0,t.jsx)("b",{style:{color:j||P?"#fff":"#b8c4c4",fontWeight:600},children:N}),M&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:M}),!j&&!P&&T&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:"ready · press Auto scan beside Scan to start"})]}),null!=C&&(0,t.jsx)("div",{style:{height:2,marginTop:5,borderRadius:2,background:"rgba(255,255,255,0.08)",overflow:"hidden"},children:(0,t.jsx)("div",{style:{width:`${Math.round(100*C)}%`,height:"100%",background:j?"#00ff88":"#3498DB",transition:"width 0.4s ease"}})}),T&&j&&(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginTop:8,flexWrap:"wrap"},children:[c.target?.name&&(0,t.jsx)("span",{children:c.target.name}),E&&(0,t.jsxs)("span",{style:{color:(e=E.searches,(s=E.cap)?e/s>=.9?"#ff6b6b":e/s>=.6?"#FFD700":"#00ff88":"#8b9a9a")},title:"Searches on your LinkedIn account in the last 24 hours, and your daily budget",children:[E.searches,E.cap?` of ${E.cap}`:""," searches today"]}),R&&(0,t.jsx)("span",{style:{color:"#667",maxWidth:280,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:R,children:R}),(0,t.jsx)(a.default,{href:"/setup",style:{color:"#3498DB",textDecoration:"none"},children:"Details"}),(0,t.jsx)("button",{onClick:async()=>{p(!0);try{await (0,o.stopScrape)()}catch{p(!1)}},disabled:f,title:"Stops after saving what's been read; Resume on the Scan page carries on from the same page",style:{padding:"3px 10px",borderRadius:8,fontSize:12,cursor:f?"default":"pointer",background:"rgba(255,107,107,0.12)",color:"#ff9b9b",border:"1px solid rgba(255,107,107,0.35)"},children:f?"Stopping…":"Stop"})]}),T&&!j&&P?.detail&&(0,t.jsx)("div",{style:{marginTop:6,color:"#8b9a9a"},children:P.detail})]})}])},87915,e=>{"use strict";var t=e.i(71645),r=e.i(40996),n=e.i(64745);let a=!1;e.s(["default",0,function(){return(0,t.useEffect)(()=>{if(n.IS_DEMO||a)return;let e=()=>{};return fetch("/api/social").then(e=>e.json()).then(({social:t})=>{if(!t?.autoSync||a)return;let n=t.liveAt?Date.parse(t.liveAt):0,o=new Date().getHours();Date.now()-n<864e5||o<9||o>=19||(e=(0,r.watchScanner)(()=>{let t=(0,r.scannerNow)();t.known&&!a&&(a=!0,e(),t.running||(0,r.beginScrape)("messages").catch(()=>{}))}))}).catch(()=>{}),()=>e()},[]),null}])},37711,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.s(["default",0,function(){let[e,n]=(0,r.useState)(null);return((0,r.useEffect)(()=>{let e=!0;return fetch("/api/update").then(e=>e.json()).then(t=>{e&&t?.restartNeeded&&n(t)}).catch(()=>{}),()=>{e=!1}},[]),e)?(0,t.jsxs)("div",{role:"status",style:{position:"fixed",left:0,right:0,bottom:0,zIndex:9999,background:"linear-gradient(90deg, #FFD700, #FF6B35)",color:"#1a1200",padding:"9px 16px",fontSize:13,fontWeight:600,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"center",gap:10,flexWrap:"wrap",textAlign:"center"},children:[(0,t.jsxs)("span",{children:["You have newer code on disk (",e.sha,") than this server is running (",e.bootSha,"). Restart it to see the changes — ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"Ctrl-C"})," in the terminal, then ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"npm run dev"}),"."]}),(0,t.jsx)("button",{onClick:()=>n(null),style:{border:"none",background:"rgba(0,0,0,0.18)",color:"#1a1200",borderRadius:6,padding:"3px 10px",fontWeight:700,cursor:"pointer"},children:"Dismiss"})]}):null}])},15812,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(65084),a=e.i(64745),o=e.i(7837);let l=(0,r.createContext)({userId:null,userName:null,userProfile:null,ready:!1});e.s(["default",0,function({children:e}){let[u,i]=(0,r.useState)(null),[s,c]=(0,r.useState)(null),[d,f]=(0,r.useState)(null),[p,h]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(a.IS_DEMO){i(a.DEMO_USER.id),c(a.DEMO_USER.name),f({name:a.DEMO_USER.name,headline:a.DEMO_USER.headline,role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),h(!0);return}if((0,o.hasCsvNetwork)()){i(o.CSV_USER.id),c(o.CSV_USER.name),f({name:o.CSV_USER.name,headline:"Imported from your LinkedIn CSV",role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),h(!0);return}fetch("/api/users?me=1").then(e=>e.json()).then(e=>{let t=e.user;if(!t)throw Error("no profile");(0,n.setUser)(t.id,t.name),i(t.id),c(t.name),f({name:t.name,headline:t.headline||"",role:t.role||"",company:t.company||"",industry:t.industry||"",sectors:t.sectors||[],goals:t.goals||[],linkedin_url:t.linkedin_url||""})}).catch(()=>{(0,n.hasUser)()&&(i((0,n.getUserId)()),c((0,n.getUserName)()))}).finally(()=>h(!0))},[]),(0,t.jsx)(l.Provider,{value:{userId:u,userName:s,userProfile:d,ready:p,login:(e,t)=>{(0,n.setUser)(e,t),i(e),c(t),fetch(`/api/users?id=${e}`).then(e=>e.json()).then(e=>{e.user&&f({name:e.user.name,headline:e.user.headline||"",role:e.user.role||"",company:e.user.company||"",industry:e.user.industry||"",sectors:e.user.sectors||[],goals:e.user.goals||[],linkedin_url:e.user.linkedin_url||""})}).catch(()=>{})}},children:e})},"useUser",0,function(){return(0,r.useContext)(l)}])},64745,e=>{"use strict";var t=e.i(47167),r=e.i(7837);let n="true"===t.default.env.NEXT_PUBLIC_DEMO_MODE,a=null;async function o(){if(a)return a;let e=await fetch("/demo-data.json",{cache:"no-cache"});if(!e.ok)throw Error("demo-data.json not found — run: node scripts/gen-synthetic.mjs");let t=await e.json();return a={degree1:t.degree1||[],degree2:t.degree2||[]}}async function l(){let e=await o();return(0,r.saveSessionNetwork)({degree1:e.degree1,degree2:e.degree2,source:"sample"}),{degree1:e.degree1.length,degree2:e.degree2.length}}e.s(["DEMO_USER",0,{id:"synthetic-demo-user",name:"You",headline:"Sample network"},"IS_DEMO",0,n,"loadDemoNetwork",0,o,"loadSampleIntoSession",0,l])},68792,99883,e=>{"use strict";var t=e.i(40996);let r=(e,t)=>{try{let r=localStorage.getItem(e);return null===r?t:JSON.parse(r)}catch{return t}};e.s(["allDayNow",0,function(){try{return"true"===localStorage.getItem("six-degrees-experimental-auto")}catch{return!1}},"startAutoScan",0,function(){let e=r("six-degrees-bridge-order","newest");return(0,t.beginScrape)("auto-bridge",{experimental:!0,maxBridges:10,order:e,tiers:"score"===e?["S","A"]:[],maxPages:r("six-degrees-bridge-pages-v2",100),deeper:r("six-degrees-bridge-finish",!0)})},"watchAllDay",0,function(e){return window.addEventListener("storage",e),window.addEventListener("six-degrees:experimental",e),()=>{window.removeEventListener("storage",e),window.removeEventListener("six-degrees:experimental",e)}}],68792);let n=new Set,a=[],o=[];e.s(["activitiesNow",0,()=>a,"noActivities",0,()=>o,"showActivity",0,function(e){return e?.id?(a=[...a.filter(t=>t.id!==e.id),e],n.forEach(e=>e()),()=>{var t;return t=e.id,void(a.some(e=>e.id===t)&&(a=a.filter(e=>e.id!==t),n.forEach(e=>e())))}):()=>{}},"watchActivities",0,function(e){return n.add(e),()=>n.delete(e)}],99883)},40996,e=>{"use strict";async function t(){let e=await fetch("/api/scraper");if(!e.ok)throw Error("Could not reach the app.");return e.json()}async function r(e,t,n={}){let a=await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,...t?{name:t}:{},...n})}),o=await a.json().catch(()=>({}));if(!a.ok)throw Error(o.error||"Could not start the scanner.");return o}async function n(e){let t=await fetch(`/api/scraper?resume=${encodeURIComponent(e)}`);return t.ok?(await t.json()).resume??null:null}Symbol.for("six-degrees.scan-state");let a=Object.freeze({skips:[],read:[]});async function o(){try{let e=await fetch("/api/scraper?reach=1");if(!e.ok)return a;let t=await e.json();return{skips:Array.isArray(t.skips)?t.skips:[],read:Array.isArray(t.read)?t.read:[]}}catch{return a}}async function l(e){let t=await fetch(`/api/scraper?person=${encodeURIComponent(e)}`);return t.ok?t.json():{person:null}}async function u(){await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cancel"})})}let i=Object.freeze({known:!1,running:!1,pending:!1,action:null,target:null,startedAt:null,progress:null,log:[],finished:[]}),s=new Set,c=i,d=JSON.stringify(c),f=null,p=null,h=0,g=!1,y=new Set;function m(e){let t=JSON.stringify(e);if(t!==d)for(let r of(d=t,c=Object.freeze(e),[...s]))r()}async function b(){(!("u">typeof document&&document.hidden)||c.running)&&await function(){if(p&&p.epoch===h)return p.promise;let e=h,t=fetch("/api/scraper?job=1").then(e=>e.ok?e.json():null).then(t=>{e===h&&function(e){if(!e||"object"!=typeof e)return;let t=!0===e.running;t&&null!=e.startedAt&&y.add(e.startedAt);let r=(Array.isArray(e.recent)?e.recent:[]).filter(e=>y.has(e.startedAt)).map(r=>({...r,log:!t&&r.startedAt===e.startedAt&&Array.isArray(e.log)?e.log:[]}));m({known:!0,running:t||g,pending:g&&!t,action:t?e.action??null:g?c.action:null,target:t?e.target??null:g?c.target:null,startedAt:t?e.startedAt??null:null,progress:t?e.progress??null:null,budget:t?e.budget??null:null,log:t&&Array.isArray(e.log)?e.log:[],finished:r})}(t)}).catch(()=>{}).finally(()=>{p?.promise===t&&(p=null)});return p={epoch:e,promise:t},t}(),clearTimeout(f),f=s.size?setTimeout(b,c.running?1500:5e3):null}function v(e){return s.add(e),1===s.size&&b(),()=>{s.delete(e),s.size||(clearTimeout(f),f=null)}}async function x(e,{name:t,id:n,onLog:a,...o}={}){let l;h++,g=!0,m({...c,known:!0,running:!0,pending:!0,action:e,target:t||n?{id:n??null,name:t??null}:null,startedAt:null,progress:null,log:[]});try{let a=!1;try{a=!0===JSON.parse(localStorage.getItem("six-degrees-hide-chrome")||"false")}catch{}l=await r(e,t,{...n?{id:n}:{},...a?{headless:!0}:{},...o})}catch(e){throw g=!1,h++,c.pending&&m({...c,running:!1,pending:!1,action:null,target:null,log:[]}),b(),e}g=!1,h++;let u=l?.startedAt??null;null!=u&&y.add(u);let i=new Promise(e=>{let t=v(()=>{c.running&&c.startedAt===u&&a?.(c.log);let r=null==u?c.running?null:{exitCode:null,failure:null,log:[]}:c.finished.find(e=>e.startedAt===u);r&&(t(),r.log.length&&a?.(r.log),e(r))});b()});return{startedAt:u,ended:i}}function _(e){return!!e?.target&&["bridge","rescrape","resume"].includes(e.action)}e.s(["NO_SCAN_NOTES",0,a,"SCANNER_UNKNOWN",0,i,"beginScrape",0,x,"busyReason",0,function(e=c){if(!e?.running)return null;let t=e.target?.name;switch(e.action){case"bridge":case"rescrape":case"resume":return t?`${t}’s circle is being scanned`:"A circle is being scanned";case"company":return t?`${t} is being scanned`:"A company is being scanned";case"auto-bridge":case"auto-bridge-retry":case"resume-all":return"Your bridges are being mapped, one by one";case"full":case"refresh":return"Your own connections are being scanned";default:switch(e.action){case"install":return"The scanner's packages are being installed";case"setup":return"The scanner is being set up";case"login":return"The LinkedIn sign-in window is open";case"photos":return"Profile photos are being saved";default:return"A scan is running"}}},"isCircleScan",0,_,"loadScanNotes",0,o,"notReadyMessage",0,function(e){if(!e)return"Could not reach the app.";let t=e.checks||{};return t.scriptsFound?t.dependencies?t.chrome?null:"Google Chrome is not installed.":t.python||t.download?"The scanner is not set up yet — open Scan to set it up.":"No Python 3.10 to 3.14 is installed on this machine.":"The scanner files are missing from this install."},"pickedPerson",0,l,"resumePoint",0,n,"runScrape",0,function(e,t={}){return x(e,t).then(e=>e.ended)},"scannerNow",0,function(){return c},"scansCircleOf",0,function(e,t){if(!_(e)||!t)return!1;let{id:r,name:n}=e.target;return r&&t.id?r===t.id:!!n&&n===t.name},"scraperStatus",0,t,"stopScrape",0,u,"watchScanner",0,v],40996)},22016,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return v}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),l=e.r(43476),u=o._(e.r(71645)),i=e.r(95057),s=e.r(8372),c=e.r(18581),d=e.r(18967),f=e.r(5550),p=e.r(88540),h=e.r(91949),g=e.r(73668),y=e.r(9396);function m(t){var r;let n,a,o,[m,v]=(0,u.useOptimistic)(h.IDLE_LINK_STATUS),x=(0,u.useRef)(null),{href:_,as:S,children:j,prefetch:P=null,passHref:O,replace:w,shallow:C,scroll:E,onClick:R,onMouseEnter:T,onTouchStart:A,legacyBehavior:N=!1,onNavigate:M,transitionTypes:k,ref:D,unstable_dynamicOnHover:F,...L}=t;n=j,N&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let I=u.default.useContext(s.AppRouterContext),B=!1!==P,U=!1===P?"none":!0===P?"full":"auto",$="none"!==U?"auto"===U?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,z="string"==typeof(r=S||_)?r:(0,i.formatUrl)(r);if(N){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});a=u.default.Children.only(n)}let H=N?a&&"object"==typeof a&&a.ref:D,V,K=u.default.useCallback(e=>(null!==I&&(x.current=(0,h.mountLinkInstance)(e,z,I,$,B,v,V)),()=>{x.current&&((0,h.unmountLinkForCurrentNavigation)(x.current),x.current=null),(0,h.unmountPrefetchableInstance)(e)}),[B,z,I,$,v,V]),W={ref:(0,c.useMergedRef)(K,H),onClick(t){N||"function"!=typeof R||R(t),N&&a.props&&"function"==typeof a.props.onClick&&a.props.onClick(t),!I||t.defaultPrevented||function(t,r,n,a,o,l,i,s="none"){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);u.default.startTransition(()=>{f(r,a?"replace":"push",!1===o?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,i,s)})}}(t,z,x,w,E,M,k,U)},onMouseEnter(e){N||"function"!=typeof T||T(e),N&&a.props&&"function"==typeof a.props.onMouseEnter&&a.props.onMouseEnter(e),I&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===F)},onTouchStart:function(e){N||"function"!=typeof A||A(e),N&&a.props&&"function"==typeof a.props.onTouchStart&&a.props.onTouchStart(e),I&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===F)}};return(0,d.isAbsoluteUrl)(z)?W.href=z:N&&!O&&("a"!==a.type||"href"in a.props)||(W.href=(0,f.addBasePath)(z)),o=N?u.default.cloneElement(a,W):(0,l.jsx)("a",{...L,...W,children:n}),(0,l.jsx)(b.Provider,{value:m,children:o})}let b=(0,u.createContext)(h.IDLE_LINK_STATUS),v=()=>(0,u.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let l={tree:e,cacheNode:t,stateKey:r,next:null},u=1,i=a,s=l;for(;null!==i&&u<1;){if(i.stateKey===r){s.next=i.next;break}{u++;let e={tree:i.tree,cacheNode:i.cacheNode,stateKey:i.stateKey,next:null};s.next=e,s=e}i=i.next}return o(l),l}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(33906),u=e.r(61994),i=e.r(15783);function s({Component:e,serverProvidedParams:t}){let r,c;if(null!==t)r=t.searchParams,c=t.params;else{let e=(0,o.use)(a.LayoutRouterContext);c=null!==e?e.parentParams:{},r=(0,l.urlSearchParamsToParsedUrlQuery)((0,o.use)(u.SearchParamsContext))}let d=(0,i.createClientSearchParams)(r),f=(0,i.createClientParams)(c);return(0,n.jsx)(e,{params:f,searchParams:d})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return u}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(15783);function u({Component:e,slots:t,serverProvidedParams:r}){let i;if(null!==r)i=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);i=null!==e?e.parentParams:{}}let s=(0,l.createClientParams)(i);return(0,n.jsx)(e,{...t,params:s})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return c}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(90373),u=e.r(54394),i=e.r(8372);class s extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,u.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,u.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,l={[u.HTTPAccessErrorStatus.NOT_FOUND]:e,[u.HTTPAccessErrorStatus.FORBIDDEN]:t,[u.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let i=o===u.HTTPAccessErrorStatus.NOT_FOUND&&e,s=o===u.HTTPAccessErrorStatus.FORBIDDEN&&t,c=o===u.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return i||s||c?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,l[o]]}):n}return n}}function c({notFound:e,forbidden:t,unauthorized:r,children:n}){let u=(0,l.useUntrackedPathname)(),d=(0,o.useContext)(i.MissingSlotContext);return e||t||r?(0,a.jsx)(s,{pathname:u,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o},PlaceValidationBoundaryBelowThisLevel:function(){return l},RenderValidationBoundaryAtThisLevel:function(){return u},SlotMarker:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=null,l=null,u=null,i=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return o.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return o.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return o.SlotMarker}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return O},default:function(){return C}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),l=e.r(90809),u=e.r(43476),i=l._(e.r(71645)),s=o._(e.r(74080)),c=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),h=e.r(58442),g=e.r(68017);e.r(77694);let y=e.r(70725),m=e.r(28298);e.r(74180);let b=e.r(61994),v=e.r(33906),x=e.r(95871);s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function _(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let a=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<a&&(a=t.top)}return a>=r()&&a<=t?1:2}i.default.Component;let S=function(e){let t=i.default.useRef(null);return(0,i.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,a=r.forceScroll?r.scrollRef:n.scrollRef;if(null===a||!a.current)return;let o=null,l=r.hashFragment;if(l){var u;if(null===(o="top"===(u=l)?document.body:document.getElementById(u)??document.getElementsByName(u)[0]??null)){a.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else o=t.current;if(null===o)return;let i=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,u=()=>{var r,a;let o,l;return null===n&&(r=e,a=t,n=!Number.isFinite(l=Number.parseFloat(o=getComputedStyle(r).scrollPaddingTop))||l<0?0:o.endsWith("px")?l:o.endsWith("%")?l/100*a:0),n};(l||(t=e.clientHeight,0!==(r=_(o,t,u))))&&((i=!0,a.current=!1,l)?o.scrollIntoView():1!==r&&(e.scrollTop=0,2===_(o,t,u)&&o.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),i&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,u.jsx)(i.Fragment,{ref:t,children:e.children})};function j({children:e,cacheNode:t}){let r=(0,i.useContext)(c.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,u.jsx)(S,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function P({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:l}){let s,f=(0,i.useContext)(c.GlobalLayoutRouterContext);if((0,i.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,i.use)(d.unresolvedThenable),h=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,g=(0,i.useDeferredValue)(p.rsc,h);if((0,x.isDeferredRsc)(g)){let e=(0,i.use)(g);null===e&&(0,i.use)(d.unresolvedThenable),s=e}else null===g&&(0,i.use)(d.unresolvedThenable),s=g;let y=s;return(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:l},children:y})}function O({loading:e,children:t}){let r=(0,i.use)(c.LayoutRouterContext);return null===r?t:(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function w({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,u.jsx)(i.Suspense,{name:e,fallback:(0,u.jsxs)(u.Fragment,{children:[a,o,n]}),children:r})}return(0,u.jsx)(u.Fragment,{children:r})}function C({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:l,notFound:s,forbidden:p,unauthorized:b,segmentViewBoundaries:x}){let _=(0,i.useContext)(c.LayoutRouterContext);if(!_)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:S,parentCacheNode:O,parentSegmentPath:E,parentParams:R,parentLoadingData:T,url:A,isActive:N,debugNameContext:M}=_,k=S[0],D=null===E?[e]:E.concat([k,e]),F=S[1][e],L=O.slots;(void 0===F||null===L)&&(0,i.use)(d.unresolvedThenable);let I=F[0],B=L[e]??null,U=(0,y.createRouterCacheKey)(I,!0),$=(0,m.useRouterBFCache)(F,B,U),z=[];do{let e=$.tree,i=$.cacheNode,d=$.stateKey,y=e[0],m=R;if(Array.isArray(y)){let e=y[0],t=y[1],r=y[2],n=(0,v.getParamValueFromCacheKey)(t,r);null!==n&&(m={...R,[e]:n})}let x=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(y),_=x??M,S=void 0===x?void 0:M,O=(0,u.jsxs)(j,{cacheNode:i,children:[(0,u.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,u.jsx)(w,{name:S,loading:T,children:(0,u.jsx)(g.HTTPAccessFallbackBoundary,{notFound:s,forbidden:p,unauthorized:b,children:(0,u.jsxs)(h.RedirectBoundary,{children:[(0,u.jsx)(P,{url:A,tree:e,params:m,cacheNode:i,segmentPath:D,debugNameContext:_,isActive:N&&d===U}),null]})})})}),null]}),C=(0,u.jsxs)(c.TemplateContext.Provider,{value:O,children:[a,o,l]},d);z.push(C),$=$.next}while(null!==$)return z}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(8372);function u(){let e=(0,o.useContext)(l.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return o.createRenderParamsFromClient},createClientSearchParams:function(){return l.createRenderSearchParamsFromClient}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(97689),l=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return _},MissingStaticPage:function(){return x},NormalizeError:function(){return b},PageNotFoundError:function(){return v},SP:function(){return g},ST:function(){return y},WEB_VITALS:function(){return o},execOnce:function(){return l},getDisplayName:function(){return d},getLocationOrigin:function(){return s},getURL:function(){return c},isAbsoluteUrl:function(){return i},isResSent:function(){return f},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let u=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&u.test(e)};function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=s();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let g="u">typeof performance,y=g&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class b extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class x extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class _ extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return i},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function l(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function u(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,l(e));else t.set(r,l(n));return t}function i(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return s},urlObjectKeys:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",u=e.hash||"",i=e.query||"",s=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?s=t+e.host:r&&(s=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(s+=":"+e.port)),i&&"object"==typeof i&&(i=String(o.urlQueryToSearchParams(i)));let c=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==s?(s="//"+(s||""),a&&"/"!==a[0]&&(a="/"+a)):s||(s=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${s}${a}${c}${u}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function s(e){return u(e)}},18566,(e,t,r)=>{t.exports=e.r(76562)}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:o}=(0,n.useUser)();return o&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:o?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},28867,86106,e=>{"use strict";var t=e.i(71645),n=e.i(7214);let r=Object.freeze({known:!1,sent:new Set,mine:new Map,version:0}),o=new Set,l=r,i=null,a=new Map;function s(e=l.sent,t=l.known){for(let n of(l=Object.freeze({known:t,sent:e,mine:new Map(a),version:l.version+1}),[...o]))n()}function u(e){return o.add(e),i||l.known||(i=fetch("/api/outreach").then(e=>e.ok?e.json():null).then(e=>{e&&s(new Set((e.pending||[]).map(n.keyFor)),!0)}).catch(()=>{}).finally(()=>{i=null})),()=>o.delete(e)}function c(){return l}async function f(e){let t=await fetch("/api/outreach",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));if(!t.ok)throw Error(n.error||"Could not save that.");return n}async function d(e,{bridgeId:t}={}){let r=(0,n.keyFor)(e),o=a.has(r)?a.get(r):void 0;a.set(r,!0),s();try{return await f({action:"mark-sent",connectionId:e.id,profileUrl:e.profile_url,bridgeId:t})}catch(e){throw void 0===o?a.delete(r):a.set(r,o),s(),e}}async function p(e){let t=(0,n.keyFor)(e),r=a.has(t)?a.get(t):void 0;a.set(t,!1),s();try{return await f({action:"undo",connectionId:e.id,profileUrl:e.profile_url})}catch(e){throw void 0===r?a.delete(t):a.set(t,r),s(),e}}e.s(["REQUESTS_UNKNOWN",0,r,"hasRequest",0,function(e,t=l){if(!e)return!1;let r=(0,n.keyFor)(e);return t.mine.has(r)?t.mine.get(r):t.known?t.sent.has(r):"pending"===e.unlock_status||"sent"===e.outreach_status},"markRequested",0,d,"requestCount",0,function(e=l){let t=new Set(e.known?e.sent:[]);for(let[n,r]of e.mine)r?t.add(n):t.delete(n);return t.size},"requestsNow",0,c,"undoRequest",0,p,"watchRequests",0,u],86106),e.s(["default",0,function(){return(0,t.useSyncExternalStore)(u,c,()=>r)}],28867)},64666,e=>{"use strict";var t=e.i(7214);function n(e=[],r=[]){let o=new Set((r||[]).map(t.keyFor)),l=new Map;for(let n of e||[]){let e=n?.source_connection_id;if(null==e)continue;let r=(0,t.keyFor)(n);if(o.has(r))continue;let i=l.get(r);i||l.set(r,i=new Set),i.add(e)}let i=new Map;for(let e of l.values())for(let t of e){let n=i.get(t)||{reach:0,only:0,total:0};n.reach+=1/e.size,n.total+=1,1===e.size&&(n.only+=1),i.set(t,n)}return i}e.s(["bridgeOverlap",0,function(e=[],r=[]){let o=n(e,r),l=new Set((r||[]).map(t.keyFor)),i=new Map;for(let n of e||[]){let e=n?.source_connection_id;if(null==e)continue;let r=(0,t.keyFor)(n);if(l.has(r))continue;let o=i.get(r);o||i.set(r,o=new Set),o.add(e)}let a=new Map;for(let e of i.values()){if(e.size<2)continue;let t=[...e];for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){let r=t[e]<t[n]?`${t[e]}|${t[n]}`:`${t[n]}|${t[e]}`;a.set(r,(a.get(r)||0)+1)}}let s=new Map;for(let[e,t]of a){let[n,r]=e.split("|"),l=o.get(n).total+o.get(r).total-t,i=l?t/l:0;for(let[e,o]of[[n,r],[r,n]]){let n=s.get(e);(!n||i>n.share)&&s.set(e,{with:o,share:i,shared:t})}}return s},"exclusiveReach",0,n,"redundancy",0,function(e=[],t=[]){let r=n(e,t),o=0,l=0;for(let e of r.values())o+=e.reach,l+=e.only;return o?1-l/o:0}])},39160,84278,e=>{"use strict";var t=e.i(7214),n=e.i(7837);function r(e){let t=String(e||"").trim();if(!t)return null;let n=t.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?(?:\s*UTC)?$/);if(n)return Date.UTC(+n[1],n[2]-1,+n[3],+n[4],+n[5],+(n[6]||0));if(n=t.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4}),?\s+(\d{1,2}):(\d{2})\s*(AM|PM)?$/i)){let e=100>+n[3]?2e3+ +n[3]:+n[3],t=n[4]%12;return"PM"===(n[6]||"").toUpperCase()&&(t+=12),Date.UTC(e,n[1]-1,+n[2],t,+n[5])}if(n=t.match(/^([A-Za-z]{3,9})\s+(\d{4})$/)){let e=Date.parse(`1 ${n[1]} ${n[2]} UTC`);return Number.isNaN(e)?null:e}let r=Date.parse(/\d{4}$/.test(t)?`${t} UTC`:t);return Number.isNaN(r)?null:r}let o=e=>(0,t.keyFor)({profile_url:e});function l(e=[]){let t=new Map;for(let n of e){let e=o(n["sender profile url"]),r=n["conversation id"];r&&e&&(t.has(e)||t.set(e,new Set),t.get(e).add(r))}let n=null;for(let[e,r]of t)(!n||r.size>t.get(n).size)&&(n=e);return n}function i(e,t){if(!e||!e.total)return"never";let n=t-e.last;return n<=2592e6||e.recent>=3?"warm":n<=31536e6?"cool":"dormant"}e.s(["buildConversations",0,function(e=[],{keepText:t=!1}={}){let n=l(e),i=new Map;for(let l of e){let e=o(l["sender profile url"]),a=l["conversation id"];if(!a||!e)continue;let s=r(l.date);if(null==s)continue;i.has(a)||i.set(a,{id:a,title:"",everyone:new Set,messages:[]});let u=i.get(a);u.everyone.add(e),String(l["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).forEach(e=>u.everyone.add(o(e)));let c={t:s,fromMe:e===n};t&&(c.text=[l.subject,l.content].map(e=>String(e||"").trim()).filter(Boolean).join("\n\n"),!u.title&&l["conversation title"]&&(u.title=String(l["conversation title"]).trim())),u.messages.push(c)}let a=[];for(let e of i.values()){if(!e.everyone.has(n))continue;let r=[...e.everyone].filter(e=>e&&e!==n).sort();if(!r.length)continue;e.messages.sort((e,t)=>e.t-t.t);let o={id:e.id,people:r,group:r.length>1,messages:e.messages};t&&(o.title=e.title),a.push(o)}return{self:n,conversations:a}},"careerChapters",0,function(e=[],t=[],n=Date.now()){let l=e.map(e=>({company:e["company name"]||"",title:e.title||"",from:r(e["started on"]),to:r(e["finished on"])})).filter(e=>e.company&&null!=e.from).sort((e,t)=>e.from-t.from),i=t.map(e=>({url:o(e.url||e.profile_url),t:r(e["connected on"]||e.connected_on)})).filter(e=>null!=e.t);return l.map(e=>{let t=e.to??n,r=i.filter(n=>n.t>=e.from&&n.t<t);return{...e,to:e.to,made:r.length,people:r.map(e=>e.url)}})},"conversationSummary",0,function(e){let t=e.messages[e.messages.length-1];return{id:e.id,people:e.people,group:e.group,last:t?t.t:null,lastFromThem:t?!t.fromMe:null,count:e.messages.length}},"invitationSplit",0,function(e=[]){let t=0,n=0;for(let r of e){let e=String(r.direction||"").toUpperCase();"INCOMING"===e?t+=1:"OUTGOING"===e&&(n+=1)}return{incoming:t,outgoing:n,total:t+n}},"messageStats",0,function(e=[]){let t=l(e),n=new Map;for(let t of e){let e=o(t["sender profile url"]),l=t["conversation id"];if(!l||!e)continue;let i=String(t["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(o),a=r(t.date);if(null==a)continue;n.has(l)||n.set(l,{people:new Set,msgs:[]});let s=n.get(l);s.people.add(e),i.forEach(e=>s.people.add(e)),s.msgs.push({from:e,t:a})}let i=0,a=new Map;for(let e of n.values()){let n=[...e.people].filter(e=>e!==t);if(1!==n.length||!e.people.has(t))continue;let r=n[0],o=a.get(r)||{last:0,lastFromThem:!1,total:0,times:[]};for(let n of e.msgs)o.total+=1,o.times.push(n.t),n.t>=o.last&&(o.last=n.t,o.lastFromThem=n.from!==t),n.t>i&&(i=n.t);a.set(r,o)}for(let e of a.values())e.recent=e.times.filter(e=>e>i-7776e6).length,delete e.times;return{self:t,asOf:i||null,people:a}},"postingEffect",0,function(e=[],t=[]){let n=e.map(e=>({t:r(e.date),link:e.sharelink||e["share link"]||""})).filter(e=>null!=e.t).sort((e,t)=>e.t-t.t),o=t.map(e=>r(e["connected on"]||e.connected_on)).filter(e=>null!=e).sort((e,t)=>e-t);if(!o.length)return{posts:[],usualWeek:0,afterPosts:0};let l=Math.max(6048e5,o[o.length-1]-o[0]),i=o.length/l*6048e5,a=n.map(e=>({...e,week:o.filter(t=>t>=e.t&&t<e.t+6048e5).length})),s=a.length?a.reduce((e,t)=>e+t.week,0)/a.length:0;return{posts:a,usualWeek:i,afterPosts:s}},"readTable",0,function(e,t){let r=(0,n.parseCsv)(String(e||"")),o=r.findIndex(e=>e.some(e=>e.trim().toLowerCase()===t.toLowerCase()));if(o<0)return[];let l=r[o].map(e=>e.trim().toLowerCase());return r.slice(o+1).filter(e=>e.some(e=>e.trim())).map(e=>Object.fromEntries(l.map((t,n)=>[t,(e[n]??"").trim()])))},"repliesWaiting",0,function(e){let t=[];for(let[n,r]of e.people){let o=e.asOf-r.last;r.lastFromThem&&o>=2592e5&&o<=2592e6&&t.push({url:n,days:Math.round(o/864e5),total:r.total})}return t.sort((e,t)=>e.days-t.days)},"sortConversations",0,function(e=[],t=()=>null){let n=e=>e.group||!0!==e.lastFromThem?1:0,r=e=>({S:0,A:1})[t(e)]??2;return[...e].sort((e,t)=>n(e)-n(t)||r(e)-r(t)||(t.last||0)-(e.last||0))},"warmthOf",0,i],84278);let a="six-degrees-galaxy-lab",s="six-degrees-galaxy-layouts",u=Object.freeze({on:!1,gravity:0,rings:1,push:15,pull:1,distance:1,dotSize:1,lines:1,sizeBy:"power",names:"key",branch:!0,colourBy:"tier",speed:15,loop:!1,labels:!0}),c=["gravity","rings","push","pull","distance","dotSize","lines","sizeBy","names","branch","colourBy","speed","loop"],f=Object.freeze({gravity:.25,rings:0,push:25,pull:2.5,distance:.35,sizeBy:"reach"}),d=new Set,p=null;function m(){return p||(p=function(){try{let e=JSON.parse(localStorage.getItem(a)||"null");return e&&"object"==typeof e?{...u,...e}:u}catch{return u}}()),p}function g(e){p=null===e?{...u,on:m().on,labels:m().labels}:{...m(),...e};try{localStorage.setItem(a,JSON.stringify(p))}catch{}d.forEach(e=>e())}let h=null,y=new Set;function w(){if(!h){try{h=JSON.parse(localStorage.getItem(s)||"[]")}catch{h=[]}Array.isArray(h)||(h=[])}return h}function b(e){h=e;try{localStorage.setItem(s,JSON.stringify(e))}catch{}y.forEach(e=>e())}let S=new Set,v={at:null,playing:!1,min:null,max:null,of:0,find:"",fly:0,found:0,social:void 0},k=null;function F(e){let t={...v,...e};Object.keys(e).every(e=>Object.is(t[e],v[e]))||(v=t,S.forEach(e=>e()))}function M(){cancelAnimationFrame(k),k=null,F({playing:!1})}let C=null;function _(e){let n=new Map;for(let[r,o]of Object.entries(e?.people||{}))n.set((0,t.keyFor)({profile_url:r}),{...o});for(let[r,o]of Object.entries(e?.live||{})){let e=(0,t.keyFor)({profile_url:r}),l=n.get(e)||{total:0,recent:0};o.last&&(!l.last||o.last>l.last)&&(l.last=o.last,"boolean"==typeof o.lastFromThem&&(l.lastFromThem=o.lastFromThem)),l.unread=o.unread,l.total=Math.max(l.total||0,1),n.set(e,l)}let r=Math.max(e?.asOf||0,e?.liveAt&&Date.parse(e.liveAt)||0);for(let e of n.values())(e.last||0)>r&&(r=e.last);return{merged:n,asOf:r,chapters:e?.chapters||[],posts:e?.posts?.posts||[]}}let x={1:"#4FC3F7",2:"#BA68C8",3:"#FFB74D"},I=["#FF6B6B","#4ECDC4","#FFD93D","#A29BFE","#00B894","#FD79A8","#74B9FF","#E17055"],O={warm:"#FF7043",cool:"#4FC3F7",dormant:"#8D6E63",never:"#546E7A"},B="#4a5568",N=e=>String(e||"").trim().toLowerCase();e.s(["CLUSTERS",0,f,"LAB_DEFAULTS",0,u,"applyLayout",0,function(e){let t=w().find(t=>t.name===e);t&&g(Object.fromEntries(c.filter(e=>e in t.settings).map(e=>[e,t.settings[e]])))},"bornTimes",0,function(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map,o=(e,l=0)=>{if(r.has(e.id))return r.get(e.id);let i=-1/0,a=t.get(e.id);if(1===e.degree||null==a||l>6){let t=e.connected_date?Date.parse(e.connected_date):NaN;i=Number.isNaN(t)?-1/0:t}return null!=a&&n.has(a)&&l<=6&&(i=Math.max(i,o(n.get(a),l+1))),r.set(e.id,i),i};return e.map(e=>o(e))},"chapterAt",0,function(e,t){let n=null;for(let r of e?.chapters||[])Number.isFinite(r.from)&&r.from<=t&&(!n||r.from>n.from)&&(n=r);return n&&(!Number.isFinite(n.to)||n.to>t)?n:null},"clockNow",0,()=>v,"colourScheme",0,function(e,n,r,o){if("degree"===e)return{of:e=>x[Math.min(e.degree||1,3)],legend:[["1st",x[1]],["2nd",x[2]],["3rd+",x[3]]]};if("company"===e){let e=new Map;for(let t of n){let n=N(t.company);if(!n)continue;let r=e.get(n)||{name:String(t.company).trim(),n:0};r.n+=1,e.set(n,r)}let t=[...e.entries()].filter(([,e])=>e.n>1).sort((e,t)=>t[1].n-e[1].n).slice(0,I.length),r=new Map(t.map(([e],t)=>[e,I[t]]));return{of:e=>r.get(N(e.company))||B,legend:[...t.map(([,e],t)=>[e.name,I[t]]),["Other",B]]}}return"warmth"===e&&o?{of:e=>1===(e.degree||1)?O[i(o.merged.get((0,t.keyFor)(e)),o.asOf)]:"#2d3748",legend:[["Warm",O.warm],["Cool",O.cool],["Dormant",O.dormant],["Never messaged",O.never]]}:{of:e=>r[e.tier]||"#666",legend:Object.entries(r)}},"effectiveLab",0,e=>e.on?e:e.labels===u.labels?u:{...u,labels:e.labels},"findMatches",0,function(e,t){let n=String(t||"").trim().toLowerCase();if(n.length<2)return null;let r=new Set;for(let t of e)[t.name,t.company,t.role,t.headline].some(e=>e&&String(e).toLowerCase().includes(n))&&r.add(t.id);return r},"forgetLayout",0,function(e){b(w().filter(t=>t.name!==e))},"labNow",0,m,"layoutsNow",0,w,"loadSocial",0,function(){return C||(C=fetch("/api/social").then(e=>e.ok?e.json():{}).then(e=>{F({social:e.social?_(e.social):null})}).catch(()=>F({social:null}))),C},"mergeSocial",0,_,"milestones",0,function(e){let t=[];for(let n of e?.chapters||[])Number.isFinite(n.from)&&t.push({t:n.from,kind:"job",label:n.company});for(let n of e?.posts||[])Number.isFinite(n.t)&&t.push({t:n.t,kind:"post",label:"You posted"});return t.sort((e,t)=>e.t-t.t)},"pause",0,M,"play",0,function e(){if(null==v.min||null==v.max||v.max<=v.min)return;let t=v.max-v.min,n=1e3*Math.max(1,Number(m().speed)||15),r=null==v.at||v.at>=v.max?v.min:v.at,o=performance.now()-(r-v.min)/t*n;F({at:r,playing:!0});let l=r=>{let i=Math.min(v.max,v.min+(r-o)/n*t);if(F({at:i}),i>=v.max){k=null,F({playing:!1}),m().loop&&setTimeout(()=>{k||v.at!==v.max||(F({at:v.min}),e())},1200);return}k=requestAnimationFrame(l)};cancelAnimationFrame(k),k=requestAnimationFrame(l)},"reachCounts",0,function(e,t){let n=new Map(e.map(e=>[e.id,0]));for(let r of e){let e=t.get(r.id);for(let r=0;null!=e&&r<7;r++)n.set(e,(n.get(e)||0)+1),e=t.get(e)}return n},"saveLayout",0,function(e){let t=String(e||"").trim().slice(0,40);if(!t)return;let n=m(),r=Object.fromEntries(c.map(e=>[e,n[e]]));b([...w().filter(e=>e.name!==t),{name:t,settings:r}])},"setClock",0,F,"setLab",0,g,"stopReplay",0,function(){M(),F({at:null})},"watchClock",0,function(e){return S.add(e),()=>S.delete(e)},"watchLab",0,function(e){d.add(e);let t=t=>{t.key===a&&(p=null,e())};return window.addEventListener("storage",t),()=>{d.delete(e),window.removeEventListener("storage",t)}},"watchLayouts",0,function(e){return y.add(e),()=>y.delete(e)}],39160)},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[],ties:Number(r.ties)||0}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},48235,e=>{"use strict";var t=e.i(7214);function n(e,n){return e?n.scanned.has(e.id)||e.profile_url&&n.read?.has((0,t.keyFor)(e))?"scanned":e.profile_url&&n.hidden.has((0,t.keyFor)(e))?"hidden":"todo":"todo"}function r(e,t){if(!e||1!==e.degree||null==e.unlocked_from_bridge_id)return null;let r=n(e,t);return"todo"===r?"ready":r}e.s(["circleScanCost",0,function(e=100){let t=Math.max(1,Math.min(100,Math.round(e)||100));return{profileViews:1,searches:t,minutes:t>=100?55:Math.max(5,Math.round(.55*t))}},"circleState",0,n,"reachIndex",0,function(e=[],n=[],r={}){let o=new Set;for(let e of n||[])e?.source_connection_id!=null&&o.add(e.source_connection_id);let l=new Set;for(let e of r?.skips||[])e?.profileUrl&&l.add((0,t.keyFor)({profile_url:e.profileUrl}));let i=new Set;for(let e of r?.read||[])e&&i.add((0,t.keyFor)({profile_url:e}));let a=new Map;for(let[e,n]of Object.entries(r?.lists||{}))e&&n&&a.set((0,t.keyFor)({profile_url:e}),n);let s=new Map;for(let t of e||[]){let e=t?.unlocked_from_bridge_id;if(null==e||1!==t.degree)continue;let n=s.get(e);n||s.set(e,n=[]),n.push(t)}return{scanned:o,read:i,hidden:l,reachedFrom:s,lists:a}},"reachState",0,r,"readyByCircle",0,function(e){let t=new Map;for(let[n,o]of e.reachedFrom){let l=o.filter(t=>"ready"===r(t,e)).length;l&&t.set(n,l)}return t},"readyToScan",0,function(e,n){return(e||[]).filter(e=>"ready"===r(e,n)).sort(t.compareBridges)},"scanBars",0,function(e,r){let o=n(e,r),l=e?.profile_url?r.lists?.get((0,t.keyFor)(e)):null;return"hidden"===o?null:l?l.more?l.total?Math.max(1,Math.min(4,Math.round(5*Math.min(1,10*l.pages/l.total)))):2:5:"scanned"===o?2:null}])},7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function r(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function o(e){return Math.round(10*r(e))/10}function l(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let i=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function a(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||r(t)-r(e)||String(e.name||"").localeCompare(String(t.name||""))||i(e.id,t.id)}function s(e,t){return e.bridge&&t.bridge?a(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:i(e.id,t.id)}function u(e,t){return t.score-e.score||t.waysIn-e.waysIn||s(e.routes[0]||c,t.routes[0]||c)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let c={id:null,bridge:null};function f(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function d(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,a,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||u(e,t)},"keyFor",0,l,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=l(n),r=t.get(e);r||(r=new Set,t.set(e,r)),r.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(l(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(s):[]},"score",0,r,"score1",0,o,"separationPeople",0,function(e=[],n=[]){let r=new Map;for(let e of n||[])r.set(e.id,e);let a=new Map,c=new Map;for(let n of e||[]){let e=l(n);c.set(n.id,e);let r=a.get(e);r?function(e,n){let r=o(e)-o(n);if(r)return r>0;let l=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==l?l:0>i(e.id,n.id)}(n,r.person)&&(r.person=n):(r={key:e,person:n,rowIds:[],routeIds:new Set},a.set(e,r)),r.rowIds.push(n.id),r.routeIds.add(n.source_connection_id??null)}let f={people:a.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},d=new Set,p=new Set,m=new Set,g=[];for(let e of a.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:r.get(e)??null}));t.sort(s);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?d:p).add(e.id);if(!n.length)for(let e of(f.peopleOnlyUnresolved++,t))m.add(e.id);let{person:l}=e,i=l.tier;void 0!==f.byTier[i]&&f.byTier[i]++,t.length>1&&f.multi++,g.push({key:e.key,person:l,score:o(l),tier:i,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[l.name,l.headline,l.company,l.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return f.bridges=d.size,f.unresolvedIds=p.size,f.onlyUnresolvedVia=m.size,g.sort(u),function(e){for(let t=0;t<e.length;t++){let n=e[t],r=e[t-1],o=r&&r.score===n.score&&r.waysIn===n.waysIn;n.rank=o?r.rank:t+1,o&&(n.tied=!0,r.tied=!0)}}(g),{people:g,rowToKey:c,summary:f}},"shortName",0,f,"summitLayout",0,function(e=[],t=800,n=!1){let r=n?36:26,o=Math.round(.42*t),l=Math.round(.58*t),i=e.map((e,n)=>{var o;return{key:e.key,p:e,x:l,y:16+n*r,r:(o=e.waysIn)>=4?8.5:3===o?7:2===o?5.5:4,label:d(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-l-60)/6.2))}}),s=new Map,u="\0unresolved";for(let e of i)for(let t of e.p.routes){let n=t.bridge?t.id:u,r=s.get(n);r||(r={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},s.set(n,r)),r.count++,r.ys.push(e.y)}let c=[...s.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));c.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?a(e.bridge,t.bridge):0));let p=i.length?i[i.length-1].y:16,m=c.length>1?Math.max(18,(p-16)/(c.length-1)):0,g=Math.max(4,Math.floor((o-10-42)/6));c.forEach((e,t)=>{if(e.x=o,e.y=1===c.length?(16+p)/2:16+t*m,e.r=5,e.unresolved)e.label=d(`can't be named (${e.count})`,g);else{let t=e.bridge.name||"";e.label=t.length<=g?t:d(f(t),g)}delete e.ys});let h=new Map(c.map(e=>[e.unresolved?u:e.id,e])),y=[];for(let e of i){let t=new Set;e.p.routes.forEach((n,r)=>{let o=n.bridge?n.id:u;if(t.has(o))return;t.add(o);let l=h.get(o);y.push({key:e.key,bridgeId:l.id,primary:0===r&&!l.unresolved,unresolved:l.unresolved,tier:l.bridge?.tier??null,x1:l.x,y1:l.y,x2:e.x,y2:e.y})})}let w=Math.max(p,c.length?c[c.length-1].y:0),b=i.length?Math.ceil(w+16):0,S={x:20,y:i.length?(16+Math.max(p,w))/2:16,r:14},v=c.map(e=>({id:e.id,x1:S.x,y1:S.y,x2:e.x,y2:e.y}));return{width:t,height:b,you:S,people:i,bridges:c,links:y,spokes:v}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])}]);
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
// The Social tab's Conversations: every conversation with one of your
|
|
4
|
-
// connections, from your export and the live messages sync
|
|
5
|
-
// (app/api/social/messages). The list is only who, when, who wrote last,
|
|
6
|
-
// unread and how many. The messages themselves show only while Keep my
|
|
7
|
-
// messages is on, and live only in the app's data folder (lib/social-store.js).
|
|
8
|
-
|
|
9
|
-
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
10
|
-
import { sortConversations } from '../../lib/linkedin-export';
|
|
11
|
-
import { Body, LINE } from '../components/ui';
|
|
12
|
-
|
|
13
|
-
const TIER = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
14
|
-
const TIER_ORDER = ['S', 'A', 'B', 'C', 'D'];
|
|
15
|
-
const LIST_PAGE = 100;
|
|
16
|
-
const THREAD_PAGE = 100;
|
|
17
|
-
const EARLIER_PAGE = 200;
|
|
18
|
-
const day = (t) => (t ? new Date(t).toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' }) : '');
|
|
19
|
-
const when = (t) => (t ? new Date(t).toLocaleString(undefined, { day: 'numeric', month: 'short', year: 'numeric', hour: 'numeric', minute: '2-digit' }) : '');
|
|
20
|
-
const slug = (u) => String(u || '').replace(/\/+$/, '').split('/').pop();
|
|
21
|
-
// Only LinkedIn's own pages go behind "Open on LinkedIn".
|
|
22
|
-
const linkedin = (u) => (/^https:\/\/(www\.)?linkedin\.com\//.test(String(u || '')) ? u : null);
|
|
23
|
-
|
|
24
|
-
export default function Conversations({ byKey, connected, ready, keep, onKeep, switching, token }) {
|
|
25
|
-
const [data, setData] = useState(null);
|
|
26
|
-
const [q, setQ] = useState('');
|
|
27
|
-
const [hits, setHits] = useState(null);
|
|
28
|
-
const [open, setOpen] = useState(null);
|
|
29
|
-
const [shown, setShown] = useState(LIST_PAGE);
|
|
30
|
-
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
let live = true;
|
|
33
|
-
fetch('/api/social/messages').then((r) => r.json()).then((d) => { if (live) setData(d); }).catch(() => { if (live) setData({ conversations: [] }); });
|
|
34
|
-
return () => { live = false; };
|
|
35
|
-
}, [token, keep]);
|
|
36
|
-
|
|
37
|
-
// Searching the words happens where they're kept, a moment after typing stops.
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
const words = q.trim();
|
|
40
|
-
if (!keep || words.length < 2) return undefined;
|
|
41
|
-
let live = true;
|
|
42
|
-
const t = setTimeout(() => {
|
|
43
|
-
fetch(`/api/social/messages?q=${encodeURIComponent(words)}`).then((r) => r.json())
|
|
44
|
-
.then((d) => { if (live) setHits({ q: words, ids: new Set(d.ids || []) }); }).catch(() => {});
|
|
45
|
-
}, 250);
|
|
46
|
-
return () => { live = false; clearTimeout(t); };
|
|
47
|
-
}, [q, keep, token]);
|
|
48
|
-
|
|
49
|
-
// Only conversations with one of your connections; a group counts when at
|
|
50
|
-
// least one of them is in it. The rest are counted, not shown.
|
|
51
|
-
const { rows, leftOut } = useMemo(() => {
|
|
52
|
-
const all = data?.conversations || [];
|
|
53
|
-
const mine = all.filter((c) => c.people.some((k) => connected.has(k)));
|
|
54
|
-
const withPeople = mine.map((c) => {
|
|
55
|
-
const persons = c.people.map((k) => byKey.get(k)).filter(Boolean);
|
|
56
|
-
const tier = TIER_ORDER.find((t) => persons.some((p) => p.tier === t)) || null;
|
|
57
|
-
return { ...c, persons, tier };
|
|
58
|
-
});
|
|
59
|
-
return { rows: sortConversations(withPeople, (c) => c.tier), leftOut: all.length - mine.length };
|
|
60
|
-
}, [data, byKey, connected]);
|
|
61
|
-
|
|
62
|
-
const filtered = useMemo(() => {
|
|
63
|
-
const words = q.trim().toLowerCase();
|
|
64
|
-
if (!words) return rows;
|
|
65
|
-
// Word matches count only for what's typed now, and only while they're kept.
|
|
66
|
-
const said = keep && hits?.q === q.trim() ? hits.ids : null;
|
|
67
|
-
return rows.filter((c) => c.persons.some((p) => String(p.name || '').toLowerCase().includes(words))
|
|
68
|
-
|| String(c.title || '').toLowerCase().includes(words)
|
|
69
|
-
|| said?.has(c.id));
|
|
70
|
-
}, [rows, q, hits, keep]);
|
|
71
|
-
|
|
72
|
-
const box = { padding: '12px 14px', borderRadius: 8, border: LINE, background: 'rgba(255,255,255,0.03)', marginTop: 10 };
|
|
73
|
-
|
|
74
|
-
return (
|
|
75
|
-
<>
|
|
76
|
-
<div style={box}>
|
|
77
|
-
<label style={{ display: 'flex', gap: 8, alignItems: 'center', fontSize: 13.5, color: '#fff', cursor: switching ? 'default' : 'pointer' }}>
|
|
78
|
-
<input type="checkbox" checked={keep} disabled={switching} onChange={(e) => onKeep(e.target.checked)} />
|
|
79
|
-
<b>Keep my messages on this computer</b>
|
|
80
|
-
<span style={{ fontSize: 11.5, color: keep ? '#00ff88' : '#8b9a9a' }}>{keep ? 'on' : 'off'}</span>
|
|
81
|
-
</label>
|
|
82
|
-
<Body style={{ margin: '6px 0 0', fontSize: 12.5 }}>
|
|
83
|
-
Off unless you turn it on. When it’s on, the messages themselves, including what other people wrote to
|
|
84
|
-
you, are saved only in the app’s data folder on this computer. They’re never sent anywhere, and
|
|
85
|
-
they aren’t in “Save a copy of my network”. <i>Forget it</i>, or switching this off, deletes
|
|
86
|
-
them. With it off, the list below still shows who, when and who wrote last.
|
|
87
|
-
</Body>
|
|
88
|
-
</div>
|
|
89
|
-
|
|
90
|
-
<div style={{ ...box, padding: 0 }}>
|
|
91
|
-
<div style={{ padding: '10px 14px', borderBottom: LINE, display: 'flex', gap: 10, alignItems: 'center' }}>
|
|
92
|
-
<input
|
|
93
|
-
type="search"
|
|
94
|
-
value={q}
|
|
95
|
-
onChange={(e) => { setQ(e.target.value); setShown(LIST_PAGE); }}
|
|
96
|
-
placeholder={keep ? 'Search by name or by what was said' : 'Search by name'}
|
|
97
|
-
aria-label="Search conversations"
|
|
98
|
-
style={{ flex: 1, minWidth: 0, padding: '6px 10px', borderRadius: 6, border: LINE, background: 'rgba(0,0,0,0.3)', color: '#fff', fontSize: 13 }}
|
|
99
|
-
/>
|
|
100
|
-
<span style={{ fontSize: 12, color: '#8b9a9a', whiteSpace: 'nowrap' }}>
|
|
101
|
-
{filtered.length.toLocaleString()} {filtered.length === 1 ? 'conversation' : 'conversations'}
|
|
102
|
-
</span>
|
|
103
|
-
</div>
|
|
104
|
-
{(!data || !ready) && <div style={{ padding: 12, fontSize: 13, color: '#8b9a9a' }}>Loading…</div>}
|
|
105
|
-
{data && ready && rows.length === 0 && (
|
|
106
|
-
<div style={{ padding: 12, fontSize: 13, color: '#8b9a9a' }}>
|
|
107
|
-
No conversations with your connections yet. Choose your export folder above, or sync your messages.
|
|
108
|
-
</div>
|
|
109
|
-
)}
|
|
110
|
-
{data && ready && rows.length > 0 && filtered.length === 0 && (
|
|
111
|
-
<div style={{ padding: 12, fontSize: 13, color: '#8b9a9a' }}>Nothing matches that.</div>
|
|
112
|
-
)}
|
|
113
|
-
{ready && filtered.slice(0, shown).map((c) => (
|
|
114
|
-
<Row key={c.id} c={c} open={open === c.id} onToggle={() => setOpen(open === c.id ? null : c.id)} keep={keep} token={token} />
|
|
115
|
-
))}
|
|
116
|
-
{ready && filtered.length > shown && (
|
|
117
|
-
<button onClick={() => setShown(shown + LIST_PAGE)} style={{ width: '100%', padding: 10, background: 'none', border: 'none', color: '#3498DB', cursor: 'pointer', fontSize: 13 }}>
|
|
118
|
-
Show {Math.min(LIST_PAGE, filtered.length - shown).toLocaleString()} more
|
|
119
|
-
</button>
|
|
120
|
-
)}
|
|
121
|
-
</div>
|
|
122
|
-
<div style={{ fontSize: 11.5, color: '#778', marginTop: 6 }}>
|
|
123
|
-
Waiting on you first (they wrote last), then S and A tier, then the most recent. Groups are shown but not
|
|
124
|
-
counted in warmth.{leftOut > 0 ? ` ${leftOut.toLocaleString()} ${leftOut === 1 ? 'conversation is' : 'conversations are'} with people who aren’t your connections and aren’t shown.` : ''}
|
|
125
|
-
</div>
|
|
126
|
-
</>
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function Row({ c, open, onToggle, keep, token }) {
|
|
131
|
-
const one = !c.group ? c.persons[0] : null;
|
|
132
|
-
const names = c.persons.map((p) => p.name).filter(Boolean);
|
|
133
|
-
const label = c.group
|
|
134
|
-
? (c.title || (names.length ? `${names.slice(0, 3).join(', ')}${c.people.length > 3 ? ` +${c.people.length - 3}` : ''}` : `${c.people.length} people`))
|
|
135
|
-
: (one?.name || slug(c.people[0]));
|
|
136
|
-
const href = linkedin(c.threadUrl) || (!c.group ? linkedin(one?.profile_url || c.people[0]) : null);
|
|
137
|
-
const waiting = !c.group && c.lastFromThem === true;
|
|
138
|
-
return (
|
|
139
|
-
<div style={{ borderBottom: '1px solid rgba(255,255,255,0.04)' }}>
|
|
140
|
-
<div
|
|
141
|
-
role="button"
|
|
142
|
-
tabIndex={0}
|
|
143
|
-
aria-expanded={open}
|
|
144
|
-
onClick={onToggle}
|
|
145
|
-
onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggle(); } }}
|
|
146
|
-
style={{ display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 10, padding: '8px 14px', fontSize: 13, cursor: 'pointer', background: open ? 'rgba(255,255,255,0.04)' : 'none' }}
|
|
147
|
-
>
|
|
148
|
-
<span style={{ width: 8, height: 8, borderRadius: '50%', background: TIER[c.tier] || '#556', flexShrink: 0 }} />
|
|
149
|
-
<span style={{ flex: '1 1 160px', minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
150
|
-
<b>{label}</b>
|
|
151
|
-
{c.group && <span style={{ marginLeft: 6, fontSize: 10.5, padding: '1px 6px', borderRadius: 4, background: 'rgba(255,255,255,0.08)', color: '#b8c4c4' }}>Group</span>}
|
|
152
|
-
{one?.company ? <span style={{ color: '#8b9a9a' }}> · {one.company}</span> : null}
|
|
153
|
-
</span>
|
|
154
|
-
{c.unread > 0 && <span style={{ fontSize: 11, padding: '1px 7px', borderRadius: 10, background: '#3498DB', color: '#fff' }}>{c.unread} unread</span>}
|
|
155
|
-
{c.lastFromThem != null && (
|
|
156
|
-
<span style={{ color: waiting ? '#ff9f43' : '#8b9a9a', fontSize: 12, whiteSpace: 'nowrap' }}>{c.lastFromThem ? 'They wrote last' : 'You wrote last'}</span>
|
|
157
|
-
)}
|
|
158
|
-
<span style={{ color: '#b8c4c4', fontSize: 12, whiteSpace: 'nowrap', minWidth: 86, textAlign: 'right' }}>{day(c.last)}</span>
|
|
159
|
-
<span style={{ color: '#8b9a9a', fontSize: 12, whiteSpace: 'nowrap', minWidth: 74, textAlign: 'right' }}>
|
|
160
|
-
{c.count != null ? `${c.count.toLocaleString()} ${c.count === 1 ? 'message' : 'messages'}` : ''}
|
|
161
|
-
</span>
|
|
162
|
-
{href
|
|
163
|
-
? <a href={href} target="_blank" rel="noreferrer" onClick={(e) => e.stopPropagation()} style={{ color: '#3498DB', textDecoration: 'none', whiteSpace: 'nowrap', fontSize: 12 }}>Open on LinkedIn ↗</a>
|
|
164
|
-
: <span style={{ minWidth: 104 }} />}
|
|
165
|
-
</div>
|
|
166
|
-
{open && <Thread key={`${c.id}:${token}:${keep}`} id={c.id} keep={keep} group={c.group} token={token} />}
|
|
167
|
-
</div>
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// One conversation's messages, newest at the bottom, a page at a time: the
|
|
172
|
-
// newest 100 first and 200 more each time you ask, so a thread of thousands
|
|
173
|
-
// opens as fast as a short one.
|
|
174
|
-
function Thread({ id, keep, group, token }) {
|
|
175
|
-
const [t, setT] = useState(null);
|
|
176
|
-
const [err, setErr] = useState(null);
|
|
177
|
-
const scroller = useRef(null);
|
|
178
|
-
const keepAt = useRef(null);
|
|
179
|
-
|
|
180
|
-
useEffect(() => {
|
|
181
|
-
if (!keep) return undefined;
|
|
182
|
-
let live = true;
|
|
183
|
-
fetch(`/api/social/messages?id=${encodeURIComponent(id)}&limit=${THREAD_PAGE}`).then((r) => r.json())
|
|
184
|
-
.then((d) => { if (live) { if (d.error) setErr(d.error); else { keepAt.current = 'bottom'; setT(d); } } })
|
|
185
|
-
.catch(() => { if (live) setErr('It couldn’t be read.'); });
|
|
186
|
-
return () => { live = false; };
|
|
187
|
-
}, [id, keep, token]);
|
|
188
|
-
|
|
189
|
-
// Opened at the newest; after "Show earlier", where you were stays put.
|
|
190
|
-
useLayoutEffect(() => {
|
|
191
|
-
const el = scroller.current;
|
|
192
|
-
if (!el || !keepAt.current) return;
|
|
193
|
-
if (keepAt.current === 'bottom') el.scrollTop = el.scrollHeight;
|
|
194
|
-
else el.scrollTop = el.scrollHeight - keepAt.current;
|
|
195
|
-
keepAt.current = null;
|
|
196
|
-
}, [t]);
|
|
197
|
-
|
|
198
|
-
async function earlier() {
|
|
199
|
-
const el = scroller.current;
|
|
200
|
-
const d = await fetch(`/api/social/messages?id=${encodeURIComponent(id)}&before=${t.start}&limit=${EARLIER_PAGE}`).then((r) => r.json()).catch(() => null);
|
|
201
|
-
if (!d || d.error) return;
|
|
202
|
-
keepAt.current = el ? el.scrollHeight - el.scrollTop : null;
|
|
203
|
-
setT({ ...t, start: d.start, messages: [...d.messages, ...t.messages] });
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const pad = { padding: '10px 14px 14px 32px', fontSize: 12.5, color: '#8b9a9a' };
|
|
207
|
-
if (!keep) return <div style={pad}>Turn on <b>Keep my messages</b> to read them here.</div>;
|
|
208
|
-
if (err) return <div style={{ ...pad, color: '#ff9b9b' }}>{err}</div>;
|
|
209
|
-
if (!t) return <div style={pad}>Opening…</div>;
|
|
210
|
-
if (!t.total) {
|
|
211
|
-
return (
|
|
212
|
-
<div style={pad}>
|
|
213
|
-
No messages are kept for this conversation yet. Choose your export folder again, or sync your messages, to
|
|
214
|
-
bring them in.
|
|
215
|
-
</div>
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
return (
|
|
219
|
-
<div ref={scroller} style={{ maxHeight: 440, overflowY: 'auto', padding: '8px 14px 12px', background: 'rgba(0,0,0,0.2)' }}>
|
|
220
|
-
{t.start > 0 && (
|
|
221
|
-
<div style={{ textAlign: 'center', margin: '4px 0 10px' }}>
|
|
222
|
-
<button onClick={earlier} style={{ background: 'rgba(255,255,255,0.06)', border: LINE, borderRadius: 6, color: '#cfe6f7', cursor: 'pointer', fontSize: 12, padding: '4px 12px' }}>
|
|
223
|
-
Show earlier ({t.start.toLocaleString()} more)
|
|
224
|
-
</button>
|
|
225
|
-
</div>
|
|
226
|
-
)}
|
|
227
|
-
{t.messages.map((m, i) => (
|
|
228
|
-
<div key={t.start + i} style={{ display: 'flex', justifyContent: m.fromMe ? 'flex-end' : 'flex-start', margin: '6px 0' }}>
|
|
229
|
-
<div style={{ maxWidth: '72%' }}>
|
|
230
|
-
<div style={{
|
|
231
|
-
padding: '7px 11px', borderRadius: 12, fontSize: 13, lineHeight: 1.45, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere',
|
|
232
|
-
background: m.fromMe ? 'rgba(52,152,219,0.35)' : 'rgba(255,255,255,0.08)', color: '#eef',
|
|
233
|
-
borderBottomRightRadius: m.fromMe ? 4 : 12, borderBottomLeftRadius: m.fromMe ? 12 : 4,
|
|
234
|
-
}}
|
|
235
|
-
>
|
|
236
|
-
{m.text || <i style={{ color: '#8b9a9a' }}>(no words: an attachment or a reaction)</i>}
|
|
237
|
-
</div>
|
|
238
|
-
<div style={{ fontSize: 10.5, color: '#778', marginTop: 2, textAlign: m.fromMe ? 'right' : 'left' }}>
|
|
239
|
-
{m.fromMe ? 'You' : group ? 'Someone in the group' : 'Them'} · {when(m.t)}
|
|
240
|
-
</div>
|
|
241
|
-
</div>
|
|
242
|
-
</div>
|
|
243
|
-
))}
|
|
244
|
-
</div>
|
|
245
|
-
);
|
|
246
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:o,ready:r}=(0,n.useUser)();return r&&o?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:r?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function o({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,o,"Btn",0,function({children:e,onClick:o,disabled:r,primary:s,tone:i,type:l="button"}){return(0,t.jsx)("button",{type:l,onClick:o,disabled:r,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:r?"#667":"#fff",border:n,background:r?"rgba(255,255,255,0.05)":"bad"===i?"rgba(255,80,80,0.15)":s?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:r?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:r,intro:s,children:i}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:r}),s&&(0,t.jsx)(o,{style:{marginTop:0,marginBottom:12},children:s}),i]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},60451,e=>{"use strict";var t=e.i(43476),n=e.i(71645),o=e.i(22016),r=e.i(2776),s=e.i(15812),i=e.i(19821),l=e.i(84278),a=e.i(39160),c=e.i(7214),d=e.i(40996),u=e.i(8819),p=e.i(64745);let h={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},f=["S","A","B","C","D"],g=e=>/^https:\/\/(www\.)?linkedin\.com\//.test(String(e||""))?e:null;function m({byKey:e,connected:o,ready:r,keep:s,onKeep:i,switching:a,token:c}){let[d,p]=(0,n.useState)(null),[h,g]=(0,n.useState)(""),[x,b]=(0,n.useState)(null),[w,v]=(0,n.useState)(null),[S,j]=(0,n.useState)(100);(0,n.useEffect)(()=>{let e=!0;return fetch("/api/social/messages").then(e=>e.json()).then(t=>{e&&p(t)}).catch(()=>{e&&p({conversations:[]})}),()=>{e=!1}},[c,s]),(0,n.useEffect)(()=>{let e=h.trim();if(!s||e.length<2)return;let t=!0,n=setTimeout(()=>{fetch(`/api/social/messages?q=${encodeURIComponent(e)}`).then(e=>e.json()).then(n=>{t&&b({q:e,ids:new Set(n.ids||[])})}).catch(()=>{})},250);return()=>{t=!1,clearTimeout(n)}},[h,s,c]);let{rows:k,leftOut:C}=(0,n.useMemo)(()=>{let t=d?.conversations||[],n=t.filter(e=>e.people.some(e=>o.has(e))),r=n.map(t=>{let n=t.people.map(t=>e.get(t)).filter(Boolean),o=f.find(e=>n.some(t=>t.tier===e))||null;return{...t,persons:n,tier:o}});return{rows:(0,l.sortConversations)(r,e=>e.tier),leftOut:t.length-n.length}},[d,e,o]),T=(0,n.useMemo)(()=>{let e=h.trim().toLowerCase();if(!e)return k;let t=s&&x?.q===h.trim()?x.ids:null;return k.filter(n=>n.persons.some(t=>String(t.name||"").toLowerCase().includes(e))||String(n.title||"").toLowerCase().includes(e)||t?.has(n.id))},[k,h,x,s]),F={padding:"12px 14px",borderRadius:8,border:u.LINE,background:"rgba(255,255,255,0.03)",marginTop:10};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{style:F,children:[(0,t.jsxs)("label",{style:{display:"flex",gap:8,alignItems:"center",fontSize:13.5,color:"#fff",cursor:a?"default":"pointer"},children:[(0,t.jsx)("input",{type:"checkbox",checked:s,disabled:a,onChange:e=>i(e.target.checked)}),(0,t.jsx)("b",{children:"Keep my messages on this computer"}),(0,t.jsx)("span",{style:{fontSize:11.5,color:s?"#00ff88":"#8b9a9a"},children:s?"on":"off"})]}),(0,t.jsxs)(u.Body,{style:{margin:"6px 0 0",fontSize:12.5},children:["Off unless you turn it on. When it’s on, the messages themselves, including what other people wrote to you, are saved only in the app’s data folder on this computer. They’re never sent anywhere, and they aren’t in “Save a copy of my network”. ",(0,t.jsx)("i",{children:"Forget it"}),", or switching this off, deletes them. With it off, the list below still shows who, when and who wrote last."]})]}),(0,t.jsxs)("div",{style:{...F,padding:0},children:[(0,t.jsxs)("div",{style:{padding:"10px 14px",borderBottom:u.LINE,display:"flex",gap:10,alignItems:"center"},children:[(0,t.jsx)("input",{type:"search",value:h,onChange:e=>{g(e.target.value),j(100)},placeholder:s?"Search by name or by what was said":"Search by name","aria-label":"Search conversations",style:{flex:1,minWidth:0,padding:"6px 10px",borderRadius:6,border:u.LINE,background:"rgba(0,0,0,0.3)",color:"#fff",fontSize:13}}),(0,t.jsxs)("span",{style:{fontSize:12,color:"#8b9a9a",whiteSpace:"nowrap"},children:[T.length.toLocaleString()," ",1===T.length?"conversation":"conversations"]})]}),(!d||!r)&&(0,t.jsx)("div",{style:{padding:12,fontSize:13,color:"#8b9a9a"},children:"Loading…"}),d&&r&&0===k.length&&(0,t.jsx)("div",{style:{padding:12,fontSize:13,color:"#8b9a9a"},children:"No conversations with your connections yet. Choose your export folder above, or sync your messages."}),d&&r&&k.length>0&&0===T.length&&(0,t.jsx)("div",{style:{padding:12,fontSize:13,color:"#8b9a9a"},children:"Nothing matches that."}),r&&T.slice(0,S).map(e=>(0,t.jsx)(y,{c:e,open:w===e.id,onToggle:()=>v(w===e.id?null:e.id),keep:s,token:c},e.id)),r&&T.length>S&&(0,t.jsxs)("button",{onClick:()=>j(S+100),style:{width:"100%",padding:10,background:"none",border:"none",color:"#3498DB",cursor:"pointer",fontSize:13},children:["Show ",Math.min(100,T.length-S).toLocaleString()," more"]})]}),(0,t.jsxs)("div",{style:{fontSize:11.5,color:"#778",marginTop:6},children:["Waiting on you first (they wrote last), then S and A tier, then the most recent. Groups are shown but not counted in warmth.",C>0?` ${C.toLocaleString()} ${1===C?"conversation is":"conversations are"} with people who aren’t your connections and aren’t shown.`:""]})]})}function y({c:e,open:n,onToggle:o,keep:r,token:s}){let i,l=e.group?null:e.persons[0],a=e.persons.map(e=>e.name).filter(Boolean),c=e.group?e.title||(a.length?`${a.slice(0,3).join(", ")}${e.people.length>3?` +${e.people.length-3}`:""}`:`${e.people.length} people`):l?.name||String(e.people[0]||"").replace(/\/+$/,"").split("/").pop(),d=g(e.threadUrl)||(e.group?null:g(l?.profile_url||e.people[0])),u=!e.group&&!0===e.lastFromThem;return(0,t.jsxs)("div",{style:{borderBottom:"1px solid rgba(255,255,255,0.04)"},children:[(0,t.jsxs)("div",{role:"button",tabIndex:0,"aria-expanded":n,onClick:o,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),o())},style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:10,padding:"8px 14px",fontSize:13,cursor:"pointer",background:n?"rgba(255,255,255,0.04)":"none"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:h[e.tier]||"#556",flexShrink:0}}),(0,t.jsxs)("span",{style:{flex:"1 1 160px",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[(0,t.jsx)("b",{children:c}),e.group&&(0,t.jsx)("span",{style:{marginLeft:6,fontSize:10.5,padding:"1px 6px",borderRadius:4,background:"rgba(255,255,255,0.08)",color:"#b8c4c4"},children:"Group"}),l?.company?(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:[" · ",l.company]}):null]}),e.unread>0&&(0,t.jsxs)("span",{style:{fontSize:11,padding:"1px 7px",borderRadius:10,background:"#3498DB",color:"#fff"},children:[e.unread," unread"]}),null!=e.lastFromThem&&(0,t.jsx)("span",{style:{color:u?"#ff9f43":"#8b9a9a",fontSize:12,whiteSpace:"nowrap"},children:e.lastFromThem?"They wrote last":"You wrote last"}),(0,t.jsx)("span",{style:{color:"#b8c4c4",fontSize:12,whiteSpace:"nowrap",minWidth:86,textAlign:"right"},children:(i=e.last)?new Date(i).toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):""}),(0,t.jsx)("span",{style:{color:"#8b9a9a",fontSize:12,whiteSpace:"nowrap",minWidth:74,textAlign:"right"},children:null!=e.count?`${e.count.toLocaleString()} ${1===e.count?"message":"messages"}`:""}),d?(0,t.jsx)("a",{href:d,target:"_blank",rel:"noreferrer",onClick:e=>e.stopPropagation(),style:{color:"#3498DB",textDecoration:"none",whiteSpace:"nowrap",fontSize:12},children:"Open on LinkedIn ↗"}):(0,t.jsx)("span",{style:{minWidth:104}})]}),n&&(0,t.jsx)(x,{id:e.id,keep:r,group:e.group,token:s},`${e.id}:${s}:${r}`)]})}function x({id:e,keep:o,group:r,token:s}){let[i,l]=(0,n.useState)(null),[a,c]=(0,n.useState)(null),d=(0,n.useRef)(null),p=(0,n.useRef)(null);async function h(){let t=d.current,n=await fetch(`/api/social/messages?id=${encodeURIComponent(e)}&before=${i.start}&limit=200`).then(e=>e.json()).catch(()=>null);n&&!n.error&&(p.current=t?t.scrollHeight-t.scrollTop:null,l({...i,start:n.start,messages:[...n.messages,...i.messages]}))}(0,n.useEffect)(()=>{if(!o)return;let t=!0;return fetch(`/api/social/messages?id=${encodeURIComponent(e)}&limit=100`).then(e=>e.json()).then(e=>{t&&(e.error?c(e.error):(p.current="bottom",l(e)))}).catch(()=>{t&&c("It couldn’t be read.")}),()=>{t=!1}},[e,o,s]),(0,n.useLayoutEffect)(()=>{let e=d.current;e&&p.current&&("bottom"===p.current?e.scrollTop=e.scrollHeight:e.scrollTop=e.scrollHeight-p.current,p.current=null)},[i]);let f={padding:"10px 14px 14px 32px",fontSize:12.5,color:"#8b9a9a"};return o?a?(0,t.jsx)("div",{style:{...f,color:"#ff9b9b"},children:a}):i?i.total?(0,t.jsxs)("div",{ref:d,style:{maxHeight:440,overflowY:"auto",padding:"8px 14px 12px",background:"rgba(0,0,0,0.2)"},children:[i.start>0&&(0,t.jsx)("div",{style:{textAlign:"center",margin:"4px 0 10px"},children:(0,t.jsxs)("button",{onClick:h,style:{background:"rgba(255,255,255,0.06)",border:u.LINE,borderRadius:6,color:"#cfe6f7",cursor:"pointer",fontSize:12,padding:"4px 12px"},children:["Show earlier (",i.start.toLocaleString()," more)"]})}),i.messages.map((e,n)=>{let o;return(0,t.jsx)("div",{style:{display:"flex",justifyContent:e.fromMe?"flex-end":"flex-start",margin:"6px 0"},children:(0,t.jsxs)("div",{style:{maxWidth:"72%"},children:[(0,t.jsx)("div",{style:{padding:"7px 11px",borderRadius:12,fontSize:13,lineHeight:1.45,whiteSpace:"pre-wrap",overflowWrap:"anywhere",background:e.fromMe?"rgba(52,152,219,0.35)":"rgba(255,255,255,0.08)",color:"#eef",borderBottomRightRadius:e.fromMe?4:12,borderBottomLeftRadius:e.fromMe?12:4},children:e.text||(0,t.jsx)("i",{style:{color:"#8b9a9a"},children:"(no words: an attachment or a reaction)"})}),(0,t.jsxs)("div",{style:{fontSize:10.5,color:"#778",marginTop:2,textAlign:e.fromMe?"right":"left"},children:[e.fromMe?"You":r?"Someone in the group":"Them"," · ",(o=e.t)?new Date(o).toLocaleString(void 0,{day:"numeric",month:"short",year:"numeric",hour:"numeric",minute:"2-digit"}):""]})]})},i.start+n)})]}):(0,t.jsx)("div",{style:f,children:"No messages are kept for this conversation yet. Choose your export folder again, or sync your messages, to bring them in."}):(0,t.jsx)("div",{style:f,children:"Opening…"}):(0,t.jsxs)("div",{style:f,children:["Turn on ",(0,t.jsx)("b",{children:"Keep my messages"})," to read them here."]})}let b={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},w={warm:["Warm","#ff9f43"],cool:["Cool","#3498DB"],dormant:["Dormant","#8899aa"],never:["Never messaged","#556"]},v={"connections.csv":"first name","messages.csv":"conversation id","invitations.csv":"direction","positions.csv":"company name","shares.csv":"date"},S=e=>e?new Date(e).toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"";async function j(e){let t=[],n={},o=0;for(let r of e)for(let e of r.messages){let s=JSON.stringify(e).length+2;o+s>25e5&&o>0&&(t.push(n),n={},o=0),n[r.id]||(n[r.id]={title:r.title||"",messages:[]},o+=r.id.length+(r.title||"").length+40),n[r.id].messages.push(e),o+=s}t.push(n);for(let e=0;e<t.length;e++){let n=await fetch("/api/social/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({part:e,parts:t.length,threads:t[e]})});if(!n.ok)throw Error((await n.json().catch(()=>({}))).error||"The messages couldn’t be saved.")}}function k(){let{userId:e}=(0,s.useUser)(),[r,h]=(0,n.useState)(void 0),[f,g]=(0,n.useState)(null),[y,x]=(0,n.useState)(!1),[k,C]=(0,n.useState)(null),[T,F]=(0,n.useState)(!1),[I,M]=(0,n.useState)(()=>(0,d.scannerNow)()),[z,B]=(0,n.useState)(!1),[L,D]=(0,n.useState)(0),O=(0,n.useRef)(null),N=r?.keepMessages===!0,E=()=>fetch("/api/social").then(e=>e.json()).then(e=>h(e.social||null)).catch(()=>h(null)).finally(()=>D(e=>e+1));(0,n.useEffect)(()=>{E()},[]),(0,n.useEffect)(()=>(0,d.watchScanner)(()=>M((0,d.scannerNow)())),[]),(0,n.useEffect)(()=>{if(!e)return;let t=!0;return(0,i.loadNetwork)(e).then(e=>{t&&g(e)}).catch(()=>{}),()=>{t=!1}},[e]);let $=(0,n.useMemo)(()=>{let e=new Map;for(let t of[...f?.degree1||[],...f?.degree2||[]])e.has((0,c.keyFor)(t))||e.set((0,c.keyFor)(t),t);return e},[f]),A=(0,n.useMemo)(()=>new Set((f?.degree1||[]).map(c.keyFor)),[f]);async function W(e){F(!0),C(null);try{let t={};for(let n of Array.from(e||[])){let e=n.name.toLowerCase();v[e]&&!t[e]&&(t[e]=(0,l.readTable)(await n.text(),v[e]))}if(!Object.keys(t).length)throw Error("That folder doesn’t have LinkedIn’s export files in it (Connections.csv, messages.csv and so on).");let n=t["connections.csv"]||[],o=t["messages.csv"]?(0,l.messageStats)(t["messages.csv"]):{asOf:null,people:new Map},r=t["messages.csv"]?(0,l.buildConversations)(t["messages.csv"],{keepText:N}):null;O.current=t["messages.csv"]||null;let s={};for(let[e,t]of o.people)s[e]={last:t.last,lastFromThem:t.lastFromThem,total:t.total,recent:t.recent};if(y)for(let e of n){let t=e["email address"];if(!t)continue;let n=(0,c.keyFor)({profile_url:e.url});s[n]={...s[n]||{},email:t}}let i=o.asOf||Date.now(),a={asOf:i,people:s,conversations:r?r.conversations.map(l.conversationSummary):[],chapters:(0,l.careerChapters)(t["positions.csv"]||[],n,i),posts:t["shares.csv"]?(0,l.postingEffect)(t["shares.csv"],n):null,invites:t["invitations.csv"]?(0,l.invitationSplit)(t["invitations.csv"]):null,emails:y},d=await fetch("/api/social",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!d.ok)throw Error((await d.json().catch(()=>({}))).error||"It couldn’t be saved.");r&&N&&await j(r.conversations),C({good:!0,text:`Read ${Object.keys(t).length} of LinkedIn’s files: ${o.people.size.toLocaleString()} people you’ve messaged one to one`+(r?`, ${r.conversations.length.toLocaleString()} conversations${N?", their messages kept on this computer":""}.`:".")}),await E()}catch(e){C({good:!1,text:e.message})}finally{F(!1)}}async function R(){C(null);try{let e=await (0,d.runScrape)("messages");C(e?.exitCode===0?{good:!0,text:"Your messages list is read."}:{good:!1,text:"The sync stopped before it finished. The Scan page has the log."}),await E()}catch(e){C({good:!1,text:e.message})}}async function _(e){await fetch("/api/social",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoSync:e})}),E()}async function U(e){if(e||window.confirm("Delete the messages kept on this computer? The list of conversations stays; the messages themselves are deleted.")){B(!0),C(null);try{if(e||await fetch("/api/social/messages",{method:"DELETE"}),!(await fetch("/api/social",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({keepMessages:e})})).ok)throw Error("The switch couldn’t be saved.");e&&O.current?(await j((0,l.buildConversations)(O.current,{keepText:!0}).conversations),C({good:!0,text:"Your messages are kept on this computer now."})):e?C({good:!0,text:"On. Choose your export folder again, or sync your messages, to bring the messages in."}):C({good:!0,text:"Off. The kept messages are deleted."})}catch(e){C({good:!1,text:e.message})}finally{B(!1),E()}}}async function P(){await fetch("/api/social",{method:"DELETE"}),O.current=null,C({good:!0,text:"Forgotten. Nothing from your export or messages is kept here now, the messages themselves included."}),E()}let{merged:H,asOf:J}=(0,n.useMemo)(()=>(0,a.mergeSocial)(r),[r]),K=(0,n.useMemo)(()=>{let e={warm:0,cool:0,dormant:0,never:0};for(let t of f?.degree1||[])e[(0,l.warmthOf)(H.get((0,c.keyFor)(t)),J)]+=1;return e},[f,H,J]),Y=(0,n.useMemo)(()=>{let e={asOf:J,people:new Map([...H].filter(([,e])=>null!=e.lastFromThem))},t=(0,l.repliesWaiting)(e).map(e=>({...e,person:$.get(e.url)}));for(let[e,n]of H)n.unread>0&&!t.some(t=>t.url===e)&&t.push({url:e,unread:n.unread,person:$.get(e)});let n=e=>({S:0,A:1})[e.person?.tier]??2;return t.sort((e,t)=>n(e)-n(t)||(e.days??0)-(t.days??0)).slice(0,15)},[H,J,$]);if(p.IS_DEMO)return(0,t.jsx)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#aaa",padding:40,fontFamily:u.FONT},children:"Not part of the demo."});let q=I?.running,G={padding:"12px 14px",borderRadius:8,border:u.LINE,background:"rgba(255,255,255,0.03)",marginTop:10},V={fontSize:16,margin:"24px 0 6px"};return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:u.FONT},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:u.LINE,display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)(o.default,{href:"/",style:{color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:u.LINE},children:"← Back to Map"}),(0,t.jsxs)("h1",{style:{fontSize:22,fontWeight:700,margin:0,color:"#FFD700"},children:["Social ",(0,t.jsx)("span",{style:{fontSize:12,color:"#8b9a9a",fontWeight:600},children:"experimental"})]})]}),(0,t.jsxs)("main",{style:{maxWidth:980,margin:"0 auto",padding:"8px 24px 64px"},children:[(0,t.jsxs)(u.Body,{style:{marginTop:16},children:["Who you’re warm with, who’s waiting on a reply, and how each chapter of your career built your network, from your own LinkedIn data. Only dates, who wrote last and counts are kept on this computer, and what messages say only if you turn on ",(0,t.jsx)("i",{children:"Keep my messages"})," under Conversations."]}),(0,t.jsx)("h2",{style:V,children:"Your LinkedIn export"}),(0,t.jsxs)("div",{style:G,children:[(0,t.jsxs)(u.Body,{style:{margin:0},children:["On LinkedIn: ",(0,t.jsx)("i",{children:"Settings → Data privacy → Get a copy of your data"}),", pick the larger archive, and unzip the file it emails you. Then choose that folder here. It’s read in this window; nothing goes to LinkedIn."]}),(0,t.jsxs)("label",{style:{display:"flex",gap:8,alignItems:"flex-start",fontSize:12.5,color:"#b8c4c4",marginTop:10},children:[(0,t.jsx)("input",{type:"checkbox",checked:y,onChange:e=>x(e.target.checked),style:{marginTop:3}}),(0,t.jsx)("span",{children:"Also keep email addresses from it, on this computer only, for one-click email."})]}),(0,t.jsxs)("div",{style:{marginTop:10,display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[(0,t.jsxs)("label",{style:{padding:"7px 14px",borderRadius:8,background:"rgba(52,152,219,0.18)",color:"#cfe6f7",cursor:T?"default":"pointer",fontSize:13},children:[T?"Reading…":r?"Choose a newer export":"Choose the export folder",(0,t.jsx)("input",{type:"file",webkitdirectory:"",directory:"",multiple:!0,disabled:T,style:{display:"none"},onChange:e=>W(e.target.files)})]}),r&&(0,t.jsxs)("span",{style:{fontSize:12,color:"#8b9a9a"},children:["From an export up to ",S(r.asOf),r.liveAt?` \xb7 messages synced ${S(Date.parse(r.liveAt))}`:""]}),r&&(0,t.jsx)("button",{onClick:P,style:{background:"none",border:"none",color:"#ff9b9b",cursor:"pointer",fontSize:12},children:"Forget it"})]})]}),(0,t.jsxs)("h2",{style:V,children:["Live messages sync ",(0,t.jsx)("span",{style:{fontSize:11,color:"#FFD700"},children:"experimental"})]}),(0,t.jsxs)("div",{style:G,children:[(0,t.jsxs)(u.Body,{style:{margin:0},children:["Reads your messages list once, in your own Chrome: who each one-to-one conversation is with, when it was last active, whether it’s unread and who wrote last. It uses no search budget and opens no conversation. The newest message’s words are kept only if ",(0,t.jsx)("i",{children:"Keep my messages"})," is on."]}),(0,t.jsxs)("div",{style:{marginTop:10,display:"flex",gap:12,alignItems:"center",flexWrap:"wrap"},children:[(0,t.jsx)("button",{onClick:R,disabled:q,style:{padding:"7px 14px",borderRadius:8,border:"none",background:q?"#333":"rgba(0,255,136,0.15)",color:q?"#777":"#00ff88",cursor:q?"default":"pointer",fontSize:13},children:q?"The scanner is busy":"Sync messages now"}),(0,t.jsxs)("label",{style:{display:"flex",gap:6,alignItems:"center",fontSize:12.5,color:"#b8c4c4"},children:[(0,t.jsx)("input",{type:"checkbox",checked:r?.autoSync===!0,onChange:e=>_(e.target.checked)}),"Once a day while the app is open (daytime only)"]})]})]}),k&&(0,t.jsx)("div",{style:{marginTop:10,fontSize:13,color:k.good?"#00ff88":"#ff9b9b"},children:k.text}),(0,t.jsx)("h2",{style:V,children:"Conversations"}),(0,t.jsx)(m,{byKey:$,connected:A,ready:!!f,keep:N,onKeep:U,switching:z||T,token:L}),r&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("h2",{style:V,children:"Warmth"}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(160px, 1fr))",gap:10},children:Object.entries(w).map(([e,[n,o]])=>(0,t.jsxs)("div",{style:{...G,marginTop:0},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:o},children:(K[e]||0).toLocaleString()}),(0,t.jsx)("div",{style:{fontSize:12.5,color:"#b8c4c4"},children:n})]},e))}),(0,t.jsx)("div",{style:{fontSize:11.5,color:"#778",marginTop:6},children:"Of your connections. Warm: messaged in the last 30 days, or 3+ messages in 90. Cool: within a year. Dormant: longer ago."}),(0,t.jsx)("h2",{style:V,children:"Waiting on you"}),(0,t.jsxs)("div",{style:{...G,padding:0},children:[0===Y.length&&(0,t.jsx)("div",{style:{padding:12,fontSize:13,color:"#8b9a9a"},children:"No one is waiting on a reply."}),Y.map(e=>(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"8px 14px",borderBottom:"1px solid rgba(255,255,255,0.04)",fontSize:13},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:b[e.person?.tier]||"#556",flexShrink:0}}),(0,t.jsxs)("span",{style:{flex:1,minWidth:0},children:[(0,t.jsx)("b",{children:e.person?.name||String(e.url||"").replace(/\/+$/,"").split("/").pop()}),e.person?.company?(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:[" · ",e.person.company]}):null]}),(0,t.jsx)("span",{style:{color:"#b8c4c4"},children:e.unread?`${e.unread} unread`:`wrote ${e.days} days before your export`}),(0,t.jsx)("a",{href:e.url,target:"_blank",rel:"noreferrer",style:{color:"#3498DB",textDecoration:"none"},children:"Open ↗"})]},e.url))]}),r.chapters?.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("h2",{style:V,children:"Career chapters"}),(0,t.jsx)("div",{style:{...G,padding:0},children:r.chapters.map(e=>{let n=(e.people||[]).filter(e=>["warm","cool"].includes((0,l.warmthOf)(H.get((0,c.keyFor)({profile_url:e})),J))).length;return(0,t.jsxs)("div",{style:{display:"flex",gap:10,padding:"8px 14px",borderBottom:"1px solid rgba(255,255,255,0.04)",fontSize:13,alignItems:"baseline"},children:[(0,t.jsxs)("span",{style:{flex:1},children:[(0,t.jsx)("b",{children:e.company})," ",(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:[e.title," · ",new Date(e.from).getFullYear(),"–",e.to?new Date(e.to).getFullYear():"now"]})]}),(0,t.jsxs)("span",{style:{color:"#b8c4c4"},children:[e.made.toLocaleString()," connections made"]}),(0,t.jsx)("span",{style:{color:"#ff9f43",minWidth:90,textAlign:"right"},children:e.made?`${Math.round(100*n/e.made)}% still in touch`:""})]},`${e.company}-${e.from}`)})})]}),r.posts?.posts?.length>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("h2",{style:V,children:"Does posting work?"}),(0,t.jsxs)("div",{style:G,children:[(0,t.jsxs)("div",{style:{fontSize:13},children:["In the week after a post you made ",(0,t.jsx)("b",{children:r.posts.afterPosts.toFixed(1)})," new connections on average; a usual week, ",(0,t.jsx)("b",{children:r.posts.usualWeek.toFixed(1)}),"."]}),(0,t.jsx)("div",{style:{fontSize:11.5,color:"#778",marginTop:4},children:"What came after a post, not proof it came from it."}),[...r.posts.posts].sort((e,t)=>t.week-e.week).slice(0,3).map(e=>(0,t.jsxs)("div",{style:{fontSize:12.5,color:"#b8c4c4",marginTop:6},children:[S(e.t),": ",e.week," new connections that week ",e.link?(0,t.jsx)("a",{href:e.link,target:"_blank",rel:"noreferrer",style:{color:"#3498DB",textDecoration:"none"},children:"Post ↗"}):null]},e.t))]})]}),r.invites?.total>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("h2",{style:V,children:"Who reaches out"}),(0,t.jsx)("div",{style:G,children:(0,t.jsxs)("span",{style:{fontSize:13},children:[r.invites.incoming.toLocaleString()," requests came to you and you sent ",r.invites.outgoing.toLocaleString()," ","(",Math.round(100*r.invites.incoming/r.invites.total),"% came to you), as far as your export shows."]})})]})]})]})]})}e.s(["default",0,function(){return(0,t.jsx)(r.default,{children:(0,t.jsx)(k,{})})}],60451)},39160,84278,e=>{"use strict";var t=e.i(7214),n=e.i(7837);function o(e){let t=String(e||"").trim();if(!t)return null;let n=t.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?(?:\s*UTC)?$/);if(n)return Date.UTC(+n[1],n[2]-1,+n[3],+n[4],+n[5],+(n[6]||0));if(n=t.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4}),?\s+(\d{1,2}):(\d{2})\s*(AM|PM)?$/i)){let e=100>+n[3]?2e3+ +n[3]:+n[3],t=n[4]%12;return"PM"===(n[6]||"").toUpperCase()&&(t+=12),Date.UTC(e,n[1]-1,+n[2],t,+n[5])}if(n=t.match(/^([A-Za-z]{3,9})\s+(\d{4})$/)){let e=Date.parse(`1 ${n[1]} ${n[2]} UTC`);return Number.isNaN(e)?null:e}let o=Date.parse(/\d{4}$/.test(t)?`${t} UTC`:t);return Number.isNaN(o)?null:o}let r=e=>(0,t.keyFor)({profile_url:e});function s(e=[]){let t=new Map;for(let n of e){let e=r(n["sender profile url"]),o=n["conversation id"];o&&e&&(t.has(e)||t.set(e,new Set),t.get(e).add(o))}let n=null;for(let[e,o]of t)(!n||o.size>t.get(n).size)&&(n=e);return n}function i(e,t){if(!e||!e.total)return"never";let n=t-e.last;return n<=2592e6||e.recent>=3?"warm":n<=31536e6?"cool":"dormant"}e.s(["buildConversations",0,function(e=[],{keepText:t=!1}={}){let n=s(e),i=new Map;for(let s of e){let e=r(s["sender profile url"]),l=s["conversation id"];if(!l||!e)continue;let a=o(s.date);if(null==a)continue;i.has(l)||i.set(l,{id:l,title:"",everyone:new Set,messages:[]});let c=i.get(l);c.everyone.add(e),String(s["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).forEach(e=>c.everyone.add(r(e)));let d={t:a,fromMe:e===n};t&&(d.text=[s.subject,s.content].map(e=>String(e||"").trim()).filter(Boolean).join("\n\n"),!c.title&&s["conversation title"]&&(c.title=String(s["conversation title"]).trim())),c.messages.push(d)}let l=[];for(let e of i.values()){if(!e.everyone.has(n))continue;let o=[...e.everyone].filter(e=>e&&e!==n).sort();if(!o.length)continue;e.messages.sort((e,t)=>e.t-t.t);let r={id:e.id,people:o,group:o.length>1,messages:e.messages};t&&(r.title=e.title),l.push(r)}return{self:n,conversations:l}},"careerChapters",0,function(e=[],t=[],n=Date.now()){let s=e.map(e=>({company:e["company name"]||"",title:e.title||"",from:o(e["started on"]),to:o(e["finished on"])})).filter(e=>e.company&&null!=e.from).sort((e,t)=>e.from-t.from),i=t.map(e=>({url:r(e.url||e.profile_url),t:o(e["connected on"]||e.connected_on)})).filter(e=>null!=e.t);return s.map(e=>{let t=e.to??n,o=i.filter(n=>n.t>=e.from&&n.t<t);return{...e,to:e.to,made:o.length,people:o.map(e=>e.url)}})},"conversationSummary",0,function(e){let t=e.messages[e.messages.length-1];return{id:e.id,people:e.people,group:e.group,last:t?t.t:null,lastFromThem:t?!t.fromMe:null,count:e.messages.length}},"invitationSplit",0,function(e=[]){let t=0,n=0;for(let o of e){let e=String(o.direction||"").toUpperCase();"INCOMING"===e?t+=1:"OUTGOING"===e&&(n+=1)}return{incoming:t,outgoing:n,total:t+n}},"messageStats",0,function(e=[]){let t=s(e),n=new Map;for(let t of e){let e=r(t["sender profile url"]),s=t["conversation id"];if(!s||!e)continue;let i=String(t["recipient profile urls"]||"").split(/[,;\s]+/).filter(Boolean).map(r),l=o(t.date);if(null==l)continue;n.has(s)||n.set(s,{people:new Set,msgs:[]});let a=n.get(s);a.people.add(e),i.forEach(e=>a.people.add(e)),a.msgs.push({from:e,t:l})}let i=0,l=new Map;for(let e of n.values()){let n=[...e.people].filter(e=>e!==t);if(1!==n.length||!e.people.has(t))continue;let o=n[0],r=l.get(o)||{last:0,lastFromThem:!1,total:0,times:[]};for(let n of e.msgs)r.total+=1,r.times.push(n.t),n.t>=r.last&&(r.last=n.t,r.lastFromThem=n.from!==t),n.t>i&&(i=n.t);l.set(o,r)}for(let e of l.values())e.recent=e.times.filter(e=>e>i-7776e6).length,delete e.times;return{self:t,asOf:i||null,people:l}},"postingEffect",0,function(e=[],t=[]){let n=e.map(e=>({t:o(e.date),link:e.sharelink||e["share link"]||""})).filter(e=>null!=e.t).sort((e,t)=>e.t-t.t),r=t.map(e=>o(e["connected on"]||e.connected_on)).filter(e=>null!=e).sort((e,t)=>e-t);if(!r.length)return{posts:[],usualWeek:0,afterPosts:0};let s=Math.max(6048e5,r[r.length-1]-r[0]),i=r.length/s*6048e5,l=n.map(e=>({...e,week:r.filter(t=>t>=e.t&&t<e.t+6048e5).length})),a=l.length?l.reduce((e,t)=>e+t.week,0)/l.length:0;return{posts:l,usualWeek:i,afterPosts:a}},"readTable",0,function(e,t){let o=(0,n.parseCsv)(String(e||"")),r=o.findIndex(e=>e.some(e=>e.trim().toLowerCase()===t.toLowerCase()));if(r<0)return[];let s=o[r].map(e=>e.trim().toLowerCase());return o.slice(r+1).filter(e=>e.some(e=>e.trim())).map(e=>Object.fromEntries(s.map((t,n)=>[t,(e[n]??"").trim()])))},"repliesWaiting",0,function(e){let t=[];for(let[n,o]of e.people){let r=e.asOf-o.last;o.lastFromThem&&r>=2592e5&&r<=2592e6&&t.push({url:n,days:Math.round(r/864e5),total:o.total})}return t.sort((e,t)=>e.days-t.days)},"sortConversations",0,function(e=[],t=()=>null){let n=e=>e.group||!0!==e.lastFromThem?1:0,o=e=>({S:0,A:1})[t(e)]??2;return[...e].sort((e,t)=>n(e)-n(t)||o(e)-o(t)||(t.last||0)-(e.last||0))},"warmthOf",0,i],84278);let l="six-degrees-galaxy-lab",a="six-degrees-galaxy-layouts",c=Object.freeze({on:!1,gravity:0,rings:1,push:15,pull:1,distance:1,dotSize:1,lines:1,sizeBy:"power",names:"key",branch:!0,colourBy:"tier",speed:15,loop:!1,labels:!0}),d=["gravity","rings","push","pull","distance","dotSize","lines","sizeBy","names","branch","colourBy","speed","loop"],u=Object.freeze({gravity:.25,rings:0,push:25,pull:2.5,distance:.35,sizeBy:"reach"}),p=new Set,h=null;function f(){return h||(h=function(){try{let e=JSON.parse(localStorage.getItem(l)||"null");return e&&"object"==typeof e?{...c,...e}:c}catch{return c}}()),h}function g(e){h=null===e?{...c,on:f().on,labels:f().labels}:{...f(),...e};try{localStorage.setItem(l,JSON.stringify(h))}catch{}p.forEach(e=>e())}let m=null,y=new Set;function x(){if(!m){try{m=JSON.parse(localStorage.getItem(a)||"[]")}catch{m=[]}Array.isArray(m)||(m=[])}return m}function b(e){m=e;try{localStorage.setItem(a,JSON.stringify(e))}catch{}y.forEach(e=>e())}let w=new Set,v={at:null,playing:!1,min:null,max:null,of:0,find:"",fly:0,found:0,social:void 0},S=null;function j(e){let t={...v,...e};Object.keys(e).every(e=>Object.is(t[e],v[e]))||(v=t,w.forEach(e=>e()))}function k(){cancelAnimationFrame(S),S=null,j({playing:!1})}let C=null;function T(e){let n=new Map;for(let[o,r]of Object.entries(e?.people||{}))n.set((0,t.keyFor)({profile_url:o}),{...r});for(let[o,r]of Object.entries(e?.live||{})){let e=(0,t.keyFor)({profile_url:o}),s=n.get(e)||{total:0,recent:0};r.last&&(!s.last||r.last>s.last)&&(s.last=r.last,"boolean"==typeof r.lastFromThem&&(s.lastFromThem=r.lastFromThem)),s.unread=r.unread,s.total=Math.max(s.total||0,1),n.set(e,s)}let o=Math.max(e?.asOf||0,e?.liveAt&&Date.parse(e.liveAt)||0);for(let e of n.values())(e.last||0)>o&&(o=e.last);return{merged:n,asOf:o,chapters:e?.chapters||[],posts:e?.posts?.posts||[]}}let F={1:"#4FC3F7",2:"#BA68C8",3:"#FFB74D"},I=["#FF6B6B","#4ECDC4","#FFD93D","#A29BFE","#00B894","#FD79A8","#74B9FF","#E17055"],M={warm:"#FF7043",cool:"#4FC3F7",dormant:"#8D6E63",never:"#546E7A"},z="#4a5568",B=e=>String(e||"").trim().toLowerCase();e.s(["CLUSTERS",0,u,"LAB_DEFAULTS",0,c,"applyLayout",0,function(e){let t=x().find(t=>t.name===e);t&&g(Object.fromEntries(d.filter(e=>e in t.settings).map(e=>[e,t.settings[e]])))},"bornTimes",0,function(e,t){let n=new Map(e.map(e=>[e.id,e])),o=new Map,r=(e,s=0)=>{if(o.has(e.id))return o.get(e.id);let i=-1/0,l=t.get(e.id);if(1===e.degree||null==l||s>6){let t=e.connected_date?Date.parse(e.connected_date):NaN;i=Number.isNaN(t)?-1/0:t}return null!=l&&n.has(l)&&s<=6&&(i=Math.max(i,r(n.get(l),s+1))),o.set(e.id,i),i};return e.map(e=>r(e))},"chapterAt",0,function(e,t){let n=null;for(let o of e?.chapters||[])Number.isFinite(o.from)&&o.from<=t&&(!n||o.from>n.from)&&(n=o);return n&&(!Number.isFinite(n.to)||n.to>t)?n:null},"clockNow",0,()=>v,"colourScheme",0,function(e,n,o,r){if("degree"===e)return{of:e=>F[Math.min(e.degree||1,3)],legend:[["1st",F[1]],["2nd",F[2]],["3rd+",F[3]]]};if("company"===e){let e=new Map;for(let t of n){let n=B(t.company);if(!n)continue;let o=e.get(n)||{name:String(t.company).trim(),n:0};o.n+=1,e.set(n,o)}let t=[...e.entries()].filter(([,e])=>e.n>1).sort((e,t)=>t[1].n-e[1].n).slice(0,I.length),o=new Map(t.map(([e],t)=>[e,I[t]]));return{of:e=>o.get(B(e.company))||z,legend:[...t.map(([,e],t)=>[e.name,I[t]]),["Other",z]]}}return"warmth"===e&&r?{of:e=>1===(e.degree||1)?M[i(r.merged.get((0,t.keyFor)(e)),r.asOf)]:"#2d3748",legend:[["Warm",M.warm],["Cool",M.cool],["Dormant",M.dormant],["Never messaged",M.never]]}:{of:e=>o[e.tier]||"#666",legend:Object.entries(o)}},"effectiveLab",0,e=>e.on?e:e.labels===c.labels?c:{...c,labels:e.labels},"findMatches",0,function(e,t){let n=String(t||"").trim().toLowerCase();if(n.length<2)return null;let o=new Set;for(let t of e)[t.name,t.company,t.role,t.headline].some(e=>e&&String(e).toLowerCase().includes(n))&&o.add(t.id);return o},"forgetLayout",0,function(e){b(x().filter(t=>t.name!==e))},"labNow",0,f,"layoutsNow",0,x,"loadSocial",0,function(){return C||(C=fetch("/api/social").then(e=>e.ok?e.json():{}).then(e=>{j({social:e.social?T(e.social):null})}).catch(()=>j({social:null}))),C},"mergeSocial",0,T,"milestones",0,function(e){let t=[];for(let n of e?.chapters||[])Number.isFinite(n.from)&&t.push({t:n.from,kind:"job",label:n.company});for(let n of e?.posts||[])Number.isFinite(n.t)&&t.push({t:n.t,kind:"post",label:"You posted"});return t.sort((e,t)=>e.t-t.t)},"pause",0,k,"play",0,function e(){if(null==v.min||null==v.max||v.max<=v.min)return;let t=v.max-v.min,n=1e3*Math.max(1,Number(f().speed)||15),o=null==v.at||v.at>=v.max?v.min:v.at,r=performance.now()-(o-v.min)/t*n;j({at:o,playing:!0});let s=o=>{let i=Math.min(v.max,v.min+(o-r)/n*t);if(j({at:i}),i>=v.max){S=null,j({playing:!1}),f().loop&&setTimeout(()=>{S||v.at!==v.max||(j({at:v.min}),e())},1200);return}S=requestAnimationFrame(s)};cancelAnimationFrame(S),S=requestAnimationFrame(s)},"reachCounts",0,function(e,t){let n=new Map(e.map(e=>[e.id,0]));for(let o of e){let e=t.get(o.id);for(let o=0;null!=e&&o<7;o++)n.set(e,(n.get(e)||0)+1),e=t.get(e)}return n},"saveLayout",0,function(e){let t=String(e||"").trim().slice(0,40);if(!t)return;let n=f(),o=Object.fromEntries(d.map(e=>[e,n[e]]));b([...x().filter(e=>e.name!==t),{name:t,settings:o}])},"setClock",0,j,"setLab",0,g,"stopReplay",0,function(){k(),j({at:null})},"watchClock",0,function(e){return w.add(e),()=>w.delete(e)},"watchLab",0,function(e){p.add(e);let t=t=>{t.key===l&&(h=null,e())};return window.addEventListener("storage",t),()=>{p.delete(e),window.removeEventListener("storage",t)}},"watchLayouts",0,function(e){return y.add(e),()=>y.delete(e)}],39160)},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let o=await n.json();return{degree1:o.degree1||[],degree2:o.degree2||[],degree3:o.degree3||[],ties:Number(o.ties)||0}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function o(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function r(e){return Math.round(10*o(e))/10}function s(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let i=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function l(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||o(t)-o(e)||String(e.name||"").localeCompare(String(t.name||""))||i(e.id,t.id)}function a(e,t){return e.bridge&&t.bridge?l(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:i(e.id,t.id)}function c(e,t){return t.score-e.score||t.waysIn-e.waysIn||a(e.routes[0]||d,t.routes[0]||d)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let d={id:null,bridge:null};function u(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function p(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,l,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||c(e,t)},"keyFor",0,s,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=s(n),o=t.get(e);o||(o=new Set,t.set(e,o)),o.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(s(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(a):[]},"score",0,o,"score1",0,r,"separationPeople",0,function(e=[],n=[]){let o=new Map;for(let e of n||[])o.set(e.id,e);let l=new Map,d=new Map;for(let n of e||[]){let e=s(n);d.set(n.id,e);let o=l.get(e);o?function(e,n){let o=r(e)-r(n);if(o)return o>0;let s=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==s?s:0>i(e.id,n.id)}(n,o.person)&&(o.person=n):(o={key:e,person:n,rowIds:[],routeIds:new Set},l.set(e,o)),o.rowIds.push(n.id),o.routeIds.add(n.source_connection_id??null)}let u={people:l.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},p=new Set,h=new Set,f=new Set,g=[];for(let e of l.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:o.get(e)??null}));t.sort(a);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?p:h).add(e.id);if(!n.length)for(let e of(u.peopleOnlyUnresolved++,t))f.add(e.id);let{person:s}=e,i=s.tier;void 0!==u.byTier[i]&&u.byTier[i]++,t.length>1&&u.multi++,g.push({key:e.key,person:s,score:r(s),tier:i,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[s.name,s.headline,s.company,s.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return u.bridges=p.size,u.unresolvedIds=h.size,u.onlyUnresolvedVia=f.size,g.sort(c),function(e){for(let t=0;t<e.length;t++){let n=e[t],o=e[t-1],r=o&&o.score===n.score&&o.waysIn===n.waysIn;n.rank=r?o.rank:t+1,r&&(n.tied=!0,o.tied=!0)}}(g),{people:g,rowToKey:d,summary:u}},"shortName",0,u,"summitLayout",0,function(e=[],t=800,n=!1){let o=n?36:26,r=Math.round(.42*t),s=Math.round(.58*t),i=e.map((e,n)=>{var r;return{key:e.key,p:e,x:s,y:16+n*o,r:(r=e.waysIn)>=4?8.5:3===r?7:2===r?5.5:4,label:p(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-s-60)/6.2))}}),a=new Map,c="\0unresolved";for(let e of i)for(let t of e.p.routes){let n=t.bridge?t.id:c,o=a.get(n);o||(o={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},a.set(n,o)),o.count++,o.ys.push(e.y)}let d=[...a.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));d.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?l(e.bridge,t.bridge):0));let h=i.length?i[i.length-1].y:16,f=d.length>1?Math.max(18,(h-16)/(d.length-1)):0,g=Math.max(4,Math.floor((r-10-42)/6));d.forEach((e,t)=>{if(e.x=r,e.y=1===d.length?(16+h)/2:16+t*f,e.r=5,e.unresolved)e.label=p(`can't be named (${e.count})`,g);else{let t=e.bridge.name||"";e.label=t.length<=g?t:p(u(t),g)}delete e.ys});let m=new Map(d.map(e=>[e.unresolved?c:e.id,e])),y=[];for(let e of i){let t=new Set;e.p.routes.forEach((n,o)=>{let r=n.bridge?n.id:c;if(t.has(r))return;t.add(r);let s=m.get(r);y.push({key:e.key,bridgeId:s.id,primary:0===o&&!s.unresolved,unresolved:s.unresolved,tier:s.bridge?.tier??null,x1:s.x,y1:s.y,x2:e.x,y2:e.y})})}let x=Math.max(h,d.length?d[d.length-1].y:0),b=i.length?Math.ceil(x+16):0,w={x:20,y:i.length?(16+Math.max(h,x))/2:16,r:14},v=d.map(e=>({id:e.id,x1:w.x,y1:w.y,x2:e.x,y2:e.y}));return{width:t,height:b,you:w,people:i,bridges:d,links:y,spokes:v}}])}]);
|