"use client"; import Image from "next/image"; import { useRouter } from "next/navigation"; import type { ButtonHTMLAttributes, ReactNode } from "react"; import { useEffect, useRef, useState } from "react"; import { GoArrowLeft } from "react-icons/go"; import { HiEllipsisVertical } from "react-icons/hi2"; import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main"; import { isInFlutterWebView } from "@/lib/webview-actions"; import { useI18n } from "@/translations/provider"; import HelpModal from "./help-modal"; import InformationSheet from "./information-sheet"; import { hasSupportAccess } from "./support-access"; import SupportSheet from "./support-sheet"; import { UiIcon } from "./ui-icon"; type NavigationButtonIcon = | "back" | "support" | "close" | "info" | "document" | "subscription" | "consultation" | "more"; type NavigationButtonVariant = "default" | "transparent"; export type NavigationButtonProps = Omit< ButtonHTMLAttributes, "children" > & { icon: NavigationButtonIcon; iconLabel?: string; variant?: NavigationButtonVariant; helpTitle?: ReactNode; helpDescription?: ReactNode; helpButtonText?: ReactNode; disableHelpModal?: boolean; badge?: ReactNode; profile?: any; }; export function NavigationButton({ icon, iconLabel, variant = "default", type = "button", className, helpTitle, helpDescription, helpButtonText, disableHelpModal = false, badge, profile: profileProp, ...props }: NavigationButtonProps) { const router = useRouter(); const { dictionary: t, locale } = useI18n(); const isRtl = locale === "fa" || locale === "ar" || locale === "ur"; const [isHelpOpen, setIsHelpOpen] = useState(false); const [isSupportOpen, setIsSupportOpen] = useState(false); const [isSubscriptionInfoOpen, setIsSubscriptionInfoOpen] = useState(false); const [isSubscriptionLoading, setIsSubscriptionLoading] = useState(false); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const dropdownRef = useRef(null); const needsProfile = !profileProp && (icon === "support" || icon === "subscription" || icon === "more" || icon === "consultation"); const { data: queriedProfile, refetch: refetchQuery } = useMarriageProfileQuery({ enabled: needsProfile, }); const profile = profileProp !== undefined ? profileProp : queriedProfile; const refetch = refetchQuery; const isFemale = profile?.gender === "female"; const hasActiveSubscription = !!profile?.active_subscription && profile.active_subscription.is_active !== false && profile.active_subscription.is_valid !== false; const handleOpenSubscriptionModal = () => { setIsSubscriptionInfoOpen(true); if (!profile) { setIsSubscriptionLoading(true); refetch().finally(() => { setIsSubscriptionLoading(false); }); } }; const renderSubscriptionModal = () => { if (!isSubscriptionInfoOpen) return null; if (isSubscriptionLoading && !profile) { return ( setIsSubscriptionInfoOpen(false)} /> ); } const sub = profile?.active_subscription; const planType = sub?.plan?.plan_type || "time_based"; const remainingDays = sub?.remaining_days ?? 0; const usageLimit = sub?.plan?.usage_limit ?? 0; const totalUsages = sub?.total_usages ?? 0; const remainingUsages = Math.max(0, usageLimit - totalUsages); let subscriptionDescription = ""; if (planType === "count_based") { subscriptionDescription = ( t["{count} case introductions remaining of your subscription."] || "{count} case introductions remaining of your subscription." ).replace("{count}", String(remainingUsages)); } else if (planType === "combined") { subscriptionDescription = ( t[ "{days} days and {count} case introductions remaining of your subscription." ] || "{days} days and {count} case introductions remaining of your subscription." ) .replace("{days}", String(remainingDays)) .replace("{count}", String(remainingUsages)); } else { subscriptionDescription = ( t["{days} days remaining of your subscription."] || "{days} days remaining of your subscription." ).replace("{days}", String(remainingDays)); } return hasActiveSubscription ? ( setIsSubscriptionInfoOpen(false)} /> ) : ( setIsSubscriptionInfoOpen(false)} /> ); }; useEffect(() => { if (!isDropdownOpen) return; const handleOutsideClick = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsDropdownOpen(false); } }; document.addEventListener("mousedown", handleOutsideClick); return () => document.removeEventListener("mousedown", handleOutsideClick); }, [isDropdownOpen]); const canAccessSupport = hasSupportAccess(profile); if (icon === "subscription" && isFemale) { return
; } if (icon === "support" && !canAccessSupport) { return
; } const iconNode = (() => { switch (icon) { case "back": case "close": return (