Skip to content

Commit 8e03d0a

Browse files
authored
Merge pull request #1034 from trycompai/mariano/comp-229-dub-affiliates
[dev] [Marfuen] mariano/comp-229-dub-affiliates
2 parents b240888 + fb219f2 commit 8e03d0a

File tree

4 files changed

+42
-119
lines changed

4 files changed

+42
-119
lines changed

apps/app/src/app/(app)/[orgId]/referrals/components/DubReferral.tsx

Lines changed: 3 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,24 @@
11
'use client';
22

3-
import { Skeleton } from '@comp/ui/skeleton';
43
import { DubEmbed } from '@dub/embed-react';
5-
import { useTheme } from 'next-themes';
6-
import { useEffect, useState } from 'react';
7-
8-
export const DubReferral = () => {
9-
const [publicToken, setPublicToken] = useState('');
10-
const [error, setError] = useState<string | null>(null);
11-
const [isLoading, setIsLoading] = useState(true);
12-
const { theme } = useTheme();
13-
14-
useEffect(() => {
15-
const fetchPublicToken = async () => {
16-
try {
17-
setIsLoading(true);
18-
setError(null);
19-
20-
const response = await fetch('/api/dub/embed-token');
21-
22-
if (!response.ok) {
23-
throw new Error(`Failed to fetch token: ${response.status} ${response.statusText}`);
24-
}
25-
26-
const data = await response.json();
27-
28-
if (!data.publicToken) {
29-
throw new Error('No public token received from server');
30-
}
31-
32-
setPublicToken(data.publicToken);
33-
} catch (err) {
34-
console.error('Error fetching public token:', err);
35-
setError(err instanceof Error ? err.message : 'An unexpected error occurred');
36-
} finally {
37-
setIsLoading(false);
38-
}
39-
};
40-
41-
fetchPublicToken();
42-
}, []);
43-
44-
if (isLoading) {
45-
return (
46-
<div className="flex items-center justify-center">
47-
<Skeleton className="h-[100vh] w-full max-w-[1024px] rounded-none" />
48-
</div>
49-
);
50-
}
51-
52-
if (error) {
53-
return (
54-
<div className="flex min-h-[400px] items-center justify-center">
55-
<div className="w-full max-w-md rounded-md border border-destructive/50 bg-destructive/10 p-6 text-center">
56-
<h3 className="mb-2 text-sm font-medium text-destructive">Oops, something went wrong</h3>
57-
<p className="text-xs text-destructive/80">{error}</p>
58-
<p className="mt-4 text-xs text-muted-foreground">
59-
Please refresh the page and try again. If the problem persists,{' '}
60-
<a
61-
href="https://discord.gg/compai"
62-
target="_blank"
63-
rel="noopener noreferrer"
64-
className="underline underline-offset-2 hover:text-foreground transition-colors"
65-
>
66-
contact us
67-
</a>
68-
.
69-
</p>
70-
</div>
71-
</div>
72-
);
73-
}
744

5+
export const DubReferral = ({ publicToken }: { publicToken: string | null }) => {
756
if (!publicToken) {
767
return (
77-
<div className="rounded-md border border-muted bg-muted/50 p-4">
8+
<div className="flex min-h-[400px] items-center justify-center">
789
<p className="text-sm text-muted-foreground">
7910
No token available. Please try refreshing the page.
8011
</p>
8112
</div>
8213
);
8314
}
8415

85-
const dubTheme = theme === 'dark' ? 'dark' : 'light';
86-
8716
return (
8817
<DubEmbed
8918
data="referrals"
9019
token={publicToken}
9120
options={{
92-
theme: dubTheme,
21+
theme: 'system',
9322
}}
9423
/>
9524
);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { env } from '@/env.mjs';
2+
import { Dub } from 'dub';
3+
4+
export const dub = new Dub({
5+
token: env.DUB_API_KEY,
6+
});
Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
1+
import { env } from '@/env.mjs';
2+
import { auth } from '@/utils/auth';
3+
import { headers } from 'next/headers';
4+
import { redirect } from 'next/navigation';
15
import { DubReferral } from './components/DubReferral';
6+
import { dub } from './lib/dub';
27

3-
export default function ReferralsPage() {
4-
return <DubReferral />;
8+
export default async function ReferralsPage() {
9+
const publicToken = await createPublicToken();
10+
11+
return <DubReferral publicToken={publicToken} />;
12+
}
13+
14+
async function createPublicToken() {
15+
const session = await auth.api.getSession({ headers: await headers() });
16+
17+
if (!session) {
18+
redirect('/');
19+
}
20+
21+
if (!env.DUB_PROGRAM_ID || !env.DUB_API_KEY) {
22+
return null;
23+
}
24+
25+
const { publicToken } = await dub.embedTokens.referrals({
26+
programId: env.DUB_PROGRAM_ID,
27+
partner: {
28+
tenantId: session.user.id,
29+
name: session.user.name || '',
30+
email: session.user.email || '',
31+
image: session.user.image || '',
32+
},
33+
});
34+
35+
return publicToken;
536
}

apps/app/src/app/api/dub/embed-token/route.ts

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)