Commit 18ed2582 by Arjun Jhukal

updated the setting data populate issue

parent 8c75ba76
......@@ -58,26 +58,29 @@ export default function InputFile({
{label} {required && <span className="text-red-500">*</span>}
</InputLabel>
<OutlinedInput
fullWidth
id={name}
name={name}
type="text"
readOnly
value={
Array.isArray(value)
? value.map((f) => f.name).join(", ") || ""
: value instanceof File
? value.name
: ""
}
placeholder="Choose file"
onClick={() => document.getElementById(`${name}-file`)?.click()}
error={Boolean(touched && error)}
sx={{
cursor: "pointer",
}}
/>
<div className="input_box relative">
<OutlinedInput
fullWidth
id={name}
name={name}
type="text"
readOnly
// value={
// Array.isArray(value)
// ? value.map((f) => f.name).join(", ") || ""
// : value instanceof File
// ? value.name
// : ""
// }
// placeholder="Choose file"
onClick={() => document.getElementById(`${name}-file`)?.click()}
error={Boolean(touched && error)}
sx={{
cursor: "pointer",
}}
/>
<span className=" absolute left-1 top-1/2 translate-y-[-50%] text-[11px] text-title bg-[#D8D8DD] inline-block py-1 px-2 z-[-1] rounded-sm">Choose File</span>
</div>
{/* Hidden file input */}
<input
......
......@@ -7,17 +7,27 @@ import GoldCoinIcon from '@/icons/GoldCoinIcon'
import SilverCoinIcon from '@/icons/SilverCoinIcon'
import UserCoinCard from './UserCoinCard'
import Private from '@/routes/Private'
import { CheckAuth } from '@/utils/checkAuth'
import Link from 'next/link'
import { PATH } from '@/routes/PATH'
export default function UserHeader() {
const isAuth = CheckAuth();
return (
<Box className='flex items-center gap-4 justify-between w-full'>
<AdminSearchBar />
<Private>
{isAuth ?
<div className="right flex items-center gap-4">
<UserCoinCard />
<Profile />
</div> :
<div className="flex gap-3 items-center">
<Link href={PATH.AUTH.REGISTER.ROOT} className='ss-btn bg-primary-grad text-nowrap'>Setup an account</Link>
<Link href={PATH.AUTH.LOGIN.ROOT} className='ss-btn bg-primary-grad'>Login</Link>
</div>
</Private>
}
</Box>
)
}
......@@ -9,26 +9,26 @@ import { CloseCircle } from "@wandersonalwes/iconsax-react";
import { useGetSettingsQuery, useUpdateSettingMutation } from "@/services/settingApi";
import { useAppDispatch } from "@/hooks/hook";
import { showToast, ToastVariant } from "@/slice/toastSlice";
import { SiteInitialRequest } from "@/types/setting";
export default function SiteSetting() {
const dispatch = useAppDispatch();
const [updateSetting, { isLoading }] = useUpdateSettingMutation();
const { data } = useGetSettingsQuery();
console.log("settings", data);
const formik = useFormik({
initialValues: {
initialValues: data ? {
site_name: data?.data?.site_name,
favicon: null,
logo: null,
site_name: "",
unique_selling_points: [
{
title: "",
description: "",
icon: null,
},
],
},
unique_selling_points: data?.data?.unique_selling_points.map((usp) => ({
title: usp.title,
description: usp.description,
icon: null,
icon_url: usp.icon_url
}))
} : SiteInitialRequest,
enableReinitialize: true,
validationSchema: Yup.object({
favicon: Yup.mixed().required("Favicon is required"),
logo: Yup.mixed().required("Logo is required"),
......@@ -42,21 +42,31 @@ export default function SiteSetting() {
),
}),
onSubmit: async (values) => {
const formData = new FormData();
if (values.favicon) formData.append("favicon", values.favicon);
if (values.logo) formData.append("logo", values.logo);
// Append text fields
if (data?.data?.logo) {
formData.append("logo_url", data.data.logo)
}
if (data?.data?.favicon) {
formData.append("logo_url", data.data.favicon)
}
formData.append("site_name", values.site_name);
// Append USP data
values.unique_selling_points.forEach((usp, index) => {
formData.append(`unique_selling_points[${index}][title]`, usp.title);
formData.append(`unique_selling_points[${index}][description]`, usp.description);
if (usp.icon) {
formData.append(`unique_selling_points[${index}][icon]`, usp.icon);
}
if (usp.icon_url) {
formData.append(`unique_selling_points[${index}][icon_url]`, usp.icon_url);
}
});
try {
......@@ -80,6 +90,8 @@ export default function SiteSetting() {
},
});
console.log(formik.values, data?.data.site_name);
const handleAddUSP = () => {
formik.setFieldValue("unique_selling_points", [
...formik.values.unique_selling_points,
......@@ -112,6 +124,7 @@ export default function SiteSetting() {
value={formik.values.site_name}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
<span className="error">
{formik.touched.site_name && formik.errors.site_name
......@@ -128,6 +141,7 @@ export default function SiteSetting() {
value={formik.values.favicon || null}
onChange={(file: File | File[] | null) => formik.setFieldValue("favicon", file)}
onBlur={() => formik.setFieldTouched("favicon", true)}
serverFile={!formik.values.favicon ? data?.data?.favicon : ""}
/>
<span className="error">
{formik.touched.favicon && formik.errors.favicon ? formik.errors.favicon : ""}
......@@ -142,6 +156,7 @@ export default function SiteSetting() {
value={formik.values.logo || null}
onChange={(file: File | File[] | null) => formik.setFieldValue("logo", file)}
onBlur={() => formik.setFieldTouched("logo", true)}
serverFile={!formik.values.logo ? data?.data?.logo : ""}
/>
<span className="error">
{formik.touched.logo && formik.errors.logo ? formik.errors.logo : ""}
......@@ -219,6 +234,7 @@ export default function SiteSetting() {
formik.setFieldValue(`unique_selling_points[${index}].icon`, file)
}
onBlur={() => formik.setFieldTouched(`unique_selling_points[${index}].icon`, true)}
serverFile={data?.data?.unique_selling_points[index].icon}
/>
<span className="error">
{formik.touched.unique_selling_points?.[index]?.icon &&
......
......@@ -6,18 +6,33 @@ export interface SiteSettingRequestProps {
site_name: string;
unique_selling_points: UspProps[];
}
export const SiteInitialRequest = {
favicon: null,
logo: null,
site_name: "",
unique_selling_points: [
{
title: "",
description: "",
icon: null,
icon_url: ""
},
],
}
export interface SiteSettingResponseProps {
success: string;
message: string;
data: {
favIcon: string;
favicon: string;
logo: string;
site_name: string;
unique_selling_points: {
title: string;
description: string;
icon: string;
}[]
icon_url?: string;
}[];
}
}
......
// utils/CheckAuth.ts
import Cookies from "js-cookie";
import { cookies as nextCookies } from "next/headers";
function isTokenExpired(token: string): boolean {
try {
const payload = JSON.parse(atob(token.split(".")[1]));
const exp = payload.exp;
if (!exp) return true;
const now = Math.floor(Date.now() / 1000);
return exp < now;
} catch (error) {
console.error("Failed to decode token:", error);
return true;
}
}
export function CheckAuth() {
let token: string | null = null;
if (typeof window !== "undefined") {
token = localStorage.getItem("access_token") || Cookies.get("access_token") || null;
}
if (!token) return false;
if (isTokenExpired(token)) return false;
return true;
}
export function setActiveMenu(pathname: string, paths: string | string[]): boolean {
if (!pathname) return false;
const list = Array.isArray(paths) ? paths : [paths];
return list.some((path) => {
const normalized = path.startsWith("/") ? path : `/${path}`;
return pathname.startsWith(normalized);
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment