Skip to content

Commit bbb711e

Browse files
committed
fix: auth
1 parent ce231ee commit bbb711e

File tree

4 files changed

+120
-44
lines changed

4 files changed

+120
-44
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { authClient } from "@databuddy/auth/client";
44
import { ArrowLeftIcon, SparkleIcon, SpinnerIcon } from "@phosphor-icons/react";
55
import Link from "next/link";
66
import { useRouter } from "next/navigation";
7+
import { parseAsString, useQueryState } from "nuqs";
78
import { Suspense, useState } from "react";
89
import { toast } from "sonner";
910
import { Button } from "@/components/ui/button";
@@ -12,6 +13,10 @@ import { Label } from "@/components/ui/label";
1213

1314
function MagicLinkPage() {
1415
const router = useRouter();
16+
const [callback] = useQueryState(
17+
"callback",
18+
parseAsString.withDefault("/websites")
19+
);
1520
const [email, setEmail] = useState("");
1621
const [isLoading, setIsLoading] = useState(false);
1722

@@ -25,7 +30,7 @@ function MagicLinkPage() {
2530

2631
await authClient.signIn.magicLink({
2732
email,
28-
callbackURL: "/home",
33+
callbackURL: callback,
2934
fetchOptions: {
3035
onSuccess: () => {
3136
setIsLoading(false);

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

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,16 @@ function LoginPage() {
3131
const [password, setPassword] = useState("");
3232
const [showPassword, setShowPassword] = useState(false);
3333

34-
const defaultCallbackUrl = callback;
3534
const lastUsed = authClient.getLastUsedLoginMethod();
3635

3736
const handleSocialLogin = async (provider: "github" | "google") => {
3837
setIsLoading(true);
3938

40-
const callbackUrl = callback;
41-
const finalCallbackUrl = callbackUrl || defaultCallbackUrl;
42-
4339
await authClient.signIn.social({
4440
provider,
45-
callbackURL: finalCallbackUrl,
41+
callbackURL: callback,
4642
newUserCallbackURL: "/onboarding",
4743
fetchOptions: {
48-
onSuccess: () => {
49-
if (callbackUrl) {
50-
router.push(callbackUrl);
51-
}
52-
},
5344
onError: () => {
5445
setIsLoading(false);
5546
toast.error(
@@ -72,7 +63,7 @@ function LoginPage() {
7263
await authClient.signIn.email({
7364
email,
7465
password,
75-
callbackURL: defaultCallbackUrl,
66+
callbackURL: callback,
7667
fetchOptions: {
7768
onError: (error) => {
7869
setIsLoading(false);

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

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ import VisuallyHidden from "@/components/ui/visuallyhidden";
3232
function RegisterPageContent() {
3333
const router = useRouter();
3434
const [selectedPlan] = useQueryState("plan", parseAsString);
35-
const [callbackUrl] = useQueryState("callback", parseAsString);
35+
const [callback] = useQueryState(
36+
"callback",
37+
parseAsString.withDefault("/websites")
38+
);
3639
const [isLoading, setIsLoading] = useState(false);
3740
const [formData, setFormData] = useState({
3841
name: "",
@@ -67,16 +70,12 @@ function RegisterPageContent() {
6770
}
6871
};
6972

70-
const handleAuthSuccess = () => {
71-
if (callbackUrl) {
72-
toast.success("Account created! Completing integration...");
73-
router.push(callbackUrl);
74-
} else if (selectedPlan) {
73+
const getCallbackUrl = () => {
74+
if (selectedPlan) {
7575
localStorage.setItem("pendingPlanSelection", selectedPlan);
76-
router.push(`/billing?tab=plans&plan=${selectedPlan}`);
77-
} else {
78-
router.push("/websites");
76+
return `/billing?tab=plans&plan=${selectedPlan}`;
7977
}
78+
return callback;
8079
};
8180

8281
const handleSubmit = async (e: React.FormEvent) => {
@@ -103,19 +102,16 @@ function RegisterPageContent() {
103102
email: formData.email,
104103
password: formData.password,
105104
name: formData.name,
105+
callbackURL: getCallbackUrl(),
106106
fetchOptions: {
107107
onSuccess: () => {
108108
trackSignUp("email");
109-
if (callbackUrl) {
110-
handleAuthSuccess();
111-
} else {
112-
toast.success(
113-
"Account created! Please check your email to verify your account."
114-
);
115-
setRegistrationStep("verification-needed");
116-
if (selectedPlan) {
117-
localStorage.setItem("pendingPlanSelection", selectedPlan);
118-
}
109+
toast.success(
110+
"Account created! Please check your email to verify your account."
111+
);
112+
setRegistrationStep("verification-needed");
113+
if (selectedPlan) {
114+
localStorage.setItem("pendingPlanSelection", selectedPlan);
119115
}
120116
},
121117
},
@@ -155,12 +151,11 @@ function RegisterPageContent() {
155151
try {
156152
await authClient.signIn.social({
157153
provider,
158-
callbackURL: callbackUrl || "/websites",
154+
callbackURL: getCallbackUrl(),
155+
newUserCallbackURL: "/onboarding",
159156
fetchOptions: {
160157
onSuccess: () => {
161158
trackSignUp("social", provider);
162-
toast.success("Registration successful!");
163-
handleAuthSuccess();
164159
},
165160
onError: () => {
166161
toast.error(
@@ -538,16 +533,16 @@ function RegisterPageContent() {
538533
<div className="mt-4 text-center">
539534
<p className="text-muted-foreground text-sm">
540535
Already have an account?{" "}
541-
<Link
542-
className="h-auto flex-1 cursor-pointer p-0 text-right font-medium text-[13px] text-accent-foreground duration-200 hover:text-accent-foreground/60"
543-
href={
544-
callbackUrl
545-
? `/login?callback=${encodeURIComponent(callbackUrl)}`
546-
: "/login"
547-
}
548-
>
549-
Sign in
550-
</Link>
536+
<Link
537+
className="h-auto flex-1 cursor-pointer p-0 text-right font-medium text-[13px] text-accent-foreground duration-200 hover:text-accent-foreground/60"
538+
href={
539+
callback
540+
? `/login?callback=${encodeURIComponent(callback)}`
541+
: "/login"
542+
}
543+
>
544+
Sign in
545+
</Link>
551546
</p>
552547
</div>
553548
)}

update-mmdb.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import chalk from "chalk";
2+
3+
const STORAGE_ZONE_NAME = process.env.BUNNY_STORAGE_ZONE_NAME;
4+
const ACCESS_KEY = process.env.BUNNY_STORAGE_ACCESS_KEY;
5+
const REGION = process.env.BUNNY_STORAGE_REGION || "";
6+
7+
if (!STORAGE_ZONE_NAME) {
8+
console.error(chalk.red("❌ Missing BUNNY_STORAGE_ZONE_NAME env var"));
9+
process.exit(1);
10+
}
11+
12+
if (!ACCESS_KEY) {
13+
console.error(chalk.red("❌ Missing BUNNY_STORAGE_ACCESS_KEY env var"));
14+
process.exit(1);
15+
}
16+
17+
const BASE_URL = REGION
18+
? `https://${REGION}.storage.bunnycdn.com`
19+
: "https://storage.bunnycdn.com";
20+
21+
const SOURCE_URL =
22+
"https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb";
23+
const FILENAME = "mmdb/GeoLite2-City-test.mmdb";
24+
25+
async function downloadFile(url: string): Promise<ArrayBuffer> {
26+
console.log(chalk.blue(`📥 Downloading ${url}...`));
27+
const start = performance.now();
28+
29+
const response = await fetch(url);
30+
31+
if (!response.ok) {
32+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
33+
}
34+
35+
const arrayBuffer = await response.arrayBuffer();
36+
const duration = (performance.now() - start).toFixed(0);
37+
const sizeMB = (arrayBuffer.byteLength / 1024 / 1024).toFixed(2);
38+
39+
console.log(
40+
chalk.green(`✅ Downloaded ${FILENAME}`) +
41+
chalk.dim(` (${sizeMB} MB) in ${duration}ms`)
42+
);
43+
44+
return arrayBuffer;
45+
}
46+
47+
async function uploadFile(filename: string, content: ArrayBuffer): Promise<void> {
48+
const url = `${BASE_URL}/${STORAGE_ZONE_NAME}/${filename}`;
49+
const sizeMB = (content.byteLength / 1024 / 1024).toFixed(2);
50+
51+
console.log(chalk.blue(`📤 Uploading ${filename} (${sizeMB} MB)...`));
52+
53+
const start = performance.now();
54+
const response = await fetch(url, {
55+
method: "PUT",
56+
headers: {
57+
AccessKey: ACCESS_KEY as string,
58+
"Content-Type": "application/octet-stream",
59+
},
60+
body: content,
61+
});
62+
63+
if (!response.ok) {
64+
const text = await response.text();
65+
throw new Error(`HTTP ${response.status}: ${text}`);
66+
}
67+
68+
const duration = (performance.now() - start).toFixed(0);
69+
console.log(
70+
chalk.green(`✅ Uploaded ${filename}`) + chalk.dim(` in ${duration}ms`)
71+
);
72+
}
73+
74+
async function main() {
75+
try {
76+
const fileData = await downloadFile(SOURCE_URL);
77+
await uploadFile(FILENAME, fileData);
78+
console.log(chalk.green("\n✨ Successfully updated MMDB file!"));
79+
} catch (error) {
80+
console.error(chalk.red("\n❌ Failed to update MMDB file:"), error);
81+
process.exit(1);
82+
}
83+
}
84+
85+
main();

0 commit comments

Comments
 (0)