+
{user.role === "ADMIN" && (
diff --git a/auth.ts b/auth.ts
index a657a09..1287c9c 100644
--- a/auth.ts
+++ b/auth.ts
@@ -14,6 +14,7 @@ declare module "next-auth" {
team: string;
active: number;
apiKey: string;
+ emailVerified: Date;
} & DefaultSession["user"];
}
}
@@ -49,6 +50,7 @@ export const {
session.user.active = token.active as number;
session.user.team = token.team as string;
session.user.apiKey = token.apiKey as string;
+ session.user.emailVerified = token.emailVerified as Date;
}
return session;
@@ -67,6 +69,7 @@ export const {
token.active = dbUser.active;
token.team = dbUser.team || "free";
token.apiKey = dbUser.apiKey;
+ token.emailVerified = dbUser.emailVerified;
return token;
},
diff --git a/components/forms/user-email-form.tsx b/components/forms/user-email-form.tsx
new file mode 100644
index 0000000..06d58b1
--- /dev/null
+++ b/components/forms/user-email-form.tsx
@@ -0,0 +1,130 @@
+"use client";
+
+import { useState, useTransition } from "react";
+import { updateUserName } from "@/actions/update-user-name";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { User } from "@prisma/client";
+import { format } from "date-fns";
+import { useSession } from "next-auth/react";
+import { useTranslations } from "next-intl";
+import { useForm } from "react-hook-form";
+import { toast } from "sonner";
+
+import { formatDate, formatTime } from "@/lib/utils";
+import { userEmailSchema } from "@/lib/validations/user";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { SectionColumns } from "@/components/dashboard/section-columns";
+import { Icons } from "@/components/shared/icons";
+
+import { TimeAgoIntl } from "../shared/time-ago";
+import { Badge } from "../ui/badge";
+
+interface UserEmailFormProps {
+ user: Pick
;
+}
+
+export type FormData = {
+ email: string;
+};
+
+export function UserEmailForm({ user }: UserEmailFormProps) {
+ const { update } = useSession();
+ const [updated, setUpdated] = useState(false);
+ const [isPending, startTransition] = useTransition();
+ const updateUserNameWithId = updateUserName.bind(null, user.id);
+ const userEmailVerified = new Date(user.emailVerified || "").getSeconds();
+
+ const t = useTranslations("Setting");
+
+ const checkUpdate = (value) => {
+ setUpdated(user.email !== value);
+ };
+
+ const {
+ handleSubmit,
+ register,
+ formState: { errors },
+ } = useForm({
+ resolver: zodResolver(userEmailSchema),
+ defaultValues: {
+ email: user?.email || "",
+ },
+ });
+
+ const onSubmit = handleSubmit((data) => {
+ startTransition(async () => {
+ const { status } = await updateUserNameWithId(data);
+
+ if (status !== "success") {
+ toast.error("Something went wrong.", {
+ description: "Your name was not updated. Please try again.",
+ });
+ } else {
+ await update();
+ setUpdated(false);
+ toast.success("Your name has been updated.");
+ }
+ });
+ });
+
+ return (
+
+ );
+}
diff --git a/components/shared/icons.tsx b/components/shared/icons.tsx
index a0b5e06..9883fe7 100644
--- a/components/shared/icons.tsx
+++ b/components/shared/icons.tsx
@@ -120,6 +120,24 @@ export const Icons = {
layers: Layers,
databaseZap: DatabaseZap,
boxes: Boxes,
+ shieldUser: ({ ...props }: LucideProps) => (
+
+ ),
cloudUpload: ({ ...props }: LucideProps) => (