Skip to content

Commit 64554af

Browse files
dancerizadoesdev
andauthored
feat(integration): vercel dashboard/databuddy integration route.ts (#138)
* feat(integration): vercel dashboard/databuddy integration route.ts * x * fix: formutted * fix: vercel integration * x * fix: smoother onboarding * cleanup: UI --------- Co-authored-by: Hyteq <[email protected]>
1 parent 758798b commit 64554af

File tree

7 files changed

+216
-710
lines changed

7 files changed

+216
-710
lines changed

.github/workflows/osv-scanner.yml

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

apps/dashboard/app/(auth)/login/page.tsx

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,43 +27,34 @@ function LoginPage() {
2727
const [showPassword, setShowPassword] = useState(false);
2828
const [lastUsed, setLastUsed] = useState<string | null>(null);
2929

30-
const callbackUrl = searchParams.get('callback') || '/websites';
30+
const defaultCallbackUrl = searchParams.get('callback') || '/websites';
3131

3232
useEffect(() => {
3333
setLastUsed(localStorage.getItem('lastUsedLogin'));
3434
}, []);
3535

36-
const handleGoogleLogin = () => {
36+
const handleSocialLogin = (provider: 'github' | 'google') => {
3737
setIsLoading(true);
38-
signIn.social({
39-
provider: 'google',
40-
callbackURL: callbackUrl,
41-
newUserCallbackURL: '/onboarding',
42-
fetchOptions: {
43-
onSuccess: () => {
44-
localStorage.setItem('lastUsedLogin', 'google');
45-
},
46-
onError: () => {
47-
setIsLoading(false);
48-
toast.error('Google login failed. Please try again.');
49-
},
50-
},
51-
});
52-
};
5338

54-
const handleGithubLogin = () => {
55-
setIsLoading(true);
39+
const callbackUrl = searchParams.get('callback');
40+
const finalCallbackUrl = callbackUrl || defaultCallbackUrl;
41+
5642
signIn.social({
57-
provider: 'github',
58-
callbackURL: callbackUrl,
43+
provider,
44+
callbackURL: finalCallbackUrl,
5945
newUserCallbackURL: '/onboarding',
6046
fetchOptions: {
6147
onSuccess: () => {
62-
localStorage.setItem('lastUsedLogin', 'github');
48+
localStorage.setItem('lastUsedLogin', provider);
49+
if (callbackUrl) {
50+
router.push(callbackUrl);
51+
}
6352
},
6453
onError: () => {
6554
setIsLoading(false);
66-
toast.error('GitHub login failed. Please try again.');
55+
toast.error(
56+
`${provider === 'github' ? 'GitHub' : 'Google'} login failed. Please try again.`
57+
);
6758
},
6859
},
6960
});
@@ -81,10 +72,14 @@ function LoginPage() {
8172
await signIn.email({
8273
email,
8374
password,
84-
callbackURL: callbackUrl,
75+
callbackURL: defaultCallbackUrl,
8576
fetchOptions: {
8677
onSuccess: () => {
8778
localStorage.setItem('lastUsedLogin', 'email');
79+
const callbackUrl = searchParams.get('callback');
80+
if (callbackUrl) {
81+
router.push(callbackUrl);
82+
}
8883
},
8984
onError: (error) => {
9085
setIsLoading(false);
@@ -125,7 +120,7 @@ function LoginPage() {
125120
<Button
126121
className="relative flex h-11 w-full cursor-pointer items-center justify-center transition-all duration-200 hover:bg-primary/5"
127122
disabled={isLoading}
128-
onClick={handleGithubLogin}
123+
onClick={() => handleSocialLogin('github')}
129124
type="button"
130125
variant="outline"
131126
>
@@ -140,7 +135,7 @@ function LoginPage() {
140135
<Button
141136
className="relative flex h-11 w-full cursor-pointer items-center justify-center transition-all duration-200 hover:bg-primary/5"
142137
disabled={isLoading}
143-
onClick={handleGoogleLogin}
138+
onClick={() => handleSocialLogin('google')}
144139
type="button"
145140
variant="outline"
146141
>

apps/dashboard/app/(auth)/register/page.tsx

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ function RegisterPageContent() {
3333
const router = useRouter();
3434
const searchParams = useSearchParams();
3535
const selectedPlan = searchParams.get('plan');
36+
const callbackUrl = searchParams.get('callback');
3637
const [isLoading, setIsLoading] = useState(false);
3738
const [formData, setFormData] = useState({
3839
name: '',
@@ -53,6 +54,18 @@ function RegisterPageContent() {
5354
setFormData((prev) => ({ ...prev, [name]: value }));
5455
};
5556

57+
const handleAuthSuccess = () => {
58+
if (callbackUrl) {
59+
toast.success('Account created! Completing integration...');
60+
router.push(callbackUrl);
61+
} else if (selectedPlan) {
62+
localStorage.setItem('pendingPlanSelection', selectedPlan);
63+
router.push(`/billing?tab=plans&plan=${selectedPlan}`);
64+
} else {
65+
router.push('/websites');
66+
}
67+
};
68+
5669
const handleSubmit = async (e: React.FormEvent) => {
5770
e.preventDefault();
5871

@@ -78,21 +91,18 @@ function RegisterPageContent() {
7891
password: formData.password,
7992
name: formData.name,
8093
fetchOptions: {
81-
onSuccess: (ctx) => {
82-
const authToken = ctx.response.headers.get('set-auth-token');
83-
if (authToken) {
84-
localStorage.setItem('authToken', authToken);
85-
}
86-
toast.success(
87-
'Account created! Please check your email to verify your account.'
88-
);
89-
setRegistrationStep('verification-needed');
90-
91-
// Store plan selection for post-verification redirect
92-
if (selectedPlan) {
93-
localStorage.setItem('pendingPlanSelection', selectedPlan);
94+
onSuccess: () => {
95+
if (callbackUrl) {
96+
handleAuthSuccess();
97+
} else {
98+
toast.success(
99+
'Account created! Please check your email to verify your account.'
100+
);
101+
setRegistrationStep('verification-needed');
102+
if (selectedPlan) {
103+
localStorage.setItem('pendingPlanSelection', selectedPlan);
104+
}
94105
}
95-
// router.push(`/verify?email=${encodeURIComponent(formData.email)}`);
96106
},
97107
},
98108
});
@@ -128,31 +138,27 @@ function RegisterPageContent() {
128138
const handleSocialLogin = async (provider: 'github' | 'google') => {
129139
setIsLoading(true);
130140

131-
await authClient.signIn.social({
132-
provider,
133-
fetchOptions: {
134-
onSuccess: (ctx) => {
135-
const authToken = ctx.response.headers.get('set-auth-token');
136-
if (authToken) {
137-
localStorage.setItem('authToken', authToken);
138-
}
139-
toast.success('Registration successful!');
140-
141-
// Redirect to billing with plan selection if plan was specified
142-
if (selectedPlan) {
143-
localStorage.setItem('pendingPlanSelection', selectedPlan);
144-
router.push(`/billing?tab=plans&plan=${selectedPlan}`);
145-
} else {
146-
router.push('/home');
147-
}
148-
},
149-
onError: () => {
150-
toast.error('Login failed. Please try again.');
141+
try {
142+
await authClient.signIn.social({
143+
provider,
144+
callbackURL: callbackUrl || '/websites',
145+
fetchOptions: {
146+
onSuccess: () => {
147+
toast.success('Registration successful!');
148+
handleAuthSuccess();
149+
},
150+
onError: () => {
151+
toast.error(
152+
`${provider === 'github' ? 'GitHub' : 'Google'} login failed. Please try again.`
153+
);
154+
setIsLoading(false);
155+
},
151156
},
152-
},
153-
});
154-
155-
setIsLoading(false);
157+
});
158+
} catch (error) {
159+
toast.error('Login failed. Please try again.');
160+
setIsLoading(false);
161+
}
156162
};
157163

158164
// Render header content based on current registration step
@@ -549,7 +555,11 @@ function RegisterPageContent() {
549555
Already have an account?{' '}
550556
<Link
551557
className="font-medium text-primary hover:text-primary/80"
552-
href="/login"
558+
href={
559+
callbackUrl
560+
? `/login?callback=${encodeURIComponent(callbackUrl)}`
561+
: '/login'
562+
}
553563
>
554564
Sign in
555565
</Link>

0 commit comments

Comments
 (0)