Skip to content

Commit 7cf9795

Browse files
committed
marketplace page
1 parent 49041bb commit 7cf9795

File tree

12 files changed

+188
-185
lines changed

12 files changed

+188
-185
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
### Added
55
- report link to CV nad JD
66
- JD page
7+
- marketplace coming soon page
8+
### Removed
9+
- career page
710
### Modified
811
- sidebar nested design
912

src/components/Features.astro

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ import { FEATURES } from "../constant";
1010
>
1111
Powerful Features
1212
</span>
13-
<h2 class="mb-6 text-gray-900">Everything You Need to Succeed</h2>
13+
<h2 class="mb-6 text-gray-900">Coming soon in 2026</h2>
1414
<p class="text-gray-600">
15-
Our comprehensive platform provides all the tools you need to manage,
16-
grow, and scale your business efficiently.
15+
Bounteer Marketplace provides is the ultimate place for job referrals.
1716
</p>
1817
</div>
1918

src/components/Footer.astro

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ const footerLinks = [
3636
// {
3737
// title: "Company",
3838
// links: [
39-
// { text: "About Bounteer", url: "/company" },
40-
// { text: "Careers", url: "/career" },
4139
// { text: "Contact", url: "/contact" },
4240
// { text: "Reviews", url: "/reviews" },
4341
// { text: "Privacy Policy", url: "/privacy-policy" },

src/components/Header.astro

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ const allPages = [
1212
{ text: "Integrations", url: "/integrations" },
1313
{ text: "Blog", url: "/blog" },
1414
{ text: "Case Studies", url: "/case-study" },
15-
{ text: "About Bounteer", url: "/company" },
1615
{ text: "Welcome", url: "/welcome" },
17-
{ text: "Careers", url: "/career" },
1816
{ text: "Role Fit Index", url: "/role-fit-index" },
1917
{ text: "Contact", url: "/contact" },
2018
{ text: "Reviews", url: "/reviews" },

src/components/Products.astro

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const stages = [
2323
stage: "Stage 2",
2424
title: "Bounteer Marketplace",
2525
subtitle: "Quality-first referral bounties with transparent payouts.",
26-
launchDate: "December 2025",
26+
launchDate: "2026",
2727
currentStage: "In Development",
2828
features: [
2929
"Post roles with tiered bounties & clear acceptance criteria",
@@ -33,8 +33,8 @@ const stages = [
3333
"Dashboard for pipeline, payouts, and ROI",
3434
"Optional escrow & milestone-based releases",
3535
],
36-
buttonLabel: "Coming Soon",
37-
buttonHref: "/contact",
36+
buttonLabel: "Coming Soon in 2026",
37+
buttonHref: "/marketplace",
3838
},
3939
];
4040
---
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import React, { useEffect, useState } from 'react';
2+
import { EXTERNAL } from '@/constant';
3+
import { getLoginUrl, getUserProfile } from '@/lib/utils';
4+
import { LogIn, EyeOff } from 'lucide-react';
5+
6+
interface LoginMaskProps {
7+
children: React.ReactNode;
8+
blurContent?: boolean;
9+
}
10+
11+
export default function LoginMask({ children, blurContent = true }: LoginMaskProps) {
12+
const [isAuthenticated, setIsAuthenticated] = useState<boolean | null>(null);
13+
14+
useEffect(() => {
15+
async function checkAuth() {
16+
const profile = await getUserProfile(EXTERNAL.directus_url);
17+
setIsAuthenticated(!!profile);
18+
}
19+
checkAuth();
20+
}, []);
21+
22+
const handleLogin = () => {
23+
const nextPath = window.location.pathname + window.location.search;
24+
window.location.href = getLoginUrl(EXTERNAL.directus_url, EXTERNAL.auth_idp_key, encodeURIComponent(nextPath));
25+
};
26+
27+
// Show loading while checking auth
28+
if (isAuthenticated === null) {
29+
return (
30+
<div className="animate-pulse">
31+
<div className="h-20 bg-gray-200 rounded"></div>
32+
</div>
33+
);
34+
}
35+
36+
// Show content if authenticated
37+
if (isAuthenticated) {
38+
return <>{children}</>;
39+
}
40+
41+
// Show login prompt instead of content
42+
return (
43+
<div className="flex flex-col items-center justify-center py-6 px-4 bg-white/80 backdrop-blur-sm rounded-lg border border-gray-200">
44+
<div className="mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-3">
45+
<EyeOff className="w-6 h-6 text-primary" />
46+
</div>
47+
<h3 className="text-base font-semibold text-gray-900 mb-1">
48+
Login Required to view
49+
</h3>
50+
<button
51+
onClick={handleLogin}
52+
className="inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors"
53+
>
54+
<LogIn className="w-3 h-3" />
55+
Login to View
56+
</button>
57+
</div>
58+
);
59+
}

src/components/interactive/ReportCard.tsx

Lines changed: 76 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
55
import { Progress } from "@/components/ui/progress";
66
import { Check, X } from "lucide-react";
77
import { EXTERNAL } from '@/constant';
8+
import LoginMask from './LoginMask';
89

910
type Report = {
1011
id: string;
@@ -65,7 +66,7 @@ export default function ReportCard() {
6566
const fileInfoRes = await fetch(`${EXTERNAL.directus_url}/files/${fileId}`, {
6667
headers: { Authorization: `Bearer ${EXTERNAL.directus_key}` },
6768
});
68-
69+
6970
let filename = 'cv.pdf';
7071
if (fileInfoRes.ok) {
7172
const fileInfo = await fileInfoRes.json();
@@ -76,21 +77,21 @@ export default function ReportCard() {
7677
const fileRes = await fetch(`${EXTERNAL.directus_url}/assets/${fileId}`, {
7778
headers: { Authorization: `Bearer ${EXTERNAL.directus_key}` },
7879
});
79-
80+
8081
if (!fileRes.ok) {
8182
throw new Error('Failed to download CV');
8283
}
8384

8485
// Create blob and download
8586
const blob = await fileRes.blob();
8687
const url = window.URL.createObjectURL(blob);
87-
88+
8889
const link = document.createElement('a');
8990
link.href = url;
9091
link.download = filename;
9192
document.body.appendChild(link);
9293
link.click();
93-
94+
9495
// Cleanup
9596
document.body.removeChild(link);
9697
window.URL.revokeObjectURL(url);
@@ -302,6 +303,8 @@ export default function ReportCard() {
302303
{/* Concern Tags */}
303304
<div>
304305
<h2 className="text-lg font-semibold mb-2">Concern Tags</h2>
306+
<LoginMask>
307+
305308
<div className="flex flex-wrap gap-2">
306309
{report.concern_tags?.length ? (
307310
report.concern_tags.map((tag, i) => (
@@ -316,86 +319,96 @@ export default function ReportCard() {
316319
<span className="text-gray-500 text-sm">None.</span>
317320
)}
318321
</div>
322+
</LoginMask>
323+
319324
</div>
320325

321326
{/* Pros */}
322327
<div>
323328
<h2 className="text-lg font-semibold mb-2">Pros</h2>
324-
<ul className="space-y-1">
325-
{prosList.length ? (
326-
prosList.map((p, i) => (
327-
<li
328-
key={i}
329-
className="flex items-start gap-2 text-gray-800 break-words"
330-
>
331-
<Check className="h-4 w-4 text-green-600 mt-0.5" />
332-
{p}
333-
</li>
334-
))
335-
) : (
336-
<li className="text-gray-500">No pros listed.</li>
337-
)}
338-
</ul>
329+
<LoginMask>
330+
<ul className="space-y-1">
331+
{prosList.length ? (
332+
prosList.map((p, i) => (
333+
<li
334+
key={i}
335+
className="flex items-start gap-2 text-gray-800 break-words"
336+
>
337+
<Check className="h-4 w-4 text-green-600 mt-0.5" />
338+
{p}
339+
</li>
340+
))
341+
) : (
342+
<li className="text-gray-500">No pros listed.</li>
343+
)}
344+
</ul>
345+
</LoginMask>
339346
</div>
340347

341348
{/* Cons */}
342349
<div>
343350
<h2 className="text-lg font-semibold mb-2">Cons</h2>
344-
<ul className="space-y-1">
345-
{consList.length ? (
346-
consList.map((c, i) => (
347-
<li
348-
key={i}
349-
className="flex items-start gap-2 text-gray-800 break-words"
350-
>
351-
<X className="h-4 w-4 text-red-600 mt-0.5" />
352-
{c}
353-
</li>
354-
))
355-
) : (
356-
<li className="text-gray-500">No advice listed.</li>
357-
)}
358-
</ul>
351+
<LoginMask>
352+
<ul className="space-y-1">
353+
{consList.length ? (
354+
consList.map((c, i) => (
355+
<li
356+
key={i}
357+
className="flex items-start gap-2 text-gray-800 break-words"
358+
>
359+
<X className="h-4 w-4 text-red-600 mt-0.5" />
360+
{c}
361+
</li>
362+
))
363+
) : (
364+
<li className="text-gray-500">No advice listed.</li>
365+
)}
366+
</ul>
367+
</LoginMask>
359368
</div>
360369

361370
{/* Hiring Advices */}
362371
<div>
363372
<h2 className="text-lg font-semibold mb-2">Hiring Advices</h2>
364-
<ul className="space-y-1">
365-
{hiring_advices.length ? (
366-
hiring_advices.map((c, i) => (
367-
<li
368-
key={i}
369-
className="flex items-start gap-2 text-gray-800 break-words"
370-
>
371-
- {c}
372-
</li>
373-
))
374-
) : (
375-
<li className="text-gray-500">No advice listed.</li>
376-
)}
377-
</ul>
373+
<LoginMask>
374+
<ul className="space-y-1">
375+
{hiring_advices.length ? (
376+
hiring_advices.map((c, i) => (
377+
<li
378+
key={i}
379+
className="flex items-start gap-2 text-gray-800 break-words"
380+
>
381+
- {c}
382+
</li>
383+
))
384+
) : (
385+
<li className="text-gray-500">No advice listed.</li>
386+
)}
387+
</ul>
388+
</LoginMask>
378389
</div>
379390

380391
{/* Candidate Advices */}
381392
<div>
382393
<h2 className="text-lg font-semibold mb-2">Candidate Advices</h2>
383-
<ul className="space-y-1">
384-
{candidate_advices.length ? (
385-
candidate_advices.map((c, i) => (
386-
<li
387-
key={i}
388-
className="flex items-start gap-2 text-gray-800 break-words"
389-
>
390-
- {c}
391-
</li>
392-
))
393-
) : (
394-
<li className="text-gray-500">No advice listed.</li>
395-
)}
396-
</ul>
394+
<LoginMask>
395+
<ul className="space-y-1">
396+
{candidate_advices.length ? (
397+
candidate_advices.map((c, i) => (
398+
<li
399+
key={i}
400+
className="flex items-start gap-2 text-gray-800 break-words"
401+
>
402+
- {c}
403+
</li>
404+
))
405+
) : (
406+
<li className="text-gray-500">No advice listed.</li>
407+
)}
408+
</ul>
409+
</LoginMask>
397410
</div>
398411
</CardContent>
399-
</Card>
412+
</Card >
400413
);
401414
}

src/constant.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -68,44 +68,45 @@ export const JON_QUIRKS = [
6868

6969
export const FEATURES = [
7070
{
71-
title: "10M+ Mailing List",
71+
title: "Earn Bounties by Referral",
7272
description:
73-
"Readily reach out to our 10M+ existing B2B/B2C leads tagged by their interests.",
73+
"Recommend great candidates and earn bounty rewards when they get hired — simple, transparent, and merit-based.",
7474
icon: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z",
7575
color: "accent",
7676
},
7777
{
78-
title: "Agentic Writers",
79-
description:
80-
"Targeted personal email generated by LLMs for the right audience with tagging system and feedback loop.",
81-
icon: "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z",
78+
title: "Build Referrer Reputation",
79+
description:
80+
"Showcase successful referrals and grow a trusted profile. Your track record travels with you across roles and companies.",
81+
icon: "M3 3v18h18V3H3zm4 14l3-3 2 2 5-5 3 3",
8282
color: "accent",
8383
},
8484
{
85-
title: "Brand Recognition",
86-
description:
87-
"Perfectly align brand image and prevent emails getting into spam box.",
88-
icon: "M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2",
85+
title: "Smart Ranking (Powered by RFI)",
86+
description:
87+
"Applicants are ranked using Bounteer’s Role Fit Index (RFI) so employers see stronger shortlists — and referrers know who to recommend first.",
88+
icon: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15",
8989
color: "accent",
9090
},
9191
{
92-
title: "Feedback loops",
93-
description:
94-
"Save time and reduce errors with our ambient agent that automatically test and improve marketing contents.",
95-
icon: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15",
92+
title: "Clear Bounty Details",
93+
description:
94+
"See payout amounts, eligibility criteria, and verification steps upfront. No guesswork — just clear, public terms.",
95+
icon: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z",
9696
color: "accent",
9797
},
9898
{
99-
title: "Secure Data Storage",
100-
description:
101-
"Keep your sensitive information protected with enterprise-grade security and compliance features.",
102-
icon: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z",
99+
title: "End-to-End Referral Tracking",
100+
description:
101+
"Share unique links and follow status from invite to offer, with timely updates so you always know where things stand.",
102+
icon: "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z",
103103
color: "accent",
104104
},
105105
{
106-
title: "Social Analytics",
107-
description: "Discover potential market trends using our social analytics",
106+
title: "Global Roles, Remote-Friendly",
107+
description:
108+
"Discover bounties from startups and scale-ups worldwide — remote and on-site — and match them to your network.",
108109
icon: "M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z",
109110
color: "accent",
110111
},
111-
];
112+
];

0 commit comments

Comments
 (0)