import { useState, useEffect, useRef, useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { useDispatch, useSelector, shallowEqual } from 'react-redux';
import {
changealldata,
changeBookingType,
changeComboRedirectionToDefaultLayoutForParking,
changeCompoPaymentIconStatus,
changeCustomerID,
changeEstimateBooking,
changeOrderCardDetails,
changeOtherServices,
changeReorderHoldDetails,
changeReorderProductDetails,
changeSelectedCustId,
changeSelectedOption,
GlobalBookingType,
GlobalBookingTypeBoth,
GlobalComboRedirectionToDefaultLayoutForParking,
GlobalCommonPaymentOptions,
GlobalEstimateBooking,
GlobalFeatAddOnData,
GlobalOrderCardDetails,
GlobalOrderStatus,
GlobalOrderType,
GlobalOtherSevices,
GlobalSelCustId,
PreferenceData,
} from '../../../../Features/BookingScreen/BookingData/BookingData.js';
import {
ApplicationPreferences,
GenerateLogout,
GlobalCompBranchData,
} from '../../../../Features/BrachLogin/BranchLogin.js';
import { useApplyOfferto_CardDetail } from '../UtillComponents/BSNavBarOffer/BSNavBarOffer_CustomHooks.jsx';
import '../../../../Styles/BookingScreen/Components/BSNavbar/BSNavbar3.scss';
// UI Imports
import { Badge, Popconfirm, Tooltip } from 'antd';
import { AiFillHome } from 'react-icons/ai';
import { GoClockFill } from 'react-icons/go';
import {
FaPlus,
FaHandPaper,
FaHeart,
FaUserAlt,
FaPhoneAlt,
FaParking,
} from 'react-icons/fa';
import { CiMenuBurger } from 'react-icons/ci';
import { IoClose, IoCloseOutline } from 'react-icons/io5';
import { FaCalendar } from 'react-icons/fa6';
import {
RiFullscreenExitFill,
RiFullscreenFill,
RiPrinterFill,
} from 'react-icons/ri';
import { GiShoppingBag } from 'react-icons/gi';
import { PiSignOutFill } from 'react-icons/pi';
import { TfiHandDrag } from 'react-icons/tfi';
import { CgClose } from 'react-icons/cg';
import { DropDowns } from '../../../../Components/Forms/DropDown';
import PozoDineInIcon from '../UtillComponents/Pozo retail icons/PozoDineIn.jsx';
import BSNavBarFavItems from '../UtillComponents/BSNavBarFavItems.jsx';
import BSNavBarAddUser from '../UtillComponents/BSNavBarAddUser.jsx';
import BSCustomerSelect from '../UtillComponents/BSSelectCustomer.jsx';
import FeaturesFunctionalities from '../BookingFunctionality/FeaturesFunctionalities.jsx';
import BSNavBarHand from '../UtillComponents/BSNavBarHand.jsx';
import BSNavBarDragItems from '../UtillComponents/BSNavBarDragItems.jsx';
import CustomerDisplayicon from '../UtillComponents/Pozo retail icons/PozoCustomerDisplayicon.jsx';
import BSNavBarPrinter from '../UtillComponents/BSNavBarPrinter.jsx';
import BSNavBarUserInfo from './BSNavBarUserInfo.jsx';
import {
getUserProfile,
userDataByUserId,
} from '../../../../Features/UserAccount/userData.js';
import {
clearSession,
getSession,
sessionStore,
} from '../../../../Services/Others.js';
import UserRelieveManager from '../../Template/RealivingUser.jsx';
import BSNavbarSearchStandard from '../UtillComponents/BSNavbarSearchStandard.jsx';
import {
getTemplate,
getTemplateData,
StoredSessionData,
} from '../../../../Features/ThemeChange/ThemeChange.js';
import {
CurrentTimeDisplay,
CurrentDateDisplay,
} from '../UtillComponents/CurrentDateTimeDisplay.jsx';
import BSPrinterSetting from '../UtillComponents/BSPrinterSetting.jsx';
import BSNavBarTable from '../UtillComponents/BSNavBarTable.jsx';
import TooltipWrapper from '../../../../Components/Tooltip/Tooltip.jsx';
import { isMobile } from 'react-device-detect';
import {
getCustomerDisplayWindow,
setCustomerDisplayWindow,
} from '../../../../Features/customerDisplayWindow/customerDisplayWindow.js';
import BSMobilePrintSettings from '../UtillComponents/BSMobilePrintSettings.jsx';
import BSScanTemplate from '../UtillComponents/BSScanTemplate.jsx';
import VerfiedProducts from './verfiedProduct/VerfiedProducts.jsx';
import BSMembership from '../UtillComponents/BSMembership.jsx';
import BranchName from '../../Template/BranchName.jsx';
import BSNavBarAddons from '../UtillComponents/BSNavBarAddons.jsx';
import BSNavBarOffer from '../UtillComponents/BSNavBarOffer/BSNavBarOffer.jsx';
import BSNavBarQuickAdd from '../UtillComponents/BSNavBarQuickAdd.jsx';
import BSNavBarPreOrder from '../UtillComponents/BSNavBarPreOrder.jsx';
import {
changepreOrder,
changePreOrderAdditem,
changepreOrderList,
GlobalPreOrderPendingCount,
} from '../../../../Features/BookingScreen/PreOrder/PreOrder.js';
import PozoPreOrderIcon from '../UtillComponents/Pozo retail icons/PozoPreOrderIcon.jsx';
import { OtherServicesCardlistdata } from '../../../../Features/OtherServices/OtherServices.js';
import BSNavBarEstimate from '../UtillComponents/BSNavBarEst.jsx';
import BSNavBarWholeSale from '../UtillComponents/BSNavBarWholeSale.jsx';
import { Global_OfferStatus } from '../../../../Features/Offer/Offer.js';
import { globalholddata } from '../../../../Features/BookingScreen/HoldOption/HoldOption.js';
import BSNavBarWeightScale from '../UtillComponents/BSNavBarWeightScale.jsx';
import { CgSearchLoading } from 'react-icons/cg';
import { DefaultModal } from '../../../../Components/Modal/DefaultModal.jsx';
import MultipleSearch from '../UtillComponents/MultipleSearch.jsx';
const subDirectory = import.meta.env.ENV_BASE_URL;
const commonUrl = import.meta.env.ENV_COMMON_BASE_URL;
const BSNavbar3 = ({ optionNames }) => {
const navigate = useNavigate();
const dispatch = useDispatch();
const applyOffer = useApplyOfferto_CardDetail();
const userMenuRef = useRef(null);
const searchInputRef = useRef(null);
const mobileMenuRef = useRef(null);
const SessionData = useSelector(StoredSessionData);
const AppId = SessionData?.AppId;
const CompId = SessionData?.CompId;
const BranchId = SessionData?.BranchId;
const userId = getSession('UserId');
const [drawerOpen, setDrawerOpen] = useState({
favourite: false,
customer: false,
hold: false,
dragItem: false,
reprint: false,
verifyProduct: false,
membership: false,
wholesale: false,
});
const [isHoldEnable, setisisHoldEnable] = useState(false);
const [isUserAccOpen, setIsUserAccOpen] = useState(false);
const [quickAdd, setQuickAdd] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const [isFullscreen, setIsFullscreen] = useState(false);
const [multiple, setMultiple] = useState(false);
const GlobEstBooking = useSelector(GlobalEstimateBooking);
const compBranchData = useSelector(GlobalCompBranchData);
const userProfileData = useSelector(userDataByUserId);
const appPreferences = useSelector(ApplicationPreferences);
const preferences = useSelector(PreferenceData);
const orderType = useSelector(GlobalOrderType);
const bookingType = useSelector(GlobalBookingType, shallowEqual);
const layoutData = useSelector(getTemplateData);
const OtherServicesglobal = useSelector(GlobalOtherSevices);
const preOrderPendingCount = useSelector(GlobalPreOrderPendingCount);
const comboRedirectionToDefaultLayoutForParking = useSelector(
GlobalComboRedirectionToDefaultLayoutForParking
);
const Holddata = useSelector(globalholddata);
const OrderCardDetail = useSelector(GlobalOrderCardDetails);
const FeatureAddonData = useSelector(GlobalFeatAddOnData);
const tableData = useSelector(GlobalOrderStatus);
const BookingTypeBoth = useSelector(GlobalBookingTypeBoth);
const OrderOfferStatus = useSelector(Global_OfferStatus);
const GlobaluseOptions = useSelector(GlobalCommonPaymentOptions);
const SelCustId = useSelector(GlobalSelCustId);
const Estimation = preferences?.[0]?.SettingDtlDetails?.find(
(item) => item.SettingIdName === 'Estimation'
);
const ScanLayoutScreen = preferences?.[0]?.SettingDtlDetails?.find(
(item) => item.SettingIdName === 'ScanLayout'
);
const verifyproduct = preferences?.[0]?.SettingDtlDetails?.find(
(item) =>
item.SettingIdName === 'VerifyProduct' && item.SettingValue === 'Y'
);
const Parking = preferences?.[0]?.SettingDtlDetails?.find(
(item) => item.SettingIdName === 'Parking' && item.SettingValue === 'Y'
);
const commonModulePreference = appPreferences?.find(
(preference) => preference?.PreferredCatName === 'Common Module'
)?.PreferenceCatDetails;
const sportsAppPreference = commonModulePreference?.find(
(preference) =>
preference?.PreferredSubCatName === 'SportsApp' &&
preference?.PreferredStatus === 'Y'
);
const {
searchOption,
reprintOption,
quickAddOption,
dineInOption,
takeAwayOption,
offerOption,
extraChargeOption,
holdOption,
addCustomerOption,
} = useMemo(() => {
const navbarOptions = layoutData?.BookingNavbar?.[1];
return {
searchOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'search'
),
reprintOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'reprint'
),
quickAddOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'quickadd'
),
dineInOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'dinein'
),
takeAwayOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'takeaway'
),
offerOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'offer'
),
extraChargeOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'extracharge'
),
holdOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'hold'
),
addCustomerOption: navbarOptions?.find(
(option) => option?.OptionName?.toLowerCase() === 'addcustomer'
),
};
}, [layoutData]);
const [preOrderOpen, setPreOrderOpen] = useState(false);
const [preOrderhiseandShow, setpreOrderhiseandShow] = useState(false);
const [OtherServiceStatus, setOtherServiceStatus] = useState(false);
// Memoized preference data
const { dineInPreference, takeAwayPreference } = useMemo(() => {
const bookingTypePref =
appPreferences?.find((p) => p?.PreferredCatName === 'Booking Type')
?.PreferenceCatDetails || [];
return {
dineInPreference: bookingTypePref.find(
(p) =>
p?.PreferredSubCatName?.toLowerCase() === 'dine in' &&
p?.PreferredStatus === 'Y'
),
takeAwayPreference: bookingTypePref.find(
(p) =>
p?.PreferredSubCatName?.toLowerCase() === 'take away' &&
p?.PreferredStatus === 'Y'
),
};
}, [appPreferences]);
const SalesMode = preferences?.[0]?.SettingDtlDetails?.find(
(item) => item.SettingIdName === 'Sales Mode'
);
const { preferenceOffer, dineIn } = useMemo(() => {
return {
preferenceOffer:
preferences?.[0]?.['SettingDtlDetails']?.find(
(item) => item.SettingIdName === 'Offer'
)?.SettingValue === 'Y',
dineIn: preferences?.[0]?.['SettingDtlDetails'].find(
(item) => item.SettingIdName === 'DineIn' && item?.SettingValue === 'Y'
),
};
}, [preferences]);
console.log(dineIn, dineInPreference, 'dineInPreference');
const BSComboNavbar = useMemo(() => {
const layout = optionNames?.BookingLayout?.[0];
return layout === 'Combo1'
? optionNames?.BookingCombo1
: optionNames?.BookingCombo2;
}, [optionNames]);
const OfferCheckedInSetup = useMemo(() => {
return BSComboNavbar?.[1]?.some((opt) => opt.OptionName === 'Offer');
}, [BSComboNavbar]);
useEffect(() => {
dispatch(getUserProfile({ UserId: userId, ActiveStatus: 'A' })).unwrap();
}, [userId]);
useEffect(() => {
handleOtherData();
}, []);
useEffect(() => {
getPaymentOptionFeature();
}, [GlobaluseOptions, SelCustId]);
const getPaymentOptionFeature = async () => {
const filterSalesPayment = GlobaluseOptions?.filter(
(item) => item?.FlowName?.toLowerCase() === 'sales'
);
let filterPayCounter = filterSalesPayment?.[0]?.OptionDetails?.filter(
(item) => item?.OptionName?.toLowerCase() === 'pay at the counter'
);
// If customer NOT selected → remove credit mode
if (!SelCustId) {
filterPayCounter = filterPayCounter?.map((option) => ({
...option,
ModeDetails: option?.ModeDetails?.filter(
(mode) => mode?.ModeName?.toLowerCase() !== 'credit'
),
}));
}
setisisHoldEnable(filterPayCounter?.[0]?.ModeDetails?.length > 0);
};
useEffect(() => {
const handleClickOutside = (event) => {
if (userMenuRef.current && !userMenuRef.current.contains(event.target)) {
setIsUserAccOpen(false);
}
if (
mobileMenuRef.current &&
!mobileMenuRef.current.contains(event.target) &&
!event.target.closest('.mobile-toggle-btn')
) {
setIsMobileMenuOpen(false);
}
};
const handleEscKey = (event) => {
if (event.key === 'Escape') {
setIsUserAccOpen(false);
setIsMobileMenuOpen(false);
}
};
if (isUserAccOpen || isMobileMenuOpen) {
document.addEventListener('mousedown', handleClickOutside);
document.addEventListener('keydown', handleEscKey);
}
return () => {
document.removeEventListener('mousedown', handleClickOutside);
document.removeEventListener('keydown', handleEscKey);
};
}, [isUserAccOpen, isMobileMenuOpen]);
const handleDineInNavigate = useCallback(async () => {
navigate(`${subDirectory}sales/dine-in`);
dispatch(changeBookingType('Dine In'));
dispatch(changeEstimateBooking('Sales'));
if (orderType === 'Hold') {
dispatch(changeReorderHoldDetails({}));
dispatch(changeReorderProductDetails([]));
if (OfferCheckedInSetup && preferenceOffer) {
await applyOffer([]);
} else {
dispatch(changeOrderCardDetails([]));
}
}
}, [
navigate,
dispatch,
orderType,
OfferCheckedInSetup,
preferenceOffer,
applyOffer,
]);
const handleTakeAway = () => dispatch(changeBookingType('TakeAway'));
const handleUserAcc = () => setIsUserAccOpen((prev) => !prev);
const handleHomePageNavigate = () => navigate(`${subDirectory}app-page/home`);
const handleMobileMenuToggle = () => setIsMobileMenuOpen((prev) => !prev);
const handleFullscreen = async () => {
if (!isFullscreen) {
try {
await document.documentElement.requestFullscreen();
setIsFullscreen(true);
} catch (error) {
console.error('Fullscreen error:', error);
}
} else {
try {
if (document.fullscreenElement) {
await document.exitFullscreen();
}
setIsFullscreen(false);
} catch (error) {
console.error('Exit fullscreen error:', error);
}
}
};
const renderWithTooltip = (element, title, placement = 'bottom') => (