"use client"; import LanguageDropdown from "@/components/Common/LanguageDropdown"; import { CurrentLanguageData } from "@/redux/reducer/languageSlice"; import { getIsFreAdListing, getOtpServiceProvider, settingsData, } from "@/redux/reducer/settingSlice"; import { t, truncate } from "@/utils"; import CustomLink from "@/components/Common/CustomLink"; import { useSelector } from "react-redux"; import { GrLocation } from "react-icons/gr"; import { getCityData } from "@/redux/reducer/locationSlice"; import HomeMobileMenu from "./HomeMobileMenu.jsx"; import MailSentSuccessModal from "@/components/Auth/MailSentSuccessModal.jsx"; import { useEffect, useState } from "react"; import { getIsLoggedIn, logoutSuccess, userSignUpData, } from "@/redux/reducer/authSlice.js"; import ProfileDropdown from "./ProfileDropdown.jsx"; import { toast } from "sonner"; import FirebaseData from "@/utils/Firebase.js"; import { IoIosAddCircleOutline } from "react-icons/io"; import dynamic from "next/dynamic"; import { getIsLoginModalOpen, setIsLoginOpen, } from "@/redux/reducer/globalStateSlice.js"; import ReusableAlertDialog from "@/components/Common/ReusableAlertDialog"; import { deleteUserApi, getLimitsApi, logoutApi } from "@/utils/api.js"; import { useMediaQuery } from "usehooks-ts"; import UnauthorizedModal from "@/components/Auth/UnauthorizedModal.jsx"; import CustomImage from "@/components/Common/CustomImage.jsx"; import { Loader2 } from "lucide-react"; import { useNavigate } from "@/components/Common/useNavigate.jsx"; import { usePathname } from "next/navigation.js"; import { Skeleton } from "@/components/ui/skeleton.jsx"; import HeaderCategories from "./HeaderCategories.jsx"; import { deleteUser, getAuth } from "firebase/auth"; import DeleteAccountVerifyOtpModal from "@/components/Auth/DeleteAccountVerifyOtpModal.jsx"; import useGetCategories from "@/components/Layout/useGetCategories.jsx"; const Search = dynamic(() => import("./Search.jsx"), { ssr: false, }); const LoginModal = dynamic(() => import("@/components/Auth/LoginModal.jsx"), { ssr: false, }); const RegisterModal = dynamic( () => import("@/components/Auth/RegisterModal.jsx"), { ssr: false, } ); const LocationModal = dynamic( () => import("@/components/Location/LocationModal.jsx"), { ssr: false, } ); const HeaderCategoriesSkeleton = () => { return (
); }; const HomeHeader = () => { // 📦 Framework & Firebase const { navigate } = useNavigate(); const { signOut } = FirebaseData(); const pathname = usePathname(); // 🔌 Redux State (via useSelector) // User & Auth const userData = useSelector(userSignUpData); const IsLoggedin = useSelector(getIsLoggedIn); const IsLoginOpen = useSelector(getIsLoginModalOpen); const otp_service_provider = useSelector(getOtpServiceProvider); // Ads & Categories // const isCategoryLoading = useSelector(getIsCatLoading); // const cateData = useSelector(CategoryData); const { getCategories, cateData, isCatLoading: isCategoryLoading } = useGetCategories(); const IsFreeAdListing = useSelector(getIsFreAdListing); // Location const cityData = useSelector(getCityData); // Language & Settings const CurrentLanguage = useSelector(CurrentLanguageData); const settings = useSelector(settingsData); // 🎛️ Local UI State (via useState) // Modals const [IsRegisterModalOpen, setIsRegisterModalOpen] = useState(false); const [IsLocationModalOpen, setIsLocationModalOpen] = useState(false); const [IsVerifyOtpBeforeDelete, setIsVerifyOtpBeforeDelete] = useState(false); // Auth State const [IsLogout, setIsLogout] = useState(false); const [IsLoggingOut, setIsLoggingOut] = useState(false); // Profile const [IsUpdatingProfile, setIsUpdatingProfile] = useState(false); // Ad Listing const [IsAdListingClicked, setIsAdListingClicked] = useState(false); // Email Status const [IsMailSentSuccess, setIsMailSentSuccess] = useState(false); // 📱 Media Query const isLargeScreen = useMediaQuery("(min-width: 992px)"); //delete account state const [manageDeleteAccount, setManageDeleteAccount] = useState({ IsDeleteAccount: false, IsDeleting: false, }); useEffect(() => { getCategories(1); }, [CurrentLanguage.id]); const handleLogout = async () => { try { setIsLoggingOut(true); await signOut(); const res = await logoutApi.logoutApi({ ...(userData?.fcm_id && { fcm_token: userData?.fcm_id }), }); if (res?.data?.error === false) { logoutSuccess(); toast.success(t("signOutSuccess")); setIsLogout(false); // avoid redirect if already on home page otherwise router.push triggering server side api calls if (pathname !== "/") { navigate("/"); } } else { toast.error(res?.data?.message); } } catch (error) { console.log("Failed to log out", error); } finally { setIsLoggingOut(false); } }; const handleAdListing = async () => { if (!IsLoggedin) { setIsLoginOpen(true); return; } if (!userData?.name || !userData?.email) { setIsUpdatingProfile(true); return; } if (IsFreeAdListing) { navigate("/ad-listing"); return; } try { setIsAdListingClicked(true); const res = await getLimitsApi.getLimits({ package_type: "item_listing", }); if (res?.data?.error === false) { navigate("/ad-listing"); } else { toast.error(t("purchasePlan")); navigate("/subscription"); } } catch (error) { console.log(error); } finally { setIsAdListingClicked(false); } }; const handleUpdateProfile = () => { setIsUpdatingProfile(false); navigate("/profile"); }; const locationText = cityData?.address_translated || cityData?.formattedAddress; const handleDeleteAcc = async () => { try { setManageDeleteAccount((prev) => ({ ...prev, IsDeleting: true })); const auth = getAuth(); const user = auth.currentUser; const isMobileLogin = userData?.type == "phone"; const needsOtpVerification = isMobileLogin && !user && otp_service_provider === "firebase"; if (user) { await deleteUser(user); } else if (needsOtpVerification) { setManageDeleteAccount((prev) => ({ ...prev, IsDeleteAccount: false })); setIsVerifyOtpBeforeDelete(true); return; } await deleteUserApi.deleteUser(); logoutSuccess(); toast.success(t("userDeleteSuccess")); setManageDeleteAccount((prev) => ({ ...prev, IsDeleteAccount: false })); // avoid redirect if already on home page otherwise router.push triggering server side api calls if (pathname !== "/") { navigate("/"); } } catch (error) { console.error("Error deleting user:", error.message); const isMobileLogin = userData?.type === "phone"; if (error.code === "auth/requires-recent-login") { if (isMobileLogin) { setManageDeleteAccount((prev) => ({ ...prev, IsDeleteAccount: false, // close delete modal })); setIsVerifyOtpBeforeDelete(true); // open OTP screen return; } logoutSuccess(); toast.error(t("deletePop")); setManageDeleteAccount((prev) => ({ ...prev, IsDeleteAccount: false })); } } finally { setManageDeleteAccount((prev) => ({ ...prev, IsDeleting: false })); } }; return ( <>
{isCategoryLoading && !cateData.length ? ( ) : ( cateData && cateData.length > 0 && )} {/* Reusable Alert Dialog for Logout */} setIsLogout(false)} onConfirm={handleLogout} title={t("confirmLogout")} description={t("areYouSureToLogout")} cancelText={t("cancel")} confirmText={t("yes")} confirmDisabled={IsLoggingOut} /> {/* Reusable Alert Dialog for Updating Profile */} setIsUpdatingProfile(false)} onConfirm={handleUpdateProfile} title={t("updateProfile")} description={t("youNeedToUpdateProfile")} confirmText={t("yes")} /> {!isLargeScreen && ( setManageDeleteAccount((prev) => ({ ...prev, IsDeleteAccount: false, })) } onConfirm={handleDeleteAcc} title={t("areYouSure")} description={
  • {t("adsAndTransactionWillBeDeleted")}
  • {t("accountsDetailsWillNotRecovered")}
  • {t("subWillBeCancelled")}
  • {t("savedMesgWillBeLost")}
} cancelText={t("cancel")} confirmText={t("yes")} confirmDisabled={manageDeleteAccount?.IsDeleting} /> )} ); }; export default HomeHeader;