import { GetSessionDataManager, HabboClubLevelEnum} from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useMemo, useState } from 'react'; import { Base, Grid, Flex, NitroCardView, NitroCardHeaderView, NitroCardTabsView, NitroCardTabsItemView, NitroCardContentView, Text, LayoutCurrencyIcon } from '../../common'; import { useRoom } from '../../hooks'; import { GetClubMemberLevel, GetConfigurationValue } from '../../api'; interface ItemData { id: number; isHcOnly: boolean; minRank: number; isAmbassadorOnly: boolean; selectable: boolean; } interface BackgroundsViewProps { setIsVisible: Dispatch>; selectedBackground: number; setSelectedBackground: Dispatch>; selectedStand: number; setSelectedStand: Dispatch>; selectedOverlay: number; setSelectedOverlay: Dispatch>; } const TABS = ['backgrounds', 'stands', 'overlays'] as const; type TabType = typeof TABS[number]; export const BackgroundsView: FC = ({ setIsVisible, selectedBackground, setSelectedBackground, selectedStand, setSelectedStand, selectedOverlay, setSelectedOverlay }) => { const [activeTab, setActiveTab] = useState('backgrounds'); const { roomSession } = useRoom(); const userData = useMemo(() => ({ isHcMember: GetClubMemberLevel() >= HabboClubLevelEnum.CLUB, securityLevel: GetSessionDataManager().canChangeName, isAmbassador: GetSessionDataManager().isAmbassador }), []); const processData = useCallback((configData: any[], dataType: string): ItemData[] => { if (!configData?.length) return []; return configData .filter(item => { const meetsRank = userData.securityLevel >= item.minRank; const ambassadorEligible = !item.isAmbassadorOnly || userData.isAmbassador; return item.isHcOnly || (meetsRank && ambassadorEligible); }) .map(item => ({ id: item[`${dataType}Id`], ...item, selectable: !item.isHcOnly || userData.isHcMember })); }, [userData]); const allData = useMemo(() => ({ backgrounds: processData(GetConfigurationValue('backgrounds.data'), 'background'), stands: processData(GetConfigurationValue('stands.data'), 'stand'), overlays: processData(GetConfigurationValue('overlays.data'), 'overlay') }), [processData]); const handleSelection = useCallback((id: number) => { if (!roomSession) return; const setters = { backgrounds: setSelectedBackground, stands: setSelectedStand, overlays: setSelectedOverlay }; const currentValues = { backgrounds: selectedBackground, stands: selectedStand, overlays: selectedOverlay }; setters[activeTab](id); const newValues = { ...currentValues, [activeTab]: id }; roomSession.sendBackgroundMessage( newValues.backgrounds, newValues.stands, newValues.overlays ); }, [activeTab, roomSession, selectedBackground, selectedStand, selectedOverlay, setSelectedBackground, setSelectedStand, setSelectedOverlay]); const renderItem = useCallback((item: ItemData, type: string) => ( item.selectable && handleSelection(item.id)} className={item.selectable ? '' : 'non-selectable'} > {item.isHcOnly && } ), [handleSelection]); return ( setIsVisible(false)} /> {TABS.map(tab => ( setActiveTab(tab)} > {tab.charAt(0).toUpperCase() + tab.slice(1)} ))} Select an Option {allData[activeTab].map(item => renderItem(item, activeTab.slice(0, -1)))} ); };