diff --git a/src/hooks/session/useSessionInfo.ts b/src/hooks/session/useSessionInfo.ts index 9959698..bb2cd11 100644 --- a/src/hooks/session/useSessionInfo.ts +++ b/src/hooks/session/useSessionInfo.ts @@ -1,16 +1,21 @@ -import { FigureUpdateEvent, GetSessionDataManager, RoomUnitChatStyleComposer, UserInfoDataParser, UserInfoEvent, UserSettingsEvent } from '@nitrots/nitro-renderer'; +import { GetSessionDataManager, RoomUnitChatStyleComposer, UserSettingsEvent } from '@nitrots/nitro-renderer'; import { useState } from 'react'; import { useBetween } from 'use-between'; import { SendMessageComposer } from '../../api'; import { useMessageEvent } from '../events'; +import { useUserDataSnapshot } from './useSessionSnapshots'; const useSessionInfoState = () => { - const [ userInfo, setUserInfo ] = useState(null); - const [ userFigure, setUserFigure ] = useState(null); + // figure / respectsLeft / respectsPetLeft come from the renderer's + // referentially-stable IUserDataSnapshot. The snapshot is invalidated + // (and re-derived on next read) inside SessionDataManager whenever + // the underlying state changes: UserInfoEvent + FigureUpdateEvent + + // giveRespect/givePetRespect all call invalidateUserDataSnapshot(). + // So we no longer need to mirror those fields into local useState. + const userData = useUserDataSnapshot(); + const [ chatStyleId, setChatStyleId ] = useState(0); - const [ userRespectRemaining, setUserRespectRemaining ] = useState(0); - const [ petRespectRemaining, setPetRespectRemaining ] = useState(0); const updateChatStyleId = (styleId: number) => { @@ -19,36 +24,8 @@ const useSessionInfoState = () => SendMessageComposer(new RoomUnitChatStyleComposer(styleId)); }; - const respectUser = (userId: number) => - { - GetSessionDataManager().giveRespect(userId); - - setUserRespectRemaining(GetSessionDataManager().respectsLeft); - }; - - const respectPet = (petId: number) => - { - GetSessionDataManager().givePetRespect(petId); - - setPetRespectRemaining(GetSessionDataManager().respectsPetLeft); - }; - - useMessageEvent(UserInfoEvent, event => - { - const parser = event.getParser(); - - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - setUserRespectRemaining(parser.userInfo.respectsRemaining); - setPetRespectRemaining(parser.userInfo.respectsPetRemaining); - }); - - useMessageEvent(FigureUpdateEvent, event => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }); + const respectUser = (userId: number) => GetSessionDataManager().giveRespect(userId); + const respectPet = (petId: number) => GetSessionDataManager().givePetRespect(petId); useMessageEvent(UserSettingsEvent, event => { @@ -57,7 +34,15 @@ const useSessionInfoState = () => setChatStyleId(parser.chatType); }); - return { userInfo, userFigure, chatStyleId, userRespectRemaining, petRespectRemaining, respectUser, respectPet, updateChatStyleId }; + return { + userFigure: userData.figure, + chatStyleId, + userRespectRemaining: userData.respectsLeft, + petRespectRemaining: userData.respectsPetLeft, + respectUser, + respectPet, + updateChatStyleId + }; }; export const useSessionInfo = () => useBetween(useSessionInfoState);