Conditions

This commit is contained in:
MyNameIsBatman 2021-06-28 23:11:11 -03:00
parent 537987b85e
commit 3e914a601a
21 changed files with 491 additions and 3 deletions

View File

@ -1,4 +1,4 @@
import { Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition } from 'nitro-renderer';
import { ConditionDefinition, Triggerable, TriggerDefinition, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateTriggerMessageComposer, WiredActionDefinition } from 'nitro-renderer';
import { FC, useCallback, useMemo, useState } from 'react';
import { GetConnection } from '../../api';
import { WiredEvent } from '../../events';
@ -34,6 +34,11 @@ export const WiredView: FC<WiredFurniSelectorViewProps> = props =>
{
GetConnection().send(new UpdateTriggerMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode));
}
if(trigger instanceof ConditionDefinition)
{
GetConnection().send(new UpdateConditionMessageComposer(trigger.id, intParams, stringParam, furniIds, trigger.stuffTypeSelectionCode));
}
}, [ trigger, intParams, stringParam, furniIds, actionDelay ]);
useUiEvent(WiredEvent.SAVE_WIRED, onWiredEvent);

View File

@ -0,0 +1,55 @@
import { WiredConditionActorHasHandItemView } from '../views/conditions/actor-has-hand-item/WiredConditionActorHasHandItem';
import { WiredConditionActorIsGroupMemberView } from '../views/conditions/actor-is-group-member/WiredConditionActorIsGroupMemberView';
import { WiredConditionActorIsOnFurniView } from '../views/conditions/actor-is-on-furni/WiredConditionActorIsOnFurniView';
import { WiredConditionActorIsTeamMemberView } from '../views/conditions/actor-is-team-member/WiredConditionActorIsTeamMemberView';
import { WiredConditionActorIsWearingBadgeView } from '../views/conditions/actor-is-wearing-badge/WiredConditionActorIsWearingBadgeView';
import { WiredConditionActorIsWearingEffectView } from '../views/conditions/actor-is-wearing-effect/WiredConditionActorIsWearingEffectView';
import { WiredConditionFurniHasAvatarOnView } from '../views/conditions/furni-has-avatar-on/WiredConditionFurniHasAvatarOnView';
import { WiredConditionFurniHasFurniOnView } from '../views/conditions/furni-has-furni-on/WiredConditionFurniHasFurniOnView';
import { WiredConditionFurniHasNotFurniOnView } from '../views/conditions/furni-has-not-furni-on/WiredConditionFurniHasNotFurniOnView';
import { WiredConditionFurniIsOfTypeView } from '../views/conditions/furni-is-of-type/WiredConditionFurniIsOfTypeView';
import { WiredConditionFurniMatchesSnapshotView } from '../views/conditions/furni-matches-snapshot/WiredConditionFurniMatchesSnapshotView';
import { WiredConditionTimeElapsedLessView } from '../views/conditions/time-elapsed-less/WiredConditionTimeElapsedLessView';
import { WiredConditionTimeElapsedMoreView } from '../views/conditions/time-elapsed-more/WiredConditionTimeElapsedMoreView';
import { WiredConditionlayout } from './WiredConditionLayoutCode';
export function GetWiredConditionLayout(code: number): JSX.Element
{
switch(code)
{
case WiredConditionlayout.ACTOR_HAS_HANDITEM:
return <WiredConditionActorHasHandItemView />;
case WiredConditionlayout.ACTOR_IS_GROUP_MEMBER:
case WiredConditionlayout.NOT_ACTOR_IN_GROUP:
return <WiredConditionActorIsGroupMemberView />;
case WiredConditionlayout.ACTOR_IS_ON_FURNI:
case WiredConditionlayout.NOT_ACTOR_ON_FURNI:
return <WiredConditionActorIsOnFurniView />;
case WiredConditionlayout.ACTOR_IS_IN_TEAM:
case WiredConditionlayout.NOT_ACTOR_IN_TEAM:
return <WiredConditionActorIsTeamMemberView />;
case WiredConditionlayout.ACTOR_IS_WEARING_BADGE:
case WiredConditionlayout.NOT_ACTOR_WEARS_BADGE:
return <WiredConditionActorIsWearingBadgeView />;
case WiredConditionlayout.ACTOR_IS_WEARING_EFFECT:
case WiredConditionlayout.NOT_ACTOR_WEARING_EFFECT:
return <WiredConditionActorIsWearingEffectView />;
case WiredConditionlayout.FURNIS_HAVE_AVATARS:
case WiredConditionlayout.FURNI_NOT_HAVE_HABBO:
return <WiredConditionFurniHasAvatarOnView />;
case WiredConditionlayout.HAS_STACKED_FURNIS:
return <WiredConditionFurniHasFurniOnView />;
case WiredConditionlayout.NOT_HAS_STACKED_FURNIS:
return <WiredConditionFurniHasNotFurniOnView />;
case WiredConditionlayout.STUFF_TYPE_MATCHES:
case WiredConditionlayout.NOT_FURNI_IS_OF_TYPE:
return <WiredConditionFurniIsOfTypeView />;
case WiredConditionlayout.STATES_MATCH:
case WiredConditionlayout.NOT_STATES_MATCH:
return <WiredConditionFurniMatchesSnapshotView />;
case WiredConditionlayout.TIME_ELAPSED_LESS:
return <WiredConditionTimeElapsedLessView />;
case WiredConditionlayout.TIME_ELAPSED_MORE:
return <WiredConditionTimeElapsedMoreView />;
}
}

View File

@ -1,5 +1,6 @@
import { Triggerable, TriggerDefinition, WiredActionDefinition } from 'nitro-renderer';
import { ConditionDefinition, Triggerable, TriggerDefinition, WiredActionDefinition } from 'nitro-renderer';
import { GetWiredActionLayout } from './GetWiredActionLayout';
import { GetWiredConditionLayout } from './GetWiredConditionLayout';
import { GetWiredTriggerLayout } from './GetWiredTriggerLayout';
export function GetWiredLayout(trigger: Triggerable): JSX.Element
@ -8,5 +9,7 @@ export function GetWiredLayout(trigger: Triggerable): JSX.Element
if(trigger instanceof TriggerDefinition) return GetWiredTriggerLayout(trigger.code);
if(trigger instanceof ConditionDefinition) return GetWiredConditionLayout(trigger.code);
return null;
}

View File

@ -0,0 +1,29 @@
export class WiredConditionlayout
{
public static STATES_MATCH: number = 0;
public static FURNIS_HAVE_AVATARS: number = 1;
public static ACTOR_IS_ON_FURNI: number = 2;
public static TIME_ELAPSED_MORE: number = 3;
public static TIME_ELAPSED_LESS: number = 4;
public static USER_COUNT_IN: number = 5;
public static ACTOR_IS_IN_TEAM: number = 6;
public static HAS_STACKED_FURNIS: number = 7;
public static STUFF_TYPE_MATCHES: number = 8;
public static STUFFS_IN_FORMATION: number = 9;
public static ACTOR_IS_GROUP_MEMBER: number = 10;
public static ACTOR_IS_WEARING_BADGE: number = 11;
public static ACTOR_IS_WEARING_EFFECT: number = 12;
public static NOT_STATES_MATCH: number = 13;
public static FURNI_NOT_HAVE_HABBO: number = 14;
public static NOT_ACTOR_ON_FURNI: number = 15;
public static NOT_USER_COUNT_IN: number = 16;
public static NOT_ACTOR_IN_TEAM: number = 17;
public static NOT_HAS_STACKED_FURNIS: number = 18;
public static NOT_FURNI_IS_OF_TYPE: number = 19;
public static NOT_STUFFS_IN_FORMATION: number = 20;
public static NOT_ACTOR_IN_GROUP: number = 21;
public static NOT_ACTOR_WEARS_BADGE: number = 22;
public static NOT_ACTOR_WEARING_EFFECT: number = 23;
public static DATE_RANGE_ACTIVE: number = 24;
public static ACTOR_HAS_HANDITEM: number = 25;
}

View File

@ -30,7 +30,7 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props =>
<label className="fw-bold">{ LocalizeText('wiredfurni.params.bot.name') }</label>
<input type="text" className="form-control form-control-sm" maxLength={ 32 } value={ botName } onChange={ event => setBotName(event.target.value) } />
</div>
<div className="fw-bold">{ LocalizeText('wiredfurni.tooltip.handitem') }</div>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.handitem') }</div>
<select className="form-select" value={ handItemId } onChange={ (e) => setHandItemId(Number(e.target.value)) }>
<option value="0">------</option>
{allowedHanditemIds && allowedHanditemIds.map(value =>

View File

@ -25,6 +25,7 @@ export const WiredActionSetFurniStateToView: FC<{}> = props =>
return (
<WiredActionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.conditions') }</div>
<div className="form-check">
<input className="form-check-input" type="checkbox" id="stateFlag" onChange={(e) => setStateFlag(e.target.checked ? 1 : 0)} />
<label className="form-check-label" htmlFor="stateFlag">

View File

@ -0,0 +1,35 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorHasHandItemView: FC<{}> = props =>
{
const allowedHanditemIds: number[] = [2, 5, 7, 8, 9, 10, 27];
const [ handItemId, setHandItemId ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([handItemId]);
}, [ handItemId, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.handitem') }</div>
<select className="form-select" value={ handItemId } onChange={ (e) => setHandItemId(Number(e.target.value)) }>
{allowedHanditemIds && allowedHanditemIds.map(value =>
{
return <option value={ value }>{ LocalizeText('handitem' + value) }</option>
})}
</select>
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,10 @@
import { FC } from 'react';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorIsGroupMemberView: FC<{}> = props =>
{
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ null }></WiredConditionBaseView>
);
}

View File

@ -0,0 +1,10 @@
import { FC } from 'react';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorIsOnFurniView: FC<{}> = props =>
{
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ null }></WiredConditionBaseView>
);
}

View File

@ -0,0 +1,38 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorIsTeamMemberView: FC<{}> = props =>
{
const [ selectedTeam, setSelectedTeam ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setSelectedTeam((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([selectedTeam]);
}, [ selectedTeam, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.team') }</div>
{ [1, 2, 3, 4].map(team =>
{
return (
<div key={ team } className="form-check">
<input className="form-check-input" type="radio" name="selectedTeam" id={'selectedTeam' + team} checked={ selectedTeam === team } onChange={() => setSelectedTeam(team)} />
<label className="form-check-label" htmlFor={'selectedTeam' + team}>
{ LocalizeText('wiredfurni.params.team.' + team) }
</label>
</div>
)
}) }
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,30 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorIsWearingBadgeView: FC<{}> = props =>
{
const [ badge, setBadge ] = useState('');
const { trigger = null, setStringParam = null } = useWiredContext();
useEffect(() =>
{
setBadge(trigger.stringData);
}, [ trigger ]);
const save = useCallback(() =>
{
setStringParam(badge);
}, [ badge, setStringParam ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="form-group mb-2">
<label className="fw-bold">{ LocalizeText('wiredfurni.params.badgecode') }</label>
<input type="text" className="form-control form-control-sm" value={ badge } onChange={ event => setBadge(event.target.value) } />
</div>
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,30 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionActorIsWearingEffectView: FC<{}> = props =>
{
const [ effect, setEffect ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setEffect((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([effect]);
}, [ effect, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="form-group mb-2">
<label className="fw-bold">{ LocalizeText('wiredfurni.params.effectid') }</label>
<input type="number" className="form-control form-control-sm" value={ effect } onChange={ event => setEffect(Number(event.target.value)) } />
</div>
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,20 @@
import { FC, useCallback } from 'react';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredBaseView } from '../../base/WiredBaseView';
import { WiredConditionBaseViewProps } from './WiredConditionBaseView.types';
export const WiredConditionBaseView: FC<WiredConditionBaseViewProps> = props =>
{
const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props;
const onSave = useCallback(() =>
{
if(save) save();
}, [ save ]);
return (
<WiredBaseView wiredType="condition" requiresFurni={ requiresFurni } save={ onSave }>
{ children }
</WiredBaseView>
);
}

View File

@ -0,0 +1,5 @@
export interface WiredConditionBaseViewProps
{
requiresFurni: number;
save: () => void;
}

View File

@ -0,0 +1,10 @@
import { FC } from 'react';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionFurniHasAvatarOnView: FC<{}> = props =>
{
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ null }></WiredConditionBaseView>
);
}

View File

@ -0,0 +1,38 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionFurniHasFurniOnView: FC<{}> = props =>
{
const [ requireAll, setRequireAll ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([requireAll]);
}, [ requireAll, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.requireall') }</div>
{ [0, 1].map(option =>
{
return (
<div key={ option } className="form-check">
<input className="form-check-input" type="radio" name="requireAll" id={'requireAll' + option} checked={ requireAll === option } onChange={() => setRequireAll(option)} />
<label className="form-check-label" htmlFor={'requireAll' + option}>
{ LocalizeText('wiredfurni.params.requireall.' + option) }
</label>
</div>
)
}) }
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,38 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props =>
{
const [ requireAll, setRequireAll ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setRequireAll((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([requireAll]);
}, [ requireAll, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.not_requireall') }</div>
{ [0, 1].map(option =>
{
return (
<div key={ option } className="form-check">
<input className="form-check-input" type="radio" name="requireAll" id={'requireAll' + option} checked={ requireAll === option } onChange={() => setRequireAll(option)} />
<label className="form-check-label" htmlFor={'requireAll' + option}>
{ LocalizeText('wiredfurni.params.not_requireall.' + option) }
</label>
</div>
)
}) }
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,10 @@
import { FC } from 'react';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionFurniIsOfTypeView: FC<{}> = props =>
{
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID_OR_BY_TYPE } save={ null }></WiredConditionBaseView>
);
}

View File

@ -0,0 +1,49 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props =>
{
const [ stateFlag, setStateFlag ] = useState(-1);
const [ directionFlag, setDirectionFlag ] = useState(-1);
const [ positionFlag, setPositionFlag ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setStateFlag(trigger.getBoolean(0) ? 1 : 0);
setDirectionFlag(trigger.getBoolean(1) ? 1 : 0);
setPositionFlag(trigger.getBoolean(2) ? 1 : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([stateFlag, directionFlag, positionFlag]);
}, [ directionFlag, positionFlag, setIntParams, stateFlag ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_BY_ID } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.conditions') }</div>
<div className="form-check">
<input className="form-check-input" type="checkbox" id="stateFlag" onChange={(e) => setStateFlag(e.target.checked ? 1 : 0)} />
<label className="form-check-label" htmlFor="stateFlag">
{ LocalizeText('wiredfurni.params.condition.state') }
</label>
</div>
<div className="form-check">
<input className="form-check-input" type="checkbox" id="directionFlag" onChange={(e) => setDirectionFlag(e.target.checked ? 1 : 0)} />
<label className="form-check-label" htmlFor="directionFlag">
{ LocalizeText('wiredfurni.params.condition.direction') }
</label>
</div>
<div className="form-check">
<input className="form-check-input" type="checkbox" id="positionFlag" onChange={(e) => setPositionFlag(e.target.checked ? 1 : 0)} />
<label className="form-check-label" htmlFor="positionFlag">
{ LocalizeText('wiredfurni.params.condition.position') }
</label>
</div>
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,36 @@
import Slider from 'rc-slider/lib/Slider';
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionTimeElapsedLessView: FC<{}> = props =>
{
const [ time, setTime ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([time]);
}, [ time, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.allowbefore', ['seconds'], [time.toString()]) }</div>
<Slider
defaultValue={ time }
dots={ true }
min={ 0.5 }
max={ 600 }
step={ 0.5 }
onChange={ event => setTime(event) }
/>
</WiredConditionBaseView>
);
}

View File

@ -0,0 +1,36 @@
import Slider from 'rc-slider/lib/Slider';
import { FC, useCallback, useEffect, useState } from 'react';
import { LocalizeText } from '../../../../../utils/LocalizeText';
import { useWiredContext } from '../../../context/WiredContext';
import { WiredFurniType } from '../../../WiredView.types';
import { WiredConditionBaseView } from '../base/WiredConditionBaseView';
export const WiredConditionTimeElapsedMoreView: FC<{}> = props =>
{
const [ time, setTime ] = useState(-1);
const { trigger = null, setIntParams = null } = useWiredContext();
useEffect(() =>
{
setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0);
}, [ trigger ]);
const save = useCallback(() =>
{
setIntParams([time]);
}, [ time, setIntParams ]);
return (
<WiredConditionBaseView requiresFurni={ WiredFurniType.STUFF_SELECTION_OPTION_NONE } save={ save }>
<div className="fw-bold">{ LocalizeText('wiredfurni.params.allowafter', ['seconds'], [time.toString()]) }</div>
<Slider
defaultValue={ time }
dots={ true }
min={ 0.5 }
max={ 600 }
step={ 0.5 }
onChange={ event => setTime(event) }
/>
</WiredConditionBaseView>
);
}