"use client"; import { useQueryClient } from "@tanstack/react-query"; 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 { marriageQueryKeys } from "@/hooks/marriage/query-keys"; import { extractHabcoinPaymentUrl, useHabcoinPaymentMutation, } from "@/hooks/marriage/use-habcoin-payment"; import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main"; import { buyHabibCoinPackages, isInFlutterWebView, } from "@/lib/webview-actions"; import { useI18n } from "@/translations/provider"; import ErrorToast from "./error-toast"; 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; }; export function NavigationButton({ icon, iconLabel, variant = "default", type = "button", className, helpTitle, helpDescription, helpButtonText, disableHelpModal = false, ...props }: NavigationButtonProps) { const router = useRouter(); const { dictionary: t } = useI18n(); const [isHelpOpen, setIsHelpOpen] = useState(false); const [isSupportOpen, setIsSupportOpen] = useState(false); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [isSubscriptionInfoOpen, setIsSubscriptionInfoOpen] = useState(false); const [isSubscriptionLoading, setIsSubscriptionLoading] = useState(false); const dropdownRef = useRef(null); // Only fetch profile for icons that actually need profile data. // Simple icons like back, close, info, document don't need it. const needsProfile = icon === "support" || icon === "subscription" || icon === "more" || icon === "consultation"; const { data: profile, refetch } = useMarriageProfileQuery({ enabled: needsProfile, }); const paymentMutation = useHabcoinPaymentMutation(); const queryClient = useQueryClient(); const [toastMessage, setToastMessage] = useState(null); const [toastVariant, setToastVariant] = useState<"error" | "success">( "error", ); const [isRenewing, setIsRenewing] = useState(false); const [isInsufficientCoins, setIsInsufficientCoins] = useState(false); const renderSubscriptionModal = () => { if (!isSubscriptionInfoOpen) return null; if (isSubscriptionLoading) { return ( setIsSubscriptionInfoOpen(false)} /> ); } return hasActiveSubscription ? ( <> setIsSubscriptionInfoOpen(false)} buttons={({ close }) => (
{isInsufficientCoins && isInFlutterWebView() && ( )}
)} /> ) : ( setIsSubscriptionInfoOpen(false)} /> ); }; const isFemale = profile?.gender === "female"; const hasActiveSubscription = !!profile?.active_subscription; 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 (