From cdfeeb9ff80b72f6045125488fc752ecee189316 Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 22 Mar 2022 20:23:15 -0500 Subject: [PATCH 1/8] add specialInput prop to wired views --- src/components/wired/WiredMessageHandler.tsx | 2 + src/components/wired/WiredView.tsx | 4 +- src/components/wired/views/WiredBaseView.tsx | 40 +++++++++++-------- .../views/actions/WiredActionBaseView.tsx | 5 ++- .../WiredActionBotChangeFigureView.tsx | 2 +- .../WiredActionBotFollowAvatarView.tsx | 2 +- .../WiredActionBotGiveHandItemView.tsx | 2 +- .../views/actions/WiredActionBotMoveView.tsx | 2 +- .../WiredActionBotTalkToAvatarView.tsx | 2 +- .../views/actions/WiredActionBotTalkView.tsx | 2 +- .../actions/WiredActionBotTeleportView.tsx | 2 +- .../WiredActionCallAnotherStackView.tsx | 2 +- .../views/actions/WiredActionChaseView.tsx | 2 +- .../views/actions/WiredActionChatView.tsx | 2 +- .../views/actions/WiredActionFleeView.tsx | 2 +- .../actions/WiredActionGiveRewardView.tsx | 2 +- ...redActionGiveScoreToPredefinedTeamView.tsx | 2 +- .../actions/WiredActionGiveScoreView.tsx | 2 +- .../views/actions/WiredActionJoinTeamView.tsx | 2 +- .../actions/WiredActionKickFromRoomView.tsx | 2 +- .../actions/WiredActionLeaveTeamView.tsx | 2 +- .../WiredActionMoveAndRotateFurniView.tsx | 2 +- .../actions/WiredActionMoveFurniToView.tsx | 2 +- .../actions/WiredActionMoveFurniView.tsx | 2 +- .../views/actions/WiredActionMuteUserView.tsx | 2 +- .../views/actions/WiredActionResetView.tsx | 2 +- .../WiredActionSetFurniStateToView.tsx | 2 +- .../views/actions/WiredActionTeleportView.tsx | 2 +- .../WiredActionToggleFurniStateView.tsx | 2 +- .../WiredConditionActorHasHandItem.tsx | 2 +- .../WiredConditionActorIsGroupMemberView.tsx | 2 +- .../WiredConditionActorIsOnFurniView.tsx | 2 +- .../WiredConditionActorIsTeamMemberView.tsx | 2 +- .../WiredConditionActorIsWearingBadgeView.tsx | 2 +- ...WiredConditionActorIsWearingEffectView.tsx | 2 +- .../conditions/WiredConditionBaseView.tsx | 5 ++- .../WiredConditionDateRangeView.tsx | 2 +- .../WiredConditionFurniHasAvatarOnView.tsx | 2 +- .../WiredConditionFurniHasFurniOnView.tsx | 2 +- .../WiredConditionFurniHasNotFurniOnView.tsx | 2 +- .../WiredConditionFurniIsOfTypeView.tsx | 2 +- ...WiredConditionFurniMatchesSnapshotView.tsx | 2 +- .../WiredConditionTimeElapsedLessView.tsx | 2 +- .../WiredConditionTimeElapsedMoreView.tsx | 2 +- .../WiredConditionUserCountInRoomView.tsx | 2 +- .../WiredTriggerAvatarEnterRoomView.tsx | 2 +- .../WiredTriggerAvatarSaysSomethingView.tsx | 2 +- .../WiredTriggerAvatarWalksOffFurniView.tsx | 2 +- .../WiredTriggerAvatarWalksOnFurni.tsx | 2 +- .../views/triggers/WiredTriggerBaseView.tsx | 5 ++- .../WiredTriggerBotReachedAvatarView.tsx | 2 +- .../WiredTriggerBotReachedStuffView.tsx | 2 +- .../triggers/WiredTriggerCollisionView.tsx | 2 +- .../triggers/WiredTriggerExecuteOnceView.tsx | 2 +- ...iredTriggerExecutePeriodicallyLongView.tsx | 2 +- .../WiredTriggerExecutePeriodicallyView.tsx | 2 +- .../triggers/WiredTriggerGameEndsView.tsx | 2 +- .../triggers/WiredTriggerGameStartsView.tsx | 2 +- .../WiredTriggerScoreAchievedView.tsx | 2 +- .../triggers/WiredTriggerToggleFurniView.tsx | 2 +- 60 files changed, 91 insertions(+), 78 deletions(-) diff --git a/src/components/wired/WiredMessageHandler.tsx b/src/components/wired/WiredMessageHandler.tsx index 0819f9b1..daa4c10f 100644 --- a/src/components/wired/WiredMessageHandler.tsx +++ b/src/components/wired/WiredMessageHandler.tsx @@ -1,5 +1,6 @@ import { WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredRewardResultMessageEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; +import { LocalizeText, NotificationAlertType, NotificationUtilities } from '../../api'; import { UseMessageEventHook } from '../../hooks/messages'; import { useWiredContext } from './context/WiredContext'; @@ -51,6 +52,7 @@ export const WiredMessageHandler: FC<{}> = props => { const parser = event.getParser(); + NotificationUtilities.simpleAlert(parser.info, NotificationAlertType.DEFAULT, null, null, LocalizeText('error.title')); console.log(parser); }, []); diff --git a/src/components/wired/WiredView.tsx b/src/components/wired/WiredView.tsx index 97bc67c6..c81a7643 100644 --- a/src/components/wired/WiredView.tsx +++ b/src/components/wired/WiredView.tsx @@ -10,8 +10,8 @@ import { WiredMessageHandler } from './WiredMessageHandler'; export const WiredView: FC<{}> = props => { const [ trigger, setTrigger ] = useState(null); - const [ intParams, setIntParams ] = useState(null); - const [ stringParam, setStringParam ] = useState(null); + const [ intParams, setIntParams ] = useState([]); + const [ stringParam, setStringParam ] = useState(''); const [ furniIds, setFurniIds ] = useState([]); const [ actionDelay, setActionDelay ] = useState(null); diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 5bec7477..a40efe38 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -12,13 +12,14 @@ export interface WiredBaseViewProps { wiredType: string; requiresFurni: number; + hasSpecialInput: boolean; save: () => void; validate?: () => boolean; } export const WiredBaseView: FC = props => { - const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null } = props; + const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false } = props; const [ wiredName, setWiredName ] = useState(null); const [ wiredDescription, setWiredDescription ] = useState(null); const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null } = useWiredContext(); @@ -57,23 +58,30 @@ export const WiredBaseView: FC = props => setWiredDescription(furniData.description); } - setIntParams(trigger.intData); - setStringParam(trigger.stringData); - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - if(trigger.selectedItems && trigger.selectedItems.length) + if(hasSpecialInput) + { + setIntParams(trigger.intData); + setStringParam(trigger.stringData); + } + + if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) + { + setFurniIds(prevValue => { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - - return trigger.selectedItems; - } - - return []; - }); + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + if(trigger.selectedItems && trigger.selectedItems.length) + { + WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); + + return trigger.selectedItems; + } + + return []; + }); + } }); - }, [ trigger, setIntParams, setStringParam, setFurniIds ]); + }, [trigger, setIntParams, setStringParam, setFurniIds, hasSpecialInput, requiresFurni]); return ( diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 0d3a6076..f3904428 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -11,13 +11,14 @@ import { WiredBaseView } from '../WiredBaseView'; export interface WiredActionBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } export const WiredActionBaseView: FC = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; const [ delay, setDelay ] = useState(-1); const { trigger = null, setActionDelay = null } = useWiredContext(); @@ -34,7 +35,7 @@ export const WiredActionBaseView: FC = props => }, [ delay, save, setActionDelay ]); return ( - + { children } { !!children &&
} diff --git a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx index 06ada2ef..22c4f489 100644 --- a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx +++ b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx @@ -37,7 +37,7 @@ export const WiredActionBotChangeFigureView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index db19a24f..169be528 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -33,7 +33,7 @@ export const WiredActionBotFollowAvatarView: FC<{}> = props => }, [ trigger ]); return ( - + setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index 3a36ae75..82f942a1 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -34,7 +34,7 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => }, [ 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 d03b42ea..6c4ec9e4 100644 --- a/src/components/wired/views/actions/WiredActionBotMoveView.tsx +++ b/src/components/wired/views/actions/WiredActionBotMoveView.tsx @@ -22,7 +22,7 @@ export const WiredActionBotMoveView: FC<{}> = props => }, [ trigger ]); 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 55cb3d31..69182854 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -39,7 +39,7 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/actions/WiredActionBotTalkView.tsx b/src/components/wired/views/actions/WiredActionBotTalkView.tsx index 86c83fb9..b83a0bdc 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkView.tsx @@ -39,7 +39,7 @@ export const WiredActionBotTalkView: FC<{}> = props => }, [ 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 bf929e98..3db5a25e 100644 --- a/src/components/wired/views/actions/WiredActionBotTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTeleportView.tsx @@ -22,7 +22,7 @@ export const WiredActionBotTeleportView: FC<{}> = props => }, [ trigger ]); 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 c3d310e2..e254e6c9 100644 --- a/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx +++ b/src/components/wired/views/actions/WiredActionCallAnotherStackView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionCallAnotherStackView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionChaseView.tsx b/src/components/wired/views/actions/WiredActionChaseView.tsx index 5f5dbaac..943a35b6 100644 --- a/src/components/wired/views/actions/WiredActionChaseView.tsx +++ b/src/components/wired/views/actions/WiredActionChaseView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionChaseView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionChatView.tsx b/src/components/wired/views/actions/WiredActionChatView.tsx index a67ec482..296b8328 100644 --- a/src/components/wired/views/actions/WiredActionChatView.tsx +++ b/src/components/wired/views/actions/WiredActionChatView.tsx @@ -22,7 +22,7 @@ export const WiredActionChatView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.message') } setMessage(event.target.value) } maxLength={ 100 } /> diff --git a/src/components/wired/views/actions/WiredActionFleeView.tsx b/src/components/wired/views/actions/WiredActionFleeView.tsx index fcc76360..478771b6 100644 --- a/src/components/wired/views/actions/WiredActionFleeView.tsx +++ b/src/components/wired/views/actions/WiredActionFleeView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionFleeView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 5da167d7..075312d1 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -106,7 +106,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => }, [ trigger ]); return ( - + setLimitEnabled(event.target.checked)} /> { LocalizeText('wiredfurni.params.prizelimit', ['amount'], [limitEnabled ? rewardsLimit.toString() : '']) } diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx index 1e5c2d38..8e99a8f2 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx @@ -41,7 +41,7 @@ export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setpoints', [ 'points' ], [ points.toString() ]) } = props => }, [ 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 25dc5b82..0c35e45b 100644 --- a/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx +++ b/src/components/wired/views/actions/WiredActionKickFromRoomView.tsx @@ -22,7 +22,7 @@ export const WiredActionKickFromRoomView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.message') } setMessage(event.target.value) } maxLength={ 100 } /> diff --git a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx index 45e9be5f..f9c094c8 100644 --- a/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionLeaveTeamView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionLeaveTeamView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index 4b322d03..e9002466 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -58,7 +58,7 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.startdir') } diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index bea80976..5d9d413c 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -57,7 +57,7 @@ export const WiredActionMoveFurniToView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.emptytiles', [ 'tiles' ], [ spacing.toString() ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.movefurni') } diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index ed087d7d..c01db914 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -33,7 +33,7 @@ export const WiredActionMuteUserView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.length.minutes', ['minutes'], [ time.toString() ]) } = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index 3b334784..d161a04c 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -31,7 +31,7 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.conditions') } diff --git a/src/components/wired/views/actions/WiredActionTeleportView.tsx b/src/components/wired/views/actions/WiredActionTeleportView.tsx index 3ab7b330..0cd24c6f 100644 --- a/src/components/wired/views/actions/WiredActionTeleportView.tsx +++ b/src/components/wired/views/actions/WiredActionTeleportView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionTeleportView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx index 93a26197..4bf8abd9 100644 --- a/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx +++ b/src/components/wired/views/actions/WiredActionToggleFurniStateView.tsx @@ -4,5 +4,5 @@ import { WiredActionBaseView } from './WiredActionBaseView'; export const WiredActionToggleFurniStateView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx index 57574db0..d0d00858 100644 --- a/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorHasHandItem.tsx @@ -24,7 +24,7 @@ export const WiredConditionActorHasHandItemView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.handitem') } setBadge(event.target.value) } /> diff --git a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx index c3b48361..71c91893 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsWearingEffectView.tsx @@ -22,7 +22,7 @@ export const WiredConditionActorIsWearingEffectView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.effectid') } setEffect(parseInt(event.target.value)) } /> diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx index f2c6edfa..ff984026 100644 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ b/src/components/wired/views/conditions/WiredConditionBaseView.tsx @@ -4,13 +4,14 @@ import { WiredBaseView } from '../WiredBaseView'; export interface WiredConditionBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } export const WiredConditionBaseView: FC = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; const onSave = useCallback(() => { @@ -18,7 +19,7 @@ export const WiredConditionBaseView: FC = props => }, [ save ]); return ( - + { children } ); diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx index 4d613d7a..c1f843f1 100644 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx @@ -55,7 +55,7 @@ export const WiredConditionDateRangeView: FC<{}> = props => }, [ trigger, dateToString ]); return ( - + { LocalizeText('wiredfurni.params.startdate') } setStartDate(e.target.value) } /> diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx index 4a79952a..01912ec9 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasAvatarOnView.tsx @@ -4,5 +4,5 @@ import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniHasAvatarOnView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx index 5fab235a..c498cc00 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx @@ -23,7 +23,7 @@ export const WiredConditionFurniHasFurniOnView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.requireall') } { [0, 1].map(value => diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx index 1e9d8efe..b15be97c 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx @@ -23,7 +23,7 @@ export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.not_requireall') } { [0, 1].map(value => diff --git a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx index 47d97cca..b8f8e3a5 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniIsOfTypeView.tsx @@ -4,5 +4,5 @@ import { WiredConditionBaseView } from './WiredConditionBaseView'; export const WiredConditionFurniIsOfTypeView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx index 2924cc60..14ed53a3 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx @@ -31,7 +31,7 @@ export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.conditions') } diff --git a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx index bbe084b1..085666b4 100644 --- a/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx +++ b/src/components/wired/views/conditions/WiredConditionTimeElapsedLessView.tsx @@ -24,7 +24,7 @@ export const WiredConditionTimeElapsedLessView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.allowbefore', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.allowafter', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.usercountmin', [ 'value' ], [ min.toString() ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.picktriggerer') } diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx index edc55a50..97da5be9 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx @@ -33,7 +33,7 @@ export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.whatissaid') } setMessage(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx index a436cee7..db16a694 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOffFurniView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarWalksOffFurniView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx index 4644babf..2299c8a2 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarWalksOnFurni.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerAvatarWalksOnFurniView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx index 47b5f669..30b9ee25 100644 --- a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx @@ -4,13 +4,14 @@ import { WiredBaseView } from '../WiredBaseView'; export interface WiredTriggerBaseViewProps { + hasSpecialInput: boolean; requiresFurni: number; save: () => void; } export const WiredTriggerBaseView: FC = props => { - const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, children = null } = props; + const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; const onSave = useCallback(() => { @@ -18,7 +19,7 @@ export const WiredTriggerBaseView: FC = props => }, [ save ]); return ( - + { children } ); diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx index 9ff1a0e5..2a93f65e 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedAvatarView.tsx @@ -22,7 +22,7 @@ export const WiredTriggerBotReachedAvatarView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx index 909afe6f..bf4a1710 100644 --- a/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBotReachedStuffView.tsx @@ -22,7 +22,7 @@ export const WiredTriggerBotReachedStuffView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.bot.name') } setBotName(event.target.value) } /> diff --git a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx index 2f7cb067..868e212f 100644 --- a/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerCollisionView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerCollisionView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx index 22b6ae22..032fcb77 100644 --- a/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerExecuteOnceView.tsx @@ -24,7 +24,7 @@ export const WiredTriggeExecuteOnceView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setlongtime', [ 'time' ], [ FriendlyTime.format(time * 5).toString() ]) } = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.settime', [ 'seconds' ], [ GetWiredTimeLocale(time) ]) } = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx index 57650fa8..a55e3c30 100644 --- a/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerGameStartsView.tsx @@ -4,5 +4,5 @@ import { WiredTriggerBaseView } from './WiredTriggerBaseView'; export const WiredTriggerGameStartsView: FC<{}> = props => { - return ; + return ; } diff --git a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx index f4043937..a4011248 100644 --- a/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerScoreAchievedView.tsx @@ -23,7 +23,7 @@ export const WiredTriggeScoreAchievedView: FC<{}> = props => }, [ trigger ]); return ( - + { LocalizeText('wiredfurni.params.setscore', [ 'points' ], [ points.toString() ]) } = props => { - return ; + return ; } From b9f4ee425e3d7499319f9d72f3eb405db8e6c58a Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 22 Mar 2022 23:47:19 -0400 Subject: [PATCH 2/8] Update navigator doorbell/password --- src/components/navigator/NavigatorContext.tsx | 6 +- .../navigator/NavigatorMessageHandler.tsx | 97 ++++++++++++--- src/components/navigator/NavigatorView.tsx | 90 ++------------ .../navigator/common/DoorStateType.ts | 12 ++ .../views/NavigatorDoorStateView.tsx | 111 ++++++++++++++++++ .../views/NavigatorRoomDoorbellView.tsx | 63 ---------- .../views/NavigatorRoomPasswordView.tsx | 60 ---------- .../search/NavigatorSearchResultItemView.tsx | 25 +++- 8 files changed, 235 insertions(+), 229 deletions(-) create mode 100644 src/components/navigator/common/DoorStateType.ts create mode 100644 src/components/navigator/views/NavigatorDoorStateView.tsx delete mode 100644 src/components/navigator/views/NavigatorRoomDoorbellView.tsx delete mode 100644 src/components/navigator/views/NavigatorRoomPasswordView.tsx diff --git a/src/components/navigator/NavigatorContext.tsx b/src/components/navigator/NavigatorContext.tsx index 8505e701..5615b78f 100644 --- a/src/components/navigator/NavigatorContext.tsx +++ b/src/components/navigator/NavigatorContext.tsx @@ -1,4 +1,4 @@ -import { NavigatorCategoryDataParser, NavigatorSearchResultSet, NavigatorTopLevelContext } from '@nitrots/nitro-renderer'; +import { NavigatorCategoryDataParser, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser } from '@nitrots/nitro-renderer'; import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; import { NavigatorData } from './common/NavigatorData'; @@ -12,6 +12,8 @@ interface INavigatorContext setTopLevelContexts: Dispatch>; navigatorData: NavigatorData; setNavigatorData: Dispatch>; + doorData: { roomInfo: RoomDataParser, state: number }; + setDoorData: Dispatch>; searchResult: NavigatorSearchResultSet; setSearchResult: Dispatch>; } @@ -25,6 +27,8 @@ const NavigatorContext = createContext({ setTopLevelContexts: null, navigatorData: null, setNavigatorData: null, + doorData: null, + setDoorData: null, searchResult: null, setSearchResult: null }); diff --git a/src/components/navigator/NavigatorMessageHandler.tsx b/src/components/navigator/NavigatorMessageHandler.tsx index d3a4a5f8..b6fa2189 100644 --- a/src/components/navigator/NavigatorMessageHandler.tsx +++ b/src/components/navigator/NavigatorMessageHandler.tsx @@ -1,13 +1,13 @@ import { CanCreateRoomEventEvent, CantConnectMessageParser, FollowFriendMessageComposer, GenericErrorEvent, GetGuestRoomResultEvent, HabboWebTools, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomScoreEvent, RoomSettingsUpdatedEvent, SecurityLevel, UserInfoEvent, UserPermissionsEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { CreateLinkEvent, CreateRoomSession, GetConfiguration, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; -import { UpdateDoorStateEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { BatchUpdates, UseMessageEventHook } from '../../hooks'; +import { DoorStateType } from './common/DoorStateType'; import { useNavigatorContext } from './NavigatorContext'; export const NavigatorMessageHandler: FC<{}> = props => { - const { setCategories = null, setTopLevelContext = null, topLevelContexts = null, setTopLevelContexts = null, setNavigatorData = null, setSearchResult = null } = useNavigatorContext(); + const { setCategories = null, setTopLevelContext = null, topLevelContexts = null, setTopLevelContexts = null, setNavigatorData = null, setDoorData = null, setSearchResult = null } = useNavigatorContext(); const onRoomSettingsUpdatedEvent = useCallback((event: RoomSettingsUpdatedEvent) => { @@ -92,6 +92,8 @@ export const NavigatorMessageHandler: FC<{}> = props => if(parser.roomEnter) { + setDoorData({ roomInfo: null, state: DoorStateType.NONE }); + setNavigatorData(prevValue => { const newValue = { ...prevValue }; @@ -123,10 +125,26 @@ export const NavigatorMessageHandler: FC<{}> = props => switch(parser.data.doorMode) { case RoomDataParser.DOORBELL_STATE: - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.START_DOORBELL, parser.data)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_DOORBELL; + + return newValue; + }); return; case RoomDataParser.PASSWORD_STATE: - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.START_PASSWORD, parser.data)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_PASSWORD; + + return newValue; + }); return; } } @@ -147,7 +165,7 @@ export const NavigatorMessageHandler: FC<{}> = props => return newValue; }); } - }, [ setNavigatorData ]); + }, [ setNavigatorData, setDoorData ]); const onRoomScoreEvent = useCallback((event: RoomScoreEvent) => { @@ -170,9 +188,16 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.STATE_WAITING)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_WAITING; + + return newValue; + }); } - }, []); + }, [ setDoorData ]); const onRoomDoorbellAcceptedEvent = useCallback((event: RoomDoorbellAcceptedEvent) => { @@ -180,9 +205,16 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.STATE_ACCEPTED)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_ACCEPTED; + + return newValue; + }); } - }, []); + }, [ setDoorData ]); const onRoomDoorbellRejectedEvent = useCallback((event: RoomDoorbellRejectedEvent) => { @@ -190,9 +222,16 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.STATE_NO_ANSWER)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_NO_ANSWER; + + return newValue; + }); } - }, []); + }, [ setDoorData ]); const onGenericErrorEvent = useCallback((event: GenericErrorEvent) => { @@ -201,10 +240,33 @@ export const NavigatorMessageHandler: FC<{}> = props => switch(parser.errorCode) { case -100002: - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.STATE_WRONG_PASSWORD)); - break; + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_WRONG_PASSWORD; + + return newValue; + }); + return; + case 4009: + NotificationUtilities.simpleAlert(LocalizeText('navigator.alert.need.to.be.vip'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4010: + NotificationUtilities.simpleAlert(LocalizeText('navigator.alert.invalid_room_name'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4011: + NotificationUtilities.simpleAlert(LocalizeText('navigator.alert.cannot_perm_ban'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; + case 4013: + NotificationUtilities.simpleAlert(LocalizeText('navigator.alert.room_in_maintenance'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); + + return; } - }, []); + }, [ setDoorData ]); const onNavigatorMetadataEvent = useCallback((event: NavigatorMetadataEvent) => { @@ -296,7 +358,7 @@ export const NavigatorMessageHandler: FC<{}> = props => let forwardType = -1; let forwardId = -1; - if(GetConfiguration('friend.id') !== undefined) + if((GetConfiguration('friend.id') !== undefined) && (parseInt(GetConfiguration('friend.id')) > 0)) { forwardType = 0; SendMessageComposer(new FollowFriendMessageComposer(parseInt(GetConfiguration('friend.id')))); @@ -316,16 +378,13 @@ export const NavigatorMessageHandler: FC<{}> = props => else if((forwardType === -1) && (parser.roomIdToEnter > 0)) { CreateLinkEvent('navigator/close'); - CreateRoomSession(parser.roomIdToEnter); if(parser.roomIdToEnter !== parser.homeRoomId) { - CreateLinkEvent('navigator/close'); CreateRoomSession(parser.roomIdToEnter); } else { - CreateLinkEvent('navigator/close'); CreateRoomSession(parser.homeRoomId); } } diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index 97571333..676b28ad 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -1,18 +1,17 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, LegacyExternalInterface, NavigatorCategoryDataParser, NavigatorInitComposer, NavigatorSearchComposer, NavigatorSearchResultSet, NavigatorTopLevelContext, RoomDataParser, RoomSessionEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { AddEventLinkTracker, GoToDesktop, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; +import { FC, useCallback, useEffect, useRef, useState } from 'react'; +import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; import { Base, Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { UpdateDoorStateEvent } from '../../events'; -import { BatchUpdates, UseRoomSessionManagerEvent, useSharedState, UseUiEvent } from '../../hooks'; +import { BatchUpdates, UseRoomSessionManagerEvent, useSharedState } from '../../hooks'; +import { DoorStateType } from './common/DoorStateType'; import { NavigatorData } from './common/NavigatorData'; import { NavigatorContextProvider } from './NavigatorContext'; import { NavigatorMessageHandler } from './NavigatorMessageHandler'; +import { NavigatorDoorStateView } from './views/NavigatorDoorStateView'; import { NavigatorRoomCreatorView } from './views/NavigatorRoomCreatorView'; -import { NavigatorRoomDoorbellView } from './views/NavigatorRoomDoorbellView'; import { NavigatorRoomInfoView } from './views/NavigatorRoomInfoView'; import { NavigatorRoomLinkView } from './views/NavigatorRoomLinkView'; -import { NavigatorRoomPasswordView } from './views/NavigatorRoomPasswordView'; import { NavigatorRoomSettingsView } from './views/room-settings/NavigatorRoomSettingsView'; import { NavigatorSearchResultView } from './views/search/NavigatorSearchResultView'; import { NavigatorSearchView } from './views/search/NavigatorSearchView'; @@ -44,53 +43,10 @@ export const NavigatorView: FC<{}> = props => currentRoomRating: 0, canRate: true }); + const [ doorData, setDoorData ] = useState<{ roomInfo: RoomDataParser, state: number }>({ roomInfo: null, state: DoorStateType.NONE }); const [ searchResult, setSearchResult ] = useState(null); - const [ pendingDoorState, setPendingDoorState ] = useState<{ roomData: RoomDataParser, state: string }>(null); const pendingSearch = useRef<{ value: string, code: string }>(null); - const onUpdateDoorStateEvent = useCallback((event: UpdateDoorStateEvent) => - { - switch(event.type) - { - case UpdateDoorStateEvent.START_DOORBELL: - setPendingDoorState({ roomData: event.roomData, state: event.type }); - return; - case UpdateDoorStateEvent.START_PASSWORD: - setPendingDoorState({ roomData: event.roomData, state: event.type }); - return; - case UpdateDoorStateEvent.STATE_WAITING: - setPendingDoorState(prevValue => - { - return { roomData: prevValue.roomData, state: event.type } - }); - return; - case UpdateDoorStateEvent.STATE_NO_ANSWER: - setPendingDoorState(prevValue => - { - if(prevValue.state === UpdateDoorStateEvent.STATE_WAITING) GoToDesktop(); - - return { roomData: prevValue.roomData, state: event.type } - }); - return; - case UpdateDoorStateEvent.STATE_WRONG_PASSWORD: - setPendingDoorState(prevValue => - { - return { roomData: prevValue.roomData, state: event.type } - }); - return; - case UpdateDoorStateEvent.STATE_ACCEPTED: - setPendingDoorState(null); - return; - } - }, []); - - UseUiEvent(UpdateDoorStateEvent.START_DOORBELL, onUpdateDoorStateEvent); - UseUiEvent(UpdateDoorStateEvent.START_PASSWORD, onUpdateDoorStateEvent); - UseUiEvent(UpdateDoorStateEvent.STATE_WAITING, onUpdateDoorStateEvent); - UseUiEvent(UpdateDoorStateEvent.STATE_NO_ANSWER, onUpdateDoorStateEvent); - UseUiEvent(UpdateDoorStateEvent.STATE_WRONG_PASSWORD, onUpdateDoorStateEvent); - UseUiEvent(UpdateDoorStateEvent.STATE_ACCEPTED, onUpdateDoorStateEvent); - const onRoomSessionEvent = useCallback((event: RoomSessionEvent) => { switch(event.type) @@ -107,18 +63,6 @@ export const NavigatorView: FC<{}> = props => UseRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent); - const closePendingDoorState = useCallback((state: string) => - { - if(state !== null) - { - setPendingDoorState(prevValue => - { - return { ...prevValue, state }; - }); - } - else setPendingDoorState(null); - }, []); - const sendSearch = useCallback((searchValue: string, contextCode: string) => { setCreatorOpen(false); @@ -292,28 +236,9 @@ export const NavigatorView: FC<{}> = props => LegacyExternalInterface.addCallback(HabboWebTools.OPENROOM, (k: string, _arg_2: boolean = false, _arg_3: string = null) => SendMessageComposer(new ConvertGlobalRoomIdMessageComposer(k))); }, []); - const getRoomDoorState = useMemo(() => - { - if(!pendingDoorState) return null; - - switch(pendingDoorState.state) - { - case UpdateDoorStateEvent.START_DOORBELL: - case UpdateDoorStateEvent.STATE_WAITING: - case UpdateDoorStateEvent.STATE_NO_ANSWER: - return ; - case UpdateDoorStateEvent.START_PASSWORD: - case UpdateDoorStateEvent.STATE_WRONG_PASSWORD: - return ; - } - - return null; - }, [ pendingDoorState, closePendingDoorState ]); - return ( - + - { getRoomDoorState } { isVisible && setIsVisible(false) } /> @@ -343,6 +268,7 @@ export const NavigatorView: FC<{}> = props => { isCreatorOpen && } } + { isRoomInfoOpen && setRoomInfoOpen(false) } /> } { isRoomLinkOpen && setRoomLinkOpen(false) } /> } diff --git a/src/components/navigator/common/DoorStateType.ts b/src/components/navigator/common/DoorStateType.ts new file mode 100644 index 00000000..1f8a8efe --- /dev/null +++ b/src/components/navigator/common/DoorStateType.ts @@ -0,0 +1,12 @@ +export class DoorStateType +{ + public static NONE: number = 0; + public static START_DOORBELL: number = 1; + public static START_PASSWORD: number = 2; + public static STATE_PENDING_SERVER: number = 3; + public static UPDATE_STATE: number = 4; + public static STATE_WAITING: number = 5; + public static STATE_NO_ANSWER: number = 6; + public static STATE_WRONG_PASSWORD: number = 7; + public static STATE_ACCEPTED: number = 8; +} diff --git a/src/components/navigator/views/NavigatorDoorStateView.tsx b/src/components/navigator/views/NavigatorDoorStateView.tsx new file mode 100644 index 00000000..58428142 --- /dev/null +++ b/src/components/navigator/views/NavigatorDoorStateView.tsx @@ -0,0 +1,111 @@ +import { FC, useEffect, useState } from 'react'; +import { CreateRoomSession, GoToDesktop, LocalizeText } from '../../../api'; +import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; +import { DoorStateType } from '../common/DoorStateType'; +import { useNavigatorContext } from '../NavigatorContext'; + +const VISIBLE_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER, DoorStateType.START_PASSWORD, DoorStateType.STATE_WRONG_PASSWORD ]; +const DOORBELL_STATES = [ DoorStateType.START_DOORBELL, DoorStateType.STATE_WAITING, DoorStateType.STATE_NO_ANSWER ]; +const PASSWORD_STATES = [ DoorStateType.START_PASSWORD, DoorStateType.STATE_WRONG_PASSWORD ]; + +export const NavigatorDoorStateView: FC<{}> = props => +{ + const [ password, setPassword ] = useState(''); + const { doorData = null, setDoorData = null } = useNavigatorContext(); + + const close = () => + { + if(doorData && (doorData.state === DoorStateType.STATE_WAITING)) GoToDesktop(); + + setDoorData(null); + } + + const ring = () => + { + if(!doorData || !doorData.roomInfo) return; + + CreateRoomSession(doorData.roomInfo.roomId); + + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_PENDING_SERVER; + + return newValue; + }); + } + + const tryEntering = () => + { + if(!doorData || !doorData.roomInfo) return; + + CreateRoomSession(doorData.roomInfo.roomId, password); + + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.state = DoorStateType.STATE_PENDING_SERVER; + + return newValue; + }); + } + + useEffect(() => + { + if(!doorData || (doorData.state !== DoorStateType.STATE_NO_ANSWER)) return; + + GoToDesktop(); + }, [ doorData ]); + + if(!doorData || (doorData.state === DoorStateType.NONE) || (VISIBLE_STATES.indexOf(doorData.state) === -1)) return null; + + const isDoorbell = (DOORBELL_STATES.indexOf(doorData.state) >= 0); + + return ( + + + + + { doorData && doorData.roomInfo && doorData.roomInfo.roomName } + { (doorData.state === DoorStateType.START_DOORBELL) && + { LocalizeText('navigator.doorbell.info') } } + { (doorData.state === DoorStateType.STATE_WAITING) && + { LocalizeText('navigator.doorbell.waiting') } } + { (doorData.state === DoorStateType.STATE_NO_ANSWER) && + { LocalizeText('navigator.doorbell.no.answer') } } + { (doorData.state === DoorStateType.START_PASSWORD) && + { LocalizeText('navigator.password.info') } } + { (doorData.state === DoorStateType.STATE_WRONG_PASSWORD) && + { LocalizeText('navigator.password.retryinfo') } } + + { isDoorbell && + + { (doorData.state === DoorStateType.START_DOORBELL) && + } + + } + { !isDoorbell && + <> + + { LocalizeText('navigator.password.enter') } + setPassword(event.target.value) } /> + + + + + + } + + + ); +} diff --git a/src/components/navigator/views/NavigatorRoomDoorbellView.tsx b/src/components/navigator/views/NavigatorRoomDoorbellView.tsx deleted file mode 100644 index 96bcf27a..00000000 --- a/src/components/navigator/views/NavigatorRoomDoorbellView.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { CreateRoomSession, GoToDesktop, LocalizeText } from '../../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common'; -import { Button } from '../../../common/Button'; -import { Column } from '../../../common/Column'; -import { Text } from '../../../common/Text'; -import { UpdateDoorStateEvent } from '../../../events'; - -export interface NavigatorRoomDoorbellViewProps -{ - roomData: RoomDataParser; - state: string; - onClose: (state: string) => void; -} - -export const NavigatorRoomDoorbellView: FC = props => -{ - const { roomData = null, state = null, onClose = null } = props; - - const close = () => - { - if(state === UpdateDoorStateEvent.STATE_WAITING) GoToDesktop(); - - onClose(null); - } - - const ring = () => - { - if(!roomData) return; - - CreateRoomSession(roomData.roomId); - - onClose(UpdateDoorStateEvent.STATE_PENDING_SERVER); - } - - return ( - - - - - { roomData && - { roomData.roomName } } - { (state === UpdateDoorStateEvent.START_DOORBELL) && - { LocalizeText('navigator.doorbell.info') } } - { (state === UpdateDoorStateEvent.STATE_WAITING) && - { LocalizeText('navigator.doorbell.waiting') } } - { (state === UpdateDoorStateEvent.STATE_NO_ANSWER) && - { LocalizeText('navigator.doorbell.no.answer') } } - - - { (state === UpdateDoorStateEvent.START_DOORBELL) && - } - - - - - ); -} diff --git a/src/components/navigator/views/NavigatorRoomPasswordView.tsx b/src/components/navigator/views/NavigatorRoomPasswordView.tsx deleted file mode 100644 index b1574821..00000000 --- a/src/components/navigator/views/NavigatorRoomPasswordView.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { RoomDataParser } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { CreateRoomSession, LocalizeText } from '../../../api'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../common'; -import { Button } from '../../../common/Button'; -import { Column } from '../../../common/Column'; -import { Text } from '../../../common/Text'; -import { UpdateDoorStateEvent } from '../../../events'; - -export interface NavigatorRoomPasswordViewProps -{ - roomData: RoomDataParser; - state: string; - onClose: (state: string) => void; -} - -export const NavigatorRoomPasswordView: FC = props => -{ - const { roomData = null, state = null, onClose = null } = props; - const [ password, setPassword ] = useState(''); - - const close = () => - { - onClose(null); - } - - const tryEntering = useCallback(() => - { - if(!roomData) return; - - CreateRoomSession(roomData.roomId, password); - - onClose(UpdateDoorStateEvent.STATE_PENDING_SERVER); - }, [ roomData, password, onClose ]); - - return ( - - - - - { roomData && - { roomData.roomName } } - { (state === UpdateDoorStateEvent.START_PASSWORD) && - { LocalizeText('navigator.password.info') } } - { (state === UpdateDoorStateEvent.STATE_WRONG_PASSWORD) && - { LocalizeText('navigator.password.retryinfo') } } - - - { LocalizeText('navigator.password.enter') } - setPassword(event.target.value) } /> - - - - - - ); -} diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemView.tsx index 72c265d0..94126768 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemView.tsx @@ -3,8 +3,8 @@ import { RoomDataParser } from '@nitrots/nitro-renderer'; import { FC, MouseEvent } from 'react'; import { CreateRoomSession, GetSessionDataManager, TryVisitRoom } from '../../../../api'; import { Column, Flex, LayoutBadgeImageView, LayoutGridItemProps, LayoutRoomThumbnailView, Text } from '../../../../common'; -import { UpdateDoorStateEvent } from '../../../../events'; -import { DispatchUiEvent } from '../../../../hooks'; +import { DoorStateType } from '../../common/DoorStateType'; +import { useNavigatorContext } from '../../NavigatorContext'; import { NavigatorSearchResultItemInfoView } from './NavigatorSearchResultItemInfoView'; export interface NavigatorSearchResultItemViewProps extends LayoutGridItemProps @@ -16,6 +16,7 @@ export interface NavigatorSearchResultItemViewProps extends LayoutGridItemProps export const NavigatorSearchResultItemView: FC = props => { const { roomData = null, children = null, thumbnail = false, ...rest } = props; + const { setDoorData = null } = useNavigatorContext(); function getUserCounterColor(): string { @@ -53,10 +54,26 @@ export const NavigatorSearchResultItemView: FC + { + const newValue = { ...prevValue }; + + newValue.roomInfo = roomData; + newValue.state = DoorStateType.START_DOORBELL; + + return newValue; + }); return; case RoomDataParser.PASSWORD_STATE: - DispatchUiEvent(new UpdateDoorStateEvent(UpdateDoorStateEvent.START_PASSWORD, roomData)); + setDoorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.roomInfo = roomData; + newValue.state = DoorStateType.START_PASSWORD; + + return newValue; + }); return; } } From ebaecde1dc5f9029c3e46c6b0eeff6816fbe9bd2 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 02:05:30 -0400 Subject: [PATCH 3/8] Fix profile flashing on reload --- src/components/user-profile/UserProfileView.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index bfc1892e..3a70ddd5 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -56,12 +56,23 @@ export const UserProfileView: FC<{}> = props => const onUserProfileEvent = useCallback((event: UserProfileEvent) => { const parser = event.getParser(); + + let isSameProfile = false; BatchUpdates(() => { - setUserProfile(parser); - setUserBadges([]); - setUserRelationships(null); + setUserProfile(prevValue => + { + isSameProfile = (prevValue.id === parser.id); + + return parser; + }); + + if(!isSameProfile) + { + setUserBadges([]); + setUserRelationships(null); + } }); SendMessageComposer(new UserCurrentBadgesComposer(parser.id)); From c8ca5d2b822314c70a1d44feff03df445f633c32 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 03:03:32 -0400 Subject: [PATCH 4/8] Add LayoutProgressBar --- src/common/layout/LayoutProgressBar.tsx | 31 +++++++++++++++++++++++++ src/common/layout/index.ts | 1 + 2 files changed, 32 insertions(+) create mode 100644 src/common/layout/LayoutProgressBar.tsx diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx new file mode 100644 index 00000000..56dd797c --- /dev/null +++ b/src/common/layout/LayoutProgressBar.tsx @@ -0,0 +1,31 @@ +import { FC, useMemo } from 'react'; +import { Base, BaseProps, Flex } from '..'; + +interface LayoutProgressBarProps extends BaseProps +{ + text: string; + progress: number; + maxProgress?: number; +} + +export const LayoutProgressBar: FC = props => +{ + const { text = '', progress = 0, maxProgress = 0, position = 'relative', classNames = [], children = null, ...rest } = props; + + const getClassNames = useMemo(() => + { + const newClassNames: string[] = [ 'progress', 'text-black' ]; + + if(classNames.length) newClassNames.push(...classNames); + + return newClassNames; + }, [ classNames ]); + + return ( + + { text } + + { children } + + ); +} diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts index 5fcdf07b..34cbc1e6 100644 --- a/src/common/layout/index.ts +++ b/src/common/layout/index.ts @@ -11,6 +11,7 @@ export * from './LayoutMiniCameraView'; export * from './LayoutNotificationAlertView'; export * from './LayoutNotificationBubbleView'; export * from './LayoutPetImageView'; +export * from './LayoutProgressBar'; export * from './LayoutRarityLevelView'; export * from './LayoutRoomPreviewerView'; export * from './LayoutRoomThumbnailView'; From d1a7badeba51af5a708b94583dd93a30422792de Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 03:05:44 -0400 Subject: [PATCH 5/8] Update achievements --- src/App.scss | 2 +- .../achievements}/AchievementCategory.ts | 0 .../achievements/GetAchievementBadgeCode.ts | 13 ++ .../achievements/GetAchievementHasStarted.ts | 10 + .../achievements/GetAchievementIsIgnored.ts | 15 ++ .../achievements}/GetAchievementLevel.ts | 0 src/api/achievements/index.ts | 5 + src/api/index.ts | 1 + .../achievements/AchievementsView.tsx | 182 +++++++++--------- .../common/AchievementUtilities.ts | 38 ---- .../common/GetScaledProgressPercent.ts | 8 - .../views/AchievementBadgeView.tsx | 19 ++ .../AchievementCategoryView.tsx | 10 +- .../AchievementDetailsView.tsx | 24 +-- .../AchievementBadgeView.tsx | 21 -- .../AchievementListItemView.tsx | 6 +- .../achievement-list/AchievementListView.tsx | 2 +- .../AchievementsCategoryListItemView.tsx | 7 +- .../AchievementsCategoryListView.tsx | 4 +- src/components/toolbar/ToolbarView.tsx | 4 +- 20 files changed, 182 insertions(+), 189 deletions(-) rename src/{components/achievements/common => api/achievements}/AchievementCategory.ts (100%) create mode 100644 src/api/achievements/GetAchievementBadgeCode.ts create mode 100644 src/api/achievements/GetAchievementHasStarted.ts create mode 100644 src/api/achievements/GetAchievementIsIgnored.ts rename src/{components/achievements/common => api/achievements}/GetAchievementLevel.ts (100%) create mode 100644 src/api/achievements/index.ts delete mode 100644 src/components/achievements/common/AchievementUtilities.ts delete mode 100644 src/components/achievements/common/GetScaledProgressPercent.ts create mode 100644 src/components/achievements/views/AchievementBadgeView.tsx rename src/components/achievements/views/{category => }/AchievementCategoryView.tsx (83%) rename src/components/achievements/views/{achievement-details => }/AchievementDetailsView.tsx (59%) delete mode 100644 src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx diff --git a/src/App.scss b/src/App.scss index b73ed915..2057754a 100644 --- a/src/App.scss +++ b/src/App.scss @@ -19,7 +19,7 @@ $grid-active-border-color: $white; $toolbar-height: 55px; $achievement-width: 375px; -$achievement-height: 425px; +$achievement-height: 415px; $avatar-editor-width: 620px; $avatar-editor-height: 374px; diff --git a/src/components/achievements/common/AchievementCategory.ts b/src/api/achievements/AchievementCategory.ts similarity index 100% rename from src/components/achievements/common/AchievementCategory.ts rename to src/api/achievements/AchievementCategory.ts diff --git a/src/api/achievements/GetAchievementBadgeCode.ts b/src/api/achievements/GetAchievementBadgeCode.ts new file mode 100644 index 00000000..a9da2c88 --- /dev/null +++ b/src/api/achievements/GetAchievementBadgeCode.ts @@ -0,0 +1,13 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; +import { GetLocalization } from '..'; + +export const GetAchievementBadgeCode = (achievement: AchievementData) => +{ + if(!achievement) return null; + + let badgeId = achievement.badgeId; + + if(!achievement.finalLevel) badgeId = GetLocalization().getPreviousLevelBadgeId(badgeId); + + return badgeId; +} diff --git a/src/api/achievements/GetAchievementHasStarted.ts b/src/api/achievements/GetAchievementHasStarted.ts new file mode 100644 index 00000000..c97d2fb8 --- /dev/null +++ b/src/api/achievements/GetAchievementHasStarted.ts @@ -0,0 +1,10 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; + +export const GetAchievementHasStarted = (achievement: AchievementData) => +{ + if(!achievement) return false; + + if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true; + + return false; +} diff --git a/src/api/achievements/GetAchievementIsIgnored.ts b/src/api/achievements/GetAchievementIsIgnored.ts new file mode 100644 index 00000000..3f03501a --- /dev/null +++ b/src/api/achievements/GetAchievementIsIgnored.ts @@ -0,0 +1,15 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; +import { GetConfiguration } from '..'; + +export const GetAchievementIsIgnored = (achievement: AchievementData) => +{ + if(!achievement) return false; + + const ignored = GetConfiguration('achievements.unseen.ignored'); + const value = achievement.badgeId.replace(/[0-9]/g, ''); + const index = ignored.indexOf(value); + + if(index >= 0) return true; + + return false; +} diff --git a/src/components/achievements/common/GetAchievementLevel.ts b/src/api/achievements/GetAchievementLevel.ts similarity index 100% rename from src/components/achievements/common/GetAchievementLevel.ts rename to src/api/achievements/GetAchievementLevel.ts diff --git a/src/api/achievements/index.ts b/src/api/achievements/index.ts new file mode 100644 index 00000000..a15b38cf --- /dev/null +++ b/src/api/achievements/index.ts @@ -0,0 +1,5 @@ +export * from './AchievementCategory'; +export * from './GetAchievementBadgeCode'; +export * from './GetAchievementHasStarted'; +export * from './GetAchievementIsIgnored'; +export * from './GetAchievementLevel'; diff --git a/src/api/index.ts b/src/api/index.ts index 7c98b2c5..cba6bb8c 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,3 +1,4 @@ +export * from './achievements'; export * from './common'; export * from './core'; export * from './friends'; diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index 08521fb5..7dcebf76 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -1,13 +1,11 @@ -import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; +import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, ILinkEventTracker, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { GetConfiguration, LocalizeText, SendMessageComposer } from '../../api'; -import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; -import { AchievementsUIEvent, AchievementsUIUnseenCountEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; -import { AchievementCategory } from './common/AchievementCategory'; -import { AchievementUtilities } from './common/AchievementUtilities'; +import { AchievementCategory, AddEventLinkTracker, GetAchievementIsIgnored, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { Base, Column, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; +import { AchievementsUIUnseenCountEvent } from '../../events'; +import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { AchievementCategoryView } from './views/AchievementCategoryView'; import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView'; -import { AchievementCategoryView } from './views/category/AchievementCategoryView'; export const AchievementsView: FC<{}> = props => { @@ -17,72 +15,56 @@ export const AchievementsView: FC<{}> = props => const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); const [ achievementScore, setAchievementScore ] = useState(0); - const onAchievementsUIEvent = useCallback((event: AchievementsUIEvent) => - { - switch(event.type) - { - case AchievementsUIEvent.SHOW_ACHIEVEMENTS: - setIsVisible(true); - return; - case AchievementsUIEvent.HIDE_ACHIEVEMENTS: - setIsVisible(false); - return; - case AchievementsUIEvent.TOGGLE_ACHIEVEMENTS: - setIsVisible(value => !value); - return; - } - }, []); - - UseUiEvent(AchievementsUIEvent.SHOW_ACHIEVEMENTS, onAchievementsUIEvent); - UseUiEvent(AchievementsUIEvent.HIDE_ACHIEVEMENTS, onAchievementsUIEvent); - UseUiEvent(AchievementsUIEvent.TOGGLE_ACHIEVEMENTS, onAchievementsUIEvent); - const onAchievementEvent = useCallback((event: AchievementEvent) => { const parser = event.getParser(); const achievement = parser.achievement; - const newCategories = [ ...achievementCategories ]; const categoryName = achievement.category; - const categoryIndex = newCategories.findIndex(existing => (existing.code === categoryName)); - if(categoryIndex === -1) - { - const category = new AchievementCategory(categoryName); - - category.achievements.push(achievement); - - newCategories.push(category); - } - else - { - const category = newCategories[categoryIndex]; - const newAchievements = [ ...category.achievements ]; - const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); - let previousAchievement: AchievementData = null; - - if(achievementIndex === -1) + setAchievementCategories(prevValue => { - newAchievements.push(achievement); - } - else - { - previousAchievement = newAchievements[achievementIndex]; + const newValue = [ ...prevValue ]; + const categoryIndex = newValue.findIndex(existing => (existing.code === categoryName)); - newAchievements[achievementIndex] = achievement; - } + if(categoryIndex === -1) + { + const category = new AchievementCategory(categoryName); - if(!AchievementUtilities.isIgnoredAchievement(achievement)) - { - achievement.unseen++; + category.achievements.push(achievement); - if(previousAchievement) achievement.unseen += previousAchievement.unseen; - } + newValue.push(category); + } + else + { + const category = newValue[categoryIndex]; + const newAchievements = [ ...category.achievements ]; + const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); + let previousAchievement: AchievementData = null; - category.achievements = newAchievements; - } + if(achievementIndex === -1) + { + newAchievements.push(achievement); + } + else + { + previousAchievement = newAchievements[achievementIndex]; - setAchievementCategories(newCategories); - }, [ achievementCategories ]); + newAchievements[achievementIndex] = achievement; + } + + if(!GetAchievementIsIgnored(achievement)) + { + achievement.unseen++; + + if(previousAchievement) achievement.unseen += previousAchievement.unseen; + } + + category.achievements = newAchievements; + } + + return newValue; + }); + }, []); UseMessageEventHook(AchievementEvent, onAchievementEvent); @@ -95,6 +77,7 @@ export const AchievementsView: FC<{}> = props => for(const achievement of parser.achievements) { const categoryName = achievement.category; + let existing = categories.find(category => (category.code === categoryName)); if(!existing) @@ -167,33 +150,59 @@ export const AchievementsView: FC<{}> = props => return achievementCategories.find(existing => (existing.code === selectedCategoryCode)); }, [ achievementCategories, selectedCategoryCode ]); - const getCategoryIcon = useMemo(() => - { - if(!getSelectedCategory) return null; - - const imageUrl = GetConfiguration('achievements.images.url'); - - return imageUrl.replace('%image%', `achicon_${ getSelectedCategory.code }`); - }, [ getSelectedCategory ]); - const setAchievementSeen = useCallback((code: string, achievementId: number) => { - const newCategories = [ ...achievementCategories ]; - - for(const category of newCategories) - { - if(category.code !== code) continue; - - for(const achievement of category.achievements) + setAchievementCategories(prevValue => { - if(achievement.achievementId !== achievementId) continue; + const newValue = [ ...prevValue ]; - achievement.unseen = 0; - } + for(const category of newValue) + { + if(category.code !== code) continue; + + for(const achievement of category.achievements) + { + if(achievement.achievementId !== achievementId) continue; + + achievement.unseen = 0; + } + } + + return newValue; + }); + }, []); + + const linkReceived = useCallback((url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(prevValue => !prevValue); + return; } + }, []); - setAchievementCategories(newCategories); - }, [ achievementCategories ]); + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived, + eventUrlPrefix: 'achievements/' + }; + + AddEventLinkTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, [ linkReceived ]); useEffect(() => { @@ -220,15 +229,12 @@ export const AchievementsView: FC<{}> = props => { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ getSelectedCategory.getProgress().toString(), getSelectedCategory.getMaxProgress().toString() ]) } } - + { !getSelectedCategory && <> - - { LocalizeText('achievements.categories.totalprogress', [ 'progress', 'limit' ], [ getProgress.toString(), getMaxProgress.toString() ]) } - - + { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) } } diff --git a/src/components/achievements/common/AchievementUtilities.ts b/src/components/achievements/common/AchievementUtilities.ts deleted file mode 100644 index f6c18ac3..00000000 --- a/src/components/achievements/common/AchievementUtilities.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { GetConfiguration, GetLocalization } from '../../../api'; - -export class AchievementUtilities -{ - public static hasStarted(achievement: AchievementData): boolean - { - if(!achievement) return false; - - if(achievement.finalLevel || ((achievement.level - 1) > 0)) return true; - - return false; - } - - public static getBadgeCode(achievement: AchievementData): string - { - if(!achievement) return null; - - let badgeId = achievement.badgeId; - - if(!achievement.finalLevel) badgeId = GetLocalization().getPreviousLevelBadgeId(badgeId); - - return badgeId; - } - - public static isIgnoredAchievement(achievement: AchievementData): boolean - { - if(!achievement) return false; - - const ignored = GetConfiguration('achievements.unseen.ignored'); - const value = achievement.badgeId.replace(/[0-9]/g, ''); - const index = ignored.indexOf(value); - - if(index >= 0) return true; - - return false; - } -} diff --git a/src/components/achievements/common/GetScaledProgressPercent.ts b/src/components/achievements/common/GetScaledProgressPercent.ts deleted file mode 100644 index 8708a709..00000000 --- a/src/components/achievements/common/GetScaledProgressPercent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; - -export const GetScaledProgressPercent = (achievement: AchievementData) => -{ - if(!achievement) return 0; - - return ~~(((((achievement.currentPoints + achievement.scoreAtStartOfLevel) - 0) * (100 - 0)) / ((achievement.scoreLimit + achievement.scoreAtStartOfLevel) - 0)) + 0); -} diff --git a/src/components/achievements/views/AchievementBadgeView.tsx b/src/components/achievements/views/AchievementBadgeView.tsx new file mode 100644 index 00000000..ef79819a --- /dev/null +++ b/src/components/achievements/views/AchievementBadgeView.tsx @@ -0,0 +1,19 @@ +import { AchievementData } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { GetAchievementBadgeCode, GetAchievementHasStarted } from '../../../api'; +import { BaseProps, LayoutBadgeImageView } from '../../../common'; + +interface AchievementBadgeViewProps extends BaseProps +{ + achievement: AchievementData; + scale?: number; +} + +export const AchievementBadgeView: FC = props => +{ + const { achievement = null, scale = 1, ...rest } = props; + + if(!achievement) return null; + + return ; +} diff --git a/src/components/achievements/views/category/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx similarity index 83% rename from src/components/achievements/views/category/AchievementCategoryView.tsx rename to src/components/achievements/views/AchievementCategoryView.tsx index 5f535d2c..b493d55e 100644 --- a/src/components/achievements/views/category/AchievementCategoryView.tsx +++ b/src/components/achievements/views/AchievementCategoryView.tsx @@ -1,10 +1,10 @@ import { FC, useEffect, useMemo, useState } from 'react'; -import { Column } from '../../../../common/Column'; -import { AchievementCategory } from '../../common/AchievementCategory'; -import { AchievementDetailsView } from '../achievement-details/AchievementDetailsView'; -import { AchievementListView } from '../achievement-list/AchievementListView'; +import { AchievementCategory } from '../../../api'; +import { Column } from '../../../common'; +import { AchievementListView } from './achievement-list/AchievementListView'; +import { AchievementDetailsView } from './AchievementDetailsView'; -export class AchievementCategoryViewProps +interface AchievementCategoryViewProps { category: AchievementCategory; setAchievementSeen: (code: string, achievementId: number) => void; diff --git a/src/components/achievements/views/achievement-details/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx similarity index 59% rename from src/components/achievements/views/achievement-details/AchievementDetailsView.tsx rename to src/components/achievements/views/AchievementDetailsView.tsx index 6687214d..18bfc631 100644 --- a/src/components/achievements/views/achievement-details/AchievementDetailsView.tsx +++ b/src/components/achievements/views/AchievementDetailsView.tsx @@ -1,13 +1,11 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../../api'; -import { Base, Column, Flex, LayoutCurrencyIcon, Text } from '../../../../common'; -import { AchievementUtilities } from '../../common/AchievementUtilities'; -import { GetAchievementLevel } from '../../common/GetAchievementLevel'; -import { GetScaledProgressPercent } from '../../common/GetScaledProgressPercent'; -import { AchievementBadgeView } from '../achievement-badge/AchievementBadgeView'; +import { GetAchievementBadgeCode, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api'; +import { GetAchievementLevel } from '../../../api/achievements/GetAchievementLevel'; +import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common'; +import { AchievementBadgeView } from './AchievementBadgeView'; -export interface AchievementDetailsViewProps +interface AchievementDetailsViewProps { achievement: AchievementData; } @@ -19,7 +17,6 @@ export const AchievementDetailsView: FC = props => if(!achievement) return null; const achievementLevel = GetAchievementLevel(achievement); - const scaledProgressPercent = GetScaledProgressPercent(achievement); return ( @@ -32,10 +29,10 @@ export const AchievementDetailsView: FC = props => - { LocalizeBadgeName(AchievementUtilities.getBadgeCode(achievement)) } + { LocalizeBadgeName(GetAchievementBadgeCode(achievement)) } - - { LocalizeBadgeDescription(AchievementUtilities.getBadgeCode(achievement)) } + + { LocalizeBadgeDescription(GetAchievementBadgeCode(achievement)) } { ((achievement.levelRewardPoints > 0) || (achievement.scoreLimit > 0)) && @@ -51,10 +48,7 @@ export const AchievementDetailsView: FC = props => } { (achievement.scoreLimit > 0) && - - { LocalizeText('achievements.details.progress', [ 'progress', 'limit' ], [ (achievement.currentPoints + achievement.scoreAtStartOfLevel).toString(), (achievement.scoreLimit + achievement.scoreAtStartOfLevel).toString() ]) } - - } + } } diff --git a/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx b/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx deleted file mode 100644 index 08de4de8..00000000 --- a/src/components/achievements/views/achievement-badge/AchievementBadgeView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { BaseProps, LayoutBadgeImageView } from '../../../../common'; -import { AchievementUtilities } from '../../common/AchievementUtilities'; - -export interface AchievementBadgeViewProps extends BaseProps -{ - achievement: AchievementData; - scale?: number; -} - -export const AchievementBadgeView: FC = props => -{ - const { achievement = null, scale = 1, ...rest } = props; - - if(!achievement) return null; - - return ( - - ); -} diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx index 74975759..0041783b 100644 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx @@ -1,9 +1,9 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { LayoutGridItem, LayoutGridItemProps } from '../../../../common/layout/LayoutGridItem'; -import { AchievementBadgeView } from '../achievement-badge/AchievementBadgeView'; +import { LayoutGridItem, LayoutGridItemProps } from '../../../../common'; +import { AchievementBadgeView } from '../AchievementBadgeView'; -export interface AchievementListItemViewProps extends LayoutGridItemProps +interface AchievementListItemViewProps extends LayoutGridItemProps { achievement: AchievementData; } diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx index d0441aad..a5c889b4 100644 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListView.tsx @@ -1,6 +1,6 @@ import { AchievementData } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; +import { AutoGrid } from '../../../../common'; import { AchievementListItemView } from './AchievementListItemView'; export interface AchievementListViewProps diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx index f9ccfcef..7fc9fa7a 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx @@ -1,9 +1,6 @@ import { FC, useCallback, useMemo } from 'react'; -import { GetConfiguration, LocalizeText } from '../../../../api'; -import { LayoutGridItem, LayoutGridItemProps } from '../../../../common/layout/LayoutGridItem'; -import { LayoutImage } from '../../../../common/layout/LayoutImage'; -import { Text } from '../../../../common/Text'; -import { AchievementCategory } from '../../common/AchievementCategory'; +import { AchievementCategory, GetConfiguration, LocalizeText } from '../../../../api'; +import { LayoutGridItem, LayoutGridItemProps, LayoutImage, Text } from '../../../../common'; export interface AchievementCategoryListItemViewProps extends LayoutGridItemProps { diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx index bcd7adaf..ed0f49de 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx @@ -1,6 +1,6 @@ import { Dispatch, FC, SetStateAction } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; -import { AchievementCategory } from '../../common/AchievementCategory'; +import { AchievementCategory } from '../../../../api'; +import { AutoGrid } from '../../../../common'; import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; export interface AchievementsCategoryListViewProps diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index c8e102e7..815a4113 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -2,7 +2,7 @@ import { Dispose, DropBounce, EaseOut, FigureUpdateEvent, JumpBy, Motions, Nitro import { FC, useCallback, useState } from 'react'; import { CreateLinkEvent, GetSessionDataManager, GetUserProfile, OpenMessengerChat, VisitDesktop } from '../../api'; import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; -import { AchievementsUIEvent, AchievementsUIUnseenCountEvent, FriendsEvent, FriendsMessengerIconEvent, FriendsRequestCountEvent, GuideToolEvent, InventoryEvent, ModToolsEvent, UnseenItemTrackerUpdateEvent, UserSettingsUIEvent } from '../../events'; +import { AchievementsUIUnseenCountEvent, FriendsEvent, FriendsMessengerIconEvent, FriendsRequestCountEvent, GuideToolEvent, InventoryEvent, ModToolsEvent, UnseenItemTrackerUpdateEvent, UserSettingsUIEvent } from '../../events'; import { BatchUpdates, DispatchUiEvent, UseMessageEventHook, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; import { ToolbarViewItems } from './common/ToolbarViewItems'; import { ToolbarMeView } from './ToolbarMeView'; @@ -157,7 +157,7 @@ export const ToolbarView: FC = props => DispatchUiEvent(new ModToolsEvent(ModToolsEvent.TOGGLE_MOD_TOOLS)); return; case ToolbarViewItems.ACHIEVEMENTS_ITEM: - DispatchUiEvent(new AchievementsUIEvent(AchievementsUIEvent.TOGGLE_ACHIEVEMENTS)); + CreateLinkEvent('achievements/toggle'); setMeExpanded(false); return; case ToolbarViewItems.PROFILE_ITEM: From ad42e1113cbbd6fd9b46633cb4873fa2c9aac095 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 03:05:57 -0400 Subject: [PATCH 6/8] Remove events --- .../achievements/AchievementsUIEvent.ts | 8 ------ src/events/achievements/index.ts | 1 - src/events/index.ts | 1 - src/events/navigator/UpdateDoorStateEvent.ts | 27 ------------------- src/events/navigator/index.ts | 1 - 5 files changed, 38 deletions(-) delete mode 100644 src/events/achievements/AchievementsUIEvent.ts delete mode 100644 src/events/navigator/UpdateDoorStateEvent.ts delete mode 100644 src/events/navigator/index.ts diff --git a/src/events/achievements/AchievementsUIEvent.ts b/src/events/achievements/AchievementsUIEvent.ts deleted file mode 100644 index 7854bf28..00000000 --- a/src/events/achievements/AchievementsUIEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class AchievementsUIEvent extends NitroEvent -{ - public static SHOW_ACHIEVEMENTS: string = 'AE_SHOW_ACHIEVEMENTS'; - public static HIDE_ACHIEVEMENTS: string = 'AE_HIDE_ACHIEVEMENTS'; - public static TOGGLE_ACHIEVEMENTS: string = 'AE_TOGGLE_ACHIEVEMENTS'; -} diff --git a/src/events/achievements/index.ts b/src/events/achievements/index.ts index a8c548f4..9bebf51d 100644 --- a/src/events/achievements/index.ts +++ b/src/events/achievements/index.ts @@ -1,2 +1 @@ -export * from './AchievementsUIEvent'; export * from './AchievementsUIUnseenCountEvent'; diff --git a/src/events/index.ts b/src/events/index.ts index 8a7625ea..bb569cd6 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -7,7 +7,6 @@ export * from './hc-center'; export * from './help'; export * from './inventory'; export * from './mod-tools'; -export * from './navigator'; export * from './notification-center'; export * from './room-widgets'; export * from './room-widgets/thumbnail'; diff --git a/src/events/navigator/UpdateDoorStateEvent.ts b/src/events/navigator/UpdateDoorStateEvent.ts deleted file mode 100644 index 0c4bdfca..00000000 --- a/src/events/navigator/UpdateDoorStateEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NitroEvent, RoomDataParser } from '@nitrots/nitro-renderer'; - -export class UpdateDoorStateEvent extends NitroEvent -{ - public static START_DOORBELL: string = 'UDSE_START_DOORBELL'; - public static START_PASSWORD: string = 'UDSE_START_PASSWORD'; - public static STATE_PENDING_SERVER: string = 'UDSE_STATE_PENDING_SERVER'; - public static UPDATE_STATE: string = 'UDSE_UPDATE_STATE'; - public static STATE_WAITING: string = 'UDSE_STATE_WAITING'; - public static STATE_NO_ANSWER: string = 'UDSE_STATE_NO_ANSWER'; - public static STATE_WRONG_PASSWORD: string = 'UDSE_STATE_WRONG_PASSWORD'; - public static STATE_ACCEPTED: string = 'UDSE_STATE_ACCEPTED'; - - private _roomData: RoomDataParser - - constructor(type: string, roomData: RoomDataParser = null) - { - super(type); - - this._roomData = roomData; - } - - public get roomData(): RoomDataParser - { - return this._roomData; - } -} diff --git a/src/events/navigator/index.ts b/src/events/navigator/index.ts deleted file mode 100644 index df2d9bf9..00000000 --- a/src/events/navigator/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './UpdateDoorStateEvent'; From 4d13df84a03a99ba8c7c66e08ba4e2002b2a5bb0 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 03:06:04 -0400 Subject: [PATCH 7/8] Null check --- src/components/user-profile/UserProfileView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index 3a70ddd5..ba0e603c 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -63,7 +63,7 @@ export const UserProfileView: FC<{}> = props => { setUserProfile(prevValue => { - isSameProfile = (prevValue.id === parser.id); + if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); return parser; }); From 649678afdde0279a580ab9d4377e48301741626a Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 23 Mar 2022 03:06:34 -0400 Subject: [PATCH 8/8] Clear furniMsgFragments --- src/components/inventory/InventoryMessageHandler.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/inventory/InventoryMessageHandler.tsx b/src/components/inventory/InventoryMessageHandler.tsx index 80fe5d94..5b5e72b5 100644 --- a/src/components/inventory/InventoryMessageHandler.tsx +++ b/src/components/inventory/InventoryMessageHandler.tsx @@ -48,6 +48,8 @@ export const InventoryMessageHandler: FC<{}> = props => type: InventoryFurnitureActions.PROCESS_FRAGMENT, payload: { fragment, unseenTracker } }); + + furniMsgFragments = null; }, [ unseenTracker, dispatchFurnitureState ]); const onFurnitureListInvalidateEvent = useCallback((event: FurnitureListInvalidateEvent) =>