diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 46ffa6c..4c4f0db 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,5 +1,5 @@ import { GetSessionDataManager } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, PropsWithChildren, useEffect, useState } from 'react'; +import { CSSProperties, FC, PropsWithChildren, ReactNode, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWired } from '../../../hooks'; @@ -13,11 +13,12 @@ export interface WiredBaseViewProps save: () => void; validate?: () => boolean; cardStyle?: CSSProperties; + footer?: ReactNode; } export const WiredBaseView: FC> = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined } = props; + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false, cardStyle = undefined, footer = null } = props; const [ wiredName, setWiredName ] = useState(null); const [ wiredDescription, setWiredDescription ] = useState(null); const [ needsSave, setNeedsSave ] = useState(false); @@ -83,9 +84,14 @@ export const WiredBaseView: FC> = props => return []; }); } + }, [ trigger, hasSpecialInput, setIntParams, setStringParam, setFurniIds ]); + + useEffect(() => + { + if(!trigger) return; setAllowsFurni(requiresFurni); - }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds, setAllowsFurni ]); + }, [ trigger, requiresFurni, setAllowsFurni ]); return ( @@ -105,6 +111,11 @@ export const WiredBaseView: FC> = props =>
} + { footer && + <> +
+ { footer } + }
diff --git a/src/components/wired/views/WiredSourcesSelector.tsx b/src/components/wired/views/WiredSourcesSelector.tsx new file mode 100644 index 0000000..db072a6 --- /dev/null +++ b/src/components/wired/views/WiredSourcesSelector.tsx @@ -0,0 +1,92 @@ +import { FC } from 'react'; +import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; +import { LocalizeText } from '../../../api'; +import { Button, Text } from '../../../common'; + +export const FURNI_SOURCES = [ + { value: 0, label: 'wiredfurni.params.sources.furni.0' }, + { value: 100, label: 'wiredfurni.params.sources.furni.100' }, + { value: 200, label: 'wiredfurni.params.sources.furni.200' }, + { value: 201, label: 'wiredfurni.params.sources.furni.201' } +]; + +export const USER_SOURCES = [ + { value: 0, label: 'wiredfurni.params.sources.users.0' }, + { value: 200, label: 'wiredfurni.params.sources.users.200' }, + { value: 201, label: 'wiredfurni.params.sources.users.201' } +]; + +interface WiredSourcesSelectorProps +{ + showFurni?: boolean; + showUsers?: boolean; + furniSource?: number; + userSource?: number; + onChangeFurni?: (source: number) => void; + onChangeUsers?: (source: number) => void; +} + +export const WiredSourcesSelector: FC = props => +{ + const { showFurni = false, showUsers = false, furniSource = 0, userSource = 0, onChangeFurni = null, onChangeUsers = null } = props; + + const furniIndex = Math.max(0, FURNI_SOURCES.findIndex(s => s.value === furniSource)); + const userIndex = Math.max(0, USER_SOURCES.findIndex(s => s.value === userSource)); + + const prevFurni = () => + { + const next = (furniIndex - 1 + FURNI_SOURCES.length) % FURNI_SOURCES.length; + onChangeFurni && onChangeFurni(FURNI_SOURCES[next].value); + }; + + const nextFurni = () => + { + const next = (furniIndex + 1) % FURNI_SOURCES.length; + onChangeFurni && onChangeFurni(FURNI_SOURCES[next].value); + }; + + const prevUsers = () => + { + const next = (userIndex - 1 + USER_SOURCES.length) % USER_SOURCES.length; + onChangeUsers && onChangeUsers(USER_SOURCES[next].value); + }; + + const nextUsers = () => + { + const next = (userIndex + 1) % USER_SOURCES.length; + onChangeUsers && onChangeUsers(USER_SOURCES[next].value); + }; + + if(!showFurni && !showUsers) return null; + + return ( +
+ { showFurni && + <> + { LocalizeText('wiredfurni.params.sources.furni.title') } +
+ +
+ { LocalizeText(FURNI_SOURCES[furniIndex].label) } +
+ +
+ } + + { showFurni && showUsers &&
} + + { showUsers && + <> + { LocalizeText('wiredfurni.params.sources.users.title') } +
+ +
+ { LocalizeText(USER_SOURCES[userIndex].label) } +
+ +
+ } +
+ ); +}; + diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 4fea3f4..eaa30fc 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -1,5 +1,5 @@ import { WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, PropsWithChildren, useEffect } from 'react'; +import { CSSProperties, FC, PropsWithChildren, ReactNode, useEffect } from 'react'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; @@ -13,11 +13,12 @@ export interface WiredActionBaseViewProps validate?: () => boolean; cardStyle?: CSSProperties; hideDelay?: boolean; + footer?: ReactNode; } export const WiredActionBaseView: FC> = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, hasSpecialInput = false, children = null, cardStyle = undefined, hideDelay = false } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, hasSpecialInput = false, children = null, cardStyle = undefined, hideDelay = false, footer = null } = props; const { trigger = null, actionDelay = 0, setActionDelay = null } = useWired(); useEffect(() => @@ -26,7 +27,7 @@ export const WiredActionBaseView: FC }, [ trigger, setActionDelay ]); return ( - + { children } { !hideDelay && !!children &&
} { !hideDelay &&
diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index 9576ea0..e78ce8a 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -4,27 +4,38 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotFollowAvatarView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); const [ followMode, setFollowMode ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName); - setIntParams([ followMode ]); + setIntParams([ followMode, userSource ]); }; useEffect(() => { setBotName(trigger.stringData); setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index 0dc2bc4..472e46f 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -4,6 +4,7 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -12,21 +13,31 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => const [ botName, setBotName ] = useState(''); const [ handItemId, setHandItemId ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName); - setIntParams([ handItemId ]); + setIntParams([ handItemId, userSource ]); }; useEffect(() => { setBotName(trigger.stringData); setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotMoveView.tsx b/src/components/wired/views/actions/WiredActionBotMoveView.tsx index 644b34e..d07bc7b 100644 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ b/src/components/wired/views/actions/WiredActionBotMoveView.tsx @@ -4,21 +4,45 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotMoveView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = () => setStringParam(botName); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const save = () => + { + setStringParam(botName); + setIntParams([ furniSource ]); + }; useEffect(() => { + if(!trigger) return; + setBotName(trigger.stringData); + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; + return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx index b69a972..4961154 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -4,6 +4,7 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotTalkToAvatarView: FC<{}> = props => { @@ -11,11 +12,16 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => const [ message, setMessage ] = useState(''); const [ talkMode, setTalkMode ] = useState(-1); const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); + setIntParams([ talkMode, userSource ]); }; useEffect(() => @@ -26,10 +32,15 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx index 1979930..725f236 100644 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx @@ -4,21 +4,45 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionBotTeleportView: FC<{}> = props => { const [ botName, setBotName ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); - const save = () => setStringParam(botName); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const save = () => + { + setStringParam(botName); + setIntParams([ furniSource ]); + }; useEffect(() => { + if(!trigger) return; + setBotName(trigger.stringData); + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; + return ( - + }>
{ LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx index 69c17fe..9bb7a1f 100644 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx @@ -1,8 +1,37 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionCallAnotherStackView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionChaseView.tsx b/src/components/wired/views/actions/WiredActionChaseView.tsx index d0e1c41..4067a8d 100644 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ b/src/components/wired/views/actions/WiredActionChaseView.tsx @@ -1,8 +1,37 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionChaseView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionChatView.tsx b/src/components/wired/views/actions/WiredActionChatView.tsx index 8f622c2..8601d23 100644 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ b/src/components/wired/views/actions/WiredActionChatView.tsx @@ -4,21 +4,37 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionChatView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); - const save = () => setStringParam(message); + const save = () => + { + setStringParam(message); + setIntParams([ userSource ]); + }; useEffect(() => { setMessage(trigger.stringData); + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.message') } ('wired.action.chat.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx index e3e5776..82ff1c2 100644 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ b/src/components/wired/views/actions/WiredActionFleeView.tsx @@ -1,8 +1,37 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionFleeView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 903238b..91c1468 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -5,6 +5,7 @@ import { Button, Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionGiveRewardView: FC<{}> = props => { @@ -15,6 +16,11 @@ export const WiredActionGiveRewardView: FC<{}> = props => const [ limitationInterval, setLimitationInterval ] = useState(1); const [ rewards, setRewards ] = useState<{ isBadge: boolean, itemCode: string, probability: number }[]>([]); const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 4) return trigger.intData[4]; + return 0; + }); const addReward = () => setRewards(rewards => [ ...rewards, { isBadge: false, itemCode: '', probability: null } ]); @@ -59,7 +65,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => if(stringRewards.length > 0) { setStringParam(stringRewards.join(';')); - setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); + setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval, userSource ]); } }; @@ -88,11 +94,16 @@ export const WiredActionGiveRewardView: FC<{}> = props => setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); + setUserSource((trigger.intData.length > 4) ? trigger.intData[4] : 0); setRewards(readRewards); }, [ trigger ]); return ( - + }>
setLimitEnabled(event.target.checked) } /> { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } diff --git a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx index 2077581..402b69d 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx @@ -3,14 +3,20 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionGiveScoreView: FC<{}> = props => { const [ points, setPoints ] = useState(1); const [ time, setTime ] = useState(1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return 0; + }); - const save = () => setIntParams([ points, time ]); + const save = () => setIntParams([ points, time, userSource ]); useEffect(() => { @@ -24,10 +30,16 @@ export const WiredActionGiveScoreView: FC<{}> = props => setPoints(1); setTime(1); } + + setUserSource((trigger.intData.length > 2) ? trigger.intData[2] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => { const [ selectedTeam, setSelectedTeam ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); - const save = () => setIntParams([ selectedTeam ]); + const save = () => setIntParams([ selectedTeam, userSource ]); useEffect(() => { setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.team') } { [ 1, 2, 3, 4 ].map(team => diff --git a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx index 002426d..5ed851b 100644 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx @@ -4,21 +4,37 @@ import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionKickFromRoomView: FC<{}> = props => { const [ message, setMessage ] = useState(''); - const { trigger = null, setStringParam = null } = useWired(); + const { trigger = null, setStringParam = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); - const save = () => setStringParam(message); + const save = () => + { + setStringParam(message); + setIntParams([ userSource ]); + }; useEffect(() => { setMessage(trigger.stringData); + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.message') } ('wired.action.kick.from.room.max.length', 100) } type="text" value={ message } onChange={ event => setMessage(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx index 9202ed3..2a5ceb3 100644 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx @@ -1,8 +1,32 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionLeaveTeamView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return 0; + }); + + useEffect(() => + { + if(!trigger) return; + if(trigger.intData.length >= 1) setUserSource(trigger.intData[0]); + else setUserSource(0); + }, [ trigger ]); + + const save = () => setIntParams([ userSource ]); + + return ( + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index d30b43b..c7fff0d 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -3,6 +3,7 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const directionOptions: { value: number, icon: string }[] = [ { @@ -30,8 +31,13 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, rotation ]); + const save = () => setIntParams([ movement, rotation, furniSource ]); useEffect(() => { @@ -45,10 +51,21 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => setMovement(-1); setRotation(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + return ( - + }>
{ LocalizeText('wiredfurni.params.startdir') }
diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index 64ece78..cb02f7b 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -3,6 +3,7 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const directionOptions: { value: number, icon: string }[] = [ { @@ -28,8 +29,13 @@ export const WiredActionMoveFurniToView: FC<{}> = props => const [ spacing, setSpacing ] = useState(-1); const [ movement, setMovement ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, spacing ]); + const save = () => setIntParams([ movement, spacing, furniSource ]); useEffect(() => { @@ -43,10 +49,21 @@ export const WiredActionMoveFurniToView: FC<{}> = props => setSpacing(-1); setMovement(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE; + return ( - + }>
{ LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } = props => const [ movement, setMovement ] = useState(-1); const [ rotation, setRotation ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 2) return trigger.intData[2]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ movement, rotation ]); + const save = () => setIntParams([ movement, rotation, furniSource ]); useEffect(() => { @@ -57,10 +63,21 @@ export const WiredActionMoveFurniView: FC<{}> = props => setMovement(-1); setRotation(-1); } + + if(trigger.intData.length > 2) setFurniSource(trigger.intData[2]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + return ( - + }>
{ LocalizeText('wiredfurni.params.movefurni') }
diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index 7011c02..0645834 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -4,27 +4,38 @@ import { Slider, Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { NitroInput } from '../../../../layout'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionMuteUserView: FC<{}> = props => { const [ time, setTime ] = useState(-1); const [ message, setMessage ] = useState(''); const { trigger = null, setIntParams = null, setStringParam = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); const save = () => { - setIntParams([ time ]); + setIntParams([ time, userSource ]); setStringParam(message); }; useEffect(() => { setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); setMessage(trigger.stringData); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } +{ + if(!data || !data.length) return []; + + const ids = new Set(); + + for(const part of data.split(/[;,\t]/)) + { + const trimmed = part.trim(); + if(!trimmed.length) continue; + + const value = parseInt(trimmed, 10); + if(!isNaN(value) && value > 0) ids.add(value); + } + + return Array.from(ids); +}; + +const serializeForwardIds = (ids: number[]): string => +{ + if(!ids || !ids.length) return ''; + + return ids.filter(id => (id > 0)).join(FORWARD_ITEM_DELIMITER); +}; export const WiredActionSendSignalView: FC<{}> = () => { - const [ antennaSource, setAntennaSource ] = useState(ANTENNA_PICKED); - const [ furniForward, setFurniForward ] = useState(FORWARD_NONE); - const [ userForward, setUserForward ] = useState(FORWARD_NONE); + const [ furniSource, setFurniSource ] = useState(SOURCE_TRIGGER); + const [ userSource, setUserSource ] = useState(SOURCE_TRIGGER); const [ signalPerFurni, setSignalPerFurni ] = useState(false); const [ signalPerUser, setSignalPerUser ] = useState(false); - const [ showAdvanced, setShowAdvanced ] = useState(false); + const [ antennaIds, setAntennaIds ] = useState([]); + const [ forwardFurniIds, setForwardFurniIds ] = useState([]); + const [ selectionMode, setSelectionMode ] = useState('antenna'); - const { trigger = null, setIntParams } = useWired(); + const { trigger = null, furniIds = [], setFurniIds = null, setIntParams = null, setStringParam = null, setAllowedInteractionTypes = null } = useWired(); useEffect(() => { if(!trigger) return; const p = trigger.intData; - if(p.length >= 1) setAntennaSource(p[0]); - if(p.length >= 2) setFurniForward(p[1]); - if(p.length >= 3) setUserForward(p[2]); - if(p.length >= 4) setSignalPerFurni(p[3] === 1); - if(p.length >= 5) setSignalPerUser(p[4] === 1); + if(p.length > 1) setFurniSource(p[1]); + else setFurniSource(SOURCE_TRIGGER); - if(p.length >= 1 && (p[0] !== ANTENNA_PICKED || p[1] !== FORWARD_NONE || - p[2] !== FORWARD_NONE || (p.length >= 4 && p[3] === 1) || (p.length >= 5 && p[4] === 1))) - { - setShowAdvanced(true); - } + if(p.length > 2) setUserSource(p[2]); + else setUserSource(SOURCE_TRIGGER); + + setSignalPerFurni(p.length > 3 && p[3] === 1); + setSignalPerUser(p.length > 4 && p[4] === 1); + + setAntennaIds(trigger.selectedItems ?? []); + setForwardFurniIds(parseForwardIds(trigger.stringData)); + setSelectionMode('antenna'); }, [ trigger ]); + useEffect(() => + { + if(selectionMode === 'antenna') setAllowedInteractionTypes(ANTENNA_INTERACTION_TYPES); + else setAllowedInteractionTypes(null); + + return () => setAllowedInteractionTypes(null); + }, [ selectionMode, setAllowedInteractionTypes ]); + + useEffect(() => + { + if(selectionMode === 'antenna') setAntennaIds(furniIds); + else setForwardFurniIds(furniIds); + }, [ furniIds, selectionMode ]); + + const applySelection = useCallback((nextIds: number[]) => + { + if(!setFurniIds) return; + + setFurniIds(prev => + { + if(prev && prev.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prev); + if(nextIds && nextIds.length) WiredSelectionVisualizer.applySelectionShaderToFurni(nextIds); + + return [ ...nextIds ]; + }); + }, [ setFurniIds ]); + + const switchSelection = useCallback((mode: SelectionMode) => + { + if(mode === selectionMode) return; + if(mode === 'furni' && furniSource !== SOURCE_SELECTED) return; + + const nextIds = (mode === 'antenna') ? antennaIds : forwardFurniIds; + applySelection(nextIds); + setSelectionMode(mode); + }, [ selectionMode, furniSource, antennaIds, forwardFurniIds, applySelection ]); + + const onChangeFurniSource = (next: number) => + { + if(forwardFurniIds.length) setForwardFurniIds([]); + + if(selectionMode === 'furni') + { + applySelection(antennaIds); + setSelectionMode('antenna'); + } + + setFurniSource(next); + }; + const save = useCallback(() => { + if(selectionMode === 'furni') + { + setSelectionMode('antenna'); + applySelection(antennaIds); + } + + const antennaSource = (antennaIds && antennaIds.length) ? antennaIds[0] : 0; + setIntParams([ antennaSource, - furniForward, - userForward, + furniSource, + userSource, signalPerFurni ? 1 : 0, signalPerUser ? 1 : 0, + 0, ]); - }, [ antennaSource, furniForward, userForward, signalPerFurni, signalPerUser, setIntParams ]); + + setStringParam(serializeForwardIds(forwardFurniIds)); + }, [ selectionMode, antennaIds, furniSource, userSource, signalPerFurni, signalPerUser, forwardFurniIds, setIntParams, setStringParam, applySelection, setSelectionMode ]); + + const selectionLimit = trigger?.maximumItemSelectionCount ?? 0; + const forwardSelectionEnabled = (furniSource === SOURCE_SELECTED); return ( -
- -
setShowAdvanced(!showAdvanced) }> - - { showAdvanced - ? LocalizeText('wiredfurni.params.hide_advanced') - : LocalizeText('wiredfurni.params.show_advanced') } - + cardStyle={ { width: '400px' } } + save={ save } + footer={ ( + + ) }> +
+
+ Antenne selezionate +
+ + { selectionLimit ? `${ antennaIds.length }/${ selectionLimit }` : antennaIds.length } +
+
+
+ Furni selezionati +
+ + { selectionLimit ? `${ forwardFurniIds.length }/${ selectionLimit }` : forwardFurniIds.length } +
- { showAdvanced && <> - - { /* --- Antennas --- */ } - { LocalizeText('wiredfurni.params.sources.furni.title.signal_antenna') } -
- setAntennaSource(antennaSource === ANTENNA_PICKED ? ANTENNA_TRIGGER : ANTENNA_PICKED) } /> - -
- - { /* --- Furni to forward --- */ } - { LocalizeText('wiredfurni.params.sources.furni.title.signal_forward') } -
-
- setFurniForward(e.target.checked ? FORWARD_TRIGGER : FORWARD_NONE) } /> - -
- { furniForward !== FORWARD_NONE && - - } -
- - { /* --- Users to forward --- */ } - { LocalizeText('wiredfurni.params.sources.users.title.signal_forward') } -
-
- setUserForward(e.target.checked ? FORWARD_TRIGGER : FORWARD_NONE) } /> - -
- { userForward !== FORWARD_NONE && - - } -
- - { LocalizeText('wiredfurni.params.signal.options') } -
- setSignalPerFurni(e.target.checked) } /> - -
-
- setSignalPerUser(e.target.checked) } /> - -
- } - + { LocalizeText('wiredfurni.params.signal.options') } +
+ setSignalPerFurni(e.target.checked) } /> + +
+
+ setSignalPerUser(e.target.checked) } /> + +
); diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index 96b7237..8f31754 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -3,6 +3,7 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionSetFurniStateToView: FC<{}> = props => { @@ -10,18 +11,34 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => const [ directionFlag, setDirectionFlag ] = useState(0); const [ positionFlag, setPositionFlag ] = useState(0); const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length > 3) return trigger.intData[3]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); - const save = () => setIntParams([ stateFlag, directionFlag, positionFlag ]); + const save = () => setIntParams([ stateFlag, directionFlag, positionFlag, furniSource ]); useEffect(() => { setStateFlag(trigger.getBoolean(0) ? 1 : 0); setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); setPositionFlag(trigger.getBoolean(2) ? 1 : 0); + + if(trigger.intData.length > 3) setFurniSource(trigger.intData[3]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); }, [ trigger ]); + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID; + return ( - + }>
{ LocalizeText('wiredfurni.params.conditions') }
diff --git a/src/components/wired/views/actions/WiredActionTeleportView.tsx b/src/components/wired/views/actions/WiredActionTeleportView.tsx index 04ef42d..b526092 100644 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionTeleportView.tsx @@ -1,8 +1,55 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; +import { useWired } from '../../../../hooks'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; export const WiredActionTeleportView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length >= 2) return trigger.intData[1]; + return 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + + if(trigger.intData.length >= 2) setUserSource(trigger.intData[1]); + else setUserSource(0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const save = () => setIntParams([ furniSource, userSource ]); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + + return ( + + } /> + ); }; diff --git a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx index 486aa8e..2055acf 100644 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx @@ -1,8 +1,37 @@ -import { FC } from 'react'; +import { FC, useEffect, useState } from 'react'; import { WiredFurniType } from '../../../../api'; import { WiredActionBaseView } from './WiredActionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; +import { useWired } from '../../../../hooks'; export const WiredActionToggleFurniStateView: FC<{}> = props => { - return ; + const { trigger = null, setIntParams = null } = useWired(); + const [ furniSource, setFurniSource ] = useState(() => + { + if(trigger?.intData?.length >= 1) return trigger.intData[0]; + return (trigger?.selectedItems?.length ?? 0) > 0 ? 100 : 0; + }); + + useEffect(() => + { + if(!trigger) return; + + if(trigger.intData.length >= 1) setFurniSource(trigger.intData[0]); + else setFurniSource((trigger.selectedItems?.length ?? 0) > 0 ? 100 : 0); + }, [ trigger ]); + + const onChangeFurniSource = (next: number) => setFurniSource(next); + + const save = () => setIntParams([ furniSource ]); + + const requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_BY_TYPE_OR_FROM_CONTEXT; + + return ( + } /> + ); }; diff --git a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx index 5c6c391..41df779 100644 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx @@ -3,6 +3,7 @@ import { LocalizeText, WiredFurniType } from '../../../../api'; import { Text } from '../../../../common'; import { useWired } from '../../../../hooks'; import { WiredConditionBaseView } from './WiredConditionBaseView'; +import { WiredSourcesSelector } from '../WiredSourcesSelector'; const ALLOWED_HAND_ITEM_IDS: number[] = [ 2, 5, 7, 8, 9, 10, 27 ]; @@ -10,16 +11,26 @@ export const WiredConditionActorHasHandItemView: FC<{}> = props => { const [ handItemId, setHandItemId ] = useState(-1); const { trigger = null, setIntParams = null } = useWired(); + const [ userSource, setUserSource ] = useState(() => + { + if(trigger?.intData?.length > 1) return trigger.intData[1]; + return 0; + }); - const save = () => setIntParams([ handItemId ]); + const save = () => setIntParams([ handItemId, userSource ]); useEffect(() => { setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUserSource((trigger.intData.length > 1) ? trigger.intData[1] : 0); }, [ trigger ]); return ( - + }>
{ LocalizeText('wiredfurni.params.handitem') }