import { GetRoomEngine, GetSessionDataManager } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, PropsWithChildren, ReactNode, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import wiredBgLeft from '../../../assets/images/wired/wired_bg_left.png'; import wiredBgRight from '../../../assets/images/wired/wired_bg_right.png'; import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWired, useWiredTools } from '../../../hooks'; import { WiredFurniSelectorView } from './WiredFurniSelectorView'; export interface WiredBaseViewProps { wiredType: string; requiresFurni: number; hasSpecialInput: boolean; save: () => void; validate?: () => boolean; cardStyle?: CSSProperties; footer?: ReactNode; footerCollapsible?: boolean; selectionPreview?: ReactNode; } export const WiredBaseView: FC> = props => { const WIRED_CARD_WIDTH = 244; const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined, footer = null, footerCollapsible = true, selectionPreview = null } = props; const [ wiredName, setWiredName ] = useState(null); const [ needsSave, setNeedsSave ] = useState(false); const [ showFooter, setShowFooter ] = useState(false); const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, setAllowsFurni = null, saveWired = null } = useWired(); const { roomSettings } = useWiredTools(); const clearRoomAreaSelection = () => { GetRoomEngine().areaSelectionManager.clearHighlight(); GetRoomEngine().areaSelectionManager.deactivate(); }; const onClose = () => { clearRoomAreaSelection(); WiredSelectionVisualizer.clearAllSelectionShaders(); setTrigger(null); }; const onSave = () => { if(!roomSettings.canModify) return; if(validate && !validate()) return; if(save) save(); setNeedsSave(true); }; useEffect(() => { if(!needsSave) return; saveWired(); setNeedsSave(false); }, [ needsSave, saveWired ]); useEffect(() => { if(!trigger) return; setShowFooter(false); WiredSelectionVisualizer.clearAllSelectionShaders(); const spriteId = (trigger.spriteId || -1); const furniData = GetSessionDataManager().getFloorItemData(spriteId); if(!furniData) { setWiredName(('NAME: ' + spriteId)); } else { setWiredName(furniData.name); } if(hasSpecialInput) { setIntParams(trigger.intData); setStringParam(trigger.stringData); } }, [ trigger, hasSpecialInput, setIntParams, setStringParam ]); useEffect(() => { if(!trigger) return; setFurniIds(prevValue => { if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); if(requiresFurni <= WiredFurniType.STUFF_SELECTION_OPTION_NONE) return []; if(trigger.selectedItems && trigger.selectedItems.length) { WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); return trigger.selectedItems; } return []; }); }, [ trigger, requiresFurni, setFurniIds ]); useEffect(() => { return () => clearRoomAreaSelection(); }, []); useEffect(() => { if(!trigger) return; setAllowsFurni(requiresFurni); }, [ trigger, requiresFurni, setAllowsFurni ]); const resolvedCardStyle: CSSProperties = { ...cardStyle }; resolvedCardStyle.width = WIRED_CARD_WIDTH; resolvedCardStyle.minWidth = WIRED_CARD_WIDTH; resolvedCardStyle.maxWidth = WIRED_CARD_WIDTH; resolvedCardStyle.resize = 'none'; return (
{ wiredName }
{ !!children &&
} { !!children &&
{ children }
} { (requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) && <>
{ selectionPreview || }
} { footer && <>
{ footerCollapsible ? ( <> { showFooter &&
{ footer }
} ) : footer }
}
); };