mediahub-fe/app/[locale]/(public)/profile/change-password/page.tsx

224 lines
7.0 KiB
TypeScript

"use client";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { control } from "leaflet";
import React, { useEffect, useState } from "react";
import { Controller, useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import Swal from "sweetalert2";
import { getBlog, postBlog } from "@/service/blog/blog";
import { id } from "date-fns/locale";
import { getInfoProfile, saveUser, setupPassword } from "@/service/auth";
import withReactContent from "sweetalert2-react-content";
import { Textarea } from "@/components/ui/textarea";
import { Button } from "@/components/ui/button";
import { Link } from "@/components/navigation";
import { useTranslations } from "next-intl";
import { useRouter } from "next/navigation";
import { close, error, loading } from "@/lib/swal";
const profileSchema = z.object({
password: z.string().min(1, { message: "Judul diperlukan" }),
retypePassword: z.string().min(1, { message: "Judul diperlukan" }),
});
type Detail = {
id: number;
userId: any;
password: string;
retypePassword: string;
};
const ChangePassword: React.FC = () => {
const router = useRouter();
const MySwal = withReactContent(Swal);
const [detail, setDetail] = useState<Detail>();
const [refresh, setRefresh] = useState(false);
const t = useTranslations("LandingPage");
type ProfileSchema = z.infer<typeof profileSchema>;
const {
control,
handleSubmit,
setValue,
formState: { errors },
} = useForm<ProfileSchema>({
resolver: zodResolver(profileSchema),
});
useEffect(() => {
async function initState() {
const response = await getInfoProfile();
const details = response?.data?.data;
setDetail(details);
console.log("data", details);
}
initState();
}, []);
const save = async (data: ProfileSchema) => {
if (data.password != null && data.password == data.retypePassword) {
loading();
const newData = {
// userId: detail?.userKeycloakId,
password: data.password,
retypePassword: detail?.retypePassword,
};
const response = await setupPassword(newData);
close();
if (response?.error) {
error(response.message);
return false;
}
MySwal.fire({
title: "Sukses",
text: "Data berhasil disimpan.",
icon: "success",
confirmButtonColor: "#3085d6",
confirmButtonText: "OK",
}).then(() => {
router.push("/in/auth");
});
}
// const requestData = {
// ...data,
// // userId: detail?.userKeycloakId,
// password: data.password,
// retypePassword: detail?.retypePassword,
// };
// const response = await setupPassword(requestData);
// console.log("Form Data Submitted:", requestData);
// console.log("response", response);
// MySwal.fire({
// title: "Sukses",
// text: "Data berhasil disimpan.",
// icon: "success",
// confirmButtonColor: "#3085d6",
// confirmButtonText: "OK",
// }).then(() => {
// router.push("/in/auth");
// });
};
const onSubmit = (data: ProfileSchema) => {
MySwal.fire({
title: "Simpan Data",
text: "Apakah Anda yakin ingin menyimpan data ini?",
icon: "warning",
showCancelButton: true,
cancelButtonColor: "#d33",
confirmButtonColor: "#3085d6",
confirmButtonText: "Simpan",
}).then((result) => {
if (result.isConfirmed) {
save(data);
}
});
};
return (
<div className="px-4 lg:px-14 py-8">
<div className="text-center mb-8">
<div className="w-20 h-20 mx-auto rounded-full bg-red-700 flex items-center justify-center">
<span className="text-white text-3xl font-bold">👤</span>
</div>
<h1 className="text-2xl font-bold mt-4">{t("changePass", { defaultValue: "Change Pass" })}</h1>
</div>
<div className="flex justify-center gap-4 mb-8">
<Link href={"/profile"}>
<button className="border border-red-700 text-red-700 px-4 py-2 rounded">
{t("userProfile", { defaultValue: "User Profile" })}
</button>
</Link>
<Link href={"/profile/change-profile"}>
<button className="border border-red-700 text-red-700 px-4 py-2 rounded">
{t("changePhoto", { defaultValue: "Change Photo" })}
</button>
</Link>
<Link href={"/profile/change-password"}>
<button className="bg-red-700 text-white px-4 py-2 rounded">
{t("changePass", { defaultValue: "Change Pass" })}
</button>
</Link>
</div>
<div className="max-w-3xl mx-auto bg-white shadow-sm p-4 rounded">
<p className="mb-6 text-gray-600">{t("pleaseChange", { defaultValue: "Please Change" })}</p>
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<div className="mb-4">
<Label>
{t("password", { defaultValue: "Password" })}
<span className="text-red-500">*</span>
</Label>
<Controller
control={control}
name="password"
render={({ field }) => (
<Input
size="md"
type="password"
defaultValue={field.value}
onChange={field.onChange}
placeholder={t("inputPass", { defaultValue: "Input Pass" })}
/>
)}
/>
{errors.password?.message && (
<p className="text-red-400 text-sm">
{errors.password.message}
</p>
)}
</div>
<div className="mb-4">
<Label>
{t("confirmPass", { defaultValue: "Confirm Pass" })}
<span className="text-red-500">*</span>
</Label>
<Controller
control={control}
name="retypePassword"
render={({ field }) => (
<Input
size="md"
type="password"
defaultValue={field.value}
onChange={field.onChange}
placeholder={t("samePass", { defaultValue: "Same Pass" })}
/>
)}
/>
{errors.retypePassword?.message && (
<p className="text-red-400 text-sm">
{errors.retypePassword.message}
</p>
)}
</div>
<div className="text-right">
<div className="mt-4">
<button
type="submit"
className="bg-red-700 text-white px-6 py-2 rounded hover:bg-red-800 focus:outline-none focus:ring focus:ring-red-300"
>
{t("save", { defaultValue: "Save" })}
</button>
</div>
</div>
</div>
</form>
</div>
</div>
);
};
export default ChangePassword;