diff --git a/src/api/wired/WiredSelectionVisualizer.ts b/src/api/wired/WiredSelectionVisualizer.ts index 7f5c332..f5ed561 100644 --- a/src/api/wired/WiredSelectionVisualizer.ts +++ b/src/api/wired/WiredSelectionVisualizer.ts @@ -5,6 +5,12 @@ import { GetRoomEngine } from '..'; export class WiredSelectionVisualizer { private static _selectionShader: NitroFilter = new WiredSelectionFilter([ 1, 1, 1 ], [ 0.6, 0.6, 0.6 ]); + private static _maxItemSelectionCount: number = 0; + + public static setMaxItemSelectionCount(count: number): void + { + WiredSelectionVisualizer._maxItemSelectionCount = count; + } public static show(furniId: number): void { diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 8dc194d..32fe0c3 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -4,115 +4,99 @@ import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroC import { useWired } from '../../../hooks'; import { WiredFurniSelectorView } from './WiredFurniSelectorView'; -export interface WiredBaseViewProps -{ +export interface WiredBaseViewProps { wiredType: string; requiresFurni: number; hasSpecialInput: boolean; save: () => void; validate?: () => boolean; - maxItemSelectionCount?: number; + maxItemSelectionCount?: number; // Optional parameter } -export const WiredBaseView: FC> = props => -{ - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, maxItemSelectionCount = 5 } = props; // Default to 5 - const [ wiredName, setWiredName ] = useState(null); - const [ wiredDescription, setWiredDescription ] = useState(null); - const [ needsSave, setNeedsSave ] = useState(false); - const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, setAllowsFurni = null, saveWired = null } = useWired(); +export const WiredBaseView: FC> = props => { + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, maxItemSelectionCount = 5 } = props; + const [wiredName, setWiredName] = useState(null); + const [wiredDescription, setWiredDescription] = useState(null); + const [needsSave, setNeedsSave] = useState(false); + const { trigger, setTrigger, setIntParams, setStringParam, setFurniIds, setAllowsFurni, saveWired, setMaxItemSelectionCount: setMaxCount } = useWired(); + + useEffect(() => { + setMaxCount(maxItemSelectionCount); + }, [maxItemSelectionCount, setMaxCount]); const onClose = () => setTrigger(null); - - const onSave = () => - { - if(validate && !validate()) return; - - if(save) save(); + const onSave = () => { + if (validate && !validate()) return; + if (save) save(); setNeedsSave(true); - } - - useEffect(() => - { - if(!needsSave) return; + }; + useEffect(() => { + if (!needsSave) return; saveWired(); - setNeedsSave(false); - }, [ needsSave, saveWired ]); + }, [needsSave, saveWired]); - useEffect(() => - { - if(!trigger) return; - - const spriteId = (trigger.spriteId || -1); + useEffect(() => { + if (!trigger) return; + const spriteId = trigger.spriteId || -1; const furniData = GetSessionDataManager().getFloorItemData(spriteId); - if(!furniData) - { - setWiredName(('NAME: ' + spriteId)); - setWiredDescription(('NAME: ' + spriteId)); - } - else - { + if (!furniData) { + setWiredName('NAME: ' + spriteId); + setWiredDescription('NAME: ' + spriteId); + } else { setWiredName(furniData.name); setWiredDescription(furniData.description); } - if(hasSpecialInput) - { + if (hasSpecialInput) { setIntParams(trigger.intData); setStringParam(trigger.stringData); } - - if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) - { - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - if(trigger.selectedItems && trigger.selectedItems.length) - { + if (requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) { + setFurniIds(prevValue => { + if (prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + if (trigger.selectedItems && trigger.selectedItems.length) { WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - return trigger.selectedItems; } - return []; }); } setAllowsFurni(requiresFurni); - - // Set max item selection count - WiredSelectionVisualizer.setMaxItemSelectionCount(maxItemSelectionCount); // Use the passed value - - }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni, maxItemSelectionCount ]); + if (WiredSelectionVisualizer.setMaxItemSelectionCount) { + WiredSelectionVisualizer.setMaxItemSelectionCount(maxItemSelectionCount); + } + }, [trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni, maxItemSelectionCount]); return ( - + - - - - { wiredName } + + + + {wiredName} - { wiredDescription } + {wiredDescription} - { !!children &&
} - { children } - { (requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) && + {!!children &&
} + {children} + {requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE && ( <>
- {/* Pass the count */} - } - - - + + + )} + + +
); -} \ No newline at end of file +}; diff --git a/src/components/wired/views/WiredFurniSelectorView.tsx b/src/components/wired/views/WiredFurniSelectorView.tsx index f2fb5c0..52b2b14 100644 --- a/src/components/wired/views/WiredFurniSelectorView.tsx +++ b/src/components/wired/views/WiredFurniSelectorView.tsx @@ -3,23 +3,25 @@ import { LocalizeText } from '../../../api'; import { Column, Text } from '../../../common'; import { useWired } from '../../../hooks'; -export interface WiredFurniSelectorViewProps -{ +export interface WiredFurniSelectorViewProps { maxItemSelectionCount: number; } -export const WiredFurniSelectorView: FC = props => -{ +export const WiredFurniSelectorView: FC = props => { const { maxItemSelectionCount } = props; - const { trigger = null, furniIds = [] } = useWired(); + const { furniIds, selectObjectForWired } = useWired(); // Enforce the selection limit - const selectionText = LocalizeText('wiredfurni.pickfurnis.caption', [ 'count', 'limit' ], [ furniIds.length.toString(), maxItemSelectionCount.toString() ]); + const selectionText = LocalizeText('wiredfurni.pickfurnis.caption', ['count', 'limit'], [furniIds.length.toString(), maxItemSelectionCount.toString()]); + + const onSelectFurni = (furniId: number) => { + selectObjectForWired(furniId, 0); + }; return ( - - { selectionText } - { LocalizeText('wiredfurni.pickfurnis.desc') } + + {selectionText} + {LocalizeText('wiredfurni.pickfurnis.desc')} ); -} +}; diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx index 172e591..6b116c7 100644 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ b/src/components/wired/views/conditions/WiredConditionBaseView.tsx @@ -2,23 +2,26 @@ import { FC, PropsWithChildren } from 'react'; import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; -export interface WiredConditionBaseViewProps -{ +export interface WiredConditionBaseViewProps { hasSpecialInput: boolean; requiresFurni: number; save: () => void; maxItemSelectionCount?: number; // Optional parameter } -export const WiredConditionBaseView: FC> = props => -{ +export const WiredConditionBaseView: FC> = props => { const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null, maxItemSelectionCount = 5 } = props; const onSave = () => (save && save()); return ( - - { children } + + {children} ); -} +} \ No newline at end of file diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx index 35c9f43..1d7aad5 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx @@ -1,8 +1,42 @@ -import { FC } from 'react'; -import { WiredFurniType } from '../../../../api'; +import { FC, useState } from 'react'; +import { LocalizeText, WiredFurniType } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; import { WiredConditionBaseView } from './WiredConditionBaseView'; -export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => -{ - return ; -} \ No newline at end of file +export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => { + const [requireAll, setRequireAll] = useState(5); // Default to 5 + + const handleRadioChange = (value: number) => { + setRequireAll(value); + }; + + return ( + + + {LocalizeText('wiredfurni.params.requireall.caption')} + {[1, 5].map(value => ( + + handleRadioChange(value)} + /> + + + ))} + + + ); +}; diff --git a/src/hooks/wired/useWired.ts b/src/hooks/wired/useWired.ts index c4628f4..724d59b 100644 --- a/src/hooks/wired/useWired.ts +++ b/src/hooks/wired/useWired.ts @@ -13,7 +13,8 @@ const useWiredState = () => const [ furniIds, setFurniIds ] = useState([]); const [ actionDelay, setActionDelay ] = useState(0); const [ allowsFurni, setAllowsFurni ] = useState(WiredFurniType.STUFF_SELECTION_OPTION_NONE); - const { showConfirm = null } = useNotification(); + const [ maxItemSelectionCount, setMaxItemSelectionCount ] = useState(5); + const { showConfirm } = useNotification(); const saveWired = () => { @@ -69,7 +70,7 @@ const useWiredState = () => WiredSelectionVisualizer.hide(objectId); } - else if(newFurniIds.length < trigger.maximumItemSelectionCount) + else if(newFurniIds.length < maxItemSelectionCount) { newFurniIds.push(objectId); @@ -127,7 +128,7 @@ const useWiredState = () => } }, [ trigger ]); - return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired }; + return { trigger, setTrigger, intParams, setIntParams, stringParam, setStringParam, furniIds, setFurniIds, actionDelay, setActionDelay, setAllowsFurni, saveWired, selectObjectForWired, maxItemSelectionCount, setMaxItemSelectionCount }; } -export const useWired = () => useBetween(useWiredState); +export const useWired = () => useBetween(useWiredState); \ No newline at end of file