1import{j as e,L as p,e as u,r as c}from"./vendor-react-Dqm4a0k5.js";import{S as x,b}from"./index-BR-ShKyk.js";import{L as g,e as h,s as v}from"./vendor-icons-Dv6Y7wXg.js";const f="Related-guide links rendered on the three hubs by BOTH src/components/seo/HubRelatedGuides.tsx and scripts/prerender-seo.mjs (relatedGuidesHtml). Added 2026-09-15: these targets were live and in the sitemap but Google had never crawled them â most had no internal link from an indexed page. Every /blog target must be status=published (the prerender drops unpublished ones via blogLinkIsLive; the test pins the list).",k={heading:"More lifetime deal guides",links:[{to:"/blog/appsumo-ai-tools",text:"AppSumo AI tools: 5 AI lifetime deals verified live"},{to:"/blog/thrivecart-lifetime-deal",text:"ThriveCart lifetime deal: still sold direct"},{to:"/blog/optiontics-lifetime-deal",text:"Optiontics lifetime deal: alive, sold direct"},{to:"/blog/is-uniscribe-still-alive",text:"Is UniScribe still alive?"},{to:"/blog/is-socialbee-still-alive",text:"Is SocialBee still alive?"},{to:"/blog/is-streamyard-still-alive",text:"Is StreamYard still alive?"},{to:"/blog/is-depositphotos-still-alive",text:"Is Depositphotos still alive?"},{to:"/blog/best-grammarly-alternatives-2026",text:"Grammarly alternatives with buy-once plans"},{to:"/blog/best-loom-alternatives-2026",text:"Loom alternatives with buy-once plans"},{to:"/demo",text:"Interactive DealKeep demo"}]},S={heading:"Marketplace and tracker comparisons",links:[{to:"/blog/appsumo-vs-stacksocial-2026",text:"AppSumo vs StackSocial"},{to:"/compare/dealkeep-vs-grabltd",text:"DealKeep vs GrabLTD"},{to:"/compare/dealkeep-vs-trackallsubs",text:"DealKeep vs TrackAllSubs"},{to:"/compare/dealkeep-vs-trackmysubs",text:"DealKeep vs TrackMySubs"},{to:"/compare/dealkeep-vs-notion-template",text:"DealKeep vs a Notion template"},{to:"/blog/rocket-money-alternatives",text:"Rocket Money alternatives"},{to:"/blog/saas-spend-management",text:"SaaS spend management: cut wasted software spend"},{to:"/blog/trueranker-lifetime-deal",text:"TrueRanker lifetime deal: still honoured?"}]},j={heading:"Comparisons and tools",links:[{to:"/compare/dealkeep-vs-grabltd",text:"DealKeep vs GrabLTD"},{to:"/compare/dealkeep-vs-trackallsubs",text:"DealKeep vs TrackAllSubs"},{to:"/compare/dealkeep-vs-trackmysubs",text:"DealKeep vs TrackMySubs"},{to:"/compare/dealkeep-vs-notion-template",text:"DealKeep vs a Notion template"},{to:"/alternatives/dealmirror-alternative",text:"DealMirror deal tracker"},{to:"/alternatives/mightydeals-alternative",text:"MightyDeals alternative"},{to:"/demo",text:"Interactive DealKeep demo"}]},y={_note:f,pillar:k,alternatives:S,blog:j};function K({hub:t,className:l}){const{heading:a,links:o}=y[t],r=`related-guides-${t}`;return e.jsxs("section",{"aria-labelledby":r,className:l,children:[e.jsx("h2",{id:r,className:"text-xl sm:text-2xl font-semibold tracking-tight mb-4",children:a}),e.jsx("ul",{className:"grid gap-2 sm:grid-cols-2 text-[15px]",children:o.map(s=>e.jsx("li",{children:e.jsx(p,{to:s.to,className:"text-primary underline underline-offset-2 hover:text-primary/80",children:s.text})},s.to))})]})}function N(){const[t]=u(),[l,a]=c.useState("loading"),[o,r]=c.useState("");return c.useEffect(()=>{const s=t.get("email"),d=t.get("campaign"),n=t.get("token");if(!s&&!n){a("error"),r("Missing unsubscribe parameters.");return}const i=new URLSearchParams;n&&i.set("token",n),s&&i.set("email",s),d&&i.set("campaign",d),fetch(`${x}/functions/v1/unsubscribe-from-campaign?${i.toString()}`,{headers:{apikey:b}}).then(m=>{m.ok?a("success"):(a("error"),r("Failed to process unsubscribe request."))}).catch(()=>{a("error"),r("Network error. Please try again.")})},[t]),e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-background p-6",children:e.jsxs("div",{className:"text-center max-w-md",children:[l==="loading"&&e.jsxs(e.Fragment,{children:[e.jsx(g,{className:"h-10 w-10 animate-spin text-teal-500 mx-auto mb-4"}),e.jsx("p",{className:"text-muted-foreground",children:"Processing your unsubscribe request..."})]}),l==="success"&&e.jsxs(e.Fragment,{children:[e.jsx(h,{className:"h-12 w-12 text-teal-500 mx-auto mb-4"}),e.jsx("h2",{className:"text-2xl font-bold mb-2",children:"You've been unsubscribed"}),e.jsx("p",{className:"text-muted-foreground mb-6",children:"You will no longer receive campaign emails from DealKeep."}
1),e.jsx("a",{href:"/app/settings?section=notifications",className:"text-teal-500 underline underline-offset-4 text-sm",children:"Manage your notification preferences"})]}),l==="error"&&e.jsxs(e.Fragment,{children:[e.jsx(v,{className:"h-12 w-12 text-red-500 mx-auto mb-4"}),e.jsx("h2",{className:"text-2xl font-bold mb-2",children:"Something went wrong"}),e.jsx("p",{className:"text-muted-foreground mb-6",children:o}),e.jsx("a",{href:"mailto:[email protected]",className:"text-teal-500 underline underline-offset-4 text-sm",children:"Contact support"})]})]})})}const M=Object.freeze(Object.defineProperty({__proto__:null,default:N},Symbol.toStringTag,{value:"Module"}));export{K as H,M as U};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.