From 9beebe58ba4dfd3fc74e9636633ab9a839de7008 Mon Sep 17 00:00:00 2001 From: brenoepics <59066707+brenoepics@users.noreply.github.com> Date: Tue, 15 Mar 2022 23:52:25 -0300 Subject: [PATCH 001/331] Fix calendar --- src/components/campaign/CalendarItemView.tsx | 11 +++---- src/components/campaign/CalendarView.tsx | 5 ++-- src/components/campaign/CampaignView.tsx | 5 ++-- .../campaign/common/CalendarItem.ts | 30 +++++++++++++++++++ .../campaign/common/ICalendarItem.ts | 6 ++++ 5 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/components/campaign/common/CalendarItem.ts create mode 100644 src/components/campaign/common/ICalendarItem.ts diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx index bd61d3e7..7ca4cb66 100644 --- a/src/components/campaign/CalendarItemView.tsx +++ b/src/components/campaign/CalendarItemView.tsx @@ -1,6 +1,7 @@ import { FC } from 'react'; -import { GetRoomEngine, GetSessionDataManager } from '../../api'; +import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../../api'; import { Base, Column, Flex, LayoutImage } from '../../common'; +import { CalendarItem } from './common/CalendarItem'; import { CalendarItemState } from './common/CalendarItemState'; interface CalendarItemViewProps @@ -8,13 +9,13 @@ interface CalendarItemViewProps itemId: number; state: number; active?: boolean; - productName?: string; + product?: CalendarItem; onClick: (itemId: number) => void; } export const CalendarItemView: FC = props => { - const { itemId = -1, state = null, productName = null, active = false, onClick = null } = props; + const { itemId = -1, state = null, product = null, active = false, onClick = null } = props; const getFurnitureIcon = (name: string) => { @@ -37,8 +38,8 @@ export const CalendarItemView: FC = props => { (state === CalendarItemState.STATE_UNLOCKED) && - { productName && - } + { product && + ('image.library.url') + product.customImage : getFurnitureIcon(product.productName) } /> } } { (state !== CalendarItemState.STATE_UNLOCKED) && diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index b36d5669..5afbd1a6 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -2,13 +2,14 @@ import { FC, useState } from 'react'; import { GetSessionDataManager, LocalizeText } from '../../api'; import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { CalendarItemView } from './CalendarItemView'; +import { CalendarItem } from './common/CalendarItem'; import { CalendarItemState } from './common/CalendarItemState'; interface CalendarViewProps { close(): void; openPackage(id: number, asStaff: boolean): void; - receivedProducts: Map; + receivedProducts: Map; campaignName: string; currentDay: number; numDays: number; @@ -128,7 +129,7 @@ export const CalendarView: FC = props => return ( - + ); }) } diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index 1a7cf339..3464f29f 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -3,12 +3,13 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { BatchUpdates, UseMessageEventHook } from '../../hooks'; import { CalendarView } from './CalendarView'; +import { CalendarItem } from './common/CalendarItem'; export const CampaignView: FC<{}> = props => { const [ calendarData, setCalendarData ] = useState(null); const [ lastOpenAttempt, setLastOpenAttempt ] = useState(-1); - const [ receivedProducts, setReceivedProducts ] = useState>(new Map()); + const [ receivedProducts, setReceivedProducts ] = useState>(new Map()); const [ isCalendarOpen, setCalendarOpen ] = useState(false); const onCampaignCalendarDataMessageEvent = useCallback((event: CampaignCalendarDataMessageEvent) => @@ -44,7 +45,7 @@ export const CampaignView: FC<{}> = props => setReceivedProducts(prev => { const copy = new Map(prev); - copy.set(lastAttempt, parser.furnitureClassName); + copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); return copy; }); diff --git a/src/components/campaign/common/CalendarItem.ts b/src/components/campaign/common/CalendarItem.ts new file mode 100644 index 00000000..d3634b3d --- /dev/null +++ b/src/components/campaign/common/CalendarItem.ts @@ -0,0 +1,30 @@ +import { ICalendarItem } from './ICalendarItem'; + +export class CalendarItem implements ICalendarItem +{ + private _productName: string; + private _customImage: string; + private _furnitureClassName: string; + + constructor(productName: string, customImage: string, furnitureClassName: string) + { + this._productName = productName; + this._customImage = customImage; + this._furnitureClassName = furnitureClassName; + } + + public get productName(): string + { + return this._productName; + } + + public get customImage(): string + { + return this._customImage; + } + + public get furnitureClassName(): string + { + return this._furnitureClassName; + } +} diff --git a/src/components/campaign/common/ICalendarItem.ts b/src/components/campaign/common/ICalendarItem.ts new file mode 100644 index 00000000..87dfbd6d --- /dev/null +++ b/src/components/campaign/common/ICalendarItem.ts @@ -0,0 +1,6 @@ +export interface ICalendarItem +{ + readonly productName: string; + readonly customImage: string; + readonly furnitureClassName: string; +} From 513b3b6bcc0c215b75bd11fd8b8d01ea217b3b49 Mon Sep 17 00:00:00 2001 From: ObjectRetro Date: Wed, 16 Mar 2022 05:42:20 +0100 Subject: [PATCH 002/331] Fix select room model --- .../navigator/views/creator/NavigatorRoomCreatorView.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx index 0c438e0b..6b76f0ac 100644 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx @@ -21,13 +21,13 @@ export const NavigatorRoomCreatorView: FC<{}> = props => const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; - const selectModel = (model: IRoomModel) => + const selectModel = (model: IRoomModel, index) => { if(!model) return; if(model.clubLevel > GetClubMemberLevel()) return; - setSelectedModelName(name); + setSelectedModelName(RoomModels[index].name); } const createRoom = () => @@ -97,9 +97,9 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { - RoomModels.map(model => + RoomModels.map((model, index )=> { - return ( selectModel(model) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetClubMemberLevel() < model.clubLevel) }> + return ( selectModel(model, index) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetClubMemberLevel() < model.clubLevel) }> From 2a989bf6ce518c2cc4c230233ea262f876a5d6d2 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 02:29:18 -0400 Subject: [PATCH 003/331] Fix catalog opening when reset --- src/components/catalog/CatalogView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index 115d2892..1cfbe184 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -55,7 +55,6 @@ export const CatalogView: FC<{}> = props => setActiveNodes([]); setSearchResult(null); setFrontPageItems([]); - setIsVisible(true); }); }, []); From b9b5bafaf3b74b53b628c8318ba9cc83f140aa13 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 02:58:36 -0400 Subject: [PATCH 004/331] Add RoomEnterError listener --- src/api/nitro/session/VisitDesktop.ts | 9 ++++++ src/api/nitro/session/index.ts | 1 + .../navigator/NavigatorMessageHandler.tsx | 32 +++++++++++++++++-- src/components/toolbar/ToolbarView.tsx | 12 ++----- 4 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 src/api/nitro/session/VisitDesktop.ts diff --git a/src/api/nitro/session/VisitDesktop.ts b/src/api/nitro/session/VisitDesktop.ts new file mode 100644 index 00000000..e7416a35 --- /dev/null +++ b/src/api/nitro/session/VisitDesktop.ts @@ -0,0 +1,9 @@ +import { GetRoomSession, GetRoomSessionManager, GoToDesktop } from '.'; + +export const VisitDesktop = () => +{ + if(!GetRoomSession()) return; + + GoToDesktop(); + GetRoomSessionManager().removeSession(-1); +} diff --git a/src/api/nitro/session/index.ts b/src/api/nitro/session/index.ts index 5b222369..a860d7a0 100644 --- a/src/api/nitro/session/index.ts +++ b/src/api/nitro/session/index.ts @@ -18,3 +18,4 @@ export * from './IsOwnerOfFloorFurniture'; export * from './IsOwnerOfFurniture'; export * from './IsRidingHorse'; export * from './StartRoomSession'; +export * from './VisitDesktop'; diff --git a/src/components/navigator/NavigatorMessageHandler.tsx b/src/components/navigator/NavigatorMessageHandler.tsx index 38c5f9d5..93c01d29 100644 --- a/src/components/navigator/NavigatorMessageHandler.tsx +++ b/src/components/navigator/NavigatorMessageHandler.tsx @@ -1,6 +1,6 @@ -import { GenericErrorEvent, GetGuestRoomResultEvent, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomSettingsUpdatedEvent, UserInfoEvent } from '@nitrots/nitro-renderer'; +import { CantConnectMessageParser, GenericErrorEvent, GetGuestRoomResultEvent, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomSettingsUpdatedEvent, UserInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; -import { CreateRoomSession, GetSessionDataManager, SendMessageComposer } from '../../api'; +import { CreateRoomSession, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, VisitDesktop } from '../../api'; import { UpdateDoorStateEvent } from '../../events'; import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; import { useNavigatorContext } from './NavigatorContext'; @@ -194,6 +194,33 @@ export const NavigatorMessageHandler: FC<{}> = props => SendMessageComposer(new RoomInfoComposer(parser.roomId, false, false)); }, []); + const onRoomEnterErrorEvent = useCallback((event: RoomEnterErrorEvent) => + { + const parser = event.getParser(); + + switch(parser.reason) + { + case CantConnectMessageParser.REASON_FULL: + NotificationUtilities.simpleAlert(LocalizeText('navigator.guestroomfull.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.guestroomfull.title')); + + break; + case CantConnectMessageParser.REASON_QUEUE_ERROR: + NotificationUtilities.simpleAlert(LocalizeText(`room.queue.error.${ parser.parameter }`), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); + + break; + case CantConnectMessageParser.REASON_BANNED: + NotificationUtilities.simpleAlert(LocalizeText('navigator.banned.text'), NotificationAlertType.DEFAULT, null, null, LocalizeText('navigator.banned.title')); + + break; + default: + NotificationUtilities.simpleAlert(LocalizeText('room.queue.error.title'), NotificationAlertType.DEFAULT, null, null, LocalizeText('room.queue.error.title')); + + break; + } + + VisitDesktop(); + }, []); + UseMessageEventHook(UserInfoEvent, onUserInfoEvent); UseMessageEventHook(RoomForwardEvent, onRoomForwardEvent); UseMessageEventHook(RoomEntryInfoMessageEvent, onRoomEntryInfoMessageEvent); @@ -208,6 +235,7 @@ export const NavigatorMessageHandler: FC<{}> = props => UseMessageEventHook(RoomCreatedEvent, onRoomCreatedEvent); UseMessageEventHook(NavigatorHomeRoomEvent, onNavigatorHomeRoomEvent); UseMessageEventHook(RoomSettingsUpdatedEvent, onRoomSettingsUpdatedEvent); + UseMessageEventHook(RoomEnterErrorEvent, onRoomEnterErrorEvent); return null; } diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index 06a69731..70decda4 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -1,6 +1,6 @@ import { Dispose, DropBounce, EaseOut, FigureUpdateEvent, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, UserInfoDataParser, UserInfoEvent, Wait } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; -import { CreateLinkEvent, GetRoomSession, GetRoomSessionManager, GetSessionDataManager, GetUserProfile, GoToDesktop, OpenMessengerChat } from '../../api'; +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, NavigatorEvent, UnseenItemTrackerUpdateEvent, UserSettingsUIEvent } from '../../events'; import { BatchUpdates, DispatchUiEvent, UseMessageEventHook, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; @@ -178,14 +178,6 @@ export const ToolbarView: FC = props => } }, []); - const visitDesktop = useCallback(() => - { - if(!GetRoomSession()) return; - - GoToDesktop(); - GetRoomSessionManager().removeSession(-1); - }, []); - return ( <> @@ -200,7 +192,7 @@ export const ToolbarView: FC = props => } { isInRoom && - } + VisitDesktop() } /> } { !isInRoom && CreateLinkEvent('navigator/goto/home') } /> } handleToolbarItemClick(ToolbarViewItems.NAVIGATOR_ITEM) } /> From 079a57c012d544721d4d4e73c2b01f0e94e6bc63 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 03:22:01 -0400 Subject: [PATCH 005/331] Calendar change --- src/components/campaign/CalendarItemView.tsx | 4 +-- src/components/campaign/CalendarView.tsx | 26 ++------------------ 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx index 7ca4cb66..ae81dd34 100644 --- a/src/components/campaign/CalendarItemView.tsx +++ b/src/components/campaign/CalendarItemView.tsx @@ -1,15 +1,15 @@ import { FC } from 'react'; import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../../api'; import { Base, Column, Flex, LayoutImage } from '../../common'; -import { CalendarItem } from './common/CalendarItem'; import { CalendarItemState } from './common/CalendarItemState'; +import { ICalendarItem } from './common/ICalendarItem'; interface CalendarItemViewProps { itemId: number; state: number; active?: boolean; - product?: CalendarItem; + product?: ICalendarItem; onClick: (itemId: number) => void; } diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index 5afbd1a6..40675056 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -2,14 +2,14 @@ import { FC, useState } from 'react'; import { GetSessionDataManager, LocalizeText } from '../../api'; import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { CalendarItemView } from './CalendarItemView'; -import { CalendarItem } from './common/CalendarItem'; import { CalendarItemState } from './common/CalendarItemState'; +import { ICalendarItem } from './common/ICalendarItem'; interface CalendarViewProps { close(): void; openPackage(id: number, asStaff: boolean): void; - receivedProducts: Map; + receivedProducts: Map; campaignName: string; currentDay: number; numDays: number; @@ -139,28 +139,6 @@ export const CalendarView: FC = props => - {/* - - - - - - { [...Array(TOTAL_SHOWN_ITEMS)].map((e, i) => - { - const day = (index + i); - - return ( - - - - ); - }) } - - - - - - */} ) From 4a0dd14ba4cbc36f764fee001af2aee779438ca6 Mon Sep 17 00:00:00 2001 From: oshawott Date: Wed, 16 Mar 2022 18:23:54 +1100 Subject: [PATCH 006/331] Fix opening gift page from Club Gift notification Didn't use the ui-config value for the HC gift page. Opens blank catalogue. --- src/api/notification/NotificationUtilities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/notification/NotificationUtilities.ts b/src/api/notification/NotificationUtilities.ts index 27979b52..a561fe73 100644 --- a/src/api/notification/NotificationUtilities.ts +++ b/src/api/notification/NotificationUtilities.ts @@ -99,7 +99,7 @@ export class NotificationUtilities { if(numGifts <= 0) return; - this.showSingleBubble(numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + CatalogPageName.CLUB_GIFTS)); + this.showSingleBubble(numGifts.toString(), NotificationBubbleType.CLUBGIFT, null, ('catalog/open/' + GetConfiguration('hc.center')['catalog.gifts'])); } public static handleMOTD(messages: string[]): void From 0d5ad1bc9782893d2bdc4c3c705afd52f98e764d Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 03:31:05 -0400 Subject: [PATCH 007/331] Fix button order --- .../room/widgets/infostand/InfoStandWidgetFurniView.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx index bf92adee..55def41f 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx @@ -354,14 +354,14 @@ export const InfoStandWidgetFurniView: FC = props } - { canUse && - } { (pickupMode !== PICKUP_MODE_NONE) && } + { canUse && + } { ((furniKeys.length > 0 && furniValues.length > 0) && (furniKeys.length === furniValues.length)) && - - - diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx index f7fe7ea6..bbde7e98 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx @@ -154,7 +154,7 @@ export const CameraWidgetCheckoutView: FC = props { !wasPicturePublished && - } diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx index fb359829..1ca3e3cf 100644 --- a/src/components/camera/views/editor/CameraWidgetEditorView.tsx +++ b/src/components/camera/views/editor/CameraWidgetEditorView.tsx @@ -204,21 +204,21 @@ export const CameraWidgetEditorView: FC = props => - - - - - diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx index bcfb7d3d..7451ab75 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx @@ -23,7 +23,7 @@ export const CameraWidgetEffectListItemView: FC (!isActive && selectEffect()) }> { isActive && - } { !isLocked && (thumbnailUrl && thumbnailUrl.length > 0) && diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 76b59149..2da5ee13 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -220,7 +220,7 @@ export const CatalogGiftView: FC<{}> = props => { LocalizeText('catalog.gift_wrapping.pick_color') } - { colors.map(color => diff --git a/src/components/catalog/views/page/common/CatalogSearchView.tsx b/src/components/catalog/views/page/common/CatalogSearchView.tsx index aa299826..d0a5281d 100644 --- a/src/components/catalog/views/page/common/CatalogSearchView.tsx +++ b/src/components/catalog/views/page/common/CatalogSearchView.tsx @@ -118,11 +118,11 @@ export const CatalogSearchView: FC<{}> = props => updateSearchValue(event.target.value) } onKeyDown={ event => ((event.code === 'Enter') || (event.code === 'NumpadEnter')) && processSearch(searchValue) } /> { (!searchValue || !searchValue.length) && - } { searchValue && !!searchValue.length && - } diff --git a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx index 7541e599..9d0a25ee 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx @@ -108,25 +108,25 @@ export const CatalogLayoutVipBuyView: FC = props => if(pendingOffer.priceCredits > GetCurrencyAmount(-1)) { - return ; + return ; } if(pendingOffer.priceActivityPoints > GetCurrencyAmount(pendingOffer.priceActivityPointsType)) { - return ; + return ; } switch(purchaseState) { case CatalogPurchaseState.CONFIRM: - return ; + return ; case CatalogPurchaseState.PURCHASE: - return ; + return ; case CatalogPurchaseState.FAILED: - return ; + return ; case CatalogPurchaseState.NONE: default: - return ; + return ; } }, [ pendingOffer, purchaseState, purchaseSubscription ]); diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index 828461eb..6dd57954 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -84,15 +84,15 @@ export const CatalogLayoutMarketplaceItemView: FC = pr { ((type === OWN_OFFER) && (offerData.status !== MarketPlaceOfferState.SOLD)) && - } { type === PUBLIC_OFFER && <> - - } diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index 710d422a..1c95a53c 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -93,7 +93,7 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop { LocalizeText('catalog.marketplace.redeem.get_credits', ['count', 'credits'], [ soldOffers.length.toString(), creditsWaiting.toString() ]) } - } diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx index 8079ef9f..9b4bea6c 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx @@ -142,13 +142,13 @@ export const CatalogLayoutMarketplacePublicItemsView: FC - - - diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx index 8397059b..f8f643e1 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx @@ -69,7 +69,7 @@ export const SearchFormView: FC = props => setMax(event.target.valueAsNumber) } /> - + } ); diff --git a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx index 5634b618..694dfefc 100644 --- a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx @@ -116,7 +116,7 @@ export const MarketplacePostOfferView : FC<{}> = props => { LocalizeText('inventory.marketplace.make_offer.final_price', [ 'commission', 'finalprice' ], [ marketplaceConfiguration.commission.toString(), (askingPrice + marketplaceConfiguration.commission).toString() ]) } } - diff --git a/src/components/catalog/views/page/layout/vip-gifts/VipGiftItemView.tsx b/src/components/catalog/views/page/layout/vip-gifts/VipGiftItemView.tsx index fdd9cdb7..a3d2114b 100644 --- a/src/components/catalog/views/page/layout/vip-gifts/VipGiftItemView.tsx +++ b/src/components/catalog/views/page/layout/vip-gifts/VipGiftItemView.tsx @@ -49,7 +49,7 @@ export const VipGiftItem : FC = props => { getItemTitle() } - diff --git a/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx b/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx index 2b170ccd..11705f0e 100644 --- a/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx +++ b/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx @@ -41,7 +41,7 @@ export const InventoryFurnitureSearchView: FC return ( setSearchValue(event.target.value) } /> - diff --git a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx b/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx index 41db0ec4..34b0c007 100644 --- a/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx +++ b/src/components/navigator/views/room-doorbell/NavigatorRoomDoorbellView.tsx @@ -50,10 +50,10 @@ export const NavigatorRoomDoorbellView: FC = pro { (state === UpdateDoorStateEvent.START_DOORBELL) && - } - diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx index eee574db..35fc7a70 100644 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx @@ -1,8 +1,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomMuteComposer, RoomSettingsComposer, RoomStaffPickComposer, SecurityLevel, UserHomeRoomComposer } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { GetConfiguration, GetGroupInformation, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { GetGroupInformation, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, UserProfileIconView } from '../../../../common'; import { FloorplanEditorEvent, NavigatorEvent, RoomWidgetThumbnailEvent } from '../../../../events'; import { BatchUpdates, DispatchUiEvent } from '../../../../hooks'; @@ -35,7 +35,7 @@ export const NavigatorRoomInfoView: FC = props => } } - const processAction = useCallback((action: string, value?: string) => + const processAction = (action: string, value?: string) => { if(!roomInfoData || !roomInfoData.enteredGuestRoom) return; @@ -88,26 +88,14 @@ export const NavigatorRoomInfoView: FC = props => return; } - }, [ onCloseClick, dispatchNavigatorState, roomInfoData, homeRoomId ]); + } useEffect(() => { if(!roomInfoData || !roomInfoData.enteredGuestRoom) return; - let thumbnailUrl: string = null; - - if(roomInfoData.enteredGuestRoom.officialRoomPicRef) - { - thumbnailUrl = (GetConfiguration('image.library.url') + roomInfoData.enteredGuestRoom.officialRoomPicRef); - } - else - { - thumbnailUrl = (GetConfiguration('thumbnails.url').replace('%thumbnail%', roomInfoData.enteredGuestRoom.roomId.toString())); - } - BatchUpdates(() => { - setRoomThumbnail(thumbnailUrl); setIsRoomPicked(roomInfoData.enteredGuestRoom.roomPicker); setIsRoomMuted(roomInfoData.enteredGuestRoom.allInRoomMuted); }); @@ -141,9 +129,10 @@ export const NavigatorRoomInfoView: FC = props => { LocalizeText('navigator.roomrating') } { roomInfoData.enteredGuestRoom.score } - { (roomInfoData.enteredGuestRoom.tags.length > 0) && + { - { roomInfoData.enteredGuestRoom.tags.map(tag => + processAction('navigator_search_tag', 'test') }>#test + { (roomInfoData.enteredGuestRoom.tags.length > 0) && roomInfoData.enteredGuestRoom.tags.map(tag => { return processAction('navigator_search_tag', tag) }>#{ tag } }) } @@ -161,7 +150,7 @@ export const NavigatorRoomInfoView: FC = props => } - { roomInfoData.enteredGuestRoom.description } + { roomInfoData.enteredGuestRoom.description } { (roomInfoData.enteredGuestRoom.habboGroupId > 0) && processAction('open_group_info') }> @@ -173,16 +162,18 @@ export const NavigatorRoomInfoView: FC = props => { hasPermission('staff_pick') && - } - { hasPermission('settings') && - } + <> + + } } diff --git a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx b/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx index 12023947..1503dec1 100644 --- a/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx +++ b/src/components/navigator/views/room-password/NavigatorRoomPasswordView.tsx @@ -49,9 +49,9 @@ export const NavigatorRoomPasswordView: FC = pro { LocalizeText('navigator.password.enter') } setPassword(event.target.value) } /> - - diff --git a/src/components/navigator/views/search/NavigatorSearchView.tsx b/src/components/navigator/views/search/NavigatorSearchView.tsx index df426603..0ab7a2a3 100644 --- a/src/components/navigator/views/search/NavigatorSearchView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchView.tsx @@ -55,7 +55,7 @@ export const NavigatorSearchView: FC = props => setSearchValue(event.target.value) } onKeyDown={ event => handleKeyDown(event) } /> - From 98fb0084d064959957515c910541d2a19b4075e9 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:00:35 -0400 Subject: [PATCH 010/331] Update navigator settings --- src/components/navigator/NavigatorView.scss | 1 - .../views/room-info/NavigatorRoomInfoView.tsx | 25 ++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss index 0e4c348b..76adf929 100644 --- a/src/components/navigator/NavigatorView.scss +++ b/src/components/navigator/NavigatorView.scss @@ -42,7 +42,6 @@ .nitro-room-info { width: $room-info-width; - max-height: 300px; } .nitro-room-link { diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx index 35fc7a70..0322fdd5 100644 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx @@ -116,7 +116,10 @@ export const NavigatorRoomInfoView: FC = props => - { roomInfoData.enteredGuestRoom.roomName } + + processAction('set_home_room') } className={ 'flex-shrink-0 icon icon-house-small cursor-pointer' + classNames({ ' gray': homeRoomId !== roomInfoData.enteredGuestRoom.roomId }) } /> + { roomInfoData.enteredGuestRoom.roomName } + { roomInfoData.enteredGuestRoom.showOwner && { LocalizeText('navigator.roomownercaption') } @@ -129,25 +132,20 @@ export const NavigatorRoomInfoView: FC = props => { LocalizeText('navigator.roomrating') } { roomInfoData.enteredGuestRoom.score } - { + { (roomInfoData.enteredGuestRoom.tags.length > 0) && - processAction('navigator_search_tag', 'test') }>#test - { (roomInfoData.enteredGuestRoom.tags.length > 0) && roomInfoData.enteredGuestRoom.tags.map(tag => + { roomInfoData.enteredGuestRoom.tags.map(tag => { return processAction('navigator_search_tag', tag) }>#{ tag } }) } } - - - processAction('set_home_room') } className={ 'flex-shrink-0 icon icon-house-small cursor-pointer' + classNames({ ' gray': homeRoomId !== roomInfoData.enteredGuestRoom.roomId }) } /> + + DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_ROOM_LINK)) } /> + { hasPermission('settings') && + processAction('open_room_settings') } /> } - { hasPermission('settings') && - - processAction('open_room_settings') } /> - processAction('open_floorplan_editor') } /> - } { roomInfoData.enteredGuestRoom.description } @@ -173,6 +171,9 @@ export const NavigatorRoomInfoView: FC = props => + } } From 6394b9d2f4239a1f0b91ba70607b485b29f6cd37 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:20:39 -0400 Subject: [PATCH 011/331] Fix empty badge name & desc --- src/api/utils/LocalizeBadgeDescription.ts | 8 ++++++-- src/api/utils/LocalizeBageName.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/api/utils/LocalizeBadgeDescription.ts b/src/api/utils/LocalizeBadgeDescription.ts index 992e8f92..94f50cb7 100644 --- a/src/api/utils/LocalizeBadgeDescription.ts +++ b/src/api/utils/LocalizeBadgeDescription.ts @@ -1,6 +1,10 @@ import { GetNitroInstance } from '..'; -export function LocalizeBadgeDescription(key: string): string +export const LocalizeBadgeDescription = (key: string) => { - return GetNitroInstance().localization.getBadgeDesc(key); + let badgeDesc = GetNitroInstance().localization.getBadgeName(key); + + if(!badgeDesc || !badgeDesc.length) badgeDesc = `badge_desc_${ key }`; + + return badgeDesc; } diff --git a/src/api/utils/LocalizeBageName.ts b/src/api/utils/LocalizeBageName.ts index f43b271c..d722ab07 100644 --- a/src/api/utils/LocalizeBageName.ts +++ b/src/api/utils/LocalizeBageName.ts @@ -1,6 +1,10 @@ import { GetNitroInstance } from '..'; -export function LocalizeBadgeName(key: string): string +export const LocalizeBadgeName = (key: string) => { - return GetNitroInstance().localization.getBadgeName(key); + let badgeName = GetNitroInstance().localization.getBadgeName(key); + + if(!badgeName || !badgeName.length) badgeName = `badge_name_${ key }`; + + return badgeName; } From ef3b094a7c1dedcbf59cc8e3a809ec60f1b28c17 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:22:58 -0400 Subject: [PATCH 012/331] Allow html in bubble alerts --- .../views/bubble-layouts/NotificationDefaultBubbleView.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx b/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx index d1d78563..b778ff58 100644 --- a/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx +++ b/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx @@ -10,6 +10,8 @@ export interface NotificationDefaultBubbleViewProps extends LayoutNotificationBu export const NotificationDefaultBubbleView: FC = props => { const { item = null, close = null, ...rest } = props; + + const htmlText = item.message.replace(/\r\n|\r|\n/g, '
'); return ( @@ -17,7 +19,7 @@ export const NotificationDefaultBubbleView: FC }
- { item.message } + ); } From 900bfc3bacf64971da5e1fa4008abcadb0e3d8a0 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:25:45 -0400 Subject: [PATCH 013/331] Fix quantity input width --- src/components/catalog/CatalogView.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss index d897a862..e90bfd58 100644 --- a/src/components/catalog/CatalogView.scss +++ b/src/components/catalog/CatalogView.scss @@ -14,7 +14,7 @@ .quantity-input { min-height: 17px; height: 17px; - width: 20px; + width: 28px; padding: 0 4px; text-align: right; } From ff46a89e791ea319de5896cb20c8dfc93260b715 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:32:53 -0400 Subject: [PATCH 014/331] Fix floorplan buttons --- src/components/floorplan-editor/common/FloorplanEditor.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/floorplan-editor/common/FloorplanEditor.ts b/src/components/floorplan-editor/common/FloorplanEditor.ts index 9e9d8ba9..ae81088a 100644 --- a/src/components/floorplan-editor/common/FloorplanEditor.ts +++ b/src/components/floorplan-editor/common/FloorplanEditor.ts @@ -192,9 +192,11 @@ export class FloorplanEditor extends PixiApplicationProxy } return; case FloorAction.UP: + if(tile.height === 'x') return; futureHeightIndex = heightIndex + 1; break; case FloorAction.DOWN: + if(tile.height === 'x' || (heightIndex <= 1)) return; futureHeightIndex = heightIndex - 1; break; case FloorAction.SET: From d0145cc0eddf30c749345de64eaadd7ddb45ed16 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 05:38:15 -0400 Subject: [PATCH 015/331] Add rotate & state click on room previewer --- src/common/layout/LayoutRoomPreviewerView.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx index a7722c73..ff2caeb6 100644 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ b/src/common/layout/LayoutRoomPreviewerView.tsx @@ -1,5 +1,5 @@ import { ColorConverter, IRoomRenderingCanvas, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useRef, useState } from 'react'; +import { FC, MouseEvent, useCallback, useEffect, useRef, useState } from 'react'; import { GetNitroInstance } from '../../api'; export interface LayoutRoomPreviewerViewProps @@ -14,6 +14,20 @@ export const LayoutRoomPreviewerView: FC = props = const [ renderingCanvas, setRenderingCanvas ] = useState(null); const elementRef = useRef(); + const onClick = (event: MouseEvent) => + { + if(!roomPreviewer) return; + + if(event.shiftKey) + { + roomPreviewer.changeRoomObjectDirection(); + } + else + { + roomPreviewer.changeRoomObjectState(); + } + } + const update = useCallback((time: number) => { if(!roomPreviewer || !renderingCanvas || !elementRef.current) return; @@ -83,7 +97,7 @@ export const LayoutRoomPreviewerView: FC = props = return (
-
+
{ props.children }
); From 0ee0e9a3f09ab08d68fecc7c9f58a9f6dbc3e0ea Mon Sep 17 00:00:00 2001 From: jordy Date: Wed, 16 Mar 2022 15:07:35 +0100 Subject: [PATCH 016/331] Adjusted the width of the navigator to be 30px wider. Some languagues got longer words and therefore would glitch the navigator. --- src/App.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index a8a41ed8..27027ac9 100644 --- a/src/App.scss +++ b/src/App.scss @@ -29,7 +29,7 @@ $catalog-height: 400px; $inventory-width: 528px; $inventory-height: 320px; -$navigator-width: 400px; +$navigator-width: 430px; $navigator-height: 420px; $chat-input-style-selector-widget-width: 210px; From 4d9e5974c522b828d46044b52c64224d21cf1887 Mon Sep 17 00:00:00 2001 From: Sledmore Date: Wed, 16 Mar 2022 14:49:54 +0000 Subject: [PATCH 017/331] Fixes a height issue w/ marketplace items. --- src/components/catalog/CatalogView.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss index e90bfd58..8e353790 100644 --- a/src/components/catalog/CatalogView.scss +++ b/src/components/catalog/CatalogView.scss @@ -99,6 +99,7 @@ .layout-grid-item { height: 75px !important; max-height: 75px !important; + min-height: 75px; } } From a51ca7682a82f025b0641ee833f1f266696b014c Mon Sep 17 00:00:00 2001 From: Sledmore Date: Wed, 16 Mar 2022 15:14:45 +0000 Subject: [PATCH 018/331] Adds overflow hidden to marketplace own offers (scroll fix) --- .../layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index 1c95a53c..2772c0d9 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -83,7 +83,7 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop }); return ( - + { (creditsWaiting <= 0) && { LocalizeText('catalog.marketplace.redeem.no_sold_items') } From efa419ae37883ededfc12659dcedfc19c4d696ef Mon Sep 17 00:00:00 2001 From: Endrit Date: Wed, 16 Mar 2022 16:25:41 +0100 Subject: [PATCH 019/331] fixed badge description --- src/api/utils/LocalizeBadgeDescription.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/utils/LocalizeBadgeDescription.ts b/src/api/utils/LocalizeBadgeDescription.ts index 94f50cb7..04fd7df9 100644 --- a/src/api/utils/LocalizeBadgeDescription.ts +++ b/src/api/utils/LocalizeBadgeDescription.ts @@ -2,7 +2,7 @@ import { GetNitroInstance } from '..'; export const LocalizeBadgeDescription = (key: string) => { - let badgeDesc = GetNitroInstance().localization.getBadgeName(key); + let badgeDesc = GetNitroInstance().localization.getBadgeDesc(key); if(!badgeDesc || !badgeDesc.length) badgeDesc = `badge_desc_${ key }`; From f85efea75800247266b770c7fb4fc630d9ec5ab6 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 11:56:08 -0400 Subject: [PATCH 020/331] fix sound settings --- src/components/user-settings/UserSettingsView.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 478c7b3a..368657c7 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -4,7 +4,7 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../api'; import { Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; import { UserSettingsUIEvent } from '../../events'; -import { DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; +import { DispatchMainEvent, DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; export const UserSettingsView: FC<{}> = props => { @@ -46,6 +46,7 @@ export const UserSettingsView: FC<{}> = props => settingsEvent.chatType = parser.chatType; setUserSettings(settingsEvent); + DispatchMainEvent(settingsEvent); }, []); UseMessageEventHook(UserSettingsEvent, onUserSettingsEvent); @@ -92,6 +93,7 @@ export const UserSettingsView: FC<{}> = props => } if(doUpdate) setUserSettings(clone); + DispatchMainEvent(clone) }, [userSettings]); const saveRangeSlider = useCallback((type: string) => From a02696de2d67f34739389abf7804382eb4ad232c Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 12:06:24 -0400 Subject: [PATCH 021/331] fixed thumbnail button --- .../navigator/views/room-info/NavigatorRoomInfoView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx index 0322fdd5..cac15c02 100644 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx @@ -111,7 +111,7 @@ export const NavigatorRoomInfoView: FC = props => <> - { hasPermission('settings') && processAction('open_room_thumbnail_camera') } /> } + { hasPermission('settings') && processAction('open_room_thumbnail_camera') } /> } From 36663a87826816f3e51aaccfe035a632851653da Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 12:25:19 -0400 Subject: [PATCH 022/331] Disable CI for now --- .github/workflows/build.yml | 34 ----------------------- .gitlab-ci.yml => .gitlab-ci.yml-disabled | 0 2 files changed, 34 deletions(-) delete mode 100644 .github/workflows/build.yml rename .gitlab-ci.yml => .gitlab-ci.yml-disabled (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 04930f22..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Build - -on: - push: - branches: [dev] - -jobs: - build: - runs-on: dedicated-server - strategy: - matrix: - node-version: [16.x] - - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - cache: "yarn" - - name: Install dependencies - run: | - yarn remove @nitrots/nitro-renderer - yarn add git+https://git@git.krews.org/nitro/nitro-renderer#dev - yarn install - - name: Build Nitro - run: | - yarn build - - name: Archive Artifacts - uses: actions/upload-artifact@v2 - with: - path: | - build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml-disabled similarity index 100% rename from .gitlab-ci.yml rename to .gitlab-ci.yml-disabled From 1547c40ff95483829e1327d617d493329a803c60 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 12:36:46 -0400 Subject: [PATCH 023/331] Fix width on seasonal currency --- src/components/purse/views/SeasonalView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/purse/views/SeasonalView.tsx b/src/components/purse/views/SeasonalView.tsx index c60824a5..0c869bb7 100644 --- a/src/components/purse/views/SeasonalView.tsx +++ b/src/components/purse/views/SeasonalView.tsx @@ -13,7 +13,7 @@ export const SeasonalView: FC = props => const { type = -1, amount = -1 } = props; return ( - + { LocalizeText(`purse.seasonal.currency.${ type }`) } { LocalizeFormattedNumber(amount) } From 157f68717096ddc5bf9d0e64040695deb24f65fb Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 12:47:34 -0400 Subject: [PATCH 024/331] Update NavigatorRoomInfoView --- .../views/room-info/NavigatorRoomInfoView.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx index cac15c02..a8bbfe46 100644 --- a/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/room-info/NavigatorRoomInfoView.tsx @@ -140,12 +140,10 @@ export const NavigatorRoomInfoView: FC = props => }) } } - - - DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_ROOM_LINK)) } /> - { hasPermission('settings') && - processAction('open_room_settings') } /> } - + + { hasPermission('settings') && + processAction('open_room_settings') } /> } + DispatchUiEvent(new NavigatorEvent(NavigatorEvent.TOGGLE_ROOM_LINK)) } /> { roomInfoData.enteredGuestRoom.description } From 60fe9fe265e774d689205803d9c07407f3ecdec7 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 13:15:28 -0400 Subject: [PATCH 025/331] Fix alert --- src/api/notification/NotificationUtilities.ts | 1 - .../views/alert-layouts/GetAlertLayout.tsx | 11 ++---- .../NotificationDefaultAlertView.tsx | 9 +++-- .../NotificationEventAlertView.tsx | 36 ------------------- 4 files changed, 9 insertions(+), 48 deletions(-) delete mode 100644 src/components/notification-center/views/alert-layouts/NotificationEventAlertView.tsx diff --git a/src/api/notification/NotificationUtilities.ts b/src/api/notification/NotificationUtilities.ts index a561fe73..45cc6311 100644 --- a/src/api/notification/NotificationUtilities.ts +++ b/src/api/notification/NotificationUtilities.ts @@ -1,6 +1,5 @@ import { HabboWebTools, RoomEnterEffect } from '@nitrots/nitro-renderer'; import { CreateLinkEvent, GetConfiguration, GetNitroInstance, LocalizeText } from '..'; -import { CatalogPageName } from '../../components/catalog/common/CatalogPageName'; import { NotificationAlertEvent, NotificationConfirmEvent } from '../../events'; import { NotificationBubbleEvent } from '../../events/notification-center/NotificationBubbleEvent'; import { DispatchUiEvent } from '../../hooks'; diff --git a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx index 10235956..44b24271 100644 --- a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx +++ b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx @@ -1,6 +1,5 @@ -import { NotificationAlertItem, NotificationAlertType } from '../../../../api'; +import { NotificationAlertItem } from '../../../../api'; import { NotificationDefaultAlertView } from './NotificationDefaultAlertView'; -import { NotificationEventAlertView } from './NotificationEventAlertView'; export const GetAlertLayout = (item: NotificationAlertItem, close: () => void) => { @@ -8,11 +7,5 @@ export const GetAlertLayout = (item: NotificationAlertItem, close: () => void) = const props = { key: item.id, item, close }; - switch(item.alertType) - { - case NotificationAlertType.EVENT: - return - default: - return - } + return } diff --git a/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx b/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx index 13ab2fb8..3187faa9 100644 --- a/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx +++ b/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx @@ -18,6 +18,8 @@ export const NotificationDefaultAlertView: FC close(); }, [ item, close ]); + const isAction = (item.clickUrl && item.clickUrl.startsWith('event:')); + return ( { (item.messages.length > 0) && item.messages.map((message, index) => @@ -27,9 +29,12 @@ export const NotificationDefaultAlertView: FC return ; }) } - - { item.clickUrl && item.clickUrl.length && + { !isAction && + } + { !isAction && item.clickUrl && (item.clickUrl.length > 0) && } + { isAction && item.clickUrl && (item.clickUrl.length > 0) && + } ); diff --git a/src/components/notification-center/views/alert-layouts/NotificationEventAlertView.tsx b/src/components/notification-center/views/alert-layouts/NotificationEventAlertView.tsx deleted file mode 100644 index dc016e45..00000000 --- a/src/components/notification-center/views/alert-layouts/NotificationEventAlertView.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { FC, useCallback } from 'react'; -import { LocalizeText, NotificationAlertItem, NotificationUtilities } from '../../../../api'; -import { LayoutNotificationAlertView, LayoutNotificationAlertViewProps } from '../../../../common'; - -export interface NotificationEventAlertViewProps extends LayoutNotificationAlertViewProps -{ - item: NotificationAlertItem; -} - -export const NotificationEventAlertView: FC = props => -{ - const { item = null, title = ((props.item && props.item.title) || ''), close = null, ...rest } = props; - - const visitUrl = useCallback(() => - { - NotificationUtilities.openUrl(item.clickUrl); - - close(); - }, [ item, close ]); - - return ( - - { (item.messages.length > 0) && item.messages.map((message, index) => - { - const htmlText = message.replace(/\r\n|\r|\n/g, '
'); - - return ( -
- ); - }) } -
- -
- - ); -} From ca21e833c867da4117f1530011af064fe060b75e Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 13:34:51 -0400 Subject: [PATCH 026/331] Fix infostand motto style --- .../widgets/infostand/InfoStandWidgetUserView.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx index 309f8a8d..aa3aa20f 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx @@ -138,14 +138,18 @@ export const InfoStandWidgetUserView: FC = props = { (userData.type !== RoomWidgetUpdateInfostandUserEvent.OWN_USER) && - { motto } } + + { motto } + } { userData.type === RoomWidgetUpdateInfostandUserEvent.OWN_USER && - { !isEditingMotto && - setIsEditingMotto(true) }>{ motto } } - { isEditingMotto && - setMotto(event.target.value) } onBlur={ onMottoBlur } onKeyDown={ onMottoKeyDown } autoFocus={ true } /> } + + { !isEditingMotto && + setIsEditingMotto(true) }>{ motto } } + { isEditingMotto && + setMotto(event.target.value) } onBlur={ onMottoBlur } onKeyDown={ onMottoKeyDown } autoFocus={ true } /> } + }
From 7f3c5eb3d201298b6974f9bbc0a647d0d0f9c01e Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 13:56:52 -0400 Subject: [PATCH 027/331] listen for open room creator --- src/components/navigator/NavigatorMessageHandler.tsx | 10 ++++++++-- src/components/navigator/NavigatorView.tsx | 5 +++++ src/events/navigator/NavigatorEvent.ts | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/navigator/NavigatorMessageHandler.tsx b/src/components/navigator/NavigatorMessageHandler.tsx index 93c01d29..961c95e4 100644 --- a/src/components/navigator/NavigatorMessageHandler.tsx +++ b/src/components/navigator/NavigatorMessageHandler.tsx @@ -1,7 +1,7 @@ -import { CantConnectMessageParser, GenericErrorEvent, GetGuestRoomResultEvent, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomSettingsUpdatedEvent, UserInfoEvent } from '@nitrots/nitro-renderer'; +import { CantConnectMessageParser, GenericErrorEvent, GetGuestRoomResultEvent, LegacyExternalInterface, NavigatorCategoriesComposer, NavigatorCategoriesEvent, NavigatorHomeRoomEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchEvent, NavigatorSettingsComposer, RoomCreatedEvent, RoomDataParser, RoomDoorbellAcceptedEvent, RoomDoorbellEvent, RoomDoorbellRejectedEvent, RoomEnterErrorEvent, RoomEntryInfoMessageEvent, RoomForwardEvent, RoomInfoComposer, RoomSettingsUpdatedEvent, UserInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { CreateRoomSession, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, VisitDesktop } from '../../api'; -import { UpdateDoorStateEvent } from '../../events'; +import { NavigatorEvent, UpdateDoorStateEvent } from '../../events'; import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; import { useNavigatorContext } from './NavigatorContext'; import { NavigatorActions } from './reducers/NavigatorReducer'; @@ -221,6 +221,11 @@ export const NavigatorMessageHandler: FC<{}> = props => VisitDesktop(); }, []); + const onRoomCreatorEvent = useCallback((event: RoomEnterErrorEvent) => + { + DispatchUiEvent(new NavigatorEvent(NavigatorEvent.SHOW_ROOM_CREATOR)); + },[]); + UseMessageEventHook(UserInfoEvent, onUserInfoEvent); UseMessageEventHook(RoomForwardEvent, onRoomForwardEvent); UseMessageEventHook(RoomEntryInfoMessageEvent, onRoomEntryInfoMessageEvent); @@ -236,6 +241,7 @@ export const NavigatorMessageHandler: FC<{}> = props => UseMessageEventHook(NavigatorHomeRoomEvent, onNavigatorHomeRoomEvent); UseMessageEventHook(RoomSettingsUpdatedEvent, onRoomSettingsUpdatedEvent); UseMessageEventHook(RoomEnterErrorEvent, onRoomEnterErrorEvent); + UseMessageEventHook(NavigatorOpenRoomCreatorEvent, onRoomCreatorEvent); return null; } diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index da22c3ce..98595623 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -46,6 +46,10 @@ export const NavigatorView: FC<{}> = props => case NavigatorEvent.TOGGLE_ROOM_LINK: setRoomLinkOpen(value => !value); return; + case NavigatorEvent.SHOW_ROOM_CREATOR: + setIsVisible(true); + setCreatorOpen(true); + return; } }, []); @@ -54,6 +58,7 @@ export const NavigatorView: FC<{}> = props => UseUiEvent(NavigatorEvent.TOGGLE_NAVIGATOR, onNavigatorEvent); UseUiEvent(NavigatorEvent.TOGGLE_ROOM_INFO, onNavigatorEvent); UseUiEvent(NavigatorEvent.TOGGLE_ROOM_LINK, onNavigatorEvent); + UseUiEvent(NavigatorEvent.SHOW_ROOM_CREATOR, onNavigatorEvent); const onUpdateDoorStateEvent = useCallback((event: UpdateDoorStateEvent) => { diff --git a/src/events/navigator/NavigatorEvent.ts b/src/events/navigator/NavigatorEvent.ts index 2323940d..848e6747 100644 --- a/src/events/navigator/NavigatorEvent.ts +++ b/src/events/navigator/NavigatorEvent.ts @@ -8,6 +8,7 @@ export class NavigatorEvent extends NitroEvent public static TOGGLE_ROOM_INFO: string = 'NE_TOGGLE_ROOM_INFO'; public static TOGGLE_ROOM_LINK: string = 'NE_TOGGLE_ROOM_LINK'; public static TOGGLE_ROOM_SETTINGS: string = 'NE_TOGGLE_ROOM_SETTINGS'; + public static SHOW_ROOM_CREATOR: string = 'NE_TOGGLE_CREATOR'; private _roomId: number; private _password: string; From a26084b976475d835ab1ba3722c0953acdab2596 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 13:58:11 -0400 Subject: [PATCH 028/331] Fix css issue in room rights --- src/components/navigator/NavigatorView.scss | 3 +-- .../NavigatorRoomSettingsRightsTabView.tsx | 26 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss index 76adf929..22b513ce 100644 --- a/src/components/navigator/NavigatorView.scss +++ b/src/components/navigator/NavigatorView.scss @@ -52,8 +52,7 @@ width: 400px; .list-container { - min-height: 100px; - max-height: 100px; + height: 100px; .list-item { background-color: $grid-active-bg-color; diff --git a/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsRightsTabView.tsx b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsRightsTabView.tsx index 902ae41d..0014543c 100644 --- a/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsRightsTabView.tsx +++ b/src/components/navigator/views/room-settings/views/NavigatorRoomSettingsRightsTabView.tsx @@ -23,22 +23,24 @@ export const NavigatorRoomSettingsRightsTabView: FC + { LocalizeText('navigator.flatctrls.userswithrights', [ 'displayed', 'total' ], [ roomSettingsData.usersWithRights.size.toString(), roomSettingsData.usersWithRights.size.toString() ]) } - - { Array.from(roomSettingsData.usersWithRights.entries()).map(([id, name], index) => - { - return ( - - - removeUserRights(id) }> { name } - - ); - }) } - + + + { Array.from(roomSettingsData.usersWithRights.entries()).map(([id, name], index) => + { + return ( + + + removeUserRights(id) }> { name } + + ); + }) } + + From de05736f1cf073b0e08731241cf42d9fd9caae25 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 14:06:02 -0400 Subject: [PATCH 029/331] Marketplace css update --- src/components/catalog/CatalogView.scss | 2 -- .../layout/marketplace/CatalogLayoutMarketplaceItemView.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/catalog/CatalogView.scss b/src/components/catalog/CatalogView.scss index 8e353790..7657fa17 100644 --- a/src/components/catalog/CatalogView.scss +++ b/src/components/catalog/CatalogView.scss @@ -98,8 +98,6 @@ .layout-grid-item { height: 75px !important; - max-height: 75px !important; - min-height: 75px; } } diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index 6dd57954..b59f32e9 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -67,7 +67,7 @@ export const CatalogLayoutMarketplaceItemView: FC = pr }, [offerData]); return ( - + { getMarketplaceOfferTitle } From abd5828c1d5fdef4cb72ea100fc0a3b5e80e7982 Mon Sep 17 00:00:00 2001 From: Snaiker Date: Wed, 16 Mar 2022 18:31:18 +0000 Subject: [PATCH 030/331] Fix issue: room owner can see furni ids --- .../widgets/infostand/InfoStandWidgetFurniView.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx index 55def41f..9f9e43bd 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx @@ -33,6 +33,7 @@ export const InfoStandWidgetFurniView: FC = props const [ crackableHits, setCrackableHits ] = useState(0); const [ crackableTarget, setCrackableTarget ] = useState(0); const [ godMode, setGodMode ] = useState(false); + const [ canSeeFurniId, setCanSeeFurniId ] = useState(false); const [ groupName, setGroupName ] = useState(null); useEffect(() => @@ -49,6 +50,7 @@ export const InfoStandWidgetFurniView: FC = props let crackableHits = 0; let crackableTarget = 0; let godMode = false; + let canSeeFurniId = false; const isValidController = (furniData.roomControllerLevel >= RoomControllerLevel.GUEST); @@ -59,6 +61,11 @@ export const InfoStandWidgetFurniView: FC = props if(furniData.roomControllerLevel >= RoomControllerLevel.MODERATOR) godMode = true; } + + if(furniData.isAnyRoomController) + { + canSeeFurniId = true; + } if((((furniData.usagePolicy === RoomWidgetFurniInfoUsagePolicyEnum.EVERYBODY) || ((furniData.usagePolicy === RoomWidgetFurniInfoUsagePolicyEnum.CONTROLLER) && isValidController)) || ((furniData.extraParam === RoomWidgetEnumItemExtradataParameter.JUKEBOX) && isValidController)) || ((furniData.extraParam === RoomWidgetEnumItemExtradataParameter.USABLE_PRODUCT) && isValidController)) canUse = true; @@ -133,6 +140,7 @@ export const InfoStandWidgetFurniView: FC = props setCrackableHits(crackableHits); setCrackableTarget(crackableTarget); setGodMode(godMode); + setCanSeeFurniId(canSeeFurniId); setGroupName(null); }); @@ -312,7 +320,7 @@ export const InfoStandWidgetFurniView: FC = props { godMode && <>
- ID: { furniData.id } + { canSeeFurniId && ID: { furniData.id } } { (furniKeys.length > 0) && <>
From 4025f41ddf78a11e15ac7928d86c73f9489bcc97 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 14:38:09 -0400 Subject: [PATCH 031/331] Fix avatar editor failing to load some parts --- .../avatar-editor/common/BodyModel.ts | 42 ++++++++----------- .../AvatarEditorFigureSetItemView.tsx | 2 +- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/components/avatar-editor/common/BodyModel.ts b/src/components/avatar-editor/common/BodyModel.ts index 437d44e6..d7170dbd 100644 --- a/src/components/avatar-editor/common/BodyModel.ts +++ b/src/components/avatar-editor/common/BodyModel.ts @@ -1,10 +1,10 @@ -import { AvatarEditorFigureCategory, AvatarScaleType, AvatarSetType, IAvatarImageListener } from '@nitrots/nitro-renderer'; +import { AvatarEditorFigureCategory, AvatarScaleType, AvatarSetType } from '@nitrots/nitro-renderer'; import { GetAvatarRenderManager } from '../../../api'; import { AvatarEditorUtilities } from './AvatarEditorUtilities'; import { CategoryBaseModel } from './CategoryBaseModel'; import { FigureData } from './FigureData'; -export class BodyModel extends CategoryBaseModel implements IAvatarImageListener +export class BodyModel extends CategoryBaseModel { private _imageCallBackHandled: boolean = false; @@ -43,31 +43,25 @@ export class BodyModel extends CategoryBaseModel implements IAvatarImageListener for(const part of category.parts) { - const figure = AvatarEditorUtilities.CURRENT_FIGURE.getFigureStringWithFace(part.id); - const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, null, this); - - const sprite = avatarImage.getImageAsSprite(AvatarSetType.HEAD); - - if(sprite) + const resetFigure = (figure: string) => { - sprite.y = 10; - - part.thumbContainer = sprite; - - setTimeout(() => avatarImage.dispose(), 0); + const figureString = AvatarEditorUtilities.CURRENT_FIGURE.getFigureStringWithFace(part.id); + const avatarImage = GetAvatarRenderManager().createAvatarImage(figureString, AvatarScaleType.LARGE, null, { resetFigure, dispose: null, disposed: false }); + + const sprite = avatarImage.getImageAsSprite(AvatarSetType.HEAD); + + if(sprite) + { + sprite.y = 10; + + part.thumbContainer = sprite; + + setTimeout(() => avatarImage.dispose(), 0); + } } + + resetFigure(null); } - - // if (this._Str_2271) this._Str_2271._Str_5614(k, _local_4.length); - } - - public resetFigure(figure: string): void - { - if(this._imageCallBackHandled) return; - - this._imageCallBackHandled = true; - - this.updateSelectionsFromFigure(FigureData.FACE); } public get canSetGender(): boolean diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx index cda9b8e4..12d9c153 100644 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx @@ -26,7 +26,7 @@ export const AvatarEditorFigureSetItemView: FC From 7546479fab4d9fd9e3d1c9c9ebcbbf6e9378ca92 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 14:52:05 -0400 Subject: [PATCH 032/331] Add friend request close button --- .../room/widgets/friend-request/FriendRequestDialogView.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx b/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx index 8cf7134b..1e230ec8 100644 --- a/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx +++ b/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx @@ -1,3 +1,4 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FC } from 'react'; import { LocalizeText, RoomWidgetFriendRequestMessage } from '../../../../api'; import { Base, Button, Column, Flex, Text } from '../../../../common'; @@ -28,7 +29,10 @@ export const FriendRequestDialogView: FC = props = - { LocalizeText('widget.friendrequest.from', [ 'username' ], [ userName ]) } + + { LocalizeText('widget.friendrequest.from', [ 'username' ], [ userName ]) } + + From c2bee696d2c87915b7cfbaf7f3311e05c14d265b Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 15:12:30 -0400 Subject: [PATCH 033/331] Fix group members card height --- src/components/groups/GroupView.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/groups/GroupView.scss b/src/components/groups/GroupView.scss index d57b0d0e..41a7bdb3 100644 --- a/src/components/groups/GroupView.scss +++ b/src/components/groups/GroupView.scss @@ -54,6 +54,7 @@ .nitro-group-members { width: 400px; + max-height: 380px; .nitro-group-members-list-grid { From a6d7b72b3148e0f8f1a2ffbcccf04a7a27d240c8 Mon Sep 17 00:00:00 2001 From: twanadot <72481485+twanadot@users.noreply.github.com> Date: Wed, 16 Mar 2022 20:15:08 +0100 Subject: [PATCH 034/331] fixed signs order --- .../AvatarInfoWidgetOwnAvatarView.tsx | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx index 3b12ce59..716c65f0 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx @@ -258,34 +258,34 @@ export const AvatarInfoWidgetOwnAvatarView: FC processAction('sign_10') }> 10 + processAction('sign_11') }> + + + processAction('sign_12') }> + + + + processAction('sign_0') }> 0 + processAction('sign_13') }> + + processAction('sign_15') }> - processAction('sign_12') }> - - processAction('sign_14') }> processAction('sign_17') }> - - processAction('sign_16') }> - processAction('sign_13') }> - - - processAction('sign_11') }> - - processAction('back') }> From 6536b36514b76011967c34b9a85336388dc10a96 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 15:23:39 -0400 Subject: [PATCH 035/331] optional sounds notif/resp --- public/ui-config.json.example | 4 ++++ src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts | 4 +++- src/api/notification/NotificationUtilities.ts | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/public/ui-config.json.example b/public/ui-config.json.example index 5463c31e..3410db79 100644 --- a/public/ui-config.json.example +++ b/public/ui-config.json.example @@ -59,6 +59,10 @@ "catalog.buy": "habbo_club", "catalog.gifts": "club_gifts" }, + "respect.options": { + "enabled": false, + "sound": "sound_respect_received" + }, "currency.display.number.short": false, "currency.asset.icon.url": "${images.url}/wallet/%type%.png", "catalog.asset.url": "${image.library.url}catalogue", diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts index 53ca74f2..80e20be9 100644 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts +++ b/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts @@ -1,5 +1,5 @@ import { AvatarFigurePartType, AvatarScaleType, AvatarSetType, IAvatarImageListener, INitroPoint, IVector3D, NitroEvent, NitroPoint, PetFigureData, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionChatEvent, RoomWidgetEnum, SystemChatStyleEnum, TextureUtils, Vector3d } from '@nitrots/nitro-renderer'; -import { GetAvatarRenderManager, GetRoomEngine } from '../../../..'; +import { GetAvatarRenderManager, GetConfigurationManager, GetRoomEngine, PlaySound } from '../../../..'; import { LocalizeText } from '../../../../utils/LocalizeText'; import { RoomWidgetUpdateChatEvent, RoomWidgetUpdateEvent } from '../events'; import { RoomWidgetMessage } from '../messages'; @@ -64,6 +64,8 @@ export class RoomWidgetChatHandler extends RoomWidgetHandler implements IAvatarI { case RoomSessionChatEvent.CHAT_TYPE_RESPECT: text = LocalizeText('widgets.chatbubble.respect', [ 'username' ], [ username ]); + if(GetConfigurationManager().getValue('respect.options')['enabled']) + PlaySound(GetConfigurationManager().getValue('respect.options')['sound']) break; case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); diff --git a/src/api/notification/NotificationUtilities.ts b/src/api/notification/NotificationUtilities.ts index 45cc6311..067e7a1d 100644 --- a/src/api/notification/NotificationUtilities.ts +++ b/src/api/notification/NotificationUtilities.ts @@ -1,5 +1,5 @@ import { HabboWebTools, RoomEnterEffect } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent, GetConfiguration, GetNitroInstance, LocalizeText } from '..'; +import { CreateLinkEvent, GetConfiguration, GetNitroInstance, LocalizeText, PlaySound } from '..'; import { NotificationAlertEvent, NotificationConfirmEvent } from '../../events'; import { NotificationBubbleEvent } from '../../events/notification-center/NotificationBubbleEvent'; import { DispatchUiEvent } from '../../hooks'; @@ -85,6 +85,8 @@ export class NotificationUtilities { this.simpleAlert(message, NotificationAlertType.EVENT, linkUrl, linkTitle, title, image); } + + if(options.get('sound')) PlaySound(options.get('sound')); } public static showSingleBubble(message: string, type: string, imageUrl: string = null, internalLink: string = null): void From 967811b84d52e3189d7d5eded0bae6129d25351c Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 15:43:17 -0400 Subject: [PATCH 036/331] mod tools alert_only room mod --- src/components/mod-tools/views/room/ModToolsRoomView.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/mod-tools/views/room/ModToolsRoomView.tsx b/src/components/mod-tools/views/room/ModToolsRoomView.tsx index 16f878d3..c8fd6e65 100644 --- a/src/components/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/components/mod-tools/views/room/ModToolsRoomView.tsx @@ -59,12 +59,13 @@ export const ModToolsRoomView: FC = props => if(message.trim().length === 0) return; SendMessageComposer(new ModeratorActionMessageComposer(ModeratorActionMessageComposer.ACTION_ALERT, message, '')); + SendMessageComposer(new ModerateRoomMessageComposer(roomId, lockRoom ? 1 : 0, changeRoomName ? 1 : 0, kickUsers ? 1 : 0)); return; case 'send_message': if(message.trim().length === 0) return; SendMessageComposer(new ModeratorActionMessageComposer(ModeratorActionMessageComposer.ACTION_MESSAGE, message, '')); - SendMessageComposer(new ModerateRoomMessageComposer(roomId, lockRoom ? 1 : 0, changeRoomName ? 1 : 0, kickUsers ? 1 : 0)) + SendMessageComposer(new ModerateRoomMessageComposer(roomId, lockRoom ? 1 : 0, changeRoomName ? 1 : 0, kickUsers ? 1 : 0)); return; } }, [ changeRoomName, kickUsers, lockRoom, message, roomId ]); From 60db79e42379e0620211ea50795d9454e5147420 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 16:26:58 -0400 Subject: [PATCH 037/331] Update card tabs --- src/common/card/NitroCardView.scss | 34 ++++++++++++++++++- .../card/tabs/NitroCardTabsItemView.tsx | 28 ++++++++++----- src/common/card/tabs/NitroCardTabsView.tsx | 8 ++--- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/common/card/NitroCardView.scss b/src/common/card/NitroCardView.scss index 7ad94c1c..0d886814 100644 --- a/src/common/card/NitroCardView.scss +++ b/src/common/card/NitroCardView.scss @@ -49,6 +49,38 @@ $nitro-card-tabs-height: 33px; .nitro-card-tabs { background-color: $secondary; + + .nav-item { + padding: $nav-link-padding-y $nav-link-padding-x; + background-color: $muted; + color: $black; + z-index: 1; + margin-bottom: -1px; + + &.active { + background-color: $light; + border-color: $border-color $border-color $light !important; + border-bottom: 1px solid black; + + &:before { + background: $white; + } + } + + &:before { + content: ""; + position: absolute; + width: 93%; + height: 3px; + border-radius: 0.25rem; + top: 1.5px; + left: 0; + right: 0; + margin: auto; + background: #c2c9d1; + z-index: 1; + } + } } .content-area { @@ -146,7 +178,7 @@ $nitro-card-tabs-height: 33px; } .nitro-card-tabs { - min-height: $nitro-card-tabs-height; + height: 100%; max-height: $nitro-card-tabs-height; border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color; } diff --git a/src/common/card/tabs/NitroCardTabsItemView.tsx b/src/common/card/tabs/NitroCardTabsItemView.tsx index 6d883449..1c74f8b1 100644 --- a/src/common/card/tabs/NitroCardTabsItemView.tsx +++ b/src/common/card/tabs/NitroCardTabsItemView.tsx @@ -1,23 +1,35 @@ -import classNames from 'classnames'; -import { FC, MouseEventHandler } from 'react'; +import { FC, useMemo } from 'react'; +import { Flex, FlexProps } from '../../Flex'; import { LayoutItemCountView } from '../../layout'; -interface NitroCardTabsItemViewProps +interface NitroCardTabsItemViewProps extends FlexProps { isActive?: boolean; count?: number; - onClick?: MouseEventHandler; } export const NitroCardTabsItemView: FC = props => { - const { children = null, isActive = false, count = 0, onClick = null } = props; + const { isActive = false, count = 0, overflow = 'hidden', position = 'relative', pointer = true, classNames = [], children = null, ...rest } = props; + + const getClassNames = useMemo(() => + { + const newClassNames: string[] = [ 'nav-item', 'rounded-top', 'border' ]; + + if(isActive) newClassNames.push('active'); + + if(classNames.length) newClassNames.push(...classNames); + + return newClassNames; + }, [ isActive, classNames ]); return ( -
  • - { children } + + + { children } + { (count > 0) && } -
  • + ); } diff --git a/src/common/card/tabs/NitroCardTabsView.tsx b/src/common/card/tabs/NitroCardTabsView.tsx index d3d497d7..1a64a126 100644 --- a/src/common/card/tabs/NitroCardTabsView.tsx +++ b/src/common/card/tabs/NitroCardTabsView.tsx @@ -3,7 +3,7 @@ import { Flex, FlexProps } from '../..'; export const NitroCardTabsView: FC = props => { - const { justifyContent = 'center', classNames = [], children = null, ...rest } = props; + const { justifyContent = 'center', gap = 1, classNames = [], children = null, ...rest } = props; const getClassNames = useMemo(() => { @@ -15,10 +15,8 @@ export const NitroCardTabsView: FC = props => }, [ classNames ]); return ( - -
      - { children } -
    + + { children } ); } From 268e912c127c7f796b7ab2e5e3dfedb1726fcda2 Mon Sep 17 00:00:00 2001 From: Endrit Date: Wed, 16 Mar 2022 21:39:58 +0100 Subject: [PATCH 038/331] disable camera publish option --- public/ui-config.json.example | 1 + .../camera/views/checkout/CameraWidgetCheckoutView.tsx | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/public/ui-config.json.example b/public/ui-config.json.example index 3410db79..61210521 100644 --- a/public/ui-config.json.example +++ b/public/ui-config.json.example @@ -11,6 +11,7 @@ "widget.dimmer.colorwheel": false, "avatar.wardrobe.max.slots": 10, "user.badges.max.slots": 5, + "camera.publish.disabled": false, "hc.disabled": false, "hotelview": { "widgets": { diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx index bbde7e98..fd460c9c 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx @@ -1,5 +1,5 @@ import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { InventoryEvent } from '../../../../events'; @@ -23,6 +23,8 @@ export const CameraWidgetCheckoutView: FC = props const [ isWaiting, setIsWaiting ] = useState(false); const [ publishCooldown, setPublishCooldown ] = useState(0); + const publishDisabled = useMemo(() => GetConfiguration('camera.publish.disabled', false), []); + const onCameraPurchaseOKMessageEvent = useCallback((event: CameraPurchaseOKMessageEvent) => { BatchUpdates(() => @@ -105,7 +107,7 @@ export const CameraWidgetCheckoutView: FC = props
    } - + { LocalizeText('camera.purchase.header') } @@ -133,6 +135,7 @@ export const CameraWidgetCheckoutView: FC = props + { !publishDisabled && @@ -158,7 +161,7 @@ export const CameraWidgetCheckoutView: FC = props { LocalizeText('camera.publish.button.text') } } - + } { LocalizeText('camera.warning.disclaimer') } From 49199361e5397090673486b3e1ac0cb8fafe1865 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 16:57:56 -0400 Subject: [PATCH 039/331] chat bubble clicking --- src/components/room/widgets/chat/ChatWidgetMessageView.tsx | 4 ++-- src/components/room/widgets/chat/ChatWidgetView.scss | 5 ----- src/components/room/widgets/chat/ChatWidgetView.tsx | 1 + 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/components/room/widgets/chat/ChatWidgetMessageView.tsx b/src/components/room/widgets/chat/ChatWidgetMessageView.tsx index 190d7629..fe005bb2 100644 --- a/src/components/room/widgets/chat/ChatWidgetMessageView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetMessageView.tsx @@ -14,7 +14,7 @@ export const ChatWidgetMessageView: FC = props => const [ isVisible, setIsVisible ] = useState(false); const elementRef = useRef(); - const onMouseDown = (event: MouseEvent) => ((event.shiftKey) && onChatClicked(chat)); + const onMouseDown = (event: MouseEvent) => onChatClicked(chat); useEffect(() => { @@ -57,7 +57,7 @@ export const ChatWidgetMessageView: FC = props => useEffect(() => setIsVisible(chat.visible), [ chat.visible ]); return ( -
    +
    { (chat.styleId === 0) &&
    }
    diff --git a/src/components/room/widgets/chat/ChatWidgetView.scss b/src/components/room/widgets/chat/ChatWidgetView.scss index d2b8c923..98b78a3e 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.scss +++ b/src/components/room/widgets/chat/ChatWidgetView.scss @@ -39,11 +39,6 @@ // -webkit-animation-name: bounceIn; // animation-name: bounceIn; - &:hover, - &:active { - pointer-events: none; - } - .user-container-bg { position: absolute; top: -1px; diff --git a/src/components/room/widgets/chat/ChatWidgetView.tsx b/src/components/room/widgets/chat/ChatWidgetView.tsx index e36923ff..65970a6a 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetView.tsx @@ -93,6 +93,7 @@ export const ChatWidgetView: FC<{}> = props => const onChatClicked = useCallback((chat: ChatBubbleMessage) => { + console.log('ehre') widgetHandler.processWidgetMessage(new RoomWidgetRoomObjectMessage(RoomWidgetRoomObjectMessage.GET_OBJECT_INFO, chat.senderId, chat.senderCategory)); widgetHandler.processWidgetMessage(new RoomWidgetChatSelectAvatarMessage(RoomWidgetChatSelectAvatarMessage.MESSAGE_SELECT_AVATAR, chat.senderId, chat.username, chat.roomId)); }, [ widgetHandler ]); From 894f6ddb19adda29909df79eb7556485c50fc677 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 17:03:56 -0400 Subject: [PATCH 040/331] remove console log my bad --- src/components/room/widgets/chat/ChatWidgetView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/room/widgets/chat/ChatWidgetView.tsx b/src/components/room/widgets/chat/ChatWidgetView.tsx index 65970a6a..e36923ff 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetView.tsx @@ -93,7 +93,6 @@ export const ChatWidgetView: FC<{}> = props => const onChatClicked = useCallback((chat: ChatBubbleMessage) => { - console.log('ehre') widgetHandler.processWidgetMessage(new RoomWidgetRoomObjectMessage(RoomWidgetRoomObjectMessage.GET_OBJECT_INFO, chat.senderId, chat.senderCategory)); widgetHandler.processWidgetMessage(new RoomWidgetChatSelectAvatarMessage(RoomWidgetChatSelectAvatarMessage.MESSAGE_SELECT_AVATAR, chat.senderId, chat.username, chat.roomId)); }, [ widgetHandler ]); From 9bb976a5874d0c1cb44454d1cae4e7292611b1af Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 17:09:25 -0400 Subject: [PATCH 041/331] Fix trophy overflow --- src/common/index.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/index.scss b/src/common/index.scss index 2cd54fde..69f24cbd 100644 --- a/src/common/index.scss +++ b/src/common/index.scss @@ -92,6 +92,7 @@ width: 297px; height: 116px; white-space: pre-wrap; + overflow: auto; } .trophy-footer { From 4aacc61462f9c1d1f67ba8f1b0be4d26a9cbab0e Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 17:23:58 -0400 Subject: [PATCH 042/331] mod tools chatlog user click --- src/components/mod-tools/views/chatlog/ChatlogView.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/mod-tools/views/chatlog/ChatlogView.tsx b/src/components/mod-tools/views/chatlog/ChatlogView.tsx index 7d29357a..27b99b51 100644 --- a/src/components/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/components/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,8 +1,9 @@ -import { ChatRecordData, UserProfileComposer } from '@nitrots/nitro-renderer'; +import { ChatRecordData } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, Key, useCallback } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps } from 'react-virtualized'; -import { SendMessageComposer, TryVisitRoom } from '../../../../api'; +import { TryVisitRoom } from '../../../../api'; import { Base, Button, Column, Flex, Grid, Text } from '../../../../common'; +import { ModToolsOpenUserInfoEvent } from '../../../../events'; import { ModToolsOpenRoomInfoEvent } from '../../../../events/mod-tools/ModToolsOpenRoomInfoEvent'; import { DispatchUiEvent } from '../../../../hooks'; @@ -29,7 +30,7 @@ export const ChatlogView: FC = props => > { chatlogEntry.timestamp } - SendMessageComposer(new UserProfileComposer(chatlogEntry.userId)) }>{ chatlogEntry.userName } + DispatchUiEvent(new ModToolsOpenUserInfoEvent(chatlogEntry.userId)) }>{ chatlogEntry.userName } { chatlogEntry.message } @@ -79,7 +80,7 @@ export const ChatlogView: FC = props => { !isRoomInfo && { chatlogEntry.timestamp } - SendMessageComposer(new UserProfileComposer(chatlogEntry.userId)) }>{ chatlogEntry.userName } + DispatchUiEvent(new ModToolsOpenUserInfoEvent(chatlogEntry.userId)) }>{ chatlogEntry.userName } { chatlogEntry.message } } From 1097cb442eb97ec0740b168a3c78ec0709a76730 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 17:46:04 -0400 Subject: [PATCH 043/331] Fix purchasing wall items with extra data --- .../widgets/CatalogItemGridWidgetView.tsx | 2 +- .../widgets/CatalogPurchaseWidgetView.tsx | 48 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx index 32b5f0b0..7081c873 100644 --- a/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx @@ -29,7 +29,7 @@ export const CatalogItemGridWidgetView: FC = pro if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) { - DispatchUiEvent(new CatalogSetExtraPurchaseParameterEvent(offer.product.extraParam)); + setTimeout(() => DispatchUiEvent(new CatalogSetExtraPurchaseParameterEvent(offer.product.extraParam)), 0); } } diff --git a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx index bdbcbb79..149ece69 100644 --- a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx @@ -2,7 +2,7 @@ import { PurchaseFromCatalogComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { CreateLinkEvent, GetClubMemberLevel, LocalizeText, SendMessageComposer } from '../../../../../api'; import { Button, LayoutLoadingSpinnerView } from '../../../../../common'; -import { CatalogEvent, CatalogInitGiftEvent, CatalogInitPurchaseEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogWidgetEvent } from '../../../../../events'; +import { CatalogEvent, CatalogInitGiftEvent, CatalogInitPurchaseEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogSetExtraPurchaseParameterEvent, CatalogWidgetEvent } from '../../../../../events'; import { DispatchUiEvent, UseUiEvent } from '../../../../../hooks'; import { GetCurrencyAmount } from '../../../../purse/common/CurrencyHelper'; import { useCatalogContext } from '../../../CatalogContext'; @@ -20,8 +20,7 @@ export const CatalogPurchaseWidgetView: FC = pro const { noGiftOption = false, purchaseCallback = null } = props; const [ purchaseWillBeGift, setPurchaseWillBeGift ] = useState(false); const [ purchaseState, setPurchaseState ] = useState(CatalogPurchaseState.NONE); - const { currentOffer = null, currentPage = null, purchaseOptions = null, setPurchaseOptions = null, getNodesByOfferId = null } = useCatalogContext(); - const { quantity = 1, extraData = '', extraParamRequired = false, previewStuffData = null } = purchaseOptions; + const { currentOffer = null, currentPage = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalogContext(); const onCatalogInitPurchaseEvent = useCallback((event: CatalogInitPurchaseEvent) => { @@ -33,6 +32,22 @@ export const CatalogPurchaseWidgetView: FC = pro UseUiEvent(CatalogWidgetEvent.INIT_PURCHASE, onCatalogInitPurchaseEvent); + const onCatalogSetExtraPurchaseParameterEvent = useCallback((event: CatalogSetExtraPurchaseParameterEvent) => + { + if(!currentOffer) return; + + setPurchaseOptions(prevValue => + { + const newValue = { ...prevValue }; + + newValue.extraData = event.parameter; + + return newValue; + }); + }, [ currentOffer, setPurchaseOptions ]); + + UseUiEvent(CatalogWidgetEvent.SET_EXTRA_PARM, onCatalogSetExtraPurchaseParameterEvent); + const onCatalogEvent = useCallback((event: CatalogEvent) => { switch(event.type) @@ -61,7 +76,7 @@ export const CatalogPurchaseWidgetView: FC = pro { if(!currentOffer) return false; - if(extraParamRequired && (!extraData || !extraData.length)) return false; + if(purchaseOptions.extraParamRequired && (!purchaseOptions.extraData || !purchaseOptions.extraData.length)) return false; if(currentOffer.pricingModel === Offer.PRICING_MODEL_SINGLE) { @@ -71,9 +86,9 @@ export const CatalogPurchaseWidgetView: FC = pro } return false; - }, [ currentOffer, extraParamRequired, extraData ]); + }, [ currentOffer, purchaseOptions ]); - const purchase = useCallback((isGift: boolean = false) => + const purchase = (isGift: boolean = false) => { if(!currentOffer) return; @@ -86,7 +101,7 @@ export const CatalogPurchaseWidgetView: FC = pro if(isGift) { - DispatchUiEvent(new CatalogInitGiftEvent(currentOffer.page.pageId, currentOffer.offerId, extraData)); + DispatchUiEvent(new CatalogInitGiftEvent(currentOffer.page.pageId, currentOffer.offerId, purchaseOptions.extraData)); return; } @@ -109,18 +124,15 @@ export const CatalogPurchaseWidgetView: FC = pro // if(nodes) pageId = nodes[0].pageId; // } - SendMessageComposer(new PurchaseFromCatalogComposer(pageId, currentOffer.offerId, extraData, quantity)); - }, [ currentOffer, purchaseCallback, extraData, quantity ]); + SendMessageComposer(new PurchaseFromCatalogComposer(pageId, currentOffer.offerId, purchaseOptions.extraData, purchaseOptions.quantity)); + } useEffect(() => { if(!currentOffer) return; - return () => - { - setPurchaseState(CatalogPurchaseState.NONE); - setPurchaseOptions({ quantity: 1, extraData: '', extraParamRequired: false, previewStuffData: null }); - } + setPurchaseState(CatalogPurchaseState.NONE); + setPurchaseOptions({ quantity: 1, extraData: '', extraParamRequired: false, previewStuffData: null }); }, [ currentOffer, setPurchaseOptions ]); useEffect(() => @@ -142,8 +154,8 @@ export const CatalogPurchaseWidgetView: FC = pro const PurchaseButton = () => { - const priceCredits = (currentOffer.priceInCredits * quantity); - const pricePoints = (currentOffer.priceInActivityPoints * quantity); + const priceCredits = (currentOffer.priceInCredits * purchaseOptions.quantity); + const pricePoints = (currentOffer.priceInActivityPoints * purchaseOptions.quantity); if(GetClubMemberLevel() < currentOffer.clubLevel) return ; @@ -165,7 +177,7 @@ export const CatalogPurchaseWidgetView: FC = pro return ; case CatalogPurchaseState.NONE: default: - return ; + return ; } } @@ -173,7 +185,7 @@ export const CatalogPurchaseWidgetView: FC = pro <> { (!noGiftOption && !currentOffer.isRentOffer) && - } From cecac305629b06ee5d4de9dc0e7beebf3b39db85 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 18:01:57 -0400 Subject: [PATCH 044/331] Switch profile if you click another user --- .../user-profile/UserProfileView.tsx | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index c8d005f1..9454370a 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -1,8 +1,8 @@ -import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; +import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserProfileEvent, UserProfileParser, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; -import { GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; +import { GetRoomSession, GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../hooks'; +import { BatchUpdates, UseMessageEventHook, UseRoomEngineEvent } from '../../hooks'; import { BadgesContainerView } from './views/BadgesContainerView'; import { FriendsContainerView } from './views/FriendsContainerView'; import { GroupsContainerView } from './views/GroupsContainerView'; @@ -70,6 +70,21 @@ export const UserProfileView: FC<{}> = props => UseMessageEventHook(UserProfileEvent, onUserProfileEvent); + const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => + { + if(!userProfile) return; + + if(event.category !== RoomObjectCategory.UNIT) return; + + const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.objectId); + + if(userData.type !== RoomObjectType.USER) return; + + GetUserProfile(userData.webID); + }, [ userProfile ]); + + UseRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent); + if(!userProfile) return null; return ( From 8b2d9dc098fe19042ac4685479c05ba652f1581d Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 18:12:17 -0400 Subject: [PATCH 045/331] Fix gift tags --- src/common/index.scss | 3 --- src/common/layout/LayoutGiftTagView.tsx | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/common/index.scss b/src/common/index.scss index 69f24cbd..b62c340c 100644 --- a/src/common/index.scss +++ b/src/common/index.scss @@ -132,9 +132,6 @@ width: 100%; min-width: 100%; max-width: 100%; - height: 90px; - min-height: 90px; - max-height: 90px; border: none; resize: none; outline: none; diff --git a/src/common/layout/LayoutGiftTagView.tsx b/src/common/layout/LayoutGiftTagView.tsx index 41bb1b2e..0db589b0 100644 --- a/src/common/layout/LayoutGiftTagView.tsx +++ b/src/common/layout/LayoutGiftTagView.tsx @@ -1,4 +1,5 @@ import { FC } from 'react'; +import { Column, Flex, Text } from '..'; import { LocalizeText } from '../../api'; import { LayoutAvatarImageView } from './LayoutAvatarImageView'; @@ -16,18 +17,23 @@ export const LayoutGiftTagView: FC = props => const { figure = null, userName = null, message = null, editable = false, onChange = null } = props; return ( -
    +
    { !userName &&
    } { figure &&
    }
    -
    - { !editable &&
    { message }
    } - { editable && onChange && } - { userName &&
    { LocalizeText('catalog.gift_wrapping_new.message_from', ['name'], [userName]) }
    } -
    -
    + + + { !editable && + { message } } + { editable && (onChange !== null) && + } + { userName && + { LocalizeText('catalog.gift_wrapping_new.message_from', ['name'], [userName]) } } + + + ); }; From d7210466750f9e57c01e840791a69021225b7e41 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 18:16:21 -0400 Subject: [PATCH 046/331] wordquiz z-index --- src/App.scss | 1 + src/components/room/widgets/RoomWidgets.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/src/App.scss b/src/App.scss index a8a41ed8..ec47b77c 100644 --- a/src/App.scss +++ b/src/App.scss @@ -7,6 +7,7 @@ $toolbar-memenu-zindex: 60; $roomtools-zindex: 50; $context-menu-zindex: 40; $infostand-zindex: 30; +$quiz-zindex: 21; $chat-zindex: 20; $highscore-zindex: 19; diff --git a/src/components/room/widgets/RoomWidgets.scss b/src/components/room/widgets/RoomWidgets.scss index 5c329096..ac75e4e8 100644 --- a/src/components/room/widgets/RoomWidgets.scss +++ b/src/components/room/widgets/RoomWidgets.scss @@ -64,6 +64,7 @@ box-shadow: inset 0px 5px lighten(rgba($dark,.6),2.5), inset 0 -4px darken(rgba($dark,.6),4); border-radius: $border-radius; transition: all 0.2s ease; + z-index: $quiz-zindex; .question { max-width: 300px; From d86b3539500f6e154280bb42bad5e75c34debd8c Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 18:18:20 -0400 Subject: [PATCH 047/331] %AMOUNT% fixed --- .../notification-center/NotificationCenterMessageHandler.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/notification-center/NotificationCenterMessageHandler.tsx b/src/components/notification-center/NotificationCenterMessageHandler.tsx index 17b8c70e..d10ae4b3 100644 --- a/src/components/notification-center/NotificationCenterMessageHandler.tsx +++ b/src/components/notification-center/NotificationCenterMessageHandler.tsx @@ -69,7 +69,7 @@ export const NotificationCenterMessageHandler: FC<{}> = props => const imageUrl = GetConfiguration('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); - NotificationUtilities.showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'amount' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); + NotificationUtilities.showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'AMOUNT' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); }, []); UseMessageEventHook(ActivityPointNotificationMessageEvent, onActivityPointNotificationMessageEvent); From 6516c0b1b13c3c625f931f7a9e78e6ddc6faf300 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 18:18:46 -0400 Subject: [PATCH 048/331] Fix amount case for bubble alerts --- .../notification-center/NotificationCenterMessageHandler.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/notification-center/NotificationCenterMessageHandler.tsx b/src/components/notification-center/NotificationCenterMessageHandler.tsx index 17b8c70e..d10ae4b3 100644 --- a/src/components/notification-center/NotificationCenterMessageHandler.tsx +++ b/src/components/notification-center/NotificationCenterMessageHandler.tsx @@ -69,7 +69,7 @@ export const NotificationCenterMessageHandler: FC<{}> = props => const imageUrl = GetConfiguration('currency.asset.icon.url', '').replace('%type%', parser.type.toString()); - NotificationUtilities.showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'amount' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); + NotificationUtilities.showSingleBubble(LocalizeText('notifications.text.loyalty.received', [ 'AMOUNT' ], [ parser.amountChanged.toString() ]), NotificationBubbleType.INFO, imageUrl); }, []); UseMessageEventHook(ActivityPointNotificationMessageEvent, onActivityPointNotificationMessageEvent); From 8b1e5dc55279c3444b9aa2bf215e41f606124372 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 19:05:07 -0400 Subject: [PATCH 049/331] Fix groups on profile --- src/api/groups/ToggleFavoriteGroup.ts | 8 ++++++ src/api/groups/index.ts | 1 + .../views/GroupsContainerView.tsx | 25 ++++++++++++------- 3 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/api/groups/ToggleFavoriteGroup.ts diff --git a/src/api/groups/ToggleFavoriteGroup.ts b/src/api/groups/ToggleFavoriteGroup.ts new file mode 100644 index 00000000..ad1a669c --- /dev/null +++ b/src/api/groups/ToggleFavoriteGroup.ts @@ -0,0 +1,8 @@ +import { GroupFavoriteComposer, HabboGroupEntryData } from '@nitrots/nitro-renderer'; +import { SendMessageComposer } from '..'; + +export const ToggleFavoriteGroup = (group: HabboGroupEntryData) => +{ + // new GroupUnfavoriteComposer(group.groupId) + SendMessageComposer(group.favourite ? null : new GroupFavoriteComposer(group.groupId)); +} diff --git a/src/api/groups/index.ts b/src/api/groups/index.ts index 1f8b545d..2f528cab 100644 --- a/src/api/groups/index.ts +++ b/src/api/groups/index.ts @@ -1,4 +1,5 @@ export * from './GetGroupInformation'; export * from './GetGroupManager'; export * from './GetGroupMembers'; +export * from './ToggleFavoriteGroup'; export * from './TryJoinGroup'; diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/views/GroupsContainerView.tsx index 845113e1..56643e46 100644 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ b/src/components/user-profile/views/GroupsContainerView.tsx @@ -1,6 +1,6 @@ -import { GroupFavoriteComposer, GroupInformationComposer, GroupInformationEvent, GroupInformationParser, HabboGroupEntryData } from '@nitrots/nitro-renderer'; +import { GroupInformationComposer, GroupInformationEvent, GroupInformationParser, HabboGroupEntryData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { SendMessageComposer } from '../../../api'; +import { SendMessageComposer, ToggleFavoriteGroup } from '../../../api'; import { AutoGrid, Base, Column, Flex, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../common'; import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; import { GroupInformationView } from '../../groups/views/GroupInformationView'; @@ -18,18 +18,14 @@ export const GroupsContainerView: FC = props => const [ selectedGroupId, setSelectedGroupId ] = useState(null); const [ groupInformation, setGroupInformation ] = useState(null); - const favoriteGroup = (groupId: number) => SendMessageComposer(new GroupFavoriteComposer(groupId)); - const onGroupInformationEvent = useCallback((event: GroupInformationEvent) => { const parser = event.getParser(); if(!selectedGroupId || (selectedGroupId !== parser.id) || parser.flag) return; - if(groupInformation) setGroupInformation(null); - setGroupInformation(parser); - }, [ groupInformation, selectedGroupId ]); + }, [ selectedGroupId ]); UseMessageEventHook(GroupInformationEvent, onGroupInformationEvent); @@ -46,7 +42,18 @@ export const GroupsContainerView: FC = props => { setGroupInformation(null); - if(groups.length > 0) setSelectedGroupId(groups[0].groupId); + if(groups.length > 0) + { + setSelectedGroupId(prevValue => + { + if(prevValue === groups[0].groupId) + { + SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); + } + + return groups[0].groupId; + }); + } }); }, [ groups ]); @@ -72,7 +79,7 @@ export const GroupsContainerView: FC = props => return ( setSelectedGroupId(group.groupId) } className="p-1"> { itsMe && - favoriteGroup(group.groupId) } /> } + ToggleFavoriteGroup(group) } /> } ) From 09d00a0bd41255da0cca934211e2ebe71efbe7da Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 19:29:05 -0400 Subject: [PATCH 050/331] Bump renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 671cde37..b37f5810 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.7", + "@nitrots/nitro-renderer": "^1.1.8", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index 2487088e..25ff657a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1426,10 +1426,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.7.tgz#cae4ba6c5706cdac96a8ff72875ab1bf351daca2" - integrity sha512-wfNcfnoCN6ntn9lXbjn4SSNf45FTn2SLKxCJuQIGKjEDzZjXPzahXIvjzMG4krNFV6neh1UescgOcDHjJ8Hx4g== +"@nitrots/nitro-renderer@^1.1.8": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.8.tgz#9a2b66d4b592d98c3b44a1761aed70cb416f0c4a" + integrity sha512-Qp4LAmoETGA5WzRiabb/gbEwHZmPt2d1iard9rVFrJwnV8y8Xx53lk/LuSzrh0rqUY00CJeGijvWCXo+R+Dw1w== dependencies: "@pixi/canvas-renderer" "^6.2.2" "@pixi/extract" "^6.2.2" From 7364fa3d99392c1051ebe20e29d1ed4b7ec4858e Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 19:38:38 -0400 Subject: [PATCH 051/331] Update renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b37f5810..9e6be1a4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.8", + "@nitrots/nitro-renderer": "^1.1.9", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index 25ff657a..71faff4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1426,10 +1426,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.8": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.8.tgz#9a2b66d4b592d98c3b44a1761aed70cb416f0c4a" - integrity sha512-Qp4LAmoETGA5WzRiabb/gbEwHZmPt2d1iard9rVFrJwnV8y8Xx53lk/LuSzrh0rqUY00CJeGijvWCXo+R+Dw1w== +"@nitrots/nitro-renderer@^1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.9.tgz#2699f5141bc9a38609df3f5a951035a6bb1877fc" + integrity sha512-8MKrHPjTmwiY1iypb2ZtfRSuzdgx1s7sKkLiw43eL8D57WopKqp8UXIIwfOnIf5BR2zpRkmcOiX3BQgGca6+SQ== dependencies: "@pixi/canvas-renderer" "^6.2.2" "@pixi/extract" "^6.2.2" From 2fb6e7ebb3dbb0a6da83cb0bb13755e44d592e99 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 19:43:15 -0400 Subject: [PATCH 052/331] Add GroupUnfavoriteComposer --- src/api/groups/ToggleFavoriteGroup.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api/groups/ToggleFavoriteGroup.ts b/src/api/groups/ToggleFavoriteGroup.ts index ad1a669c..a4b929c1 100644 --- a/src/api/groups/ToggleFavoriteGroup.ts +++ b/src/api/groups/ToggleFavoriteGroup.ts @@ -1,8 +1,7 @@ -import { GroupFavoriteComposer, HabboGroupEntryData } from '@nitrots/nitro-renderer'; +import { GroupFavoriteComposer, GroupUnfavoriteComposer, HabboGroupEntryData } from '@nitrots/nitro-renderer'; import { SendMessageComposer } from '..'; export const ToggleFavoriteGroup = (group: HabboGroupEntryData) => { - // new GroupUnfavoriteComposer(group.groupId) - SendMessageComposer(group.favourite ? null : new GroupFavoriteComposer(group.groupId)); + SendMessageComposer(group.favourite ? new GroupUnfavoriteComposer(group.groupId) : new GroupFavoriteComposer(group.groupId)); } From ec34cb3bb50d335d9a94b9f98af33a784e7c9769 Mon Sep 17 00:00:00 2001 From: Layne Date: Wed, 16 Mar 2022 20:04:27 -0400 Subject: [PATCH 053/331] relationship in contextmenu --- .../handlers/RoomWidgetAvatarInfoHandler.ts | 24 +++++++++- .../messages/RoomWidgetUserActionMessage.ts | 5 ++ .../AvatarInfoWidgetAvatarView.tsx | 47 ++++++++++++++++++- 3 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts index 6cbd73af..5ec47a95 100644 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts +++ b/src/api/nitro/room/widgets/handlers/RoomWidgetAvatarInfoHandler.ts @@ -1,5 +1,7 @@ -import { NitroEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionDanceEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; +import { NitroEvent, RoomEngineUseProductEvent, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionDanceEvent, RoomSessionPetStatusUpdateEvent, RoomSessionUserDataUpdateEvent, RoomWidgetEnum, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; +import { SendMessageComposer } from '../../..'; import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture } from '../../../..'; +import { MessengerFriend } from '../../../../../components/friends/common/MessengerFriend'; import { FurniCategory } from '../../../../../components/inventory/common/FurniCategory'; import { RoomWidgetAvatarInfoEvent, RoomWidgetUpdateDanceStatusEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateUserDataEvent, RoomWidgetUseProductBubbleEvent, UseProductItem } from '../events'; import { RoomWidgetAvatarExpressionMessage, RoomWidgetChangePostureMessage, RoomWidgetDanceMessage, RoomWidgetMessage, RoomWidgetRoomObjectMessage, RoomWidgetUseProductMessage, RoomWidgetUserActionMessage } from '../messages'; @@ -82,6 +84,22 @@ export class RoomWidgetAvatarInfoHandler extends RoomWidgetHandler this.container.roomSession.sendPostureMessage(postureMessage.posture); break; } + case RoomWidgetUserActionMessage.RELATIONSHIP_NONE: { + SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_NONE)); + break; + } + case RoomWidgetUserActionMessage.RELATIONSHIP_HEART: { + SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_HEART)); + break; + } + case RoomWidgetUserActionMessage.RELATIONSHIP_SMILE: { + SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_SMILE)); + break; + } + case RoomWidgetUserActionMessage.RELATIONSHIP_BOBBA: { + SendMessageComposer(new SetRelationshipStatusComposer(userId, MessengerFriend.RELATIONSHIP_BOBBA)); + break; + } } return null; @@ -206,6 +224,10 @@ export class RoomWidgetAvatarInfoHandler extends RoomWidgetHandler RoomWidgetDanceMessage.DANCE, RoomWidgetAvatarExpressionMessage.AVATAR_EXPRESSION, RoomWidgetChangePostureMessage.CHANGE_POSTURE, + RoomWidgetUserActionMessage.RELATIONSHIP_NONE, + RoomWidgetUserActionMessage.RELATIONSHIP_HEART, + RoomWidgetUserActionMessage.RELATIONSHIP_SMILE, + RoomWidgetUserActionMessage.RELATIONSHIP_BOBBA ]; } } diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts index 540ad958..56fd89c7 100644 --- a/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts +++ b/src/api/nitro/room/widgets/messages/RoomWidgetUserActionMessage.ts @@ -48,6 +48,11 @@ export class RoomWidgetUserActionMessage extends RoomWidgetMessage public static AMBASSADOR_MUTE_USER_10MIN: string = 'RWUAM_AMBASSADOR_MUTE_10MIN'; public static AMBASSADOR_MUTE_USER_60MIN: string = 'RWUAM_AMBASSADOR_MUTE_60MIN'; public static AMBASSADOR_MUTE_USER_18HOUR: string = 'RWUAM_AMBASSADOR_MUTE_18HOUR'; + public static RELATIONSHIP_NONE: string = 'RWUAM_RELATIONSHIP_NONE'; + public static RELATIONSHIP_HEART: string = 'RWUAM_RELATIONSHIP_HEART'; + public static RELATIONSHIP_SMILE: string = 'RWUAM_RELATIONSHIP_SMILE'; + public static RELATIONSHIP_BOBBA: string = 'RWUAM_RELATIONSHIP_BOBBA'; + private _userId: number; diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx index 44e4db4e..a1ec2437 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx @@ -2,6 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomControllerLevel, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { GetOwnRoomObject, GetUserProfile, LocalizeText, RoomWidgetMessage, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUserActionMessage } from '../../../../api'; +import { Base, Flex } from '../../../../common'; import { BatchUpdates } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; @@ -20,6 +21,7 @@ const MODE_MODERATE_BAN = 2; const MODE_MODERATE_MUTE = 3; const MODE_AMBASSADOR = 4; const MODE_AMBASSADOR_MUTE = 5; +const MODE_RELATIONSHIP = 6; export const AvatarInfoWidgetAvatarView: FC = props => { @@ -108,6 +110,10 @@ export const AvatarInfoWidgetAvatarView: FC = p //userData.canBeAskedAsFriend = false; messageType = RoomWidgetUserActionMessage.SEND_FRIEND_REQUEST; break; + case 'relationship': + hideMenu = false; + setMode(MODE_RELATIONSHIP); + break; case 'respect': let newRespectsLeft = 0; @@ -182,6 +188,19 @@ export const AvatarInfoWidgetAvatarView: FC = p case 'ambassador_mute_18hour': messageType = RoomWidgetUserActionMessage.AMBASSADOR_MUTE_USER_18HOUR; break; + case 'rship_heart': + messageType = RoomWidgetUserActionMessage.RELATIONSHIP_HEART; + break; + case 'rship_smile': + messageType = RoomWidgetUserActionMessage.RELATIONSHIP_SMILE; + break; + case 'rship_bobba': + messageType = RoomWidgetUserActionMessage.RELATIONSHIP_BOBBA; + break; + case 'rship_none': + messageType = RoomWidgetUserActionMessage.RELATIONSHIP_NONE; + console.log('here') + break; } if(messageType) message = new RoomWidgetUserActionMessage(messageType, userData.webID); @@ -204,7 +223,7 @@ export const AvatarInfoWidgetAvatarView: FC = p return ( GetUserProfile(userData.webID) }> - { userData.name } + {userData.name} { (mode === MODE_NORMAL) && <> @@ -221,6 +240,11 @@ export const AvatarInfoWidgetAvatarView: FC = p { (respectsLeft > 0) && processAction('respect') }> { LocalizeText('infostand.button.respect', [ 'count' ], [ respectsLeft.toString() ]) } + } + { !userData.canBeAskedAsFriend && + processAction('relationship') }> + {LocalizeText('infostand.link.relationship')} + } { !userData.isIgnored && processAction('ignore') }> @@ -340,6 +364,27 @@ export const AvatarInfoWidgetAvatarView: FC = p { LocalizeText('generic.back') } + } + { (mode === MODE_RELATIONSHIP) && + <> + + processAction('rship_heart')}> + + + processAction('rship_smile')}> + + + processAction('rship_bobba')}> + + + + processAction('rship_none')}> + { LocalizeText('avatar.widget.clear_relationship') } + + processAction('back')}> + + { LocalizeText('generic.back') } + } ); From 2b2b423a43624de53b22c5c155c9d0614c03cbe2 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 20:46:03 -0400 Subject: [PATCH 054/331] Update renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9e6be1a4..81a20047 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.9", + "@nitrots/nitro-renderer": "^1.1.10", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index 71faff4d..a65a5851 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1426,10 +1426,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.9.tgz#2699f5141bc9a38609df3f5a951035a6bb1877fc" - integrity sha512-8MKrHPjTmwiY1iypb2ZtfRSuzdgx1s7sKkLiw43eL8D57WopKqp8UXIIwfOnIf5BR2zpRkmcOiX3BQgGca6+SQ== +"@nitrots/nitro-renderer@^1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.10.tgz#fff42d52be58588d813450fe8f123316551f44bb" + integrity sha512-bqrhIzS451AubGzRrCeUj4swPJUEBt9HVcEqWmsUqccTEhy9RfSqxiZU7Fn3ESzyjmrvOaSLyvXU9KSZyo8MBw== dependencies: "@pixi/canvas-renderer" "^6.2.2" "@pixi/extract" "^6.2.2" From 61ab0d6f425cf81f4453592e61058b5492e8c416 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 21:33:27 -0400 Subject: [PATCH 055/331] Add various pet chats --- .../widgets/handlers/RoomWidgetChatHandler.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts index 80e20be9..d2358423 100644 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts +++ b/src/api/nitro/room/widgets/handlers/RoomWidgetChatHandler.ts @@ -67,6 +67,35 @@ export class RoomWidgetChatHandler extends RoomWidgetHandler implements IAvatarI if(GetConfigurationManager().getValue('respect.options')['enabled']) PlaySound(GetConfigurationManager().getValue('respect.options')['sound']) break; + case RoomSessionChatEvent.CHAT_TYPE_PETREVIVE: + case RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE: + case RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE: { + let textKey = 'widget.chatbubble.petrevived'; + + if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_REBREED_FERTILIZE) + { + textKey = 'widget.chatbubble.petrefertilized;'; + } + + else if(chatType === RoomSessionChatEvent.CHAT_TYPE_PET_SPEED_FERTILIZE) + { + textKey = 'widget.chatbubble.petspeedfertilized'; + } + + let targetUserName: string = null; + + const newRoomObject = GetRoomEngine().getRoomObject(chatEvent.session.roomId, chatEvent.extraParam, RoomObjectCategory.UNIT); + + if(newRoomObject) + { + const newUserData = this.container.roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(newUserData) targetUserName = newUserData.name; + } + + text = LocalizeText(textKey, [ 'petName', 'userName' ], [ username, targetUserName ]); + break; + } case RoomSessionChatEvent.CHAT_TYPE_PETRESPECT: text = LocalizeText('widget.chatbubble.petrespect', [ 'petname' ], [ username ]); break; From 22f4b357fc54c48d61bf183570fa2ee8af94531f Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 16 Mar 2022 21:33:44 -0400 Subject: [PATCH 056/331] Update NavigatorRoomCreator --- .../creator/NavigatorRoomCreatorView.tsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx index 6b76f0ac..0640cf9d 100644 --- a/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/creator/NavigatorRoomCreatorView.tsx @@ -21,11 +21,9 @@ export const NavigatorRoomCreatorView: FC<{}> = props => const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; - const selectModel = (model: IRoomModel, index) => + const selectModel = (model: IRoomModel, index: number) => { - if(!model) return; - - if(model.clubLevel > GetClubMemberLevel()) return; + if(!model || (model.clubLevel > GetClubMemberLevel())) return; setSelectedModelName(RoomModels[index].name); } @@ -53,7 +51,7 @@ export const NavigatorRoomCreatorView: FC<{}> = props => useEffect(() => { - if(categories) setCategory(categories[0].id); + if(categories && categories.length) setCategory(categories[0].id); }, [ categories ]); return ( @@ -62,12 +60,16 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { LocalizeText('navigator.createroom.roomnameinfo') } - setName(event.target.value) } /> + setName(event.target.value) } /> + + + { LocalizeText('navigator.createroom.roomdescinfo') } + } { userName && - { LocalizeText('catalog.gift_wrapping_new.message_from', ['name'], [userName]) } } + { LocalizeText('catalog.gift_wrapping_new.message_from', [ 'name' ], [ userName ]) } } diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx index a4e0f52c..bc7894bc 100644 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ b/src/common/layout/LayoutNotificationAlertView.tsx @@ -15,7 +15,7 @@ export const LayoutNotificationAlertView: FC = const getClassNames = useMemo(() => { - const newClassNames: string[] = ['nitro-alert']; + const newClassNames: string[] = [ 'nitro-alert' ]; newClassNames.push('nitro-alert-' + type); diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx index 59771e7e..5e5fdd9f 100644 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ b/src/common/layout/LayoutNotificationBubbleView.tsx @@ -35,11 +35,11 @@ export const LayoutNotificationBubbleView: FC if(!fadesOut) return; const timeout = setTimeout(() => - { - setIsVisible(false); + { + setIsVisible(false); - setTimeout(() => close(), 300); - }, timeoutMs); + setTimeout(() => close(), 300); + }, timeoutMs); return () => clearTimeout(timeout); }, [ fadesOut, timeoutMs, close ]); diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx index ff2caeb6..508ee08b 100644 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ b/src/common/layout/LayoutRoomPreviewerView.tsx @@ -74,15 +74,15 @@ export const LayoutRoomPreviewerView: FC = props = GetNitroInstance().ticker.add(update); const resizeObserver = new ResizeObserver(() => - { - if(!roomPreviewer || !elementRef.current) return; + { + if(!roomPreviewer || !elementRef.current) return; - const width = elementRef.current.parentElement.offsetWidth; + const width = elementRef.current.parentElement.offsetWidth; - roomPreviewer.modifyRoomCanvas(width, height); + roomPreviewer.modifyRoomCanvas(width, height); - update(-1); - }); + update(-1); + }); resizeObserver.observe(elementRef.current); diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx index 92e939d2..fe34ba41 100644 --- a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx +++ b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx @@ -8,15 +8,11 @@ interface LayoutLimitedEditionStyledNumberViewProps export const LayoutLimitedEditionStyledNumberView: FC = props => { const { value = 0 } = props; - const numbers = value.toString().split(''); return ( <> - { numbers.map((number, index) => - { - return ; - })} + { numbers.map((number, index) => ) } ); } diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index 6f868503..baa4bc36 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -22,50 +22,50 @@ export const AchievementsView: FC<{}> = props => const categoryName = achievement.category; setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + const categoryIndex = newValue.findIndex(existing => (existing.code === categoryName)); + + if(categoryIndex === -1) { - const newValue = [ ...prevValue ]; - const categoryIndex = newValue.findIndex(existing => (existing.code === categoryName)); + const category = new AchievementCategory(categoryName); - if(categoryIndex === -1) + category.achievements.push(achievement); + + newValue.push(category); + } + else + { + const category = CloneObject(newValue[categoryIndex]); + const newAchievements = [ ...category.achievements ]; + const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); + let previousAchievement: AchievementData = null; + + if(achievementIndex === -1) { - const category = new AchievementCategory(categoryName); - - category.achievements.push(achievement); - - newValue.push(category); + newAchievements.push(achievement); } else { - const category = CloneObject(newValue[categoryIndex]); - const newAchievements = [ ...category.achievements ]; - const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); - let previousAchievement: AchievementData = null; + previousAchievement = newAchievements[achievementIndex]; - if(achievementIndex === -1) - { - newAchievements.push(achievement); - } - else - { - previousAchievement = newAchievements[achievementIndex]; - - newAchievements[achievementIndex] = achievement; - } - - if(!GetAchievementIsIgnored(achievement)) - { - achievement.unseen++; - - if(previousAchievement) achievement.unseen += previousAchievement.unseen; - } - - category.achievements = newAchievements; - - newValue[categoryIndex] = category; + newAchievements[achievementIndex] = achievement; } - return newValue; - }); + if(!GetAchievementIsIgnored(achievement)) + { + achievement.unseen++; + + if(previousAchievement) achievement.unseen += previousAchievement.unseen; + } + + category.achievements = newAchievements; + + newValue[categoryIndex] = category; + } + + return newValue; + }); }, []); UseMessageEventHook(AchievementEvent, onAchievementEvent); @@ -155,23 +155,23 @@ export const AchievementsView: FC<{}> = props => const setAchievementSeen = useCallback((code: string, achievementId: number) => { setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const category of newValue) { - const newValue = [ ...prevValue ]; + if(category.code !== code) continue; - for(const category of newValue) + for(const achievement of category.achievements) { - if(category.code !== code) continue; + if(achievement.achievementId !== achievementId) continue; - for(const achievement of category.achievements) - { - if(achievement.achievementId !== achievementId) continue; - - achievement.unseen = 0; - } + achievement.unseen = 0; } + } - return newValue; - }); + return newValue; + }); }, []); const linkReceived = useCallback((url: string) => diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx index 98aa2d81..06e08d2c 100644 --- a/src/components/avatar-editor/AvatarEditorView.tsx +++ b/src/components/avatar-editor/AvatarEditorView.tsx @@ -288,15 +288,15 @@ export const AvatarEditorView: FC<{}> = props => setIsVisible(false) } /> { categories && (categories.size > 0) && Array.from(categories.keys()).map(category => - { - const isActive = (activeCategory && (activeCategory.name === category)); + { + const isActive = (activeCategory && (activeCategory.name === category)); - return ( - selectCategory(category) }> - { LocalizeText(`avatareditor.category.${ category }`) } - - ); - })} + return ( + selectCategory(category) }> + { LocalizeText(`avatareditor.category.${ category }`) } + + ); + })} setIsWardrobeVisible(true) }> { LocalizeText('avatareditor.category.wardrobe') } diff --git a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts b/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts index 285cbcad..dc583f38 100644 --- a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts +++ b/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts @@ -5,7 +5,7 @@ import { FigureData } from './FigureData'; export class AvatarEditorGridPartItem implements IAvatarImageListener { private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter(0.2); - private static THUMB_DIRECTIONS: number[] = [2, 6, 0, 4, 3, 1]; + private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; private static DRAW_ORDER: string[] = [ AvatarFigurePartType.LEFT_HAND_ITEM, AvatarFigurePartType.LEFT_HAND, diff --git a/src/components/avatar-editor/common/FigureGenerator.ts b/src/components/avatar-editor/common/FigureGenerator.ts index fa4126ed..30ac1385 100644 --- a/src/components/avatar-editor/common/FigureGenerator.ts +++ b/src/components/avatar-editor/common/FigureGenerator.ts @@ -26,11 +26,11 @@ function getRandomPartSet(setType: SetType, gender: string, clubLevel: number = if(!setType) return null; const options = setType.partSets.getValues().filter(option => - { - if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null; + { + if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null; - return option; - }); + return option; + }); if(!options || !options.length) return null; @@ -42,11 +42,11 @@ function getRandomColors(palette: IPalette, partSet: IFigurePartSet, clubLevel: if(!palette) return []; const options = palette.colors.getValues().filter(option => - { - if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; + { + if(!option.isSelectable || (option.clubLevel > clubLevel)) return null; - return option; - }); + return option; + }); if(!options || !options.length) return null; diff --git a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx index c1d11164..ba0d2da7 100644 --- a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx +++ b/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx @@ -68,15 +68,15 @@ export const AvatarEditorModelView: FC = props => } { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => - { - const category = model.categories.get(name); + { + const category = model.categories.get(name); - return ( - selectCategory(name) }> - - - ); - })} + return ( + selectCategory(name) }> + + + ); + })} diff --git a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx index e050b57c..f480c900 100644 --- a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx +++ b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx @@ -47,25 +47,25 @@ export const AvatarEditorWardrobeView: FC = props const items: JSX.Element[] = []; savedFigures.forEach(([ figureContainer, gender ], index) => - { - let clubLevel = 0; + { + let clubLevel = 0; - if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); + if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender); - items.push( - - { figureContainer && + items.push( + + { figureContainer && } - - { (clubLevel > 0) && } - - - { figureContainer && + + { (clubLevel > 0) && } + + + { figureContainer && } - - - ); - }); + + + ); + }); return items; }, [ savedFigures, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); diff --git a/src/components/camera/CameraWidgetView.tsx b/src/components/camera/CameraWidgetView.tsx index aab9d341..89118329 100644 --- a/src/components/camera/CameraWidgetView.tsx +++ b/src/components/camera/CameraWidgetView.tsx @@ -70,13 +70,13 @@ export const CameraWidgetView: FC<{}> = props => return; case 'delete': setCameraRoll(prevValue => - { - const clone = [ ...prevValue ]; + { + const clone = [ ...prevValue ]; - clone.splice(selectedPictureIndex, 1); + clone.splice(selectedPictureIndex, 1); - return clone; - }); + return clone; + }); return; case 'editor_cancel': setMode(MODE_CAPTURE); @@ -106,10 +106,10 @@ export const CameraWidgetView: FC<{}> = props => return; case 'toggle': setMode(prevValue => - { - if(!prevValue) return MODE_CAPTURE; - else return MODE_NONE; - }); + { + if(!prevValue) return MODE_CAPTURE; + else return MODE_NONE; + }); return; } }, []); diff --git a/src/components/camera/common/CameraPicture.ts b/src/components/camera/common/CameraPicture.ts index 8d9401b6..fe8c2210 100644 --- a/src/components/camera/common/CameraPicture.ts +++ b/src/components/camera/common/CameraPicture.ts @@ -4,5 +4,6 @@ export class CameraPicture { constructor( public texture: NitroTexture, - public imageUrl: string) {} + public imageUrl: string) + {} } diff --git a/src/components/camera/common/CameraPictureThumbnail.ts b/src/components/camera/common/CameraPictureThumbnail.ts index d88f9dcd..cd126607 100644 --- a/src/components/camera/common/CameraPictureThumbnail.ts +++ b/src/components/camera/common/CameraPictureThumbnail.ts @@ -2,5 +2,6 @@ export class CameraPictureThumbnail { constructor( public effectName: string, - public thumbnailUrl: string) {} + public thumbnailUrl: string) + {} } diff --git a/src/components/camera/views/capture/CameraWidgetCaptureView.tsx b/src/components/camera/views/capture/CameraWidgetCaptureView.tsx index a7f16f60..07a3ded1 100644 --- a/src/components/camera/views/capture/CameraWidgetCaptureView.tsx +++ b/src/components/camera/views/capture/CameraWidgetCaptureView.tsx @@ -80,9 +80,9 @@ export const CameraWidgetCaptureView: FC = props = { (cameraRoll.length > 0) && { cameraRoll.map((picture, index) => - { - return setSelectedPictureIndex(index) } />; - }) } + { + return setSelectedPictureIndex(index) } />; + }) } } diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx index e1b70a25..18f1da98 100644 --- a/src/components/camera/views/editor/CameraWidgetEditorView.tsx +++ b/src/components/camera/views/editor/CameraWidgetEditorView.tsx @@ -76,14 +76,14 @@ export const CameraWidgetEditorView: FC = props => if(index === -1) return; setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; - const currentEffect = clone[index]; + { + const clone = [ ...prevValue ]; + const currentEffect = clone[index]; - clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha); + clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha); - return clone; - }); + return clone; + }); }, [ getCurrentEffectIndex, setSelectedEffects ]); const getCurrentPictureUrl = useMemo(() => @@ -117,9 +117,9 @@ export const CameraWidgetEditorView: FC = props => if(!effect) return; setSelectedEffects(prevValue => - { - return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ]; - }); + { + return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ]; + }); setSelectedEffectName(effect.name); return; @@ -130,13 +130,13 @@ export const CameraWidgetEditorView: FC = props => if(existingIndex === -1) return; setSelectedEffects(prevValue => - { - const clone = [ ...prevValue ]; + { + const clone = [ ...prevValue ]; - clone.splice(existingIndex, 1); + clone.splice(existingIndex, 1); - return clone; - }); + return clone; + }); if(selectedEffectName === effectName) setSelectedEffectName(null); return; @@ -177,9 +177,9 @@ export const CameraWidgetEditorView: FC = props => processAction('close') } /> { TABS.map(tab => - { - return processAction('change_tab', tab) }> - }) } + { + return processAction('change_tab', tab) }> + }) } diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx index 3c007676..9d736664 100644 --- a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx +++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx @@ -20,12 +20,12 @@ export const CameraWidgetEffectListView: FC = p return ( { effects && (effects.length > 0) && effects.map((effect, index) => - { - const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name))); - const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1); + { + const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name))); + const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1); - return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } /> - }) } + return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } /> + }) } ); } diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index ba6e711e..48538fe3 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -104,7 +104,7 @@ export const CalendarView: FC = props => - { LocalizeText('campaign.calendar.heading.day', ['number'], [(selectedDay + 1).toString()]) } + { LocalizeText('campaign.calendar.heading.day', [ 'number' ], [ (selectedDay + 1).toString() ]) } { dayMessage(selectedDay) }
    @@ -121,16 +121,16 @@ export const CalendarView: FC = props => - { [...Array(TOTAL_SHOWN_ITEMS)].map((e, i) => - { - const day = (index + i); + { [ ...Array(TOTAL_SHOWN_ITEMS) ].map((e, i) => + { + const day = (index + i); - return ( - - - - ); - }) } + return ( + + + + ); + }) } diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index f34af2d2..c3919755 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -34,25 +34,25 @@ export const CampaignView: FC<{}> = props => BatchUpdates(() => { setCalendarData(prev => - { - const copy = prev.clone(); - copy.openedDays.push(lastOpenAttempt); + { + const copy = prev.clone(); + copy.openedDays.push(lastOpenAttempt); - return copy; - }); + return copy; + }); - setReceivedProducts(prev => - { - const copy = new Map(prev); - copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); + setReceivedProducts(prev => + { + const copy = new Map(prev); + copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); - return copy; - }); + return copy; + }); }); } setLastOpenAttempt(-1); - }, [lastOpenAttempt]); + }, [ lastOpenAttempt ]); UseMessageEventHook(CampaignCalendarDoorOpenedMessageEvent, onCampaignCalendarDoorOpenedMessageEvent); @@ -71,7 +71,7 @@ export const CampaignView: FC<{}> = props => { SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id)); } - }, [calendarData]); + }, [ calendarData ]); const onCalendarClose = useCallback(() => { @@ -101,7 +101,7 @@ export const CampaignView: FC<{}> = props => { RemoveLinkEventTracker(linkTracker); } - }, [onLinkReceived]); + }, [ onLinkReceived ]); return ( <> diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx index b149befa..eb404dcf 100644 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ b/src/components/catalog/CatalogMessageHandler.tsx @@ -155,13 +155,13 @@ export const CatalogMessageHandler: FC<{}> = props => if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) { setPurchaseOptions(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.extraData =( offer.product.extraParam || null); + newValue.extraData =( offer.product.extraParam || null); - return newValue; - }); + return newValue; + }); } } @@ -174,27 +174,27 @@ export const CatalogMessageHandler: FC<{}> = props => const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); setCatalogOptions(prevValue => + { + const petPalettes = []; + + if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); + + for(let i = 0; i < petPalettes.length; i++) { - const petPalettes = []; + const palette = petPalettes[i]; - if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); - - for(let i = 0; i < petPalettes.length; i++) + if(palette.breed === petPalette.breed) { - const palette = petPalettes[i]; + petPalettes.splice(i, 1); - if(palette.breed === petPalette.breed) - { - petPalettes.splice(i, 1); - - break; - } + break; } + } - petPalettes.push(petPalette); + petPalettes.push(petPalette); - return { ...prevValue, petPalettes }; - }); + return { ...prevValue, petPalettes }; + }); }, [ setCatalogOptions ]); const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => @@ -214,11 +214,11 @@ export const CatalogMessageHandler: FC<{}> = props => const parser = event.getParser(); setCatalogOptions(prevValue => - { - const clubOffers = parser.offers; + { + const clubOffers = parser.offers; - return { ...prevValue, clubOffers }; - }); + return { ...prevValue, clubOffers }; + }); }, [ setCatalogOptions ]); const onGuildMembershipsMessageEvent = useCallback((event: GuildMembershipsMessageEvent) => @@ -226,11 +226,11 @@ export const CatalogMessageHandler: FC<{}> = props => const parser = event.getParser(); setCatalogOptions(prevValue => - { - const groups = parser.groups; + { + const groups = parser.groups; - return { ...prevValue, groups }; - }); + return { ...prevValue, groups }; + }); }, [ setCatalogOptions ]); const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => @@ -238,16 +238,16 @@ export const CatalogMessageHandler: FC<{}> = props => const parser = event.getParser(); setCatalogOptions(prevValue => - { - const subscriptionInfo = new SubscriptionInfo( - Math.max(0, parser.daysToPeriodEnd), - Math.max(0, parser.periodsSubscribedAhead), - parser.isVip, - parser.pastClubDays, - parser.pastVipDays); + { + const subscriptionInfo = new SubscriptionInfo( + Math.max(0, parser.daysToPeriodEnd), + Math.max(0, parser.periodsSubscribedAhead), + parser.isVip, + parser.pastClubDays, + parser.pastVipDays); - return { ...prevValue, subscriptionInfo }; - }); + return { ...prevValue, subscriptionInfo }; + }); }, [ setCatalogOptions ]); const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) => @@ -255,11 +255,11 @@ export const CatalogMessageHandler: FC<{}> = props => const parser = event.getParser(); setCatalogOptions(prevValue => - { - const giftConfiguration = new GiftWrappingConfiguration(parser); + { + const giftConfiguration = new GiftWrappingConfiguration(parser); - return { ...prevValue, giftConfiguration }; - }); + return { ...prevValue, giftConfiguration }; + }); }, [ setCatalogOptions ]); const onMarketplaceMakeOfferResult = useCallback((event: MarketplaceMakeOfferResult) => @@ -288,11 +288,11 @@ export const CatalogMessageHandler: FC<{}> = props => const parser = event.getParser(); setCatalogOptions(prevValue => - { - const clubGifts = parser; + { + const clubGifts = parser; - return { ...prevValue, clubGifts }; - }); + return { ...prevValue, clubGifts }; + }); }, [ setCatalogOptions ]); UseMessageEventHook(CatalogPagesListEvent, onCatalogPagesListEvent); diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index 58c8aa2b..d38da044 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -183,31 +183,31 @@ export const CatalogView: FC<{}> = props => nodes.reverse(); setActiveNodes(prevValue => + { + const isActive = (prevValue.indexOf(targetNode) >= 0); + const isOpen = targetNode.isOpen; + + for(const existing of prevValue) { - const isActive = (prevValue.indexOf(targetNode) >= 0); - const isOpen = targetNode.isOpen; + existing.deactivate(); - for(const existing of prevValue) - { - existing.deactivate(); + if(nodes.indexOf(existing) === -1) existing.close(); + } - if(nodes.indexOf(existing) === -1) existing.close(); - } + for(const n of nodes) + { + n.activate(); - for(const n of nodes) - { - n.activate(); + if(n.parent) n.open(); - if(n.parent) n.open(); + if((n === targetNode.parent) && n.children.length) n.open(); + } - if((n === targetNode.parent) && n.children.length) n.open(); - } + if(isActive && isOpen) targetNode.close(); + else targetNode.open(); - if(isActive && isOpen) targetNode.close(); - else targetNode.open(); - - return nodes; - }); + return nodes; + }); if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); }, [ setActiveNodes, loadCatalogPage ]); @@ -346,11 +346,11 @@ export const CatalogView: FC<{}> = props => return () => { setRoomPreviewer(prevValue => - { - prevValue.dispose(); + { + prevValue.dispose(); - return null; - }); + return null; + }); } }, []); @@ -415,23 +415,26 @@ export const CatalogView: FC<{}> = props => { isVisible && - { setIsVisible(false); } } /> + + { + setIsVisible(false); + } } /> { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => - { - if(!child.isVisible) return null; + { + if(!child.isVisible) return null; - return ( - - { - if(searchResult) setSearchResult(null); + return ( + + { + if(searchResult) setSearchResult(null); - activateNode(child); - } }> - { child.localization } - - ); - }) } + activateNode(child); + } }> + { child.localization } + + ); + }) } @@ -446,8 +449,8 @@ export const CatalogView: FC<{}> = props => } - - + + ); } diff --git a/src/components/catalog/common/CatalogPetPalette.ts b/src/components/catalog/common/CatalogPetPalette.ts index 7a7df4c2..d92c40dd 100644 --- a/src/components/catalog/common/CatalogPetPalette.ts +++ b/src/components/catalog/common/CatalogPetPalette.ts @@ -5,5 +5,6 @@ export class CatalogPetPalette constructor( public readonly breed: string, public readonly palettes: SellablePetPaletteData[] - ) {} + ) + {} } diff --git a/src/components/catalog/common/CatalogUtilities.ts b/src/components/catalog/common/CatalogUtilities.ts index f2655688..54319610 100644 --- a/src/components/catalog/common/CatalogUtilities.ts +++ b/src/components/catalog/common/CatalogUtilities.ts @@ -85,21 +85,21 @@ export function GetPetAvailableColors(petIndex: number, palettes: SellablePetPal switch(petIndex) { case 0: - return [[16743226], [16750435], [16764339], [0xF59500], [16498012], [16704690], [0xEDD400], [16115545], [16513201], [8694111], [11585939], [14413767], [6664599], [9553845], [12971486], [8358322], [10002885], [13292268], [10780600], [12623573], [14403561], [12418717], [14327229], [15517403], [14515069], [15764368], [16366271], [0xABABAB], [0xD4D4D4], [0xFFFFFF], [14256481], [14656129], [15848130], [14005087], [14337152], [15918540], [15118118], [15531929], [9764857], [11258085]]; + return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; case 1: - return [[16743226], [16750435], [16764339], [0xF59500], [16498012], [16704690], [0xEDD400], [16115545], [16513201], [8694111], [11585939], [14413767], [6664599], [9553845], [12971486], [8358322], [10002885], [13292268], [10780600], [12623573], [14403561], [12418717], [14327229], [15517403], [14515069], [15764368], [16366271], [0xABABAB], [0xD4D4D4], [0xFFFFFF], [14256481], [14656129], [15848130], [14005087], [14337152], [15918540], [15118118], [15531929], [9764857], [11258085]]; + return [ [ 16743226 ], [ 16750435 ], [ 16764339 ], [ 0xF59500 ], [ 16498012 ], [ 16704690 ], [ 0xEDD400 ], [ 16115545 ], [ 16513201 ], [ 8694111 ], [ 11585939 ], [ 14413767 ], [ 6664599 ], [ 9553845 ], [ 12971486 ], [ 8358322 ], [ 10002885 ], [ 13292268 ], [ 10780600 ], [ 12623573 ], [ 14403561 ], [ 12418717 ], [ 14327229 ], [ 15517403 ], [ 14515069 ], [ 15764368 ], [ 16366271 ], [ 0xABABAB ], [ 0xD4D4D4 ], [ 0xFFFFFF ], [ 14256481 ], [ 14656129 ], [ 15848130 ], [ 14005087 ], [ 14337152 ], [ 15918540 ], [ 15118118 ], [ 15531929 ], [ 9764857 ], [ 11258085 ] ]; case 2: - return [[16579283], [15378351], [8830016], [15257125], [9340985], [8949607], [6198292], [8703620], [9889626], [8972045], [12161285], [13162269], [8620113], [12616503], [8628101], [0xD2FF00], [9764857]]; + return [ [ 16579283 ], [ 15378351 ], [ 8830016 ], [ 15257125 ], [ 9340985 ], [ 8949607 ], [ 6198292 ], [ 8703620 ], [ 9889626 ], [ 8972045 ], [ 12161285 ], [ 13162269 ], [ 8620113 ], [ 12616503 ], [ 8628101 ], [ 0xD2FF00 ], [ 9764857 ] ]; case 3: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; case 4: - return [[0xFFFFFF], [16053490], [15464440], [16248792], [15396319], [15007487]]; + return [ [ 0xFFFFFF ], [ 16053490 ], [ 15464440 ], [ 16248792 ], [ 15396319 ], [ 15007487 ] ]; case 5: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ] ]; case 6: - return [[0xFFFFFF], [0xEEEEEE], [0xDDDDDD], [16767177], [16770205], [16751331]]; + return [ [ 0xFFFFFF ], [ 0xEEEEEE ], [ 0xDDDDDD ], [ 16767177 ], [ 16770205 ], [ 16751331 ] ]; case 7: - return [[0xCCCCCC], [0xAEAEAE], [16751331], [10149119], [16763290], [16743786]]; + return [ [ 0xCCCCCC ], [ 0xAEAEAE ], [ 16751331 ], [ 10149119 ], [ 16763290 ], [ 16743786 ] ]; default: { const colors: number[][] = []; diff --git a/src/components/catalog/common/SearchResult.ts b/src/components/catalog/common/SearchResult.ts index 4083c699..419f3cf4 100644 --- a/src/components/catalog/common/SearchResult.ts +++ b/src/components/catalog/common/SearchResult.ts @@ -6,6 +6,6 @@ export class SearchResult constructor( public readonly searchValue: string, public readonly offers: IPurchasableOffer[], - public readonly filteredNodes: ICatalogNode[] - ) {} + public readonly filteredNodes: ICatalogNode[]) + {} } diff --git a/src/components/catalog/common/SubscriptionInfo.ts b/src/components/catalog/common/SubscriptionInfo.ts index 29d4b358..72d16e69 100644 --- a/src/components/catalog/common/SubscriptionInfo.ts +++ b/src/components/catalog/common/SubscriptionInfo.ts @@ -8,7 +8,8 @@ export class SubscriptionInfo public readonly clubPeriods: number = 0, public readonly isVip: boolean = false, public readonly pastDays: number = 0, - public readonly pastVipDays: number = 0) {} + public readonly pastVipDays: number = 0) + {} public get lastUpdated(): number { diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 60450658..acf0db31 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -196,7 +196,7 @@ export const CatalogGiftView: FC<{}> = props => { LocalizeText(boxName) } - { LocalizeText(priceText, ['price'], [giftConfiguration.price.toString()]) } + { LocalizeText(priceText, [ 'price' ], [ giftConfiguration.price.toString() ]) } diff --git a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx index 56122fdd..e1553631 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx @@ -14,11 +14,11 @@ export const CatalogNavigationSetView: FC = props return ( <> { node && (node.children.length > 0) && node.children.map((n, index) => - { - if(!n.isVisible) return null; + { + if(!n.isVisible) return null; - return - }) } + return + }) } ); } diff --git a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx index 97860eeb..849fff8d 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx @@ -42,7 +42,7 @@ export const CatalogLayoutBadgeDisplayView: FC = props => { currentOffer.localizationName } - + diff --git a/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx index eb6c5ba7..1ecb9192 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx @@ -21,13 +21,13 @@ export const CatalogLayoutTrophiesView: FC = props => if(!currentOffer) return; setPurchaseOptions(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.extraData = trophyText; + newValue.extraData = trophyText; - return newValue; - }); + return newValue; + }); }, [ currentOffer, trophyText, setPurchaseOptions ]); return ( diff --git a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx index 9d0a25ee..f32db617 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx @@ -140,28 +140,28 @@ export const CatalogLayoutVipBuyView: FC = props => { clubOffers && (clubOffers.length > 0) && clubOffers.map((offer, index) => - { - return ( - setOffer(offer) }> - - - { getOfferText(offer) } - - { (offer.priceCredits > 0) && + { + return ( + setOffer(offer) }> + + + { getOfferText(offer) } + + { (offer.priceCredits > 0) && { offer.priceCredits } } - { (offer.priceActivityPoints > 0) && + { (offer.priceActivityPoints > 0) && { offer.priceActivityPoints } } - - - - ); - }) } + + + + ); + }) } diff --git a/src/components/catalog/views/page/layout/GetCatalogLayout.tsx b/src/components/catalog/views/page/layout/GetCatalogLayout.tsx index 53b78265..78674428 100644 --- a/src/components/catalog/views/page/layout/GetCatalogLayout.tsx +++ b/src/components/catalog/views/page/layout/GetCatalogLayout.tsx @@ -64,7 +64,7 @@ export const GetCatalogLayout = (page: ICatalogPage, hideNavigation: () => void) case 'badge_display': return ; //case 'default_3x3_color_grouping': - //return ; + //return ; case 'bots': case 'default_3x3': default: diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index 77baecf2..841c0f8a 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -44,8 +44,8 @@ export const CatalogLayoutMarketplaceItemView: FC = pr text = hours + ' ' + LocalizeText('catalog.marketplace.offer.hours') + ' ' + text; } - return LocalizeText('catalog.marketplace.offer.time_left', ['time'], [text] ); - }, [offerData]); + return LocalizeText('catalog.marketplace.offer.time_left', [ 'time' ], [ text ] ); + }, [ offerData ]); return ( @@ -59,8 +59,8 @@ export const CatalogLayoutMarketplaceItemView: FC = pr } { (type === PUBLIC_OFFER) && <> - { LocalizeText('catalog.marketplace.offer.price_public_item', ['price', 'average'], [offerData.price.toString(), offerData.averagePrice.toString() ]) } - { LocalizeText('catalog.marketplace.offer_count', ['count'], [offerData.offerCount.toString()]) } + { LocalizeText('catalog.marketplace.offer.price_public_item', [ 'price', 'average' ], [ offerData.price.toString(), offerData.averagePrice.toString() ]) } + { LocalizeText('catalog.marketplace.offer_count', [ 'count' ], [ offerData.offerCount.toString() ]) } } diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index 2772c0d9..ff2de8a8 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -20,13 +20,13 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop if(!parser) return; const offers = parser.offers.map(offer => - { - const newOffer = new MarketplaceOfferData(offer.offerId, offer.furniId, offer.furniType, offer.extraData, offer.stuffData, offer.price, offer.status, offer.averagePrice, offer.offerCount); + { + const newOffer = new MarketplaceOfferData(offer.offerId, offer.furniId, offer.furniType, offer.extraData, offer.stuffData, offer.price, offer.status, offer.averagePrice, offer.offerCount); - newOffer.timeLeftMinutes = offer.timeLeftMinutes; + newOffer.timeLeftMinutes = offer.timeLeftMinutes; - return newOffer; - }); + return newOffer; + }); BatchUpdates(() => { @@ -91,7 +91,7 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop { (creditsWaiting > 0) && - { LocalizeText('catalog.marketplace.redeem.get_credits', ['count', 'credits'], [ soldOffers.length.toString(), creditsWaiting.toString() ]) } + { LocalizeText('catalog.marketplace.redeem.get_credits', [ 'count', 'credits' ], [ soldOffers.length.toString(), creditsWaiting.toString() ]) } { Array.from(Array(maxDisplayCount), (e, i) => - { - return ; - }) } + { + return ; + }) } diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx index c0f81929..fc086979 100644 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ b/src/components/friends/views/friends-list/FriendsListView.tsx @@ -43,29 +43,29 @@ export const FriendsListView: FC = props => } return LocalizeText('friendlist.removefriendconfirm.userlist', [ 'user_names' ], [ userNames.join(', ') ]); - }, [offlineFriends, onlineFriends, selectedFriendsIds]); + }, [ offlineFriends, onlineFriends, selectedFriendsIds ]); const selectFriend = useCallback((userId: number) => { if(userId < 0) return; setSelectedFriendsIds(prevValue => + { + const newValue = [ ...prevValue ]; + + const existingUserIdIndex: number = newValue.indexOf(userId); + + if(existingUserIdIndex > -1) { - const newValue = [ ...prevValue ]; + newValue.splice(existingUserIdIndex, 1) + } + else + { + newValue.push(userId); + } - const existingUserIdIndex: number = newValue.indexOf(userId); - - if(existingUserIdIndex > -1) - { - newValue.splice(existingUserIdIndex, 1) - } - else - { - newValue.push(userId); - } - - return newValue; - }); + return newValue; + }); }, [ setSelectedFriendsIds ]); const sendRoomInvite = (message: string) => @@ -81,11 +81,11 @@ export const FriendsListView: FC = props => if(selectedFriendsIds.length === 0) return; setSelectedFriendsIds(prevValue => - { - SendMessageComposer(new RemoveFriendComposer(...prevValue)); + { + SendMessageComposer(new RemoveFriendComposer(...prevValue)); - return []; - }); + return []; + }); setShowRemoveFriendsConfirmation(false); } diff --git a/src/components/friends/views/friends-list/FriendsRemoveConfirmationView.tsx b/src/components/friends/views/friends-list/FriendsRemoveConfirmationView.tsx index 479a9396..d01947b4 100644 --- a/src/components/friends/views/friends-list/FriendsRemoveConfirmationView.tsx +++ b/src/components/friends/views/friends-list/FriendsRemoveConfirmationView.tsx @@ -18,8 +18,8 @@ export const FriendsRemoveConfirmationView: FC -
    { removeFriendsText }
    - +
    { removeFriendsText }
    + diff --git a/src/components/friends/views/friends-list/FriendsSearchView.tsx b/src/components/friends/views/friends-list/FriendsSearchView.tsx index 30079e1d..a3e04c31 100644 --- a/src/components/friends/views/friends-list/FriendsSearchView.tsx +++ b/src/components/friends/views/friends-list/FriendsSearchView.tsx @@ -59,20 +59,20 @@ export const FriendsSearchView: FC = props =>
    { friendResults.map(result => - { - return ( - - - -
    { result.avatarName }
    -
    - - { result.isAvatarOnline && + { + return ( + + + +
    { result.avatarName }
    +
    + + { result.isAvatarOnline && OpenMessengerChat(result.avatarId) } title={ LocalizeText('friendlist.tip.im') } /> } - -
    - ) - }) } +
    +
    + ) + }) }
    } } @@ -86,20 +86,20 @@ export const FriendsSearchView: FC = props =>
    { otherResults.map(result => - { - return ( - - - -
    { result.avatarName }
    -
    - - { canRequestFriend(result.avatarId) && + { + return ( + + + +
    { result.avatarName }
    +
    + + { canRequestFriend(result.avatarId) && requestFriend(result.avatarId, result.avatarName) } title={ LocalizeText('friendlist.tip.addfriend') } /> } - -
    - ) - }) } +
    +
    + ) + }) }
    } } diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx index cea6edfc..37343c96 100644 --- a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx @@ -26,47 +26,47 @@ export const FriendsMessengerThreadGroup: FC = if( (group.type === GroupType.GROUP_CHAT) && (group.chats.length && getGroupChatData(group.chats[0].extraData).userId === GetSessionDataManager().userId)) return true; return false; - }, [group, thread]); + }, [ group, thread ]); if(!thread || !group) return null; if(!group.userId) { return ( - <> + <> { group.chats.map((chat, index) => - { - return ( -
    - - { chat.type === MessengerThreadChat.SECURITY_NOTIFICATION && + { + return ( +
    + + { chat.type === MessengerThreadChat.SECURITY_NOTIFICATION && { chat.message } } - { chat.type === MessengerThreadChat.ROOM_INVITE && + { chat.type === MessengerThreadChat.ROOM_INVITE && - - {(LocalizeText('messenger.invitation') + ' ') }{ chat.message } - } - -
    - ); - }) } + + {(LocalizeText('messenger.invitation') + ' ') }{ chat.message } + } + +
    + ); + }) } ); } return ( - + { (group.type === GroupType.PRIVATE_CHAT && !isOwnChat) && } { (group.type === GroupType.GROUP_CHAT && !isOwnChat) && } - + { (isOwnChat) && GetSessionDataManager().userName } diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx index 98e34965..f0264586 100644 --- a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx @@ -14,9 +14,9 @@ export const FriendsMessengerThreadView: FC = p return ( <> { (thread.groups.length > 0) && thread.groups.map((group, index) => - { - return ; - }) } + { + return ; + }) } ); } diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index a7e10741..67c2a972 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -12,29 +12,29 @@ import { FriendsMessengerThreadView } from './FriendsMessengerThreadView'; export const FriendsMessengerView: FC<{}> = props => { - const [isVisible, setIsVisible] = useState(false); - const [messageThreads, setMessageThreads] = useState([]); - const [activeThreadIndex, setActiveThreadIndex] = useState(-1); - const [hiddenThreadIndexes, setHiddenThreadIndexes] = useState([]); - const [messageText, setMessageText] = useState(''); - const [updateValue, setUpdateValue] = useState({}); + const [ isVisible, setIsVisible ] = useState(false); + const [ messageThreads, setMessageThreads ] = useState([]); + const [ activeThreadIndex, setActiveThreadIndex ] = useState(-1); + const [ hiddenThreadIndexes, setHiddenThreadIndexes ] = useState([]); + const [ messageText, setMessageText ] = useState(''); + const [ updateValue, setUpdateValue ] = useState({}); const { friends = [] } = useFriendsContext(); const messagesBox = useRef(); const followFriend = useCallback(() => { SendMessageComposer(new FollowFriendMessageComposer(messageThreads[activeThreadIndex].participant.id)); - }, [messageThreads, activeThreadIndex]); + }, [ messageThreads, activeThreadIndex ]); const openProfile = useCallback(() => { GetUserProfile(messageThreads[activeThreadIndex].participant.id); - }, [messageThreads, activeThreadIndex]); + }, [ messageThreads, activeThreadIndex ]); const getFriend = useCallback((userId: number) => { return ((friends.find(friend => (friend.id === userId))) || null); - }, [friends]); + }, [ friends ]); const visibleThreads = useMemo(() => { @@ -44,7 +44,7 @@ export const FriendsMessengerView: FC<{}> = props => return true; }); - }, [messageThreads, hiddenThreadIndexes]); + }, [ messageThreads, hiddenThreadIndexes ]); const getMessageThreadWithIndex = useCallback<(userId: number) => [number, MessengerThread]>((userId: number) => { @@ -62,7 +62,7 @@ export const FriendsMessengerView: FC<{}> = props => { setHiddenThreadIndexes(prevValue => { - const newIndexes = [...prevValue]; + const newIndexes = [ ...prevValue ]; newIndexes.splice(hiddenIndex, 1); @@ -70,34 +70,34 @@ export const FriendsMessengerView: FC<{}> = props => }); } - return [i, thread]; + return [ i, thread ]; } } } const friend = getFriend(userId); - if(!friend) return [-1, null]; + if(!friend) return [ -1, null ]; const thread = new MessengerThread(friend); - const newThreads = [...messageThreads, thread]; + const newThreads = [ ...messageThreads, thread ]; setMessageThreads(newThreads); - return [(newThreads.length - 1), thread]; - }, [messageThreads, hiddenThreadIndexes, getFriend]); + return [ (newThreads.length - 1), thread ]; + }, [ messageThreads, hiddenThreadIndexes, getFriend ]); const onNewConsoleMessageEvent = useCallback((event: NewConsoleMessageEvent) => { const parser = event.getParser(); - const [threadIndex, thread] = getMessageThreadWithIndex(parser.senderId); + const [ threadIndex, thread ] = getMessageThreadWithIndex(parser.senderId); if((threadIndex === -1) || !thread) return; thread.addMessage(parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); - setMessageThreads(prevValue => [...prevValue]); - }, [getMessageThreadWithIndex]); + setMessageThreads(prevValue => [ ...prevValue ]); + }, [ getMessageThreadWithIndex ]); UseMessageEventHook(NewConsoleMessageEvent, onNewConsoleMessageEvent); @@ -105,14 +105,14 @@ export const FriendsMessengerView: FC<{}> = props => { const parser = event.getParser(); - const [threadIndex, thread] = getMessageThreadWithIndex(parser.senderId); + const [ threadIndex, thread ] = getMessageThreadWithIndex(parser.senderId); if((threadIndex === -1) || !thread) return; thread.addMessage(null, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); - setMessageThreads(prevValue => [...prevValue]); - }, [getMessageThreadWithIndex]); + setMessageThreads(prevValue => [ ...prevValue ]); + }, [ getMessageThreadWithIndex ]); UseMessageEventHook(RoomInviteEvent, onRoomInviteEvent); @@ -144,17 +144,17 @@ export const FriendsMessengerView: FC<{}> = props => BatchUpdates(() => { - setMessageThreads(prevValue => [...prevValue]); + setMessageThreads(prevValue => [ ...prevValue ]); setMessageText(''); }); - }, [messageThreads, activeThreadIndex, messageText]); + }, [ messageThreads, activeThreadIndex, messageText ]); const onKeyDown = useCallback((event: KeyboardEvent) => { if(event.key !== 'Enter') return; sendMessage(); - }, [sendMessage]); + }, [ sendMessage ]); const linkReceived = useCallback((url: string) => { @@ -169,7 +169,7 @@ export const FriendsMessengerView: FC<{}> = props => return; } - const [threadIndex] = getMessageThreadWithIndex(parseInt(parts[2])); + const [ threadIndex ] = getMessageThreadWithIndex(parseInt(parts[2])); if(threadIndex === -1) return; @@ -178,13 +178,13 @@ export const FriendsMessengerView: FC<{}> = props => setActiveThreadIndex(threadIndex); setIsVisible(true); }); - }, [getMessageThreadWithIndex]); + }, [ getMessageThreadWithIndex ]); const closeThread = useCallback((threadIndex: number) => { setHiddenThreadIndexes(prevValue => { - const values = [...prevValue]; + const values = [ ...prevValue ]; if(values.indexOf(threadIndex) === -1) values.push(threadIndex); @@ -202,19 +202,19 @@ export const FriendsMessengerView: FC<{}> = props => AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [linkReceived]); + }, [ linkReceived ]); useEffect(() => { if(!isVisible) return; if(activeThreadIndex === -1) setActiveThreadIndex(0); - }, [isVisible, activeThreadIndex]); + }, [ isVisible, activeThreadIndex ]); useEffect(() => { if(hiddenThreadIndexes.indexOf(activeThreadIndex) >= 0) setActiveThreadIndex(0); - }, [activeThreadIndex, hiddenThreadIndexes]); + }, [ activeThreadIndex, hiddenThreadIndexes ]); useEffect(() => { @@ -230,7 +230,7 @@ export const FriendsMessengerView: FC<{}> = props => activeThread.setRead(); setUpdateValue({}); } - }, [isVisible, messageThreads, activeThreadIndex]); + }, [ isVisible, messageThreads, activeThreadIndex ]); useEffect(() => { @@ -258,13 +258,13 @@ export const FriendsMessengerView: FC<{}> = props => if(isUnread) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); DispatchUiEvent(new FriendsMessengerIconEvent(FriendsMessengerIconEvent.UPDATE_ICON, isUnread ? FriendsMessengerIconEvent.UNREAD_ICON : FriendsMessengerIconEvent.SHOW_ICON)); - }, [visibleThreads, updateValue]); + }, [ visibleThreads, updateValue ]); if(!isVisible) return null; return ( - setIsVisible(false)} /> + setIsVisible(false)} /> diff --git a/src/components/groups/views/GroupBadgeCreatorView.tsx b/src/components/groups/views/GroupBadgeCreatorView.tsx index 04d7b864..7ce204b1 100644 --- a/src/components/groups/views/GroupBadgeCreatorView.tsx +++ b/src/components/groups/views/GroupBadgeCreatorView.tsx @@ -34,33 +34,33 @@ export const GroupBadgeCreatorView: FC = props => return ( <> { ((selectedIndex < 0) && badgeParts && (badgeParts.length > 0)) && badgeParts.map((part, index) => - { - return ( - - setSelectedIndex(index) }> - { (badgeParts[index].code && (badgeParts[index].code.length > 0)) && + { + return ( + + setSelectedIndex(index) }> + { (badgeParts[index].code && (badgeParts[index].code.length > 0)) && } - { (!badgeParts[index].code || !badgeParts[index].code.length) && + { (!badgeParts[index].code || !badgeParts[index].code.length) && } - - { (part.type !== GroupBadgePart.BASE) && + + { (part.type !== GroupBadgePart.BASE) && { POSITIONS.map((position, posIndex) => - { - return setPartProperty(index, 'position', position) }> - }) } - } - - { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => { - return setPartProperty(index, 'color', (colorIndex + 1)) }> + return setPartProperty(index, 'position', position) }> }) } - - - ); - }) } + } + + { (groupCustomize.badgePartColors.length > 0) && groupCustomize.badgePartColors.map((item, colorIndex) => + { + return setPartProperty(index, 'color', (colorIndex + 1)) }> + }) } + + + ); + }) } { (selectedIndex >= 0) && { (badgeParts[selectedIndex].type === GroupBadgePart.SYMBOL) && @@ -70,13 +70,13 @@ export const GroupBadgeCreatorView: FC = props =>
    } { ((badgeParts[selectedIndex].type === GroupBadgePart.BASE) ? groupCustomize.badgeBases : groupCustomize.badgeSymbols).map((item, index) => - { - return ( - setPartProperty(selectedIndex, 'key', item.id) }> - - - ); - }) } + { + return ( + setPartProperty(selectedIndex, 'key', item.id) }> + + + ); + }) } } ); diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx index 56893477..a9b27f45 100644 --- a/src/components/groups/views/GroupCreatorView.tsx +++ b/src/components/groups/views/GroupCreatorView.tsx @@ -132,13 +132,13 @@ export const GroupCreatorView: FC = props => { TABS.map((tab, index) => - { - return ( - - { LocalizeText(`group.create.steplabel.${ tab }`) } - - ); - }) } + { + return ( + + { LocalizeText(`group.create.steplabel.${ tab }`) } + + ); + }) } diff --git a/src/components/groups/views/GroupInformationView.tsx b/src/components/groups/views/GroupInformationView.tsx index 124eb962..8624ee7f 100644 --- a/src/components/groups/views/GroupInformationView.tsx +++ b/src/components/groups/views/GroupInformationView.tsx @@ -26,11 +26,11 @@ export const GroupInformationView: FC = props => const leaveGroup = () => { NotificationUtilities.confirm(LocalizeText('group.leaveconfirm.desc'), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); + { + SendMessageComposer(new GroupRemoveMemberComposer(groupInformation.id, GetSessionDataManager().userId)); - if(onClose) onClose(); - }, null); + if(onClose) onClose(); + }, null); } const getRoleIcon = () => @@ -126,7 +126,7 @@ export const GroupInformationView: FC = props => } - { LocalizeText('group.created', ['date', 'owner'], [groupInformation.createdAt, groupInformation.ownerName]) } + { LocalizeText('group.created', [ 'date', 'owner' ], [ groupInformation.createdAt, groupInformation.ownerName ]) } { groupInformation.description } diff --git a/src/components/groups/views/GroupManagerView.tsx b/src/components/groups/views/GroupManagerView.tsx index 3433ae48..565da645 100644 --- a/src/components/groups/views/GroupManagerView.tsx +++ b/src/components/groups/views/GroupManagerView.tsx @@ -20,11 +20,11 @@ export const GroupManagerView: FC<{}> = props => const close = () => { setCloseAction(prevValue => - { - if(prevValue && prevValue.action) prevValue.action(); + { + if(prevValue && prevValue.action) prevValue.action(); - return null; - }); + return null; + }); setGroupData(null); } @@ -43,16 +43,16 @@ export const GroupManagerView: FC<{}> = props => if(!groupData || (groupData.groupId !== parser.id)) return; setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupName = parser.title; - newValue.groupDescription = parser.description; - newValue.groupState = parser.type; - newValue.groupCanMembersDecorate = parser.canMembersDecorate; + newValue.groupName = parser.title; + newValue.groupDescription = parser.description; + newValue.groupState = parser.type; + newValue.groupCanMembersDecorate = parser.canMembersDecorate; - return newValue; - }); + return newValue; + }); }, [ groupData ]); UseMessageEventHook(GroupInformationEvent, onGroupInformationEvent); @@ -94,11 +94,11 @@ export const GroupManagerView: FC<{}> = props => { TABS.map(tab => - { - return ( changeTab(tab) }> - { LocalizeText(`group.edit.tab.${tab}`) } - ); - }) } + { + return ( changeTab(tab) }> + { LocalizeText(`group.edit.tab.${tab}`) } + ); + }) } diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index 5bafa369..9a43c30c 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -91,11 +91,11 @@ export const GroupMembersView: FC<{}> = props => const parser = event.getParser(); NotificationUtilities.confirm(LocalizeText(((parser.furnitureCount > 0) ? 'group.kickconfirm.desc' : 'group.kickconfirm_nofurni.desc'), [ 'user', 'amount' ], [ removingMemberName, parser.furnitureCount.toString() ]), () => - { - SendMessageComposer(new GroupRemoveMemberComposer(membersData.groupId, parser.userId)); + { + SendMessageComposer(new GroupRemoveMemberComposer(membersData.groupId, parser.userId)); - refreshMembers(); - }, null); + refreshMembers(); + }, null); setRemovingMemberName(null); }, [ membersData, removingMemberName, refreshMembers ]); @@ -160,7 +160,7 @@ export const GroupMembersView: FC<{}> = props => return ( - setGroupId(-1) } /> + setGroupId(-1) } /> @@ -177,41 +177,41 @@ export const GroupMembersView: FC<{}> = props => { membersData.result.map((member, index) => - { - return ( - -
    GetUserProfile(member.id) }> - -
    - - GetUserProfile(member.id) }>{ member.name } - { (member.rank !== GroupRank.REQUESTED) && + { + return ( + +
    GetUserProfile(member.id) }> + +
    + + GetUserProfile(member.id) }>{ member.name } + { (member.rank !== GroupRank.REQUESTED) && { LocalizeText('group.members.since', [ 'date' ], [ member.joinedAt ]) } } - - - { (member.rank !== GroupRank.REQUESTED) && + + + { (member.rank !== GroupRank.REQUESTED) && toggleAdmin(member) } /> } - { membersData.admin && (member.rank === GroupRank.REQUESTED) && + { membersData.admin && (member.rank === GroupRank.REQUESTED) && acceptMembership(member) }> } - { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && + { membersData.admin && (member.rank !== GroupRank.OWNER) && (member.id !== GetSessionDataManager().userId) && removeMemberOrDeclineMembership(member) }> } - -
    - ); - }) } +
    +
    + ); + }) }
    - { LocalizeText('group.members.pageinfo', ['amount', 'page', 'totalPages'], [membersData.totalMembersCount.toString(), (membersData.pageIndex + 1).toString(), totalPages.toString()]) } + { LocalizeText('group.members.pageinfo', [ 'amount', 'page', 'totalPages' ], [ membersData.totalMembersCount.toString(), (membersData.pageIndex + 1).toString(), totalPages.toString() ]) } - } + } } diff --git a/src/components/groups/views/tabs/GroupTabBadgeView.tsx b/src/components/groups/views/tabs/GroupTabBadgeView.tsx index 75d6214b..b26869a6 100644 --- a/src/components/groups/views/tabs/GroupTabBadgeView.tsx +++ b/src/components/groups/views/tabs/GroupTabBadgeView.tsx @@ -41,13 +41,13 @@ export const GroupTabBadgeView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupBadgeParts = badgeParts; + newValue.groupBadgeParts = badgeParts; - return newValue; - }); + return newValue; + }); return true; } @@ -81,11 +81,11 @@ export const GroupTabBadgeView: FC = props => ]; setGroupData(prevValue => - { - const groupBadgeParts = badgeParts; + { + const groupBadgeParts = badgeParts; - return { ...prevValue, groupBadgeParts }; - }); + return { ...prevValue, groupBadgeParts }; + }); }, [ groupData.groupBadgeParts, groupCustomize, setGroupData ]); useEffect(() => diff --git a/src/components/groups/views/tabs/GroupTabColorsView.tsx b/src/components/groups/views/tabs/GroupTabColorsView.tsx index 416f975a..fb893fdf 100644 --- a/src/components/groups/views/tabs/GroupTabColorsView.tsx +++ b/src/components/groups/views/tabs/GroupTabColorsView.tsx @@ -29,13 +29,13 @@ export const GroupTabColorsView: FC = props => const selectColor = (colorIndex: number, colorId: number) => { setColors(prevValue => - { - const newColors = [ ...prevValue ]; + { + const newColors = [ ...prevValue ]; - newColors[colorIndex] = colorId; + newColors[colorIndex] = colorId; - return newColors; - }); + return newColors; + }); } const saveColors = useCallback(() => @@ -47,13 +47,13 @@ export const GroupTabColorsView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupColors = [ ...colors ]; + newValue.groupColors = [ ...colors ]; - return newValue; - }); + return newValue; + }); return true; } @@ -70,9 +70,9 @@ export const GroupTabColorsView: FC = props => const groupColors = [ groupCustomize.groupColorsA[0].id, groupCustomize.groupColorsB[0].id ]; setGroupData(prevValue => - { - return { ...prevValue, groupColors }; - }); + { + return { ...prevValue, groupColors }; + }); }, [ groupCustomize, groupData.groupColors, setGroupData ]); useEffect(() => @@ -110,18 +110,18 @@ export const GroupTabColorsView: FC = props => { LocalizeText('group.edit.color.primary.color') } { groupData.groupColors && groupCustomize.groupColorsA && groupCustomize.groupColorsA.map((item, index) => - { - return
    selectColor(0, item.id) }>
    - }) } + { + return
    selectColor(0, item.id) }>
    + }) }
    { LocalizeText('group.edit.color.secondary.color') } { groupData.groupColors && groupCustomize.groupColorsB && groupCustomize.groupColorsB.map((item, index) => - { - return
    selectColor(1, item.id) }>
    - }) } + { + return
    selectColor(1, item.id) }>
    + }) }
    diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx index 9934736f..dac7f184 100644 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ b/src/components/groups/views/tabs/GroupTabIdentityView.tsx @@ -27,11 +27,11 @@ export const GroupTabIdentityView: FC = props => if(!groupData || (groupData.groupId <= 0)) return; NotificationUtilities.confirm(LocalizeText('group.deleteconfirm.desc'), () => - { - SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); + { + SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); - if(close) close(); - }, null, null, null, LocalizeText('group.deleteconfirm.title')); + if(close) close(); + }, null, null, null, LocalizeText('group.deleteconfirm.title')); } const saveIdentity = useCallback(() => @@ -45,15 +45,15 @@ export const GroupTabIdentityView: FC = props => if(groupHomeroomId <= 0) return false; setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupName = groupName; - newValue.groupDescription = groupDescription; - newValue.groupHomeroomId = groupHomeroomId; + newValue.groupName = groupName; + newValue.groupDescription = groupDescription; + newValue.groupHomeroomId = groupHomeroomId; - return newValue; - }); + return newValue; + }); return true; } diff --git a/src/components/groups/views/tabs/GroupTabSettingsView.tsx b/src/components/groups/views/tabs/GroupTabSettingsView.tsx index f9ba86fe..3dd8cbef 100644 --- a/src/components/groups/views/tabs/GroupTabSettingsView.tsx +++ b/src/components/groups/views/tabs/GroupTabSettingsView.tsx @@ -30,14 +30,14 @@ export const GroupTabSettingsView: FC = props => if(groupData.groupId <= 0) { setGroupData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.groupState = groupState; - newValue.groupCanMembersDecorate = groupDecorate; + newValue.groupState = groupState; + newValue.groupCanMembersDecorate = groupDecorate; - return newValue; - }); + return newValue; + }); return true; } @@ -67,20 +67,20 @@ export const GroupTabSettingsView: FC = props => { STATES.map((state, index) => - { - return ( - - setGroupState(index) } /> - - - - { LocalizeText(`group.edit.settings.type.${ state }.label`) } - - { LocalizeText(`group.edit.settings.type.${ state }.help`) } - - - ); - }) } + { + return ( + + setGroupState(index) } /> + + + + { LocalizeText(`group.edit.settings.type.${ state }.label`) } + + { LocalizeText(`group.edit.settings.type.${ state }.help`) } + + + ); + }) } diff --git a/src/components/guide-tool/GuideToolView.tsx b/src/components/guide-tool/GuideToolView.tsx index b09dd692..abf00415 100644 --- a/src/components/guide-tool/GuideToolView.tsx +++ b/src/components/guide-tool/GuideToolView.tsx @@ -55,7 +55,7 @@ export const GuideToolView: FC<{}> = props => setNoCloseButton(true); break; case GuideSessionState.GUIDE_ONGOING: - setHeaderText(LocalizeText('guide.help.request.guide.ongoing.title', ['name'], [replacement])); + setHeaderText(LocalizeText('guide.help.request.guide.ongoing.title', [ 'name' ], [ replacement ])); setNoCloseButton(true); break; case GuideSessionState.USER_CREATE: @@ -67,7 +67,7 @@ export const GuideToolView: FC<{}> = props => setNoCloseButton(true); break; case GuideSessionState.USER_ONGOING: - setHeaderText(LocalizeText('guide.help.request.user.ongoing.title', ['name'], [replacement])); + setHeaderText(LocalizeText('guide.help.request.user.ongoing.title', [ 'name' ], [ replacement ])); setNoCloseButton(true); break; case GuideSessionState.USER_FEEDBACK: @@ -183,7 +183,7 @@ export const GuideToolView: FC<{}> = props => { const parser = event.getParser(); - const messageGroups = [...ongoingMessageGroups]; + const messageGroups = [ ...ongoingMessageGroups ]; let lastGroup = messageGroups[messageGroups.length - 1]; @@ -203,7 +203,7 @@ export const GuideToolView: FC<{}> = props => { const parser = event.getParser(); - const messageGroups = [...ongoingMessageGroups]; + const messageGroups = [ ...ongoingMessageGroups ]; let lastGroup = messageGroups[messageGroups.length - 1]; @@ -217,7 +217,7 @@ export const GuideToolView: FC<{}> = props => lastGroup.addChat(new GuideToolMessage(parser.roomName, parser.roomId)); setOngoingMessageGroups(messageGroups); - }, [isOnDuty, ongoingMessageGroups, ongoingUserId]); + }, [ isOnDuty, ongoingMessageGroups, ongoingUserId ]); UseMessageEventHook(GuideSessionInvitedToGuideRoomMessageEvent, onGuideSessionInvitedToGuideRoomMessageEvent); @@ -270,7 +270,7 @@ export const GuideToolView: FC<{}> = props => switch(parts[1]) { case 'tour': - //Create Tour Request + //Create Tour Request return; } }, []); @@ -299,15 +299,15 @@ export const GuideToolView: FC<{}> = props => case 'toggle_duty': if(!isHandlingBullyReports && !isHandlingGuideRequests && !isHandlingHelpRequests) { - DispatchUiEvent(new NotificationAlertEvent([LocalizeText('guide.help.guide.tool.noqueueselected.message')], null, null, null, LocalizeText('guide.help.guide.tool.noqueueselected.caption'), null)); + DispatchUiEvent(new NotificationAlertEvent([ LocalizeText('guide.help.guide.tool.noqueueselected.message') ], null, null, null, LocalizeText('guide.help.guide.tool.noqueueselected.caption'), null)); return; } setIsOnDuty(v => - { - SendMessageComposer(new GuideSessionOnDutyUpdateMessageComposer(!v, v ? false : isHandlingGuideRequests, v ? false : isHandlingHelpRequests, v ? false : isHandlingBullyReports)); - return !v; - }); + { + SendMessageComposer(new GuideSessionOnDutyUpdateMessageComposer(!v, v ? false : isHandlingGuideRequests, v ? false : isHandlingHelpRequests, v ? false : isHandlingBullyReports)); + return !v; + }); return; case 'forum_link': @@ -315,7 +315,7 @@ export const GuideToolView: FC<{}> = props => window.open(url); return; } - }, [isHandlingBullyReports, isHandlingGuideRequests, isHandlingHelpRequests]); + }, [ isHandlingBullyReports, isHandlingGuideRequests, isHandlingHelpRequests ]); if(!isVisible) return null; diff --git a/src/components/guide-tool/views/GuideToolAcceptView.tsx b/src/components/guide-tool/views/GuideToolAcceptView.tsx index 05f6f6fc..b9a9fcf7 100644 --- a/src/components/guide-tool/views/GuideToolAcceptView.tsx +++ b/src/components/guide-tool/views/GuideToolAcceptView.tsx @@ -24,8 +24,8 @@ export const GuideToolAcceptView: FC = props => + { LocalizeText('guide.help.request.guide.accept.accept.button') } + diff --git a/src/components/guide-tool/views/GuideToolOngoingView.tsx b/src/components/guide-tool/views/GuideToolOngoingView.tsx index 21ef8ce3..3bbf84d4 100644 --- a/src/components/guide-tool/views/GuideToolOngoingView.tsx +++ b/src/components/guide-tool/views/GuideToolOngoingView.tsx @@ -83,27 +83,27 @@ export const GuideToolOngoingView: FC = props => { messageGroups.map((group, index) => - { - return ( - - - { (!isOwnChat(group.userId)) && + { + return ( + + + { (!isOwnChat(group.userId)) && } - - - - { (isOwnChat(group.userId)) && GetSessionDataManager().userName } - { (!isOwnChat(group.userId)) && userName } - - { group.messages.map((chat, index) => { chat.message }) } - - { (isOwnChat(group.userId)) && + + + + { (isOwnChat(group.userId)) && GetSessionDataManager().userName } + { (!isOwnChat(group.userId)) && userName } + + { group.messages.map((chat, index) => { chat.message }) } + + { (isOwnChat(group.userId)) && } - - ); - }) } + + ); + }) } diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx index 5697ed79..4a5fd5cc 100644 --- a/src/components/hc-center/HcCenterView.tsx +++ b/src/components/hc-center/HcCenterView.tsx @@ -90,7 +90,7 @@ export const HcCenterView: FC<{}> = props => setIsVisible(!isVisible); break; } - }, [isVisible]); + }, [ isVisible ]); UseUiEvent(HcCenterEvent.TOGGLE_HC_CENTER, onHcCenterEvent); @@ -169,7 +169,7 @@ export const HcCenterView: FC<{}> = props => AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived]); + }, [ linkReceived ]); useEffect(() => { @@ -201,14 +201,17 @@ export const HcCenterView: FC<{}> = props =>
    {LocalizeText('hccenter.breakdown.title')}
    -
    {LocalizeText('hccenter.breakdown.creditsspent', ['credits'], [kickbackData.totalCreditsSpent.toString()])}
    -
    {LocalizeText('hccenter.breakdown.paydayfactor.percent', ['percent'], [(kickbackData.kickbackPercentage * 100).toString()])}
    -
    {LocalizeText('hccenter.breakdown.streakbonus', ['credits'], [kickbackData.creditRewardForStreakBonus.toString()])}
    +
    {LocalizeText('hccenter.breakdown.creditsspent', [ 'credits' ], [ kickbackData.totalCreditsSpent.toString() ])}
    +
    {LocalizeText('hccenter.breakdown.paydayfactor.percent', [ 'percent' ], [ (kickbackData.kickbackPercentage * 100).toString() ])}
    +
    {LocalizeText('hccenter.breakdown.streakbonus', [ 'credits' ], [ kickbackData.creditRewardForStreakBonus.toString() ])}

    -
    {LocalizeText('hccenter.breakdown.total', ['credits', 'actual'], [getHcPaydayAmount(), - ((((kickbackData.kickbackPercentage * kickbackData.totalCreditsSpent) + kickbackData.creditRewardForStreakBonus) * 100) / 100).toString()])}
    -
    { CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }}>{ - LocalizeText('hccenter.special.infolink')} +
    {LocalizeText('hccenter.breakdown.total', [ 'credits', 'actual' ], [ getHcPaydayAmount(), + ((((kickbackData.kickbackPercentage * kickbackData.totalCreditsSpent) + kickbackData.creditRewardForStreakBonus) * 100) / 100).toString() ])}
    +
    + { + CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) + }}>{ + LocalizeText('hccenter.special.infolink')}
    @@ -221,7 +224,10 @@ export const HcCenterView: FC<{}> = props =>
    - @@ -243,7 +249,10 @@ export const HcCenterView: FC<{}> = props =>

    {LocalizeText('hccenter.special.title')}

    {LocalizeText('hccenter.special.info')}
    -
    { CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }}>{LocalizeText('hccenter.special.infolink')}
    +
    + { + CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) + }}>{LocalizeText('hccenter.special.infolink')}
    {LocalizeText('hccenter.special.time.title')}
    @@ -271,16 +280,22 @@ export const HcCenterView: FC<{}> = props =>

    {LocalizeText('hccenter.gift.title')}

    -
    0 ? LocalizeText('hccenter.unclaimedgifts', ['unclaimedgifts'], [unclaimedGifts.toString()]) : LocalizeText('hccenter.gift.info') }}>
    +
    0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') }}>
    - +
    } {GetConfiguration('hc.center')['benefits.info'] &&
    {LocalizeText('hccenter.general.title')}
    - +
    } diff --git a/src/components/hc-center/common/BadgeResolver.ts b/src/components/hc-center/common/BadgeResolver.ts index d61d66da..e334b6e8 100644 --- a/src/components/hc-center/common/BadgeResolver.ts +++ b/src/components/hc-center/common/BadgeResolver.ts @@ -2,7 +2,7 @@ export class BadgeResolver { public static default_badge: string = 'HC1'; - public static badges: string[] = ['ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5']; + public static badges: string[] = [ 'ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5' ]; public static getClubBadge(k: string[]): string diff --git a/src/components/help/HelpView.tsx b/src/components/help/HelpView.tsx index cae699cd..c9909cb5 100644 --- a/src/components/help/HelpView.tsx +++ b/src/components/help/HelpView.tsx @@ -104,7 +104,7 @@ export const HelpView: FC<{}> = props => } return null; - }, [helpReportState.currentStep]); + }, [ helpReportState.currentStep ]); return ( diff --git a/src/components/help/views/HelpIndexView.tsx b/src/components/help/views/HelpIndexView.tsx index c083572f..5123ab8d 100644 --- a/src/components/help/views/HelpIndexView.tsx +++ b/src/components/help/views/HelpIndexView.tsx @@ -15,7 +15,7 @@ export const HelpIndexView: FC<{}> = props => const reportState = Object.assign({}, helpReportState ); reportState.currentStep = 1; setHelpReportState(reportState); - },[helpReportState, setHelpReportState]); + },[ helpReportState, setHelpReportState ]); const onRequestMySanctionStatusClick = useCallback(() => { diff --git a/src/components/help/views/SanctionStatusView.tsx b/src/components/help/views/SanctionStatusView.tsx index 5c8e10ce..ab405c4d 100644 --- a/src/components/help/views/SanctionStatusView.tsx +++ b/src/components/help/views/SanctionStatusView.tsx @@ -39,11 +39,11 @@ export const SanctionSatusView:FC<{}> = props => if(length > 24) { localizationName = (localizationName + '.days'); - return LocalizeText(localizationName, ['days'], [(length / 24).toString()]); + return LocalizeText(localizationName, [ 'days' ], [ (length / 24).toString() ]); } } - return LocalizeText(localizationName, ['hours'], [length.toString()]); + return LocalizeText(localizationName, [ 'hours' ], [ length.toString() ]); }, []); if(!sanctionInfo) return null; diff --git a/src/components/help/views/SelectReportedChatsView.tsx b/src/components/help/views/SelectReportedChatsView.tsx index 099266e5..6a24704f 100644 --- a/src/components/help/views/SelectReportedChatsView.tsx +++ b/src/components/help/views/SelectReportedChatsView.tsx @@ -33,22 +33,22 @@ export const SelectReportedChatsView: FC<{}> = props => if(!selectedChats || (selectedChats.size <= 0)) return; setHelpReportState(prevValue => - { - const reportedChats = Array.from(selectedChats.values()); - const currentStep = 3; + { + const reportedChats = Array.from(selectedChats.values()); + const currentStep = 3; - return { ...prevValue, reportedChats, currentStep }; - }); + return { ...prevValue, reportedChats, currentStep }; + }); } const back = () => { setHelpReportState(prevValue => - { - const currentStep = (prevValue.currentStep - 1); + { + const currentStep = (prevValue.currentStep - 1); - return { ...prevValue, currentStep }; - }); + return { ...prevValue, currentStep }; + }); } return ( @@ -63,13 +63,13 @@ export const SelectReportedChatsView: FC<{}> = props => { (userChats.length > 0) && { userChats.map((chat, index) => - { - return ( - selectChat(chat) } itemActive={ selectedChats.has(chat.id) }> - { chat.message } - - ); - }) } + { + return ( + selectChat(chat) } itemActive={ selectedChats.has(chat.id) }> + { chat.message } + + ); + }) } } diff --git a/src/components/help/views/SelectReportedUserView.tsx b/src/components/help/views/SelectReportedUserView.tsx index 000b7f99..363efdc4 100644 --- a/src/components/help/views/SelectReportedUserView.tsx +++ b/src/components/help/views/SelectReportedUserView.tsx @@ -17,15 +17,15 @@ export const SelectReportedUserView: FC<{}> = props => const users: Map = new Map(); GetChatHistory().chats.forEach(chat => + { + if((chat.type === ChatEntryType.TYPE_CHAT) && (chat.entityType === RoomObjectType.USER) && (chat.entityId !== GetSessionDataManager().userId)) { - if((chat.type === ChatEntryType.TYPE_CHAT) && (chat.entityType === RoomObjectType.USER) && (chat.entityId !== GetSessionDataManager().userId)) + if(!users.has(chat.entityId)) { - if(!users.has(chat.entityId)) - { - users.set(chat.entityId, { id: chat.entityId, username: chat.name }) - } + users.set(chat.entityId, { id: chat.entityId, username: chat.name }) } - }); + } + }); return Array.from(users.values()); }, []); @@ -35,12 +35,12 @@ export const SelectReportedUserView: FC<{}> = props => if(selectedUserId <= 0) return; setHelpReportState(prevValue => - { - const reportedUserId = selectedUserId; - const currentStep = 2; + { + const reportedUserId = selectedUserId; + const currentStep = 2; - return { ...prevValue, reportedUserId, currentStep }; - }); + return { ...prevValue, reportedUserId, currentStep }; + }); } const selectUser = (userId: number) => @@ -52,11 +52,11 @@ export const SelectReportedUserView: FC<{}> = props => const back = () => { setHelpReportState(prevValue => - { - const currentStep = (prevValue.currentStep - 1); + { + const currentStep = (prevValue.currentStep - 1); - return { ...prevValue, currentStep }; - }); + return { ...prevValue, currentStep }; + }); } return ( @@ -72,13 +72,13 @@ export const SelectReportedUserView: FC<{}> = props => { (availableUsers.length > 0) && { availableUsers.map((user, index) => - { - return ( - selectUser(user.id) } itemActive={ (selectedUserId === user.id) }> - - - ); - }) } + { + return ( + selectUser(user.id) } itemActive={ (selectedUserId === user.id) }> + + + ); + }) } } diff --git a/src/components/help/views/SelectTopicView.tsx b/src/components/help/views/SelectTopicView.tsx index b2a95808..f38f8141 100644 --- a/src/components/help/views/SelectTopicView.tsx +++ b/src/components/help/views/SelectTopicView.tsx @@ -17,23 +17,23 @@ export const SelectTopicView: FC<{}> = props => if((selectedCategory < 0) || (selectedTopic < 0)) return; setHelpReportState(prevValue => - { - const cfhCategory = selectedCategory; - const cfhTopic = cfhCategories[selectedCategory].topics[selectedTopic].id; - const currentStep = 4; + { + const cfhCategory = selectedCategory; + const cfhTopic = cfhCategories[selectedCategory].topics[selectedTopic].id; + const currentStep = 4; - return { ...prevValue, cfhCategory, cfhTopic, currentStep }; - }); + return { ...prevValue, cfhCategory, cfhTopic, currentStep }; + }); } const back = () => { setHelpReportState(prevValue => - { - const currentStep = (prevValue.currentStep - 1); + { + const currentStep = (prevValue.currentStep - 1); - return { ...prevValue, currentStep }; - }); + return { ...prevValue, currentStep }; + }); } return ( diff --git a/src/components/help/views/name-change/NameChangeInitView.tsx b/src/components/help/views/name-change/NameChangeInitView.tsx index d995dc3c..8eb1e01e 100644 --- a/src/components/help/views/name-change/NameChangeInitView.tsx +++ b/src/components/help/views/name-change/NameChangeInitView.tsx @@ -9,7 +9,7 @@ export const NameChangeInitView:FC = props => return (
    { LocalizeText('tutorial.name_change.info.main') }
    -
    { LocalizeText('tutorial.name_change.current', ['name'], [GetSessionDataManager().userName]) }
    +
    { LocalizeText('tutorial.name_change.current', [ 'name' ], [ GetSessionDataManager().userName ]) }
    diff --git a/src/components/help/views/name-change/NameChangeInputView.tsx b/src/components/help/views/name-change/NameChangeInputView.tsx index c394c6e0..e406c4df 100644 --- a/src/components/help/views/name-change/NameChangeInputView.tsx +++ b/src/components/help/views/name-change/NameChangeInputView.tsx @@ -83,8 +83,8 @@ export const NameChangeInputView:FC = props =>
    { !errorCode && !canProceed &&
    { LocalizeText('help.tutorial.name.info') }
    } - { errorCode &&
    { LocalizeText(`help.tutorial.name.${errorCode}`, ['name'], [newUsername]) }
    } - { canProceed &&
    { LocalizeText('help.tutorial.name.available', ['name'], [newUsername]) }
    } + { errorCode &&
    { LocalizeText(`help.tutorial.name.${errorCode}`, [ 'name' ], [ newUsername ]) }
    } + { canProceed &&
    { LocalizeText('help.tutorial.name.available', [ 'name' ], [ newUsername ]) }
    } { suggestions &&
    { suggestions.map((suggestion, i) => diff --git a/src/components/help/views/name-change/NameChangeView.tsx b/src/components/help/views/name-change/NameChangeView.tsx index e7d33ce2..ecca6965 100644 --- a/src/components/help/views/name-change/NameChangeView.tsx +++ b/src/components/help/views/name-change/NameChangeView.tsx @@ -51,7 +51,7 @@ export const NameChangeView:FC<{}> = props => case INPUT: return 'tutorial.name_change.title.select'; case CONFIRMATION: return 'tutorial.name_change.title.confirm'; } - }, [layout]); + }, [ layout ]); if(!isVisible) return null; diff --git a/src/components/hotel-view/HotelView.tsx b/src/components/hotel-view/HotelView.tsx index e9f6835b..992782e6 100644 --- a/src/components/hotel-view/HotelView.tsx +++ b/src/components/hotel-view/HotelView.tsx @@ -6,7 +6,7 @@ import { BatchUpdates, UseMessageEventHook, UseRoomSessionManagerEvent } from '. import { WidgetSlotView } from './views/widgets/WidgetSlotView'; export const HotelView: FC<{}> = props => { - const [isVisible, setIsVisible] = useState(true); + const [ isVisible, setIsVisible ] = useState(true); const widgetSlotCount = 7; const [ userFigure, setUserFigure ] = useState(null); const [ userInfo, setUserInfo ] = useState(null); diff --git a/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx b/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx index ebd814b6..37b30b93 100644 --- a/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx +++ b/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx @@ -13,17 +13,17 @@ export interface GetWidgetLayoutProps export const GetWidgetLayout: FC = props => { - switch(props.widgetType) - { - case 'promoarticle': - return ; - case 'achievementcompetition_hall_of_fame': - return ; - case 'bonusrare': - return ; - case 'widgetcontainer': - return - default: - return null; - } + switch(props.widgetType) + { + case 'promoarticle': + return ; + case 'achievementcompetition_hall_of_fame': + return ; + case 'bonusrare': + return ; + case 'widgetcontainer': + return + default: + return null; + } } diff --git a/src/components/hotel-view/views/widgets/hall-of-fame-item/HallOfFameItemView.tsx b/src/components/hotel-view/views/widgets/hall-of-fame-item/HallOfFameItemView.tsx index 4c9b27c8..bd5bda1f 100644 --- a/src/components/hotel-view/views/widgets/hall-of-fame-item/HallOfFameItemView.tsx +++ b/src/components/hotel-view/views/widgets/hall-of-fame-item/HallOfFameItemView.tsx @@ -17,7 +17,7 @@ export const HallOfFameItemView: FC = props =>
    - { level }. { data.userName } + { level }. { data.userName }
    { LocalizeText('landing.view.competition.hof.points', [ 'points' ], [ LocalizeFormattedNumber(data.currentScore).toString() ])}
    diff --git a/src/components/hotel-view/views/widgets/hall-of-fame/HallOfFameWidgetView.tsx b/src/components/hotel-view/views/widgets/hall-of-fame/HallOfFameWidgetView.tsx index 64b0211e..2abee5a6 100644 --- a/src/components/hotel-view/views/widgets/hall-of-fame/HallOfFameWidgetView.tsx +++ b/src/components/hotel-view/views/widgets/hall-of-fame/HallOfFameWidgetView.tsx @@ -30,10 +30,10 @@ export const HallOfFameWidgetView: FC = props => return (
    { data.hof && (data.hof.length > 0) && data.hof.map((entry, index) => - { - return ; - } - )} + { + return ; + } + )}
    ); } diff --git a/src/components/hotel-view/views/widgets/promo-article/PromoArticleWidgetView.tsx b/src/components/hotel-view/views/widgets/promo-article/PromoArticleWidgetView.tsx index cbcc04ab..6153cb15 100644 --- a/src/components/hotel-view/views/widgets/promo-article/PromoArticleWidgetView.tsx +++ b/src/components/hotel-view/views/widgets/promo-article/PromoArticleWidgetView.tsx @@ -8,8 +8,8 @@ export interface PromoArticleWidgetViewProps export const PromoArticleWidgetView: FC = props => { - const [articles, setArticles] = useState(null); - const [index, setIndex] = useState(0); + const [ articles, setArticles ] = useState(null); + const [ index, setIndex ] = useState(0); const handleSelect = (selectedIndex) => { @@ -32,24 +32,24 @@ export const PromoArticleWidgetView: FC = props => if(!articles) return null; return ( -
    -
    - { LocalizeText('landing.view.promo.article.header') } +
    +
    + { LocalizeText('landing.view.promo.article.header') }
    -
    +
    - {articles && (articles.length > 0) && articles.map((article, ind) => -
    handleSelect(ind)} /> - )} -
    + {articles && (articles.length > 0) && articles.map((article, ind) => +
    handleSelect(ind)} /> + )} +
    {articles && articles[index] &&
    -
    -

    {articles[index].title}

    - { articles[index].bodyText } - -
    +
    +

    {articles[index].title}

    + { articles[index].bodyText } + +
    }
    diff --git a/src/components/main/MainView.tsx b/src/components/main/MainView.tsx index d87f677d..f7059685 100644 --- a/src/components/main/MainView.tsx +++ b/src/components/main/MainView.tsx @@ -90,7 +90,7 @@ export const MainView: FC<{}> = props => { RemoveLinkEventTracker(linkTracker); } - }, [onLinkReceived]); + }, [ onLinkReceived ]); return ( diff --git a/src/components/mod-tools/ModToolsMessageHandler.tsx b/src/components/mod-tools/ModToolsMessageHandler.tsx index efe77935..dd22dcea 100644 --- a/src/components/mod-tools/ModToolsMessageHandler.tsx +++ b/src/components/mod-tools/ModToolsMessageHandler.tsx @@ -34,7 +34,7 @@ export const ModToolsMessageHandler: FC<{}> = props => } }); - }, [dispatchModToolsState]); + }, [ dispatchModToolsState ]); const onIssueInfoMessageEvent = useCallback((event: IssueInfoMessageEvent) => { @@ -62,7 +62,7 @@ export const ModToolsMessageHandler: FC<{}> = props => } }); - }, [dispatchModToolsState, tickets]); + }, [ dispatchModToolsState, tickets ]); const onModeratorToolPreferencesEvent = useCallback((event: ModeratorToolPreferencesEvent) => { @@ -100,7 +100,7 @@ export const ModToolsMessageHandler: FC<{}> = props => tickets: newTickets } }); - }, [dispatchModToolsState, tickets]); + }, [ dispatchModToolsState, tickets ]); const onModeratorActionResultMessageEvent = useCallback((event: ModeratorActionResultMessageEvent) => { @@ -135,7 +135,7 @@ export const ModToolsMessageHandler: FC<{}> = props => SetCfhCategories(categories); - }, [dispatchModToolsState]); + }, [ dispatchModToolsState ]); const onCfhSanctionMessageEvent = useCallback((event: CfhSanctionMessageEvent) => { @@ -195,7 +195,7 @@ export const ModToolsMessageHandler: FC<{}> = props => dispatchModToolsState({ type: ModToolsActions.SET_OPEN_ROOMS, payload: { - openRooms: [...rooms, castedEvent.roomId] + openRooms: [ ...rooms, castedEvent.roomId ] } }); return; @@ -210,7 +210,7 @@ export const ModToolsMessageHandler: FC<{}> = props => dispatchModToolsState({ type: ModToolsActions.SET_OPEN_ROOM_CHATLOGS, payload: { - openRoomChatlogs: [...chatlogs, castedEvent.roomId] + openRoomChatlogs: [ ...chatlogs, castedEvent.roomId ] } }); return; @@ -225,7 +225,7 @@ export const ModToolsMessageHandler: FC<{}> = props => dispatchModToolsState({ type: ModToolsActions.SET_OPEN_USERINFO, payload: { - openUserInfo: [...userInfo, castedEvent.userId] + openUserInfo: [ ...userInfo, castedEvent.userId ] } }); return; @@ -240,13 +240,13 @@ export const ModToolsMessageHandler: FC<{}> = props => dispatchModToolsState({ type: ModToolsActions.SET_OPEN_USER_CHATLOGS, payload: { - openUserChatlogs: [...userChatlog, castedEvent.userId] + openUserChatlogs: [ ...userChatlog, castedEvent.userId ] } }); return; } } - }, [openRooms, dispatchModToolsState, openRoomChatlogs, openUserInfo, openUserChatlogs]); + }, [ openRooms, dispatchModToolsState, openRoomChatlogs, openUserInfo, openUserChatlogs ]); UseUiEvent(ModToolsEvent.OPEN_ROOM_INFO, onModToolsEvent); UseUiEvent(ModToolsEvent.OPEN_ROOM_CHATLOG, onModToolsEvent); diff --git a/src/components/mod-tools/ModToolsView.tsx b/src/components/mod-tools/ModToolsView.tsx index 022cc2bc..0a0e4d7c 100644 --- a/src/components/mod-tools/ModToolsView.tsx +++ b/src/components/mod-tools/ModToolsView.tsx @@ -17,7 +17,7 @@ import { ModToolsUserView } from './views/user/ModToolsUserView'; export const ModToolsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ selectedUser, setSelectedUser] = useState(null); + const [ selectedUser, setSelectedUser ] = useState(null); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools); const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState; @@ -179,7 +179,7 @@ export const ModToolsView: FC<{}> = props => return; } } - }, [openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs]); + }, [ openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs ]); return ( @@ -192,35 +192,35 @@ export const ModToolsView: FC<{}> = props => Room Tool } { openRooms && openRooms.map(roomId => - { - return handleClick('close_room', roomId.toString()) } />; - }) + { + return handleClick('close_room', roomId.toString()) } />; + }) } { openRoomChatlogs && openRoomChatlogs.map(roomId => - { - return handleClick('close_room_chatlog', roomId.toString()) } />; - }) + { + return handleClick('close_room_chatlog', roomId.toString()) } />; + }) } { openUserInfo && openUserInfo.map(userId => - { - return handleClick('close_user_info', userId.toString())}/> - }) + { + return handleClick('close_user_info', userId.toString())}/> + }) } { openUserChatlogs && openUserChatlogs.map(userId => - { - return handleClick('close_user_chatlog', userId.toString())}/> - }) + { + return handleClick('close_user_chatlog', userId.toString())}/> + }) } { isTicketsVisible && setIsTicketsVisible(false) } /> } diff --git a/src/components/mod-tools/views/chatlog/ChatlogView.tsx b/src/components/mod-tools/views/chatlog/ChatlogView.tsx index 27b99b51..0018f187 100644 --- a/src/components/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/components/mod-tools/views/chatlog/ChatlogView.tsx @@ -98,7 +98,7 @@ export const ChatlogView: FC = props => } return count; - }, [records]); + }, [ records ]); const RoomInfo = (props: { roomId: number, roomName: string, uniqueKey: Key, style: CSSProperties }) => { @@ -137,20 +137,20 @@ export const ChatlogView: FC = props => { ({ height, width }) => - { - cache.clearAll(); + { + cache.clearAll(); - return ( - 1) ? getNumRowsForAdvanced() : records[0].chatlog.length } - rowHeight={ cache.rowHeight } - className={ 'log-entry-container' } - rowRenderer={ (records.length > 1) ? advancedRowRenderer : rowRenderer } - deferredMeasurementCache={ cache } /> - ); - } } + return ( + 1) ? getNumRowsForAdvanced() : records[0].chatlog.length } + rowHeight={ cache.rowHeight } + className={ 'log-entry-container' } + rowRenderer={ (records.length > 1) ? advancedRowRenderer : rowRenderer } + deferredMeasurementCache={ cache } /> + ); + } } } diff --git a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx index a91a3f92..1163a79d 100644 --- a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx +++ b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx @@ -19,7 +19,7 @@ export const CfhChatlogView: FC = props => useEffect(() => { SendMessageComposer(new GetCfhChatlogMessageComposer(issueId)); - }, [issueId]); + }, [ issueId ]); const onCfhChatlogEvent = useCallback((event: CfhChatlogEvent) => { @@ -28,7 +28,7 @@ export const CfhChatlogView: FC = props => if(!parser || parser.data.issueId !== issueId) return; setChatlogData(parser.data); - }, [issueId]); + }, [ issueId ]); UseMessageEventHook(CfhChatlogEvent, onCfhChatlogEvent); @@ -36,7 +36,7 @@ export const CfhChatlogView: FC = props => - { chatlogData && } + { chatlogData && } ); diff --git a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx index 1c3eb567..2db159b8 100644 --- a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx @@ -13,7 +13,7 @@ export const ModToolsMyIssuesTabView: FC = props = { const { myIssues = null, onIssueHandleClick = null } = props; - const onReleaseIssue = (issueId: number) => SendMessageComposer(new ReleaseIssuesMessageComposer([issueId])); + const onReleaseIssue = (issueId: number) => SendMessageComposer(new ReleaseIssuesMessageComposer([ issueId ])); return ( @@ -28,21 +28,21 @@ export const ModToolsMyIssuesTabView: FC = props = { myIssues && (myIssues.length > 0) && myIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - - - - - - - - ); - }) } + { + return ( + + { issue.categoryId } + { issue.reportedUserName } + { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } + + + + + + + + ); + }) } ); diff --git a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx index 62dc543b..c328025b 100644 --- a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx @@ -12,7 +12,7 @@ export const ModToolsOpenIssuesTabView: FC = pro { const { openIssues = null } = props; - const onPickIssue = (issueId: number) => SendMessageComposer(new PickIssuesMessageComposer([issueId], false, 0, 'pick issue button')); + const onPickIssue = (issueId: number) => SendMessageComposer(new PickIssuesMessageComposer([ issueId ], false, 0, 'pick issue button')); return ( @@ -26,18 +26,18 @@ export const ModToolsOpenIssuesTabView: FC = pro { openIssues && (openIssues.length > 0) && openIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - - - - - ); - }) } + { + return ( + + { issue.categoryId } + { issue.reportedUserName } + { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } + + + + + ); + }) } ); diff --git a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx index 6f155971..19b899bd 100644 --- a/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsPickedIssuesTabView.tsx @@ -23,16 +23,16 @@ export const ModToolsPickedIssuesTabView: FC = { pickedIssues && (pickedIssues.length > 0) && pickedIssues.map(issue => - { - return ( - - { issue.categoryId } - { issue.reportedUserName } - { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - { issue.pickerUserName } - - ); - }) } + { + return ( + + { issue.categoryId } + { issue.reportedUserName } + { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } + { issue.pickerUserName } + + ); + }) } ); diff --git a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx index b5a10aac..74eb08f4 100644 --- a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -32,21 +32,21 @@ export const ModToolsTicketsView: FC = props => if(!tickets) return []; return tickets.filter(issue => issue.state === IssueMessageData.STATE_OPEN); - }, [tickets]); + }, [ tickets ]); const myIssues = useMemo(() => { if(!tickets) return []; return tickets.filter(issue => (issue.state === IssueMessageData.STATE_PICKED) && (issue.pickerUserId === GetSessionDataManager().userId)); - }, [tickets]); + }, [ tickets ]); const pickedIssues = useMemo(() => { if(!tickets) return []; return tickets.filter(issue => issue.state === IssueMessageData.STATE_PICKED); - }, [tickets]); + }, [ tickets ]); const onIssueInfoClosed = useCallback((issueId: number) => { @@ -57,7 +57,7 @@ export const ModToolsTicketsView: FC = props => const newValues = Array.from(issueInfoWindows); newValues.splice(indexOfValue, 1); setIssueInfoWindows(newValues); - }, [issueInfoWindows]); + }, [ issueInfoWindows ]); const onIssueHandleClicked = useCallback((issueId: number) => { @@ -71,7 +71,7 @@ export const ModToolsTicketsView: FC = props => { onIssueInfoClosed(issueId); } - }, [issueInfoWindows, onIssueInfoClosed]); + }, [ issueInfoWindows, onIssueInfoClosed ]); const CurrentTabComponent = useCallback(() => { @@ -82,20 +82,20 @@ export const ModToolsTicketsView: FC = props => case 2: return ; default: return null; } - }, [currentTab, myIssues, onIssueHandleClicked, openIssues, pickedIssues]); + }, [ currentTab, myIssues, onIssueHandleClicked, openIssues, pickedIssues ]); return ( <> - - { TABS.map((tab, index) => - { - return ( setCurrentTab(index) }> - { tab } - ); - }) } - + + { TABS.map((tab, index) => + { + return ( setCurrentTab(index) }> + { tab } + ); + }) } + diff --git a/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx b/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx index 5db63f83..93a7b7b5 100644 --- a/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx @@ -43,7 +43,7 @@ export const ModToolsUserRoomVisitsView: FC = p useEffect(() => { SendMessageComposer(new GetRoomVisitsMessageComposer(userId)); - }, [userId]); + }, [ userId ]); if(!userId) return null; @@ -63,18 +63,18 @@ export const ModToolsUserRoomVisitsView: FC = p { roomVisitData && { ({ height, width }) => - { - return ( - - ); - } } + { + return ( + + ); + } } } diff --git a/src/components/mod-tools/views/user/ModToolsUserView.tsx b/src/components/mod-tools/views/user/ModToolsUserView.tsx index 322aee1a..bf35ddf9 100644 --- a/src/components/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserView.tsx @@ -115,19 +115,19 @@ export const ModToolsUserView: FC = props => { userProperties.map( (property, index) => - { + { - return ( - - - + + - - ); - }) } + + + ); + }) }
    { LocalizeText(property.localeKey) } - { property.value } - { property.showOnline && + return ( +
    { LocalizeText(property.localeKey) } + { property.value } + { property.showOnline && } -
    diff --git a/src/components/navigator/NavigatorMessageHandler.tsx b/src/components/navigator/NavigatorMessageHandler.tsx index 9c5e8e02..d99a0cd7 100644 --- a/src/components/navigator/NavigatorMessageHandler.tsx +++ b/src/components/navigator/NavigatorMessageHandler.tsx @@ -44,14 +44,14 @@ export const NavigatorMessageHandler: FC<{}> = props => const parser = event.getParser(); setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.eventMod = (parser.securityLevel >= SecurityLevel.MODERATOR); - newValue.roomPicker = (parser.securityLevel >= SecurityLevel.COMMUNITY); + newValue.eventMod = (parser.securityLevel >= SecurityLevel.MODERATOR); + newValue.roomPicker = (parser.securityLevel >= SecurityLevel.COMMUNITY); - return newValue; - }); + return newValue; + }); }, [ setNavigatorData ]); const onRoomForwardEvent = useCallback((event: RoomForwardEvent) => @@ -66,15 +66,15 @@ export const NavigatorMessageHandler: FC<{}> = props => const parser = event.getParser(); setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.enteredGuestRoom = null; - newValue.currentRoomOwner = parser.isOwner; - newValue.currentRoomId = parser.roomId; + newValue.enteredGuestRoom = null; + newValue.currentRoomOwner = parser.isOwner; + newValue.currentRoomId = parser.roomId; - return newValue; - }); + return newValue; + }); // close room info // close room settings @@ -94,28 +94,28 @@ export const NavigatorMessageHandler: FC<{}> = props => setDoorData({ roomInfo: null, state: DoorStateType.NONE }); setNavigatorData(prevValue => + { + const newValue = { ...prevValue }; + + newValue.enteredGuestRoom = parser.data; + newValue.currentRoomIsStaffPick = parser.staffPick; + + const isCreated = (newValue.createdFlatId === parser.data.roomId); + + if(!isCreated && parser.data.displayRoomEntryAd) { - const newValue = { ...prevValue }; + if(GetConfiguration('roomenterad.habblet.enabled', false)) HabboWebTools.openRoomEnterAd(); + } - newValue.enteredGuestRoom = parser.data; - newValue.currentRoomIsStaffPick = parser.staffPick; + newValue.createdFlatId = 0; - const isCreated = (newValue.createdFlatId === parser.data.roomId); + if(newValue.enteredGuestRoom && (newValue.enteredGuestRoom.habboGroupId > 0)) + { + // close event info + } - if(!isCreated && parser.data.displayRoomEntryAd) - { - if(GetConfiguration('roomenterad.habblet.enabled', false)) HabboWebTools.openRoomEnterAd(); - } - - newValue.createdFlatId = 0; - - if(newValue.enteredGuestRoom && (newValue.enteredGuestRoom.habboGroupId > 0)) - { - // close event info - } - - return newValue; - }); + return newValue; + }); } else if(parser.roomForward) { @@ -125,25 +125,25 @@ export const NavigatorMessageHandler: FC<{}> = props => { case RoomDataParser.DOORBELL_STATE: setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.roomInfo = parser.data; - newValue.state = DoorStateType.START_DOORBELL; + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_DOORBELL; - return newValue; - }); + return newValue; + }); return; case RoomDataParser.PASSWORD_STATE: setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.roomInfo = parser.data; - newValue.state = DoorStateType.START_PASSWORD; + newValue.roomInfo = parser.data; + newValue.state = DoorStateType.START_PASSWORD; - return newValue; - }); + return newValue; + }); return; } } @@ -155,14 +155,14 @@ export const NavigatorMessageHandler: FC<{}> = props => else { setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.enteredGuestRoom = parser.data; - newValue.currentRoomIsStaffPick = parser.staffPick; + newValue.enteredGuestRoom = parser.data; + newValue.currentRoomIsStaffPick = parser.staffPick; - return newValue; - }); + return newValue; + }); } }, [ setNavigatorData, setDoorData ]); @@ -171,14 +171,14 @@ export const NavigatorMessageHandler: FC<{}> = props => const parser = event.getParser(); setNavigatorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.currentRoomRating = parser.totalLikes; - newValue.canRate = parser.canLike; + newValue.currentRoomRating = parser.totalLikes; + newValue.canRate = parser.canLike; - return newValue; - }); + return newValue; + }); }, [ setNavigatorData ]); const onRoomDoorbellEvent = useCallback((event: RoomDoorbellEvent) => @@ -188,13 +188,13 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_WAITING; + newValue.state = DoorStateType.STATE_WAITING; - return newValue; - }); + return newValue; + }); } }, [ setDoorData ]); @@ -205,13 +205,13 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_ACCEPTED; + newValue.state = DoorStateType.STATE_ACCEPTED; - return newValue; - }); + return newValue; + }); } }, [ setDoorData ]); @@ -222,13 +222,13 @@ export const NavigatorMessageHandler: FC<{}> = props => if(!parser.userName || (parser.userName.length === 0)) { setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_NO_ANSWER; + newValue.state = DoorStateType.STATE_NO_ANSWER; - return newValue; - }); + return newValue; + }); } }, [ setDoorData ]); @@ -240,13 +240,13 @@ export const NavigatorMessageHandler: FC<{}> = props => { case -100002: setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_WRONG_PASSWORD; + newValue.state = DoorStateType.STATE_WRONG_PASSWORD; - return newValue; - }); + return newValue; + }); return; case 4009: NotificationUtilities.simpleAlert(LocalizeText('navigator.alert.need.to.be.vip'), NotificationAlertType.DEFAULT, null, null, LocalizeText('generic.alert.title')); @@ -285,32 +285,32 @@ export const NavigatorMessageHandler: FC<{}> = props => BatchUpdates(() => { setTopLevelContext(prevValue => + { + let newValue = prevValue; + + if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); + + if(!newValue) return null; + + if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) { - let newValue = prevValue; - - if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); - - if(!newValue) return null; - - if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) - { - for(const context of topLevelContexts) - { - if(context.code !== parser.result.code) continue; - - newValue = context; - } - } - for(const context of topLevelContexts) { if(context.code !== parser.result.code) continue; newValue = context; } + } - return newValue; - }); + for(const context of topLevelContexts) + { + if(context.code !== parser.result.code) continue; + + newValue = context; + } + + return newValue; + }); setSearchResult(parser.result); }); @@ -337,16 +337,16 @@ export const NavigatorMessageHandler: FC<{}> = props => let prevSettingsReceived = false; setNavigatorData(prevValue => - { - prevSettingsReceived = prevValue.settingsReceived; + { + prevSettingsReceived = prevValue.settingsReceived; - const newValue = { ...prevValue }; + const newValue = { ...prevValue }; - newValue.homeRoomId = parser.homeRoomId; - newValue.settingsReceived = true; + newValue.homeRoomId = parser.homeRoomId; + newValue.settingsReceived = true; - return newValue; - }); + return newValue; + }); if(prevSettingsReceived) { diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index fa2740b6..2ed72805 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -229,13 +229,13 @@ export const NavigatorView: FC<{}> = props => setIsVisible(false) } /> { topLevelContexts && (topLevelContexts.length > 0) && topLevelContexts.map((context, index) => - { - return ( - sendSearch('', context.code) }> - { LocalizeText(('navigator.toplevelview.' + context.code)) } - - ); - }) } + { + return ( + sendSearch('', context.code) }> + { LocalizeText(('navigator.toplevelview.' + context.code)) } + + ); + }) } setCreatorOpen(true) }> diff --git a/src/components/navigator/views/NavigatorDoorStateView.tsx b/src/components/navigator/views/NavigatorDoorStateView.tsx index 26324a61..d9b4228e 100644 --- a/src/components/navigator/views/NavigatorDoorStateView.tsx +++ b/src/components/navigator/views/NavigatorDoorStateView.tsx @@ -26,13 +26,13 @@ export const NavigatorDoorStateView: FC<{}> = props => CreateRoomSession(doorData.roomInfo.roomId); setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_PENDING_SERVER; + newValue.state = DoorStateType.STATE_PENDING_SERVER; - return newValue; - }); + return newValue; + }); } const tryEntering = () => @@ -42,13 +42,13 @@ export const NavigatorDoorStateView: FC<{}> = props => CreateRoomSession(doorData.roomInfo.roomId, password); setDoorData(prevValue => - { - const newValue = { ...prevValue }; + { + const newValue = { ...prevValue }; - newValue.state = DoorStateType.STATE_PENDING_SERVER; + newValue.state = DoorStateType.STATE_PENDING_SERVER; - return newValue; - }); + return newValue; + }); } useEffect(() => diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx index 77e6ada1..7238ed2d 100644 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -68,18 +68,18 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { LocalizeText('navigator.category') } { LocalizeText('navigator.maxvisitors') } @@ -94,15 +94,15 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { RoomModels.map((model, index )=> - { - return ( selectModel(model, index) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetClubMemberLevel() < model.clubLevel) }> - - - - { model.tileSize } { LocalizeText('navigator.createroom.tilesize') } - { model.clubLevel > HabboClubLevelEnum.NO_CLUB && } - ); - }) + { + return ( selectModel(model, index) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetClubMemberLevel() < model.clubLevel) }> + + + + { model.tileSize } { LocalizeText('navigator.createroom.tilesize') } + { model.clubLevel > HabboClubLevelEnum.NO_CLUB && } + ); + }) } diff --git a/src/components/navigator/views/NavigatorRoomInfoView.tsx b/src/components/navigator/views/NavigatorRoomInfoView.tsx index 02e9b9f2..3526855a 100644 --- a/src/components/navigator/views/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/NavigatorRoomInfoView.tsx @@ -70,7 +70,7 @@ export const NavigatorRoomInfoView: FC = props => case 'toggle_mute': setIsRoomMuted(value => !value); SendMessageComposer(new RoomMuteComposer()); - return; + return; case 'open_floorplan_editor': DispatchUiEvent(new FloorplanEditorEvent(FloorplanEditorEvent.TOGGLE_FLOORPLAN_EDITOR)); return; @@ -126,9 +126,9 @@ export const NavigatorRoomInfoView: FC = props => { (navigatorData.enteredGuestRoom.tags.length > 0) && { navigatorData.enteredGuestRoom.tags.map(tag => - { - return processAction('navigator_search_tag', tag) }>#{ tag } - }) } + { + return processAction('navigator_search_tag', tag) }>#{ tag } + }) } } @@ -142,20 +142,20 @@ export const NavigatorRoomInfoView: FC = props => processAction('open_group_info') }> - { LocalizeText('navigator.guildbase', ['groupName'], [navigatorData.enteredGuestRoom.groupName]) } + { LocalizeText('navigator.guildbase', [ 'groupName' ], [ navigatorData.enteredGuestRoom.groupName ]) } } - - { hasPermission('staff_pick') && + + { hasPermission('staff_pick') && } - - { hasPermission('settings') && + + { hasPermission('settings') && <> } - - } + + }
    diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx index a5f4037c..3f06ab4c 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx @@ -30,15 +30,15 @@ export const NavigatorRoomSettingsModTabView: FC { setBannedUsers(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - const index = newValue.findIndex(value => (value.userId === userId)); + const index = newValue.findIndex(value => (value.userId === userId)); - if(index >= 0) newValue.splice(index, 1); + if(index >= 0) newValue.splice(index, 1); - return newValue; - }) + return newValue; + }) SendMessageComposer(new RoomUnbanUserComposer(userId, roomData.roomId)); @@ -57,14 +57,14 @@ export const NavigatorRoomSettingsModTabView: FC { bannedUsers && (bannedUsers.length > 0) && bannedUsers.map((user, index) => - { - return ( - - - setSelectedUserId(user.userId) }> { user.userName } - - ); - }) } + { + return ( + + + setSelectedUserId(user.userId) }> { user.userName } + + ); + }) } } - + { (!item.imageUrl || (item.imageUrl && imageFailed)) && <> diff --git a/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx b/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx index 0e1dabfb..db41e8cf 100644 --- a/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx +++ b/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx @@ -12,26 +12,26 @@ export const NotificationSeachAlertView: FC = const { item = null, title = ((props.item && props.item.title) || ''), close = null, ...rest } = props; const [ searchValue, setSearchValue ] = useState(''); - const [ results, setResults] = useState([]); + const [ results, setResults ] = useState([]); const visitUrl = useCallback(() => { NotificationUtilities.openUrl(item.clickUrl); close(); - }, [item, close]); + }, [ item, close ]); useEffect(() => { setResults(JSON.parse(item.messages[0])); - }, [item]) + }, [ item ]) const updateSearchValue = useCallback((value: string) => { let res = JSON.parse(item.messages[0]); setResults(res.filter((val: string) => val.includes(value))); setSearchValue(value); - },[item]) + },[ item ]) const isAction = (item.clickUrl && item.clickUrl.startsWith('event:')); diff --git a/src/components/purse/PurseView.tsx b/src/components/purse/PurseView.tsx index afe67380..eef8db1e 100644 --- a/src/components/purse/PurseView.tsx +++ b/src/components/purse/PurseView.tsx @@ -71,15 +71,15 @@ export const PurseView: FC<{}> = props => const parser = event.getParser(); setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); + { + const newValue = Purse.from(prevValue as Purse); - newValue.credits = parseFloat(parser.credits); + newValue.credits = parseFloat(parser.credits); - if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); + if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(UserCreditsEvent, onUserCreditsEvent); @@ -89,13 +89,13 @@ export const PurseView: FC<{}> = props => const parser = event.getParser(); setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); + { + const newValue = Purse.from(prevValue as Purse); - newValue.activityPoints = parser.currencies; + newValue.activityPoints = parser.currencies; - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(UserCurrencyEvent, onUserCurrencyEvent); @@ -105,17 +105,17 @@ export const PurseView: FC<{}> = props => const parser = event.getParser(); setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); + { + const newValue = Purse.from(prevValue as Purse); - newValue.activityPoints = new Map(newValue.activityPoints); + newValue.activityPoints = new Map(newValue.activityPoints); - newValue.activityPoints.set(parser.type, parser.amount); + newValue.activityPoints.set(parser.type, parser.amount); - if(parser.type === 0) PlaySound(SoundNames.DUCKETS) + if(parser.type === 0) PlaySound(SoundNames.DUCKETS) - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(ActivityPointNotificationMessageEvent, onActivityPointNotificationMessageEvent); @@ -128,20 +128,20 @@ export const PurseView: FC<{}> = props => if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); + { + const newValue = Purse.from(prevValue as Purse); - newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); - newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); - newValue.isVip = parser.isVip; - newValue.pastClubDays = parser.pastClubDays; - newValue.pastVipDays = parser.pastVipDays; - newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); - newValue.minutesUntilExpiration = parser.minutesUntilExpiration; - newValue.minutesSinceLastModified = parser.minutesSinceLastModified; + newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); + newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); + newValue.isVip = parser.isVip; + newValue.pastClubDays = parser.pastClubDays; + newValue.pastVipDays = parser.pastVipDays; + newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); + newValue.minutesUntilExpiration = parser.minutesUntilExpiration; + newValue.minutesSinceLastModified = parser.minutesSinceLastModified; - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx index 98a04354..4cfc01c4 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx @@ -107,7 +107,7 @@ export const AvatarInfoWidgetAvatarView: FC = p messageType = RoomWidgetUserActionMessage.WHISPER_USER; break; case 'friend': - //userData.canBeAskedAsFriend = false; + //userData.canBeAskedAsFriend = false; messageType = RoomWidgetUserActionMessage.SEND_FRIEND_REQUEST; break; case 'relationship': diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx index 228ca6cf..700289f7 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnAvatarView.tsx @@ -152,11 +152,11 @@ export const AvatarInfoWidgetOwnAvatarView: FC } processAction('expressions') }> - + { LocalizeText('infostand.link.expressions') } processAction('signs') }> - + { LocalizeText('infostand.show.signs') } { (userData.carryItem > 0) && @@ -203,12 +203,12 @@ export const AvatarInfoWidgetOwnAvatarView: FC } { GetCanUseExpression() && processAction('laugh') }> - { !HasHabboVip() && } + { !HasHabboVip() && } { LocalizeText('widget.memenu.laugh') } } { GetCanUseExpression() && processAction('blow') }> - { !HasHabboVip() && } + { !HasHabboVip() && } { LocalizeText('widget.memenu.blow') } } processAction('idle') }> diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx index cfebe133..4b7d2632 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx @@ -72,7 +72,7 @@ export const AvatarInfoWidgetOwnPetView: FC = p messageType = RoomWidgetUserActionMessage.GIVE_CARRY_ITEM_TO_PET; break; case 'train': - //this.widget._Str_23877(); + //this.widget._Str_23877(); break; case 'pick_up': messageType = RoomWidgetUserActionMessage.PICKUP_PET; @@ -95,10 +95,10 @@ export const AvatarInfoWidgetOwnPetView: FC = p case 'breed': if(mode === _Str_2906) { - // _local_7 = RoomWidgetPetCommandMessage._Str_16282; - // _local_8 = ("pet.command." + _local_7); - // _local_9 = _Str_2268.catalog.localization.getLocalization(_local_8); - // _local_4 = new RoomWidgetPetCommandMessage(RoomWidgetPetCommandMessage.RWPCM_PET_COMMAND, this._Str_594.id, ((this._Str_594.name + " ") + _local_9)); + // _local_7 = RoomWidgetPetCommandMessage._Str_16282; + // _local_8 = ("pet.command." + _local_7); + // _local_9 = _Str_2268.catalog.localization.getLocalization(_local_8); + // _local_4 = new RoomWidgetPetCommandMessage(RoomWidgetPetCommandMessage.RWPCM_PET_COMMAND, this._Str_594.id, ((this._Str_594.name + " ") + _local_9)); } else if(mode === _Str_10946) @@ -133,13 +133,13 @@ export const AvatarInfoWidgetOwnPetView: FC = p BatchUpdates(() => { setMode(prevValue => - { - if(petData.petType === PetType.MONSTERPLANT) return _Str_10946; - else if(petData.saddle && !petData.rider) return _Str_5818; - else if(petData.rider) return _Str_5938; + { + if(petData.petType === PetType.MONSTERPLANT) return _Str_10946; + else if(petData.saddle && !petData.rider) return _Str_5818; + else if(petData.rider) return _Str_5938; - return _Str_2906; - }); + return _Str_2906; + }); setRespectsLeft(petData.respectsPetLeft); }); diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx index 5f09818f..3ea427f7 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx @@ -100,13 +100,13 @@ export const AvatarInfoWidgetPetView: FC = props = BatchUpdates(() => { setMode(prevValue => - { - if(petData.petType === PetType.MONSTERPLANT) return _Str_13388; - else if(petData.saddle && !petData.rider) return _Str_5818; - else if(petData.rider) return _Str_5938; + { + if(petData.petType === PetType.MONSTERPLANT) return _Str_13388; + else if(petData.saddle && !petData.rider) return _Str_5818; + else if(petData.rider) return _Str_5938; - return _Str_2906; - }); + return _Str_2906; + }); setRespectsLeft(petData.respectsPetLeft); }); diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx index a5f4652b..93158743 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx @@ -30,26 +30,26 @@ export const AvatarInfoWidgetView: FC<{}> = props => const removeNameBubble = useCallback((index: number) => { setNameBubbles(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.splice(index, 1); + newValue.splice(index, 1); - return newValue; - }); + return newValue; + }); }, []); const removeProductBubble = useCallback((index: number) => { setProductBubbles(prevValue => - { - const newValue = [ ...prevValue ]; - const item = newValue.splice(index, 1)[0]; + { + const newValue = [ ...prevValue ]; + const item = newValue.splice(index, 1)[0]; - if(confirmingProduct === item) setConfirmingProduct(null); + if(confirmingProduct === item) setConfirmingProduct(null); - return newValue; - }); + return newValue; + }); }, [ confirmingProduct ]); const clearProductBubbles = useCallback(() => @@ -101,21 +101,21 @@ export const AvatarInfoWidgetView: FC<{}> = props => if(event.category === RoomObjectCategory.UNIT) { const nameBubbleIndex = nameBubbles.findIndex(bubble => - { - return (bubble.roomIndex === event.id); - }); + { + return (bubble.roomIndex === event.id); + }); if(nameBubbleIndex > -1) removeNameBubble(nameBubbleIndex); if(productBubbles.length) { setProductBubbles(prevValue => + { + return prevValue.filter(bubble => { - return prevValue.filter(bubble => - { - return (bubble.id !== event.id); - }); + return (bubble.id !== event.id); }); + }); } } @@ -124,12 +124,12 @@ export const AvatarInfoWidgetView: FC<{}> = props => if(productBubbles.length) { setProductBubbles(prevValue => + { + return prevValue.filter(bubble => { - return prevValue.filter(bubble => - { - return (bubble.requestRoomObjectId !== event.id); - }); + return (bubble.requestRoomObjectId !== event.id); }); + }); } } @@ -236,20 +236,20 @@ export const AvatarInfoWidgetView: FC<{}> = props => { setConfirmingProduct(null); setProductBubbles(prevValue => + { + const newBubbles = [ ...prevValue ]; + + for(const item of event.items) { - const newBubbles = [ ...prevValue ]; + const index = newBubbles.findIndex(bubble => (bubble.id === item.id)); - for(const item of event.items) - { - const index = newBubbles.findIndex(bubble => (bubble.id === item.id)); + if(index > -1) newBubbles.splice(index, 1); - if(index > -1) newBubbles.splice(index, 1); + newBubbles.push(item); + } - newBubbles.push(item); - } - - return newBubbles; - }); + return newBubbles; + }); }, []); UseEventDispatcherHook(RoomWidgetUseProductBubbleEvent.USE_PRODUCT_BUBBLES, eventDispatcher, onRoomWidgetUseProductBubbleEvent); @@ -293,9 +293,9 @@ export const AvatarInfoWidgetView: FC<{}> = props => if(name) { const nameBubbleIndex = nameBubbles.findIndex(bubble => - { - return (bubble.roomIndex === name.roomIndex); - }); + { + return (bubble.roomIndex === name.roomIndex); + }); if(nameBubbleIndex > -1) removeNameBubble(nameBubbleIndex); @@ -313,9 +313,9 @@ export const AvatarInfoWidgetView: FC<{}> = props => if(event.isSpectatorMode) return null; const nameBubbleIndex = nameBubbles.findIndex(bubble => - { - return (bubble.roomIndex === event.roomIndex); - }); + { + return (bubble.roomIndex === event.roomIndex); + }); if(nameBubbleIndex > -1) removeNameBubble(nameBubbleIndex); @@ -354,13 +354,13 @@ export const AvatarInfoWidgetView: FC<{}> = props => <> { currentView } { (nameBubbles.length > 0) && nameBubbles.map((name, index) => - { - return removeNameBubble(index) } />; - }) } + { + return removeNameBubble(index) } />; + }) } { (productBubbles.length > 0) && productBubbles.map((item, index) => - { - return removeProductBubble(index) } />; - }) } + { + return removeProductBubble(index) } />; + }) } { rentableBotChatEvent && setRentableBotChatEvent(null)}/> } { confirmingProduct && setConfirmingProduct(null) } /> } diff --git a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx index 8e7a4b43..1e3f6717 100644 --- a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx @@ -32,11 +32,11 @@ export const ChatInputStyleSelectorView: FC = p let visible = false; setSelectorVisible(prevValue => - { - visible = !prevValue; + { + visible = !prevValue; - return visible; - }); + return visible; + }); if(visible) setTarget((event.target as (EventTarget & HTMLElement))); }) @@ -57,15 +57,15 @@ export const ChatInputStyleSelectorView: FC = p { chatStyleIds && (chatStyleIds.length > 0) && chatStyleIds.map((styleId) => - { - return ( - selectStyle(styleId) }> - -   - - - ); - }) } + { + return ( + selectStyle(styleId) }> + +   + + + ); + }) } diff --git a/src/components/room/widgets/chat-input/ChatInputView.tsx b/src/components/room/widgets/chat-input/ChatInputView.tsx index f21fdc51..a6e42296 100644 --- a/src/components/room/widgets/chat-input/ChatInputView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputView.tsx @@ -64,11 +64,11 @@ export const ChatInputView: FC<{}> = props => const checkSpecialKeywordForInput = useCallback(() => { setChatValue(prevValue => - { - if((prevValue !== chatModeIdWhisper) || !selectedUsername.length) return prevValue; + { + if((prevValue !== chatModeIdWhisper) || !selectedUsername.length) return prevValue; - return (`${ prevValue } ${ selectedUsername }`); - }); + return (`${ prevValue } ${ selectedUsername }`); + }); }, [ selectedUsername, chatModeIdWhisper ]); const sendChat = useCallback((text: string, chatType: number, recipientName: string = '', styleId: number = 0) => @@ -324,11 +324,11 @@ export const ChatInputView: FC<{}> = props => const interval = setInterval(() => { setFloodBlockedSeconds(prevValue => - { - seconds = ((prevValue || 0) - 1); + { + seconds = ((prevValue || 0) - 1); - return seconds; - }); + return seconds; + }); if(seconds < 0) { @@ -360,14 +360,14 @@ export const ChatInputView: FC<{}> = props => return ( createPortal( -
    -
    - { !floodBlocked && +
    +
    + { !floodBlocked && updateChatInput(event.target.value) } onMouseDown={ event => setInputFocus() } /> } - { floodBlocked && + { floodBlocked && { LocalizeText('chat.input.alert.flood', [ 'time' ], [ floodBlockedSeconds.toString() ]) } } -
    - -
    , document.getElementById('toolbar-chat-input-container')) +
    + +
    , document.getElementById('toolbar-chat-input-container')) ); } diff --git a/src/components/room/widgets/chat/ChatWidgetView.tsx b/src/components/room/widgets/chat/ChatWidgetView.tsx index d552449c..7da4c033 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetView.tsx @@ -26,39 +26,39 @@ export const ChatWidgetView: FC<{}> = props => const removeHiddenChats = useCallback(() => { setChatMessages(prevValue => + { + if(prevValue) { - if(prevValue) - { - const newMessages = prevValue.filter(chat => ((chat.top > (-(chat.height) * 2)))); + const newMessages = prevValue.filter(chat => ((chat.top > (-(chat.height) * 2)))); - if(newMessages.length !== prevValue.length) return newMessages; - } + if(newMessages.length !== prevValue.length) return newMessages; + } - return prevValue; - }) + return prevValue; + }) }, []); const moveAllChatsUp = useCallback((amount: number) => { setChatMessages(prevValue => + { + if(prevValue) { - if(prevValue) + prevValue.forEach(chat => { - prevValue.forEach(chat => - { - if(chat.skipMovement) - { - chat.skipMovement = false; + if(chat.skipMovement) + { + chat.skipMovement = false; - return; - } + return; + } - chat.top -= amount; - }); - } + chat.top -= amount; + }); + } - return prevValue; - }); + return prevValue; + }); removeHiddenChats(); }, [ removeHiddenChats ]); diff --git a/src/components/room/widgets/choosers/ChooserWidgetView.tsx b/src/components/room/widgets/choosers/ChooserWidgetView.tsx index 210ea2f7..9b5e56d2 100644 --- a/src/components/room/widgets/choosers/ChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/ChooserWidgetView.tsx @@ -36,7 +36,7 @@ export const ChooserWidgetView: FC = props => setSelectedItem(item); widgetHandler.processWidgetMessage(new RoomWidgetRoomObjectMessage(RoomWidgetRoomObjectMessage.SELECT_OBJECT, item.id, item.category)); - }, [ widgetHandler, setSelectedItem]); + }, [ widgetHandler, setSelectedItem ]); const rowRenderer: ListRowRenderer = (props: ListRowProps) => { @@ -57,14 +57,14 @@ export const ChooserWidgetView: FC = props => { ({ width, height }) => - { - return () - } } + { + return () + } } diff --git a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx index 820b5c2f..3cc39885 100644 --- a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx @@ -17,11 +17,11 @@ export const FurniChooserWidgetView: FC<{}> = props => if(!isVisible) return; setRefreshTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); + { + if(prevValue) clearTimeout(prevValue); - return setTimeout(() => widgetHandler.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.FURNI_CHOOSER)), 100); - }); + return setTimeout(() => widgetHandler.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.FURNI_CHOOSER)), 100); + }); }, [ isVisible, widgetHandler ]); const onRoomWidgetChooserContentEvent = useCallback((event: RoomWidgetChooserContentEvent) => diff --git a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx index 6f8641b8..289e2caf 100644 --- a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx @@ -16,11 +16,11 @@ export const UserChooserWidgetView: FC<{}> = props => if(!isVisible) return; setRefreshTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); + { + if(prevValue) clearTimeout(prevValue); - return setTimeout(() => widgetHandler.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.USER_CHOOSER)), 100); - }) + return setTimeout(() => widgetHandler.processWidgetMessage(new RoomWidgetRequestWidgetMessage(RoomWidgetRequestWidgetMessage.USER_CHOOSER)), 100); + }) }, [ isVisible, widgetHandler ]); const onRoomWidgetChooserContentEvent = useCallback((event: RoomWidgetChooserContentEvent) => diff --git a/src/components/room/widgets/context-menu/ContextMenuView.tsx b/src/components/room/widgets/context-menu/ContextMenuView.tsx index 3583d521..c20ba1ff 100644 --- a/src/components/room/widgets/context-menu/ContextMenuView.tsx +++ b/src/components/room/widgets/context-menu/ContextMenuView.tsx @@ -55,11 +55,11 @@ export const ContextMenuView: FC = props => if(isFading) { setFadeTime(prevValue => - { - newFadeTime += prevValue; + { + newFadeTime += prevValue; - return newFadeTime; - }); + return newFadeTime; + }); newOpacity = ((1 - (newFadeTime / fadeLength)) * 1); diff --git a/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx b/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx index 5331738b..48a9b096 100644 --- a/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx +++ b/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx @@ -75,23 +75,23 @@ export const DoorbellWidgetView: FC<{}> = props =>
    { users && (users.length > 0) && users.map(userName => - { - return ( - - { userName } - - - - - - - - ); - }) } + { + return ( + + { userName } + + + + + + + + ); + }) } diff --git a/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx b/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx index 996af565..4d252f53 100644 --- a/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx +++ b/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx @@ -16,13 +16,13 @@ export const FriendRequestWidgetView: FC<{}> = props => if(index >= 0) return; setFriendRequests(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.push({ requestId, userId, userName }); + newValue.push({ requestId, userId, userName }); - return newValue; - }); + return newValue; + }); }, [ friendRequests ]); const hideFriendRequest = useCallback((requestId: number) => @@ -32,13 +32,13 @@ export const FriendRequestWidgetView: FC<{}> = props => if(index === -1) return; setFriendRequests(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.splice(index, 1); + newValue.splice(index, 1); - return newValue; - }); + return newValue; + }); }, [ friendRequests ]); const onRoomWidgetUpdateFriendRequestEvent = useCallback((event: RoomWidgetUpdateFriendRequestEvent) => @@ -62,9 +62,9 @@ export const FriendRequestWidgetView: FC<{}> = props => return ( <> { friendRequests.map((request, index) => - { - return hideFriendRequest(request.userId) } /> - }) } + { + return hideFriendRequest(request.userId) } /> + }) } ); } diff --git a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx b/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx index 079fc733..22a15b8a 100644 --- a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx +++ b/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx @@ -39,11 +39,11 @@ export const FurnitureBadgeDisplayView: FC<{}> = props => const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; + { + if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - return null; - }); + return null; + }); return; } } diff --git a/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts b/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts index 3e8009af..1a2759f6 100644 --- a/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts +++ b/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts @@ -4,5 +4,6 @@ export class DimmerFurnitureWidgetPresetItem public id: number = 0, public type: number = 0, public color: number = 0, - public light: number = 0) {} + public light: number = 0) + {} } diff --git a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx b/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx index 4b1b4182..e02de668 100644 --- a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx +++ b/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx @@ -8,8 +8,8 @@ import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { DimmerFurnitureWidgetPresetItem } from './DimmerFurnitureWidgetPresetItem'; -const AVAILABLE_COLORS: number[] = [7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0]; -const HTML_COLORS: string[] = ['#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000']; +const AVAILABLE_COLORS: number[] = [ 7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0 ]; +const HTML_COLORS: string[] = [ '#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000' ]; const MIN_BRIGHTNESS: number = 76; const MAX_BRIGHTNESS: number = 255; @@ -117,13 +117,13 @@ export const FurnitureDimmerView: FC<{}> = props => if(!preset || ((selectedEffectId === preset.type) && (selectedColor === preset.color) && (selectedBrightness === preset.light))) return; setPresets(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue[selectedPresetIndex] = new DimmerFurnitureWidgetPresetItem(preset.id, selectedEffectId, selectedColor, selectedBrightness); + newValue[selectedPresetIndex] = new DimmerFurnitureWidgetPresetItem(preset.id, selectedEffectId, selectedColor, selectedBrightness); - return newValue; - }); + return newValue; + }); widgetHandler.processWidgetMessage(new RoomWidgetDimmerSavePresetMessage(preset.id, selectedEffectId, selectedColor, selectedBrightness, true)); }, [ widgetHandler, dimmerState, selectedPresetId, presets, selectedEffectId, selectedColor, selectedBrightness ]); @@ -167,11 +167,11 @@ export const FurnitureDimmerView: FC<{}> = props => { !isFreeColorMode && { AVAILABLE_COLORS.map((color, index) => - { - return ( - setSelectedColor(color) } style={{ backgroundColor: HTML_COLORS[index] }} /> - ); - }) } + { + return ( + setSelectedColor(color) } style={{ backgroundColor: HTML_COLORS[index] }} /> + ); + }) } } diff --git a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts b/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts index 7a58ecdc..da7e349e 100644 --- a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts +++ b/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts @@ -6,5 +6,6 @@ export class FurnitureEngravingLockData public type: number = 0, public usernames: string[] = [], public figures: string[] = [], - public date: string = null) {} + public date: string = null) + {} } diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx index 59406bcb..d0f99869 100644 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx +++ b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx @@ -42,11 +42,11 @@ export const FurnitureFriendFurniView: FC<{}> = props => const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); setEngravingLockData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; + { + if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - return null; - }); + return null; + }); return; } } diff --git a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx index 638f50fb..646b12bd 100644 --- a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx +++ b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx @@ -8,8 +8,8 @@ import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView' import { ContextMenuListView } from '../../context-menu/ContextMenuListView'; import { ObjectLocationView } from '../../object-location/ObjectLocationView'; -const SCORE_TYPES = ['perteam', 'mostwins', 'classic']; -const CLEAR_TYPES = ['alltime', 'daily', 'weekly', 'monthly']; +const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; +const CLEAR_TYPES = [ 'alltime', 'daily', 'weekly', 'monthly' ]; export const FurnitureHighScoreView: FC<{}> = props => { @@ -31,26 +31,26 @@ export const FurnitureHighScoreView: FC<{}> = props => stuffData.initializeFromRoomObjectModel(object.model); setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); + { + const newValue = new Map(prevValue); - newValue.set(object.id, stuffData); + newValue.set(object.id, stuffData); - return newValue; - }); + return newValue; + }); return; } case RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY: if(event.roomId !== roomSession.roomId) return; setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); + { + const newValue = new Map(prevValue); - newValue.delete(event.objectId); + newValue.delete(event.objectId); - return newValue; - }); + return newValue; + }); return; } }, [ roomSession ]); @@ -63,45 +63,45 @@ export const FurnitureHighScoreView: FC<{}> = props => return ( <> { Array.from(stuffDatas.entries()).map(([ objectId, stuffData ], index) => - { - return ( - - - - { LocalizeText('high.score.display.caption', [ 'scoretype', 'cleartype' ], [ LocalizeText(`high.score.display.scoretype.${ SCORE_TYPES[stuffData.scoreType] }`), LocalizeText(`high.score.display.cleartype.${ CLEAR_TYPES[stuffData.clearType] }`)]) } - - - - - - { LocalizeText('high.score.display.users.header') } - - - { LocalizeText('high.score.display.score.header') } - - -
    -
    - - { stuffData.entries.map((entry, index) => - { - return ( - - - { entry.users.join(', ') } - - - { entry.score } - - - ); - })} - -
    -
    -
    - ); - }) } + { + return ( + + + + { LocalizeText('high.score.display.caption', [ 'scoretype', 'cleartype' ], [ LocalizeText(`high.score.display.scoretype.${ SCORE_TYPES[stuffData.scoreType] }`), LocalizeText(`high.score.display.cleartype.${ CLEAR_TYPES[stuffData.clearType] }`) ]) } + + + + + + { LocalizeText('high.score.display.users.header') } + + + { LocalizeText('high.score.display.score.header') } + + +
    +
    + + { stuffData.entries.map((entry, index) => + { + return ( + + + { entry.users.join(', ') } + + + { entry.score } + + + ); + })} + +
    +
    +
    + ); + }) } ); } diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts index 10928618..1cf1160d 100644 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts +++ b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts @@ -7,5 +7,6 @@ export class FurnitureMannequinData public figure: string, public gender: string, public clubLevel: number, - public renderedFigure: string = null) {} + public renderedFigure: string = null) + {} } diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx index ec83fe99..7d6c983d 100644 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx +++ b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx @@ -16,7 +16,7 @@ const ACTION_SET_NAME: number = 1; const ACTION_WEAR: number = 2; const ACTION_SAVE: number = 3; -const MANNEQUIN_FIGURE = ['hd', 99999, [ 99998 ]]; +const MANNEQUIN_FIGURE = [ 'hd', 99999, [ 99998 ] ]; const MANNEQUIN_CLOTHING_PART_TYPES = [ AvatarFigurePartType.CHEST_ACCESSORY, AvatarFigurePartType.COAT_CHEST, diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts index dde5d714..7ab1b184 100644 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts +++ b/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts @@ -6,5 +6,6 @@ export class FurnitureStickieData public color: string, public text: string, public canModify: boolean = false, - public isEditing: boolean = false) {} + public isEditing: boolean = false) + {} } diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts index ed953c87..2894294d 100644 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts +++ b/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts @@ -1,4 +1,4 @@ -export const STICKIE_COLORS = ['9CCEFF','FF9CFF', '9CFF9C','FFFF33']; +export const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; export const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; export function getStickieColorName(color: string): string diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx index 4d591075..50c0ff66 100644 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx +++ b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx @@ -47,11 +47,11 @@ export const FurnitureStickieView: FC<{}> = props => const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); setStickieData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; + { + if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - return null; - }); + return null; + }); return; } } @@ -69,41 +69,41 @@ export const FurnitureStickieView: FC<{}> = props => return; case 'trash': setStickieData(prevState => - { - if(!prevState) return null; + { + if(!prevState) return null; - GetRoomEngine().deleteRoomObject(prevState.objectId, prevState.category); + GetRoomEngine().deleteRoomObject(prevState.objectId, prevState.category); - return null; - }); + return null; + }); return; case 'changeColor': setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, value, prevState.text, prevState.canModify); + { + const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, value, prevState.text, prevState.canModify); - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); + GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - return newStickieData; - }); + return newStickieData; + }); return; case 'changeText': setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, prevState.color, value, prevState.canModify); + { + const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, prevState.color, value, prevState.canModify); - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); + GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - return newStickieData; - }); + return newStickieData; + }); return; case 'editMode': setStickieData(prevValue => - { - if(!prevValue.canModify) return prevValue; + { + if(!prevValue.canModify) return prevValue; - return new FurnitureStickieData(prevValue.objectId, prevValue.category, prevValue.color, prevValue.text, prevValue.canModify, true); - }); + return new FurnitureStickieData(prevValue.objectId, prevValue.category, prevValue.color, prevValue.text, prevValue.canModify, true); + }); return; } }, []); @@ -119,9 +119,9 @@ export const FurnitureStickieView: FC<{}> = props => <>
    processAction('trash') }>
    { STICKIE_COLORS.map(color => - { - return
    processAction('changeColor', color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> - })} + { + return
    processAction('changeColor', color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> + })} }
    processAction('close') }>
    diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts b/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts index c1411c24..66b50e61 100644 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts +++ b/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts @@ -7,5 +7,6 @@ export class FurnitureTrophyData public ownerName: string, public date: string, public message: string, - public customTitle?: string) {} + public customTitle?: string) + {} } diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx index 0ad805d9..7d9749c1 100644 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx +++ b/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx @@ -43,11 +43,11 @@ export const FurnitureTrophyView: FC<{}> = props => const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; + { + if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - return null; - }); + return null; + }); return; } } diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx index 15e90b7c..aa57211a 100644 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx +++ b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx @@ -9,15 +9,15 @@ import { YoutubeVideoPlaybackStateEnum } from './utils/YoutubeVideoPlaybackState export const FurnitureYoutubeDisplayView: FC<{}> = props => { - const [objectId, setObjectId] = useState(-1); - const [videoId, setVideoId] = useState(null); - const [videoStart, setVideoStart] = useState(null); - const [videoEnd, setVideoEnd] = useState(null); - const [currentVideoState, setCurrentVideoState] = useState(-1); - const [selectedItem, setSelectedItem] = useState(null); - const [playlists, setPlaylists] = useState(null); - const [hasControl, setHasControl] = useState(false); - const [player, setPlayer] = useState(null); + const [ objectId, setObjectId ] = useState(-1); + const [ videoId, setVideoId ] = useState(null); + const [ videoStart, setVideoStart ] = useState(null); + const [ videoEnd, setVideoEnd ] = useState(null); + const [ currentVideoState, setCurrentVideoState ] = useState(-1); + const [ selectedItem, setSelectedItem ] = useState(null); + const [ playlists, setPlaylists ] = useState(null); + const [ hasControl, setHasControl ] = useState(false); + const [ player, setPlayer ] = useState(null); const { eventDispatcher = null } = useRoomContext(); const onRoomWidgetUpdateYoutubeDisplayEvent = useCallback((event: RoomWidgetUpdateYoutubeDisplayEvent) => @@ -60,7 +60,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => setVideoEnd(parser.endAtSeconds); setCurrentVideoState(parser.state); }); - }, [objectId]); + }, [ objectId ]); const onPlaylists = useCallback((event: YoutubeDisplayPlaylistsEvent) => { @@ -79,7 +79,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => setVideoEnd(null); setVideoStart(null); }); - }, [objectId]); + }, [ objectId ]); const onControlVideo = useCallback((event: YoutubeControlVideoMessageEvent) => { @@ -102,7 +102,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => player.pauseVideo(); break; } - }, [objectId, player]); + }, [ objectId, player ]); UseMessageEventHook(YoutubeDisplayVideoMessageEvent, onVideo); UseMessageEventHook(YoutubeDisplayPlaylistsEvent, onPlaylists); @@ -140,7 +140,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, action)); setSelectedItem(action); } - }, [hasControl, objectId, selectedItem, videoId]); + }, [ hasControl, objectId, selectedItem, videoId ]); const onReady = useCallback((event: any) => { @@ -158,7 +158,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => case 1: if(currentVideoState === 2) { - //event.target.pauseVideo(); + //event.target.pauseVideo(); } if(currentVideoState !== 1) { @@ -172,7 +172,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => } } } - }, [currentVideoState, objectId, processAction]); + }, [ currentVideoState, objectId, processAction ]); const getYoutubeOpts = useMemo( () => { @@ -204,7 +204,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => end: videoEnd } } - }, [videoEnd, videoStart]); + }, [ videoEnd, videoStart ]); if((objectId === -1)) return null; diff --git a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx index fc7f6623..48d4f979 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx @@ -329,13 +329,13 @@ export const InfoStandWidgetFurniView: FC = props
    { furniKeys.map((key, index) => - { - return ( - - { key } - onFurniSettingChange(index, event.target.value) }/> - ); - }) } + { + return ( + + { key } + onFurniSettingChange(index, event.target.value) }/> + ); + }) } } } @@ -344,13 +344,13 @@ export const InfoStandWidgetFurniView: FC = props
    { customKeys.map((key, index) => - { - return ( - - { key } - onCustomVariableChange(index, event.target.value) }/> - ); - }) } + { + return ( + + { key } + onCustomVariableChange(index, event.target.value) }/> + ); + }) } } diff --git a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx index 5a81ee53..476cac89 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx @@ -51,13 +51,13 @@ export const InfoStandWidgetUserView: FC = props = if(!userData || (userData.webID !== event.userId)) return; setUserData(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.badges = event.badges; + newValue.badges = event.badges; - return newValue; - }); + return newValue; + }); }, [ userData, setUserData ]); UseEventDispatcherHook(RoomSessionUserBadgesEvent.RSUBE_BADGES, eventDispatcher, onRoomSessionUserBadgesEvent); @@ -67,15 +67,15 @@ export const InfoStandWidgetUserView: FC = props = if(!userData || (userData.roomIndex !== event.roomIndex)) return; setUserData(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.figure = event.figure; - newValue.motto = event.customInfo; - newValue.achievementScore = event.activityPoints; + newValue.figure = event.figure; + newValue.motto = event.customInfo; + newValue.achievementScore = event.activityPoints; - return newValue; - }); + return newValue; + }); }, [ userData, setUserData ]); UseEventDispatcherHook(RoomSessionUserFigureUpdateEvent.USER_FIGURE, eventDispatcher, onRoomSessionUserFigureUpdateEvent); @@ -85,17 +85,17 @@ export const InfoStandWidgetUserView: FC = props = if(!userData || (userData.roomIndex !== event.roomIndex)) return; setUserData(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - const clearGroup = ((event.status === -1) || (event.habboGroupId <= 0)); + const clearGroup = ((event.status === -1) || (event.habboGroupId <= 0)); - newValue.groupId = clearGroup ? -1 : event.habboGroupId; - newValue.groupName = clearGroup ? null : event.habboGroupName - newValue.groupBadgeId = clearGroup ? null : GetSessionDataManager().getGroupBadge(event.habboGroupId); + newValue.groupId = clearGroup ? -1 : event.habboGroupId; + newValue.groupName = clearGroup ? null : event.habboGroupName + newValue.groupBadgeId = clearGroup ? null : GetSessionDataManager().getGroupBadge(event.habboGroupId); - return newValue; - }); + return newValue; + }); }, [ userData, setUserData ]); UseEventDispatcherHook(RoomSessionFavoriteGroupUpdateEvent.FAVOURITE_GROUP_UPDATE, eventDispatcher, onRoomSessionFavoriteGroupUpdateEvent); diff --git a/src/components/room/widgets/infostand/InfoStandWidgetView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetView.tsx index b8122eb8..014638b3 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetView.tsx @@ -40,30 +40,30 @@ export const InfoStandWidgetView: FC<{}> = props => const roomObjectEvent = (event as RoomWidgetUpdateRoomObjectEvent); setInfoStandEvent(prevValue => + { + switch(event.type) { - switch(event.type) - { - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: - if(prevValue instanceof RoomWidgetUpdateInfostandFurniEvent) - { - if(prevValue.id === roomObjectEvent.id) return null; - } - break; - case RoomWidgetUpdateRoomObjectEvent.USER_REMOVED: - if(prevValue instanceof RoomWidgetUpdateInfostandUserEvent || prevValue instanceof RoomWidgetUpdateInfostandRentableBotEvent) - { - if(prevValue.roomIndex === roomObjectEvent.id) return null; - } + case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: + if(prevValue instanceof RoomWidgetUpdateInfostandFurniEvent) + { + if(prevValue.id === roomObjectEvent.id) return null; + } + break; + case RoomWidgetUpdateRoomObjectEvent.USER_REMOVED: + if(prevValue instanceof RoomWidgetUpdateInfostandUserEvent || prevValue instanceof RoomWidgetUpdateInfostandRentableBotEvent) + { + if(prevValue.roomIndex === roomObjectEvent.id) return null; + } - else if(prevValue instanceof RoomWidgetUpdateInfostandPetEvent) - { - if(prevValue.roomIndex === roomObjectEvent.id) return null; - } - break; - } + else if(prevValue instanceof RoomWidgetUpdateInfostandPetEvent) + { + if(prevValue.roomIndex === roomObjectEvent.id) return null; + } + break; + } - return prevValue; - }); + return prevValue; + }); return; } case RoomWidgetUpdateInfostandFurniEvent.FURNI: diff --git a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx index b4220560..a9eab9e6 100644 --- a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx @@ -40,18 +40,18 @@ export const WordQuizWidgetView: FC<{}> = props => setUserAnswers(new Map()); setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); + { + if(prevValue) clearTimeout(prevValue); - if(event.duration > 0) - { - const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; + if(event.duration > 0) + { + const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; - return setTimeout(() => clearQuestion(), delay) as unknown as number; - } + return setTimeout(() => clearQuestion(), delay) as unknown as number; + } - return null; - }); + return null; + }); }); break; case RoomWidgetWordQuizUpdateEvent.QUESTION_ANSWERED: { @@ -64,18 +64,18 @@ export const WordQuizWidgetView: FC<{}> = props => setAnswerCounts(event.answerCounts); setUserAnswers(prevValue => + { + if(!prevValue.has(userData.roomIndex)) { - if(!prevValue.has(userData.roomIndex)) - { - const newValue = new Map(userAnswers); + const newValue = new Map(userAnswers); - newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); + newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); - return newValue; - } + return newValue; + } - return prevValue; - }); + return prevValue; + }); }); break; } @@ -112,7 +112,7 @@ export const WordQuizWidgetView: FC<{}> = props => const updateMessage = new RoomWidgetPollMessage(RoomWidgetPollMessage.ANSWER, pollId); updateMessage.questionId = question.id; - updateMessage.answers = [vote]; + updateMessage.answers = [ vote ]; widgetHandler.processWidgetMessage(updateMessage); @@ -167,7 +167,7 @@ export const WordQuizWidgetView: FC<{}> = props => { question && } { userAnswers && - Array.from(userAnswers.entries()).map(([key, value], index) => ) } + Array.from(userAnswers.entries()).map(([ key, value ], index) => ) } ); } diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index ba0e603c..2f10f124 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -62,11 +62,11 @@ export const UserProfileView: FC<{}> = props => BatchUpdates(() => { setUserProfile(prevValue => - { - if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); + { + if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); - return parser; - }); + return parser; + }); if(!isSameProfile) { diff --git a/src/components/user-profile/views/BadgesContainerView.tsx b/src/components/user-profile/views/BadgesContainerView.tsx index 06180be6..ca59fc21 100644 --- a/src/components/user-profile/views/BadgesContainerView.tsx +++ b/src/components/user-profile/views/BadgesContainerView.tsx @@ -12,7 +12,7 @@ export const BadgesContainerView: FC = props => return ( <> - { badges && (badges.length > 0) && badges.map((badge, index) => + { badges && (badges.length > 0) && badges.map((badge, index) => { return ( diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/views/GroupsContainerView.tsx index 56643e46..7aa49a63 100644 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ b/src/components/user-profile/views/GroupsContainerView.tsx @@ -45,14 +45,14 @@ export const GroupsContainerView: FC = props => if(groups.length > 0) { setSelectedGroupId(prevValue => + { + if(prevValue === groups[0].groupId) { - if(prevValue === groups[0].groupId) - { - SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); - } + SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); + } - return groups[0].groupId; - }); + return groups[0].groupId; + }); } }); }, [ groups ]); @@ -75,15 +75,15 @@ export const GroupsContainerView: FC = props => { groups.map((group, index) => - { - return ( - setSelectedGroupId(group.groupId) } className="p-1"> - { itsMe && + { + return ( + setSelectedGroupId(group.groupId) } className="p-1"> + { itsMe && ToggleFavoriteGroup(group) } /> } - - - ) - }) } + + + ) + }) } diff --git a/src/components/wired/WiredView.tsx b/src/components/wired/WiredView.tsx index 0bf69117..63d42d95 100644 --- a/src/components/wired/WiredView.tsx +++ b/src/components/wired/WiredView.tsx @@ -38,9 +38,9 @@ export const WiredView: FC<{}> = props => if(!IsOwnerOfFloorFurniture(trigger.id)) { NotificationUtilities.confirm(LocalizeText('wiredfurni.nonowner.change.confirm.body'), () => - { - save(trigger) - }, null, null, null, LocalizeText('wiredfurni.nonowner.change.confirm.title')); + { + save(trigger) + }, null, null, null, LocalizeText('wiredfurni.nonowner.change.confirm.title')); } else { diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index c8f3ca79..452d6593 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -71,18 +71,18 @@ export const WiredBaseView: FC = props => if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) { setFurniIds(prevValue => + { + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + if(trigger.selectedItems && trigger.selectedItems.length) { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - if(trigger.selectedItems && trigger.selectedItems.length) - { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); + return trigger.selectedItems; + } - return trigger.selectedItems; - } - - return []; - }); + return []; + }); } }); @@ -94,11 +94,11 @@ export const WiredBaseView: FC = props => setIntParams([]); setStringParam(null); setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + { + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - return []; - }); + return []; + }); }); } }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds ]); diff --git a/src/components/wired/views/WiredFurniSelectorView.tsx b/src/components/wired/views/WiredFurniSelectorView.tsx index 8847ab30..38bf5b16 100644 --- a/src/components/wired/views/WiredFurniSelectorView.tsx +++ b/src/components/wired/views/WiredFurniSelectorView.tsx @@ -16,34 +16,34 @@ export const WiredFurniSelectorView: FC<{}> = props => if(furniId <= 0) return; setFurniIds(prevValue => + { + const newFurniIds = [ ...prevValue ]; + + const index = prevValue.indexOf(furniId); + + if(index >= 0) { - const newFurniIds = [ ...prevValue ]; + newFurniIds.splice(index, 1); - const index = prevValue.indexOf(furniId); + WiredSelectionVisualizer.hide(furniId); + } - if(index >= 0) - { - newFurniIds.splice(index, 1); + else if(newFurniIds.length < trigger.maximumItemSelectionCount) + { + newFurniIds.push(furniId); - WiredSelectionVisualizer.hide(furniId); - } + WiredSelectionVisualizer.show(furniId); + } - else if(newFurniIds.length < trigger.maximumItemSelectionCount) - { - newFurniIds.push(furniId); - - WiredSelectionVisualizer.show(furniId); - } - - return newFurniIds; - }); + return newFurniIds; + }); }, [ trigger, setFurniIds ]); UseUiEvent(WiredSelectObjectEvent.SELECT_OBJECT, onWiredSelectObjectEvent); return ( - { LocalizeText('wiredfurni.pickfurnis.caption', ['count', 'limit'], [ furniIds.length.toString(), trigger.maximumItemSelectionCount.toString() ]) } + { LocalizeText('wiredfurni.pickfurnis.caption', [ 'count', 'limit' ], [ furniIds.length.toString(), trigger.maximumItemSelectionCount.toString() ]) } { LocalizeText('wiredfurni.pickfurnis.desc') } ); diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 347abe9f..89610a20 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -22,19 +22,19 @@ export const WiredActionGiveRewardView: FC<{}> = props => const addReward = useCallback(() => { - setRewards(rewards => [...rewards, { isBadge: false, itemCode: '', probability: null }]); + setRewards(rewards => [ ...rewards, { isBadge: false, itemCode: '', probability: null } ]); }, [ setRewards ]); const removeReward = useCallback((index: number) => { setRewards(prevValue => - { - const newValues = Array.from(prevValue); + { + const newValues = Array.from(prevValue); - newValues.splice(index, 1); + newValues.splice(index, 1); - return newValues; - }); + return newValues; + }); }, [ setRewards ]); const updateReward = useCallback((index: number, isBadge: boolean, itemCode: string, probability: number) => @@ -59,7 +59,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => { if(!reward.itemCode) continue; - const rewardsString = [reward.isBadge ? '0' : '1', reward.itemCode, reward.probability.toString()]; + const rewardsString = [ reward.isBadge ? '0' : '1', reward.itemCode, reward.probability.toString() ]; stringRewards.push(rewardsString.join(',')); } @@ -68,7 +68,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => BatchUpdates(() => { setStringParam(stringRewards.join(';')); - setIntParams([rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval]); + setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); }); } }, [ rewardTime, uniqueRewards, rewardsLimit, limitationInterval, rewards, setIntParams, setStringParam ]); @@ -108,7 +108,7 @@ export const WiredActionGiveRewardView: FC<{}> = props => setLimitEnabled(event.target.checked)} /> - { LocalizeText('wiredfurni.params.prizelimit', ['amount'], [limitEnabled ? rewardsLimit.toString() : '']) } + { LocalizeText('wiredfurni.params.prizelimit', [ 'amount' ], [ limitEnabled ? rewardsLimit.toString() : '' ]) } { !limitEnabled && @@ -151,22 +151,22 @@ export const WiredActionGiveRewardView: FC<{}> = props => { rewards && rewards.map((reward, index) => - { - return ( - - - updateReward(index, e.target.checked, reward.itemCode, reward.probability)} /> - Badge? - - updateReward(index, reward.isBadge, e.target.value, reward.probability) } placeholder="Item Code" /> - updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } placeholder="Probability" /> - { (index > 0) && + { + return ( + + + updateReward(index, e.target.checked, reward.itemCode, reward.probability)} /> + Badge? + + updateReward(index, reward.isBadge, e.target.value, reward.probability) } placeholder="Item Code" /> + updateReward(index, reward.isBadge, reward.itemCode, Number(e.target.value)) } placeholder="Probability" /> + { (index > 0) && } - - ) - }) } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx index 1213d357..de67a237 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx @@ -56,15 +56,15 @@ export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => { LocalizeText('wiredfurni.params.team') } - { [1, 2, 3, 4].map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText('wiredfurni.params.team.' + value) } - - ); - }) } + { [ 1, 2, 3, 4 ].map(value => + { + return ( + + setSelectedTeam(value) } /> + { LocalizeText('wiredfurni.params.team.' + value) } + + ); + }) } ); diff --git a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx b/src/components/wired/views/actions/WiredActionJoinTeamView.tsx index 197fc162..9684ec23 100644 --- a/src/components/wired/views/actions/WiredActionJoinTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionJoinTeamView.tsx @@ -20,15 +20,15 @@ export const WiredActionJoinTeamView: FC<{}> = props => { LocalizeText('wiredfurni.params.team') } - { [1, 2, 3, 4].map(team => - { - return ( - - setSelectedTeam(team) } /> - { LocalizeText(`wiredfurni.params.team.${ team }`) } - - ) - }) } + { [ 1, 2, 3, 4 ].map(team => + { + return ( + + setSelectedTeam(team) } /> + { LocalizeText(`wiredfurni.params.team.${ team }`) } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index 8f33d2a3..1446aaae 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -24,7 +24,7 @@ const directionOptions: { value: number, icon: string }[] = [ } ]; -const rotationOptions: number[] = [0, 1, 2, 3, 4, 5, 6]; +const rotationOptions: number[] = [ 0, 1, 2, 3, 4, 5, 6 ]; export const WiredActionMoveAndRotateFurniView: FC<{}> = props => { @@ -57,29 +57,29 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => { LocalizeText('wiredfurni.params.startdir') } { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - - - ) - }) } + { + return ( + + setMovement(option.value) } /> + + + + + ) + }) } { LocalizeText('wiredfurni.params.turn') } { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - { LocalizeText(`wiredfurni.params.turn.${ option }`) } - - ) - }) } + { + return ( + + setRotation(option) } /> + { LocalizeText(`wiredfurni.params.turn.${ option }`) } + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index 7dfc5dc4..89a4d253 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -65,14 +65,14 @@ export const WiredActionMoveFurniToView: FC<{}> = props => { LocalizeText('wiredfurni.params.startdir') } { directionOptions.map(value => - { - return ( - - setMovement(value.value) } /> - - - ) - }) } + { + return ( + + setMovement(value.value) } /> + + + ) + }) } diff --git a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx index 7d221fb4..32866ba8 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx @@ -36,7 +36,7 @@ const directionOptions: { value: number, icon: string }[] = [ } ]; -const rotationOptions: number[] = [0, 1, 2, 3]; +const rotationOptions: number[] = [ 0, 1, 2, 3 ]; export const WiredActionMoveFurniView: FC<{}> = props => { @@ -73,31 +73,31 @@ export const WiredActionMoveFurniView: FC<{}> = props => { directionOptions.map(option => - { - return ( - - setMovement(option.value) } /> - - - ) - }) } + { + return ( + + setMovement(option.value) } /> + + + ) + }) }
    { LocalizeText('wiredfurni.params.rotatefurni') } { rotationOptions.map(option => - { - return ( - - setRotation(option) } /> - - { [1, 2].includes(option) && } - { LocalizeText(`wiredfurni.params.rotatefurni.${ option }`) } - - - ) - }) } + { + return ( + + setRotation(option) } /> + + { [ 1, 2 ].includes(option) && } + { LocalizeText(`wiredfurni.params.rotatefurni.${ option }`) } + + + ) + }) } ); diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index 9ac241a8..325d3c0f 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 => return ( - { LocalizeText('wiredfurni.params.length.minutes', ['minutes'], [ time.toString() ]) } + { LocalizeText('wiredfurni.params.length.minutes', [ 'minutes' ], [ time.toString() ]) } = props => { LocalizeText('wiredfurni.params.handitem') } diff --git a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx index 300858c3..31bad9d9 100644 --- a/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx +++ b/src/components/wired/views/conditions/WiredConditionActorIsTeamMemberView.tsx @@ -23,14 +23,14 @@ export const WiredConditionActorIsTeamMemberView: FC<{}> = props => { LocalizeText('wiredfurni.params.team') } { teamIds.map(value => - { - return ( - - setSelectedTeam(value) } /> - { LocalizeText(`wiredfurni.params.team.${ value }`) } - - ) - }) } + { + return ( + + setSelectedTeam(value) } /> + { LocalizeText(`wiredfurni.params.team.${ value }`) } + + ) + }) } ); diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx index a3b177cd..7c95e748 100644 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx @@ -25,7 +25,7 @@ export const WiredConditionDateRangeView: FC<{}> = props => endDateMili = endDateInstance.getTime() / 1000; } - setIntParams([startDateMili, endDateMili]); + setIntParams([ startDateMili, endDateMili ]); } useEffect(() => diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx index 3bc1e424..33a450a8 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasFurniOnView.tsx @@ -20,15 +20,15 @@ export const WiredConditionFurniHasFurniOnView: FC<{}> = props => { LocalizeText('wiredfurni.params.requireall') } - { [0, 1].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText('wiredfurni.params.requireall.' + value) } - - ) - }) } + { [ 0, 1 ].map(value => + { + return ( + + setRequireAll(value) } /> + { LocalizeText('wiredfurni.params.requireall.' + value) } + + ) + }) } ); diff --git a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx index 6e4af909..9852542f 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniHasNotFurniOnView.tsx @@ -20,15 +20,15 @@ export const WiredConditionFurniHasNotFurniOnView: FC<{}> = props => { LocalizeText('wiredfurni.params.not_requireall') } - { [0, 1].map(value => - { - return ( - - setRequireAll(value) } /> - { LocalizeText(`wiredfurni.params.not_requireall.${ value }`) } - - ) - }) } + { [ 0, 1 ].map(value => + { + return ( + + setRequireAll(value) } /> + { LocalizeText(`wiredfurni.params.not_requireall.${ value }`) } + + ) + }) } ); diff --git a/src/workers/IntervalWebWorker.ts b/src/workers/IntervalWebWorker.ts index 4d5ddbc0..b2c145fe 100644 --- a/src/workers/IntervalWebWorker.ts +++ b/src/workers/IntervalWebWorker.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-anonymous-default-export export default () => { const intervals: { diff --git a/src/workers/WorkerBuilder.ts b/src/workers/WorkerBuilder.ts index be3454ab..dc2ce67e 100644 --- a/src/workers/WorkerBuilder.ts +++ b/src/workers/WorkerBuilder.ts @@ -3,7 +3,7 @@ export class WorkerBuilder extends Worker constructor(worker) { const code = worker.toString(); - const blob = new Blob([`(${code})()`]); + const blob = new Blob([ `(${code})()` ]); super(URL.createObjectURL(blob)); } diff --git a/yarn.lock b/yarn.lock index ff392b0f..87adaaae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,17 +58,17 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.7.tgz#f7c28228c83cdf2dbd1b9baa06eaf9df07f0c2f9" - integrity sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ== + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" + integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" "@babel/generator" "^7.17.7" "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.7" - "@babel/parser" "^7.17.7" + "@babel/helpers" "^7.17.8" + "@babel/parser" "^7.17.8" "@babel/template" "^7.16.7" "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" @@ -112,7 +112,7 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1", "@babel/helper-create-class-features-plugin@^7.17.6": +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== @@ -285,10 +285,10 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.7.tgz#6fc0a24280fd00026e85424bbfed4650e76d7127" - integrity sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106" + integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw== dependencies: "@babel/template" "^7.16.7" "@babel/traverse" "^7.17.3" @@ -303,10 +303,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7", "@babel/parser@^7.7.0": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.7.tgz#fc19b645a5456c8d6fdb6cecd3c66c0173902800" - integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.7.0": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240" + integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -351,11 +351,11 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493" - integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw== + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz#4f0444e896bee85d35cf714a006fc5418f87ff00" + integrity sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.1" + "@babel/helper-create-class-features-plugin" "^7.17.6" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/plugin-syntax-decorators" "^7.17.0" @@ -742,12 +742,12 @@ babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" + integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== dependencies: "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-module-transforms" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" @@ -1035,17 +1035,17 @@ "@babel/plugin-transform-typescript" "^7.16.7" "@babel/runtime-corejs3@^7.10.2": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.7.tgz#cf914f474c490ef1aa8661d47adaa0a993636e7e" - integrity sha512-TvliGJjhxis5m7xIMvlXH/xG8Oa/LK0SCUCyfKD6nLi42n5fB4WibDJ0g9trmmBB6hwpMNx+Lzbxy9/4gpMaVw== + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz#d7dd49fb812f29c61c59126da3792d8740d4e284" + integrity sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.16", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" - integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" + integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== dependencies: regenerator-runtime "^0.13.4" @@ -1144,29 +1144,44 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@fortawesome/fontawesome-common-types@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.0.tgz#5a9468da0e5c2a3ccc161882ef5ffafbd3d4882f" - integrity sha512-lFIJ5opxOKG9q88xOsuJJAdRZ+2WRldsZwUR/7MJoOMUMhF/LkHUjwWACIEPTa5Wo6uTDHvGRIX+XutdN7zYxA== +"@eslint/eslintrc@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" + integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@fortawesome/fontawesome-common-types@6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.1.tgz#7dc996042d21fc1ae850e3173b5c67b0549f9105" + integrity sha512-wVn5WJPirFTnzN6tR95abCx+ocH+3IFLXAgyavnf9hUmN0CfWoDjPT/BAWsUVwSlYYVBeCLJxaqi7ZGe4uSjBA== "@fortawesome/fontawesome-svg-core@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.0.tgz#b78a43df315a6b1568d803ee48a9f1edea0714aa" - integrity sha512-racj+/EDnMZN0jcuHePOa+9kdHHOCpCAbBvVRnEi4G4DA5SWQiT/uXJ8WcfVEbLN51vPJjhukP4o+zH0cfYplg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.1.1.tgz#3424ec6182515951816be9b11665d67efdce5b5f" + integrity sha512-NCg0w2YIp81f4V6cMGD9iomfsIj7GWrqmsa0ZsPh59G7PKiGN1KymZNxmF00ssuAlo/VZmpK6xazsGOwzKYUMg== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" + "@fortawesome/fontawesome-common-types" "6.1.1" "@fortawesome/free-solid-svg-icons@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.0.tgz#1bdc3ce6ddd2336348ba324ac4a72161725b0d95" - integrity sha512-OOr0jRHl5d41RzBS3sZh5Z3HmdPjMr43PxxKlYeLtQxFSixPf4sJFVM12/rTepB2m0rVShI0vtjHQmzOTlBaXg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.1.tgz#3369e673f8fe8be2fba30b1ec274d47490a830a6" + integrity sha512-0/5exxavOhI/D4Ovm2r3vxNojGZioPwmFrKg0ZUH69Q68uFhFPs6+dhAToh6VEQBntxPRYPuT5Cg1tpNa9JUPg== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.0" + "@fortawesome/fontawesome-common-types" "6.1.1" "@fortawesome/react-fontawesome@^0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz#06fc06cb1a721e38e5b50b4a1cb851e9b9c77d7a" - integrity sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw== + version "0.1.18" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz#dae37f718a24e14d7a99a5496c873d69af3fbd73" + integrity sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ== dependencies: prop-types "^15.8.1" @@ -1216,7 +1231,16 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1702,9 +1726,9 @@ "@babel/runtime" "^7.6.2" "@restart/hooks@^0.4.0", "@restart/hooks@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.5.tgz#e7acbea237bfc9e479970500cf87538b41a1ed02" - integrity sha512-tLGtY0aHeIfT7aPwUkvQuhIy3+q3w4iqmUzFLPlOAf/vNUacLaBt1j/S//jv/dQhenRh8jvswyMojCwmLvJw8A== + version "0.4.6" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.6.tgz#15dcf34631a618c513efc924705c7cbe349a4a0c" + integrity sha512-FzpEzy6QeLB3OpUrC9OQD/lWCluQmilLfRGa/DqbB6OmV05AEt/0Lgn3Jf6l27UIJMK0qFmNcps6p8DNLXa6Pw== dependencies: dequal "^2.0.2" @@ -1902,9 +1926,9 @@ integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2001,10 +2025,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" @@ -2022,9 +2046,9 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== "@types/node@^12.20.19": version "12.20.47" @@ -2062,9 +2086,9 @@ integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/react-dom@^17.0.9": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" - integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.14.tgz#c8f917156b652ddf807711f5becbd2ab018dea9f" + integrity sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ== dependencies: "@types/react" "*" @@ -2091,9 +2115,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^17.0.15": - version "17.0.40" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.40.tgz#dc010cee6254d5239a138083f3799a16638e6bad" - integrity sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ== + version "17.0.43" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55" + integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2171,7 +2195,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.29.1", "@typescript-eslint/eslint-plugin@^4.5.0": +"@typescript-eslint/eslint-plugin@^4.5.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== @@ -2185,6 +2209,21 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz#704eb4e75039000531255672bf1c85ee85cf1d67" + integrity sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ== + dependencies: + "@typescript-eslint/scope-manager" "5.17.0" + "@typescript-eslint/type-utils" "5.17.0" + "@typescript-eslint/utils" "5.17.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" @@ -2218,6 +2257,16 @@ "@typescript-eslint/typescript-estree" "4.33.0" debug "^4.3.1" +"@typescript-eslint/parser@^5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.17.0.tgz#7def77d5bcd8458d12d52909118cf3f0a45f89d5" + integrity sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig== + dependencies: + "@typescript-eslint/scope-manager" "5.17.0" + "@typescript-eslint/types" "5.17.0" + "@typescript-eslint/typescript-estree" "5.17.0" + debug "^4.3.2" + "@typescript-eslint/scope-manager@4.33.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" @@ -2226,6 +2275,23 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" +"@typescript-eslint/scope-manager@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz#4cea7d0e0bc0e79eb60cad431c89120987c3f952" + integrity sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w== + dependencies: + "@typescript-eslint/types" "5.17.0" + "@typescript-eslint/visitor-keys" "5.17.0" + +"@typescript-eslint/type-utils@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz#1c4549d68c89877662224aabb29fbbebf5fc9672" + integrity sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg== + dependencies: + "@typescript-eslint/utils" "5.17.0" + debug "^4.3.2" + tsutils "^3.21.0" + "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" @@ -2236,6 +2302,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/types@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.17.0.tgz#861ec9e669ffa2aa9b873dd4d28d9b1ce26d216f" + integrity sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw== + "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" @@ -2263,6 +2334,31 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz#a7cba7dfc8f9cc2ac78c18584e684507df4f2488" + integrity sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg== + dependencies: + "@typescript-eslint/types" "5.17.0" + "@typescript-eslint/visitor-keys" "5.17.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.17.0.tgz#549a9e1d491c6ccd3624bc3c1b098f5cfb45f306" + integrity sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.17.0" + "@typescript-eslint/types" "5.17.0" + "@typescript-eslint/typescript-estree" "5.17.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/visitor-keys@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" @@ -2278,6 +2374,14 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@5.17.0": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz#52daae45c61b0211b4c81b53a71841911e479128" + integrity sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA== + dependencies: + "@typescript-eslint/types" "5.17.0" + eslint-visitor-keys "^3.0.0" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2484,7 +2588,7 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0: +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== @@ -2538,9 +2642,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" - integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2659,6 +2763,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -2697,7 +2806,7 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.3, array-includes@^3.1.4: +array-includes@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== @@ -3206,7 +3315,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3486,9 +3595,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001317: - version "1.0.30001317" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz#0548fb28fd5bc259a70b8c1ffdbe598037666a1b" - integrity sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ== + version "1.0.30001323" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001323.tgz#a451ff80dec7033016843f532efda18f02eec011" + integrity sha512-e4BF2RlCVELKx8+RmklSEIVub1TWrmdhvA5kEUueummz1XyySW0DVk+3x9HyhU9MuWTa2BhqLgEuEmUwASAdCA== capture-exit@^2.0.0: version "2.0.0" @@ -4112,13 +4221,13 @@ css-select@^2.0.0: nth-check "^1.0.2" css-select@^4.1.3: - version "4.2.1" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" - integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" - css-what "^5.1.0" - domhandler "^4.3.0" + css-what "^6.0.1" + domhandler "^4.3.1" domutils "^2.8.0" nth-check "^2.0.1" @@ -4143,10 +4252,10 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -css-what@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css@^2.0.0: version "2.2.4" @@ -4311,10 +4420,10 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6. dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -4590,10 +4699,10 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" @@ -4678,9 +4787,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.84: - version "1.4.85" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.85.tgz#a3666ba42147026b9f34d4d8d4caf0740e80f751" - integrity sha512-K9AsQ41WS2bjZUFpRWfvaS4RjEcRCamEkBJN1Z1TQILBfP1H8QnJ9ti0wiLiMv0sRjX3EHKzgs9jDnmGFx2jXg== + version "1.4.103" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" + integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== elliptic@^6.5.3: version "6.5.4" @@ -4790,9 +4899,9 @@ error-stack-parser@^2.0.6: stackframe "^1.1.1" es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + version "1.19.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" + integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -4800,15 +4909,15 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.2" + has-symbols "^1.0.3" internal-slot "^1.0.3" is-callable "^1.2.4" - is-negative-zero "^2.0.1" + is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.1" is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" @@ -4825,9 +4934,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.58" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.58.tgz#5b97d94236285fb87c8ffc782cf42eb0a25d2ae0" - integrity sha512-LHO+KBBaHGwjy32ibSaMY+ZzjpC4K4I5bPoijICMBL7gXEXfrEUrzssmNP+KigbQEp1dRUnGkry/vUnxOqptLQ== + version "0.10.59" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" + integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -4918,7 +5027,7 @@ eslint-plugin-flowtype@^5.2.0: lodash "^4.17.15" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.22.1: +eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.25.4: version "2.25.4" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== @@ -4944,7 +5053,7 @@ eslint-plugin-jest@^24.1.0: dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" -eslint-plugin-jsx-a11y@^6.3.1: +eslint-plugin-jsx-a11y@^6.3.1, eslint-plugin-jsx-a11y@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== @@ -4962,12 +5071,12 @@ eslint-plugin-jsx-a11y@^6.3.1: language-tags "^1.0.5" minimatch "^3.0.4" -eslint-plugin-react-hooks@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" - integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== +eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" + integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== -eslint-plugin-react@^7.21.5: +eslint-plugin-react@^7.21.5, eslint-plugin-react@^7.29.4: version "7.29.4" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== @@ -5010,6 +5119,14 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -5034,6 +5151,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + eslint-webpack-plugin@^2.5.2: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz#3bd4ada4e539cb1f6687d2f619073dbb509361cd" @@ -5092,6 +5214,47 @@ eslint@^7.11.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" + integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== + dependencies: + "@eslint/eslintrc" "^1.2.1" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -5101,6 +5264,15 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -5751,6 +5923,13 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -5815,7 +5994,7 @@ globby@11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.3: +globby@^11.0.3, globby@^11.0.4: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5915,7 +6094,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1, has-symbols@^1.0.2: +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -6577,7 +6756,7 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-negative-zero@^2.0.1: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -6704,7 +6883,7 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-weakref@^1.0.1: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -7274,6 +7453,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -7365,11 +7551,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^4.0.0: version "4.0.0" @@ -7398,11 +7582,11 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" - integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" + integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw== dependencies: - array-includes "^3.1.3" + array-includes "^3.1.4" object.assign "^4.1.2" killable@^1.0.1: @@ -7801,12 +7985,12 @@ micromatch@^3.1.10, micromatch@^3.1.4: to-regex "^3.0.2" micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" @@ -7898,10 +8082,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass-collect@^1.0.2: version "1.0.2" @@ -7964,11 +8148,11 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" @@ -8021,9 +8205,9 @@ nan@^2.12.1, nan@^2.13.2: integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanoid@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + version "3.3.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" + integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== nanomatch@^1.2.9: version "1.2.13" @@ -8311,7 +8495,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.9.0: +object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== @@ -8735,7 +8919,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -9446,9 +9630,9 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9508,9 +9692,9 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.11" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.11.tgz#a06229f23820b4ddd46500a3e38dbca1598a8e8d" - integrity sha512-D+jFLnT0ilGfy4CVBGbC+XE68HkVpT8+CUkDrcSpgxmo4RKco2uaZ4kIoyVGEm+m8KN/+Vwgs8MtpNbQ3/ma9w== + version "8.4.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" + integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== dependencies: nanoid "^3.3.1" picocolors "^1.0.0" @@ -10110,7 +10294,7 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== @@ -10118,7 +10302,7 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -11066,17 +11250,17 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string.prototype.matchall@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" es-abstract "^1.19.1" get-intrinsic "^1.1.1" - has-symbols "^1.0.2" + has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" + regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" string.prototype.trimend@^1.0.4: @@ -11539,13 +11723,13 @@ ts-pnp@1.2.0, ts-pnp@^1.1.6: integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tsconfig-paths@^3.12.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz#4fcc48f9ccea8826c41b9ca093479de7f5018976" - integrity sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g== + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.8.1: @@ -11662,9 +11846,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.3.5: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== unbox-primitive@^1.0.1: version "1.0.1" From cf47ff8f23ff6b394fdd87bec376a86d1b585272 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 1 Apr 2022 16:12:24 -0400 Subject: [PATCH 210/331] Update renderer version --- package.json | 6 +++--- yarn.lock | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 22984611..dddc9228 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "2.0.0", "private": true, "scripts": { - "start": "cross-env BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco start", - "build": "cross-env GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco build", + "start": "cross-env SKIP_PREFLIGHT_CHECK=true BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco start", + "build": "cross-env SKIP_PREFLIGHT_CHECK=true GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco build", "build:prod": "npx browserslist@latest --update-db && yarn build", "test": "craco test", "eject": "react-scripts eject" @@ -14,7 +14,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.20", + "@nitrots/nitro-renderer": "^1.1.21", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index ff392b0f..5a9ba613 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1426,10 +1426,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.20": - version "1.1.20" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.20.tgz#13fd468028542f777d2c1c7902f2247769ffd98d" - integrity sha512-DVwM4M0Iofsgd94dVPoNmzPbt7YzVG5liupULIe+WHo2vhR8fEyq3E+cdQleXtr/MBODGXTHBrU0yL67YDpIRQ== +"@nitrots/nitro-renderer@^1.1.21": + version "1.1.21" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.21.tgz#8d527d63510fb4c3003e7d48347cdd50b67bb5b1" + integrity sha512-futoNgDy+wD1il7gEnKly/VlRdESJZrPkG9m+jDy3bswdpRZ0RAph1XYNpNzkSchpxXib2yuKMME6ePPct/l1A== dependencies: "@pixi/canvas-renderer" "^6.3.0" "@pixi/extract" "^6.3.0" From cf5c46213a77d977183ab4be690cb5759c446074 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 1 Apr 2022 16:12:46 -0400 Subject: [PATCH 211/331] More inventory changes --- .../inventory/TradingNotificationMessage.ts | 22 +- src/api/inventory/TradingNotificationType.ts | 13 +- src/components/inventory/InventoryView.tsx | 24 +- .../inventory/views/InventoryBadgeView.tsx | 8 +- .../views/InventoryFurnitureSearchView.tsx | 12 +- .../views/InventoryFurnitureView.tsx | 11 +- .../inventory/views/InventoryTradeView.tsx | 54 ++-- .../user-settings/UserSettingsView.tsx | 6 +- src/hooks/inventory/useInventoryBadges.ts | 68 ++--- src/hooks/inventory/useInventoryBots.ts | 134 +++++----- src/hooks/inventory/useInventoryFurni.ts | 241 +++++++++--------- src/hooks/inventory/useInventoryPets.ts | 42 +-- src/hooks/inventory/useInventoryTrade.ts | 143 ++++++----- .../inventory/useInventoryUnseenTracker.ts | 82 +++--- src/hooks/useSharedVisibility.ts | 26 +- 15 files changed, 447 insertions(+), 439 deletions(-) diff --git a/src/api/inventory/TradingNotificationMessage.ts b/src/api/inventory/TradingNotificationMessage.ts index 8ccbed1a..eb0ecfac 100644 --- a/src/api/inventory/TradingNotificationMessage.ts +++ b/src/api/inventory/TradingNotificationMessage.ts @@ -1,28 +1,26 @@ import { LocalizeText, NotificationUtilities } from '..'; import { TradingNotificationType } from './TradingNotificationType'; -export const TradingNotificationMessage = (type: number) => +export const TradingNotificationMessage = (type: number, otherUsername: string = '') => { switch(type) { case TradingNotificationType.ALERT_SCAM: NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.warning.other_not_offering'), null, null, null, LocalizeText('inventory.trading.notification.title')); return; - case TradingNotificationType.ALERT_OTHER_CANCELLED: - NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.info.closed'), null, null, null, LocalizeText('inventory.trading.notification.title')); - return; - case TradingNotificationType.ALERT_ALREADY_OPEN: - NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.info.already_open'), null, null, null, LocalizeText('inventory.trading.notification.title')); - return; - case TradingNotificationType.ALERT_OTHER_DISABLED: - NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.warning.others_account_disabled'), null, null, null, LocalizeText('inventory.trading.notification.title')); + case TradingNotificationType.HOTEL_TRADING_DISABLED: + case TradingNotificationType.YOU_NOT_ALLOWED: + case TradingNotificationType.THEY_NOT_ALLOWED: + case TradingNotificationType.ROOM_DISABLED: + case TradingNotificationType.YOU_OPEN: + case TradingNotificationType.THEY_OPEN: + NotificationUtilities.simpleAlert(LocalizeText(`inventory.trading.openfail.${ type }`, [ 'otherusername' ], [ otherUsername ]), null, null, null, LocalizeText('inventory.trading.openfail.title')); return; case TradingNotificationType.ERROR_WHILE_COMMIT: NotificationUtilities.simpleAlert(`${ LocalizeText('inventory.trading.notification.caption') }, ${ LocalizeText('inventory.trading.notification.commiterror.info') }`, null, null, null, LocalizeText('inventory.trading.notification.title')); return; - case TradingNotificationType.YOU_NOT_ALLOWED: - NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.warning.own_account_disabled'), null, null, null, LocalizeText('inventory.trading.notification.title')); + case TradingNotificationType.THEY_CANCELLED: + NotificationUtilities.simpleAlert(LocalizeText('inventory.trading.info.closed'), null, null, null, LocalizeText('inventory.trading.notification.title')); return; - } } diff --git a/src/api/inventory/TradingNotificationType.ts b/src/api/inventory/TradingNotificationType.ts index 9bf59a67..4aed4905 100644 --- a/src/api/inventory/TradingNotificationType.ts +++ b/src/api/inventory/TradingNotificationType.ts @@ -1,9 +1,12 @@ export class TradingNotificationType { public static ALERT_SCAM: number = 0; - public static ALERT_OTHER_CANCELLED: number = 1; - public static ALERT_ALREADY_OPEN: number = 2; - public static ALERT_OTHER_DISABLED: number = 3; - public static ERROR_WHILE_COMMIT: number = 4; - public static YOU_NOT_ALLOWED: number = 5; + public static HOTEL_TRADING_DISABLED = 1; + public static YOU_NOT_ALLOWED: number = 2; + public static THEY_NOT_ALLOWED: number = 4; + public static ROOM_DISABLED: number = 6; + public static YOU_OPEN: number = 7; + public static THEY_OPEN: number = 8; + public static ERROR_WHILE_COMMIT: number = 9; + public static THEY_CANCELLED: number = 10; } diff --git a/src/components/inventory/InventoryView.tsx b/src/components/inventory/InventoryView.tsx index b85736be..c438e7cc 100644 --- a/src/components/inventory/InventoryView.tsx +++ b/src/components/inventory/InventoryView.tsx @@ -107,11 +107,11 @@ export const InventoryView: FC<{}> = props => return () => { setRoomPreviewer(prevValue => - { - prevValue.dispose(); + { + prevValue.dispose(); - return null; - }); + return null; + }); } }, []); @@ -129,15 +129,15 @@ export const InventoryView: FC<{}> = props => <> { TABS.map((name, index) => - { - const unseenCount = getCount(UNSEEN_CATEGORIES[index]); + { + const unseenCount = getCount(UNSEEN_CATEGORIES[index]); - return ( - setCurrentTab(name) } count={ unseenCount }> - { LocalizeText(name) } - - ); - }) } + return ( + setCurrentTab(name) } count={ unseenCount }> + { LocalizeText(name) } + + ); + }) } { (currentTab === TAB_FURNITURE ) && diff --git a/src/components/inventory/views/InventoryBadgeView.tsx b/src/components/inventory/views/InventoryBadgeView.tsx index c74aed37..5b183600 100644 --- a/src/components/inventory/views/InventoryBadgeView.tsx +++ b/src/components/inventory/views/InventoryBadgeView.tsx @@ -48,11 +48,11 @@ export const InventoryBadgeView: FC<{}> = props => { badgeCodes && (badgeCodes.length > 0) && badgeCodes.map((badgeCode, index) => - { - if(activeBadgeCodes.indexOf(badgeCode) >= 0) return null; + { + if(activeBadgeCodes.indexOf(badgeCode) >= 0) return null; - return - }) } + return + }) } diff --git a/src/components/inventory/views/InventoryFurnitureSearchView.tsx b/src/components/inventory/views/InventoryFurnitureSearchView.tsx index b36e4b9e..d81d6060 100644 --- a/src/components/inventory/views/InventoryFurnitureSearchView.tsx +++ b/src/components/inventory/views/InventoryFurnitureSearchView.tsx @@ -23,14 +23,14 @@ export const InventoryFurnitureSearchView: FC const comparison = searchValue.toLocaleLowerCase(); filteredGroupItems = groupItems.filter(item => + { + if(comparison && comparison.length) { - if(comparison && comparison.length) - { - if(item.name.toLocaleLowerCase().includes(comparison)) return item; - } + if(item.name.toLocaleLowerCase().includes(comparison)) return item; + } - return null; - }); + return null; + }); } setGroupItems(filteredGroupItems); diff --git a/src/components/inventory/views/InventoryFurnitureView.tsx b/src/components/inventory/views/InventoryFurnitureView.tsx index faa52af4..8833d2fd 100644 --- a/src/components/inventory/views/InventoryFurnitureView.tsx +++ b/src/components/inventory/views/InventoryFurnitureView.tsx @@ -16,8 +16,8 @@ interface InventoryFurnitureViewProps export const InventoryFurnitureView: FC = props => { const { roomSession = null, roomPreviewer = null } = props; - const { groupItems = [], selectedItem = null, selectItem = null } = useInventoryFurni(); - const [ filteredGroupItems, setFilteredGroupItems ] = useState(groupItems); + const [ filteredGroupItems, setFilteredGroupItems ] = useState([]); + const { groupItems = [], selectedItem = null, selectItem = null, activate = null, deactivate = null } = useInventoryFurni(); const { getCount = null, resetCategory = null } = useInventoryUnseenTracker(); useEffect(() => @@ -86,6 +86,13 @@ export const InventoryFurnitureView: FC = props => } }, [ groupItems, getCount, resetCategory ]); + useEffect(() => + { + const id = activate(); + + return () => deactivate(id); + }, [ activate, deactivate ]); + if(!groupItems || !groupItems.length) return ; const InventoryFurnitureItemView: FC<{ groupItem: GroupItem }> = props => diff --git a/src/components/inventory/views/InventoryTradeView.tsx b/src/components/inventory/views/InventoryTradeView.tsx index 0614436b..a43bfbe8 100644 --- a/src/components/inventory/views/InventoryTradeView.tsx +++ b/src/components/inventory/views/InventoryTradeView.tsx @@ -127,13 +127,13 @@ export const InventoryTradeView: FC = props => const interval = setInterval(() => { setCountdownTick(prevValue => - { - const newValue = (prevValue - 1); + { + const newValue = (prevValue - 1); - if(newValue === 0) clearInterval(interval); + if(newValue === 0) clearInterval(interval); - return newValue; - }); + return newValue; + }); }, 1000); return () => clearInterval(interval); @@ -155,18 +155,18 @@ export const InventoryTradeView: FC = props => { filteredGroupItems && (filteredGroupItems.length > 0) && filteredGroupItems.map((item, index) => - { - const count = item.getUnlockedCount(); + { + const count = item.getUnlockedCount(); - return ( - (count && setGroupItem(item)) }> - { ((count > 0) && (groupItem === item)) && + return ( + (count && setGroupItem(item)) }> + { ((count > 0) && (groupItem === item)) && } - - ); - }) } + + ); + }) } { groupItem ? groupItem.name : LocalizeText('catalog_selectproduct') } @@ -182,20 +182,20 @@ export const InventoryTradeView: FC = props => { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => - { - const item = (ownUser.userItems.getWithIndex(i) || null); + { + const item = (ownUser.userItems.getWithIndex(i) || null); - if(!item) return ; + if(!item) return ; - return ( - setOwnGroupItem(item) }> - { (ownGroupItem === item) && + return ( + setOwnGroupItem(item) }> + { (ownGroupItem === item) && } - - ); - }) } + + ); + }) } { ownGroupItem ? ownGroupItem.name : LocalizeText('catalog_selectproduct') } @@ -208,13 +208,13 @@ export const InventoryTradeView: FC = props => { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => - { - const item = (otherUser.userItems.getWithIndex(i) || null); + { + const item = (otherUser.userItems.getWithIndex(i) || null); - if(!item) return ; + if(!item) return ; - return setOtherGroupItem(item) } />; - }) } + return setOtherGroupItem(item) } />; + }) } { otherGroupItem ? otherGroupItem.name : LocalizeText('catalog_selectproduct') } diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 368657c7..a9c001be 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -94,7 +94,7 @@ export const UserSettingsView: FC<{}> = props => if(doUpdate) setUserSettings(clone); DispatchMainEvent(clone) - }, [userSettings]); + }, [ userSettings ]); const saveRangeSlider = useCallback((type: string) => { @@ -104,14 +104,14 @@ export const UserSettingsView: FC<{}> = props => SendMessageComposer(new UserSettingsSoundComposer(Math.round(userSettings.volumeSystem), Math.round(userSettings.volumeFurni), Math.round(userSettings.volumeTrax))); break; } - }, [userSettings]); + }, [ userSettings ]); useEffect(() => { if(!userSettings) return; DispatchUiEvent(userSettings); - }, [userSettings]); + }, [ userSettings ]); if(!isVisible) return null; diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts index 373a520a..432ab777 100644 --- a/src/hooks/inventory/useInventoryBadges.ts +++ b/src/hooks/inventory/useInventoryBadges.ts @@ -21,30 +21,30 @@ const useInventoryBadgesState = () => const toggleBadge = (badgeCode: string) => { setActiveBadgeCodes(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.indexOf(badgeCode); + + if(index === -1) { - const newValue = [ ...prevValue ]; + if(!canWearBadges()) return prevValue; - const index = newValue.indexOf(badgeCode); + newValue.push(badgeCode); + } + else + { + newValue.splice(index, 1); + } - if(index === -1) - { - if(!canWearBadges()) return prevValue; + const composer = new SetActivatedBadgesComposer(); - newValue.push(badgeCode); - } - else - { - newValue.splice(index, 1); - } + for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null); - const composer = new SetActivatedBadgesComposer(); + SendMessageComposer(composer); - for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null); - - SendMessageComposer(composer); - - return newValue; - }); + return newValue; + }); } const selectBadge = (badgeCode: string) => @@ -89,22 +89,22 @@ const useInventoryBadgesState = () => BatchUpdates(() => { setBadgeCodes(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.push(parser.badgeCode); + newValue.push(parser.badgeCode); - return newValue; - }); + return newValue; + }); setBadgeIds(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.push(parser.badgeId); + newValue.push(parser.badgeId); - return newValue; - }) + return newValue; + }) }); }, []); @@ -115,15 +115,15 @@ const useInventoryBadgesState = () => if(!badgeCodes || !badgeCodes.length) return; setSelectedBadgeCode(prevValue => - { - let newValue = prevValue; + { + let newValue = prevValue; - if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; + if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; - if(!newValue) newValue = badgeCodes[0]; + if(!newValue) newValue = badgeCodes[0]; - return newValue; - }); + return newValue; + }); }, [ badgeCodes ]); useEffect(() => diff --git a/src/hooks/inventory/useInventoryBots.ts b/src/hooks/inventory/useInventoryBots.ts index 31e82b32..2f13947a 100644 --- a/src/hooks/inventory/useInventoryBots.ts +++ b/src/hooks/inventory/useInventoryBots.ts @@ -21,55 +21,55 @@ const useInventoryBotsState = () => const parser = event.getParser(); setBotItems(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIds = newValue.map(item => item.botData.id); + const addedDatas: BotData[] = []; + + for(const botData of parser.items.values()) ((existingIds.indexOf(botData.id) === -1) && addedDatas.push(botData)); + + for(const existingId of existingIds) { - const newValue = [ ...prevValue ]; - const existingIds = newValue.map(item => item.botData.id); - const addedDatas: BotData[] = []; + let remove = true; - for(const botData of parser.items.values()) ((existingIds.indexOf(botData.id) === -1) && addedDatas.push(botData)); - - for(const existingId of existingIds) + for(const botData of parser.items.values()) { - let remove = true; - - for(const botData of parser.items.values()) + if(botData.id === existingId) { - if(botData.id === existingId) - { - remove = false; + remove = false; - break; - } + break; } - - if(!remove) continue; - - const index = newValue.findIndex(item => (item.botData.id === existingId)); - const botItem = newValue[index]; - - if((index === -1) || !botItem) continue; - - if(getPlacingItemId() === botItem.botData.id) - { - cancelRoomObjectPlacement(); - - CreateLinkEvent('inventory/open'); - } - - newValue.splice(index, 1); } - for(const botData of addedDatas) - { - const botItem = { botData } as IBotItem; - const unseen = isUnseen(UnseenItemCategory.BOT, botData.id); + if(!remove) continue; - if(unseen) newValue.unshift(botItem); - newValue.push(botItem); + const index = newValue.findIndex(item => (item.botData.id === existingId)); + const botItem = newValue[index]; + + if((index === -1) || !botItem) continue; + + if(getPlacingItemId() === botItem.botData.id) + { + cancelRoomObjectPlacement(); + + CreateLinkEvent('inventory/open'); } - return newValue; - }); + newValue.splice(index, 1); + } + + for(const botData of addedDatas) + { + const botItem = { botData } as IBotItem; + const unseen = isUnseen(UnseenItemCategory.BOT, botData.id); + + if(unseen) newValue.unshift(botItem); + newValue.push(botItem); + } + + return newValue; + }); }, [ isUnseen ]); UseMessageEventHook(BotInventoryMessageEvent, onBotInventoryMessageEvent); @@ -79,19 +79,19 @@ const useInventoryBotsState = () => const parser = event.getParser(); setBotItems(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - const index = newValue.findIndex(item => (item.botData.id === parser.item.id)); + const index = newValue.findIndex(item => (item.botData.id === parser.item.id)); - if(index >= 0) return prevValue; + if(index >= 0) return prevValue; - const botItem = { botData: parser.item } as IBotItem; + const botItem = { botData: parser.item } as IBotItem; - newValue.push(botItem); + newValue.push(botItem); - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(BotAddedToInventoryEvent, onBotAddedToInventoryEvent); @@ -101,24 +101,24 @@ const useInventoryBotsState = () => const parser = event.getParser(); setBotItems(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.findIndex(item => (item.botData.id === parser.itemId)); + + if(index === -1) return prevValue; + + newValue.splice(index, 1); + + if(getPlacingItemId() === parser.itemId) { - const newValue = [ ...prevValue ]; + cancelRoomObjectPlacement(); - const index = newValue.findIndex(item => (item.botData.id === parser.itemId)); + CreateLinkEvent('inventory/show'); + } - if(index === -1) return prevValue; - - newValue.splice(index, 1); - - if(getPlacingItemId() === parser.itemId) - { - cancelRoomObjectPlacement(); - - CreateLinkEvent('inventory/show'); - } - - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(BotRemovedFromInventoryEvent, onBotRemovedFromInventoryEvent); @@ -128,15 +128,15 @@ const useInventoryBotsState = () => if(!botItems || !botItems.length) return; setSelectedBot(prevValue => - { - let newValue = prevValue; + { + let newValue = prevValue; - if(newValue && (botItems.indexOf(newValue) === -1)) newValue = null; + if(newValue && (botItems.indexOf(newValue) === -1)) newValue = null; - if(!newValue) newValue = botItems[0]; + if(!newValue) newValue = botItems[0]; - return newValue; - }); + return newValue; + }); }, [ botItems ]); useEffect(() => diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 427c5de5..471803aa 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -29,63 +29,63 @@ const useInventoryFurniState = () => const parser = event.getParser(); setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const item of parser.items) { - const newValue = [ ...prevValue ]; + let i = 0; + let groupItem: GroupItem = null; - for(const item of parser.items) + while(i < newValue.length) { - let i = 0; - let groupItem: GroupItem = null; + const group = newValue[i]; - while(i < newValue.length) + let j = 0; + + while(j < group.items.length) { - const group = newValue[i]; + const furniture = group.items[j]; - let j = 0; - - while(j < group.items.length) + if(furniture.id === item.itemId) { - const furniture = group.items[j]; + furniture.update(item); - if(furniture.id === item.itemId) - { - furniture.update(item); + const newFurniture = [ ...group.items ]; - const newFurniture = [ ...group.items ]; + newFurniture[j] = furniture; - newFurniture[j] = furniture; + group.items = newFurniture; - group.items = newFurniture; + groupItem = group; - groupItem = group; - - break; - } - - j++ + break; } - if(groupItem) break; - - i++; + j++ } - if(groupItem) - { - groupItem.hasUnseenItems = true; + if(groupItem) break; - newValue[i] = CloneObject(groupItem); - } - else - { - const furniture = new FurnitureItem(item); - - addFurnitureItem(newValue, furniture, isUnseen(UnseenItemCategory.FURNI, item.itemId)); - } + i++; } - return newValue; - }); + if(groupItem) + { + groupItem.hasUnseenItems = true; + + newValue[i] = CloneObject(groupItem); + } + else + { + const furniture = new FurnitureItem(item); + + addFurnitureItem(newValue, furniture, isUnseen(UnseenItemCategory.FURNI, item.itemId)); + } + } + + return newValue; + }); }, [ isUnseen ]); UseMessageEventHook(FurnitureListAddOrUpdateEvent, onFurnitureListAddOrUpdateEvent); @@ -101,65 +101,65 @@ const useInventoryFurniState = () => if(!fragment) return; setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIds = getAllItemIds(newValue); + + for(const existingId of existingIds) { - const newValue = [ ...prevValue ]; - const existingIds = getAllItemIds(newValue); + if(fragment.get(existingId)) continue; - for(const existingId of existingIds) + let index = 0; + + while(index < newValue.length) { - if(fragment.get(existingId)) continue; + const group = newValue[index]; + const item = group.remove(existingId); - let index = 0; - - while(index < newValue.length) + if(!item) { - const group = newValue[index]; - const item = group.remove(existingId); + index++; - if(!item) - { - index++; - - continue; - } - - if(getPlacingItemId() === item.ref) - { - cancelRoomObjectPlacement(); - - if(!attemptItemPlacement(group)) - { - CreateLinkEvent('inventory/show'); - } - } - - if(group.getTotalCount() <= 0) - { - newValue.splice(index, 1); - - group.dispose(); - } - - break; + continue; } + + if(getPlacingItemId() === item.ref) + { + cancelRoomObjectPlacement(); + + if(!attemptItemPlacement(group)) + { + CreateLinkEvent('inventory/show'); + } + } + + if(group.getTotalCount() <= 0) + { + newValue.splice(index, 1); + + group.dispose(); + } + + break; } + } - for(const itemId of fragment.keys()) - { - if(existingIds.indexOf(itemId) >= 0) continue; + for(const itemId of fragment.keys()) + { + if(existingIds.indexOf(itemId) >= 0) continue; - const parser = fragment.get(itemId); + const parser = fragment.get(itemId); - if(!parser) continue; + if(!parser) continue; - const item = new FurnitureItem(parser); + const item = new FurnitureItem(parser); - addFurnitureItem(newValue, item, isUnseen(UnseenItemCategory.FURNI, itemId)); + addFurnitureItem(newValue, item, isUnseen(UnseenItemCategory.FURNI, itemId)); - } + } - return newValue; - }); + return newValue; + }); furniMsgFragments = null; }, [ isUnseen ]); @@ -178,42 +178,42 @@ const useInventoryFurniState = () => const parser = event.getParser(); setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + let index = 0; + + while(index < newValue.length) { - const newValue = [ ...prevValue ]; + const group = newValue[index]; + const item = group.remove(parser.itemId); - let index = 0; - - while(index < newValue.length) + if(!item) { - const group = newValue[index]; - const item = group.remove(parser.itemId); + index++; - if(!item) - { - index++; - - continue; - } + continue; + } - if(getPlacingItemId() === item.ref) - { - cancelRoomObjectPlacement(); + if(getPlacingItemId() === item.ref) + { + cancelRoomObjectPlacement(); - if(!attemptItemPlacement(group)) CreateLinkEvent('inventory/show'); - } - - if(group.getTotalCount() <= 0) - { - newValue.splice(index, 1); - - group.dispose(); - } - - break; + if(!attemptItemPlacement(group)) CreateLinkEvent('inventory/show'); } - return newValue; - }); + if(group.getTotalCount() <= 0) + { + newValue.splice(index, 1); + + group.dispose(); + } + + break; + } + + return newValue; + }); }, []); UseMessageEventHook(FurnitureListRemovedEvent, onFurnitureListRemovedEvent); @@ -230,15 +230,15 @@ const useInventoryFurniState = () => if(!groupItems || !groupItems.length) return; setSelectedItem(prevValue => - { - let newValue = prevValue; + { + let newValue = prevValue; - if(newValue && (groupItems.indexOf(newValue) === -1)) newValue = null; + if(newValue && (groupItems.indexOf(newValue) === -1)) newValue = null; - if(!newValue) newValue = groupItems[0]; + if(!newValue) newValue = groupItems[0]; - return newValue; - }); + return newValue; + }); }, [ groupItems ]); useEffect(() => @@ -258,17 +258,10 @@ export const useInventoryFurni = () => const { setIsVisible, ...rest } = useBetween(useInventoryFurniState); const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - useEffect(() => - { - const id = activate(); - - return () => deactivate(id); - }, [ activate, deactivate ]); - useEffect(() => { setIsVisible(isVisible); }, [ isVisible, setIsVisible ]); - return { ...rest }; + return { activate, deactivate, ...rest }; } diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts index b60b65bf..bbd3506a 100644 --- a/src/hooks/inventory/useInventoryPets.ts +++ b/src/hooks/inventory/useInventoryPets.ts @@ -31,13 +31,13 @@ const useInventoryPetsState = () => if(!fragment) return; setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - processPetFragment(newValue, fragment, isUnseen); + processPetFragment(newValue, fragment, isUnseen); - return newValue; - }); + return newValue; + }); petMsgFragments = null; }, [ isUnseen ]); @@ -49,13 +49,13 @@ const useInventoryPetsState = () => const parser = event.getParser(); setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - addSinglePetItem(parser.pet, newValue, true); + addSinglePetItem(parser.pet, newValue, true); - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(PetAddedToInventoryEvent, onPetAddedToInventoryEvent); @@ -65,13 +65,13 @@ const useInventoryPetsState = () => const parser = event.getParser(); setPetItems(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - removePetItemById(parser.petId, newValue); + removePetItemById(parser.petId, newValue); - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(PetRemovedFromInventory, onPetRemovedFromInventory); @@ -81,15 +81,15 @@ const useInventoryPetsState = () => if(!petItems || !petItems.length) return; setSelectedPet(prevValue => - { - let newValue = prevValue; + { + let newValue = prevValue; - if(newValue && (petItems.indexOf(newValue) === -1)) newValue = null; + if(newValue && (petItems.indexOf(newValue) === -1)) newValue = null; - if(!newValue) newValue = petItems[0]; + if(!newValue) newValue = petItems[0]; - return newValue; - }); + return newValue; + }); }, [ petItems ]); useEffect(() => diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts index e2b6c158..fa1541c2 100644 --- a/src/hooks/inventory/useInventoryTrade.ts +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -1,5 +1,5 @@ -import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOpenFailedParser, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; -import { useCallback, useState } from 'react'; +import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryFurni } from '.'; import { BatchUpdates, UseMessageEventHook } from '..'; @@ -13,7 +13,7 @@ const useInventoryTradeState = () => const [ ownUser, setOwnUser ] = useState(null); const [ otherUser, setOtherUser ] = useState(null); const [ tradeState, setTradeState ] = useState(TradeState.TRADING_STATE_READY); - const { groupItems = [], setGroupItems = null } = useInventoryFurni(); + const { groupItems = [], setGroupItems = null, activate = null, deactivate = null } = useInventoryFurni(); const isTrading = (tradeState >= TradeState.TRADING_STATE_RUNNING); const progressTrade = () => @@ -90,25 +90,25 @@ const useInventoryTradeState = () => if(ownUser.userId === parser.userID) { setOwnUser(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.accepts = parser.userAccepts; + newValue.accepts = parser.userAccepts; - return newValue; - }); + return newValue; + }); } else if(otherUser.userId === parser.userID) { setOtherUser(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.accepts = parser.userAccepts; + newValue.accepts = parser.userAccepts; - return newValue; - }); + return newValue; + }); } }, [ ownUser, otherUser ]); @@ -126,7 +126,7 @@ const useInventoryTradeState = () => { if(ownUser && (parser.userID !== ownUser.userId)) { - TradingNotificationMessage(TradingNotificationType.ALERT_OTHER_CANCELLED); + TradingNotificationMessage(TradingNotificationType.THEY_CANCELLED); } } @@ -170,69 +170,69 @@ const useInventoryTradeState = () => const secondUserItems = parseTradeItems(parser.secondUserItemArray); setOwnUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) { - const newValue = CloneObject(prevValue); + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } - if(newValue.userId === parser.firstUserID) + const tradeIds: number[] = []; + + for(const groupItem of newValue.userItems.getValues()) + { + let i = 0; + + while(i < groupItem.getTotalCount()) { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; + const item = groupItem.getItemByIndex(i); + + if(item) tradeIds.push(item.ref); + + i++; } + } - const tradeIds: number[] = []; + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; - for(const groupItem of newValue.userItems.getValues()) - { - let i = 0; - - while(i < groupItem.getTotalCount()) - { - const item = groupItem.getItemByIndex(i); - - if(item) tradeIds.push(item.ref); - - i++; - } - } - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); - - return newValue; - }); + for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); return newValue; }); + return newValue; + }); + setOtherUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) { - const newValue = CloneObject(prevValue); + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } - if(newValue.userId === parser.firstUserID) - { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; - } - - return newValue; - }); + return newValue; + }); }, [ setGroupItems ]); UseMessageEventHook(TradingListItemEvent, onTradingListItemEvent); @@ -294,9 +294,7 @@ const useInventoryTradeState = () => { const parser = event.getParser(); - if((parser.reason !== TradingOpenFailedParser.REASON_YOU_ARE_ALREADY_TRADING && (parser.reason !== TradingOpenFailedParser.REASON_OTHER_USER_ALREADY_TRADING))) return; - - TradingNotificationMessage(TradingNotificationType.ALERT_ALREADY_OPEN); + TradingNotificationMessage(parser.reason, parser.otherUserName); }, []); UseMessageEventHook(TradingOpenFailedEvent, onTradingOpenFailedEvent); @@ -305,7 +303,7 @@ const useInventoryTradeState = () => { const parser = event.getParser(); - TradingNotificationMessage(TradingNotificationType.ALERT_OTHER_DISABLED); + TradingNotificationMessage(TradingNotificationType.THEY_NOT_ALLOWED); }, []); UseMessageEventHook(TradingOtherNotAllowedEvent, onTradingOtherNotAllowedEvent); @@ -319,6 +317,15 @@ const useInventoryTradeState = () => UseMessageEventHook(TradingYouAreNotAllowedEvent, onTradingYouAreNotAllowedEvent); + useEffect(() => + { + if(tradeState === TradeState.TRADING_STATE_READY) return; + + const id = activate(); + + return () => deactivate(id); + }, [ tradeState, activate, deactivate ]); + return { ownUser, otherUser, tradeState, setTradeState, isTrading, groupItems, progressTrade, removeItem, stopTrading }; } diff --git a/src/hooks/inventory/useInventoryUnseenTracker.ts b/src/hooks/inventory/useInventoryUnseenTracker.ts index 5f011ab5..86ac95eb 100644 --- a/src/hooks/inventory/useInventoryUnseenTracker.ts +++ b/src/hooks/inventory/useInventoryUnseenTracker.ts @@ -27,13 +27,13 @@ const useInventoryUnseenTrackerState = () => if(!getCount(category)) return false; setUnseenItems(prevValue => - { - const newValue = new Map(prevValue); + { + const newValue = new Map(prevValue); - newValue.delete(category); + newValue.delete(category); - return newValue; - }); + return newValue; + }); sendResetCategoryMessage(category); @@ -45,13 +45,13 @@ const useInventoryUnseenTrackerState = () => if(getCount(category)) return false; setUnseenItems(prevValue => - { - const newValue = new Map(prevValue); + { + const newValue = new Map(prevValue); - newValue.delete(category); + newValue.delete(category); - return newValue; - }); + return newValue; + }); sendResetCategoryMessage(category); @@ -63,14 +63,14 @@ const useInventoryUnseenTrackerState = () => if(!getCount(category)) return false; setUnseenItems(prevValue => - { - const newValue = new Map(prevValue); - const existing = newValue.get(category); + { + const newValue = new Map(prevValue); + const existing = newValue.get(category); - if(existing) for(const itemId of itemIds) existing.splice(existing.indexOf(itemId), 1); + if(existing) for(const itemId of itemIds) existing.splice(existing.indexOf(itemId), 1); - return newValue; - }); + return newValue; + }); sendResetItemsMessage(category, itemIds); @@ -91,18 +91,18 @@ const useInventoryUnseenTrackerState = () => if(!unseenItems.has(category)) return false; setUnseenItems(prevValue => + { + const newValue = new Map(prevValue); + const items = newValue.get(category); + const index = items.indexOf(itemId); + + if(index >= 0) { - const newValue = new Map(prevValue); - const items = newValue.get(category); - const index = items.indexOf(itemId); + items.splice(index, 1); + } - if(index >= 0) - { - items.splice(index, 1); - } - - return newValue; - }); + return newValue; + }); } const onUnseenItemsEvent = useCallback((event: UnseenItemsEvent) => @@ -110,27 +110,27 @@ const useInventoryUnseenTrackerState = () => const parser = event.getParser(); setUnseenItems(prevValue => + { + const newValue = new Map(prevValue); + + for(const category of parser.categories) { - const newValue = new Map(prevValue); + let existing = newValue.get(category); - for(const category of parser.categories) + if(!existing) { - let existing = newValue.get(category); + existing = []; - if(!existing) - { - existing = []; - - newValue.set(category, existing); - } - - const itemIds = parser.getItemsByCategory(category); - - for(const itemId of itemIds) ((existing.indexOf(itemId) === -1) && existing.push(itemId)); + newValue.set(category, existing); } - return newValue; - }); + const itemIds = parser.getItemsByCategory(category); + + for(const itemId of itemIds) ((existing.indexOf(itemId) === -1) && existing.push(itemId)); + } + + return newValue; + }); }, []); UseMessageEventHook(UnseenItemsEvent, onUnseenItemsEvent); diff --git a/src/hooks/useSharedVisibility.ts b/src/hooks/useSharedVisibility.ts index ce5fa232..b55855b5 100644 --- a/src/hooks/useSharedVisibility.ts +++ b/src/hooks/useSharedVisibility.ts @@ -11,15 +11,15 @@ export const useSharedVisibility = () => let id = -1; setActiveIds(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - id = newValue.length ? (newValue[(newValue.length - 1)] + 1) : 0; + id = newValue.length ? (newValue[(newValue.length - 1)] + 1) : 0; - newValue.push(id); + newValue.push(id); - return newValue; - }); + return newValue; + }); return id; }, []); @@ -27,17 +27,17 @@ export const useSharedVisibility = () => const deactivate = useCallback((id: number) => { setActiveIds(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - const index = newValue.indexOf(id); + const index = newValue.indexOf(id); - if(index === -1) return prevValue; + if(index === -1) return prevValue; - newValue.splice(index, 1); + newValue.splice(index, 1); - return newValue; - }); + return newValue; + }); }, []); return { isVisible, activate, deactivate }; From 554bea8c6685a74f1d77e6fa9683f7252d214af4 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 1 Apr 2022 17:08:50 -0400 Subject: [PATCH 212/331] Update to react 18 --- package.json | 10 +- .../draggable-window/DraggableWindow.tsx | 17 +- .../achievements/AchievementsView.tsx | 9 +- .../checkout/CameraWidgetCheckoutView.tsx | 20 +-- src/components/campaign/CampaignView.tsx | 31 ++-- .../catalog/CatalogMessageHandler.tsx | 26 ++- src/components/catalog/CatalogView.tsx | 136 +++++++--------- .../catalog/views/gift/CatalogGiftView.tsx | 57 +++---- .../page/common/CatalogRedeemVoucherView.tsx | 9 +- .../views/page/common/CatalogSearchView.tsx | 29 ++-- .../CatalogLayoutMarketplaceOwnItemsView.tsx | 9 +- ...atalogLayoutMarketplacePublicItemsView.tsx | 10 +- .../page/layout/pets/CatalogLayoutPetView.tsx | 32 ++-- .../page/widgets/CatalogSpacesWidgetView.tsx | 10 +- .../chat-history/ChatHistoryView.tsx | 8 +- .../views/friends-list/FriendsSearchView.tsx | 9 +- .../views/messenger/FriendsMessengerView.tsx | 16 +- .../groups/views/GroupCreatorView.tsx | 32 ++-- .../groups/views/GroupMembersView.tsx | 31 ++-- .../views/tabs/GroupTabIdentityView.tsx | 10 +- .../views/tabs/GroupTabSettingsView.tsx | 8 +- src/components/hotel-view/HotelView.tsx | 9 +- .../mod-tools/views/room/ModToolsRoomView.tsx | 17 +- .../views/user/ModToolsUserChatlogView.tsx | 9 +- .../navigator/NavigatorMessageHandler.tsx | 48 +++--- src/components/navigator/NavigatorView.tsx | 37 ++--- .../views/NavigatorRoomCreatorView.tsx | 8 +- .../navigator/views/NavigatorRoomInfoView.tsx | 10 +- .../NavigatorRoomSettingsAccessTabView.tsx | 10 +- .../NavigatorRoomSettingsBasicTabView.tsx | 8 +- .../NavigatorRoomSettingsView.tsx | 9 +- .../NavigatorSearchResultItemInfoView.tsx | 18 +-- .../search/NavigatorSearchResultView.tsx | 8 +- .../views/search/NavigatorSearchView.tsx | 8 +- src/components/nitropedia/NitropediaView.tsx | 26 ++- .../AvatarInfoWidgetAvatarView.tsx | 8 +- .../AvatarInfoWidgetOwnPetView.tsx | 20 +-- .../avatar-info/AvatarInfoWidgetPetView.tsx | 20 +-- .../chat-input/ChatInputStyleSelectorView.tsx | 25 ++- .../room/widgets/chat-input/ChatInputView.tsx | 9 +- .../choosers/FurniChooserWidgetView.tsx | 16 +- .../choosers/UserChooserWidgetView.tsx | 16 +- .../widgets/context-menu/ContextMenuView.tsx | 15 +- .../widgets/doorbell/DoorbellWidgetView.tsx | 9 +- .../FurnitureBackgroundColorView.tsx | 13 +- .../context-menu/FurnitureContextMenuView.tsx | 84 ++++------ .../FurnitureCustomStackHeightView.tsx | 16 +- .../furniture/dimmer/FurnitureDimmerView.tsx | 45 +++--- .../FurnitureExchangeCreditView.tsx | 16 +- .../FurnitureExternalImageView.tsx | 14 +- .../friend-furni/FurnitureFriendFurniView.tsx | 16 +- .../gift-opening/FurnitureGiftOpeningView.tsx | 90 +++++------ .../FurnitureManipulationMenuView.tsx | 38 ++--- .../mannequin/FurnitureMannequinView.tsx | 68 ++++---- .../FurnitureYoutubeDisplayView.tsx | 28 ++-- .../infostand/InfoStandWidgetFurniView.tsx | 33 ++-- .../infostand/InfoStandWidgetUserView.tsx | 18 +-- .../room-tools/RoomToolsWidgetView.tsx | 11 +- .../widgets/word-quiz/WordQuizWidgetView.tsx | 69 ++++---- src/components/toolbar/ToolbarView.tsx | 9 +- .../user-profile/UserProfileView.tsx | 32 ++-- .../views/GroupsContainerView.tsx | 27 ++-- src/components/wired/views/WiredBaseView.tsx | 77 ++++----- .../WiredActionBotChangeFigureView.tsx | 8 +- .../WiredActionBotFollowAvatarView.tsx | 15 +- .../WiredActionBotGiveHandItemView.tsx | 15 +- .../WiredActionBotTalkToAvatarView.tsx | 17 +- .../views/actions/WiredActionBotTalkView.tsx | 17 +- .../actions/WiredActionGiveRewardView.tsx | 23 +-- ...redActionGiveScoreToPredefinedTeamView.tsx | 26 ++- .../actions/WiredActionGiveScoreView.tsx | 22 ++- .../WiredActionMoveAndRotateFurniView.tsx | 22 ++- .../actions/WiredActionMoveFurniToView.tsx | 22 ++- .../actions/WiredActionMoveFurniView.tsx | 22 ++- .../views/actions/WiredActionMuteUserView.tsx | 15 +- .../WiredActionSetFurniStateToView.tsx | 10 +- .../WiredConditionDateRangeView.tsx | 8 +- ...WiredConditionFurniMatchesSnapshotView.tsx | 10 +- .../WiredConditionUserCountInRoomView.tsx | 22 ++- .../WiredTriggerAvatarEnterRoomView.tsx | 8 +- .../WiredTriggerAvatarSaysSomethingView.tsx | 15 +- src/hooks/BatchUpdates.ts | 6 - src/hooks/index.ts | 1 - src/hooks/inventory/useInventoryBadges.ts | 97 ++++++------ src/hooks/inventory/useInventoryTrade.ts | 149 ++++++++---------- src/index.tsx | 4 +- yarn.lock | 39 +++-- 87 files changed, 848 insertions(+), 1331 deletions(-) delete mode 100644 src/hooks/BatchUpdates.ts diff --git a/package.json b/package.json index 9fedc429..0b346d4e 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "2.0.0", "private": true, "scripts": { - "start": "cross-env BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco start", - "build": "cross-env GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco build", + "start": "cross-env SKIP_PREFLIGHT_CHECK=true BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco start", + "build": "cross-env SKIP_PREFLIGHT_CHECK=true GENERATE_SOURCEMAP=false IMAGE_INLINE_SIZE_LIMIT=100000 craco build", "build:prod": "npx browserslist@latest --update-db && yarn build", "test": "craco test", "eject": "react-scripts eject", @@ -21,11 +21,11 @@ "cross-env": "^7.0.3", "emoji-toolkit": "^6.6.0", "node-sass": "^6.0.1", - "react": "^17.0.2", + "react": "^18.0.0", "react-bootstrap": "^2.2.2", - "react-dom": "^17.0.2", + "react-dom": "^18.0.0", "react-scripts": "4.0.3", - "react-slider": "^1.3.1", + "react-slider": "^2.0.0", "react-transition-group": "^4.4.2", "react-virtualized": "^9.22.3", "react-youtube": "^7.13.1", diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index 254c6f58..397ac436 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -2,7 +2,6 @@ import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { Base } from '..'; -import { BatchUpdates } from '../../hooks'; import { DraggableWindowPosition } from './DraggableWindowPosition'; const CURRENT_WINDOWS: HTMLElement[] = []; @@ -134,12 +133,9 @@ export const DraggableWindow: FC = props => offsetX = (document.body.offsetWidth - elementRef.current.offsetWidth) - elementRef.current.offsetLeft; } - BatchUpdates(() => - { - setDelta({ x: 0, y: 0 }); - setOffset({ x: offsetX, y: offsetY }); - setIsDragging(false); - }); + setDelta({ x: 0, y: 0 }); + setOffset({ x: offsetX, y: offsetY }); + setIsDragging(false); if(uniqueKey !== null) POS_MEMORY.set(uniqueKey, { x: offsetX, y: offsetY }); }, [ dragHandler, delta, offset, uniqueKey ]); @@ -201,11 +197,8 @@ export const DraggableWindow: FC = props => } } - BatchUpdates(() => - { - setDelta({ x: 0, y: 0 }); - setOffset({ x: offsetX, y: offsetY }); - }); + setDelta({ x: 0, y: 0 }); + setOffset({ x: offsetX, y: offsetY }); return () => { diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index baa4bc36..5809c88c 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { AchievementCategory, AddEventLinkTracker, CloneObject, GetAchievementCategoryImageUrl, GetAchievementIsIgnored, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Base, Column, LayoutImage, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; import { AchievementsUIUnseenCountEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; import { AchievementCategoryView } from './views/AchievementCategoryView'; import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView'; @@ -92,11 +92,8 @@ export const AchievementsView: FC<{}> = props => existing.achievements.push(achievement); } - BatchUpdates(() => - { - setAchievementCategories(categories); - setIsInitalized(true); - }); + setAchievementCategories(categories); + setIsInitalized(true); }, []); UseMessageEventHook(AchievementsEvent, onAchievementsEvent); diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx index 0125e0c4..a399d1ac 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { InventoryEvent } from '../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; export interface CameraWidgetCheckoutViewProps { @@ -27,11 +27,8 @@ export const CameraWidgetCheckoutView: FC = props const onCameraPurchaseOKMessageEvent = useCallback((event: CameraPurchaseOKMessageEvent) => { - BatchUpdates(() => - { - setPicturesBought(value => (value + 1)); - setIsWaiting(false); - }); + setPicturesBought(value => (value + 1)); + setIsWaiting(false); }, []); UseMessageEventHook(CameraPurchaseOKMessageEvent, onCameraPurchaseOKMessageEvent); @@ -40,13 +37,10 @@ export const CameraWidgetCheckoutView: FC = props { const parser = event.getParser(); - BatchUpdates(() => - { - setPublishUrl(parser.extraDataId); - setPublishCooldown(parser.secondsToWait); - setWasPicturePublished(parser.ok); - setIsWaiting(false); - }); + setPublishUrl(parser.extraDataId); + setPublishCooldown(parser.secondsToWait); + setWasPicturePublished(parser.ok); + setIsWaiting(false); }, []); UseMessageEventHook(CameraPublishStatusMessageEvent, onCameraPublishStatusMessageEvent); diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index c3919755..62867b51 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -1,7 +1,7 @@ import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, CalendarItem, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; -import { BatchUpdates, UseMessageEventHook } from '../../hooks'; +import { UseMessageEventHook } from '../../hooks'; import { CalendarView } from './CalendarView'; export const CampaignView: FC<{}> = props => @@ -31,23 +31,20 @@ export const CampaignView: FC<{}> = props => if(parser.doorOpened) { - BatchUpdates(() => + setCalendarData(prev => { - setCalendarData(prev => - { - const copy = prev.clone(); - copy.openedDays.push(lastOpenAttempt); - - return copy; - }); - - setReceivedProducts(prev => - { - const copy = new Map(prev); - copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); - - return copy; - }); + const copy = prev.clone(); + copy.openedDays.push(lastOpenAttempt); + + return copy; + }); + + setReceivedProducts(prev => + { + const copy = new Map(prev); + copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName)); + + return copy; }); } diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx index eb404dcf..dfbf89d2 100644 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ b/src/components/catalog/CatalogMessageHandler.tsx @@ -3,7 +3,7 @@ import { GuildMembershipsMessageEvent } from '@nitrots/nitro-renderer/src/nitro/ import { FC, useCallback } from 'react'; import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, NotificationAlertType, NotificationUtilities, ProductTypeEnum } from '../../api'; import { CatalogGiftReceiverNotFoundEvent, CatalogNameResultEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; import { useCatalogContext } from './CatalogContext'; import { CatalogNode } from './common/CatalogNode'; import { CatalogPetPalette } from './common/CatalogPetPalette'; @@ -43,11 +43,8 @@ export const CatalogMessageHandler: FC<{}> = props => return catalogNode; } - BatchUpdates(() => - { - setRootNode(getCatalogNode(parser.root, 0, null)); - setOffersToNodes(offers); - }); + setRootNode(getCatalogNode(parser.root, 0, null)); + setOffersToNodes(offers); }, [ setRootNode, setOffersToNodes ]); const onCatalogPageMessageEvent = useCallback((event: CatalogPageMessageEvent) => @@ -77,17 +74,14 @@ export const CatalogMessageHandler: FC<{}> = props => if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); } - BatchUpdates(() => + if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); + + setIsBusy(false); + + if(pageId === parser.pageId) { - if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); - - setIsBusy(false); - - if(pageId === parser.pageId) - { - showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); - } - }); + showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); + } }, [ currentType, pageId, setFrontPageItems, setIsBusy, showCatalogPage ]); const onPurchaseOKMessageEvent = useCallback((event: PurchaseOKMessageEvent) => diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index d38da044..c8645189 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, GetRoomEngine, LocalizeText, NotificationAlertType, NotificationUtilities, PlaySound, RemoveLinkEventTracker, SendMessageComposer, SoundNames } from '../../api'; import { Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { CatalogPurchasedEvent } from '../../events'; -import { BatchUpdates, UseMessageEventHook, UseUiEvent } from '../../hooks'; +import { UseMessageEventHook, UseUiEvent } from '../../hooks'; import { CatalogContextProvider } from './CatalogContext'; import { CatalogMessageHandler } from './CatalogMessageHandler'; import { CatalogPage } from './common/CatalogPage'; @@ -44,19 +44,16 @@ export const CatalogView: FC<{}> = props => const resetState = useCallback(() => { - BatchUpdates(() => - { - setPageId(-1); - setPreviousPageId(-1); - setRootNode(null); - setOffersToNodes(null); - setCurrentPage(null); - setCurrentOffer(null); - setActiveNodes([]); - setSearchResult(null); - setFrontPageItems([]); - setIsVisible(false); - }); + setPageId(-1); + setPreviousPageId(-1); + setRootNode(null); + setOffersToNodes(null); + setCurrentPage(null); + setCurrentOffer(null); + setActiveNodes([]); + setSearchResult(null); + setFrontPageItems([]); + setIsVisible(false); }, []); const onCatalogPublishedMessageEvent = useCallback((event: CatalogPublishedMessageEvent) => @@ -119,11 +116,8 @@ export const CatalogView: FC<{}> = props => { if(pageId < 0) return; - BatchUpdates(() => - { - setIsBusy(true); - setPageId(pageId); - }); + setIsBusy(true); + setPageId(pageId); if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); }, [ currentType ]); @@ -132,24 +126,21 @@ export const CatalogView: FC<{}> = props => { const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); - BatchUpdates(() => - { - setCurrentPage(catalogPage); - setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); - setNavigationHidden(false); + setCurrentPage(catalogPage); + setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); + setNavigationHidden(false); - if((offerId > -1) && catalogPage.offers.length) + if((offerId > -1) && catalogPage.offers.length) + { + for(const offer of catalogPage.offers) { - for(const offer of catalogPage.offers) - { - if(offer.offerId !== offerId) continue; - - setCurrentOffer(offer) - - break; - } + if(offer.offerId !== offerId) continue; + + setCurrentOffer(offer) + + break; } - }); + } }, []); const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => @@ -214,67 +205,58 @@ export const CatalogView: FC<{}> = props => const openPageById = useCallback((id: number) => { - BatchUpdates(() => + setSearchResult(null); + + if(!isVisible) { - setSearchResult(null); + REQUESTED_PAGE.requestById = id; - if(!isVisible) - { - REQUESTED_PAGE.requestById = id; + setIsVisible(true); + } + else + { + const node = getNodeById(id, rootNode); - setIsVisible(true); - } - else - { - const node = getNodeById(id, rootNode); - - if(node) activateNode(node); - } - }); + if(node) activateNode(node); + } }, [ isVisible, rootNode, getNodeById, activateNode ]); const openPageByName = useCallback((name: string) => { - BatchUpdates(() => + setSearchResult(null); + + if(!isVisible) { - setSearchResult(null); + REQUESTED_PAGE.requestByName = name; - if(!isVisible) - { - REQUESTED_PAGE.requestByName = name; + setIsVisible(true); + } + else + { + const node = getNodeByName(name, rootNode); - setIsVisible(true); - } - else - { - const node = getNodeByName(name, rootNode); - - if(node) activateNode(node); - } - }); + if(node) activateNode(node); + } }, [ isVisible, rootNode, getNodeByName, activateNode ]); const openPageByOfferId = useCallback((offerId: number) => { - BatchUpdates(() => + setSearchResult(null); + + if(!isVisible) { - setSearchResult(null); + REQUESTED_PAGE.requestedByOfferId = offerId; - if(!isVisible) - { - REQUESTED_PAGE.requestedByOfferId = offerId; + setIsVisible(true); + } + else + { + const nodes = getNodesByOfferId(offerId); - setIsVisible(true); - } - else - { - const nodes = getNodesByOfferId(offerId); + if(!nodes || !nodes.length) return; - if(!nodes || !nodes.length) return; - - activateNode(nodes[0], offerId); - } - }); + activateNode(nodes[0], offerId); + } }, [ isVisible, getNodesByOfferId, activateNode ]); const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index acf0db31..2da0b69b 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -5,7 +5,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetSessionDataManager, LocalizeText, ProductTypeEnum, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; -import { BatchUpdates, UseUiEvent } from '../../../../hooks'; +import { UseUiEvent } from '../../../../hooks'; import { useCatalogContext } from '../../CatalogContext'; export const CatalogGiftView: FC<{}> = props => @@ -29,20 +29,17 @@ export const CatalogGiftView: FC<{}> = props => const close = useCallback(() => { - BatchUpdates(() => - { - setIsVisible(false); - setPageId(0); - setOfferId(0); - setExtraData(''); - setReceiverName(''); - setShowMyFace(true); - setMessage(''); - setSelectedBoxIndex(0); - setSelectedRibbonIndex(0); - - if(colors.length) setSelectedColorId(colors[0].id); - }); + setIsVisible(false); + setPageId(0); + setOfferId(0); + setExtraData(''); + setReceiverName(''); + setShowMyFace(true); + setMessage(''); + setSelectedBoxIndex(0); + setSelectedRibbonIndex(0); + + if(colors.length) setSelectedColorId(colors[0].id); }, [ colors ]); const onCatalogEvent = useCallback((event: CatalogEvent) => @@ -55,15 +52,12 @@ export const CatalogGiftView: FC<{}> = props => case CatalogEvent.INIT_GIFT: const castedEvent = (event as CatalogInitGiftEvent); - BatchUpdates(() => - { - close(); + close(); - setPageId(castedEvent.pageId); - setOfferId(castedEvent.offerId); - setExtraData(castedEvent.extraData); - setIsVisible(true); - }); + setPageId(castedEvent.pageId); + setOfferId(castedEvent.offerId); + setExtraData(castedEvent.extraData); + setIsVisible(true); return; case CatalogEvent.GIFT_RECEIVER_NOT_FOUND: setReceiverNotFound(true); @@ -144,17 +138,14 @@ export const CatalogGiftView: FC<{}> = props => if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: `#${giftData.colors[0].toString(16)}` }); } - BatchUpdates(() => - { - setMaxBoxIndex(giftConfiguration.boxTypes.length - 1); - setMaxRibbonIndex(giftConfiguration.ribbonTypes.length - 1); + setMaxBoxIndex(giftConfiguration.boxTypes.length - 1); + setMaxRibbonIndex(giftConfiguration.ribbonTypes.length - 1); - if(newColors.length) - { - setSelectedColorId(newColors[0].id); - setColors(newColors); - } - }); + if(newColors.length) + { + setSelectedColorId(newColors[0].id); + setColors(newColors); + } }, [ giftConfiguration ]); if(!giftConfiguration || !giftConfiguration.isEnabled || !isVisible) return null; diff --git a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx b/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx index c3c69886..3363141d 100644 --- a/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx +++ b/src/components/catalog/views/page/common/CatalogRedeemVoucherView.tsx @@ -3,7 +3,7 @@ import { RedeemVoucherMessageComposer, VoucherRedeemErrorMessageEvent, VoucherRe import { FC, useCallback, useState } from 'react'; import { LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../../api'; import { Button, Flex } from '../../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../../hooks'; +import { UseMessageEventHook } from '../../../../../hooks'; export interface CatalogRedeemVoucherViewProps { @@ -35,11 +35,8 @@ export const CatalogRedeemVoucherView: FC = props NotificationUtilities.simpleAlert(message, null, null, null, LocalizeText('catalog.alert.voucherredeem.ok.title')); - BatchUpdates(() => - { - setIsWaiting(false); - setVoucher(''); - }); + setIsWaiting(false); + setVoucher(''); }, []); UseMessageEventHook(VoucherRedeemOkMessageEvent, onVoucherRedeemOkMessageEvent); diff --git a/src/components/catalog/views/page/common/CatalogSearchView.tsx b/src/components/catalog/views/page/common/CatalogSearchView.tsx index d0a5281d..2a375fbf 100644 --- a/src/components/catalog/views/page/common/CatalogSearchView.tsx +++ b/src/components/catalog/views/page/common/CatalogSearchView.tsx @@ -4,7 +4,6 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { GetSessionDataManager, LocalizeText } from '../../../../../api'; import { Button } from '../../../../../common/Button'; import { Flex } from '../../../../../common/Flex'; -import { BatchUpdates } from '../../../../../hooks'; import { useCatalogContext } from '../../../CatalogContext'; import { CatalogPage } from '../../../common/CatalogPage'; import { CatalogType } from '../../../common/CatalogType'; @@ -24,20 +23,17 @@ export const CatalogSearchView: FC<{}> = props => const updateSearchValue = (value: string) => { - BatchUpdates(() => + if(!value || !value.length) { - if(!value || !value.length) - { - setSearchValue(''); + setSearchValue(''); - if(searchResult) setSearchResult(null); - } - else - { - setSearchValue(value); - setNeedsProcessing(true); - } - }); + if(searchResult) setSearchResult(null); + } + else + { + setSearchValue(value); + setNeedsProcessing(true); + } } const processSearch = useCallback((search: string) => @@ -96,11 +92,8 @@ export const CatalogSearchView: FC<{}> = props => FilterCatalogNode(search, foundFurniLines, rootNode, nodes); - BatchUpdates(() => - { - setCurrentPage((new CatalogPage(-1, 'default_3x3', new PageLocalization([], []), offers, false, 1) as ICatalogPage)); - setSearchResult(new SearchResult(search, offers, nodes.filter(node => (node.isVisible)))); - }); + setCurrentPage((new CatalogPage(-1, 'default_3x3', new PageLocalization([], []), offers, false, 1) as ICatalogPage)); + setSearchResult(new SearchResult(search, offers, nodes.filter(node => (node.isVisible)))); }, [ offersToNodes, currentType, rootNode, setCurrentPage, setSearchResult ]); useEffect(() => diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index ff2de8a8..e7b8e3bf 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -2,7 +2,7 @@ import { CancelMarketplaceOfferMessageComposer, GetMarketplaceOwnOffersMessageCo import { FC, useCallback, useMemo, useState } from 'react'; import { LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { Button, Column, Text } from '../../../../../../common'; -import { BatchUpdates, UseMessageEventHook, UseMountEffect } from '../../../../../../hooks'; +import { UseMessageEventHook, UseMountEffect } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, OWN_OFFER } from './CatalogLayoutMarketplaceItemView'; import { MarketplaceOfferData } from './common/MarketplaceOfferData'; @@ -28,11 +28,8 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop return newOffer; }); - BatchUpdates(() => - { - setCreditsWaiting(parser.creditsWaiting); - setOffers(offers); - }); + setCreditsWaiting(parser.creditsWaiting); + setOffers(offers); }, []); UseMessageEventHook(MarketplaceOwnOffersEvent, onMarketPlaceOwnOffersEvent); diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx index e8d79b41..ae6b5fff 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx @@ -2,7 +2,7 @@ import { BuyMarketplaceOfferMessageComposer, GetMarketplaceOffersMessageComposer import { FC, useCallback, useMemo, useState } from 'react'; import { LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { Button, ButtonGroup, Column, Text } from '../../../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../../../hooks'; +import { UseMessageEventHook } from '../../../../../../hooks'; import { GetCurrencyAmount } from '../../../../../purse/common/CurrencyHelper'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, PUBLIC_OFFER } from './CatalogLayoutMarketplaceItemView'; @@ -75,12 +75,8 @@ export const CatalogLayoutMarketplacePublicItemsView: FC - { - setTotalItemsFound(parser.totalItemsFound); - setOffers(latestOffers); - }); - + setTotalItemsFound(parser.totalItemsFound); + setOffers(latestOffers); }, []); const onMarketplaceBuyOfferResultEvent = useCallback( (event: MarketplaceBuyOfferResultEvent) => diff --git a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx index 005b6cd8..d2dde60c 100644 --- a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx +++ b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx @@ -4,7 +4,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../../../../../api'; import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, LayoutPetImageView, Text } from '../../../../../../common'; import { CatalogNameResultEvent, CatalogPurchaseFailureEvent, CatalogWidgetEvent } from '../../../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseUiEvent } from '../../../../../../hooks'; +import { DispatchUiEvent, UseUiEvent } from '../../../../../../hooks'; import { useCatalogContext } from '../../../../CatalogContext'; import { GetPetAvailableColors, GetPetIndexFromLocalization } from '../../../../common/CatalogUtilities'; import { CatalogAddOnBadgeWidgetView } from '../../widgets/CatalogAddOnBadgeWidgetView'; @@ -122,12 +122,9 @@ export const CatalogLayoutPetView: FC = props => const offer = page.offers[0]; - BatchUpdates(() => - { - setCurrentOffer(offer); - setPetIndex(GetPetIndexFromLocalization(offer.localizationId)); - setColorsShowing(false); - }); + setCurrentOffer(offer); + setPetIndex(GetPetIndexFromLocalization(offer.localizationId)); + setColorsShowing(false); }, [ page, setCurrentOffer ]); useEffect(() => @@ -153,21 +150,15 @@ export const CatalogLayoutPetView: FC = props => palettes.push(palette); } - BatchUpdates(() => - { - setSelectedPaletteIndex((palettes.length ? 0 : -1)); - setSellablePalettes(palettes); - }); + setSelectedPaletteIndex((palettes.length ? 0 : -1)); + setSellablePalettes(palettes); return; } } - BatchUpdates(() => - { - setSelectedPaletteIndex(-1); - setSellablePalettes([]); - }); + setSelectedPaletteIndex(-1); + setSellablePalettes([]); SendMessageComposer(new GetSellablePetPalettesComposer(productData.type)); }, [ currentOffer, petPalettes ]); @@ -178,11 +169,8 @@ export const CatalogLayoutPetView: FC = props => const colors = GetPetAvailableColors(petIndex, sellablePalettes); - BatchUpdates(() => - { - setSelectedColorIndex((colors.length ? 0 : -1)); - setSellableColors(colors); - }); + setSelectedColorIndex((colors.length ? 0 : -1)); + setSellableColors(colors); }, [ petIndex, sellablePalettes ]); useEffect(() => diff --git a/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx index eba82b3b..d2dc9550 100644 --- a/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, ProductTypeEnum } from '../../../../../api'; import { AutoGrid, AutoGridProps, Button, ButtonGroup } from '../../../../../common'; -import { BatchUpdates } from '../../../../../hooks'; import { useCatalogContext } from '../../../CatalogContext'; import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; import { Offer } from '../../../common/Offer'; @@ -52,12 +51,9 @@ export const CatalogSpacesWidgetView: FC = props = } } - BatchUpdates(() => - { - setGroupedOffers(groupedOffers); - setSelectedGroupIndex(0); - setSelectedOfferForGroup([ groupedOffers[0][0], groupedOffers[1][0], groupedOffers[2][0] ]); - }); + setGroupedOffers(groupedOffers); + setSelectedGroupIndex(0); + setSelectedOfferForGroup([ groupedOffers[0][0], groupedOffers[1][0], groupedOffers[2][0] ]); }, [ currentPage ]); useEffect(() => diff --git a/src/components/chat-history/ChatHistoryView.tsx b/src/components/chat-history/ChatHistoryView.tsx index a8446720..25722241 100644 --- a/src/components/chat-history/ChatHistoryView.tsx +++ b/src/components/chat-history/ChatHistoryView.tsx @@ -3,7 +3,6 @@ import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps, ListRowRenderer, Size } from 'react-virtualized'; import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api'; import { Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { BatchUpdates } from '../../hooks'; import { ChatHistoryContextProvider } from './ChatHistoryContext'; import { ChatHistoryMessageHandler } from './ChatHistoryMessageHandler'; import { ChatEntryType } from './common/ChatEntryType'; @@ -91,11 +90,8 @@ export const ChatHistoryView: FC<{}> = props => chatState.notifier = () => setChatHistoryUpdateId(prevValue => (prevValue + 1)); roomState.notifier = () => setRoomHistoryUpdateId(prevValue => (prevValue + 1)); - BatchUpdates(() => - { - setChatHistoryState(chatState); - setRoomHistoryState(roomState); - }); + setChatHistoryState(chatState); + setRoomHistoryState(roomState); return () => { diff --git a/src/components/friends/views/friends-list/FriendsSearchView.tsx b/src/components/friends/views/friends-list/FriendsSearchView.tsx index a3e04c31..caaf56d8 100644 --- a/src/components/friends/views/friends-list/FriendsSearchView.tsx +++ b/src/components/friends/views/friends-list/FriendsSearchView.tsx @@ -2,7 +2,7 @@ import { HabboSearchComposer, HabboSearchResultData, HabboSearchResultEvent } fr import { FC, useCallback, useEffect, useState } from 'react'; import { LocalizeText, OpenMessengerChat, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, Text, UserProfileIconView } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; +import { UseMessageEventHook } from '../../../../hooks'; import { useFriendsContext } from '../../FriendsContext'; interface FriendsSearchViewProps extends NitroCardAccordionSetViewProps @@ -22,11 +22,8 @@ export const FriendsSearchView: FC = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setFriendResults(parser.friends); - setOtherResults(parser.others); - }); + setFriendResults(parser.friends); + setOtherResults(parser.others); }, []); UseMessageEventHook(HabboSearchResultEvent, onHabboSearchResultEvent); diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index 67c2a972..66214dbf 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -4,7 +4,7 @@ import { FC, KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, NotificationAlertType, NotificationUtilities, PlaySound, RemoveLinkEventTracker, SendMessageComposer, SoundNames } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, LayoutGridItem, LayoutItemCountView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { FriendsMessengerIconEvent } from '../../../../events'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; import { MessengerThread } from '../../common/MessengerThread'; import { MessengerThreadChat } from '../../common/MessengerThreadChat'; import { useFriendsContext } from '../../FriendsContext'; @@ -142,11 +142,8 @@ export const FriendsMessengerView: FC<{}> = props => thread.addMessage(GetSessionDataManager().userId, messageText, 0, null, MessengerThreadChat.CHAT); - BatchUpdates(() => - { - setMessageThreads(prevValue => [ ...prevValue ]); - setMessageText(''); - }); + setMessageThreads(prevValue => [ ...prevValue ]); + setMessageText(''); }, [ messageThreads, activeThreadIndex, messageText ]); const onKeyDown = useCallback((event: KeyboardEvent) => @@ -173,11 +170,8 @@ export const FriendsMessengerView: FC<{}> = props => if(threadIndex === -1) return; - BatchUpdates(() => - { - setActiveThreadIndex(threadIndex); - setIsVisible(true); - }); + setActiveThreadIndex(threadIndex); + setIsVisible(true); }, [ getMessageThreadWithIndex ]); const closeThread = useCallback((threadIndex: number) => diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx index a9b27f45..96130477 100644 --- a/src/components/groups/views/GroupCreatorView.tsx +++ b/src/components/groups/views/GroupCreatorView.tsx @@ -2,7 +2,7 @@ import { GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent } from '@nitr import { FC, useCallback, useEffect, useState } from 'react'; import { HasHabboClub, LocalizeText, SendMessageComposer } from '../../../api'; import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; +import { UseMessageEventHook } from '../../../hooks'; import { IGroupData } from '../common/IGroupData'; import { GroupTabBadgeView } from './tabs/GroupTabBadgeView'; import { GroupTabColorsView } from './tabs/GroupTabColorsView'; @@ -94,31 +94,25 @@ export const GroupCreatorView: FC = props => parser.availableRooms.forEach((name, id) => rooms.push({ id, name })); - BatchUpdates(() => - { - setAvailableRooms(rooms); - setPurchaseCost(parser.groupCost); - }); + setAvailableRooms(rooms); + setPurchaseCost(parser.groupCost); }, []); UseMessageEventHook(GroupBuyDataEvent, onGroupBuyDataEvent); useEffect(() => { - BatchUpdates(() => - { - setCurrentTab(1); + setCurrentTab(1); - setGroupData({ - groupId: -1, - groupName: null, - groupDescription: null, - groupHomeroomId: -1, - groupState: 1, - groupCanMembersDecorate: true, - groupColors: null, - groupBadgeParts: null - }); + setGroupData({ + groupId: -1, + groupName: null, + groupDescription: null, + groupHomeroomId: -1, + groupState: 1, + groupCanMembersDecorate: true, + groupColors: null, + groupBadgeParts: null }); SendMessageComposer(new GroupBuyDataComposer()); diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index 9a43c30c..388d26c3 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -3,7 +3,7 @@ import { GroupAdminGiveComposer, GroupAdminTakeComposer, GroupConfirmMemberRemov import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, GetSessionDataManager, GetUserProfile, LocalizeText, NotificationUtilities, RemoveLinkEventTracker, SendMessageComposer } from '../../../api'; import { Base, Button, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; +import { UseMessageEventHook } from '../../../hooks'; export const GroupMembersView: FC<{}> = props => { @@ -76,12 +76,9 @@ export const GroupMembersView: FC<{}> = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setMembersData(parser); - setLevelId(parser.level); - setTotalPages(Math.ceil(parser.totalMembersCount / parser.pageSize)); - }); + setMembersData(parser); + setLevelId(parser.level); + setTotalPages(Math.ceil(parser.totalMembersCount / parser.pageSize)); }, []); UseMessageEventHook(GroupMembersEvent, onGroupMembersEvent); @@ -111,11 +108,8 @@ export const GroupMembersView: FC<{}> = props => const groupId = (parseInt(parts[1]) || -1); const levelId = (parseInt(parts[2]) || 3); - BatchUpdates(() => - { - setGroupId(groupId); - setLevelId(levelId); - }); + setGroupId(groupId); + setLevelId(levelId); }, []); useEffect(() => @@ -146,14 +140,11 @@ export const GroupMembersView: FC<{}> = props => { if(groupId === -1) return; - BatchUpdates(() => - { - setLevelId(-1); - setMembersData(null); - setTotalPages(0); - setSearchQuery(''); - setRemovingMemberName(null); - }) + setLevelId(-1); + setMembersData(null); + setTotalPages(0); + setSearchQuery(''); + setRemovingMemberName(null); }, [ groupId ]); if((groupId === -1) || !membersData) return null; diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx index dac7f184..a21f55aa 100644 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ b/src/components/groups/views/tabs/GroupTabIdentityView.tsx @@ -2,7 +2,6 @@ import { GroupDeleteComposer, GroupSaveInformationComposer } from '@nitrots/nitr import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; import { CreateLinkEvent, LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../api'; import { Base, Button, Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { IGroupData } from '../../common/IGroupData'; interface GroupTabIdentityViewProps @@ -65,12 +64,9 @@ export const GroupTabIdentityView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupName(groupData.groupName || ''); - setGroupDescription(groupData.groupDescription || ''); - setGroupHomeroomId(groupData.groupHomeroomId); - }); + setGroupName(groupData.groupName || ''); + setGroupDescription(groupData.groupDescription || ''); + setGroupHomeroomId(groupData.groupHomeroomId); }, [ groupData ]); useEffect(() => diff --git a/src/components/groups/views/tabs/GroupTabSettingsView.tsx b/src/components/groups/views/tabs/GroupTabSettingsView.tsx index 3dd8cbef..8ef4adbc 100644 --- a/src/components/groups/views/tabs/GroupTabSettingsView.tsx +++ b/src/components/groups/views/tabs/GroupTabSettingsView.tsx @@ -3,7 +3,6 @@ import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from ' import { SendMessageComposer } from '../../../../api'; import { LocalizeText } from '../../../../api/utils/LocalizeText'; import { Column, Flex, HorizontalRule, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { IGroupData } from '../../common/IGroupData'; const STATES: string[] = [ 'regular', 'exclusive', 'private' ]; @@ -49,11 +48,8 @@ export const GroupTabSettingsView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupState(groupData.groupState); - setGroupDecorate(groupData.groupCanMembersDecorate); - }); + setGroupState(groupData.groupState); + setGroupDecorate(groupData.groupCanMembersDecorate); }, [ groupData ]); useEffect(() => diff --git a/src/components/hotel-view/HotelView.tsx b/src/components/hotel-view/HotelView.tsx index 992782e6..13df886f 100644 --- a/src/components/hotel-view/HotelView.tsx +++ b/src/components/hotel-view/HotelView.tsx @@ -2,7 +2,7 @@ import { FigureUpdateEvent, RoomSessionEvent, UserInfoDataParser, UserInfoEvent import { FC, useCallback, useState } from 'react'; import { GetConfiguration, GetConfigurationManager } from '../../api'; import { LayoutAvatarImageView } from '../../common'; -import { BatchUpdates, UseMessageEventHook, UseRoomSessionManagerEvent } from '../../hooks'; +import { UseMessageEventHook, UseRoomSessionManagerEvent } from '../../hooks'; import { WidgetSlotView } from './views/widgets/WidgetSlotView'; export const HotelView: FC<{}> = props => { @@ -16,11 +16,8 @@ export const HotelView: FC<{}> = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - }); + setUserInfo(parser.userInfo); + setUserFigure(parser.userInfo.figure); }, []); UseMessageEventHook(UserInfoEvent, onUserInfoEvent); diff --git a/src/components/mod-tools/views/room/ModToolsRoomView.tsx b/src/components/mod-tools/views/room/ModToolsRoomView.tsx index c8fd6e65..c16bdc40 100644 --- a/src/components/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/components/mod-tools/views/room/ModToolsRoomView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { SendMessageComposer, TryVisitRoom } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { ModToolsOpenRoomChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; -import { BatchUpdates, DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; interface ModToolsRoomViewProps { @@ -36,15 +36,12 @@ export const ModToolsRoomView: FC = props => if(!parser || parser.data.flatId !== roomId) return; - BatchUpdates(() => - { - setLoadedRoomId(parser.data.flatId); - setName(parser.data.room.name); - setOwnerId(parser.data.ownerId); - setOwnerName(parser.data.ownerName); - setOwnerInRoom(parser.data.ownerInRoom); - setUsersInRoom(parser.data.userCount); - }); + setLoadedRoomId(parser.data.flatId); + setName(parser.data.room.name); + setOwnerId(parser.data.ownerId); + setOwnerName(parser.data.ownerName); + setOwnerInRoom(parser.data.ownerInRoom); + setUsersInRoom(parser.data.userCount); }, [ roomId ]); UseMessageEventHook(ModeratorRoomInfoEvent, onModtoolRoomInfoEvent); diff --git a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx index 72e10ff9..e0c961fa 100644 --- a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx @@ -2,7 +2,7 @@ import { ChatRecordData, GetUserChatlogMessageComposer, UserChatlogEvent } from import { FC, useCallback, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../api'; import { DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; +import { UseMessageEventHook } from '../../../../hooks'; import { ChatlogView } from '../chatlog/ChatlogView'; interface ModToolsUserChatlogViewProps @@ -23,11 +23,8 @@ export const ModToolsUserChatlogView: FC = props = if(!parser || parser.data.userId !== userId) return; - BatchUpdates(() => - { - setUsername(parser.data.username); - setUserChatlog(parser.data.roomChatlogs); - }); + setUsername(parser.data.username); + setUserChatlog(parser.data.roomChatlogs); }, [ userId ]); UseMessageEventHook(UserChatlogEvent, onModtoolUserChatlogEvent); diff --git a/src/components/navigator/NavigatorMessageHandler.tsx b/src/components/navigator/NavigatorMessageHandler.tsx index d99a0cd7..27933279 100644 --- a/src/components/navigator/NavigatorMessageHandler.tsx +++ b/src/components/navigator/NavigatorMessageHandler.tsx @@ -1,7 +1,7 @@ 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, DoorStateType, GetConfiguration, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TryVisitRoom, VisitDesktop } from '../../api'; -import { BatchUpdates, UseMessageEventHook } from '../../hooks'; +import { UseMessageEventHook } from '../../hooks'; import { useNavigatorContext } from './NavigatorContext'; export const NavigatorMessageHandler: FC<{}> = props => @@ -271,49 +271,43 @@ export const NavigatorMessageHandler: FC<{}> = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setTopLevelContexts(parser.topLevelContexts); - setTopLevelContext(parser.topLevelContexts.length ? parser.topLevelContexts[0] : null); - }); + setTopLevelContexts(parser.topLevelContexts); + setTopLevelContext(parser.topLevelContexts.length ? parser.topLevelContexts[0] : null); }, [ setTopLevelContexts, setTopLevelContext ]); const onNavigatorSearchEvent = useCallback((event: NavigatorSearchEvent) => { const parser = event.getParser(); - BatchUpdates(() => + setTopLevelContext(prevValue => { - setTopLevelContext(prevValue => + let newValue = prevValue; + + if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); + + if(!newValue) return null; + + if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) { - let newValue = prevValue; - - if(!newValue) newValue = ((topLevelContexts && topLevelContexts.length && topLevelContexts[0]) || null); - - if(!newValue) return null; - - if((parser.result.code !== newValue.code) && topLevelContexts && topLevelContexts.length) - { - for(const context of topLevelContexts) - { - if(context.code !== parser.result.code) continue; - - newValue = context; - } - } - for(const context of topLevelContexts) { if(context.code !== parser.result.code) continue; newValue = context; } + } - return newValue; - }); + for(const context of topLevelContexts) + { + if(context.code !== parser.result.code) continue; - setSearchResult(parser.result); + newValue = context; + } + + return newValue; }); + + setSearchResult(parser.result); }, [ topLevelContexts, setTopLevelContext, setSearchResult ]); const onNavigatorCategoriesEvent = useCallback((event: NavigatorCategoriesEvent) => diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index 2ed72805..3f57fecd 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -3,7 +3,7 @@ import { ConvertGlobalRoomIdMessageComposer, HabboWebTools, ILinkEventTracker, L import { FC, useCallback, useEffect, useRef, useState } from 'react'; import { AddEventLinkTracker, DoorStateType, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; import { Base, Column, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { BatchUpdates, UseRoomSessionManagerEvent, useSharedNavigatorData } from '../../hooks'; +import { UseRoomSessionManagerEvent, useSharedNavigatorData } from '../../hooks'; import { NavigatorContextProvider } from './NavigatorContext'; import { NavigatorMessageHandler } from './NavigatorMessageHandler'; import { NavigatorDoorStateView } from './views/NavigatorDoorStateView'; @@ -37,11 +37,8 @@ export const NavigatorView: FC<{}> = props => switch(event.type) { case RoomSessionEvent.CREATED: - BatchUpdates(() => - { - setIsVisible(false); - setCreatorOpen(false); - }); + setIsVisible(false); + setCreatorOpen(false); return; } }, []); @@ -96,11 +93,8 @@ export const NavigatorView: FC<{}> = props => switch(parts[1]) { case 'show': { - BatchUpdates(() => - { - setIsVisible(true); - setNeedsSearch(true); - }); + setIsVisible(true); + setNeedsSearch(true); return; } case 'hide': @@ -114,11 +108,8 @@ export const NavigatorView: FC<{}> = props => return; } - BatchUpdates(() => - { - setIsVisible(true); - setNeedsSearch(true); - }); + setIsVisible(true); + setNeedsSearch(true); return; } case 'toggle-room-info': @@ -145,11 +136,8 @@ export const NavigatorView: FC<{}> = props => } return; case 'create': - BatchUpdates(() => - { - setIsVisible(true); - setCreatorOpen(true); - }); + setIsVisible(true); + setCreatorOpen(true); return; case 'search': if(parts.length > 2) @@ -162,11 +150,8 @@ export const NavigatorView: FC<{}> = props => pendingSearch.current = { value: searchValue, code: topLevelContextCode }; - BatchUpdates(() => - { - setIsVisible(true); - setNeedsSearch(true); - }); + setIsVisible(true); + setNeedsSearch(true); } return; } diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx index 7238ed2d..2c9230c2 100644 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -3,7 +3,6 @@ import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer' import { FC, useEffect, useState } from 'react'; import { GetClubMemberLevel, GetConfiguration, IRoomModel, LocalizeText, RoomModels, SendMessageComposer } from '../../../api'; import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common'; -import { BatchUpdates } from '../../../hooks'; import { useNavigatorContext } from '../NavigatorContext'; export const NavigatorRoomCreatorView: FC<{}> = props => @@ -39,11 +38,8 @@ export const NavigatorRoomCreatorView: FC<{}> = props => for(let i = 10; i <= 100; i = i + 10) list.push(i); - BatchUpdates(() => - { - setMaxVisitorsList(list); - setVisitorsCount(list[0]); - }); + setMaxVisitorsList(list); + setVisitorsCount(list[0]); } }, [ maxVisitorsList ]); diff --git a/src/components/navigator/views/NavigatorRoomInfoView.tsx b/src/components/navigator/views/NavigatorRoomInfoView.tsx index 3526855a..b1222ee3 100644 --- a/src/components/navigator/views/NavigatorRoomInfoView.tsx +++ b/src/components/navigator/views/NavigatorRoomInfoView.tsx @@ -5,7 +5,7 @@ import { FC, useEffect, useState } from 'react'; import { CreateLinkEvent, GetGroupInformation, GetSessionDataManager, LocalizeText, SendMessageComposer } from '../../../api'; import { Button, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text, UserProfileIconView } from '../../../common'; import { FloorplanEditorEvent, RoomWidgetThumbnailEvent } from '../../../events'; -import { BatchUpdates, DispatchUiEvent } from '../../../hooks'; +import { DispatchUiEvent } from '../../../hooks'; import { useNavigatorContext } from '../NavigatorContext'; export class NavigatorRoomInfoViewProps @@ -85,11 +85,9 @@ export const NavigatorRoomInfoView: FC = props => { if(!navigatorData) return; - BatchUpdates(() => - { - setIsRoomPicked(navigatorData.currentRoomIsStaffPick); - if(navigatorData.enteredGuestRoom) setIsRoomMuted(navigatorData.enteredGuestRoom.allInRoomMuted); - }); + setIsRoomPicked(navigatorData.currentRoomIsStaffPick); + + if(navigatorData.enteredGuestRoom) setIsRoomMuted(navigatorData.enteredGuestRoom.allInRoomMuted); }, [ navigatorData ]); if(!navigatorData.enteredGuestRoom) return null; diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsAccessTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsAccessTabView.tsx index 657caead..57ae3476 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsAccessTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsAccessTabView.tsx @@ -2,7 +2,6 @@ import { RoomDataParser } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { IRoomData, LocalizeText } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; interface NavigatorRoomSettingsTabViewProps { @@ -26,12 +25,9 @@ export const NavigatorRoomSettingsAccessTabView: FC { - BatchUpdates(() => - { - setPassword(''); - setConfirmPassword(''); - setIsTryingPassword(false); - }); + setPassword(''); + setConfirmPassword(''); + setIsTryingPassword(false); }, [ roomData ]); return ( diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx index 30cb8c23..09175dea 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx @@ -3,7 +3,6 @@ import { RoomDeleteComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { CreateLinkEvent, GetMaxVisitorsList, IRoomData, LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useNavigatorContext } from '../../NavigatorContext'; const ROOM_NAME_MIN_LENGTH = 3; @@ -54,11 +53,8 @@ export const NavigatorRoomSettingsBasicTabView: FC { - BatchUpdates(() => - { - setRoomName(roomData.roomName); - setRoomDescription(roomData.roomDescription); - }); + setRoomName(roomData.roomName); + setRoomDescription(roomData.roomDescription); }, [ roomData ]); return ( diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx index d0d5a6bc..4a5b4d0b 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsView.tsx @@ -2,7 +2,7 @@ import { RoomBannedUsersComposer, RoomDataParser, RoomSettingsEvent, SaveRoomSet import { FC, useCallback, useState } from 'react'; import { IRoomData, LocalizeText, SendMessageComposer } from '../../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; +import { UseMessageEventHook } from '../../../../hooks'; import { NavigatorRoomSettingsAccessTabView } from './NavigatorRoomSettingsAccessTabView'; import { NavigatorRoomSettingsBasicTabView } from './NavigatorRoomSettingsBasicTabView'; import { NavigatorRoomSettingsModTabView } from './NavigatorRoomSettingsModTabView'; @@ -65,11 +65,8 @@ export const NavigatorRoomSettingsView: FC<{}> = props => const close = () => { - BatchUpdates(() => - { - setRoomData(null); - setCurrentTab(TABS[0]); - }); + setRoomData(null); + setCurrentTab(TABS[0]); } const handleChange = (field: string, value: string | number | boolean) => diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx index a0ea64ec..d6beb253 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx @@ -2,7 +2,6 @@ import { RoomDataParser } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useEffect, useState } from 'react'; import { Overlay, Popover } from 'react-bootstrap'; import { Base, NitroCardContentView } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; interface NavigatorSearchResultItemInfoViewProps { @@ -19,19 +18,16 @@ export const NavigatorSearchResultItemInfoView: FC + let visible = false; + + setIsVisible(prevValue => { - let visible = false; + visible = !prevValue; - setIsVisible(prevValue => - { - visible = !prevValue; + return visible; + }); - return visible; - }); - - if(visible) setTarget((event.target as (EventTarget & HTMLElement))); - }) + if(visible) setTarget((event.target as (EventTarget & HTMLElement))); } useEffect(() => diff --git a/src/components/navigator/views/search/NavigatorSearchResultView.tsx b/src/components/navigator/views/search/NavigatorSearchResultView.tsx index ad989646..554b7d27 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultView.tsx @@ -3,7 +3,6 @@ import { NavigatorSearchResultList } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { LocalizeText, NavigatorSearchResultViewDisplayMode } from '../../../../api'; import { AutoGrid, AutoGridProps, Column, Flex, Grid, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { NavigatorSearchResultItemView } from './NavigatorSearchResultItemView'; export interface NavigatorSearchResultViewProps extends AutoGridProps @@ -43,11 +42,8 @@ export const NavigatorSearchResultView: FC = pro { if(!searchResult) return; - BatchUpdates(() => - { - //setIsExtended(searchResult.closed); - setDisplayMode(searchResult.mode); - }); + //setIsExtended(searchResult.closed); + setDisplayMode(searchResult.mode); }, [ searchResult,props ]); const gridHasTwoColumns = (displayMode >= NavigatorSearchResultViewDisplayMode.THUMBNAILS); diff --git a/src/components/navigator/views/search/NavigatorSearchView.tsx b/src/components/navigator/views/search/NavigatorSearchView.tsx index d607be97..c779c07a 100644 --- a/src/components/navigator/views/search/NavigatorSearchView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchView.tsx @@ -2,7 +2,6 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import React, { FC, KeyboardEvent, useEffect, useState } from 'react'; import { INavigatorSearchFilter, LocalizeText, SearchFilterOptions } from '../../../../api'; import { Button, Flex } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useNavigatorContext } from '../../NavigatorContext'; export interface NavigatorSearchViewProps @@ -60,11 +59,8 @@ export const NavigatorSearchView: FC = props => if(!filter) filter = SearchFilterOptions[0]; - BatchUpdates(() => - { - setSearchFilterIndex(SearchFilterOptions.findIndex(option => (option === filter))); - setSearchValue(value); - }); + setSearchFilterIndex(SearchFilterOptions.findIndex(option => (option === filter))); + setSearchValue(value); }, [ searchResult ]); return ( diff --git a/src/components/nitropedia/NitropediaView.tsx b/src/components/nitropedia/NitropediaView.tsx index 017f317b..4b8a0e93 100644 --- a/src/components/nitropedia/NitropediaView.tsx +++ b/src/components/nitropedia/NitropediaView.tsx @@ -2,7 +2,6 @@ import { NitroLogger } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useRef, useState } from 'react'; import { AddEventLinkTracker, GetConfiguration, NotificationUtilities, RemoveLinkEventTracker } from '../../api'; import { Base, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; -import { BatchUpdates } from '../../hooks'; const NEW_LINE_REGEX = /\n\r|\n|\r/mg; @@ -25,25 +24,22 @@ export const NitropediaView: FC<{}> = props => const splitData = text.split(NEW_LINE_REGEX); const line = splitData.shift().split('|'); - BatchUpdates(() => + setHeader(line[0]); + + setDimensions(prevValue => { - setHeader(line[0]); - - setDimensions(prevValue => + if(line[1] && (line[1].split(';').length === 2)) { - if(line[1] && (line[1].split(';').length === 2)) - { - return { - width: parseInt(line[1].split(';')[0]), - height: parseInt(line[1].split(';')[1]) - } + return { + width: parseInt(line[1].split(';')[0]), + height: parseInt(line[1].split(';')[1]) } + } - return null; - }); - - setContent(splitData.join('')); + return null; }); + + setContent(splitData.join('')); } catch (error) diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx index 4cfc01c4..aeed818b 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetAvatarView.tsx @@ -3,7 +3,6 @@ import { RoomControllerLevel, RoomObjectCategory, RoomObjectVariable } from '@ni import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetOwnRoomObject, GetUserProfile, LocalizeText, RoomWidgetMessage, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUserActionMessage } from '../../../../api'; import { Base, Flex } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../context-menu/ContextMenuListItemView'; @@ -208,11 +207,8 @@ export const AvatarInfoWidgetAvatarView: FC = p useEffect(() => { - BatchUpdates(() => - { - setMode(MODE_NORMAL); - setRespectsLeft(userData.respectLeft); - }); + setMode(MODE_NORMAL); + setRespectsLeft(userData.respectLeft); }, [ userData ]); return ( diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx index 4b7d2632..192c0ad4 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetOwnPetView.tsx @@ -1,7 +1,6 @@ import { PetType, RoomObjectCategory, RoomObjectType, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { CreateLinkEvent, GetConfiguration, GetOwnRoomObject, LocalizeText, RoomWidgetMessage, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUserActionMessage } from '../../../../api'; -import { BatchUpdates } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../context-menu/ContextMenuListItemView'; @@ -130,19 +129,16 @@ export const AvatarInfoWidgetOwnPetView: FC = p useEffect(() => { - BatchUpdates(() => + setMode(prevValue => { - setMode(prevValue => - { - if(petData.petType === PetType.MONSTERPLANT) return _Str_10946; - else if(petData.saddle && !petData.rider) return _Str_5818; - else if(petData.rider) return _Str_5938; - - return _Str_2906; - }); - - setRespectsLeft(petData.respectsPetLeft); + if(petData.petType === PetType.MONSTERPLANT) return _Str_10946; + else if(petData.saddle && !petData.rider) return _Str_5818; + else if(petData.rider) return _Str_5938; + + return _Str_2906; }); + + setRespectsLeft(petData.respectsPetLeft); }, [ petData ]); return ( diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx index 3ea427f7..60f19fa3 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetPetView.tsx @@ -1,7 +1,6 @@ import { PetType, RoomControllerLevel, RoomObjectCategory, RoomObjectType, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { GetOwnRoomObject, GetSessionDataManager, LocalizeText, RoomWidgetMessage, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUserActionMessage } from '../../../../api'; -import { BatchUpdates } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../context-menu/ContextMenuListItemView'; @@ -97,19 +96,16 @@ export const AvatarInfoWidgetPetView: FC = props = useEffect(() => { - BatchUpdates(() => + setMode(prevValue => { - setMode(prevValue => - { - if(petData.petType === PetType.MONSTERPLANT) return _Str_13388; - else if(petData.saddle && !petData.rider) return _Str_5818; - else if(petData.rider) return _Str_5938; - - return _Str_2906; - }); - - setRespectsLeft(petData.respectsPetLeft); + if(petData.petType === PetType.MONSTERPLANT) return _Str_13388; + else if(petData.saddle && !petData.rider) return _Str_5818; + else if(petData.rider) return _Str_5938; + + return _Str_2906; }); + + setRespectsLeft(petData.respectsPetLeft); }, [ petData ]); return ( diff --git a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx index 1e3f6717..505bc375 100644 --- a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx @@ -1,7 +1,6 @@ import { FC, MouseEvent, useEffect, useState } from 'react'; import { Overlay, Popover } from 'react-bootstrap'; import { Base, Flex, Grid, NitroCardContentView } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; interface ChatInputStyleSelectorViewProps { @@ -18,28 +17,22 @@ export const ChatInputStyleSelectorView: FC = p const selectStyle = (styleId: number) => { - BatchUpdates(() => - { - selectChatStyleId(styleId); - setSelectorVisible(false); - }); + selectChatStyleId(styleId); + setSelectorVisible(false); } const toggleSelector = (event: MouseEvent) => { - BatchUpdates(() => + let visible = false; + + setSelectorVisible(prevValue => { - let visible = false; + visible = !prevValue; - setSelectorVisible(prevValue => - { - visible = !prevValue; + return visible; + }); - return visible; - }); - - if(visible) setTarget((event.target as (EventTarget & HTMLElement))); - }) + if(visible) setTarget((event.target as (EventTarget & HTMLElement))); } useEffect(() => diff --git a/src/components/room/widgets/chat-input/ChatInputView.tsx b/src/components/room/widgets/chat-input/ChatInputView.tsx index a6e42296..8f223088 100644 --- a/src/components/room/widgets/chat-input/ChatInputView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { GetClubMemberLevel, GetConfiguration, GetSessionDataManager, LocalizeText, RoomWidgetChatMessage, RoomWidgetChatTypingMessage, RoomWidgetFloodControlEvent, RoomWidgetUpdateChatInputContentEvent, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; import { Text } from '../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ChatInputStyleSelectorView } from './ChatInputStyleSelectorView'; @@ -211,11 +211,8 @@ export const ChatInputView: FC<{}> = props => const onRoomWidgetFloodControlEvent = useCallback((event: RoomWidgetFloodControlEvent) => { - BatchUpdates(() => - { - setFloodBlocked(true); - setFloodBlockedSeconds(event.seconds); - }); + setFloodBlocked(true); + setFloodBlockedSeconds(event.seconds); }, []); UseEventDispatcherHook(RoomWidgetFloodControlEvent.FLOOD_CONTROL, eventDispatcher, onRoomWidgetFloodControlEvent); diff --git a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx index 3cc39885..f66abafc 100644 --- a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx @@ -1,7 +1,7 @@ import { SecurityLevel } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; import { GetSessionDataManager, LocalizeText, RoomObjectItem, RoomWidgetChooserContentEvent, RoomWidgetRequestWidgetMessage, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ChooserWidgetView } from './ChooserWidgetView'; @@ -26,11 +26,8 @@ export const FurniChooserWidgetView: FC<{}> = props => const onRoomWidgetChooserContentEvent = useCallback((event: RoomWidgetChooserContentEvent) => { - BatchUpdates(() => - { - setItems(event.items); - setIsVisible(true); - }); + setItems(event.items); + setIsVisible(true); }, []); UseEventDispatcherHook(RoomWidgetChooserContentEvent.FURNI_CHOOSER_CONTENT, eventDispatcher, onRoomWidgetChooserContentEvent); @@ -53,11 +50,8 @@ export const FurniChooserWidgetView: FC<{}> = props => const close = useCallback(() => { - BatchUpdates(() => - { - setIsVisible(false); - setItems(null); - }); + setIsVisible(false); + setItems(null); }, []); if(!items) return null; diff --git a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx index 289e2caf..10ae08c2 100644 --- a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx @@ -1,6 +1,6 @@ import { FC, useCallback, useState } from 'react'; import { LocalizeText, RoomObjectItem, RoomWidgetChooserContentEvent, RoomWidgetRequestWidgetMessage, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { ChooserWidgetView } from './ChooserWidgetView'; @@ -25,11 +25,8 @@ export const UserChooserWidgetView: FC<{}> = props => const onRoomWidgetChooserContentEvent = useCallback((event: RoomWidgetChooserContentEvent) => { - BatchUpdates(() => - { - setItems(event.items); - setIsVisible(true); - }); + setItems(event.items); + setIsVisible(true); }, []); UseEventDispatcherHook(RoomWidgetChooserContentEvent.USER_CHOOSER_CONTENT, eventDispatcher, onRoomWidgetChooserContentEvent); @@ -52,11 +49,8 @@ export const UserChooserWidgetView: FC<{}> = props => const close = useCallback(() => { - BatchUpdates(() => - { - setIsVisible(false); - setItems(null); - }); + setIsVisible(false); + setItems(null); }, []); if(!isVisible) return null; diff --git a/src/components/room/widgets/context-menu/ContextMenuView.tsx b/src/components/room/widgets/context-menu/ContextMenuView.tsx index c20ba1ff..dbccaf75 100644 --- a/src/components/room/widgets/context-menu/ContextMenuView.tsx +++ b/src/components/room/widgets/context-menu/ContextMenuView.tsx @@ -2,7 +2,6 @@ import { FixedSizeStack, NitroPoint, NitroRectangle, RoomObjectType } from '@nit import { CSSProperties, FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { GetNitroInstance, GetRoomEngine, GetRoomObjectBounds, GetRoomSession, GetTicker } from '../../../../api'; import { Base, BaseProps } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; interface ContextMenuViewProps extends BaseProps { @@ -102,11 +101,8 @@ export const ContextMenuView: FC = props => if(y < SPACE_AROUND_EDGES) y = SPACE_AROUND_EDGES; else if(y > maxTop) y = maxTop; - BatchUpdates(() => - { - setCurrentDeltaY(maxStack); - setPos({ x, y }); - }); + setCurrentDeltaY(maxStack); + setPos({ x, y }); }, [ deltaYStack, currentDeltaY, getOffset ]); const update = useCallback((time: number) => @@ -145,11 +141,8 @@ export const ContextMenuView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setDeltaYStack(new FixedSizeStack(LOCATION_STACK_SIZE)); - setCurrentDeltaY(-1000000); - }); + setDeltaYStack(new FixedSizeStack(LOCATION_STACK_SIZE)); + setCurrentDeltaY(-1000000); }, []); useEffect(() => diff --git a/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx b/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx index 48a9b096..cf88c433 100644 --- a/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx +++ b/src/components/room/widgets/doorbell/DoorbellWidgetView.tsx @@ -1,7 +1,7 @@ import { FC, useCallback, useState } from 'react'; import { LocalizeText, RoomWidgetDoorbellEvent, RoomWidgetLetUserInMessage } from '../../../../api'; import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; export const DoorbellWidgetView: FC<{}> = props => @@ -14,11 +14,8 @@ export const DoorbellWidgetView: FC<{}> = props => { if(users.indexOf(userName) >= 0) return; - BatchUpdates(() => - { - setUsers([ ...users, userName ]); - setIsVisible(true); - }); + setUsers([ ...users, userName ]); + setIsVisible(true); }, [ users ]); const removeUser = useCallback((userName: string) => diff --git a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx b/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx index a0b09924..28b21e0e 100644 --- a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx +++ b/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { GetRoomEngine, GetSessionDataManager, LocalizeText, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SendMessageComposer } from '../../../../../api'; import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; +import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; export const FurnitureBackgroundColorView: FC<{}> = props => @@ -36,13 +36,10 @@ export const FurnitureBackgroundColorView: FC<{}> = props => const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); const model = roomObject.model; - BatchUpdates(() => - { - setObjectId(roomObject.id); - setHue(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE))); - setSaturation(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION))); - setLightness(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS))); - }); + setObjectId(roomObject.id); + setHue(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE))); + setSaturation(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION))); + setLightness(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS))); return; } diff --git a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx index 2bb70ff2..6c44abc4 100644 --- a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx +++ b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx @@ -1,7 +1,7 @@ import { ContextMenuEnum, GroupFurniContextMenuInfoMessageEvent, GroupFurniContextMenuInfoMessageParser, RoomEngineTriggerWidgetEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; import { GetGroupInformation, GetRoomEngine, IsOwnerOfFurniture, LocalizeText, RoomWidgetFurniActionMessage, TryJoinGroup, TryVisitRoom } from '../../../../../api'; -import { BatchUpdates, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; +import { UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView'; @@ -27,13 +27,10 @@ export const FurnitureContextMenuView: FC<{}> = props => const close = useCallback(() => { - BatchUpdates(() => - { - setObjectId(-1); - setGroupData(null); - setIsGroupMember(false); - setMode(null); - }); + setObjectId(-1); + setGroupData(null); + setIsGroupMember(false); + setMode(null); }, []); const closeConfirm = () => @@ -53,60 +50,48 @@ export const FurnitureContextMenuView: FC<{}> = props => case RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: if(!IsOwnerOfFurniture(object)) return; - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - }); + setConfirmingObjectId(object.id); + setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); close(); return; case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG: if(!IsOwnerOfFurniture(object)) return; - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(EFFECTBOX_OPEN); - }); + setConfirmingObjectId(object.id); + setConfirmMode(EFFECTBOX_OPEN); close(); return; case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: if(!IsOwnerOfFurniture(object)) return; - BatchUpdates(() => - { - setConfirmingObjectId(object.id); - setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - }); + setConfirmingObjectId(object.id); + setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); close(); return; case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: - BatchUpdates(() => - { - setObjectId(object.id); + setObjectId(object.id); - switch(event.contextMenu) - { - case ContextMenuEnum.FRIEND_FURNITURE: - setMode(ContextMenuEnum.FRIEND_FURNITURE); - return; - case ContextMenuEnum.MONSTERPLANT_SEED: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED); - return; - case ContextMenuEnum.MYSTERY_BOX: - return; - case ContextMenuEnum.RANDOM_TELEPORT: - setMode(ContextMenuEnum.RANDOM_TELEPORT); - return; - case ContextMenuEnum.PURCHASABLE_CLOTHING: - if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING); - return; - } - }); + switch(event.contextMenu) + { + case ContextMenuEnum.FRIEND_FURNITURE: + setMode(ContextMenuEnum.FRIEND_FURNITURE); + return; + case ContextMenuEnum.MONSTERPLANT_SEED: + if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED); + return; + case ContextMenuEnum.MYSTERY_BOX: + return; + case ContextMenuEnum.RANDOM_TELEPORT: + setMode(ContextMenuEnum.RANDOM_TELEPORT); + return; + case ContextMenuEnum.PURCHASABLE_CLOTHING: + if(IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING); + return; + } return; case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: @@ -125,13 +110,10 @@ export const FurnitureContextMenuView: FC<{}> = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setObjectId(parser.objectId); - setGroupData(parser); - setIsGroupMember(parser.userIsMember); - setMode(GROUP_FURNITURE); - }); + setObjectId(parser.objectId); + setGroupData(parser); + setIsGroupMember(parser.userIsMember); + setMode(GROUP_FURNITURE); }, []); UseMessageEventHook(GroupFurniContextMenuInfoMessageEvent, onGroupFurniContextMenuInfoMessageEvent); diff --git a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx b/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx index 9aa2fb4f..694a9c4a 100644 --- a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx +++ b/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, RoomWidgetUpdateCustomStackHeightEvent, SendMessageComposer } from '../../../../../api'; import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; +import { UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; const MAX_HEIGHT: number = 40; @@ -17,11 +17,8 @@ export const FurnitureCustomStackHeightView: FC<{}> = props => const close = () => { - BatchUpdates(() => - { - setObjectId(-1); - setHeight(0); - }); + setObjectId(-1); + setHeight(0); } const updateHeight = useCallback((height: number, fromServer: boolean = false) => @@ -32,12 +29,9 @@ export const FurnitureCustomStackHeightView: FC<{}> = props => if(!fromServer) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); - BatchUpdates(() => - { - setHeight(parseFloat(height.toFixed(2))); + setHeight(parseFloat(height.toFixed(2))); - if(!fromServer) setPendingHeight(height * 100); - }); + if(!fromServer) setPendingHeight(height * 100); }, []); const onRoomWidgetUpdateCustomStackHeightEvent = useCallback((event: RoomWidgetUpdateCustomStackHeightEvent) => diff --git a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx b/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx index e02de668..1e0dbce3 100644 --- a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx +++ b/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx @@ -4,7 +4,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import ReactSlider from 'react-slider'; import { ColorUtils, GetConfiguration, LocalizeText, RoomWidgetDimmerChangeStateMessage, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent } from '../../../../../api'; import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { DimmerFurnitureWidgetPresetItem } from './DimmerFurnitureWidgetPresetItem'; @@ -39,12 +39,9 @@ export const FurnitureDimmerView: FC<{}> = props => for(const preset of widgetEvent.presets) presets.push(new DimmerFurnitureWidgetPresetItem(preset.id, preset.type, preset.color, preset.brightness)); - BatchUpdates(() => - { - setPresets(presets); - setSelectedPresetId(widgetEvent.selectedPresetId); - setIsVisible(true); - }); + setPresets(presets); + setSelectedPresetId(widgetEvent.selectedPresetId); + setIsVisible(true); return; } case RoomWidgetUpdateDimmerEvent.HIDE: { @@ -55,18 +52,15 @@ export const FurnitureDimmerView: FC<{}> = props => case RoomWidgetUpdateDimmerStateEvent.DIMMER_STATE: { const widgetEvent = (event as RoomWidgetUpdateDimmerStateEvent); - BatchUpdates(() => - { - setLastDimmerState(dimmerState); - setDimmerState(widgetEvent.state); - setSelectedPresetId(widgetEvent.presetId); - setEffectId(widgetEvent.effectId); - setSelectedEffectId(widgetEvent.effectId); - setColor(widgetEvent.color); - setSelectedColor(widgetEvent.color); - setBrightness(widgetEvent.brightness); - setSelectedBrightness(widgetEvent.brightness); - }); + setLastDimmerState(dimmerState); + setDimmerState(widgetEvent.state); + setSelectedPresetId(widgetEvent.presetId); + setEffectId(widgetEvent.effectId); + setSelectedEffectId(widgetEvent.effectId); + setColor(widgetEvent.color); + setSelectedColor(widgetEvent.color); + setBrightness(widgetEvent.brightness); + setSelectedBrightness(widgetEvent.brightness); return; } @@ -82,14 +76,11 @@ export const FurnitureDimmerView: FC<{}> = props => const preset = presets[(id - 1)]; if(!preset) return; - - BatchUpdates(() => - { - setSelectedPresetId(preset.id); - setSelectedEffectId(preset.type); - setSelectedColor(preset.color); - setSelectedBrightness(preset.light); - }); + + setSelectedPresetId(preset.id); + setSelectedEffectId(preset.type); + setSelectedColor(preset.color); + setSelectedBrightness(preset.light); }, [ presets ]); const close = useCallback(() => diff --git a/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx b/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx index 7c2ac8c2..e2a3b041 100644 --- a/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx +++ b/src/components/room/widgets/furniture/exchange-credit/FurnitureExchangeCreditView.tsx @@ -1,7 +1,7 @@ import { FC, useCallback, useState } from 'react'; import { LocalizeText, RoomWidgetCreditFurniRedeemMessage, RoomWidgetUpdateCreditFurniEvent } from '../../../../../api'; import { Base, Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; export const FurnitureExchangeCreditView: FC<{}> = props => @@ -12,22 +12,16 @@ export const FurnitureExchangeCreditView: FC<{}> = props => const onRoomWidgetUpdateCreditFurniEvent = useCallback((event: RoomWidgetUpdateCreditFurniEvent) => { - BatchUpdates(() => - { - setObjectId(event.objectId); - setValue(event.value); - }); + setObjectId(event.objectId); + setValue(event.value); }, []); UseEventDispatcherHook(RoomWidgetUpdateCreditFurniEvent.CREDIT_FURNI_UPDATE, eventDispatcher, onRoomWidgetUpdateCreditFurniEvent); const close = () => { - BatchUpdates(() => - { - setObjectId(-1); - setValue(0); - }); + setObjectId(-1); + setValue(0); } const redeem = () => diff --git a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx b/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx index 65e192b6..f7e197cb 100644 --- a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx +++ b/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx @@ -1,7 +1,7 @@ import { FC, useCallback, useState } from 'react'; import { IPhotoData, LocalizeText, RoomWidgetUpdateExternalImageEvent } from '../../../../../api'; import { Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; export const FurnitureExternalImageView: FC<{}> = props => @@ -20,14 +20,10 @@ export const FurnitureExternalImageView: FC<{}> = props => { switch(event.type) { - case RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE: { - - BatchUpdates(() => - { - setObjectId(event.objectId); - setPhotoData(event.photoData); - }); - } + case RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE: + setObjectId(event.objectId); + setPhotoData(event.photoData); + return; } }, []); diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx index d0f99869..c476b59d 100644 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx +++ b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx @@ -2,7 +2,7 @@ import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, Love import { FC, useCallback, useState } from 'react'; import { GetRoomEngine, GetRoomSession, LocalizeText, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; import { DraggableWindow, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; +import { UseEventDispatcherHook, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { FurnitureEngravingLockData } from './FriendFurniLockData'; @@ -30,11 +30,8 @@ export const FurnitureFriendFurniView: FC<{}> = props => { if(data.length !== 6) return; - BatchUpdates(() => - { - setEngravingLockData(new FurnitureEngravingLockData(widgetEvent.objectId, widgetEvent.category, type, [ data[1], data[2] ], [ data[3], data[4] ], data[5])); - setEngravingStage(0); - }); + setEngravingLockData(new FurnitureEngravingLockData(widgetEvent.objectId, widgetEvent.category, type, [ data[1], data[2] ], [ data[3], data[4] ], data[5])); + setEngravingStage(0); } return; } @@ -59,11 +56,8 @@ export const FurnitureFriendFurniView: FC<{}> = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setEngravingLockData(new FurnitureEngravingLockData(parser.furniId)); - setEngravingStage(parser.start ? 1 : 2); - }); + setEngravingLockData(new FurnitureEngravingLockData(parser.furniId)); + setEngravingStage(parser.start ? 1 : 2); }, []); UseMessageEventHook(LoveLockFurniStartEvent, onLoveLockFurniStartEvent); diff --git a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx b/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx index da7792cf..8d30018d 100644 --- a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx +++ b/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx @@ -2,7 +2,6 @@ import { RoomObjectCategory, RoomObjectOperationType } from '@nitrots/nitro-rend import { FC, useCallback, useMemo, useState } from 'react'; import { CreateLinkEvent, GetRoomEngine, GetSessionDataManager, LocalizeText, ProductTypeEnum, RoomWidgetPresentOpenMessage, RoomWidgetUpdatePresentDataEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; import { Button, Column, Flex, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates } from '../../../../../hooks'; import { UseEventDispatcherHook } from '../../../../../hooks/events/UseEventDispatcherHook'; import { useRoomContext } from '../../../RoomContext'; @@ -49,16 +48,13 @@ export const FurnitureGiftOpeningView: FC<{}> = props => switch(event.type) { case RoomWidgetUpdatePresentDataEvent.PACKAGEINFO: { - BatchUpdates(() => - { - setOpenRequested(false); - setObjectId(event.objectId); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setSenderName(event.purchaserName); - setSenderFigure(event.purchaserFigure); - setImageUrl(event.imageUrl); - }); + setOpenRequested(false); + setObjectId(event.objectId); + setText(event.giftMessage); + setIsOwnerOfFurniture(event.isController); + setSenderName(event.purchaserName); + setSenderFigure(event.purchaserFigure); + setImageUrl(event.imageUrl); return; } case RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR: @@ -70,47 +66,38 @@ export const FurnitureGiftOpeningView: FC<{}> = props => else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE) imageType = 'packagecard_icon_landscape'; else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER) imageType = 'packagecard_icon_wallpaper'; - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(getGiftImageUrl(imageType)); - }); + setObjectId(event.objectId); + setClassId(event.classId); + setItemType(event.itemType); + setText(event.giftMessage); + setIsOwnerOfFurniture(event.isController); + setPlacedItemId(event.placedItemId); + setPlacedItemType(event.placedItemType); + setPlacedInRoom(event.placedInRoom); + setImageUrl(getGiftImageUrl(imageType)); return; } case RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB: { - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setImageUrl(getGiftImageUrl('packagecard_icon_hc')); - }); + setObjectId(event.objectId); + setClassId(event.classId); + setItemType(event.itemType); + setText(event.giftMessage); + setIsOwnerOfFurniture(event.isController); + setImageUrl(getGiftImageUrl('packagecard_icon_hc')); return; } case RoomWidgetUpdatePresentDataEvent.CONTENTS: { if(!openRequested) return; - BatchUpdates(() => - { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(event.imageUrl); - }); + setObjectId(event.objectId); + setClassId(event.classId); + setItemType(event.itemType); + setText(event.giftMessage); + setIsOwnerOfFurniture(event.isController); + setPlacedItemId(event.placedItemId); + setPlacedItemType(event.placedItemType); + setPlacedInRoom(event.placedInRoom); + setImageUrl(event.imageUrl); return; } case RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE: { @@ -143,15 +130,12 @@ export const FurnitureGiftOpeningView: FC<{}> = props => const close = useCallback(() => { - BatchUpdates(() => - { - setObjectId(-1); - setOpenRequested(false); - setPlacedItemId(-1); - setPlacedInRoom(false); - setText(null); - setIsOwnerOfFurniture(false); - }); + setObjectId(-1); + setOpenRequested(false); + setPlacedItemId(-1); + setPlacedInRoom(false); + setText(null); + setIsOwnerOfFurniture(false); }, []); const isSpaces = useMemo(() => diff --git a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx index 3a54ed02..7d7777e7 100644 --- a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx +++ b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx @@ -2,7 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomObjectOperationType } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { ProcessRoomObjectOperation, RoomWidgetUpdateDecorateModeEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { ObjectLocationView } from '../../object-location/ObjectLocationView'; @@ -33,33 +33,24 @@ export const FurnitureManipulationMenuView: FC<{}> = props => switch(event.type) { case RoomWidgetUpdateRoomObjectEvent.OBJECT_REQUEST_MANIPULATION: { - BatchUpdates(() => - { - setIsVisible(true); - setObjectId(event.id); - setObjectType(event.category); - }); + setIsVisible(true); + setObjectId(event.id); + setObjectType(event.category); return; } case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { if(event.id === objectId) { - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); + setIsVisible(false); + setObjectId(-1); + setObjectType(-1); } return; } case RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED: { - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); + setIsVisible(false); + setObjectId(-1); + setObjectType(-1); return; } } @@ -74,12 +65,9 @@ export const FurnitureManipulationMenuView: FC<{}> = props => moveFurniture(); - BatchUpdates(() => - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }); + setIsVisible(false); + setObjectId(-1); + setObjectType(-1); }, [ moveFurniture ]); UseEventDispatcherHook(RoomWidgetUpdateDecorateModeEvent.UPDATE_DECORATE, eventDispatcher, onRoomWidgetUpdateDecorateModeEvent); diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx index 7d6c983d..fa7f32e7 100644 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx +++ b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx @@ -2,7 +2,7 @@ import { AvatarFigurePartType, FurnitureMannequinSaveLookComposer, FurnitureMann import { FC, KeyboardEvent, useCallback, useEffect, useState } from 'react'; import { GetAvatarRenderManager, GetClubMemberLevel, GetSessionDataManager, LocalizeText, RoomWidgetUpdateMannequinEvent, SendMessageComposer } from '../../../../../api'; import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; const MODE_NONE: number = -1; @@ -43,33 +43,30 @@ export const FurnitureMannequinView: FC<{}> = props => const figureContainer = GetAvatarRenderManager().createFigureContainer(event.figure); const figureClubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, event.gender, MANNEQUIN_CLOTHING_PART_TYPES); - BatchUpdates(() => + setObjectId(event.objectId); + setFigure(event.figure); + setGender(event.gender); + setName(event.name); + setClubLevel(figureClubLevel); + + if(roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator) { - setObjectId(event.objectId); - setFigure(event.figure); - setGender(event.gender); - setName(event.name); - setClubLevel(figureClubLevel); + setMode(MODE_CONTROLLER); + } - if(roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator) - { - setMode(MODE_CONTROLLER); - } + else if(GetSessionDataManager().gender.toLowerCase() !== event.gender.toLowerCase()) + { + setMode(MODE_WRONG_GENDER); + } - else if(GetSessionDataManager().gender.toLowerCase() !== event.gender.toLowerCase()) - { - setMode(MODE_WRONG_GENDER); - } - - else if(GetClubMemberLevel() < figureClubLevel) - { - setMode(MODE_NO_CLUB); - } - else - { - setMode(MODE_PEER); - } - }); + else if(GetClubMemberLevel() < figureClubLevel) + { + setMode(MODE_NO_CLUB); + } + else + { + setMode(MODE_PEER); + } }, [ roomSession ]); UseEventDispatcherHook(RoomWidgetUpdateMannequinEvent.MANNEQUIN_UPDATE, eventDispatcher, onRoomWidgetUpdateMannequinEvent); @@ -136,11 +133,8 @@ export const FurnitureMannequinView: FC<{}> = props => transformAsMannequinFigure(figureContainer); - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - }); + setRenderedFigure(figureContainer.getFigureString()); + setRenderedClubLevel(clubLevel); break; } case MODE_UPDATE: { @@ -148,22 +142,16 @@ export const FurnitureMannequinView: FC<{}> = props => transformAsMannequinFigure(figureContainer); - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(GetAvatarRenderManager().getFigureClubLevel(figureContainer, GetSessionDataManager().gender, MANNEQUIN_CLOTHING_PART_TYPES)); - }); + setRenderedFigure(figureContainer.getFigureString()); + setRenderedClubLevel(GetAvatarRenderManager().getFigureClubLevel(figureContainer, GetSessionDataManager().gender, MANNEQUIN_CLOTHING_PART_TYPES)); break; } case MODE_PEER: case MODE_NO_CLUB: { const figureContainer = getMergedFigureContainer(GetSessionDataManager().figure, figure); - BatchUpdates(() => - { - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - }); + setRenderedFigure(figureContainer.getFigureString()); + setRenderedClubLevel(clubLevel); break; } } diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx index aa57211a..650b8a6d 100644 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx +++ b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useMemo, useState } from 'react'; import YouTube, { Options } from 'react-youtube'; import { FurnitureYoutubeDisplayWidgetHandler, LocalizeText, RoomWidgetUpdateYoutubeDisplayEvent, SendMessageComposer } from '../../../../../api'; import { Grid, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; +import { UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; import { useRoomContext } from '../../../RoomContext'; import { YoutubeVideoPlaybackStateEnum } from './utils/YoutubeVideoPlaybackStateEnum'; @@ -53,13 +53,10 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => if(objectId !== parser.furniId) return; - BatchUpdates(() => - { - setVideoId(parser.videoId); - setVideoStart(parser.startAtSeconds); - setVideoEnd(parser.endAtSeconds); - setCurrentVideoState(parser.state); - }); + setVideoId(parser.videoId); + setVideoStart(parser.startAtSeconds); + setVideoEnd(parser.endAtSeconds); + setCurrentVideoState(parser.state); }, [ objectId ]); const onPlaylists = useCallback((event: YoutubeDisplayPlaylistsEvent) => @@ -70,15 +67,12 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => if(objectId !== parser.furniId) return; - BatchUpdates(() => - { - setPlaylists(parser.playlists); - setSelectedItem(parser.selectedPlaylistId); - setVideoId(null); - setCurrentVideoState(-1); - setVideoEnd(null); - setVideoStart(null); - }); + setPlaylists(parser.playlists); + setSelectedItem(parser.selectedPlaylistId); + setVideoId(null); + setCurrentVideoState(-1); + setVideoEnd(null); + setVideoStart(null); }, [ objectId ]); const onControlVideo = useCallback((event: YoutubeControlVideoMessageEvent) => diff --git a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx index 48d4f979..39e2f723 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetFurniView.tsx @@ -3,7 +3,7 @@ import { CrackableDataType, GroupInformationComposer, GroupInformationEvent, Roo import { FC, useCallback, useEffect, useState } from 'react'; import { CreateLinkEvent, GetGroupInformation, GetRoomEngine, LocalizeText, RoomWidgetFurniActionMessage, RoomWidgetUpdateInfostandFurniEvent, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, LayoutBadgeImageView, LayoutLimitedEditionCompactPlateView, LayoutRarityLevelView, Text, UserProfileIconView } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../../hooks'; +import { UseMessageEventHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; interface InfoStandWidgetFurniViewProps @@ -129,23 +129,20 @@ export const InfoStandWidgetFurniView: FC = props if(furniData.isStickie) pickupMode = PICKUP_MODE_NONE; - BatchUpdates(() => - { - setPickupMode(pickupMode); - setCanMove(canMove); - setCanRotate(canRotate); - setCanUse(canUse); - setFurniKeys(furniKeyss); - setFurniValues(furniValuess); - setCustomKeys(customKeyss); - setCustomValues(customValuess); - setIsCrackable(isCrackable); - setCrackableHits(crackableHits); - setCrackableTarget(crackableTarget); - setGodMode(godMode); - setCanSeeFurniId(canSeeFurniId); - setGroupName(null); - }); + setPickupMode(pickupMode); + setCanMove(canMove); + setCanRotate(canRotate); + setCanUse(canUse); + setFurniKeys(furniKeyss); + setFurniValues(furniValuess); + setCustomKeys(customKeyss); + setCustomValues(customValuess); + setIsCrackable(isCrackable); + setCrackableHits(crackableHits); + setCrackableTarget(crackableTarget); + setGodMode(godMode); + setCanSeeFurniId(canSeeFurniId); + setGroupName(null); if(furniData.groupId) SendMessageComposer(new GroupInformationComposer(furniData.groupId, false)); }, [ roomSession, furniData ]); diff --git a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx index 476cac89..c2f406f4 100644 --- a/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx +++ b/src/components/room/widgets/infostand/InfoStandWidgetUserView.tsx @@ -3,7 +3,7 @@ import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomS import { Dispatch, FC, FocusEvent, KeyboardEvent, SetStateAction, useCallback, useEffect, useState } from 'react'; import { CloneObject, GetConfiguration, GetGroupInformation, GetSessionDataManager, GetUserProfile, LocalizeText, RoomWidgetChangeMottoMessage, RoomWidgetUpdateInfostandUserEvent, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text, UserProfileIconView } from '../../../../common'; -import { BatchUpdates, UseEventDispatcherHook, UseMessageEventHook } from '../../../../hooks'; +import { UseEventDispatcherHook, UseMessageEventHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { InfoStandWidgetUserRelationshipsView } from './InfoStandWidgetUserRelationshipsView'; @@ -113,22 +113,16 @@ export const InfoStandWidgetUserView: FC = props = useEffect(() => { - BatchUpdates(() => - { - setIsEditingMotto(false); - setMotto(userData.motto); - }); + setIsEditingMotto(false); + setMotto(userData.motto); SendMessageComposer(new UserRelationshipsComposer(userData.webID)); return () => { - BatchUpdates(() => - { - setIsEditingMotto(false); - setMotto(null); - setRelationships(null); - }); + setIsEditingMotto(false); + setMotto(null); + setRelationships(null); } }, [ userData ]); diff --git a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx index 094b1533..e765e948 100644 --- a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx +++ b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx @@ -3,7 +3,7 @@ import classNames from 'classnames'; import { FC, useCallback, useEffect, useState } from 'react'; import { CreateLinkEvent, LocalizeText, RoomWidgetZoomToggleMessage, SendMessageComposer } from '../../../../api'; import { Base, Column, Flex, Text, TransitionAnimation, TransitionAnimationTypes } from '../../../../common'; -import { BatchUpdates, UseMessageEventHook, useSharedNavigatorData } from '../../../../hooks'; +import { UseMessageEventHook, useSharedNavigatorData } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; export const RoomToolsWidgetView: FC<{}> = props => @@ -46,12 +46,9 @@ export const RoomToolsWidgetView: FC<{}> = props => if(!parser.roomEnter) return; - BatchUpdates(() => - { - if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); - if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); - if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); - }); + if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); + if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); + if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); }, [ roomName, roomOwner, roomTags ]); UseMessageEventHook(GetGuestRoomResultEvent, onGetGuestRoomResultEvent); diff --git a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx index a9eab9e6..ff40429b 100644 --- a/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx +++ b/src/components/room/widgets/word-quiz/WordQuizWidgetView.tsx @@ -1,7 +1,7 @@ import { IQuestion } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { RoomWidgetPollMessage, RoomWidgetWordQuizUpdateEvent } from '../../../../api'; -import { BatchUpdates, UseEventDispatcherHook } from '../../../../hooks'; +import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; import { VALUE_KEY_DISLIKE, VALUE_KEY_LIKE, VoteValue } from './common/VoteValue'; import { WordQuizQuestionView } from './WordQuizQuestionView'; @@ -31,27 +31,24 @@ export const WordQuizWidgetView: FC<{}> = props => switch(event.type) { case RoomWidgetWordQuizUpdateEvent.NEW_QUESTION: - BatchUpdates(() => + setPollId(event.id); + setQuestion(event.question); + setAnswerSent(false); + setAnswerCounts(new Map()); + setUserAnswers(new Map()); + + setQuestionClearTimeout(prevValue => { - setPollId(event.id); - setQuestion(event.question); - setAnswerSent(false); - setAnswerCounts(new Map()); - setUserAnswers(new Map()); + if(prevValue) clearTimeout(prevValue); - setQuestionClearTimeout(prevValue => + if(event.duration > 0) { - if(prevValue) clearTimeout(prevValue); + const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; - if(event.duration > 0) - { - const delay = event.duration < 1000 ? DEFAULT_DISPLAY_DELAY : event.duration; - - return setTimeout(() => clearQuestion(), delay) as unknown as number; - } - - return null; - }); + return setTimeout(() => clearQuestion(), delay) as unknown as number; + } + + return null; }); break; case RoomWidgetWordQuizUpdateEvent.QUESTION_ANSWERED: { @@ -59,40 +56,34 @@ export const WordQuizWidgetView: FC<{}> = props => if(!userData) return; - BatchUpdates(() => + setAnswerCounts(event.answerCounts); + + setUserAnswers(prevValue => { - setAnswerCounts(event.answerCounts); - - setUserAnswers(prevValue => + if(!prevValue.has(userData.roomIndex)) { - if(!prevValue.has(userData.roomIndex)) - { - const newValue = new Map(userAnswers); + const newValue = new Map(userAnswers); - newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); + newValue.set(userData.roomIndex, { value: event.value, secondsLeft: SIGN_FADE_DELAY }); - return newValue; - } + return newValue; + } - return prevValue; - }); + return prevValue; }); break; } case RoomWidgetWordQuizUpdateEvent.QUESTION_FINISHED: if(question && question.id === event.questionId) { - BatchUpdates(() => + setAnswerCounts(event.answerCounts); + setAnswerSent(true); + + setQuestionClearTimeout(prevValue => { - setAnswerCounts(event.answerCounts); - setAnswerSent(true); + if(prevValue) clearTimeout(prevValue); - setQuestionClearTimeout(prevValue => - { - if(prevValue) clearTimeout(prevValue); - - return setTimeout(() => clearQuestion(), DEFAULT_DISPLAY_DELAY) as unknown as number; - }); + return setTimeout(() => clearQuestion(), DEFAULT_DISPLAY_DELAY) as unknown as number; }); } diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index c502baed..59c0377d 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -3,7 +3,7 @@ import { FC, useCallback, useState } from 'react'; import { CreateLinkEvent, GetSessionDataManager, GetUserProfile, OpenMessengerChat, VisitDesktop } from '../../api'; import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; import { AchievementsUIUnseenCountEvent, FriendsEvent, FriendsMessengerIconEvent, FriendsRequestCountEvent, GuideToolEvent, ModToolsEvent, UserSettingsUIEvent } from '../../events'; -import { BatchUpdates, DispatchUiEvent, useInventoryUnseenTracker, UseMessageEventHook, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; +import { DispatchUiEvent, useInventoryUnseenTracker, UseMessageEventHook, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; import { ToolbarViewItems } from './common/ToolbarViewItems'; import { ToolbarMeView } from './ToolbarMeView'; @@ -34,11 +34,8 @@ export const ToolbarView: FC = props => { const parser = event.getParser(); - BatchUpdates(() => - { - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - }); + setUserInfo(parser.userInfo); + setUserFigure(parser.userInfo.figure); }, []); UseMessageEventHook(UserInfoEvent, onUserInfoEvent); diff --git a/src/components/user-profile/UserProfileView.tsx b/src/components/user-profile/UserProfileView.tsx index 2f10f124..58d458b7 100644 --- a/src/components/user-profile/UserProfileView.tsx +++ b/src/components/user-profile/UserProfileView.tsx @@ -2,7 +2,7 @@ import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomE import { FC, useCallback, useState } from 'react'; import { CreateLinkEvent, GetRoomSession, GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../api'; import { Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { BatchUpdates, UseMessageEventHook, UseRoomEngineEvent } from '../../hooks'; +import { UseMessageEventHook, UseRoomEngineEvent } from '../../hooks'; import { BadgesContainerView } from './views/BadgesContainerView'; import { FriendsContainerView } from './views/FriendsContainerView'; import { GroupsContainerView } from './views/GroupsContainerView'; @@ -16,12 +16,9 @@ export const UserProfileView: FC<{}> = props => const onClose = () => { - BatchUpdates(() => - { - setUserProfile(null); - setUserBadges([]); - setUserRelationships(null); - }); + setUserProfile(null); + setUserBadges([]); + setUserRelationships(null); } const onLeaveGroup = useCallback(() => @@ -59,22 +56,19 @@ export const UserProfileView: FC<{}> = props => let isSameProfile = false; - BatchUpdates(() => + setUserProfile(prevValue => { - setUserProfile(prevValue => - { - if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); + if(prevValue && prevValue.id) isSameProfile = (prevValue.id === parser.id); - return parser; - }); - - if(!isSameProfile) - { - setUserBadges([]); - setUserRelationships(null); - } + return parser; }); + if(!isSameProfile) + { + setUserBadges([]); + setUserRelationships(null); + } + SendMessageComposer(new UserCurrentBadgesComposer(parser.id)); SendMessageComposer(new UserRelationshipsComposer(parser.id)); }, []); diff --git a/src/components/user-profile/views/GroupsContainerView.tsx b/src/components/user-profile/views/GroupsContainerView.tsx index 7aa49a63..7ace0c25 100644 --- a/src/components/user-profile/views/GroupsContainerView.tsx +++ b/src/components/user-profile/views/GroupsContainerView.tsx @@ -2,7 +2,7 @@ import { GroupInformationComposer, GroupInformationEvent, GroupInformationParser import { FC, useCallback, useEffect, useState } from 'react'; import { SendMessageComposer, ToggleFavoriteGroup } from '../../../api'; import { AutoGrid, Base, Column, Flex, Grid, GridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../common'; -import { BatchUpdates, UseMessageEventHook } from '../../../hooks'; +import { UseMessageEventHook } from '../../../hooks'; import { GroupInformationView } from '../../groups/views/GroupInformationView'; interface GroupsContainerViewProps extends GridProps @@ -38,23 +38,20 @@ export const GroupsContainerView: FC = props => useEffect(() => { - BatchUpdates(() => - { - setGroupInformation(null); + setGroupInformation(null); - if(groups.length > 0) + if(groups.length > 0) + { + setSelectedGroupId(prevValue => { - setSelectedGroupId(prevValue => + if(prevValue === groups[0].groupId) { - if(prevValue === groups[0].groupId) - { - SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); - } - - return groups[0].groupId; - }); - } - }); + SendMessageComposer(new GroupInformationComposer(groups[0].groupId, false)); + } + + return groups[0].groupId; + }); + } }, [ groups ]); if(!groups || !groups.length) diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index 452d6593..e065e229 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { GetSessionDataManager, LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; -import { BatchUpdates } from '../../../hooks'; import { useWiredContext } from '../WiredContext'; import { WiredFurniSelectorView } from './WiredFurniSelectorView'; @@ -49,56 +48,50 @@ export const WiredBaseView: FC = props => const spriteId = (trigger.spriteId || -1); const furniData = GetSessionDataManager().getFloorItemData(spriteId); - BatchUpdates(() => + if(!furniData) { - if(!furniData) - { - setWiredName(('NAME: ' + spriteId)); - setWiredDescription(('NAME: ' + spriteId)); - } - else - { - setWiredName(furniData.name); - setWiredDescription(furniData.description); - } + setWiredName(('NAME: ' + spriteId)); + setWiredDescription(('NAME: ' + spriteId)); + } + else + { + setWiredName(furniData.name); + setWiredDescription(furniData.description); + } - if(hasSpecialInput) + if(hasSpecialInput) + { + setIntParams(trigger.intData); + setStringParam(trigger.stringData); + } + + if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) + { + setFurniIds(prevValue => { - setIntParams(trigger.intData); - setStringParam(trigger.stringData); - } - - if(requiresFurni > WiredFurniType.STUFF_SELECTION_OPTION_NONE) - { - setFurniIds(prevValue => + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + + if(trigger.selectedItems && trigger.selectedItems.length) { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - - if(trigger.selectedItems && trigger.selectedItems.length) - { - WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); - - return trigger.selectedItems; - } - - return []; - }); - } - }); + WiredSelectionVisualizer.applySelectionShaderToFurni(trigger.selectedItems); + + return trigger.selectedItems; + } + + return []; + }); + } return () => { - BatchUpdates(() => + setNeedsSave(false); + setIntParams([]); + setStringParam(null); + setFurniIds(prevValue => { - setNeedsSave(false); - setIntParams([]); - setStringParam(null); - setFurniIds(prevValue => - { - if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); + if(prevValue && prevValue.length) WiredSelectionVisualizer.clearSelectionShaderFromFurni(prevValue); - return []; - }); + return []; }); } }, [ trigger, hasSpecialInput, requiresFurni, setIntParams, setStringParam, setFurniIds ]); diff --git a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx index 30ff3cd1..48ca80e9 100644 --- a/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx +++ b/src/components/wired/views/actions/WiredActionBotChangeFigureView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { GetSessionDataManager, LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; import { Button, Column, Flex, LayoutAvatarImageView, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -19,11 +18,8 @@ export const WiredActionBotChangeFigureView: FC<{}> = props => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setFigure(data[1].length > 0 ? data[1] : DEFAULT_FIGURE); - }); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setFigure(data[1].length > 0 ? data[1] : DEFAULT_FIGURE); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx index cdf8e6d9..0a609506 100644 --- a/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotFollowAvatarView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -13,20 +12,14 @@ export const WiredActionBotFollowAvatarView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setStringParam(botName); - setIntParams([ followMode ]); - }); + setStringParam(botName); + setIntParams([ followMode ]); } useEffect(() => { - BatchUpdates(() => - { - setBotName(trigger.stringData); - setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setBotName(trigger.stringData); + setFollowMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx index a4006f69..b3e7d6b2 100644 --- a/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx +++ b/src/components/wired/views/actions/WiredActionBotGiveHandItemView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -15,20 +14,14 @@ export const WiredActionBotGiveHandItemView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setStringParam(botName); - setIntParams([ handItemId ]); - }); + setStringParam(botName); + setIntParams([ handItemId ]); } useEffect(() => { - BatchUpdates(() => - { - setBotName(trigger.stringData); - setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setBotName(trigger.stringData); + setHandItemId((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx index c41cc4ac..2aa05687 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkToAvatarView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -14,24 +13,18 @@ export const WiredActionBotTalkToAvatarView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - }); + setStringParam(botName + WIRED_STRING_DELIMETER + message); + setIntParams([ talkMode ]); } useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionBotTalkView.tsx b/src/components/wired/views/actions/WiredActionBotTalkView.tsx index 20fc9cac..df1070b3 100644 --- a/src/components/wired/views/actions/WiredActionBotTalkView.tsx +++ b/src/components/wired/views/actions/WiredActionBotTalkView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType, WIRED_STRING_DELIMETER } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -14,24 +13,18 @@ export const WiredActionBotTalkView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setStringParam(botName + WIRED_STRING_DELIMETER + message); - setIntParams([ talkMode ]); - }); + setStringParam(botName + WIRED_STRING_DELIMETER + message); + setIntParams([ talkMode ]); } useEffect(() => { const data = trigger.stringData.split(WIRED_STRING_DELIMETER); - BatchUpdates(() => - { - if(data.length > 0) setBotName(data[0]); - if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); + if(data.length > 0) setBotName(data[0]); + if(data.length > 1) setMessage(data[1].length > 0 ? data[1] : ''); - setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setTalkMode((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx index 89610a20..8e132bcd 100644 --- a/src/components/wired/views/actions/WiredActionGiveRewardView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveRewardView.tsx @@ -6,7 +6,6 @@ import { Button } from '../../../../common/Button'; import { Column } from '../../../../common/Column'; import { Flex } from '../../../../common/Flex'; import { Text } from '../../../../common/Text'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -65,11 +64,8 @@ export const WiredActionGiveRewardView: FC<{}> = props => if(stringRewards.length > 0) { - BatchUpdates(() => - { - setStringParam(stringRewards.join(';')); - setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); - }); + setStringParam(stringRewards.join(';')); + setIntParams([ rewardTime, uniqueRewards ? 1 : 0, rewardsLimit, limitationInterval ]); } }, [ rewardTime, uniqueRewards, rewardsLimit, limitationInterval, rewards, setIntParams, setStringParam ]); @@ -93,15 +89,12 @@ export const WiredActionGiveRewardView: FC<{}> = props => if(readRewards.length === 0) readRewards.push({ isBadge: false, itemCode: '', probability: null }); - BatchUpdates(() => - { - setRewardTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setUniqueRewards((trigger.intData.length > 1) ? (trigger.intData[1] === 1) : false); - setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); - setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); - setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); - setRewards(readRewards); - }); + setRewardTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setUniqueRewards((trigger.intData.length > 1) ? (trigger.intData[1] === 1) : false); + setRewardsLimit((trigger.intData.length > 2) ? trigger.intData[2] : 0); + setLimitationInterval((trigger.intData.length > 3) ? trigger.intData[3] : 0); + setLimitEnabled((trigger.intData.length > 3) ? trigger.intData[3] > 0 : false); + setRewards(readRewards); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx index de67a237..0e74317d 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreToPredefinedTeamView.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -17,21 +16,18 @@ export const WiredActionGiveScoreToPredefinedTeamView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - setSelectedTeam(trigger.intData[2]); - } - else - { - setPoints(1); - setTime(1); - setSelectedTeam(1); - } - }); + setPoints(trigger.intData[0]); + setTime(trigger.intData[1]); + setSelectedTeam(trigger.intData[2]); + } + else + { + setPoints(1); + setTime(1); + setSelectedTeam(1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx index 7c41011d..9110795f 100644 --- a/src/components/wired/views/actions/WiredActionGiveScoreView.tsx +++ b/src/components/wired/views/actions/WiredActionGiveScoreView.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -16,19 +15,16 @@ export const WiredActionGiveScoreView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setPoints(trigger.intData[0]); - setTime(trigger.intData[1]); - } - else - { - setPoints(1); - setTime(1); - } - }); + setPoints(trigger.intData[0]); + setTime(trigger.intData[1]); + } + else + { + setPoints(1); + setTime(1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx index 1446aaae..dd57422a 100644 --- a/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveAndRotateFurniView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -36,19 +35,16 @@ export const WiredActionMoveAndRotateFurniView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }); + setMovement(trigger.intData[0]); + setRotation(trigger.intData[1]); + } + else + { + setMovement(-1); + setRotation(-1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx index 89a4d253..834313de 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniToView.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -35,19 +34,16 @@ export const WiredActionMoveFurniToView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setSpacing(trigger.intData[1]); - setMovement(trigger.intData[0]); - } - else - { - setSpacing(-1); - setMovement(-1); - } - }); + setSpacing(trigger.intData[1]); + setMovement(trigger.intData[0]); + } + else + { + setSpacing(-1); + setMovement(-1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx index 32866ba8..f97c975d 100644 --- a/src/components/wired/views/actions/WiredActionMoveFurniView.tsx +++ b/src/components/wired/views/actions/WiredActionMoveFurniView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -48,19 +47,16 @@ export const WiredActionMoveFurniView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMovement(trigger.intData[0]); - setRotation(trigger.intData[1]); - } - else - { - setMovement(-1); - setRotation(-1); - } - }); + setMovement(trigger.intData[0]); + setRotation(trigger.intData[1]); + } + else + { + setMovement(-1); + setRotation(-1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionMuteUserView.tsx b/src/components/wired/views/actions/WiredActionMuteUserView.tsx index 325d3c0f..09b396eb 100644 --- a/src/components/wired/views/actions/WiredActionMuteUserView.tsx +++ b/src/components/wired/views/actions/WiredActionMuteUserView.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -14,20 +13,14 @@ export const WiredActionMuteUserView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setIntParams([ time ]); - setStringParam(message); - }); + setIntParams([ time ]); + setStringParam(message); } useEffect(() => { - BatchUpdates(() => - { - setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); - setMessage(trigger.stringData); - }); + setTime((trigger.intData.length > 0) ? trigger.intData[0] : 0); + setMessage(trigger.stringData); }, [ trigger ]); return ( diff --git a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx index 96261ddc..5f2ca70a 100644 --- a/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx +++ b/src/components/wired/views/actions/WiredActionSetFurniStateToView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredActionBaseView } from './WiredActionBaseView'; @@ -16,12 +15,9 @@ export const WiredActionSetFurniStateToView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }); + setStateFlag(trigger.getBoolean(0) ? 1 : 0); + setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); + setPositionFlag(trigger.getBoolean(2) ? 1 : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx index 7c95e748..c0d9b14c 100644 --- a/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx +++ b/src/components/wired/views/conditions/WiredConditionDateRangeView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredDateToString, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -39,11 +38,8 @@ export const WiredConditionDateRangeView: FC<{}> = props => if(trigger.intData[1] > 0) endDate = new Date((trigger.intData[1] * 1000)); - BatchUpdates(() => - { - setStartDate(WiredDateToString(startDate)); - setEndDate(WiredDateToString(endDate)); - }); + setStartDate(WiredDateToString(startDate)); + setEndDate(WiredDateToString(endDate)); } }, [ trigger ]); diff --git a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx index 718a39a6..8fceb690 100644 --- a/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx +++ b/src/components/wired/views/conditions/WiredConditionFurniMatchesSnapshotView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -16,12 +15,9 @@ export const WiredConditionFurniMatchesSnapshotView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => - { - setStateFlag(trigger.getBoolean(0) ? 1 : 0); - setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); - setPositionFlag(trigger.getBoolean(2) ? 1 : 0); - }); + setStateFlag(trigger.getBoolean(0) ? 1 : 0); + setDirectionFlag(trigger.getBoolean(1) ? 1 : 0); + setPositionFlag(trigger.getBoolean(2) ? 1 : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx b/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx index 1560fe42..3bcab89e 100644 --- a/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx +++ b/src/components/wired/views/conditions/WiredConditionUserCountInRoomView.tsx @@ -2,7 +2,6 @@ import { FC, useEffect, useState } from 'react'; import ReactSlider from 'react-slider'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredConditionBaseView } from './WiredConditionBaseView'; @@ -16,19 +15,16 @@ export const WiredConditionUserCountInRoomView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => + if(trigger.intData.length >= 2) { - if(trigger.intData.length >= 2) - { - setMin(trigger.intData[0]); - setMax(trigger.intData[1]); - } - else - { - setMin(1); - setMax(1); - } - }); + setMin(trigger.intData[0]); + setMax(trigger.intData[1]); + } + else + { + setMin(1); + setMax(1); + } }, [ trigger ]); return ( diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx index 00ac2982..5129b610 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarEnterRoomView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -15,11 +14,8 @@ export const WiredTriggerAvatarEnterRoomView: FC<{}> = props => useEffect(() => { - BatchUpdates(() => - { - setUsername(trigger.stringData); - setAvatarMode(trigger.stringData ? 1 : 0); - }); + setUsername(trigger.stringData); + setAvatarMode(trigger.stringData ? 1 : 0); }, [ trigger ]); return ( diff --git a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx index ba6e3fbc..f8e2cd12 100644 --- a/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerAvatarSaysSomethingView.tsx @@ -1,7 +1,6 @@ import { FC, useEffect, useState } from 'react'; import { GetSessionDataManager, LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Flex, Text } from '../../../../common'; -import { BatchUpdates } from '../../../../hooks'; import { useWiredContext } from '../../WiredContext'; import { WiredTriggerBaseView } from './WiredTriggerBaseView'; @@ -13,20 +12,14 @@ export const WiredTriggerAvatarSaysSomethingView: FC<{}> = props => const save = () => { - BatchUpdates(() => - { - setStringParam(message); - setIntParams([ triggererAvatar ]); - }); + setStringParam(message); + setIntParams([ triggererAvatar ]); } useEffect(() => { - BatchUpdates(() => - { - setMessage(trigger.stringData); - setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); - }); + setMessage(trigger.stringData); + setTriggererAvatar((trigger.intData.length > 0) ? trigger.intData[0] : 0); }, [ trigger ]); return ( diff --git a/src/hooks/BatchUpdates.ts b/src/hooks/BatchUpdates.ts deleted file mode 100644 index d5f2501a..00000000 --- a/src/hooks/BatchUpdates.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { unstable_batchedUpdates } from 'react-dom'; - -export const BatchUpdates = (callback: () => any) => -{ - return unstable_batchedUpdates(callback); -} diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 615bbe74..d3dbb4e2 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,4 +1,3 @@ -export * from './BatchUpdates'; export * from './events'; export * from './events/core'; export * from './events/nitro'; diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts index 373a520a..70d59d14 100644 --- a/src/hooks/inventory/useInventoryBadges.ts +++ b/src/hooks/inventory/useInventoryBadges.ts @@ -1,7 +1,7 @@ import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBadgesComposer } from '@nitrots/nitro-renderer'; import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; -import { BatchUpdates, UseMessageEventHook } from '..'; +import { UseMessageEventHook } from '..'; import { GetConfiguration, SendMessageComposer } from '../../api'; import { useSharedVisibility } from '../useSharedVisibility'; @@ -21,30 +21,30 @@ const useInventoryBadgesState = () => const toggleBadge = (badgeCode: string) => { setActiveBadgeCodes(prevValue => + { + const newValue = [ ...prevValue ]; + + const index = newValue.indexOf(badgeCode); + + if(index === -1) { - const newValue = [ ...prevValue ]; + if(!canWearBadges()) return prevValue; - const index = newValue.indexOf(badgeCode); + newValue.push(badgeCode); + } + else + { + newValue.splice(index, 1); + } - if(index === -1) - { - if(!canWearBadges()) return prevValue; + const composer = new SetActivatedBadgesComposer(); - newValue.push(badgeCode); - } - else - { - newValue.splice(index, 1); - } + for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null); - const composer = new SetActivatedBadgesComposer(); + SendMessageComposer(composer); - for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null); - - SendMessageComposer(composer); - - return newValue; - }); + return newValue; + }); } const selectBadge = (badgeCode: string) => @@ -66,18 +66,14 @@ const useInventoryBadgesState = () => const onBadgesEvent = useCallback((event: BadgesEvent) => { const parser = event.getParser(); + const newBadgeCodes = parser.getAllBadgeCodes(); + const newBadgeIds: number[] = []; - BatchUpdates(() => - { - const newBadgeCodes = parser.getAllBadgeCodes(); - const newBadgeIds: number[] = []; + for(const newBadgeCode of newBadgeCodes) newBadgeIds.push(parser.getBadgeId(newBadgeCode)); - for(const newBadgeCode of newBadgeCodes) newBadgeIds.push(parser.getBadgeId(newBadgeCode)); - - setBadgeCodes(newBadgeCodes); - setBadgeIds(newBadgeIds); - setActiveBadgeCodes(parser.getActiveBadgeCodes()); - }); + setBadgeCodes(newBadgeCodes); + setBadgeIds(newBadgeIds); + setActiveBadgeCodes(parser.getActiveBadgeCodes()); }, []); UseMessageEventHook(BadgesEvent, onBadgesEvent); @@ -86,25 +82,22 @@ const useInventoryBadgesState = () => { const parser = event.getParser(); - BatchUpdates(() => + setBadgeCodes(prevValue => { - setBadgeCodes(prevValue => - { - const newValue = [ ...prevValue ]; + const newValue = [ ...prevValue ]; - newValue.push(parser.badgeCode); - - return newValue; - }); - - setBadgeIds(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue.push(parser.badgeId); - - return newValue; - }) + newValue.push(parser.badgeCode); + + return newValue; + }); + + setBadgeIds(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue.push(parser.badgeId); + + return newValue; }); }, []); @@ -115,15 +108,15 @@ const useInventoryBadgesState = () => if(!badgeCodes || !badgeCodes.length) return; setSelectedBadgeCode(prevValue => - { - let newValue = prevValue; + { + let newValue = prevValue; - if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; + if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null; - if(!newValue) newValue = badgeCodes[0]; + if(!newValue) newValue = badgeCodes[0]; - return newValue; - }); + return newValue; + }); }, [ badgeCodes ]); useEffect(() => diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts index e2b6c158..fa42fd23 100644 --- a/src/hooks/inventory/useInventoryTrade.ts +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -2,7 +2,7 @@ import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelCo import { useCallback, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryFurni } from '.'; -import { BatchUpdates, UseMessageEventHook } from '..'; +import { UseMessageEventHook } from '..'; import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api'; import { InventoryTradeRequestEvent } from '../../events'; import { UseUiEvent } from '../events'; @@ -90,25 +90,25 @@ const useInventoryTradeState = () => if(ownUser.userId === parser.userID) { setOwnUser(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.accepts = parser.userAccepts; + newValue.accepts = parser.userAccepts; - return newValue; - }); + return newValue; + }); } else if(otherUser.userId === parser.userID) { setOtherUser(prevValue => - { - const newValue = CloneObject(prevValue); + { + const newValue = CloneObject(prevValue); - newValue.accepts = parser.userAccepts; + newValue.accepts = parser.userAccepts; - return newValue; - }); + return newValue; + }); } }, [ ownUser, otherUser ]); @@ -130,12 +130,9 @@ const useInventoryTradeState = () => } } - BatchUpdates(() => - { - setOwnUser(null); - setOtherUser(null); - setTradeState(TradeState.TRADING_STATE_READY); - }); + setOwnUser(null); + setOtherUser(null); + setTradeState(TradeState.TRADING_STATE_READY); }, [ ownUser ]); UseMessageEventHook(TradingCloseEvent, onTradingCloseEvent); @@ -144,12 +141,9 @@ const useInventoryTradeState = () => { const parser = event.getParser(); - BatchUpdates(() => - { - setOwnUser(null); - setOtherUser(null); - setTradeState(TradeState.TRADING_STATE_READY); - }); + setOwnUser(null); + setOtherUser(null); + setTradeState(TradeState.TRADING_STATE_READY); }, []); UseMessageEventHook(TradingCompletedEvent, onTradingCompletedEvent); @@ -170,69 +164,69 @@ const useInventoryTradeState = () => const secondUserItems = parseTradeItems(parser.secondUserItemArray); setOwnUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) { - const newValue = CloneObject(prevValue); + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } - if(newValue.userId === parser.firstUserID) + const tradeIds: number[] = []; + + for(const groupItem of newValue.userItems.getValues()) + { + let i = 0; + + while(i < groupItem.getTotalCount()) { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; + const item = groupItem.getItemByIndex(i); + + if(item) tradeIds.push(item.ref); + + i++; } + } - const tradeIds: number[] = []; + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; - for(const groupItem of newValue.userItems.getValues()) - { - let i = 0; - - while(i < groupItem.getTotalCount()) - { - const item = groupItem.getItemByIndex(i); - - if(item) tradeIds.push(item.ref); - - i++; - } - } - - setGroupItems(prevValue => - { - const newValue = [ ...prevValue ]; - - for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); - - return newValue; - }); + for(const groupItem of newValue) groupItem.lockItemIds(tradeIds); return newValue; }); + return newValue; + }); + setOtherUser(prevValue => + { + const newValue = CloneObject(prevValue); + + if(newValue.userId === parser.firstUserID) { - const newValue = CloneObject(prevValue); + newValue.creditsCount = parser.firstUserNumCredits; + newValue.itemCount = parser.firstUserNumItems; + newValue.userItems = firstUserItems; + } + else + { + newValue.creditsCount = parser.secondUserNumCredits; + newValue.itemCount = parser.secondUserNumItems; + newValue.userItems = secondUserItems; + } - if(newValue.userId === parser.firstUserID) - { - newValue.creditsCount = parser.firstUserNumCredits; - newValue.itemCount = parser.firstUserNumItems; - newValue.userItems = firstUserItems; - } - else - { - newValue.creditsCount = parser.secondUserNumCredits; - newValue.itemCount = parser.secondUserNumItems; - newValue.userItems = secondUserItems; - } - - return newValue; - }); + return newValue; + }); }, [ setGroupItems ]); UseMessageEventHook(TradingListItemEvent, onTradingListItemEvent); @@ -280,12 +274,9 @@ const useInventoryTradeState = () => secondUser.canTrade = parser.userCanTrade; } - BatchUpdates(() => - { - setOwnUser(firstUser); - setOtherUser(secondUser); - setTradeState(TradeState.TRADING_STATE_RUNNING); - }); + setOwnUser(firstUser); + setOtherUser(secondUser); + setTradeState(TradeState.TRADING_STATE_RUNNING); }, []); UseMessageEventHook(TradingOpenEvent, onTradingOpenEvent); diff --git a/src/index.tsx b/src/index.tsx index 60a928c2..b0fc34bc 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,11 +1,11 @@ import { library } from '@fortawesome/fontawesome-svg-core'; import { fas } from '@fortawesome/free-solid-svg-icons'; import React from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import { App } from './App'; import './index.scss'; //@ts-ignore library.add(fas); -ReactDOM.render(, document.getElementById('root')); +createRoot(document.getElementById('root')).render(); diff --git a/yarn.lock b/yarn.lock index 87adaaae..5ad50752 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10036,14 +10036,13 @@ react-dev-utils@^11.0.3: strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023" + integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.21.0" react-error-overlay@6.0.9, react-error-overlay@^6.0.9: version "6.0.9" @@ -10136,10 +10135,12 @@ react-scripts@4.0.3: optionalDependencies: fsevents "^2.1.3" -react-slider@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-1.3.1.tgz#41dd88f7c67520811a4114d6f8f49d186268d9da" - integrity sha512-bD8hHJJUgAHI8g1F6PY6432l+Dmcs2fqzUwDhd+0HWDdvfjwNoXRNC2cL9OWyGTjYlJM92A8nF/w1X4pyHfytQ== +react-slider@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-slider/-/react-slider-2.0.0.tgz#d904593b23434bf50bf3913aa2ab8c68621f41a5" + integrity sha512-r2Z4VkGvtQXbmiANEYzYdCnb4SnTRpgog1QZa++Wl1x1n5vRL3QOufyf52VVkcaLQCLk5m0WPMwGNvRqcBDtmw== + dependencies: + prop-types "^15.8.1" react-transition-group@^4.4.2: version "4.4.2" @@ -10172,13 +10173,12 @@ react-youtube@^7.13.1: prop-types "15.7.2" youtube-player "5.5.2" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" + integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^7.0.1: version "7.0.1" @@ -10672,13 +10672,12 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" + integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^1.0.0: version "1.0.0" From 855d9f2f0d05437dbdeec3528f93c39f3a0000a6 Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 2 Apr 2022 01:33:29 -0400 Subject: [PATCH 213/331] Inventory changes --- .../inventory/unseen/IUnseenItemTracker.ts | 1 - .../CatalogBadgeSelectorWidgetView.tsx | 19 ++++- src/components/inventory/InventoryView.tsx | 16 ++-- .../views/badge/InventoryBadgeItemView.tsx | 19 +++++ .../views/{ => badge}/InventoryBadgeView.tsx | 52 +++++------- .../views/bot/InventoryBotItemView.tsx | 40 +++++++++ .../views/{ => bot}/InventoryBotView.tsx | 81 +++++++----------- .../furniture/InventoryFurnitureItemView.tsx | 35 ++++++++ .../InventoryFurnitureSearchView.tsx | 4 +- .../InventoryFurnitureView.tsx | 83 ++++++------------- .../{ => furniture}/InventoryTradeView.tsx | 8 +- .../views/pet/InventoryPetItemView.tsx | 40 +++++++++ .../views/{ => pet}/InventoryPetView.tsx | 83 +++++++------------ .../views/search/NavigatorSearchView.tsx | 2 +- src/hooks/inventory/useInventoryBadges.ts | 54 +++++------- src/hooks/inventory/useInventoryBots.ts | 46 +++++----- src/hooks/inventory/useInventoryFurni.ts | 46 +++++----- src/hooks/inventory/useInventoryPets.ts | 44 ++++------ .../inventory/useInventoryUnseenTracker.ts | 73 ++++++++-------- 19 files changed, 384 insertions(+), 362 deletions(-) create mode 100644 src/components/inventory/views/badge/InventoryBadgeItemView.tsx rename src/components/inventory/views/{ => badge}/InventoryBadgeView.tsx (65%) create mode 100644 src/components/inventory/views/bot/InventoryBotItemView.tsx rename src/components/inventory/views/{ => bot}/InventoryBotView.tsx (53%) create mode 100644 src/components/inventory/views/furniture/InventoryFurnitureItemView.tsx rename src/components/inventory/views/{ => furniture}/InventoryFurnitureSearchView.tsx (93%) rename src/components/inventory/views/{ => furniture}/InventoryFurnitureView.tsx (68%) rename src/components/inventory/views/{ => furniture}/InventoryTradeView.tsx (98%) create mode 100644 src/components/inventory/views/pet/InventoryPetItemView.tsx rename src/components/inventory/views/{ => pet}/InventoryPetView.tsx (53%) diff --git a/src/api/inventory/unseen/IUnseenItemTracker.ts b/src/api/inventory/unseen/IUnseenItemTracker.ts index 51872a00..8a70a166 100644 --- a/src/api/inventory/unseen/IUnseenItemTracker.ts +++ b/src/api/inventory/unseen/IUnseenItemTracker.ts @@ -3,7 +3,6 @@ export interface IUnseenItemTracker dispose(): void; resetCategory(category: number): boolean; resetItems(category: number, itemIds: number[]): boolean; - resetCategoryIfEmpty(category: number): boolean; isUnseen(category: number, itemId: number): boolean; removeUnseen(category: number, itemId: number): boolean; getIds(category: number): number[]; diff --git a/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx index ecbb95b5..b3c6c028 100644 --- a/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx @@ -14,9 +14,10 @@ interface CatalogBadgeSelectorWidgetViewProps extends AutoGridProps export const CatalogBadgeSelectorWidgetView: FC = props => { const { columnCount = 5, ...rest } = props; + const [ isVisible, setIsVisible ] = useState(false); const [ currentBadgeCode, setCurrentBadgeCode ] = useState(null); const { currentOffer = null, setPurchaseOptions = null } = useCatalogContext(); - const { badgeCodes = [] } = useInventoryBadges(); + const { badgeCodes = [], activate = null, deactivate = null } = useInventoryBadges(); const previewStuffData = useMemo(() => { @@ -45,6 +46,22 @@ export const CatalogBadgeSelectorWidgetView: FC + { + if(!isVisible) return; + + const id = activate(); + + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); + + useEffect(() => + { + setIsVisible(true); + + return () => setIsVisible(false); + }, []); + return ( { badgeCodes && (badgeCodes.length > 0) && badgeCodes.map((badgeCode, index) => diff --git a/src/components/inventory/InventoryView.tsx b/src/components/inventory/InventoryView.tsx index c438e7cc..e23576bc 100644 --- a/src/components/inventory/InventoryView.tsx +++ b/src/components/inventory/InventoryView.tsx @@ -4,11 +4,11 @@ import { AddEventLinkTracker, GetLocalization, GetRoomEngine, LocalizeText, Remo import { isObjectMoverRequested, setObjectMoverRequested } from '../../api/inventory/InventoryUtilities'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { useInventoryTrade, useInventoryUnseenTracker, UseMessageEventHook, UseRoomEngineEvent, UseRoomSessionManagerEvent } from '../../hooks'; -import { InventoryBadgeView } from './views/InventoryBadgeView'; -import { InventoryBotView } from './views/InventoryBotView'; -import { InventoryFurnitureView } from './views/InventoryFurnitureView'; -import { InventoryPetView } from './views/InventoryPetView'; -import { InventoryTradeView } from './views/InventoryTradeView'; +import { InventoryBadgeView } from './views/badge/InventoryBadgeView'; +import { InventoryBotView } from './views/bot/InventoryBotView'; +import { InventoryFurnitureView } from './views/furniture/InventoryFurnitureView'; +import { InventoryTradeView } from './views/furniture/InventoryTradeView'; +import { InventoryPetView } from './views/pet/InventoryPetView'; const TAB_FURNITURE: string = 'inventory.furni'; const TAB_BOTS: string = 'inventory.bots'; @@ -19,7 +19,7 @@ const UNSEEN_CATEGORIES = [ UnseenItemCategory.FURNI, UnseenItemCategory.BOT, Un export const InventoryView: FC<{}> = props => { - const [ isVisible, setIsVisible ] = useState(false); + const [ isVisible, setIsVisible ] = useState(false); const [ currentTab, setCurrentTab ] = useState(TABS[0]); const [ roomSession, setRoomSession ] = useState(null); const [ roomPreviewer, setRoomPreviewer ] = useState(null); @@ -130,10 +130,8 @@ export const InventoryView: FC<{}> = props => { TABS.map((name, index) => { - const unseenCount = getCount(UNSEEN_CATEGORIES[index]); - return ( - setCurrentTab(name) } count={ unseenCount }> + setCurrentTab(name) } count={ getCount(UNSEEN_CATEGORIES[index]) }> { LocalizeText(name) } ); diff --git a/src/components/inventory/views/badge/InventoryBadgeItemView.tsx b/src/components/inventory/views/badge/InventoryBadgeItemView.tsx new file mode 100644 index 00000000..4ec8c184 --- /dev/null +++ b/src/components/inventory/views/badge/InventoryBadgeItemView.tsx @@ -0,0 +1,19 @@ +import { FC } from 'react'; +import { UnseenItemCategory } from '../../../../api'; +import { LayoutBadgeImageView, LayoutGridItem } from '../../../../common'; +import { useInventoryBadges, useInventoryUnseenTracker } from '../../../../hooks'; + +export const InventoryBadgeItemView: FC<{ badgeCode: string }> = props => +{ + const { badgeCode = null, children = null, ...rest } = props; + const { selectedBadgeCode = null, setSelectedBadgeCode = null, getBadgeId = null } = useInventoryBadges(); + const { isUnseen = null } = useInventoryUnseenTracker(); + const unseen = isUnseen(UnseenItemCategory.BADGE, getBadgeId(badgeCode)); + + return ( + setSelectedBadgeCode(badgeCode) } { ...rest }> + + { children } + + ); +} diff --git a/src/components/inventory/views/InventoryBadgeView.tsx b/src/components/inventory/views/badge/InventoryBadgeView.tsx similarity index 65% rename from src/components/inventory/views/InventoryBadgeView.tsx rename to src/components/inventory/views/badge/InventoryBadgeView.tsx index 5b183600..336899b6 100644 --- a/src/components/inventory/views/InventoryBadgeView.tsx +++ b/src/components/inventory/views/badge/InventoryBadgeView.tsx @@ -1,47 +1,37 @@ -import { FC, useEffect } from 'react'; -import { LocalizeBadgeName, LocalizeText, UnseenItemCategory } from '../../../api'; -import { AutoGrid, Button, Column, Flex, Grid, LayoutBadgeImageView, LayoutGridItem, Text } from '../../../common'; -import { useInventoryBadges, useInventoryUnseenTracker } from '../../../hooks'; +import { FC, useEffect, useState } from 'react'; +import { LocalizeBadgeName, LocalizeText, UnseenItemCategory } from '../../../../api'; +import { AutoGrid, Button, Column, Flex, Grid, LayoutBadgeImageView, Text } from '../../../../common'; +import { useInventoryBadges, useInventoryUnseenTracker } from '../../../../hooks'; +import { InventoryBadgeItemView } from './InventoryBadgeItemView'; export const InventoryBadgeView: FC<{}> = props => { - const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, selectBadge = null, getBadgeId = null } = useInventoryBadges(); + const [ isVisible, setIsVisible ] = useState(false); + const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, getBadgeId = null, activate = null, deactivate = null } = useInventoryBadges(); const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); useEffect(() => { - if(!badgeCodes || !badgeCodes.length) return; - - return () => - { - const count = getCount(UnseenItemCategory.BADGE); + if(!selectedBadgeCode || !isUnseen(UnseenItemCategory.BADGE, getBadgeId(selectedBadgeCode))) return; - if(!count) return; + removeUnseen(UnseenItemCategory.BADGE, getBadgeId(selectedBadgeCode)); + }, [ selectedBadgeCode, isUnseen, removeUnseen, getBadgeId ]); - resetCategory(UnseenItemCategory.BADGE); - } - }, [ badgeCodes, getCount, resetCategory ]); - - const InventoryBadgeItemView: FC<{ badgeCode: string }> = props => + useEffect(() => { - const { badgeCode = null, children = null, ...rest } = props; - const badgeId = getBadgeId(badgeCode); - const unseen = isUnseen(UnseenItemCategory.BADGE, badgeId); + if(!isVisible) return; - const select = () => - { - selectBadge(badgeCode); + const id = activate(); - if(unseen) removeUnseen(UnseenItemCategory.BADGE, badgeId); - } + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); - return ( - - - { children } - - ); - } + useEffect(() => + { + setIsVisible(true); + + return () => setIsVisible(false); + }, []); return ( diff --git a/src/components/inventory/views/bot/InventoryBotItemView.tsx b/src/components/inventory/views/bot/InventoryBotItemView.tsx new file mode 100644 index 00000000..8f71e14e --- /dev/null +++ b/src/components/inventory/views/bot/InventoryBotItemView.tsx @@ -0,0 +1,40 @@ +import { MouseEventType } from '@nitrots/nitro-renderer'; +import { FC, MouseEvent, useState } from 'react'; +import { attemptBotPlacement, IBotItem, UnseenItemCategory } from '../../../../api'; +import { LayoutAvatarImageView, LayoutGridItem } from '../../../../common'; +import { useInventoryBots, useInventoryUnseenTracker } from '../../../../hooks'; + +export const InventoryBotItemView: FC<{ botItem: IBotItem }> = props => +{ + const { botItem = null, children = null, ...rest } = props; + const [ isMouseDown, setMouseDown ] = useState(false); + const { selectedBot = null, setSelectedBot = null } = useInventoryBots(); + const { isUnseen = null } = useInventoryUnseenTracker(); + const unseen = isUnseen(UnseenItemCategory.BOT, botItem.botData.id); + + const onMouseEvent = (event: MouseEvent) => + { + switch(event.type) + { + case MouseEventType.MOUSE_DOWN: + setSelectedBot(botItem); + setMouseDown(true); + return; + case MouseEventType.MOUSE_UP: + setMouseDown(false); + return; + case MouseEventType.ROLL_OUT: + if(!isMouseDown || (selectedBot !== botItem)) return; + + attemptBotPlacement(botItem); + return; + } + } + + return ( + + + { children } + + ); +} diff --git a/src/components/inventory/views/InventoryBotView.tsx b/src/components/inventory/views/bot/InventoryBotView.tsx similarity index 53% rename from src/components/inventory/views/InventoryBotView.tsx rename to src/components/inventory/views/bot/InventoryBotView.tsx index 254a739f..29a7db60 100644 --- a/src/components/inventory/views/InventoryBotView.tsx +++ b/src/components/inventory/views/bot/InventoryBotView.tsx @@ -1,9 +1,10 @@ -import { IRoomSession, MouseEventType, RoomObjectVariable, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useEffect, useState } from 'react'; -import { attemptBotPlacement, GetRoomEngine, IBotItem, LocalizeText, UnseenItemCategory } from '../../../api'; -import { AutoGrid, Button, Column, Grid, LayoutAvatarImageView, LayoutGridItem, LayoutRoomPreviewerView, Text } from '../../../common'; -import { useInventoryBots, useInventoryUnseenTracker } from '../../../hooks'; -import { InventoryCategoryEmptyView } from './InventoryCategoryEmptyView'; +import { IRoomSession, RoomObjectVariable, RoomPreviewer } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { attemptBotPlacement, GetRoomEngine, LocalizeText, UnseenItemCategory } from '../../../../api'; +import { AutoGrid, Button, Column, Grid, LayoutRoomPreviewerView, Text } from '../../../../common'; +import { useInventoryBots, useInventoryUnseenTracker } from '../../../../hooks'; +import { InventoryCategoryEmptyView } from '../InventoryCategoryEmptyView'; +import { InventoryBotItemView } from './InventoryBotItemView'; interface InventoryBotViewProps { @@ -14,22 +15,9 @@ interface InventoryBotViewProps export const InventoryBotView: FC = props => { const { roomSession = null, roomPreviewer = null } = props; - const { botItems = [], selectedBot = null, selectBot = null } = useInventoryBots(); - const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); - - useEffect(() => - { - if(!botItems || !botItems.length) return; - - return () => - { - const count = getCount(UnseenItemCategory.BOT); - - if(!count) return; - - resetCategory(UnseenItemCategory.BOT); - } - }, [ botItems, getCount, resetCategory ]); + const [ isVisible, setIsVisible ] = useState(false); + const { botItems = [], selectedBot = null, activate = null, deactivate = null } = useInventoryBots(); + const { isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); useEffect(() => { @@ -53,43 +41,30 @@ export const InventoryBotView: FC = props => roomPreviewer.addAvatarIntoRoom(botData.figure, 0); }, [ roomPreviewer, selectedBot ]); - if(!botItems || !botItems.length) return ; - - const InventoryBotItemView: FC<{ botItem: IBotItem }> = props => + useEffect(() => { - const { botItem = null } = props; - const [ isMouseDown, setMouseDown ] = useState(false); - const isActive = (botItem === selectedBot); - const unseen = isUnseen(UnseenItemCategory.BOT, botItem.botData.id); + if(!selectedBot || !isUnseen(UnseenItemCategory.BOT, selectedBot.botData.id)) return; - const onMouseEvent = (event: MouseEvent) => - { - switch(event.type) - { - case MouseEventType.MOUSE_DOWN: - selectBot(botItem); + removeUnseen(UnseenItemCategory.BOT, selectedBot.botData.id); + }, [ selectedBot, isUnseen, removeUnseen ]); - if(unseen) removeUnseen(UnseenItemCategory.BOT, botItem.botData.id); + useEffect(() => + { + if(!isVisible) return; - setMouseDown(true); - return; - case MouseEventType.MOUSE_UP: - setMouseDown(false); - return; - case MouseEventType.ROLL_OUT: - if(!isMouseDown || !isActive) return; + const id = activate(); - attemptBotPlacement(botItem); - return; - } - } + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); - return ( - - - - ); - } + useEffect(() => + { + setIsVisible(true); + + return () => setIsVisible(false); + }, []); + + if(!botItems || !botItems.length) return ; return ( diff --git a/src/components/inventory/views/furniture/InventoryFurnitureItemView.tsx b/src/components/inventory/views/furniture/InventoryFurnitureItemView.tsx new file mode 100644 index 00000000..f72c6ab5 --- /dev/null +++ b/src/components/inventory/views/furniture/InventoryFurnitureItemView.tsx @@ -0,0 +1,35 @@ +import { MouseEventType } from '@nitrots/nitro-renderer'; +import { FC, MouseEvent, useState } from 'react'; +import { attemptItemPlacement, GroupItem } from '../../../../api'; +import { LayoutGridItem } from '../../../../common'; +import { useInventoryFurni } from '../../../../hooks'; + +export const InventoryFurnitureItemView: FC<{ groupItem: GroupItem }> = props => +{ + const { groupItem = null, ...rest } = props; + const [ isMouseDown, setMouseDown ] = useState(false); + const { selectedItem = null, setSelectedItem = null } = useInventoryFurni(); + + const onMouseEvent = (event: MouseEvent) => + { + switch(event.type) + { + case MouseEventType.MOUSE_DOWN: + setSelectedItem(groupItem); + setMouseDown(true); + return; + case MouseEventType.MOUSE_UP: + setMouseDown(false); + return; + case MouseEventType.ROLL_OUT: + if(!isMouseDown || !(groupItem === selectedItem)) return; + + attemptItemPlacement(groupItem); + return; + } + } + + const count = groupItem.getUnlockedCount(); + + return ; +} diff --git a/src/components/inventory/views/InventoryFurnitureSearchView.tsx b/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx similarity index 93% rename from src/components/inventory/views/InventoryFurnitureSearchView.tsx rename to src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx index d81d6060..a230f6d3 100644 --- a/src/components/inventory/views/InventoryFurnitureSearchView.tsx +++ b/src/components/inventory/views/furniture/InventoryFurnitureSearchView.tsx @@ -1,7 +1,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react'; -import { GroupItem, LocalizeText } from '../../../api'; -import { Button, Flex } from '../../../common'; +import { GroupItem, LocalizeText } from '../../../../api'; +import { Button, Flex } from '../../../../common'; export interface InventoryFurnitureSearchViewProps { diff --git a/src/components/inventory/views/InventoryFurnitureView.tsx b/src/components/inventory/views/furniture/InventoryFurnitureView.tsx similarity index 68% rename from src/components/inventory/views/InventoryFurnitureView.tsx rename to src/components/inventory/views/furniture/InventoryFurnitureView.tsx index 8833d2fd..01d364c5 100644 --- a/src/components/inventory/views/InventoryFurnitureView.tsx +++ b/src/components/inventory/views/furniture/InventoryFurnitureView.tsx @@ -1,10 +1,11 @@ -import { IRoomSession, MouseEventType, RoomObjectVariable, RoomPreviewer, Vector3d } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useEffect, useState } from 'react'; -import { attemptItemPlacement, FurniCategory, GetRoomEngine, GetSessionDataManager, GroupItem, LocalizeText, UnseenItemCategory } from '../../../api'; -import { AutoGrid, Button, Column, Grid, LayoutGridItem, LayoutLimitedEditionCompactPlateView, LayoutRarityLevelView, LayoutRoomPreviewerView, Text } from '../../../common'; -import { useInventoryFurni, useInventoryUnseenTracker } from '../../../hooks'; -import { attemptPlaceMarketplaceOffer } from '../../../hooks/inventory/common'; -import { InventoryCategoryEmptyView } from './InventoryCategoryEmptyView'; +import { IRoomSession, RoomObjectVariable, RoomPreviewer, Vector3d } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { attemptItemPlacement, FurniCategory, GetRoomEngine, GetSessionDataManager, GroupItem, LocalizeText, UnseenItemCategory } from '../../../../api'; +import { AutoGrid, Button, Column, Grid, LayoutLimitedEditionCompactPlateView, LayoutRarityLevelView, LayoutRoomPreviewerView, Text } from '../../../../common'; +import { useInventoryFurni, useInventoryUnseenTracker } from '../../../../hooks'; +import { attemptPlaceMarketplaceOffer } from '../../../../hooks/inventory/common'; +import { InventoryCategoryEmptyView } from '../InventoryCategoryEmptyView'; +import { InventoryFurnitureItemView } from './InventoryFurnitureItemView'; import { InventoryFurnitureSearchView } from './InventoryFurnitureSearchView'; interface InventoryFurnitureViewProps @@ -16,9 +17,10 @@ interface InventoryFurnitureViewProps export const InventoryFurnitureView: FC = props => { const { roomSession = null, roomPreviewer = null } = props; + const [ isVisible, setIsVisible ] = useState(false); const [ filteredGroupItems, setFilteredGroupItems ] = useState([]); - const { groupItems = [], selectedItem = null, selectItem = null, activate = null, deactivate = null } = useInventoryFurni(); - const { getCount = null, resetCategory = null } = useInventoryUnseenTracker(); + const { groupItems = [], selectedItem = null, activate = null, deactivate = null } = useInventoryFurni(); + const { resetItems = null } = useInventoryUnseenTracker(); useEffect(() => { @@ -72,66 +74,31 @@ export const InventoryFurnitureView: FC = props => useEffect(() => { - if(!groupItems || !groupItems.length) return; - - return () => - { - const count = getCount(UnseenItemCategory.FURNI); + if(!selectedItem || !selectedItem.hasUnseenItems) return; - if(!count) return; + resetItems(UnseenItemCategory.FURNI, selectedItem.items.map(item => item.id)); - resetCategory(UnseenItemCategory.FURNI); - - for(const groupItem of groupItems) groupItem.hasUnseenItems = false; - } - }, [ groupItems, getCount, resetCategory ]); + selectedItem.hasUnseenItems = false; + }, [ selectedItem, resetItems ]); useEffect(() => { + if(!isVisible) return; + const id = activate(); return () => deactivate(id); - }, [ activate, deactivate ]); + }, [ isVisible, activate, deactivate ]); + + useEffect(() => + { + setIsVisible(true); + + return () => setIsVisible(false); + }, []); if(!groupItems || !groupItems.length) return ; - const InventoryFurnitureItemView: FC<{ groupItem: GroupItem }> = props => - { - const { groupItem = null } = props; - const [ isMouseDown, setMouseDown ] = useState(false); - const isActive = (groupItem === selectedItem); - - const onMouseEvent = (event: MouseEvent) => - { - switch(event.type) - { - case MouseEventType.MOUSE_DOWN: - selectItem(groupItem); - setMouseDown(true); - return; - case MouseEventType.MOUSE_UP: - setMouseDown(false); - return; - case MouseEventType.ROLL_OUT: - if(!isMouseDown || !isActive) return; - - attemptItemPlacement(groupItem); - return; - } - } - - useEffect(() => - { - if(!isActive) return; - - groupItem.hasUnseenItems = false; - }, [ isActive, groupItem ]); - - const count = groupItem.getUnlockedCount(); - - return ; - } - return ( diff --git a/src/components/inventory/views/InventoryTradeView.tsx b/src/components/inventory/views/furniture/InventoryTradeView.tsx similarity index 98% rename from src/components/inventory/views/InventoryTradeView.tsx rename to src/components/inventory/views/furniture/InventoryTradeView.tsx index a43bfbe8..f9ce0e62 100644 --- a/src/components/inventory/views/InventoryTradeView.tsx +++ b/src/components/inventory/views/furniture/InventoryTradeView.tsx @@ -1,10 +1,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IObjectData, TradingListAddItemComposer, TradingListAddItemsComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { FurniCategory, GroupItem, IFurnitureItem, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TradeState } from '../../../api'; -import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../common'; -import { useInventoryTrade } from '../../../hooks'; -import { getGuildFurniType } from '../../../hooks/inventory/common/TradingUtilities'; +import { FurniCategory, GroupItem, IFurnitureItem, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TradeState } from '../../../../api'; +import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../../common'; +import { useInventoryTrade } from '../../../../hooks'; +import { getGuildFurniType } from '../../../../hooks/inventory/common/TradingUtilities'; import { InventoryFurnitureSearchView } from './InventoryFurnitureSearchView'; interface InventoryTradeViewProps diff --git a/src/components/inventory/views/pet/InventoryPetItemView.tsx b/src/components/inventory/views/pet/InventoryPetItemView.tsx new file mode 100644 index 00000000..194b1a2b --- /dev/null +++ b/src/components/inventory/views/pet/InventoryPetItemView.tsx @@ -0,0 +1,40 @@ +import { MouseEventType } from '@nitrots/nitro-renderer'; +import { FC, MouseEvent, useState } from 'react'; +import { attemptPetPlacement, IPetItem, UnseenItemCategory } from '../../../../api'; +import { LayoutGridItem, LayoutPetImageView } from '../../../../common'; +import { useInventoryPets, useInventoryUnseenTracker } from '../../../../hooks'; + +export const InventoryPetItemView: FC<{ petItem: IPetItem }> = props => +{ + const { petItem = null, children = null, ...rest } = props; + const [ isMouseDown, setMouseDown ] = useState(false); + const { selectedPet = null, setSelectedPet = null } = useInventoryPets(); + const { isUnseen } = useInventoryUnseenTracker(); + const unseen = isUnseen(UnseenItemCategory.PET, petItem.petData.id); + + const onMouseEvent = (event: MouseEvent) => + { + switch(event.type) + { + case MouseEventType.MOUSE_DOWN: + setSelectedPet(petItem); + setMouseDown(true); + return; + case MouseEventType.MOUSE_UP: + setMouseDown(false); + return; + case MouseEventType.ROLL_OUT: + if(!isMouseDown || !(petItem === selectedPet)) return; + + attemptPetPlacement(petItem); + return; + } + } + + return ( + + + { children } + + ); +} diff --git a/src/components/inventory/views/InventoryPetView.tsx b/src/components/inventory/views/pet/InventoryPetView.tsx similarity index 53% rename from src/components/inventory/views/InventoryPetView.tsx rename to src/components/inventory/views/pet/InventoryPetView.tsx index 5d9727f1..e8aadc79 100644 --- a/src/components/inventory/views/InventoryPetView.tsx +++ b/src/components/inventory/views/pet/InventoryPetView.tsx @@ -1,9 +1,10 @@ -import { IRoomSession, MouseEventType, RoomObjectVariable, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useEffect, useState } from 'react'; -import { attemptPetPlacement, GetRoomEngine, IPetItem, LocalizeText, UnseenItemCategory } from '../../../api'; -import { AutoGrid, Button, Column, Grid, LayoutGridItem, LayoutPetImageView, LayoutRoomPreviewerView, Text } from '../../../common'; -import { useInventoryPets, useInventoryUnseenTracker } from '../../../hooks'; -import { InventoryCategoryEmptyView } from './InventoryCategoryEmptyView'; +import { IRoomSession, RoomObjectVariable, RoomPreviewer } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; +import { attemptPetPlacement, GetRoomEngine, LocalizeText, UnseenItemCategory } from '../../../../api'; +import { AutoGrid, Button, Column, Grid, LayoutRoomPreviewerView, Text } from '../../../../common'; +import { useInventoryPets, useInventoryUnseenTracker } from '../../../../hooks'; +import { InventoryCategoryEmptyView } from '../InventoryCategoryEmptyView'; +import { InventoryPetItemView } from './InventoryPetItemView'; interface InventoryPetViewProps { @@ -14,22 +15,9 @@ interface InventoryPetViewProps export const InventoryPetView: FC = props => { const { roomSession = null, roomPreviewer = null } = props; - const { petItems = null, selectedPet = null, selectPet = null } = useInventoryPets(); - const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); - - useEffect(() => - { - if(!petItems || !petItems.length) return; - - return () => - { - const count = getCount(UnseenItemCategory.PET); - - if(!count) return; - - resetCategory(UnseenItemCategory.PET); - } - }, [ petItems, getCount, resetCategory ]); + const [ isVisible, setIsVisible ] = useState(false); + const { petItems = null, selectedPet = null, activate = null, deactivate = null } = useInventoryPets(); + const { isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); useEffect(() => { @@ -52,43 +40,30 @@ export const InventoryPetView: FC = props => roomPreviewer.addPetIntoRoom(petData.figureString); }, [ roomPreviewer, selectedPet ]); - if(!petItems || !petItems.length) return ; - - const InventoryPetItemView: FC<{ petItem: IPetItem }> = props => + useEffect(() => { - const { petItem = null } = props; - const [ isMouseDown, setMouseDown ] = useState(false); - const isActive = (petItem === selectedPet); - const unseen = isUnseen(UnseenItemCategory.PET, petItem.petData.id); + if(!selectedPet || !isUnseen(UnseenItemCategory.PET, selectedPet.petData.id)) return; - const onMouseEvent = (event: MouseEvent) => - { - switch(event.type) - { - case MouseEventType.MOUSE_DOWN: - selectPet(petItem); + removeUnseen(UnseenItemCategory.PET, selectedPet.petData.id); + }, [ selectedPet, isUnseen, removeUnseen ]); - if(unseen) removeUnseen(UnseenItemCategory.PET, petItem.petData.id); + useEffect(() => + { + if(!isVisible) return; - setMouseDown(true); - return; - case MouseEventType.MOUSE_UP: - setMouseDown(false); - return; - case MouseEventType.ROLL_OUT: - if(!isMouseDown || !isActive) return; + const id = activate(); - attemptPetPlacement(petItem); - return; - } - } - - return ( - - - - ); - } + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); + + useEffect(() => + { + setIsVisible(true); + + return () => setIsVisible(false); + }, []); + + if(!petItems || !petItems.length) return ; return ( diff --git a/src/components/navigator/views/search/NavigatorSearchView.tsx b/src/components/navigator/views/search/NavigatorSearchView.tsx index c779c07a..2109a985 100644 --- a/src/components/navigator/views/search/NavigatorSearchView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchView.tsx @@ -38,7 +38,7 @@ export const NavigatorSearchView: FC = props => useEffect(() => { - if(!searchResult) return null; + if(!searchResult) return; const split = searchResult.data.split(':'); diff --git a/src/hooks/inventory/useInventoryBadges.ts b/src/hooks/inventory/useInventoryBadges.ts index 70d59d14..6a349c5c 100644 --- a/src/hooks/inventory/useInventoryBadges.ts +++ b/src/hooks/inventory/useInventoryBadges.ts @@ -2,17 +2,19 @@ import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBad import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { UseMessageEventHook } from '..'; -import { GetConfiguration, SendMessageComposer } from '../../api'; +import { GetConfiguration, SendMessageComposer, UnseenItemCategory } from '../../api'; import { useSharedVisibility } from '../useSharedVisibility'; +import { useInventoryUnseenTracker } from './useInventoryUnseenTracker'; const useInventoryBadgesState = () => { - const [ isVisible, setIsVisible ] = useState(false); const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ badgeCodes, setBadgeCodes ] = useState([]); const [ badgeIds, setBadgeIds ] = useState([]); const [ activeBadgeCodes, setActiveBadgeCodes ] = useState([]); const [ selectedBadgeCode, setSelectedBadgeCode ] = useState(null); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); const maxBadgeCount = GetConfiguration('user.badges.max.slots', 5); const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0); @@ -47,13 +49,6 @@ const useInventoryBadgesState = () => }); } - const selectBadge = (badgeCode: string) => - { - if(badgeCodes.indexOf(badgeCode) === -1) return; - - setSelectedBadgeCode(badgeCode); - } - const getBadgeId = (badgeCode: string) => { const index = badgeCodes.indexOf(badgeCode); @@ -81,12 +76,14 @@ const useInventoryBadgesState = () => const onBadgeReceivedEvent = useCallback((event: BadgeReceivedEvent) => { const parser = event.getParser(); + const unseen = isUnseen(UnseenItemCategory.BADGE, parser.badgeId); setBadgeCodes(prevValue => { const newValue = [ ...prevValue ]; - newValue.push(parser.badgeCode); + if(unseen) newValue.unshift(parser.badgeCode) + else newValue.push(parser.badgeCode); return newValue; }); @@ -95,11 +92,12 @@ const useInventoryBadgesState = () => { const newValue = [ ...prevValue ]; - newValue.push(parser.badgeId); + if(unseen) newValue.unshift(parser.badgeId) + else newValue.push(parser.badgeId); return newValue; }); - }, []); + }, [ isUnseen ]); UseMessageEventHook(BadgeReceivedEvent, onBadgeReceivedEvent); @@ -119,6 +117,16 @@ const useInventoryBadgesState = () => }); }, [ badgeCodes ]); + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.BADGE); + } + }, [ isVisible, resetCategory ]); + useEffect(() => { if(!isVisible || !needsUpdate) return; @@ -128,25 +136,7 @@ const useInventoryBadgesState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { badgeCodes, activeBadgeCodes, selectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, selectBadge, getBadgeId, setIsVisible }; + return { badgeCodes, activeBadgeCodes, selectedBadgeCode, setSelectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, getBadgeId, activate, deactivate }; } -export const useInventoryBadges = () => -{ - const { setIsVisible, ...rest } = useBetween(useInventoryBadgesState); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - - useEffect(() => - { - const id = activate(); - - return () => deactivate(id); - }, [ activate, deactivate ]); - - useEffect(() => - { - setIsVisible(isVisible); - }, [ isVisible, setIsVisible ]); - - return { ...rest }; -} +export const useInventoryBadges = () => useBetween(useInventoryBadgesState); diff --git a/src/hooks/inventory/useInventoryBots.ts b/src/hooks/inventory/useInventoryBots.ts index 2f13947a..86d299e2 100644 --- a/src/hooks/inventory/useInventoryBots.ts +++ b/src/hooks/inventory/useInventoryBots.ts @@ -8,13 +8,11 @@ import { useSharedVisibility } from '../useSharedVisibility'; const useInventoryBotsState = () => { - const [ isVisible, setIsVisible ] = useState(false); const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ botItems, setBotItems ] = useState([]); const [ selectedBot, setSelectedBot ] = useState(null); - const { isUnseen = null } = useInventoryUnseenTracker(); - - const selectBot = (bot: IBotItem) => setSelectedBot(bot); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); const onBotInventoryMessageEvent = useCallback((event: BotInventoryMessageEvent) => { @@ -65,7 +63,7 @@ const useInventoryBotsState = () => const unseen = isUnseen(UnseenItemCategory.BOT, botData.id); if(unseen) newValue.unshift(botItem); - newValue.push(botItem); + else newValue.push(botItem); } return newValue; @@ -87,12 +85,14 @@ const useInventoryBotsState = () => if(index >= 0) return prevValue; const botItem = { botData: parser.item } as IBotItem; + const unseen = isUnseen(UnseenItemCategory.BOT, botItem.botData.id); - newValue.push(botItem); + if(unseen) newValue.unshift(botItem); + else newValue.push(botItem); return newValue; }); - }, []); + }, [ isUnseen ]); UseMessageEventHook(BotAddedToInventoryEvent, onBotAddedToInventoryEvent); @@ -139,6 +139,16 @@ const useInventoryBotsState = () => }); }, [ botItems ]); + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.BOT); + } + }, [ isVisible, resetCategory ]); + useEffect(() => { if(!isVisible || !needsUpdate) return; @@ -148,25 +158,7 @@ const useInventoryBotsState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { botItems, selectedBot, selectBot, setIsVisible }; + return { botItems, selectedBot, setSelectedBot, activate, deactivate }; } -export const useInventoryBots = () => -{ - const { setIsVisible, ...rest } = useBetween(useInventoryBotsState); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - - useEffect(() => - { - const id = activate(); - - return () => deactivate(id); - }, [ activate, deactivate ]); - - useEffect(() => - { - setIsVisible(isVisible); - }, [ isVisible, setIsVisible ]); - - return { ...rest }; -} +export const useInventoryBots = () => useBetween(useInventoryBotsState); diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 471803aa..674ed136 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -11,18 +11,11 @@ let furniMsgFragments: Map[] = null; const useInventoryFurniState = () => { - const [ isVisible, setIsVisible ] = useState(false); const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ groupItems, setGroupItems ] = useState([]); const [ selectedItem, setSelectedItem ] = useState(null); - const { isUnseen = null, removeUnseen = null, resetCategory = null, getCount = null } = useInventoryUnseenTracker(); - - const selectItem = (item: GroupItem) => - { - //removeUnseen(UnseenItemCategory.FURNI, item.id); - - setSelectedItem(item); - } + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); const onFurnitureListAddOrUpdateEvent = useCallback((event: FurnitureListAddOrUpdateEvent) => { @@ -241,6 +234,26 @@ const useInventoryFurniState = () => }); }, [ groupItems ]); + useEffect(() => + { + if(!isVisible) return; + + return () => + { + if(resetCategory(UnseenItemCategory.FURNI)) + { + setGroupItems(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const newGroup of newValue) newGroup.hasUnseenItems = false; + + return newValue; + }); + } + } + }, [ isVisible, resetCategory ]); + useEffect(() => { if(!isVisible || !needsUpdate) return; @@ -250,18 +263,7 @@ const useInventoryFurniState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { groupItems, setGroupItems, selectedItem, selectItem, setIsVisible }; + return { groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate }; } -export const useInventoryFurni = () => -{ - const { setIsVisible, ...rest } = useBetween(useInventoryFurniState); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - - useEffect(() => - { - setIsVisible(isVisible); - }, [ isVisible, setIsVisible ]); - - return { activate, deactivate, ...rest }; -} +export const useInventoryFurni = () => useBetween(useInventoryFurniState); diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts index bbd3506a..f6e71f47 100644 --- a/src/hooks/inventory/useInventoryPets.ts +++ b/src/hooks/inventory/useInventoryPets.ts @@ -3,7 +3,7 @@ import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryUnseenTracker } from '.'; import { UseMessageEventHook } from '..'; -import { SendMessageComposer } from '../../api'; +import { SendMessageComposer, UnseenItemCategory } from '../../api'; import { IPetItem } from '../../api/inventory/IPetItem'; import { useSharedVisibility } from '../useSharedVisibility'; import { addSinglePetItem, mergePetFragments, processPetFragment, removePetItemById } from './common'; @@ -12,13 +12,11 @@ let petMsgFragments: Map[] = null; const useInventoryPetsState = () => { - const [ isVisible, setIsVisible ] = useState(false); const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ petItems, setPetItems ] = useState([]); const [ selectedPet, setSelectedPet ] = useState(null); - const { isUnseen = null } = useInventoryUnseenTracker(); - - const selectPet = (pet: IPetItem) => setSelectedPet(pet); + const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); + const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); const onPetInventoryEvent = useCallback((event: PetInventoryEvent) => { @@ -52,11 +50,11 @@ const useInventoryPetsState = () => { const newValue = [ ...prevValue ]; - addSinglePetItem(parser.pet, newValue, true); + addSinglePetItem(parser.pet, newValue, isUnseen(UnseenItemCategory.PET, parser.pet.id)); return newValue; }); - }, []); + }, [ isUnseen ]); UseMessageEventHook(PetAddedToInventoryEvent, onPetAddedToInventoryEvent); @@ -92,6 +90,16 @@ const useInventoryPetsState = () => }); }, [ petItems ]); + useEffect(() => + { + if(!isVisible) return; + + return () => + { + resetCategory(UnseenItemCategory.PET); + } + }, [ isVisible, resetCategory ]); + useEffect(() => { if(!isVisible || !needsUpdate) return; @@ -101,25 +109,7 @@ const useInventoryPetsState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { petItems, selectedPet, selectPet, setIsVisible }; + return { petItems, selectedPet, setSelectedPet, activate, deactivate }; } -export const useInventoryPets = () => -{ - const { setIsVisible, ...rest } = useBetween(useInventoryPetsState); - const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); - - useEffect(() => - { - const id = activate(); - - return () => deactivate(id); - }, [ activate, deactivate ]); - - useEffect(() => - { - setIsVisible(isVisible); - }, [ isVisible, setIsVisible ]); - - return { ...rest }; -} +export const useInventoryPets = () => useBetween(useInventoryPetsState); diff --git a/src/hooks/inventory/useInventoryUnseenTracker.ts b/src/hooks/inventory/useInventoryUnseenTracker.ts index 86ac95eb..939a21a5 100644 --- a/src/hooks/inventory/useInventoryUnseenTracker.ts +++ b/src/hooks/inventory/useInventoryUnseenTracker.ts @@ -22,88 +22,81 @@ const useInventoryUnseenTrackerState = () => return count; } - const resetCategory = (category: number) => + const resetCategory = useCallback((category: number) => { - if(!getCount(category)) return false; + let didReset = true; setUnseenItems(prevValue => { + if(!prevValue.has(category)) + { + didReset = false; + + return prevValue; + } + const newValue = new Map(prevValue); newValue.delete(category); - return newValue; - }); - - sendResetCategoryMessage(category); - - return true; - } - - const resetCategoryIfEmpty = (category: number) => - { - if(getCount(category)) return false; - - setUnseenItems(prevValue => - { - const newValue = new Map(prevValue); - - newValue.delete(category); + sendResetCategoryMessage(category); return newValue; }); - sendResetCategoryMessage(category); + return didReset; + }, []); - return true; - } - - const resetItems = (category: number, itemIds: number[]) => + const resetItems = useCallback((category: number, itemIds: number[]) => { - if(!getCount(category)) return false; + let didReset = true; setUnseenItems(prevValue => { + if(!prevValue.has(category)) + { + didReset = false; + + return prevValue; + } + const newValue = new Map(prevValue); const existing = newValue.get(category); if(existing) for(const itemId of itemIds) existing.splice(existing.indexOf(itemId), 1); + sendResetItemsMessage(category, itemIds); + return newValue; }); - sendResetItemsMessage(category, itemIds); + return didReset; + }, []); - return true; - } - - const isUnseen = (category: number, itemId: number) => + const isUnseen = useCallback((category: number, itemId: number) => { if(!unseenItems.has(category)) return false; const items = unseenItems.get(category); return (items.indexOf(itemId) >= 0); - } + }, [ unseenItems ]); - const removeUnseen = (category: number, itemId: number) => + const removeUnseen = useCallback((category: number, itemId: number) => { - if(!unseenItems.has(category)) return false; - setUnseenItems(prevValue => { + if(!prevValue.has(category)) return prevValue; + const newValue = new Map(prevValue); const items = newValue.get(category); const index = items.indexOf(itemId); - if(index >= 0) - { - items.splice(index, 1); - } + if(index >= 0) items.splice(index, 1); return newValue; }); - } + }, []); const onUnseenItemsEvent = useCallback((event: UnseenItemsEvent) => { @@ -135,7 +128,7 @@ const useInventoryUnseenTrackerState = () => UseMessageEventHook(UnseenItemsEvent, onUnseenItemsEvent); - return { getIds, getCount, getFullCount, resetCategory, resetCategoryIfEmpty, resetItems, isUnseen, removeUnseen }; + return { getIds, getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; } export const useInventoryUnseenTracker = () => useBetween(useInventoryUnseenTrackerState); From 3c0e3693e1c330313f5994f4d7a62676a9b03c30 Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 2 Apr 2022 01:37:27 -0400 Subject: [PATCH 214/331] Eslint updates --- .eslintrc.json | 33 +++++++++++++++---- .../draggable-window/DraggableWindow.tsx | 2 +- .../CatalogLayoutMarketplaceOwnItemsView.tsx | 8 ++--- .../views/widgets/GetWidgetLayout.tsx | 6 ++-- src/hooks/UseMountEffect.tsx | 1 + 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 2891f80f..e3bb1ed8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,7 +2,7 @@ "settings": { "react": { "pragma": "React", - "version": "17.0.2" + "version": "18.0.0" } }, "env": { @@ -11,7 +11,8 @@ }, "extends": [ "plugin:react/recommended", - "plugin:react/jsx-runtime" + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended" ], "parser": "@typescript-eslint/parser", "parserOptions": { @@ -26,9 +27,29 @@ "@typescript-eslint" ], "rules": { - "indent": ["error", 4, {"SwitchCase": 1}], - "array-bracket-spacing": ["error", "always"], - "brace-style": ["error", "allman"], - "react/prop-types": ["off"] + "linebreak-style": [ "off" ], + "quotes": [ "error", "single" ], + "@typescript-eslint/indent": [ "error", 4, { "SwitchCase": 1 } ], + "array-bracket-spacing": [ "error", "always" ], + "brace-style": [ "error", "allman" ], + "react/prop-types": [ "off" ], + "object-curly-spacing": [ "error", "always" ], + "@typescript-eslint/ban-types": [ + "error", + { + "types": { + "String": true, + "Boolean": true, + "Number": true, + "Symbol": true, + "{}": false, + "Object": false, + "object": false, + "Function": false + }, + "extendDefaults": true + } + ], + "no-switch-case-fall-through": [ "off" ] } } diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index 397ac436..d167c3d1 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -206,7 +206,7 @@ export const DraggableWindow: FC = props => if(index >= 0) CURRENT_WINDOWS.splice(index, 1); } - }, [ handleSelector, windowPosition, uniqueKey, disableDrag, bringToTop ]); + }, [ handleSelector, windowPosition, uniqueKey, disableDrag, offsetLeft, offsetTop, bringToTop ]); useEffect(() => { diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index e7b8e3bf..67860591 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -1,8 +1,8 @@ import { CancelMarketplaceOfferMessageComposer, GetMarketplaceOwnOffersMessageComposer, MarketplaceCancelOfferResultEvent, MarketplaceOwnOffersEvent, RedeemMarketplaceOfferCreditsMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { Button, Column, Text } from '../../../../../../common'; -import { UseMessageEventHook, UseMountEffect } from '../../../../../../hooks'; +import { UseMessageEventHook } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, OWN_OFFER } from './CatalogLayoutMarketplaceItemView'; import { MarketplaceOfferData } from './common/MarketplaceOfferData'; @@ -74,10 +74,10 @@ export const CatalogLayoutMarketplaceOwnItemsView: FC = prop SendMessageComposer(new CancelMarketplaceOfferMessageComposer(offerData.offerId)); }; - UseMountEffect(() => + useEffect(() => { SendMessageComposer(new GetMarketplaceOwnOffersMessageComposer()); - }); + }, []); return ( diff --git a/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx b/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx index 37b30b93..f5fafe61 100644 --- a/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx +++ b/src/components/hotel-view/views/widgets/GetWidgetLayout.tsx @@ -6,9 +6,9 @@ import { WidgetContainerView } from './widget-container/WidgetContainerView'; export interface GetWidgetLayoutProps { - widgetType: string; - slot: number; - widgetConf: any; + widgetType: string; + slot: number; + widgetConf: any; } export const GetWidgetLayout: FC = props => diff --git a/src/hooks/UseMountEffect.tsx b/src/hooks/UseMountEffect.tsx index 7b33ea72..0ead14b1 100644 --- a/src/hooks/UseMountEffect.tsx +++ b/src/hooks/UseMountEffect.tsx @@ -1,6 +1,7 @@ import { EffectCallback, useEffect } from 'react'; +// eslint-disable-next-line react-hooks/exhaustive-deps const useEffectOnce = (effect: EffectCallback) => useEffect(effect, []); export const UseMountEffect = (fn: Function) => useEffectOnce(() => fn()); From 093d07e38d6e513e67e34f461cc7d3879d713ad3 Mon Sep 17 00:00:00 2001 From: robbis95 <82042925+robbis95@users.noreply.github.com> Date: Sat, 2 Apr 2022 23:13:58 +0200 Subject: [PATCH 215/331] finished navigator room info --- src/components/navigator/NavigatorView.scss | 4 ++ .../NavigatorSearchResultItemInfoView.tsx | 62 +++++++++++++++++-- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/components/navigator/NavigatorView.scss b/src/components/navigator/NavigatorView.scss index 22b513ce..ef235bc0 100644 --- a/src/components/navigator/NavigatorView.scss +++ b/src/components/navigator/NavigatorView.scss @@ -59,3 +59,7 @@ } } } + +.room-info { + width: 275px; +} diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx index d6beb253..cbca0af4 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx @@ -1,7 +1,9 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomDataParser } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useEffect, useState } from 'react'; import { Overlay, Popover } from 'react-bootstrap'; -import { Base, NitroCardContentView } from '../../../../common'; +import { LocalizeText } from '../../../../api'; +import { Base, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, Text, UserProfileIconView } from '../../../../common'; interface NavigatorSearchResultItemInfoViewProps { @@ -14,6 +16,28 @@ export const NavigatorSearchResultItemInfoView: FC(null); const [ isVisible, setIsVisible ] = useState(false); + const getUserCounterColor = () => + { + const num: number = (100 * (roomData.userCount / roomData.maxUserCount)); + + let bg = 'bg-primary'; + + if(num >= 92) + { + bg = 'bg-danger'; + } + else if(num >= 50) + { + bg = 'bg-warning'; + } + else if(num > 0) + { + bg = 'bg-success'; + } + + return bg; + } + const toggle = (event: MouseEvent) => { event.stopPropagation(); @@ -39,11 +63,39 @@ export const NavigatorSearchResultItemInfoView: FC - - + + - - do it + + + + {roomData.habboGroupId > 0 && ( + )} + {roomData.doorMode !== RoomDataParser.OPEN_STATE && ( + )} + + + + {roomData.roomName} + + + + {LocalizeText("navigator.roomownercaption")} + + + {roomData.ownerName} + + + {roomData.description} + + + + {roomData.userCount} + + + From 40856b8c9462c2a44274de70f257edf7ab64414e Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 2 Apr 2022 21:12:58 -0400 Subject: [PATCH 216/331] Updates --- src/api/friends/GetGroupChatData.ts | 2 + .../inventory}/FurnitureUtilities.ts | 18 +- .../common => api/inventory}/PetUtilities.ts | 6 +- .../inventory}/TradingUtilities.ts | 7 +- src/api/inventory/index.ts | 3 + src/components/friends/FriendsView.tsx | 2 +- .../friends/views/FriendBarView.tsx | 93 -------- .../views/friends-bar/FriendBarItemView.tsx | 59 +++++ .../views/friends-bar/FriendsBarView.tsx | 28 +++ .../friends-list/FriendsListGroupView.tsx | 105 --------- .../friends-list/FriendsListRequestView.tsx | 48 ---- .../views/friends-list/FriendsListView.tsx | 4 +- .../FriendsListGroupItemView.tsx | 85 +++++++ .../FriendsListGroupView.tsx | 23 ++ .../FriendsListRequestItemView.tsx | 25 +++ .../FriendsListRequestView.tsx | 29 +++ .../messenger/FriendsMessengerThreadGroup.tsx | 84 ------- .../messenger/FriendsMessengerThreadView.tsx | 84 ------- .../views/messenger/FriendsMessengerView.tsx | 48 ++-- .../FriendsMessengerThreadGroup.tsx | 72 ++++++ .../FriendsMessengerThreadView.tsx | 16 ++ .../furniture/InventoryFurnitureView.tsx | 15 +- .../views/furniture/InventoryTradeView.tsx | 3 +- .../FriendRequestDialogView.tsx | 30 +++ .../FriendRequestWidgetView.tsx | 32 +-- src/hooks/friends/useFriends.ts | 176 +++++++-------- src/hooks/friends/useMessenger.ts | 210 ++++++++++-------- src/hooks/inventory/common/index.ts | 3 - src/hooks/inventory/index.ts | 1 - src/hooks/inventory/useInventoryFurni.ts | 3 +- src/hooks/inventory/useInventoryPets.ts | 4 +- src/hooks/inventory/useInventoryTrade.ts | 3 +- 32 files changed, 631 insertions(+), 690 deletions(-) rename src/{hooks/inventory/common => api/inventory}/FurnitureUtilities.ts (89%) rename src/{hooks/inventory/common => api/inventory}/PetUtilities.ts (91%) rename src/{hooks/inventory/common => api/inventory}/TradingUtilities.ts (87%) delete mode 100644 src/components/friends/views/FriendBarView.tsx create mode 100644 src/components/friends/views/friends-bar/FriendBarItemView.tsx create mode 100644 src/components/friends/views/friends-bar/FriendsBarView.tsx delete mode 100644 src/components/friends/views/friends-list/FriendsListGroupView.tsx delete mode 100644 src/components/friends/views/friends-list/FriendsListRequestView.tsx create mode 100644 src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx create mode 100644 src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx create mode 100644 src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx create mode 100644 src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx delete mode 100644 src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx delete mode 100644 src/components/friends/views/messenger/FriendsMessengerThreadView.tsx create mode 100644 src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx create mode 100644 src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx create mode 100644 src/components/room/widgets/friend-request/FriendRequestDialogView.tsx delete mode 100644 src/hooks/inventory/common/index.ts diff --git a/src/api/friends/GetGroupChatData.ts b/src/api/friends/GetGroupChatData.ts index 4e8a0243..75df9629 100644 --- a/src/api/friends/GetGroupChatData.ts +++ b/src/api/friends/GetGroupChatData.ts @@ -2,6 +2,8 @@ import { IGroupChatData } from './IGroupChatData'; export const GetGroupChatData = (extraData: string) => { + if(!extraData || !extraData.length) return null; + const splitData = extraData.split('/'); const username = splitData[0]; const figure = splitData[1]; diff --git a/src/hooks/inventory/common/FurnitureUtilities.ts b/src/api/inventory/FurnitureUtilities.ts similarity index 89% rename from src/hooks/inventory/common/FurnitureUtilities.ts rename to src/api/inventory/FurnitureUtilities.ts index f4a16212..741f1ea1 100644 --- a/src/hooks/inventory/common/FurnitureUtilities.ts +++ b/src/api/inventory/FurnitureUtilities.ts @@ -1,18 +1,8 @@ import { FurnitureListItemParser, IObjectData } from '@nitrots/nitro-renderer'; -import { DispatchUiEvent } from '../..'; -import { FurniCategory, FurnitureItem, GetRoomEngine, GroupItem } from '../../../api'; -import { CatalogPostMarketplaceOfferEvent } from '../../../events'; - -export const attemptPlaceMarketplaceOffer = (groupItem: GroupItem) => -{ - const item = groupItem.getLastItem(); - - if(!item) return false; - - if(!item.sellable) return false; - - DispatchUiEvent(new CatalogPostMarketplaceOfferEvent(item)); -} +import { GetRoomEngine } from '../nitro'; +import { FurniCategory } from './FurniCategory'; +import { FurnitureItem } from './FurnitureItem'; +import { GroupItem } from './GroupItem'; export const createGroupItem = (type: number, category: number, stuffData: IObjectData, extra: number = NaN) => new GroupItem(type, category, GetRoomEngine(), stuffData, extra); diff --git a/src/hooks/inventory/common/PetUtilities.ts b/src/api/inventory/PetUtilities.ts similarity index 91% rename from src/hooks/inventory/common/PetUtilities.ts rename to src/api/inventory/PetUtilities.ts index 3c023c2b..871eb538 100644 --- a/src/hooks/inventory/common/PetUtilities.ts +++ b/src/api/inventory/PetUtilities.ts @@ -1,6 +1,8 @@ import { PetData } from '@nitrots/nitro-renderer'; -import { cancelRoomObjectPlacement, CreateLinkEvent, getPlacingItemId, UnseenItemCategory } from '../../../api'; -import { IPetItem } from '../../../api/inventory/IPetItem'; +import { CreateLinkEvent } from '../nitro'; +import { cancelRoomObjectPlacement, getPlacingItemId } from './InventoryUtilities'; +import { IPetItem } from './IPetItem'; +import { UnseenItemCategory } from './unseen'; export const getAllPetIds = (petItems: IPetItem[]) => petItems.map(item => item.petData.id); diff --git a/src/hooks/inventory/common/TradingUtilities.ts b/src/api/inventory/TradingUtilities.ts similarity index 87% rename from src/hooks/inventory/common/TradingUtilities.ts rename to src/api/inventory/TradingUtilities.ts index e744f2a7..28ca8c88 100644 --- a/src/hooks/inventory/common/TradingUtilities.ts +++ b/src/api/inventory/TradingUtilities.ts @@ -1,6 +1,9 @@ import { AdvancedMap, IObjectData, ItemDataStructure, StringDataType } from '@nitrots/nitro-renderer'; -import { createGroupItem } from '.'; -import { FurniCategory, FurnitureItem, GetSessionDataManager, GroupItem } from '../../../api'; +import { GetSessionDataManager } from '../nitro'; +import { FurniCategory } from './FurniCategory'; +import { FurnitureItem } from './FurnitureItem'; +import { createGroupItem } from './FurnitureUtilities'; +import { GroupItem } from './GroupItem'; const isExternalImage = (spriteId: number) => GetSessionDataManager().getWallItemData(spriteId)?.isExternalImage || false; diff --git a/src/api/inventory/index.ts b/src/api/inventory/index.ts index 1eca74d0..de840525 100644 --- a/src/api/inventory/index.ts +++ b/src/api/inventory/index.ts @@ -1,12 +1,15 @@ export * from './FurniCategory'; export * from './FurnitureItem'; +export * from './FurnitureUtilities'; export * from './GroupItem'; export * from './IBotItem'; export * from './IFurnitureItem'; export * from './InventoryUtilities'; export * from './IPetItem'; +export * from './PetUtilities'; export * from './TradeState'; export * from './TradeUserData'; export * from './TradingNotificationMessage'; export * from './TradingNotificationType'; +export * from './TradingUtilities'; export * from './unseen'; diff --git a/src/components/friends/FriendsView.tsx b/src/components/friends/FriendsView.tsx index 5a9d271d..6d639759 100644 --- a/src/components/friends/FriendsView.tsx +++ b/src/components/friends/FriendsView.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { createPortal } from 'react-dom'; import { useFriends } from '../../hooks'; -import { FriendBarView } from './views/FriendBarView'; +import { FriendBarView } from './views/friends-bar/FriendsBarView'; import { FriendsListView } from './views/friends-list/FriendsListView'; import { FriendsMessengerView } from './views/messenger/FriendsMessengerView'; diff --git a/src/components/friends/views/FriendBarView.tsx b/src/components/friends/views/FriendBarView.tsx deleted file mode 100644 index a9978965..00000000 --- a/src/components/friends/views/FriendBarView.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { MouseEventType } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useRef, useState } from 'react'; -import { GetUserProfile, LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../api'; -import { Base, Button, Flex, LayoutAvatarImageView, LayoutBadgeImageView } from '../../../common'; -import { useFriends } from '../../../hooks'; - -interface FriendBarViewProps -{ - onlineFriends: MessengerFriend[]; -} - -export const FriendBarView: FC = props => -{ - const { onlineFriends = null } = props; - const [ indexOffset, setIndexOffset ] = useState(0); - const [ maxDisplayCount, setMaxDisplayCount ] = useState(3); - const { followFriend = null } = useFriends(); - - const FriendBarItemView: FC<{ friend: MessengerFriend }> = props => - { - const { friend = null } = props; - const [ isVisible, setVisible ] = useState(false); - const elementRef = useRef(); - - useEffect(() => - { - const onClick = (event: MouseEvent) => - { - const element = elementRef.current; - - if(!element) return; - - if((event.target !== element) && !element.contains((event.target as Node))) - { - setVisible(false); - } - } - - document.addEventListener(MouseEventType.MOUSE_CLICK, onClick); - - return () => - { - document.removeEventListener(MouseEventType.MOUSE_CLICK, onClick); - } - }, []); - - if(!friend) - { - return ( -
    -
    -
    { LocalizeText('friend.bar.find.title') }
    -
    - ); - } - - return ( -
    setVisible(prevValue => !prevValue) }> -
    0 ? 'avatar': 'group'}`}> - { friend.id > 0 && } - { friend.id <= 0 && } -
    -
    { friend.name }
    - { isVisible && -
    - OpenMessengerChat(friend.id) } /> - { friend.followingAllowed && - followFriend(friend) } /> } - GetUserProfile(friend.id) } /> -
    } -
    - ); - } - - const canDecreaseIndex = () => (indexOffset === 0) ? false : true; - const canIncreaseIndex = () => ((onlineFriends.length <= maxDisplayCount) || (indexOffset === (onlineFriends.length - 1))) ? false : true; - - return ( - - - { Array.from(Array(maxDisplayCount), (e, i) => - { - return ; - }) } - - - ); -} diff --git a/src/components/friends/views/friends-bar/FriendBarItemView.tsx b/src/components/friends/views/friends-bar/FriendBarItemView.tsx new file mode 100644 index 00000000..30f7a31e --- /dev/null +++ b/src/components/friends/views/friends-bar/FriendBarItemView.tsx @@ -0,0 +1,59 @@ +import { MouseEventType } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useRef, useState } from 'react'; +import { GetUserProfile, LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../api'; +import { Base, LayoutAvatarImageView, LayoutBadgeImageView } from '../../../../common'; +import { useFriends } from '../../../../hooks'; + +export const FriendBarItemView: FC<{ friend: MessengerFriend }> = props => +{ + const { friend = null } = props; + const [ isVisible, setVisible ] = useState(false); + const { followFriend = null } = useFriends(); + const elementRef = useRef(); + + useEffect(() => + { + const onClick = (event: MouseEvent) => + { + const element = elementRef.current; + + if(!element) return; + + if((event.target !== element) && !element.contains((event.target as Node))) + { + setVisible(false); + } + } + + document.addEventListener(MouseEventType.MOUSE_CLICK, onClick); + + return () => document.removeEventListener(MouseEventType.MOUSE_CLICK, onClick); + }, []); + + if(!friend) + { + return ( +
    +
    +
    { LocalizeText('friend.bar.find.title') }
    +
    + ); + } + + return ( +
    setVisible(prevValue => !prevValue) }> +
    0 ? 'avatar': 'group'}`}> + { (friend.id > 0) && } + { (friend.id <= 0) && } +
    +
    { friend.name }
    + { isVisible && +
    + OpenMessengerChat(friend.id) } /> + { friend.followingAllowed && + followFriend(friend) } /> } + GetUserProfile(friend.id) } /> +
    } +
    + ); +} diff --git a/src/components/friends/views/friends-bar/FriendsBarView.tsx b/src/components/friends/views/friends-bar/FriendsBarView.tsx new file mode 100644 index 00000000..8ca8eb57 --- /dev/null +++ b/src/components/friends/views/friends-bar/FriendsBarView.tsx @@ -0,0 +1,28 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { FC, useState } from 'react'; +import { MessengerFriend } from '../../../../api'; +import { Button, Flex } from '../../../../common'; +import { FriendBarItemView } from './FriendBarItemView'; + +const MAX_DISPLAY_COUNT = 3; + +export const FriendBarView: FC<{ onlineFriends: MessengerFriend[] }> = props => +{ + const { onlineFriends = null } = props; + const [ indexOffset, setIndexOffset ] = useState(0); + + const canDecreaseIndex = () => (indexOffset === 0) ? false : true; + const canIncreaseIndex = () => ((onlineFriends.length <= MAX_DISPLAY_COUNT) || (indexOffset === (onlineFriends.length - 1))) ? false : true; + + return ( + + + { Array.from(Array(MAX_DISPLAY_COUNT), (e, i) => ) } + + + ); +} diff --git a/src/components/friends/views/friends-list/FriendsListGroupView.tsx b/src/components/friends/views/friends-list/FriendsListGroupView.tsx deleted file mode 100644 index 55828a31..00000000 --- a/src/components/friends/views/friends-list/FriendsListGroupView.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { FC, MouseEvent, useState } from 'react'; -import { LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../api'; -import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../common'; -import { useFriends } from '../../../../hooks'; - -interface FriendsListGroupViewProps -{ - list: MessengerFriend[]; - selectedFriendsIds: number[]; - selectFriend: (userId: number) => void; -} - -export const FriendsListGroupView: FC = props => -{ - const { list = null, selectedFriendsIds = null, selectFriend = null } = props; - const { followFriend = null, updateRelationship = null } = useFriends(); - - if(!list || !list.length) return null; - - const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: boolean }> = props => - { - const { friend = null, selected = false } = props; - const [ isRelationshipOpen, setIsRelationshipOpen ] = useState(false); - - const clickFollowFriend = (event: MouseEvent) => - { - event.stopPropagation(); - - followFriend(friend); - } - - const openMessengerChat = (event: MouseEvent) => - { - event.stopPropagation(); - - OpenMessengerChat(friend.id); - } - - const openRelationship = (event: MouseEvent) => - { - event.stopPropagation(); - - setIsRelationshipOpen(true); - } - - const clickUpdateRelationship = (event: MouseEvent, type: number) => - { - event.stopPropagation(); - - updateRelationship(friend, type); - - setIsRelationshipOpen(false); - } - - const getCurrentRelationshipName = () => - { - if(!friend) return 'none'; - - switch(friend.relationshipStatus) - { - case MessengerFriend.RELATIONSHIP_HEART: return 'heart'; - case MessengerFriend.RELATIONSHIP_SMILE: return 'smile'; - case MessengerFriend.RELATIONSHIP_BOBBA: return 'bobba'; - default: return 'none'; - } - } - - if(!friend) return null; - - return ( - selectFriend(friend.id) }> - - event.stopPropagation() }> - - -
    { friend.name }
    -
    - - { !isRelationshipOpen && - <> - { friend.followingAllowed && - } - { friend.online && - } - { (friend.id > 0) && - } - } - { isRelationshipOpen && - <> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> - clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> - } - -
    - ); - } - - return ( - <> - { list.map((item, index) => ) } - - ); -} diff --git a/src/components/friends/views/friends-list/FriendsListRequestView.tsx b/src/components/friends/views/friends-list/FriendsListRequestView.tsx deleted file mode 100644 index bdbb414d..00000000 --- a/src/components/friends/views/friends-list/FriendsListRequestView.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC } from 'react'; -import { LocalizeText, MessengerRequest } from '../../../../api'; -import { Base, Button, Column, Flex, NitroCardAccordionItemView, NitroCardAccordionSetView, NitroCardAccordionSetViewProps, UserProfileIconView } from '../../../../common'; -import { useFriends } from '../../../../hooks'; - -export const FriendsListRequestView: FC = props => -{ - const { children = null, ...rest } = props; - const { requests = [], requestResponse = null } = useFriends(); - - if(!requests.length) return null; - - const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = props => - { - const { request = null } = props; - - if(!request) return null; - - return ( - - - -
    { request.name }
    -
    - - requestResponse(request.id, true) } /> - requestResponse(request.id, false) } /> - -
    - ); - } - - return ( - - - - { requests.map((request, index) => ) } - - - - - - { children } - - ); -} diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx index d69255a2..8dbb9c3e 100644 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ b/src/components/friends/views/friends-list/FriendsListView.tsx @@ -3,9 +3,9 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { AddEventLinkTracker, LocalizeText, MessengerFriend, RemoveLinkEventTracker, SendMessageComposer } from '../../../../api'; import { Button, Flex, NitroCardAccordionSetView, NitroCardAccordionView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useFriends } from '../../../../hooks'; -import { FriendsListGroupView } from './FriendsListGroupView'; +import { FriendsListGroupView } from './friends-list-group/FriendsListGroupView'; +import { FriendsListRequestView } from './friends-list-request/FriendsListRequestView'; import { FriendsRemoveConfirmationView } from './FriendsListRemoveConfirmationView'; -import { FriendsListRequestView } from './FriendsListRequestView'; import { FriendsRoomInviteView } from './FriendsListRoomInviteView'; import { FriendsSearchView } from './FriendsListSearchView'; diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx new file mode 100644 index 00000000..03cd7e98 --- /dev/null +++ b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupItemView.tsx @@ -0,0 +1,85 @@ +import { FC, MouseEvent, useState } from 'react'; +import { LocalizeText, MessengerFriend, OpenMessengerChat } from '../../../../../api'; +import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { useFriends } from '../../../../../hooks'; + +export const FriendsListGroupItemView: FC<{ friend: MessengerFriend, selected: boolean, selectFriend: (userId: number) => void }> = props => +{ + const { friend = null, selected = false, selectFriend = null } = props; + const [ isRelationshipOpen, setIsRelationshipOpen ] = useState(false); + const { followFriend = null, updateRelationship = null } = useFriends(); + + const clickFollowFriend = (event: MouseEvent) => + { + event.stopPropagation(); + + followFriend(friend); + } + + const openMessengerChat = (event: MouseEvent) => + { + event.stopPropagation(); + + OpenMessengerChat(friend.id); + } + + const openRelationship = (event: MouseEvent) => + { + event.stopPropagation(); + + setIsRelationshipOpen(true); + } + + const clickUpdateRelationship = (event: MouseEvent, type: number) => + { + event.stopPropagation(); + + updateRelationship(friend, type); + + setIsRelationshipOpen(false); + } + + const getCurrentRelationshipName = () => + { + if(!friend) return 'none'; + + switch(friend.relationshipStatus) + { + case MessengerFriend.RELATIONSHIP_HEART: return 'heart'; + case MessengerFriend.RELATIONSHIP_SMILE: return 'smile'; + case MessengerFriend.RELATIONSHIP_BOBBA: return 'bobba'; + default: return 'none'; + } + } + + if(!friend) return null; + + return ( + selectFriend(friend.id) }> + + event.stopPropagation() }> + + +
    { friend.name }
    +
    + + { !isRelationshipOpen && + <> + { friend.followingAllowed && + } + { friend.online && + } + { (friend.id > 0) && + } + } + { isRelationshipOpen && + <> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_HEART) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_SMILE) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_BOBBA) } /> + clickUpdateRelationship(event, MessengerFriend.RELATIONSHIP_NONE) } /> + } + +
    + ); +} diff --git a/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx new file mode 100644 index 00000000..c593003a --- /dev/null +++ b/src/components/friends/views/friends-list/friends-list-group/FriendsListGroupView.tsx @@ -0,0 +1,23 @@ +import { FC } from 'react'; +import { MessengerFriend } from '../../../../../api'; +import { FriendsListGroupItemView } from './FriendsListGroupItemView'; + +interface FriendsListGroupViewProps +{ + list: MessengerFriend[]; + selectedFriendsIds: number[]; + selectFriend: (userId: number) => void; +} + +export const FriendsListGroupView: FC = props => +{ + const { list = null, selectedFriendsIds = null, selectFriend = null } = props; + + if(!list || !list.length) return null; + + return ( + <> + { list.map((item, index) => = 0) } selectFriend={ selectFriend } />) } + + ); +} diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx new file mode 100644 index 00000000..de5d3a3b --- /dev/null +++ b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestItemView.tsx @@ -0,0 +1,25 @@ +import { FC } from 'react'; +import { MessengerRequest } from '../../../../../api'; +import { Base, Flex, NitroCardAccordionItemView, UserProfileIconView } from '../../../../../common'; +import { useFriends } from '../../../../../hooks'; + +export const FriendsListRequestItemView: FC<{ request: MessengerRequest }> = props => +{ + const { request = null } = props; + const { requestResponse = null } = useFriends(); + + if(!request) return null; + + return ( + + + +
    { request.name }
    +
    + + requestResponse(request.id, true) } /> + requestResponse(request.id, false) } /> + +
    + ); +} diff --git a/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx new file mode 100644 index 00000000..5f6e9918 --- /dev/null +++ b/src/components/friends/views/friends-list/friends-list-request/FriendsListRequestView.tsx @@ -0,0 +1,29 @@ +import { FC } from 'react'; +import { LocalizeText } from '../../../../../api'; +import { Button, Column, Flex, NitroCardAccordionSetView, NitroCardAccordionSetViewProps } from '../../../../../common'; +import { useFriends } from '../../../../../hooks'; +import { FriendsListRequestItemView } from './FriendsListRequestItemView'; + +export const FriendsListRequestView: FC = props => +{ + const { children = null, ...rest } = props; + const { requests = [], requestResponse = null } = useFriends(); + + if(!requests.length) return null; + + return ( + + + + { requests.map((request, index) => ) } + + + + + + { children } + + ); +} diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx deleted file mode 100644 index 37343c96..00000000 --- a/src/components/friends/views/messenger/FriendsMessengerThreadGroup.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../../../api'; -import { Base, Flex, LayoutAvatarImageView } from '../../../../common'; -import { GroupType } from '../../common/GroupType'; -import { MessengerThread } from '../../common/MessengerThread'; -import { MessengerThreadChat } from '../../common/MessengerThreadChat'; -import { MessengerThreadChatGroup } from '../../common/MessengerThreadChatGroup'; -import { getGroupChatData } from '../../common/Utils'; - -interface FriendsMessengerThreadGroupProps -{ - thread: MessengerThread; - group: MessengerThreadChatGroup; -} - -export const FriendsMessengerThreadGroup: FC = props => -{ - const { thread = null, group = null } = props; - - const isOwnChat = useMemo(() => - { - if(!thread || !group) return false; - - if(group.type === GroupType.PRIVATE_CHAT && (group.userId === GetSessionDataManager().userId)) return true; - - if( (group.type === GroupType.GROUP_CHAT) && (group.chats.length && getGroupChatData(group.chats[0].extraData).userId === GetSessionDataManager().userId)) return true; - - return false; - }, [ group, thread ]); - - if(!thread || !group) return null; - - if(!group.userId) - { - return ( - <> - { group.chats.map((chat, index) => - { - return ( -
    - - { chat.type === MessengerThreadChat.SECURITY_NOTIFICATION && - - - { chat.message } - } - { chat.type === MessengerThreadChat.ROOM_INVITE && - - - {(LocalizeText('messenger.invitation') + ' ') }{ chat.message } - } - -
    - ); - }) } - - ); - } - - return ( - - - { (group.type === GroupType.PRIVATE_CHAT && !isOwnChat) && - - } - { (group.type === GroupType.GROUP_CHAT && !isOwnChat) && - - } - - - - { (isOwnChat) && GetSessionDataManager().userName } - { (!isOwnChat) && ((group.type === GroupType.GROUP_CHAT) ? getGroupChatData(group.chats[0].extraData).username : thread.participant.name) - } - - { group.chats.map((chat, index) =>{ chat.message }) } - - { (isOwnChat) && - - - } - - ); -} diff --git a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx deleted file mode 100644 index 66c96a7c..00000000 --- a/src/components/friends/views/messenger/FriendsMessengerThreadView.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { FC, useMemo } from 'react'; -import { GetGroupChatData, GetSessionDataManager, GroupType, LocalizeText, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../api'; -import { Base, Flex, LayoutAvatarImageView } from '../../../../common'; - -export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props => -{ - const { thread = null } = props; - - const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: MessengerThreadChatGroup }> = props => - { - const { thread = null, group = null, ...rest } = props; - - const isOwnChat = useMemo(() => - { - if(!thread || !group) return false; - - if(group.type === GroupType.PRIVATE_CHAT && (group.userId === GetSessionDataManager().userId)) return true; - - if( (group.type === GroupType.GROUP_CHAT) && (group.chats.length && GetGroupChatData(group.chats[0].extraData).userId === GetSessionDataManager().userId)) return true; - - return false; - }, [ group, thread ]); - - if(!thread || !group) return null; - - if(!group.userId) - { - return ( - <> - { group.chats.map((chat, index) => - { - return ( - - - { (chat.type === MessengerThreadChat.SECURITY_NOTIFICATION) && - - - { chat.message } - } - { (chat.type === MessengerThreadChat.ROOM_INVITE) && - - - { `${ LocalizeText('messenger.invitation') } ${ chat.message }` } - } - - - ); - }) } - - ); - } - - return ( - - - { (group.type === GroupType.PRIVATE_CHAT && !isOwnChat) && - - } - { (group.type === GroupType.GROUP_CHAT && !isOwnChat) && - - } - - - - { (isOwnChat) && GetSessionDataManager().userName } - { (!isOwnChat) && ((group.type === GroupType.GROUP_CHAT) ? GetGroupChatData(group.chats[0].extraData).username : thread.participant.name) - } - - { group.chats.map((chat, index) =>{ chat.message }) } - - { (isOwnChat) && - - - } - - ); - } - - return ( - <> - { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } - - ); -} diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index 13364bcc..28bc8880 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -4,14 +4,14 @@ import { FC, KeyboardEvent, useEffect, useRef, useState } from 'react'; import { AddEventLinkTracker, GetUserProfile, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, Grid, LayoutAvatarImageView, LayoutBadgeImageView, LayoutGridItem, LayoutItemCountView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useMessenger } from '../../../../hooks'; -import { FriendsMessengerThreadView } from './FriendsMessengerThreadView'; +import { FriendsMessengerThreadView } from './messenger-thread/FriendsMessengerThreadView'; export const FriendsMessengerView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ lastThreadId, setLastThreadId ] = useState(-1); const [ messageText, setMessageText ] = useState(''); - const { visibleThreads = [], activeThread = null, getMessageThread = null, sendMessage = null, setActiveThread = null, closeThread = null } = useMessenger(); + const { visibleThreads = [], activeThread = null, getMessageThread = null, sendMessage = null, setActiveThreadId = null, closeThread = null } = useMessenger(); const messagesBox = useRef(); const followFriend = () => (activeThread && activeThread.participant && SendMessageComposer(new FollowFriendMessageComposer(activeThread.participant.id))); @@ -54,7 +54,7 @@ export const FriendsMessengerView: FC<{}> = props => if(!thread) return; - setActiveThread(thread); + setActiveThreadId(thread.threadId); setIsVisible(true); } } @@ -65,14 +65,7 @@ export const FriendsMessengerView: FC<{}> = props => AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ getMessageThread, setActiveThread ]); - - // useEffect(() => - // { - // if(!isVisible || activeThread || !visibleThreads || !visibleThreads.length) return; - - // setActiveThread(visibleThreads[0]); - // }, [ isVisible, visibleThreads, activeThread, setActiveThread ]); + }, [ getMessageThread, setActiveThreadId ]); useEffect(() => { @@ -83,23 +76,26 @@ export const FriendsMessengerView: FC<{}> = props => useEffect(() => { - if(!activeThread) return; - - return () => + if(isVisible && !activeThread) + { + if(lastThreadId > 0) + { + setActiveThreadId(lastThreadId); + } + else + { + if(visibleThreads.length > 0) setActiveThreadId(visibleThreads[0].threadId); + } + + return; + } + + if(!isVisible && activeThread) { - console.log('set last thread id', activeThread.threadId); setLastThreadId(activeThread.threadId); + setActiveThreadId(-1); } - }, [ activeThread ]); - - useEffect(() => - { - return () => - { - console.log('clear thread') - setActiveThread(null); - } - }, [ setActiveThread ]); + }, [ isVisible, activeThread, lastThreadId, visibleThreads, setActiveThreadId ]); if(!isVisible) return null; @@ -114,7 +110,7 @@ export const FriendsMessengerView: FC<{}> = props => { visibleThreads && (visibleThreads.length > 0) && visibleThreads.map(thread => { return ( - setActiveThread(thread) }> + setActiveThreadId(thread.threadId) }> { thread.unread && } diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx new file mode 100644 index 00000000..2ab468ef --- /dev/null +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadGroup.tsx @@ -0,0 +1,72 @@ +import { FC, useMemo } from 'react'; +import { GetGroupChatData, GetSessionDataManager, GroupType, LocalizeText, MessengerThread, MessengerThreadChat, MessengerThreadChatGroup } from '../../../../../api'; +import { Base, Flex, LayoutAvatarImageView } from '../../../../../common'; + +export const FriendsMessengerThreadGroup: FC<{ thread: MessengerThread, group: MessengerThreadChatGroup }> = props => +{ + const { thread = null, group = null } = props; + + const groupChatData = useMemo(() => ((group.type === GroupType.GROUP_CHAT) && GetGroupChatData(group.chats[0].extraData)), [ group ]); + + const isOwnChat = useMemo(() => + { + if(!thread || !group) return false; + + if((group.type === GroupType.PRIVATE_CHAT) && (group.userId === GetSessionDataManager().userId)) return true; + + if(groupChatData && group.chats.length && (groupChatData.userId === GetSessionDataManager().userId)) return true; + + return false; + }, [ thread, group, groupChatData ]); + + if(!thread || !group) return null; + + if(!group.userId) + { + return ( + <> + { group.chats.map((chat, index) => + { + return ( + + + { (chat.type === MessengerThreadChat.SECURITY_NOTIFICATION) && + + + { chat.message } + } + { (chat.type === MessengerThreadChat.ROOM_INVITE) && + + + { (LocalizeText('messenger.invitation') + ' ') }{ chat.message } + } + + + ); + }) } + + ); + } + + return ( + + + { ((group.type === GroupType.PRIVATE_CHAT) && !isOwnChat) && + } + { (groupChatData && !isOwnChat) && + } + + + + { isOwnChat && GetSessionDataManager().userName } + { !isOwnChat && (groupChatData ? groupChatData.username : thread.participant.name) } + + { group.chats.map((chat, index) => { chat.message }) } + + { isOwnChat && + + + } + + ); +} diff --git a/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx new file mode 100644 index 00000000..962a6682 --- /dev/null +++ b/src/components/friends/views/messenger/messenger-thread/FriendsMessengerThreadView.tsx @@ -0,0 +1,16 @@ +import { FC } from 'react'; +import { MessengerThread } from '../../../../../api'; +import { FriendsMessengerThreadGroup } from './FriendsMessengerThreadGroup'; + +export const FriendsMessengerThreadView: FC<{ thread: MessengerThread }> = props => +{ + const { thread = null } = props; + + thread.setRead(); + + return ( + <> + { (thread.groups.length > 0) && thread.groups.map((group, index) => ) } + + ); +} diff --git a/src/components/inventory/views/furniture/InventoryFurnitureView.tsx b/src/components/inventory/views/furniture/InventoryFurnitureView.tsx index 01d364c5..0f143b7a 100644 --- a/src/components/inventory/views/furniture/InventoryFurnitureView.tsx +++ b/src/components/inventory/views/furniture/InventoryFurnitureView.tsx @@ -2,8 +2,8 @@ import { IRoomSession, RoomObjectVariable, RoomPreviewer, Vector3d } from '@nitr import { FC, useEffect, useState } from 'react'; import { attemptItemPlacement, FurniCategory, GetRoomEngine, GetSessionDataManager, GroupItem, LocalizeText, UnseenItemCategory } from '../../../../api'; import { AutoGrid, Button, Column, Grid, LayoutLimitedEditionCompactPlateView, LayoutRarityLevelView, LayoutRoomPreviewerView, Text } from '../../../../common'; -import { useInventoryFurni, useInventoryUnseenTracker } from '../../../../hooks'; -import { attemptPlaceMarketplaceOffer } from '../../../../hooks/inventory/common'; +import { CatalogPostMarketplaceOfferEvent } from '../../../../events'; +import { DispatchUiEvent, useInventoryFurni, useInventoryUnseenTracker } from '../../../../hooks'; import { InventoryCategoryEmptyView } from '../InventoryCategoryEmptyView'; import { InventoryFurnitureItemView } from './InventoryFurnitureItemView'; import { InventoryFurnitureSearchView } from './InventoryFurnitureSearchView'; @@ -14,6 +14,17 @@ interface InventoryFurnitureViewProps roomPreviewer: RoomPreviewer; } +const attemptPlaceMarketplaceOffer = (groupItem: GroupItem) => +{ + const item = groupItem.getLastItem(); + + if(!item) return false; + + if(!item.sellable) return false; + + DispatchUiEvent(new CatalogPostMarketplaceOfferEvent(item)); +} + export const InventoryFurnitureView: FC = props => { const { roomSession = null, roomPreviewer = null } = props; diff --git a/src/components/inventory/views/furniture/InventoryTradeView.tsx b/src/components/inventory/views/furniture/InventoryTradeView.tsx index f9ce0e62..264171a9 100644 --- a/src/components/inventory/views/furniture/InventoryTradeView.tsx +++ b/src/components/inventory/views/furniture/InventoryTradeView.tsx @@ -1,10 +1,9 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IObjectData, TradingListAddItemComposer, TradingListAddItemsComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { FurniCategory, GroupItem, IFurnitureItem, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TradeState } from '../../../../api'; +import { FurniCategory, getGuildFurniType, GroupItem, IFurnitureItem, LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer, TradeState } from '../../../../api'; import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../../common'; import { useInventoryTrade } from '../../../../hooks'; -import { getGuildFurniType } from '../../../../hooks/inventory/common/TradingUtilities'; import { InventoryFurnitureSearchView } from './InventoryFurnitureSearchView'; interface InventoryTradeViewProps diff --git a/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx b/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx new file mode 100644 index 00000000..f22b2139 --- /dev/null +++ b/src/components/room/widgets/friend-request/FriendRequestDialogView.tsx @@ -0,0 +1,30 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { LocalizeText, MessengerRequest } from '../../../../api'; +import { Base, Button, Column, Flex, Text } from '../../../../common'; +import { useFriends } from '../../../../hooks'; +import { ObjectLocationView } from '../object-location/ObjectLocationView'; + +export const FriendRequestDialogView: FC<{ roomIndex: number, request: MessengerRequest, hideFriendRequest: (userId: number) => void }> = props => +{ + const { roomIndex = -1, request = null, hideFriendRequest = null } = props; + const { requestResponse = null } = useFriends(); + + return ( + + + + + { LocalizeText('widget.friendrequest.from', [ 'username' ], [ request.name ]) } + hideFriendRequest(request.requesterUserId) } /> + + + + + + + + + ); +} diff --git a/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx b/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx index ba3f60d2..e009fb20 100644 --- a/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx +++ b/src/components/room/widgets/friend-request/FriendRequestWidgetView.tsx @@ -1,18 +1,16 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomObjectCategory, RoomObjectUserType } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText, MessengerRequest, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; -import { Base, Button, Column, Flex, Text } from '../../../../common'; +import { MessengerRequest, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; import { UseEventDispatcherHook, useFriends } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; -import { ObjectLocationView } from '../object-location/ObjectLocationView'; +import { FriendRequestDialogView } from './FriendRequestDialogView'; export const FriendRequestWidgetView: FC<{}> = props => { const [ displayedRequests, setDisplayedRequests ] = useState<{ roomIndex: number, request: MessengerRequest }[]>([]); const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); const { roomSession = null, eventDispatcher = null } = useRoomContext(); - const { requests = [], requestResponse = null } = useFriends(); + const { requests = [] } = useFriends(); const hideFriendRequest = (userId: number) => { @@ -89,35 +87,13 @@ export const FriendRequestWidgetView: FC<{}> = props => if(!requests.length) return null; - const FriendRequestDialogView: FC<{ roomIndex: number, request: MessengerRequest }> = props => - { - const { roomIndex = -1, request = null } = props; - - return ( - - - - - { LocalizeText('widget.friendrequest.from', [ 'username' ], [ request.name ]) } - hideFriendRequest(request.requesterUserId) } /> - - - - - - - - - ); - } - return ( <> { displayedRequests.map((request, index) => { if(dismissedRequestIds.indexOf(request.request.requesterUserId) >= 0) return null; - return ; + return ; }) } ); diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts index 6b70c0d2..3094c54b 100644 --- a/src/hooks/friends/useFriends.ts +++ b/src/hooks/friends/useFriends.ts @@ -72,13 +72,13 @@ const useFriendsState = () => if(!canRequestFriend(userId)) return false; setSentRequests(prevValue => - { - const newSentRequests = [ ...prevValue ]; + { + const newSentRequests = [ ...prevValue ]; - newSentRequests.push(userId); + newSentRequests.push(userId); - return newSentRequests; - }); + return newSentRequests; + }); SendMessageComposer(new RequestFriendComposer(userName)); }, [ canRequestFriend ]); @@ -94,25 +94,25 @@ const useFriendsState = () => else { setRequests(prevValue => + { + const newRequests = [ ...prevValue ]; + const index = newRequests.findIndex(request => (request.id === requestId)); + + if(index === -1) return prevValue; + + if(flag) { - const newRequests = [ ...prevValue ]; - const index = newRequests.findIndex(request => (request.id === requestId)); + SendMessageComposer(new AcceptFriendMessageComposer(newRequests[index].id)); + } + else + { + SendMessageComposer(new DeclineFriendMessageComposer(false, newRequests[index].id)); + } - if(index === -1) return prevValue; + newRequests.splice(index, 1); - if(flag) - { - SendMessageComposer(new AcceptFriendMessageComposer(newRequests[index].id)); - } - else - { - SendMessageComposer(new DeclineFriendMessageComposer(false, newRequests[index].id)); - } - - newRequests.splice(index, 1); - - return newRequests; - }); + return newRequests; + }); } }, []); @@ -136,21 +136,21 @@ const useFriendsState = () => const parser = event.getParser(); setFriends(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const friend of parser.fragment) { - const newValue = [ ...prevValue ]; + const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); + const newFriend = new MessengerFriend(); + newFriend.populate(friend); - for(const friend of parser.fragment) - { - const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); - const newFriend = new MessengerFriend(); - newFriend.populate(friend); + if(index > -1) newValue[index] = newFriend; + else newValue.push(newFriend); + } - if(index > -1) newValue[index] = newFriend; - else newValue.push(newFriend); - } - - return newValue; - }); + return newValue; + }); }, []); UseMessageEventHook(FriendListFragmentEvent, onFriendsFragmentEvent); @@ -160,39 +160,39 @@ const useFriendsState = () => const parser = event.getParser(); setFriends(prevValue => + { + const newValue = [ ...prevValue ]; + + const processUpdate = (friend: FriendParser) => { - const newValue = [ ...prevValue ]; + const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); - const processUpdate = (friend: FriendParser) => + if(index === -1) { - const index = newValue.findIndex(existingFriend => (existingFriend.id === friend.id)); + const newFriend = new MessengerFriend(); + newFriend.populate(friend); - if(index === -1) - { - const newFriend = new MessengerFriend(); - newFriend.populate(friend); - - newValue.unshift(newFriend); - } - else - { - newValue[index].populate(friend); - } + newValue.unshift(newFriend); } - - for(const friend of parser.addedFriends) processUpdate(friend); - - for(const friend of parser.updatedFriends) processUpdate(friend); - - for(const removedFriendId of parser.removedFriendIds) + else { - const index = newValue.findIndex(existingFriend => (existingFriend.id === removedFriendId)); - - if(index > -1) newValue.splice(index); + newValue[index].populate(friend); } + } - return newValue; - }); + for(const friend of parser.addedFriends) processUpdate(friend); + + for(const friend of parser.updatedFriends) processUpdate(friend); + + for(const removedFriendId of parser.removedFriendIds) + { + const index = newValue.findIndex(existingFriend => (existingFriend.id === removedFriendId)); + + if(index > -1) newValue.splice(index, 1); + } + + return newValue; + }); }, []); UseMessageEventHook(FriendListUpdateEvent, onFriendsUpdateEvent); @@ -202,29 +202,29 @@ const useFriendsState = () => const parser = event.getParser(); setRequests(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const request of parser.requests) { - const newValue = [ ...prevValue ]; + const index = newValue.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); - for(const request of parser.requests) + if(index > 0) { - const index = newValue.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); - - if(index > 0) - { - newValue[index] = CloneObject(newValue[index]); - newValue[index].populate(request); - } - else - { - const newRequest = new MessengerRequest(); - newRequest.populate(request); - - newValue.push(newRequest); - } + newValue[index] = CloneObject(newValue[index]); + newValue[index].populate(request); } + else + { + const newRequest = new MessengerRequest(); + newRequest.populate(request); - return newValue; - }); + newValue.push(newRequest); + } + } + + return newValue; + }); }, []); UseMessageEventHook(FriendRequestsEvent, onFriendRequestsEvent); @@ -235,21 +235,21 @@ const useFriendsState = () => const request = parser.request; setRequests(prevValue => + { + const newRequests = [ ...prevValue ]; + + const index = newRequests.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); + + if(index === -1) { - const newRequests = [ ...prevValue ]; + const newRequest = new MessengerRequest(); + newRequest.populate(request); - const index = newRequests.findIndex(existing => (existing.requesterUserId === request.requesterUserId)); + newRequests.push(newRequest); + } - if(index === -1) - { - const newRequest = new MessengerRequest(); - newRequest.populate(request); - - newRequests.push(newRequest); - } - - return newRequests; - }); + return newRequests; + }); }, []); UseMessageEventHook(NewFriendRequestEvent, onNewFriendRequestEvent); diff --git a/src/hooks/friends/useMessenger.ts b/src/hooks/friends/useMessenger.ts index 00259b21..2076ad46 100644 --- a/src/hooks/friends/useMessenger.ts +++ b/src/hooks/friends/useMessenger.ts @@ -29,70 +29,42 @@ const useMessengerState = () => thread = new MessengerThread(friend); setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - newValue.push(thread); + newValue.push(thread); - return newValue; - }); + return newValue; + }); setHiddenThreadIds(prevValue => - { - const index = prevValue.indexOf(thread.threadId); + { + const index = prevValue.indexOf(thread.threadId); - if(index === -1) return prevValue; + if(index === -1) return prevValue; - const newValue = [ ...prevValue ]; + const newValue = [ ...prevValue ]; - newValue.splice(index, 1); + newValue.splice(index, 1); - return newValue; - }); + return newValue; + }); return thread; }, [ messageThreads, getFriend ]); - const setActiveThread = useCallback((thread: MessengerThread) => - { - if(!thread) - { - setActiveThreadId(-1); - - return; - } - - setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); - - if(index === -1) return prevValue; - - const newThread = CloneObject(newValue[index]); - - newValue[index] = newThread; - - newThread.setRead(); - - return newValue; - }); - - setActiveThreadId(thread.threadId); - }, []); - const closeThread = (threadId: number) => { setHiddenThreadIds(prevValue => - { - const newValue = [ ...prevValue ]; + { + const newValue = [ ...prevValue ]; - if(newValue.indexOf(threadId) >= 0) return prevValue; + if(newValue.indexOf(threadId) >= 0) return prevValue; - newValue.push(threadId); + newValue.push(threadId); - return newValue; - }); + return newValue; + }); } const sendMessage = (thread: MessengerThread, text: string) => @@ -104,81 +76,103 @@ const useMessengerState = () => if((messageThreads.length === 1) && (thread.groups.length === 1)) PlaySound(SoundNames.MESSENGER_NEW_THREAD); setMessageThreads(prevValue => - { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); + { + const newValue = [ ...prevValue ]; + const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); - if(index === -1) return prevValue; + if(index === -1) return prevValue; - const newThread = CloneObject(newValue[index]); + newValue[index] = CloneObject(newValue[index]); - newValue[index] = newThread; + thread = newValue[index]; - newThread.addMessage(GetSessionDataManager().userId, text, 0, null, MessengerThreadChat.CHAT); + thread.addMessage(GetSessionDataManager().userId, text, 0, null, MessengerThreadChat.CHAT); - if(activeThreadId === newThread.threadId) newThread.setRead(); + if(activeThreadId === thread.threadId) thread.setRead(); - return newValue; - }); + return newValue; + }); } const onNewConsoleMessageEvent = useCallback((event: NewConsoleMessageEvent) => { const parser = event.getParser(); - const thread = getMessageThread(parser.senderId); - - if(!thread) return; setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + + let existingIndex = newValue.findIndex(newThread => (newThread.participant && (newThread.participant.id === parser.senderId))); + let thread: MessengerThread = null; + + if(existingIndex === -1) { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); + const friend = getFriend(parser.senderId); - if(index === -1) return prevValue; + if(friend) + { + thread = new MessengerThread(friend); - const newThread = CloneObject(newValue[index]); + newValue.push(thread); + } + } + else + { + newValue[existingIndex] = CloneObject(newValue[existingIndex]); - newValue[index] = newThread; + thread = newValue[existingIndex]; + } - newThread.addMessage(parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); + thread.addMessage(parser.senderId, parser.messageText, parser.secondsSinceSent, parser.extraData); - if(activeThreadId === newThread.threadId) newThread.setRead(); + if(activeThreadId === thread.threadId) thread.setRead(); - if(newThread.unreadCount > 0) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); + if(thread.unreadCount > 0) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); - return newValue; - }); - }, [ activeThreadId, getMessageThread ]); + return newValue; + }); + }, [ activeThreadId, getFriend ]); UseMessageEventHook(NewConsoleMessageEvent, onNewConsoleMessageEvent); const onRoomInviteEvent = useCallback((event: RoomInviteEvent) => { const parser = event.getParser(); - const thread = getMessageThread(parser.senderId); - - if(!thread) return; setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + + let existingIndex = newValue.findIndex(newThread => (newThread.participant && (newThread.participant.id === parser.senderId))); + let thread: MessengerThread = null; + + if(existingIndex === -1) { - const newValue = [ ...prevValue ]; - const index = newValue.findIndex(newThread => (newThread.threadId === thread.threadId)); + const friend = getFriend(parser.senderId); - if(index === -1) return prevValue; + if(friend) + { + thread = new MessengerThread(friend); - const newThread = CloneObject(newValue[index]); + newValue.push(thread); + } + } + else + { + newValue[existingIndex] = CloneObject(newValue[existingIndex]); - newValue[index] = newThread; + thread = newValue[existingIndex]; + } - newThread.addMessage(null, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); + thread.addMessage(null, parser.messageText, 0, null, MessengerThreadChat.ROOM_INVITE); - if(activeThreadId === newThread.threadId) newThread.setRead(); + if(activeThreadId === thread.threadId) thread.setRead(); - if(newThread.unreadCount > 0) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); + if(thread.unreadCount > 0) PlaySound(SoundNames.MESSENGER_MESSAGE_RECEIVED); - return newValue; - }); - }, [ activeThreadId, getMessageThread ]); + return newValue; + }); + }, [ activeThreadId, getFriend ]); UseMessageEventHook(RoomInviteEvent, onRoomInviteEvent); @@ -192,31 +186,51 @@ const useMessengerState = () => UseMessageEventHook(RoomInviteErrorEvent, onRoomInviteErrorEvent); + useEffect(() => + { + if(activeThreadId <= 0) return; + + setMessageThreads(prevValue => + { + const newValue = [ ...prevValue ]; + + let existingIndex = newValue.findIndex(newThread => (newThread.threadId === activeThreadId)); + + if(existingIndex === -1) return; + + newValue[existingIndex] = CloneObject(newValue[existingIndex]); + + newValue[existingIndex].setRead(); + + return newValue; + }); + }, [ activeThreadId ]); + useEffect(() => { setIconState(prevValue => + { + if(!visibleThreads.length) return MessengerIconState.HIDDEN; + + let isUnread = false; + + for(const thread of visibleThreads) { - if(!visibleThreads.length) return MessengerIconState.HIDDEN; - - let isUnread = false; - - for(const thread of visibleThreads) + if(thread.unreadCount > 0) { - if(thread.unreadCount > 0) - { - isUnread = true; + isUnread = true; - break; - } + break; } + } - if(isUnread) return MessengerIconState.UNREAD; + if(isUnread) return MessengerIconState.UNREAD; - return MessengerIconState.SHOW; - }); + return MessengerIconState.SHOW; + }); }, [ visibleThreads ]); - return { messageThreads, activeThread, iconState, visibleThreads, getMessageThread, setActiveThread, closeThread, sendMessage }; + return { messageThreads, activeThread, iconState, visibleThreads, getMessageThread, setActiveThreadId, closeThread, sendMessage }; } export const useMessenger = () => useBetween(useMessengerState); diff --git a/src/hooks/inventory/common/index.ts b/src/hooks/inventory/common/index.ts deleted file mode 100644 index 9e408bb8..00000000 --- a/src/hooks/inventory/common/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './FurnitureUtilities'; -export * from './PetUtilities'; -export * from './TradingUtilities'; diff --git a/src/hooks/inventory/index.ts b/src/hooks/inventory/index.ts index 0d082803..4e70819c 100644 --- a/src/hooks/inventory/index.ts +++ b/src/hooks/inventory/index.ts @@ -1,4 +1,3 @@ -export * from './common'; export * from './useInventoryBadges'; export * from './useInventoryBots'; export * from './useInventoryFurni'; diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 674ed136..8ce8379d 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -3,9 +3,8 @@ import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryUnseenTracker } from '.'; import { UseMessageEventHook } from '..'; -import { attemptItemPlacement, cancelRoomObjectPlacement, CloneObject, CreateLinkEvent, FurnitureItem, getPlacingItemId, GroupItem, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { addFurnitureItem, attemptItemPlacement, cancelRoomObjectPlacement, CloneObject, CreateLinkEvent, FurnitureItem, getAllItemIds, getPlacingItemId, GroupItem, mergeFurniFragments, SendMessageComposer, UnseenItemCategory } from '../../api'; import { useSharedVisibility } from '../useSharedVisibility'; -import { addFurnitureItem, getAllItemIds, mergeFurniFragments } from './common'; let furniMsgFragments: Map[] = null; diff --git a/src/hooks/inventory/useInventoryPets.ts b/src/hooks/inventory/useInventoryPets.ts index f6e71f47..5ee4d0c1 100644 --- a/src/hooks/inventory/useInventoryPets.ts +++ b/src/hooks/inventory/useInventoryPets.ts @@ -3,10 +3,8 @@ import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryUnseenTracker } from '.'; import { UseMessageEventHook } from '..'; -import { SendMessageComposer, UnseenItemCategory } from '../../api'; -import { IPetItem } from '../../api/inventory/IPetItem'; +import { addSinglePetItem, IPetItem, mergePetFragments, processPetFragment, removePetItemById, SendMessageComposer, UnseenItemCategory } from '../../api'; import { useSharedVisibility } from '../useSharedVisibility'; -import { addSinglePetItem, mergePetFragments, processPetFragment, removePetItemById } from './common'; let petMsgFragments: Map[] = null; diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts index b90d42f4..0d208b52 100644 --- a/src/hooks/inventory/useInventoryTrade.ts +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -3,10 +3,9 @@ import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryFurni } from '.'; import { UseMessageEventHook } from '..'; -import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api'; +import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, parseTradeItems, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api'; import { InventoryTradeRequestEvent } from '../../events'; import { UseUiEvent } from '../events'; -import { parseTradeItems } from './common'; const useInventoryTradeState = () => { From 8fd850d8bee916169eb691ea599fbfb7288dc12a Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 2 Apr 2022 21:31:44 -0400 Subject: [PATCH 217/331] Fix friend bar offsets --- .../friends/views/friends-bar/FriendsBarView.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/friends/views/friends-bar/FriendsBarView.tsx b/src/components/friends/views/friends-bar/FriendsBarView.tsx index 8ca8eb57..75bfd505 100644 --- a/src/components/friends/views/friends-bar/FriendsBarView.tsx +++ b/src/components/friends/views/friends-bar/FriendsBarView.tsx @@ -1,5 +1,5 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { FC, useState } from 'react'; +import { FC, useRef, useState } from 'react'; import { MessengerFriend } from '../../../../api'; import { Button, Flex } from '../../../../common'; import { FriendBarItemView } from './FriendBarItemView'; @@ -10,17 +10,15 @@ export const FriendBarView: FC<{ onlineFriends: MessengerFriend[] }> = props => { const { onlineFriends = null } = props; const [ indexOffset, setIndexOffset ] = useState(0); - - const canDecreaseIndex = () => (indexOffset === 0) ? false : true; - const canIncreaseIndex = () => ((onlineFriends.length <= MAX_DISPLAY_COUNT) || (indexOffset === (onlineFriends.length - 1))) ? false : true; + const elementRef = useRef(); return ( - - { Array.from(Array(MAX_DISPLAY_COUNT), (e, i) => ) } - From ced2e2540e6c49fb2f6dd6058679e47a13ff6fff Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 3 Apr 2022 02:14:28 -0400 Subject: [PATCH 218/331] Bump renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ebaa5078..1c8b4219 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.1.21", + "@nitrots/nitro-renderer": "^1.1.22", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index b71d35ec..d8e6dea7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1450,10 +1450,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.1.21": - version "1.1.21" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.21.tgz#8d527d63510fb4c3003e7d48347cdd50b67bb5b1" - integrity sha512-futoNgDy+wD1il7gEnKly/VlRdESJZrPkG9m+jDy3bswdpRZ0RAph1XYNpNzkSchpxXib2yuKMME6ePPct/l1A== +"@nitrots/nitro-renderer@^1.1.22": + version "1.1.22" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.1.22.tgz#169bf524bd0367a1ca4527545e3bb547d05a2a96" + integrity sha512-KCc3fwyd0WFDb97BWQ/dIIZCJbqcpEATH5DlaMv52Xh6vkzsPStsGtnnnjxo4PHQ8fLOuzh+YiZcPMKNIwHtkw== dependencies: "@pixi/canvas-renderer" "^6.3.0" "@pixi/extract" "^6.3.0" From 77cb36be4481869a7afcb0870fcb92e0603d7f47 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 3 Apr 2022 14:50:31 -0400 Subject: [PATCH 219/331] Updates --- .../GetAchievementCategoryTotalUnseen.ts | 2 +- src/api/common/index.ts | 1 - src/api/index.ts | 2 +- .../handlers/RoomWidgetInfostandHandler.ts | 6 +- .../{common => utils}/ProductImageUtility.ts | 4 +- src/api/utils/index.ts | 1 + .../achievements/AchievementsView.tsx | 239 +++--------------- .../views/AchievementCategoryView.tsx | 30 ++- .../views/AchievementDetailsView.tsx | 5 +- .../AchievementListItemView.tsx | 12 +- .../achievement-list/AchievementListView.tsx | 8 +- .../AchievementsCategoryListItemView.tsx | 18 +- .../AchievementsCategoryListView.tsx | 10 +- .../checkout/CameraWidgetCheckoutView.tsx | 7 +- src/components/hc-center/HcCenterView.tsx | 39 +-- src/components/hotel-view/HotelView.tsx | 44 +--- .../views/badge/InventoryBadgeView.tsx | 2 +- .../NavigatorSearchResultItemInfoView.tsx | 8 +- src/components/purse/PurseView.tsx | 4 +- src/components/toolbar/ToolbarView.tsx | 51 +--- .../AchievementsUIUnseenCountEvent.ts | 20 -- src/events/achievements/index.ts | 1 - src/events/friends/FriendEnteredRoomEvent.ts | 48 ---- src/events/friends/index.ts | 1 - src/events/hc-center/HcCenterEvent.ts | 6 - src/events/hc-center/index.ts | 1 - src/events/index.ts | 4 - src/events/inventory/InventoryEvent.ts | 8 - .../inventory/InventoryTradeRequestEvent.ts | 27 -- .../inventory/InventoryTradeStartEvent.ts | 28 -- src/events/inventory/index.ts | 3 - src/hooks/achievements/index.ts | 1 + src/hooks/achievements/useAchievements.ts | 169 +++++++++++++ src/hooks/index.ts | 2 + src/hooks/inventory/useInventoryTrade.ts | 18 +- .../inventory/useInventoryUnseenTracker.ts | 12 +- src/hooks/session/index.ts | 1 + src/hooks/session/useSessionInfo.ts | 33 +++ 38 files changed, 341 insertions(+), 535 deletions(-) delete mode 100644 src/api/common/index.ts rename src/api/{common => utils}/ProductImageUtility.ts (94%) delete mode 100644 src/events/achievements/AchievementsUIUnseenCountEvent.ts delete mode 100644 src/events/achievements/index.ts delete mode 100644 src/events/friends/FriendEnteredRoomEvent.ts delete mode 100644 src/events/friends/index.ts delete mode 100644 src/events/hc-center/HcCenterEvent.ts delete mode 100644 src/events/hc-center/index.ts delete mode 100644 src/events/inventory/InventoryEvent.ts delete mode 100644 src/events/inventory/InventoryTradeRequestEvent.ts delete mode 100644 src/events/inventory/InventoryTradeStartEvent.ts delete mode 100644 src/events/inventory/index.ts create mode 100644 src/hooks/achievements/index.ts create mode 100644 src/hooks/achievements/useAchievements.ts create mode 100644 src/hooks/session/index.ts create mode 100644 src/hooks/session/useSessionInfo.ts diff --git a/src/api/achievements/GetAchievementCategoryTotalUnseen.ts b/src/api/achievements/GetAchievementCategoryTotalUnseen.ts index 940b7023..a2771275 100644 --- a/src/api/achievements/GetAchievementCategoryTotalUnseen.ts +++ b/src/api/achievements/GetAchievementCategoryTotalUnseen.ts @@ -6,7 +6,7 @@ export const GetAchievementCategoryTotalUnseen = (category: IAchievementCategory let unseen = 0; - for(const achievement of category.achievements) unseen += achievement.unseen; + for(const achievement of category.achievements) ((achievement.unseen > 0) && unseen++); return unseen; } diff --git a/src/api/common/index.ts b/src/api/common/index.ts deleted file mode 100644 index 8fa51bfb..00000000 --- a/src/api/common/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ProductImageUtility'; diff --git a/src/api/index.ts b/src/api/index.ts index 612baf3d..92da5d94 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,13 +1,13 @@ export * from './achievements'; export * from './campaign'; export * from './catalog'; -export * from './common'; export * from './core'; export * from './friends'; export * from './GetRendererVersion'; export * from './GetUIVersion'; export * from './groups'; export * from './inventory'; +export * from './inventory/unseen'; export * from './navigator'; export * from './nitro'; export * from './nitro/avatar'; diff --git a/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts b/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts index 5ebf0902..1b620f2b 100644 --- a/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts +++ b/src/api/nitro/room/widgets/handlers/RoomWidgetInfostandHandler.ts @@ -1,8 +1,8 @@ -import { IFurnitureData, NitroEvent, ObjectDataFactory, PetFigureData, PetRespectComposer, PetSupplementComposer, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectOperationType, RoomObjectType, RoomObjectVariable, RoomSessionFavoriteGroupUpdateEvent, RoomSessionPetInfoUpdateEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, RoomTradingLevelEnum, RoomUnitDropHandItemComposer, RoomUnitGiveHandItemComposer, RoomUnitGiveHandItemPetComposer, RoomUserData, RoomWidgetEnum, RoomWidgetEnumItemExtradataParameter, Vector3d } from '@nitrots/nitro-renderer'; +import { IFurnitureData, NitroEvent, ObjectDataFactory, PetFigureData, PetRespectComposer, PetSupplementComposer, PetType, RoomControllerLevel, RoomModerationSettings, RoomObjectCategory, RoomObjectOperationType, RoomObjectType, RoomObjectVariable, RoomSessionFavoriteGroupUpdateEvent, RoomSessionPetInfoUpdateEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, RoomTradingLevelEnum, RoomUnitDropHandItemComposer, RoomUnitGiveHandItemComposer, RoomUnitGiveHandItemPetComposer, RoomUserData, RoomWidgetEnum, RoomWidgetEnumItemExtradataParameter, TradingOpenComposer, Vector3d } from '@nitrots/nitro-renderer'; import { SendMessageComposer } from '../../..'; import { GetNitroInstance, GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture } from '../../../..'; import { PetSupplementEnum } from '../../../../../components/room/widgets/avatar-info/common/PetSupplementEnum'; -import { HelpReportUserEvent, InventoryTradeRequestEvent, WiredSelectObjectEvent } from '../../../../../events'; +import { HelpReportUserEvent, WiredSelectObjectEvent } from '../../../../../events'; import { DispatchUiEvent } from '../../../../../hooks'; import { LocalizeText } from '../../../../utils/LocalizeText'; import { RoomWidgetObjectNameEvent, RoomWidgetUpdateChatInputContentEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateInfostandFurniEvent, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUpdateInfostandRentableBotEvent, RoomWidgetUpdateInfostandUserEvent } from '../events'; @@ -119,7 +119,7 @@ export class RoomWidgetInfostandHandler extends RoomWidgetHandler this.container.roomSession.sendTakeRightsMessage((message as RoomWidgetUserActionMessage).userId); break; case RoomWidgetUserActionMessage.START_TRADING: - DispatchUiEvent(new InventoryTradeRequestEvent(userData.roomIndex, userData.name)); + SendMessageComposer(new TradingOpenComposer(userData.roomIndex)); break; // case RoomWidgetUserActionMessage.RWUAM_OPEN_HOME_PAGE: // this._container.sessionDataManager._Str_21275((message as RoomWidgetUserActionMessage).userId, _local_3.name); diff --git a/src/api/common/ProductImageUtility.ts b/src/api/utils/ProductImageUtility.ts similarity index 94% rename from src/api/common/ProductImageUtility.ts rename to src/api/utils/ProductImageUtility.ts index 460c8594..59c8c4f4 100644 --- a/src/api/common/ProductImageUtility.ts +++ b/src/api/utils/ProductImageUtility.ts @@ -1,6 +1,6 @@ import { CatalogPageMessageProductData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '..'; -import { FurniCategory } from '../../components/catalog/common/FurniCategory'; +import { FurniCategory } from '../inventory'; +import { GetRoomEngine } from '../nitro'; export class ProductImageUtility { diff --git a/src/api/utils/index.ts b/src/api/utils/index.ts index 398758cb..0b5596ee 100644 --- a/src/api/utils/index.ts +++ b/src/api/utils/index.ts @@ -6,6 +6,7 @@ export * from './LocalizeFormattedNumber'; export * from './LocalizeShortNumber'; export * from './LocalizeText'; export * from './PlaySound'; +export * from './ProductImageUtility'; export * from './Randomizer'; export * from './RoomChatFormatter'; export * from './SoundNames'; diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx index 5809c88c..4b2c38d6 100644 --- a/src/components/achievements/AchievementsView.tsx +++ b/src/components/achievements/AchievementsView.tsx @@ -1,236 +1,69 @@ -import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, ILinkEventTracker, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { AchievementCategory, AddEventLinkTracker, CloneObject, GetAchievementCategoryImageUrl, GetAchievementIsIgnored, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useMemo, useState } from 'react'; +import { AddEventLinkTracker, GetAchievementCategoryImageUrl, LocalizeText, RemoveLinkEventTracker } from '../../api'; import { Base, Column, LayoutImage, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common'; -import { AchievementsUIUnseenCountEvent } from '../../events'; -import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { useAchievements } from '../../hooks'; import { AchievementCategoryView } from './views/AchievementCategoryView'; import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView'; export const AchievementsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ isInitalized, setIsInitalized ] = useState(false); - const [ achievementCategories, setAchievementCategories ] = useState([]); - const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); - const [ achievementScore, setAchievementScore ] = useState(0); + const { achievementCategories = [], selectedCategoryCode = null, setSelectedCategoryCode = null, selectedAchievementId = -1, setSelectedAchievementId = null, achievementScore = 0, getProgress = 0, getMaxProgress = 0, setAchievementSeen = null } = useAchievements(); - const onAchievementEvent = useCallback((event: AchievementEvent) => + const selectedCategory = useMemo(() => { - const parser = event.getParser(); - const achievement = parser.achievement; - const categoryName = achievement.category; + if(selectedCategoryCode === null) return null; - setAchievementCategories(prevValue => - { - const newValue = [ ...prevValue ]; - const categoryIndex = newValue.findIndex(existing => (existing.code === categoryName)); - - if(categoryIndex === -1) - { - const category = new AchievementCategory(categoryName); - - category.achievements.push(achievement); - - newValue.push(category); - } - else - { - const category = CloneObject(newValue[categoryIndex]); - const newAchievements = [ ...category.achievements ]; - const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); - let previousAchievement: AchievementData = null; - - if(achievementIndex === -1) - { - newAchievements.push(achievement); - } - else - { - previousAchievement = newAchievements[achievementIndex]; - - newAchievements[achievementIndex] = achievement; - } - - if(!GetAchievementIsIgnored(achievement)) - { - achievement.unseen++; - - if(previousAchievement) achievement.unseen += previousAchievement.unseen; - } - - category.achievements = newAchievements; - - newValue[categoryIndex] = category; - } - - return newValue; - }); - }, []); - - UseMessageEventHook(AchievementEvent, onAchievementEvent); - - const onAchievementsEvent = useCallback((event: AchievementsEvent) => - { - const parser = event.getParser(); - - const categories: AchievementCategory[] = []; - - for(const achievement of parser.achievements) - { - const categoryName = achievement.category; - - let existing = categories.find(category => (category.code === categoryName)); - - if(!existing) - { - existing = new AchievementCategory(categoryName); - - categories.push(existing); - } - - existing.achievements.push(achievement); - } - - setAchievementCategories(categories); - setIsInitalized(true); - }, []); - - UseMessageEventHook(AchievementsEvent, onAchievementsEvent); - - const onAchievementsScoreEvent = useCallback((event: AchievementsScoreEvent) => - { - const parser = event.getParser(); - - setAchievementScore(parser.score); - }, []); - - UseMessageEventHook(AchievementsScoreEvent, onAchievementsScoreEvent); - - const getTotalUnseen = useMemo(() => - { - let unseen = 0; - - for(const category of achievementCategories) - { - for(const achievement of category.achievements) unseen += achievement.unseen; - } - - return unseen; - }, [ achievementCategories ]); - - const getProgress = useMemo(() => - { - let progress = 0; - - for(const category of achievementCategories) progress += category.getProgress(); - - return progress; - }, [ achievementCategories ]); - - const getMaxProgress = useMemo(() => - { - let progress = 0; - - for(const category of achievementCategories) progress += category.getMaxProgress(); - - return progress; - }, [ achievementCategories ]); - - const scaledProgressPercent = useMemo(() => - { - return ~~((((getProgress - 0) * (100 - 0)) / (getMaxProgress - 0)) + 0); - }, [ getProgress, getMaxProgress ]); - - const getSelectedCategory = useMemo(() => - { - if(!achievementCategories || !achievementCategories.length) return null; - - return achievementCategories.find(existing => (existing.code === selectedCategoryCode)); + return achievementCategories.find(category => (category.code === selectedCategoryCode)); }, [ achievementCategories, selectedCategoryCode ]); - const setAchievementSeen = useCallback((code: string, achievementId: number) => - { - setAchievementCategories(prevValue => - { - const newValue = [ ...prevValue ]; - - 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; - } - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (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; + } + }, eventUrlPrefix: 'achievements/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); - useEffect(() => - { - if(!isVisible || isInitalized) return; - - SendMessageComposer(new RequestAchievementsMessageComposer()); - }, [ isVisible, isInitalized ]); - - useEffect(() => - { - DispatchUiEvent(new AchievementsUIUnseenCountEvent(getTotalUnseen)); - }, [ getTotalUnseen ]); - - if(!isVisible || !isInitalized) return null; + if(!isVisible) return null; return ( setIsVisible(false) } /> - { getSelectedCategory && + { selectedCategory && setSelectedCategoryCode(null) } className="nitro-achievements-back-arrow" /> - { LocalizeText(`quests.${ getSelectedCategory.code }.name`) } - { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ getSelectedCategory.getProgress().toString(), getSelectedCategory.getMaxProgress().toString() ]) } + { LocalizeText(`quests.${ selectedCategory.code }.name`) } + { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString() ]) } - + } - { !getSelectedCategory && + { !selectedCategory && <> @@ -238,8 +71,8 @@ export const AchievementsView: FC<{}> = props => } - { getSelectedCategory && - } + { selectedCategory && + } ); diff --git a/src/components/achievements/views/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx index e8a20579..d5834c7c 100644 --- a/src/components/achievements/views/AchievementCategoryView.tsx +++ b/src/components/achievements/views/AchievementCategoryView.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useMemo, useState } from 'react'; +import { Dispatch, FC, SetStateAction, useEffect, useMemo } from 'react'; import { AchievementCategory } from '../../../api'; import { Column } from '../../../common'; import { AchievementListView } from './achievement-list/AchievementListView'; @@ -7,40 +7,44 @@ import { AchievementDetailsView } from './AchievementDetailsView'; interface AchievementCategoryViewProps { category: AchievementCategory; + selectedAchievementId: number; + setSelectedAchievementId: Dispatch>; setAchievementSeen: (code: string, achievementId: number) => void; } export const AchievementCategoryView: FC = props => { - const { category = null, setAchievementSeen = null } = props; - const [ selectedAchievementId, setSelectedAchievementId ] = useState(0); + const { category = null, selectedAchievementId = -1, setSelectedAchievementId = null, setAchievementSeen = null } = props; - const getSelectedAchievement = useMemo(() => + const selectedAchievement = useMemo(() => { - if(!category || !category.achievements.length) return null; + if(selectedAchievementId === -1) return null; - return category.achievements.find(existing => (existing.achievementId === selectedAchievementId)); + return category.achievements.find(achievement => (achievement.achievementId === selectedAchievementId)); }, [ category, selectedAchievementId ]); useEffect(() => { - setSelectedAchievementId((!category || !category.achievements.length) ? 0 : category.achievements[0].achievementId); - }, [ category ]); + if(!selectedAchievement) + { + if(category.achievements.length) setSelectedAchievementId(category.achievements[0].achievementId); + } + }, [ selectedAchievement, category, setSelectedAchievementId ]); useEffect(() => { - if(!getSelectedAchievement || !getSelectedAchievement.unseen) return; + if(!selectedAchievement) return; - setAchievementSeen(category.code, getSelectedAchievement.achievementId); - }, [ category, getSelectedAchievement, setAchievementSeen ]); + setAchievementSeen(category.code, selectedAchievement.achievementId); + }, [ selectedAchievement, category, setAchievementSeen ]); if(!category) return null; return ( - { getSelectedAchievement && - } + { !!selectedAchievement && + } ); } diff --git a/src/components/achievements/views/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx index 64532f52..0c0065a9 100644 --- a/src/components/achievements/views/AchievementDetailsView.tsx +++ b/src/components/achievements/views/AchievementDetailsView.tsx @@ -11,12 +11,12 @@ interface AchievementDetailsViewProps export const AchievementDetailsView: FC = props => { - const { achievement = null } = props; + const { achievement = null, children = null, ...rest } = props; if(!achievement) return null; return ( - + @@ -48,6 +48,7 @@ export const AchievementDetailsView: FC = props => } } + { children } ) } diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx index 0041783b..1c1d0687 100644 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx @@ -1,21 +1,23 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; -import { LayoutGridItem, LayoutGridItemProps } from '../../../../common'; +import { Dispatch, FC, SetStateAction } from 'react'; +import { LayoutGridItem } from '../../../../common'; import { AchievementBadgeView } from '../AchievementBadgeView'; -interface AchievementListItemViewProps extends LayoutGridItemProps +interface AchievementListItemViewProps { achievement: AchievementData; + selectedAchievementId: number; + setSelectedAchievementId: Dispatch>; } export const AchievementListItemView: FC = props => { - const { achievement = null, children = null, ...rest } = props; + const { achievement = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; if(!achievement) return null; return ( - + 0) } onClick={ event => setSelectedAchievementId(achievement.achievementId) } { ...rest }> { children } diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx index bad0ffe9..25cbb942 100644 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListView.tsx @@ -3,7 +3,7 @@ import { Dispatch, FC, SetStateAction } from 'react'; import { AutoGrid } from '../../../../common'; import { AchievementListItemView } from './AchievementListItemView'; -export interface AchievementListViewProps +interface AchievementListViewProps { achievements: AchievementData[]; selectedAchievementId: number; @@ -12,11 +12,11 @@ export interface AchievementListViewProps export const AchievementListView: FC = props => { - const { achievements = null, selectedAchievementId = 0, setSelectedAchievementId = null, children = null } = props; + const { achievements = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; return ( - - { achievements && (achievements.length > 0) && achievements.map((achievement, index) => 0) } onClick={ event => setSelectedAchievementId(achievement.achievementId) } />) } + + { achievements && (achievements.length > 0) && achievements.map((achievement, index) => ) } { children } ); diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx index 92661d9c..7b301486 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx @@ -1,15 +1,19 @@ -import { FC } from 'react'; +import { Dispatch, FC, SetStateAction } from 'react'; import { GetAchievementCategoryImageUrl, GetAchievementCategoryMaxProgress, GetAchievementCategoryProgress, GetAchievementCategoryTotalUnseen, IAchievementCategory, LocalizeText } from '../../../../api'; -import { LayoutBackgroundImage, LayoutGridItem, LayoutGridItemProps, Text } from '../../../../common'; +import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common'; -export interface AchievementCategoryListItemViewProps extends LayoutGridItemProps +interface AchievementCategoryListItemViewProps { category: IAchievementCategory; + selectedCategoryCode: string; + setSelectedCategoryCode: Dispatch>; } export const AchievementsCategoryListItemView: FC = props => { - const { category = null, children = null, ...rest } = props; + const { category = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; + + if(!category) return null; const progress = GetAchievementCategoryProgress(category); const maxProgress = GetAchievementCategoryMaxProgress(category); @@ -17,9 +21,9 @@ export const AchievementsCategoryListItemView: FC - { LocalizeText(`quests.${ category.code }.name`) } - + setSelectedCategoryCode(category.code) } { ...rest }> + { LocalizeText(`quests.${ category.code }.name`) } + { progress } / { maxProgress } { children } diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx index f77dabbf..c0f51fa4 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx @@ -1,9 +1,9 @@ import { Dispatch, FC, SetStateAction } from 'react'; import { IAchievementCategory } from '../../../../api'; -import { AutoGrid, AutoGridProps } from '../../../../common'; +import { AutoGrid } from '../../../../common'; import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; -export interface AchievementsCategoryListViewProps extends AutoGridProps +interface AchievementsCategoryListViewProps { categories: IAchievementCategory[]; selectedCategoryCode: string; @@ -12,11 +12,11 @@ export interface AchievementsCategoryListViewProps extends AutoGridProps export const AchievementsCategoryListView: FC = props => { - const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null, columnCount = 3, columnMinWidth = 90, columnMinHeight = 100, children = null, ...rest } = props; + const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; return ( - - { categories && (categories.length > 0) && categories.map((category, index) => setSelectedCategoryCode(category.code) } /> ) } + + { categories && (categories.length > 0) && categories.map((category, index) => ) } { children } ); diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx index a399d1ac..2c8680f3 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx @@ -1,9 +1,8 @@ import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; +import { CreateLinkEvent, GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { InventoryEvent } from '../../../../events'; -import { DispatchUiEvent, UseMessageEventHook } from '../../../../hooks'; +import { UseMessageEventHook } from '../../../../hooks'; export interface CameraWidgetCheckoutViewProps { @@ -122,7 +121,7 @@ export const CameraWidgetCheckoutView: FC = props { (picturesBought > 0) && { LocalizeText('camera.purchase.count.info') } { picturesBought } - DispatchUiEvent(new InventoryEvent(InventoryEvent.SHOW_INVENTORY)) }>{ LocalizeText('camera.open.inventory') } + CreateLinkEvent('inventory/open') }>{ LocalizeText('camera.open.inventory') } } diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx index 4a5fd5cc..94f70260 100644 --- a/src/components/hc-center/HcCenterView.tsx +++ b/src/components/hc-center/HcCenterView.tsx @@ -1,10 +1,9 @@ -import { BadgesEvent, ClubGiftInfoEvent, FigureUpdateEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, RequestBadgesComposer, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent, UserInfoEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; +import { BadgesEvent, ClubGiftInfoEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, RequestBadgesComposer, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { OverlayTrigger, Popover } from 'react-bootstrap'; import { AddEventLinkTracker, CreateLinkEvent, GetConfiguration, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { HcCenterEvent } from '../../events'; -import { UseMessageEventHook, UseUiEvent } from '../../hooks'; +import { UseMessageEventHook, useSessionInfo } from '../../hooks'; import { BadgeResolver } from './common/BadgeResolver'; import { ClubStatus } from './common/ClubStatus'; @@ -12,7 +11,6 @@ import { ClubStatus } from './common/ClubStatus'; export const HcCenterView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); - const [ userFigure, setUserFigure ] = useState(null); const [ kickbackData, setKickbackData ] = useState(null); const [ clubDays, setClubDays ] = useState(0); const [ pastClubDays, setPastClubDays ] = useState(0); @@ -21,6 +19,7 @@ export const HcCenterView: FC<{}> = props => const [ clubStatus, setClubStatus ] = useState(ClubStatus.NONE); const [ unclaimedGifts, setUnclaimedGifts ] = useState(0); const [ badgeCode, setBadgeCode ] = useState(BadgeResolver.default_badge); + const { userFigure = null } = useSessionInfo(); const getClubText = () => { @@ -64,36 +63,6 @@ export const HcCenterView: FC<{}> = props => return LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData.creditRewardForStreakBonus + kickbackData.creditRewardForMonthlySpent).toString() ]); } - const onUserInfoEvent = useCallback((event: UserInfoEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.userInfo.figure); - }, []); - - UseMessageEventHook(UserInfoEvent, onUserInfoEvent); - - const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }, []); - - UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); - - const onHcCenterEvent = useCallback((event: HcCenterEvent) => - { - switch(event.type) - { - case HcCenterEvent.TOGGLE_HC_CENTER: - setIsVisible(!isVisible); - break; - } - }, [ isVisible ]); - - UseUiEvent(HcCenterEvent.TOGGLE_HC_CENTER, onHcCenterEvent); - const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => { const parser = event.getParser(); @@ -265,7 +234,7 @@ export const HcCenterView: FC<{}> = props =>
    {LocalizeText('hccenter.special.amount.title')}
    {getHcPaydayAmount()}
    - +
    {LocalizeText('hccenter.breakdown.infolink')}
    diff --git a/src/components/hotel-view/HotelView.tsx b/src/components/hotel-view/HotelView.tsx index 13df886f..51d3eeab 100644 --- a/src/components/hotel-view/HotelView.tsx +++ b/src/components/hotel-view/HotelView.tsx @@ -1,36 +1,16 @@ -import { FigureUpdateEvent, RoomSessionEvent, UserInfoDataParser, UserInfoEvent } from '@nitrots/nitro-renderer'; +import { RoomSessionEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; import { GetConfiguration, GetConfigurationManager } from '../../api'; import { LayoutAvatarImageView } from '../../common'; -import { UseMessageEventHook, UseRoomSessionManagerEvent } from '../../hooks'; +import { UseRoomSessionManagerEvent, useSessionInfo } from '../../hooks'; import { WidgetSlotView } from './views/widgets/WidgetSlotView'; + +const widgetSlotCount = 7; + export const HotelView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(true); - const widgetSlotCount = 7; - const [ userFigure, setUserFigure ] = useState(null); - const [ userInfo, setUserInfo ] = useState(null); - - - const onUserInfoEvent = useCallback((event: UserInfoEvent) => - { - const parser = event.getParser(); - - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - }, []); - - UseMessageEventHook(UserInfoEvent, onUserInfoEvent); - - const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }, []); - - UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); - + const { userFigure = null } = useSessionInfo(); const onRoomSessionEvent = useCallback((event: RoomSessionEvent) => { @@ -51,12 +31,12 @@ export const HotelView: FC<{}> = props => if(!isVisible) return null; const backgroundColor = GetConfiguration('hotelview')['images']['background.colour']; - const background = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['background']); - const sun = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['sun']); - const drape = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['drape']); - const left = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['left']); - const rightRepeat = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['right.repeat']); - const right = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['right']); + const background = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['background']); + const sun = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['sun']); + const drape = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['drape']); + const left = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['left']); + const rightRepeat = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['right.repeat']); + const right = GetConfigurationManager().interpolate(GetConfiguration('hotelview')['images']['right']); return (
    diff --git a/src/components/inventory/views/badge/InventoryBadgeView.tsx b/src/components/inventory/views/badge/InventoryBadgeView.tsx index 336899b6..eb4e2fbe 100644 --- a/src/components/inventory/views/badge/InventoryBadgeView.tsx +++ b/src/components/inventory/views/badge/InventoryBadgeView.tsx @@ -8,7 +8,7 @@ export const InventoryBadgeView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, getBadgeId = null, activate = null, deactivate = null } = useInventoryBadges(); - const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); + const { isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); useEffect(() => { diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx index cbca0af4..6b1959c9 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx @@ -70,9 +70,9 @@ export const NavigatorSearchResultItemInfoView: FC {roomData.habboGroupId > 0 && ( - )} + )} {roomData.doorMode !== RoomDataParser.OPEN_STATE && ( - )} + )} @@ -80,7 +80,7 @@ export const NavigatorSearchResultItemInfoView: FC - {LocalizeText("navigator.roomownercaption")} + {LocalizeText('navigator.roomownercaption')} {roomData.description} - + {roomData.userCount} diff --git a/src/components/purse/PurseView.tsx b/src/components/purse/PurseView.tsx index eef8db1e..fa8c14dd 100644 --- a/src/components/purse/PurseView.tsx +++ b/src/components/purse/PurseView.tsx @@ -2,7 +2,7 @@ import { ActivityPointNotificationMessageEvent, FriendlyTime, HabboClubLevelEnum import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { CreateLinkEvent, GetConfiguration, LocalizeText, PlaySound, SendMessageComposer, SoundNames } from '../../api'; import { Column, Flex, Grid, LayoutCurrencyIcon, Text } from '../../common'; -import { HcCenterEvent, UserSettingsUIEvent } from '../../events'; +import { UserSettingsUIEvent } from '../../events'; import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; import { IPurse } from './common/IPurse'; import { Purse } from './common/Purse'; @@ -179,7 +179,7 @@ export const PurseView: FC<{}> = props => { getCurrencyElements(0, 2) } { !hcDisabled && - DispatchUiEvent(new HcCenterEvent(HcCenterEvent.TOGGLE_HC_CENTER)) }> + CreateLinkEvent('habboUI/open/hccenter') }> { getClubText } } diff --git a/src/components/toolbar/ToolbarView.tsx b/src/components/toolbar/ToolbarView.tsx index 213f6196..cc78c737 100644 --- a/src/components/toolbar/ToolbarView.tsx +++ b/src/components/toolbar/ToolbarView.tsx @@ -1,44 +1,24 @@ -import { Dispose, DropBounce, EaseOut, FigureUpdateEvent, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, UserInfoDataParser, UserInfoEvent, Wait } from '@nitrots/nitro-renderer'; +import { Dispose, DropBounce, EaseOut, JumpBy, Motions, NitroToolbarAnimateIconEvent, PerkAllowancesMessageEvent, PerkEnum, Queue, Wait } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; import { CreateLinkEvent, GetSessionDataManager, MessengerIconState, OpenMessengerChat, VisitDesktop } from '../../api'; import { Base, Flex, LayoutAvatarImageView, LayoutItemCountView, TransitionAnimation, TransitionAnimationTypes } from '../../common'; -import { AchievementsUIUnseenCountEvent, ModToolsEvent } from '../../events'; -import { DispatchUiEvent, useFriends, useInventoryUnseenTracker, UseMessageEventHook, useMessenger, UseRoomEngineEvent, UseUiEvent } from '../../hooks'; +import { ModToolsEvent } from '../../events'; +import { DispatchUiEvent, useAchievements, useFriends, useInventoryUnseenTracker, UseMessageEventHook, useMessenger, UseRoomEngineEvent, useSessionInfo } from '../../hooks'; import { ToolbarMeView } from './ToolbarMeView'; export const ToolbarView: FC<{ isInRoom: boolean }> = props => { const { isInRoom } = props; - const [ userInfo, setUserInfo ] = useState(null); - const [ userFigure, setUserFigure ] = useState(null); const [ isMeExpanded, setMeExpanded ] = useState(false); const [ useGuideTool, setUseGuideTool ] = useState(false); - const [ unseenAchievementCount, setUnseenAchievementCount ] = useState(0); - const { getFullCount = null } = useInventoryUnseenTracker(); + const { userFigure = null } = useSessionInfo(); + const { getFullCount = 0 } = useInventoryUnseenTracker(); + const { getTotalUnseen = 0 } = useAchievements(); const { requests = [] } = useFriends(); const { iconState = MessengerIconState.HIDDEN } = useMessenger(); const isMod = GetSessionDataManager().isModerator; - const onUserInfoEvent = useCallback((event: UserInfoEvent) => - { - const parser = event.getParser(); - - setUserInfo(parser.userInfo); - setUserFigure(parser.userInfo.figure); - }, []); - - UseMessageEventHook(UserInfoEvent, onUserInfoEvent); - - const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => - { - const parser = event.getParser(); - - setUserFigure(parser.figure); - }, []); - - UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); - const onPerkAllowancesMessageEvent = useCallback((event: PerkAllowancesMessageEvent) => { const parser = event.getParser(); @@ -48,13 +28,6 @@ export const ToolbarView: FC<{ isInRoom: boolean }> = props => UseMessageEventHook(PerkAllowancesMessageEvent, onPerkAllowancesMessageEvent); - const onAchievementsUIUnseenCountEvent = useCallback((event: AchievementsUIUnseenCountEvent) => - { - setUnseenAchievementCount(event.count); - }, []); - - UseUiEvent(AchievementsUIUnseenCountEvent.UNSEEN_COUNT, onAchievementsUIUnseenCountEvent); - const animationIconToToolbar = useCallback((iconName: string, image: HTMLImageElement, x: number, y: number) => { const target = (document.body.getElementsByClassName(iconName)[0] as HTMLElement); @@ -96,20 +69,18 @@ export const ToolbarView: FC<{ isInRoom: boolean }> = props => UseRoomEngineEvent(NitroToolbarAnimateIconEvent.ANIMATE_ICON, onNitroToolbarAnimateIconEvent); - const unseenInventoryCount = getFullCount(); - return ( <> - + setMeExpanded(!isMeExpanded) }> - { (unseenAchievementCount > 0) && - } + { (getTotalUnseen > 0) && + } { isInRoom && VisitDesktop() } /> } @@ -118,8 +89,8 @@ export const ToolbarView: FC<{ isInRoom: boolean }> = props => CreateLinkEvent('navigator/toggle') } /> CreateLinkEvent('catalog/toggle') } /> CreateLinkEvent('inventory/toggle') }> - { (unseenInventoryCount > 0) && - } + { (getFullCount > 0) && + } { isInRoom && CreateLinkEvent('camera/toggle') } /> } diff --git a/src/events/achievements/AchievementsUIUnseenCountEvent.ts b/src/events/achievements/AchievementsUIUnseenCountEvent.ts deleted file mode 100644 index 330e991c..00000000 --- a/src/events/achievements/AchievementsUIUnseenCountEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class AchievementsUIUnseenCountEvent extends NitroEvent -{ - public static UNSEEN_COUNT: string = 'AUUCE_UNSEEN_COUNT'; - - private _count: number; - - constructor(count: number) - { - super(AchievementsUIUnseenCountEvent.UNSEEN_COUNT); - - this._count = count; - } - - public get count(): number - { - return this._count; - } -} diff --git a/src/events/achievements/index.ts b/src/events/achievements/index.ts deleted file mode 100644 index 9bebf51d..00000000 --- a/src/events/achievements/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './AchievementsUIUnseenCountEvent'; diff --git a/src/events/friends/FriendEnteredRoomEvent.ts b/src/events/friends/FriendEnteredRoomEvent.ts deleted file mode 100644 index 698e5407..00000000 --- a/src/events/friends/FriendEnteredRoomEvent.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class FriendEnteredRoomEvent extends NitroEvent -{ - public static ENTERED: string = 'FERE_ENTERED'; - - private _roomIndex: number; - private _category: number; - private _id: number; - private _name: string; - private _userType: number; - - constructor(roomIndex: number, category: number, id: number, name: string, userType: number) - { - super(FriendEnteredRoomEvent.ENTERED); - - this._roomIndex = roomIndex; - this._category = category; - this._id = id; - this._name = name; - this._userType = userType; - } - - public get roomIndex(): number - { - return this._roomIndex; - } - - public get category(): number - { - return this._category; - } - - public get id(): number - { - return this._id; - } - - public get name(): string - { - return this._name; - } - - public get userType(): number - { - return this._userType; - } -} diff --git a/src/events/friends/index.ts b/src/events/friends/index.ts deleted file mode 100644 index fe4cbb5b..00000000 --- a/src/events/friends/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './FriendEnteredRoomEvent'; diff --git a/src/events/hc-center/HcCenterEvent.ts b/src/events/hc-center/HcCenterEvent.ts deleted file mode 100644 index 1beec349..00000000 --- a/src/events/hc-center/HcCenterEvent.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class HcCenterEvent extends NitroEvent -{ - public static TOGGLE_HC_CENTER: string = 'HCC_TOGGLE'; -} diff --git a/src/events/hc-center/index.ts b/src/events/hc-center/index.ts deleted file mode 100644 index 8bea7bdc..00000000 --- a/src/events/hc-center/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './HcCenterEvent'; diff --git a/src/events/index.ts b/src/events/index.ts index bb569cd6..fd1f1572 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -1,11 +1,7 @@ -export * from './achievements'; export * from './catalog'; export * from './floorplan-editor'; -export * from './friends'; export * from './guide-tool'; -export * from './hc-center'; export * from './help'; -export * from './inventory'; export * from './mod-tools'; export * from './notification-center'; export * from './room-widgets'; diff --git a/src/events/inventory/InventoryEvent.ts b/src/events/inventory/InventoryEvent.ts deleted file mode 100644 index 94d242dd..00000000 --- a/src/events/inventory/InventoryEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class InventoryEvent extends NitroEvent -{ - public static SHOW_INVENTORY: string = 'IE_SHOW_INVENTORY'; - public static HIDE_INVENTORY: string = 'IE_HIDE_INVENTORY'; - public static TOGGLE_INVENTORY: string = 'IE_TOGGLE_INVENTORY'; -} diff --git a/src/events/inventory/InventoryTradeRequestEvent.ts b/src/events/inventory/InventoryTradeRequestEvent.ts deleted file mode 100644 index 8cc0ee9f..00000000 --- a/src/events/inventory/InventoryTradeRequestEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { InventoryEvent } from './InventoryEvent'; - -export class InventoryTradeRequestEvent extends InventoryEvent -{ - public static REQUEST_TRADE: string = 'ITSE_REQUEST_TRADE'; - - private _objectId: number; - private _username: string; - - constructor(objectId: number, username: string) - { - super(InventoryTradeRequestEvent.REQUEST_TRADE); - - this._objectId = objectId; - this._username = username; - } - - public get objectId(): number - { - return this._objectId; - } - - public get username(): string - { - return this._username; - } -} diff --git a/src/events/inventory/InventoryTradeStartEvent.ts b/src/events/inventory/InventoryTradeStartEvent.ts deleted file mode 100644 index afe5a386..00000000 --- a/src/events/inventory/InventoryTradeStartEvent.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { TradeUserData } from '../../api'; -import { InventoryEvent } from './InventoryEvent'; - -export class InventoryTradeStartEvent extends InventoryEvent -{ - public static START_TRADE: string = 'ITSE_START_TRADE'; - - private _ownUserTradeData: TradeUserData; - private _otherUserTradeData: TradeUserData; - - constructor(ownUserTradeData: TradeUserData, otherUserTradeData: TradeUserData) - { - super(InventoryTradeStartEvent.START_TRADE); - - this._ownUserTradeData = ownUserTradeData; - this._otherUserTradeData = otherUserTradeData; - } - - public get ownUserTradeData(): TradeUserData - { - return this._ownUserTradeData; - } - - public get otherUserTradeData(): TradeUserData - { - return this._otherUserTradeData; - } -} diff --git a/src/events/inventory/index.ts b/src/events/inventory/index.ts deleted file mode 100644 index e795837f..00000000 --- a/src/events/inventory/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './InventoryEvent'; -export * from './InventoryTradeRequestEvent'; -export * from './InventoryTradeStartEvent'; diff --git a/src/hooks/achievements/index.ts b/src/hooks/achievements/index.ts new file mode 100644 index 00000000..1a2a81e1 --- /dev/null +++ b/src/hooks/achievements/index.ts @@ -0,0 +1 @@ +export * from './useAchievements'; diff --git a/src/hooks/achievements/useAchievements.ts b/src/hooks/achievements/useAchievements.ts new file mode 100644 index 00000000..7b06bd4c --- /dev/null +++ b/src/hooks/achievements/useAchievements.ts @@ -0,0 +1,169 @@ +import { AchievementData, AchievementEvent, AchievementsEvent, AchievementsScoreEvent, RequestAchievementsMessageComposer } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { AchievementCategory, CloneObject, GetAchievementCategoryTotalUnseen, GetAchievementIsIgnored, SendMessageComposer } from '../../api'; +import { UseMessageEventHook } from '../messages'; + +const useAchievementsState = () => +{ + const [ needsUpdate, setNeedsUpdate ] = useState(true); + const [ achievementCategories, setAchievementCategories ] = useState([]); + const [ selectedCategoryCode, setSelectedCategoryCode ] = useState(null); + const [ selectedAchievementId, setSelectedAchievementId ] = useState(-1); + const [ achievementScore, setAchievementScore ] = useState(0); + + const getTotalUnseen = useMemo(() => + { + let unseen = 0; + + achievementCategories.forEach(category => unseen += GetAchievementCategoryTotalUnseen(category)); + + return unseen; + }, [ achievementCategories ]); + + const getProgress = useMemo(() => + { + let progress = 0; + + achievementCategories.forEach(category => (progress += category.getProgress())); + + return progress; + }, [ achievementCategories ]); + + const getMaxProgress = useMemo(() => + { + let progress = 0; + + achievementCategories.forEach(category => (progress += category.getMaxProgress())); + + return progress; + }, [ achievementCategories ]); + + const scaledProgressPercent = useMemo(() => + { + return ~~((((getProgress - 0) * (100 - 0)) / (getMaxProgress - 0)) + 0); + }, [ getProgress, getMaxProgress ]); + + const setAchievementSeen = useCallback((categoryCode: string, achievementId: number) => + { + setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + + for(const category of newValue) + { + if(category.code !== categoryCode) continue; + + for(const achievement of category.achievements) + { + if(achievement.achievementId !== achievementId) continue; + + achievement.unseen = 0; + } + } + + return newValue; + }); + }, []); + + const onAchievementEvent = useCallback((event: AchievementEvent) => + { + const parser = event.getParser(); + const achievement = parser.achievement; + + setAchievementCategories(prevValue => + { + const newValue = [ ...prevValue ]; + const categoryIndex = newValue.findIndex(existing => (existing.code === achievement.category)); + + if(categoryIndex === -1) + { + const category = new AchievementCategory(achievement.category); + + category.achievements.push(achievement); + + newValue.push(category); + } + else + { + const category = CloneObject(newValue[categoryIndex]); + const newAchievements = [ ...category.achievements ]; + const achievementIndex = newAchievements.findIndex(existing => (existing.achievementId === achievement.achievementId)); + let previousAchievement: AchievementData = null; + + if(achievementIndex === -1) + { + newAchievements.push(achievement); + } + else + { + previousAchievement = newAchievements[achievementIndex]; + + newAchievements[achievementIndex] = achievement; + } + + if(!GetAchievementIsIgnored(achievement)) + { + achievement.unseen++; + + if(previousAchievement) achievement.unseen += previousAchievement.unseen; + } + + category.achievements = newAchievements; + + newValue[categoryIndex] = category; + } + + return newValue; + }); + }, []); + + UseMessageEventHook(AchievementEvent, onAchievementEvent); + + const onAchievementsEvent = useCallback((event: AchievementsEvent) => + { + const parser = event.getParser(); + const categories: AchievementCategory[] = []; + + for(const achievement of parser.achievements) + { + const categoryName = achievement.category; + + let existing = categories.find(category => (category.code === categoryName)); + + if(!existing) + { + existing = new AchievementCategory(categoryName); + + categories.push(existing); + } + + existing.achievements.push(achievement); + } + + setAchievementCategories(categories); + }, []); + + UseMessageEventHook(AchievementsEvent, onAchievementsEvent); + + const onAchievementsScoreEvent = useCallback((event: AchievementsScoreEvent) => + { + const parser = event.getParser(); + + setAchievementScore(parser.score); + }, []); + + UseMessageEventHook(AchievementsScoreEvent, onAchievementsScoreEvent); + + useEffect(() => + { + if(!needsUpdate) return; + + SendMessageComposer(new RequestAchievementsMessageComposer()); + + setNeedsUpdate(false); + }, [ needsUpdate ]); + + return { achievementCategories, selectedCategoryCode, setSelectedCategoryCode, selectedAchievementId, setSelectedAchievementId, achievementScore, getTotalUnseen, getProgress, getMaxProgress, scaledProgressPercent, setAchievementSeen }; +} + +export const useAchievements = useAchievementsState; diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 80612b06..f072b824 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,3 +1,4 @@ +export * from './achievements'; export * from './events'; export * from './events/core'; export * from './events/nitro'; @@ -6,5 +7,6 @@ export * from './friends'; export * from './inventory'; export * from './messages'; export * from './navigator'; +export * from './session'; export * from './UseMountEffect'; export * from './useSharedVisibility'; diff --git a/src/hooks/inventory/useInventoryTrade.ts b/src/hooks/inventory/useInventoryTrade.ts index 0d208b52..72166600 100644 --- a/src/hooks/inventory/useInventoryTrade.ts +++ b/src/hooks/inventory/useInventoryTrade.ts @@ -1,11 +1,9 @@ -import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; +import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; import { useInventoryFurni } from '.'; import { UseMessageEventHook } from '..'; import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, parseTradeItems, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api'; -import { InventoryTradeRequestEvent } from '../../events'; -import { UseUiEvent } from '../events'; const useInventoryTradeState = () => { @@ -66,20 +64,6 @@ const useInventoryTradeState = () => } } - const onInventoryTradeRequestEvent = useCallback((event: InventoryTradeRequestEvent) => - { - switch(event.type) - { - case InventoryTradeRequestEvent.REQUEST_TRADE: { - const tradeEvent = (event as InventoryTradeRequestEvent); - - SendMessageComposer(new TradingOpenComposer(tradeEvent.objectId)); - } - } - }, []); - - UseUiEvent(InventoryTradeRequestEvent.REQUEST_TRADE, onInventoryTradeRequestEvent); - const onTradingAcceptEvent = useCallback((event: TradingAcceptEvent) => { const parser = event.getParser(); diff --git a/src/hooks/inventory/useInventoryUnseenTracker.ts b/src/hooks/inventory/useInventoryUnseenTracker.ts index 939a21a5..fe21007e 100644 --- a/src/hooks/inventory/useInventoryUnseenTracker.ts +++ b/src/hooks/inventory/useInventoryUnseenTracker.ts @@ -1,5 +1,5 @@ import { UnseenItemsEvent, UnseenResetCategoryComposer, UnseenResetItemsComposer } from '@nitrots/nitro-renderer'; -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { useBetween } from 'use-between'; import { UseMessageEventHook } from '..'; import { SendMessageComposer } from '../../api'; @@ -10,17 +10,17 @@ const sendResetItemsMessage = (category: number, itemIds: number[]) => SendMessa const useInventoryUnseenTrackerState = () => { const [ unseenItems, setUnseenItems ] = useState>(new Map()); - const getIds = (category: number) => unseenItems.get(category); - const getCount = (category: number) => (unseenItems.get(category)?.length || 0); - const getFullCount = () => + const getCount = useCallback((category: number) => (unseenItems.get(category)?.length || 0), [ unseenItems ]); + + const getFullCount = useMemo(() => { let count = 0; for(const key of unseenItems.keys()) count += getCount(key); return count; - } + }, [ unseenItems, getCount ]); const resetCategory = useCallback((category: number) => { @@ -128,7 +128,7 @@ const useInventoryUnseenTrackerState = () => UseMessageEventHook(UnseenItemsEvent, onUnseenItemsEvent); - return { getIds, getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; + return { getCount, getFullCount, resetCategory, resetItems, isUnseen, removeUnseen }; } export const useInventoryUnseenTracker = () => useBetween(useInventoryUnseenTrackerState); diff --git a/src/hooks/session/index.ts b/src/hooks/session/index.ts new file mode 100644 index 00000000..e61c7f33 --- /dev/null +++ b/src/hooks/session/index.ts @@ -0,0 +1 @@ +export * from './useSessionInfo'; diff --git a/src/hooks/session/useSessionInfo.ts b/src/hooks/session/useSessionInfo.ts new file mode 100644 index 00000000..39c102f6 --- /dev/null +++ b/src/hooks/session/useSessionInfo.ts @@ -0,0 +1,33 @@ +import { FigureUpdateEvent, UserInfoDataParser, UserInfoEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { useBetween } from 'use-between'; +import { UseMessageEventHook } from '../messages'; + +const useSessionInfoState = () => +{ + const [ userInfo, setUserInfo ] = useState(null); + const [ userFigure, setUserFigure ] = useState(null); + + const onUserInfoEvent = useCallback((event: UserInfoEvent) => + { + const parser = event.getParser(); + + setUserInfo(parser.userInfo); + setUserFigure(parser.userInfo.figure); + }, []); + + UseMessageEventHook(UserInfoEvent, onUserInfoEvent); + + const onUserFigureEvent = useCallback((event: FigureUpdateEvent) => + { + const parser = event.getParser(); + + setUserFigure(parser.figure); + }, []); + + UseMessageEventHook(FigureUpdateEvent, onUserFigureEvent); + + return { userInfo, userFigure }; +} + +export const useSessionInfo = () => useBetween(useSessionInfoState); From fd77cf7bf0be7f306724c50dc39e49d39372d08a Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 3 Apr 2022 15:15:20 -0400 Subject: [PATCH 220/331] Remove UserSettingsUIEvent --- src/components/purse/PurseView.tsx | 5 +- src/components/toolbar/ToolbarMeView.tsx | 4 +- .../user-settings/UserSettingsView.tsx | 57 +++++++++++-------- src/events/index.ts | 1 - .../user-settings/UserSettingsUIEvent.ts | 8 --- src/events/user-settings/index.ts | 1 - 6 files changed, 37 insertions(+), 39 deletions(-) delete mode 100644 src/events/user-settings/UserSettingsUIEvent.ts delete mode 100644 src/events/user-settings/index.ts diff --git a/src/components/purse/PurseView.tsx b/src/components/purse/PurseView.tsx index fa8c14dd..7004096c 100644 --- a/src/components/purse/PurseView.tsx +++ b/src/components/purse/PurseView.tsx @@ -2,8 +2,7 @@ import { ActivityPointNotificationMessageEvent, FriendlyTime, HabboClubLevelEnum import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { CreateLinkEvent, GetConfiguration, LocalizeText, PlaySound, SendMessageComposer, SoundNames } from '../../api'; import { Column, Flex, Grid, LayoutCurrencyIcon, Text } from '../../common'; -import { UserSettingsUIEvent } from '../../events'; -import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { UseMessageEventHook } from '../../hooks'; import { IPurse } from './common/IPurse'; import { Purse } from './common/Purse'; import { PurseContextProvider } from './PurseContext'; @@ -187,7 +186,7 @@ export const PurseView: FC<{}> = props => CreateLinkEvent('help/show') }> - DispatchUiEvent(new UserSettingsUIEvent(UserSettingsUIEvent.TOGGLE_USER_SETTINGS)) } > + CreateLinkEvent('user-settings/toggle') } > diff --git a/src/components/toolbar/ToolbarMeView.tsx b/src/components/toolbar/ToolbarMeView.tsx index 7861c38f..9a27e5e3 100644 --- a/src/components/toolbar/ToolbarMeView.tsx +++ b/src/components/toolbar/ToolbarMeView.tsx @@ -2,7 +2,7 @@ import { MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useEffect, useRef } from 'react'; import { CreateLinkEvent, GetRoomEngine, GetRoomSession, GetSessionDataManager, GetUserProfile } from '../../api'; import { Base, Flex, LayoutItemCountView } from '../../common'; -import { GuideToolEvent, UserSettingsUIEvent } from '../../events'; +import { GuideToolEvent } from '../../events'; import { DispatchUiEvent } from '../../hooks'; interface ToolbarMeViewProps @@ -46,7 +46,7 @@ export const ToolbarMeView: FC = props => GetUserProfile(GetSessionDataManager().userId) } /> CreateLinkEvent('navigator/search/myworld_view')} /> CreateLinkEvent('avatar-editor/toggle') } /> - DispatchUiEvent(new UserSettingsUIEvent(UserSettingsUIEvent.TOGGLE_USER_SETTINGS)) } /> + CreateLinkEvent('user-settings/toggle') } /> { children } ); diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index a9c001be..95ca3dc0 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -1,36 +1,15 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { NitroSettingsEvent, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; +import { ILinkEventTracker, NitroSettingsEvent, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../api'; +import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { UserSettingsUIEvent } from '../../events'; -import { DispatchMainEvent, DispatchUiEvent, UseMessageEventHook, UseUiEvent } from '../../hooks'; +import { DispatchMainEvent, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; export const UserSettingsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ userSettings, setUserSettings ] = useState(null); - const onUserSettingsUIEvent = useCallback((event: UserSettingsUIEvent) => - { - switch(event.type) - { - case UserSettingsUIEvent.SHOW_USER_SETTINGS: - setIsVisible(true); - return; - case UserSettingsUIEvent.HIDE_USER_SETTINGS: - setIsVisible(false); - return; - case UserSettingsUIEvent.TOGGLE_USER_SETTINGS: - setIsVisible(value => !value); - return; - } - }, []); - - UseUiEvent(UserSettingsUIEvent.SHOW_USER_SETTINGS, onUserSettingsUIEvent); - UseUiEvent(UserSettingsUIEvent.HIDE_USER_SETTINGS, onUserSettingsUIEvent); - UseUiEvent(UserSettingsUIEvent.TOGGLE_USER_SETTINGS, onUserSettingsUIEvent); - const onUserSettingsEvent = useCallback((event: UserSettingsEvent) => { const parser = event.getParser(); @@ -106,6 +85,36 @@ export const UserSettingsView: FC<{}> = props => } }, [ userSettings ]); + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived: (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; + } + }, + eventUrlPrefix: 'user-settings/' + }; + + AddEventLinkTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, []); + useEffect(() => { if(!userSettings) return; diff --git a/src/events/index.ts b/src/events/index.ts index fd1f1572..4cf8a7f8 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -6,5 +6,4 @@ export * from './mod-tools'; export * from './notification-center'; export * from './room-widgets'; export * from './room-widgets/thumbnail'; -export * from './user-settings'; export * from './wired'; diff --git a/src/events/user-settings/UserSettingsUIEvent.ts b/src/events/user-settings/UserSettingsUIEvent.ts deleted file mode 100644 index 4ce30d88..00000000 --- a/src/events/user-settings/UserSettingsUIEvent.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; - -export class UserSettingsUIEvent extends NitroEvent -{ - public static SHOW_USER_SETTINGS: string = 'NE_SHOW_USER_SETTINGS'; - public static HIDE_USER_SETTINGS: string = 'NE_HIDE_USER_SETTINGS'; - public static TOGGLE_USER_SETTINGS: string = 'NE_TOGGLE_USER_SETTINGS'; -} diff --git a/src/events/user-settings/index.ts b/src/events/user-settings/index.ts deleted file mode 100644 index 5879374c..00000000 --- a/src/events/user-settings/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './UserSettingsUIEvent'; From 1abadf1b551a2dd79523986c7cbd038a49451525 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 3 Apr 2022 20:27:30 -0400 Subject: [PATCH 221/331] Start updates --- .../common => api/hc-center}/ClubStatus.ts | 0 src/api/hc-center/GetClubBadge.ts | 11 ++ src/api/hc-center/index.ts | 2 + src/api/index.ts | 2 + .../purse/common => api/purse}/IPurse.ts | 0 .../purse/common => api/purse}/Purse.ts | 2 +- src/api/purse/index.ts | 2 + .../catalog/CatalogMessageHandler.tsx | 21 +-- .../catalog/common/ICatalogOptions.ts | 2 - .../page/layout/CatalogLayoutVipBuyView.tsx | 25 ++- ...atalogLayoutMarketplacePublicItemsView.tsx | 10 +- .../vip-gifts/CatalogLayoutVipGiftsView.tsx | 8 +- .../widgets/CatalogPurchaseWidgetView.tsx | 8 +- src/components/hc-center/HcCenterView.tsx | 168 ++++++------------ .../hc-center/common/BadgeResolver.ts | 23 --- src/components/purse/PurseView.tsx | 117 +----------- src/components/purse/common/CurrencyHelper.ts | 17 -- src/hooks/index.ts | 1 + src/hooks/purse/index.ts | 1 + src/hooks/purse/usePurse.ts | 134 ++++++++++++++ 20 files changed, 241 insertions(+), 313 deletions(-) rename src/{components/hc-center/common => api/hc-center}/ClubStatus.ts (100%) create mode 100644 src/api/hc-center/GetClubBadge.ts create mode 100644 src/api/hc-center/index.ts rename src/{components/purse/common => api/purse}/IPurse.ts (100%) rename src/{components/purse/common => api/purse}/Purse.ts (98%) create mode 100644 src/api/purse/index.ts delete mode 100644 src/components/hc-center/common/BadgeResolver.ts delete mode 100644 src/components/purse/common/CurrencyHelper.ts create mode 100644 src/hooks/purse/index.ts create mode 100644 src/hooks/purse/usePurse.ts diff --git a/src/components/hc-center/common/ClubStatus.ts b/src/api/hc-center/ClubStatus.ts similarity index 100% rename from src/components/hc-center/common/ClubStatus.ts rename to src/api/hc-center/ClubStatus.ts diff --git a/src/api/hc-center/GetClubBadge.ts b/src/api/hc-center/GetClubBadge.ts new file mode 100644 index 00000000..6b779e0f --- /dev/null +++ b/src/api/hc-center/GetClubBadge.ts @@ -0,0 +1,11 @@ +const DEFAULT_BADGE: string = 'HC1'; +const BADGES: string[] = [ 'ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5' ]; + +export const GetClubBadge = (badgeCodes: string[]) => +{ + let badgeCode: string = null; + + BADGES.forEach(badge => ((badgeCodes.indexOf(badge) > -1) && (badgeCode = badge))); + + return (badgeCode || DEFAULT_BADGE); +} diff --git a/src/api/hc-center/index.ts b/src/api/hc-center/index.ts new file mode 100644 index 00000000..cee8f692 --- /dev/null +++ b/src/api/hc-center/index.ts @@ -0,0 +1,2 @@ +export * from './ClubStatus'; +export * from './GetClubBadge'; diff --git a/src/api/index.ts b/src/api/index.ts index 92da5d94..d3473996 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -6,6 +6,7 @@ export * from './friends'; export * from './GetRendererVersion'; export * from './GetUIVersion'; export * from './groups'; +export * from './hc-center'; export * from './inventory'; export * from './inventory/unseen'; export * from './navigator'; @@ -19,6 +20,7 @@ export * from './nitro/room/widgets/handlers'; export * from './nitro/room/widgets/messages'; export * from './nitro/session'; export * from './notification'; +export * from './purse'; export * from './user'; export * from './utils'; export * from './wired'; diff --git a/src/components/purse/common/IPurse.ts b/src/api/purse/IPurse.ts similarity index 100% rename from src/components/purse/common/IPurse.ts rename to src/api/purse/IPurse.ts diff --git a/src/components/purse/common/Purse.ts b/src/api/purse/Purse.ts similarity index 98% rename from src/components/purse/common/Purse.ts rename to src/api/purse/Purse.ts index f9ea045a..a0a54b4c 100644 --- a/src/components/purse/common/Purse.ts +++ b/src/api/purse/Purse.ts @@ -1,5 +1,5 @@ import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; -import { GetNitroInstance } from '../../../api'; +import { GetNitroInstance } from '..'; import { IPurse } from './IPurse'; export class Purse implements IPurse diff --git a/src/api/purse/index.ts b/src/api/purse/index.ts new file mode 100644 index 00000000..ed344804 --- /dev/null +++ b/src/api/purse/index.ts @@ -0,0 +1,2 @@ +export * from './IPurse'; +export * from './Purse'; diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx index dfbf89d2..e01cbb4a 100644 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ b/src/components/catalog/CatalogMessageHandler.tsx @@ -1,4 +1,4 @@ -import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, ClubGiftInfoEvent, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, SellablePetPalettesMessageEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; +import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, ClubGiftInfoEvent, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, SellablePetPalettesMessageEvent } from '@nitrots/nitro-renderer'; import { GuildMembershipsMessageEvent } from '@nitrots/nitro-renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent'; import { FC, useCallback } from 'react'; import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, NotificationAlertType, NotificationUtilities, ProductTypeEnum } from '../../api'; @@ -15,7 +15,6 @@ import { IPurchasableOffer } from './common/IPurchasableOffer'; import { Offer } from './common/Offer'; import { PageLocalization } from './common/PageLocalization'; import { Product } from './common/Product'; -import { SubscriptionInfo } from './common/SubscriptionInfo'; export const CatalogMessageHandler: FC<{}> = props => { @@ -227,23 +226,6 @@ export const CatalogMessageHandler: FC<{}> = props => }); }, [ setCatalogOptions ]); - const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const subscriptionInfo = new SubscriptionInfo( - Math.max(0, parser.daysToPeriodEnd), - Math.max(0, parser.periodsSubscribedAhead), - parser.isVip, - parser.pastClubDays, - parser.pastVipDays); - - return { ...prevValue, subscriptionInfo }; - }); - }, [ setCatalogOptions ]); - const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) => { const parser = event.getParser(); @@ -301,7 +283,6 @@ export const CatalogMessageHandler: FC<{}> = props => UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); UseMessageEventHook(HabboClubOffersMessageEvent, onHabboClubOffersMessageEvent); - UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); UseMessageEventHook(GiftWrappingConfigurationEvent, onGiftWrappingConfigurationEvent); UseMessageEventHook(ClubGiftInfoEvent, onClubGiftInfoEvent); UseMessageEventHook(MarketplaceMakeOfferResult, onMarketplaceMakeOfferResult); diff --git a/src/components/catalog/common/ICatalogOptions.ts b/src/components/catalog/common/ICatalogOptions.ts index 49ed1737..20356947 100644 --- a/src/components/catalog/common/ICatalogOptions.ts +++ b/src/components/catalog/common/ICatalogOptions.ts @@ -1,7 +1,6 @@ import { ClubGiftInfoParser, ClubOfferData, HabboGroupEntryData, MarketplaceConfigurationMessageParser } from '@nitrots/nitro-renderer'; import { CatalogPetPalette } from './CatalogPetPalette'; import { GiftWrappingConfiguration } from './GiftWrappingConfiguration'; -import { SubscriptionInfo } from './SubscriptionInfo'; export interface ICatalogOptions { @@ -9,7 +8,6 @@ export interface ICatalogOptions petPalettes?: CatalogPetPalette[]; clubOffers?: ClubOfferData[]; clubGifts?: ClubGiftInfoParser; - subscriptionInfo?: SubscriptionInfo; giftConfiguration?: GiftWrappingConfiguration; marketplaceConfiguration?: MarketplaceConfigurationMessageParser; } diff --git a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx index f32db617..3597e54d 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx @@ -3,9 +3,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../../../../api'; import { AutoGrid, Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, LayoutLoadingSpinnerView, Text } from '../../../../../common'; import { CatalogEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent } from '../../../../../events'; -import { UseUiEvent } from '../../../../../hooks'; -import { GetCurrencyAmount } from '../../../../purse/common/CurrencyHelper'; -import { GLOBAL_PURSE } from '../../../../purse/PurseView'; +import { usePurse, UseUiEvent } from '../../../../../hooks'; import { useCatalogContext } from '../../../CatalogContext'; import { CatalogPurchaseState } from '../../../common/CatalogPurchaseState'; import { CatalogLayoutProps } from './CatalogLayout.types'; @@ -15,7 +13,8 @@ export const CatalogLayoutVipBuyView: FC = props => const [ pendingOffer, setPendingOffer ] = useState(null); const [ purchaseState, setPurchaseState ] = useState(CatalogPurchaseState.NONE); const { currentPage = null, catalogOptions = null } = useCatalogContext(); - const { clubOffers = null, subscriptionInfo = null } = catalogOptions; + const { purse = null, getCurrencyAmount = null } = usePurse(); + const { clubOffers = null } = catalogOptions; const onCatalogEvent = useCallback((event: CatalogEvent) => { @@ -54,8 +53,6 @@ export const CatalogLayoutVipBuyView: FC = props => const getPurchaseHeader = useCallback(() => { - const purse = GLOBAL_PURSE; - if(!purse) return ''; const extensionOrSubscription = (purse.clubDays > 0 || purse.clubPeriods > 0) ? 'extension.' : 'subscription.'; @@ -64,7 +61,7 @@ export const CatalogLayoutVipBuyView: FC = props => const locale = LocalizeText('catalog.vip.buy.confirm.' + extensionOrSubscription + daysOrMonths); return locale.replace('%NUM_' + daysOrMonths.toUpperCase() + '%', daysOrMonthsText.toString()); - }, [ pendingOffer ]); + }, [ pendingOffer, purse ]); const getPurchaseValidUntil = useCallback(() => { @@ -79,14 +76,12 @@ export const CatalogLayoutVipBuyView: FC = props => const getSubscriptionDetails = useMemo(() => { - if(!subscriptionInfo) return ''; - - const clubDays = subscriptionInfo.clubDays; - const clubPeriods = subscriptionInfo.clubPeriods; + const clubDays = purse.clubDays; + const clubPeriods = purse.clubPeriods; const totalDays = (clubPeriods * 31) + clubDays; return LocalizeText('catalog.vip.extend.info', [ 'days' ], [ totalDays.toString() ]); - }, [ subscriptionInfo ]); + }, [ purse ]); const purchaseSubscription = useCallback(() => { @@ -106,12 +101,12 @@ export const CatalogLayoutVipBuyView: FC = props => { if(!pendingOffer) return null; - if(pendingOffer.priceCredits > GetCurrencyAmount(-1)) + if(pendingOffer.priceCredits > getCurrencyAmount(-1)) { return ; } - if(pendingOffer.priceActivityPoints > GetCurrencyAmount(pendingOffer.priceActivityPointsType)) + if(pendingOffer.priceActivityPoints > getCurrencyAmount(pendingOffer.priceActivityPointsType)) { return ; } @@ -128,7 +123,7 @@ export const CatalogLayoutVipBuyView: FC = props => default: return ; } - }, [ pendingOffer, purchaseState, purchaseSubscription ]); + }, [ pendingOffer, purchaseState, purchaseSubscription, getCurrencyAmount ]); useEffect(() => { diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx index ae6b5fff..2ef982e9 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx @@ -2,8 +2,7 @@ import { BuyMarketplaceOfferMessageComposer, GetMarketplaceOffersMessageComposer import { FC, useCallback, useMemo, useState } from 'react'; import { LocalizeText, NotificationAlertType, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { Button, ButtonGroup, Column, Text } from '../../../../../../common'; -import { UseMessageEventHook } from '../../../../../../hooks'; -import { GetCurrencyAmount } from '../../../../../purse/common/CurrencyHelper'; +import { UseMessageEventHook, usePurse } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, PUBLIC_OFFER } from './CatalogLayoutMarketplaceItemView'; import { SearchFormView } from './CatalogLayoutMarketplaceSearchFormView'; @@ -25,6 +24,7 @@ export const CatalogLayoutMarketplacePublicItemsView: FC()); const [ lastSearch, setLastSearch ] = useState({ minPrice: -1, maxPrice: -1, query: '', type: 3 }); + const { getCurrencyAmount = null } = usePurse(); const requestOffers = useCallback((options: IMarketplaceSearchOptions) => { @@ -48,18 +48,20 @@ export const CatalogLayoutMarketplacePublicItemsView: FC { - if(offerData.price > GetCurrencyAmount(-1)) + if(offerData.price > getCurrencyAmount(-1)) { NotificationUtilities.simpleAlert(LocalizeText('catalog.alert.notenough.credits.description'), NotificationAlertType.DEFAULT, null, null, LocalizeText('catalog.alert.notenough.title')); return; } + const offerId = offerData.offerId; + NotificationUtilities.confirm(LocalizeText('catalog.marketplace.confirm_header'), () => { SendMessageComposer(new BuyMarketplaceOfferMessageComposer(offerId)); }, null, null, null, LocalizeText('catalog.marketplace.confirm_title')); - },[]); + }, [ getCurrencyAmount ]); const onMarketPlaceOffersEvent = useCallback( (event: MarketPlaceOffersEvent) => { diff --git a/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx b/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx index 4c90be62..3b760d27 100644 --- a/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx +++ b/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx @@ -2,14 +2,16 @@ import { SelectClubGiftComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { AutoGrid, Text } from '../../../../../../common'; +import { usePurse } from '../../../../../../hooks'; import { useCatalogContext } from '../../../../CatalogContext'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { VipGiftItem } from './VipGiftItemView'; export const CatalogLayoutVipGiftsView: FC = props => { + const { purse = null } = usePurse(); const { catalogOptions = null, setCatalogOptions = null } = useCatalogContext(); - const { clubGifts = null, subscriptionInfo = null } = catalogOptions; + const { clubGifts = null } = catalogOptions; const giftsAvailable = useCallback(() => { @@ -19,10 +21,10 @@ export const CatalogLayoutVipGiftsView: FC = props => if(clubGifts.daysUntilNextGift > 0) return LocalizeText('catalog.club_gift.days_until_next', [ 'days' ], [ clubGifts.daysUntilNextGift.toString() ]); - if(subscriptionInfo.isVip) return LocalizeText('catalog.club_gift.not_available'); + if(purse.isVip) return LocalizeText('catalog.club_gift.not_available'); return LocalizeText('catalog.club_gift.no_club'); - }, [ clubGifts, subscriptionInfo ]); + }, [ clubGifts, purse ]); const selectGift = useCallback((localizationId: string) => { diff --git a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx index 7ed446aa..7a874acc 100644 --- a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx @@ -3,8 +3,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { CreateLinkEvent, GetClubMemberLevel, LocalizeText, SendMessageComposer } from '../../../../../api'; import { Button, LayoutLoadingSpinnerView } from '../../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogInitPurchaseEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogWidgetEvent } from '../../../../../events'; -import { DispatchUiEvent, UseUiEvent } from '../../../../../hooks'; -import { GetCurrencyAmount } from '../../../../purse/common/CurrencyHelper'; +import { DispatchUiEvent, usePurse, UseUiEvent } from '../../../../../hooks'; import { useCatalogContext } from '../../../CatalogContext'; import { CatalogPurchaseState } from '../../../common/CatalogPurchaseState'; import { Offer } from '../../../common/Offer'; @@ -21,6 +20,7 @@ export const CatalogPurchaseWidgetView: FC = pro const [ purchaseWillBeGift, setPurchaseWillBeGift ] = useState(false); const [ purchaseState, setPurchaseState ] = useState(CatalogPurchaseState.NONE); const { currentOffer = null, currentPage = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalogContext(); + const { getCurrencyAmount = null } = usePurse(); const onCatalogInitPurchaseEvent = useCallback((event: CatalogInitPurchaseEvent) => { @@ -148,9 +148,9 @@ export const CatalogPurchaseWidgetView: FC = pro if(isLimitedSoldOut) return ; - if(priceCredits > GetCurrencyAmount(-1)) return ; + if(priceCredits > getCurrencyAmount(-1)) return ; - if(pricePoints > GetCurrencyAmount(currentOffer.activityPointType)) return ; + if(pricePoints > getCurrencyAmount(currentOffer.activityPointType)) return ; switch(purchaseState) { diff --git a/src/components/hc-center/HcCenterView.tsx b/src/components/hc-center/HcCenterView.tsx index 94f70260..2d4ea5b6 100644 --- a/src/components/hc-center/HcCenterView.tsx +++ b/src/components/hc-center/HcCenterView.tsx @@ -1,42 +1,31 @@ -import { BadgesEvent, ClubGiftInfoEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, RequestBadgesComposer, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer'; +import { ClubGiftInfoEvent, FriendlyTime, GetClubGiftInfo, ILinkEventTracker, ScrGetKickbackInfoMessageComposer, ScrKickbackData, ScrSendKickbackInfoMessageEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { OverlayTrigger, Popover } from 'react-bootstrap'; -import { AddEventLinkTracker, CreateLinkEvent, GetConfiguration, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; +import { AddEventLinkTracker, ClubStatus, CreateLinkEvent, GetClubBadge, GetConfiguration, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { UseMessageEventHook, useSessionInfo } from '../../hooks'; -import { BadgeResolver } from './common/BadgeResolver'; -import { ClubStatus } from './common/ClubStatus'; +import { useInventoryBadges, UseMessageEventHook, usePurse, useSessionInfo } from '../../hooks'; export const HcCenterView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ kickbackData, setKickbackData ] = useState(null); - const [ clubDays, setClubDays ] = useState(0); - const [ pastClubDays, setPastClubDays ] = useState(0); - const [ clubPeriods, setPastClubPeriods ] = useState(0); - const [ minsTillExpire, setMinsTillExpire ] = useState(0); - const [ clubStatus, setClubStatus ] = useState(ClubStatus.NONE); const [ unclaimedGifts, setUnclaimedGifts ] = useState(0); - const [ badgeCode, setBadgeCode ] = useState(BadgeResolver.default_badge); + const [ badgeCode, setBadgeCode ] = useState(null); const { userFigure = null } = useSessionInfo(); + const { purse = null, clubStatus = null } = usePurse(); + const { badgeCodes = [], activate = null, deactivate = null } = useInventoryBadges(); const getClubText = () => { - const totalDays = ((clubPeriods * 31) + clubDays); - const minutesUntilExpiration = minsTillExpire; - - if(clubStatus !== ClubStatus.ACTIVE) + if(purse.clubDays <= 0) return LocalizeText('purse.clubdays.zero.amount.text'); + + if((purse.minutesUntilExpiration > -1) && (purse.minutesUntilExpiration < (60 * 24))) { - return LocalizeText('purse.clubdays.zero.amount.text'); + return FriendlyTime.shortFormat(purse.minutesUntilExpiration * 60); } - if((minutesUntilExpiration > -1) && (minutesUntilExpiration < (60 * 24))) - { - return FriendlyTime.shortFormat(minutesUntilExpiration * 60); - } - - return FriendlyTime.shortFormat(totalDays * 86400); + return FriendlyTime.shortFormat(((purse.clubPeriods * 31) + purse.clubDays) * 86400); } const getInfoText = () => @@ -52,16 +41,8 @@ export const HcCenterView: FC<{}> = props => } } - const getHcPaydayTime = () => - { - if(kickbackData.timeUntilPayday < 60) return LocalizeText('hccenter.special.time.soon'); - return FriendlyTime.shortFormat(kickbackData.timeUntilPayday * 60); - } - - const getHcPaydayAmount = () => - { - return LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData.creditRewardForStreakBonus + kickbackData.creditRewardForMonthlySpent).toString() ]); - } + const getHcPaydayTime = () => (kickbackData.timeUntilPayday < 60) ? LocalizeText('hccenter.special.time.soon') : FriendlyTime.shortFormat(kickbackData.timeUntilPayday * 60); + const getHcPaydayAmount = () => LocalizeText('hccenter.special.sum', [ 'credits' ], [ (kickbackData.creditRewardForStreakBonus + kickbackData.creditRewardForMonthlySpent).toString() ]); const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => { @@ -81,87 +62,56 @@ export const HcCenterView: FC<{}> = props => UseMessageEventHook(ScrSendKickbackInfoMessageEvent, onScrSendKickbackInfo); - const onBadges = useCallback((event: BadgesEvent) => - { - const parser = event.getParser(); - - setBadgeCode(BadgeResolver.getClubBadge(parser.getAllBadgeCodes())); - }, []); - - UseMessageEventHook(BadgesEvent, onBadges); - - const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => - { - const parser = event.getParser(); - - const productName = parser.productName; - - if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; - - setClubDays(Math.max(0, parser.daysToPeriodEnd)); - setPastClubPeriods(Math.max(0, parser.periodsSubscribedAhead)); - setPastClubDays(Math.max(0, parser.pastClubDays)); - setMinsTillExpire(Math.max(0, parser.minutesUntilExpiration)); - }, []); - - UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); - - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'open': - if(parts.length > 2) - { - switch(parts[2]) - { - case 'hccenter': - setIsVisible(true); - break; - } - } - return; - } - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'open': + if(parts.length > 2) + { + switch(parts[2]) + { + case 'hccenter': + setIsVisible(true); + break; + } + } + return; + } + }, eventUrlPrefix: 'habboUI/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { - if(clubDays > 0) - { - setClubStatus(ClubStatus.ACTIVE); + setBadgeCode(GetClubBadge(badgeCodes)); + }, [ badgeCodes ]); - return; - } + useEffect(() => + { + if(!isVisible) return; - if(pastClubDays > 0) - { - setClubStatus(ClubStatus.EXPIRED); + const id = activate(); - return; - } - }, [ clubDays, pastClubDays ]); + return () => deactivate(id); + }, [ isVisible, activate, deactivate ]); useEffect(() => { SendMessageComposer(new GetClubGiftInfo()); SendMessageComposer(new ScrGetKickbackInfoMessageComposer()); - SendMessageComposer(new RequestBadgesComposer()); }, []); if(!isVisible) return null; @@ -176,10 +126,10 @@ export const HcCenterView: FC<{}> = props =>
    {LocalizeText('hccenter.breakdown.total', [ 'credits', 'actual' ], [ getHcPaydayAmount(), ((((kickbackData.kickbackPercentage * kickbackData.totalCreditsSpent) + kickbackData.creditRewardForStreakBonus) * 100) / 100).toString() ])}
    -
    +
    { CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) - }}>{ + } }>{ LocalizeText('hccenter.special.infolink')}
    @@ -193,10 +143,7 @@ export const HcCenterView: FC<{}> = props =>
    - @@ -207,10 +154,10 @@ export const HcCenterView: FC<{}> = props => - + { LocalizeText('hccenter.status.' + clubStatus) } - + { GetConfiguration('hc.center')['payday.info'] && @@ -218,10 +165,7 @@ export const HcCenterView: FC<{}> = props =>

    {LocalizeText('hccenter.special.title')}

    {LocalizeText('hccenter.special.info')}
    -
    - { - CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) - }}>{LocalizeText('hccenter.special.infolink')}
    +
    CreateLinkEvent('habbopages/' + GetConfiguration('hc.center')['payday.habbopage']) }>{LocalizeText('hccenter.special.infolink')}
    {LocalizeText('hccenter.special.time.title')}
    @@ -234,7 +178,7 @@ export const HcCenterView: FC<{}> = props =>
    {LocalizeText('hccenter.special.amount.title')}
    {getHcPaydayAmount()}
    - +
    {LocalizeText('hccenter.breakdown.infolink')}
    @@ -249,22 +193,22 @@ export const HcCenterView: FC<{}> = props =>

    {LocalizeText('hccenter.gift.title')}

    -
    0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') }}>
    +
    0 ? LocalizeText('hccenter.unclaimedgifts', [ 'unclaimedgifts' ], [ unclaimedGifts.toString() ]) : LocalizeText('hccenter.gift.info') } }>
    - + } }>{LocalizeText(clubStatus === ClubStatus.ACTIVE ? 'hccenter.btn.gifts.redeem' : 'hccenter.btn.gifts.view')}
    } {GetConfiguration('hc.center')['benefits.info'] &&
    {LocalizeText('hccenter.general.title')}
    -
    - + } }>{LocalizeText('hccenter.general.infolink')}
    } diff --git a/src/components/hc-center/common/BadgeResolver.ts b/src/components/hc-center/common/BadgeResolver.ts deleted file mode 100644 index e334b6e8..00000000 --- a/src/components/hc-center/common/BadgeResolver.ts +++ /dev/null @@ -1,23 +0,0 @@ - -export class BadgeResolver -{ - public static default_badge: string = 'HC1'; - public static badges: string[] = [ 'ACH_VipHC1', 'ACH_VipHC2', 'ACH_VipHC3', 'ACH_VipHC4', 'ACH_VipHC5', 'HC1', 'HC2', 'HC3', 'HC4', 'HC5' ]; - - - public static getClubBadge(k: string[]): string - { - var badgeCode: string = null; - - this.badges.forEach(badge => - { - if (k.indexOf(badge) > -1) - { - badgeCode = badge; - } - }); - - return badgeCode || this.default_badge; - } - -} diff --git a/src/components/purse/PurseView.tsx b/src/components/purse/PurseView.tsx index 7004096c..667c5841 100644 --- a/src/components/purse/PurseView.tsx +++ b/src/components/purse/PurseView.tsx @@ -1,21 +1,15 @@ -import { ActivityPointNotificationMessageEvent, FriendlyTime, HabboClubLevelEnum, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserSubscriptionParser } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { CreateLinkEvent, GetConfiguration, LocalizeText, PlaySound, SendMessageComposer, SoundNames } from '../../api'; +import { FriendlyTime, HabboClubLevelEnum } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useMemo } from 'react'; +import { CreateLinkEvent, GetConfiguration, LocalizeText } from '../../api'; import { Column, Flex, Grid, LayoutCurrencyIcon, Text } from '../../common'; -import { UseMessageEventHook } from '../../hooks'; -import { IPurse } from './common/IPurse'; -import { Purse } from './common/Purse'; +import { usePurse } from '../../hooks'; import { PurseContextProvider } from './PurseContext'; import { CurrencyView } from './views/CurrencyView'; import { SeasonalView } from './views/SeasonalView'; -export let GLOBAL_PURSE: IPurse = null; - export const PurseView: FC<{}> = props => { - const [ purse, setPurse ] = useState(new Purse()); - - const hcDisabled = useMemo(() => GetConfiguration('hc.disabled', false), []); + const { purse = null, hcDisabled = false } = usePurse(); const displayedCurrencies = useMemo(() => GetConfiguration('system.currency.types', []), []); const currencyDisplayNumberShort = useMemo(() => GetConfiguration('currency.display.number.short', false), []); @@ -65,107 +59,6 @@ export const PurseView: FC<{}> = props => return elements; }, [ purse, displayedCurrencies, currencyDisplayNumberShort ]); - const onUserCreditsEvent = useCallback((event: UserCreditsEvent) => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); - - newValue.credits = parseFloat(parser.credits); - - if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); - - return newValue; - }); - }, []); - - UseMessageEventHook(UserCreditsEvent, onUserCreditsEvent); - - const onUserCurrencyEvent = useCallback((event: UserCurrencyEvent) => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); - - newValue.activityPoints = parser.currencies; - - return newValue; - }); - }, []); - - UseMessageEventHook(UserCurrencyEvent, onUserCurrencyEvent); - - const onActivityPointNotificationMessageEvent = useCallback((event: ActivityPointNotificationMessageEvent) => - { - const parser = event.getParser(); - - setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); - - newValue.activityPoints = new Map(newValue.activityPoints); - - newValue.activityPoints.set(parser.type, parser.amount); - - if(parser.type === 0) PlaySound(SoundNames.DUCKETS) - - return newValue; - }); - }, []); - - UseMessageEventHook(ActivityPointNotificationMessageEvent, onActivityPointNotificationMessageEvent); - - const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => - { - const parser = event.getParser(); - const productName = parser.productName; - - if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; - - setPurse(prevValue => - { - const newValue = Purse.from(prevValue as Purse); - - newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); - newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); - newValue.isVip = parser.isVip; - newValue.pastClubDays = parser.pastClubDays; - newValue.pastVipDays = parser.pastVipDays; - newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); - newValue.minutesUntilExpiration = parser.minutesUntilExpiration; - newValue.minutesSinceLastModified = parser.minutesSinceLastModified; - - return newValue; - }); - }, []); - - UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); - - useEffect(() => - { - GLOBAL_PURSE = purse; - }, [ purse ]); - - useEffect(() => - { - if(hcDisabled) return; - - SendMessageComposer(new UserSubscriptionComposer('habbo_club')); - - const interval = setInterval(() => SendMessageComposer(new UserSubscriptionComposer('habbo_club')), 50000); - - return () => clearInterval(interval); - }, [ hcDisabled ]); - - useEffect(() => - { - SendMessageComposer(new UserCurrencyComposer()); - }, []); - if(!purse) return null; return ( diff --git a/src/components/purse/common/CurrencyHelper.ts b/src/components/purse/common/CurrencyHelper.ts deleted file mode 100644 index f9a6c3dd..00000000 --- a/src/components/purse/common/CurrencyHelper.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { GLOBAL_PURSE } from '../PurseView'; - -export function GetCurrencyAmount(type: number): number -{ - const purse = GLOBAL_PURSE; - - if(type === -1) return purse.credits; - - for(const [ key, value ] of purse.activityPoints.entries()) - { - if(key !== type) continue; - - return value; - } - - return 0; -} diff --git a/src/hooks/index.ts b/src/hooks/index.ts index f072b824..a78a216d 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -7,6 +7,7 @@ export * from './friends'; export * from './inventory'; export * from './messages'; export * from './navigator'; +export * from './purse'; export * from './session'; export * from './UseMountEffect'; export * from './useSharedVisibility'; diff --git a/src/hooks/purse/index.ts b/src/hooks/purse/index.ts new file mode 100644 index 00000000..d9d1ff70 --- /dev/null +++ b/src/hooks/purse/index.ts @@ -0,0 +1 @@ +export * from './usePurse'; diff --git a/src/hooks/purse/usePurse.ts b/src/hooks/purse/usePurse.ts new file mode 100644 index 00000000..42f70e94 --- /dev/null +++ b/src/hooks/purse/usePurse.ts @@ -0,0 +1,134 @@ +import { ActivityPointNotificationMessageEvent, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserSubscriptionParser } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CloneObject, ClubStatus, GetConfiguration, IPurse, PlaySound, Purse, SendMessageComposer, SoundNames } from '../../api'; +import { UseMessageEventHook } from '../messages'; + +const usePurseState = () => +{ + const [ purse, setPurse ] = useState(new Purse()); + const hcDisabled = useMemo(() => GetConfiguration('hc.disabled', false), []); + + const clubStatus = useMemo(() => + { + if(hcDisabled || (purse.clubDays > 0)) return ClubStatus.ACTIVE; + + if((purse.pastVipDays > 0) || (purse.pastVipDays > 0)) return ClubStatus.EXPIRED; + + return ClubStatus.NONE; + }, [ purse, hcDisabled ]); + + const getCurrencyAmount = (type: number) => + { + if(type === -1) return purse.credits; + + for(const [ key, value ] of purse.activityPoints.entries()) + { + if(key !== type) continue; + + return value; + } + + return 0; + } + + const onUserCreditsEvent = useCallback((event: UserCreditsEvent) => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.credits = parseFloat(parser.credits); + + if(prevValue.credits !== newValue.credits) PlaySound(SoundNames.CREDITS); + + return newValue; + }); + }, []); + + UseMessageEventHook(UserCreditsEvent, onUserCreditsEvent); + + const onUserCurrencyEvent = useCallback((event: UserCurrencyEvent) => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.activityPoints = parser.currencies; + + return newValue; + }); + }, []); + + UseMessageEventHook(UserCurrencyEvent, onUserCurrencyEvent); + + const onActivityPointNotificationMessageEvent = useCallback((event: ActivityPointNotificationMessageEvent) => + { + const parser = event.getParser(); + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.activityPoints = new Map(newValue.activityPoints); + + newValue.activityPoints.set(parser.type, parser.amount); + + if(parser.type === 0) PlaySound(SoundNames.DUCKETS) + + return newValue; + }); + }, []); + + UseMessageEventHook(ActivityPointNotificationMessageEvent, onActivityPointNotificationMessageEvent); + + const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) => + { + const parser = event.getParser(); + const productName = parser.productName; + + if((productName !== 'club_habbo') && (productName !== 'habbo_club')) return; + + setPurse(prevValue => + { + const newValue = CloneObject(prevValue); + + newValue.clubDays = Math.max(0, parser.daysToPeriodEnd); + newValue.clubPeriods = Math.max(0, parser.periodsSubscribedAhead); + newValue.isVip = parser.isVip; + newValue.pastClubDays = parser.pastClubDays; + newValue.pastVipDays = parser.pastVipDays; + newValue.isExpiring = ((parser.responseType === UserSubscriptionParser.RESPONSE_TYPE_DISCOUNT_AVAILABLE) ? true : false); + newValue.minutesUntilExpiration = parser.minutesUntilExpiration; + newValue.minutesSinceLastModified = parser.minutesSinceLastModified; + + return newValue; + }); + }, []); + + UseMessageEventHook(UserSubscriptionEvent, onUserSubscriptionEvent); + + useEffect(() => + { + if(hcDisabled) return; + + SendMessageComposer(new UserSubscriptionComposer('habbo_club')); + + const interval = setInterval(() => SendMessageComposer(new UserSubscriptionComposer('habbo_club')), 50000); + + return () => clearInterval(interval); + }, [ hcDisabled ]); + + useEffect(() => + { + SendMessageComposer(new UserCurrencyComposer()); + }, []); + + return { purse, hcDisabled, clubStatus, getCurrencyAmount }; +} + +export const usePurse = () => useBetween(usePurseState); From 91673959b99bf29f96b78ba4b1bdb3db8c6813e6 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 3 Apr 2022 20:49:18 -0400 Subject: [PATCH 222/331] Updates --- src/App.tsx | 2 +- src/api/friends/OpenMessengerChat.ts | 2 +- src/api/groups/GetGroupManager.ts | 2 +- src/api/inventory/FurnitureItem.ts | 44 ++++++------- src/api/inventory/GroupItem.ts | 8 +-- .../NavigatorSearchResultViewDisplayMode.ts | 6 +- src/api/navigator/RoomSettingsData.ts | 56 ++++++++-------- src/api/nitro/room/DispatchMouseEvent.ts | 4 +- src/api/nitro/room/DispatchTouchEvent.ts | 4 +- .../RoomWidgetUpdateDimmerStateEvent.ts | 10 +-- .../events/RoomWidgetUpdateRoomObjectEvent.ts | 6 +- .../handlers/FurniturePresentWidgetHandler.ts | 8 +-- .../handlers/FurnitureTrophyWidgetHandler.ts | 2 +- .../messages/RoomWidgetFurniActionMessage.ts | 6 +- .../RoomWidgetFurniToWidgetMessage.ts | 6 +- .../messages/RoomWidgetRoomObjectMessage.ts | 4 +- src/api/nitro/session/IsOwnerOfFurniture.ts | 2 +- src/api/utils/ColorUtils.ts | 2 +- src/api/wired/WiredSelectionFilter.ts | 6 +- .../draggable-window/DraggableWindow.tsx | 4 +- .../layout/LayoutNotificationAlertView.tsx | 2 +- src/common/layout/LayoutProgressBar.tsx | 2 +- src/common/layout/UserProfileIconView.tsx | 2 +- .../common/AvatarEditorGridPartItem.ts | 12 ++-- .../avatar-editor/common/CategoryBaseModel.ts | 2 +- .../avatar-editor/common/FigureData.ts | 4 +- .../views/model/AvatarEditorModelView.tsx | 2 +- .../wardrobe/AvatarEditorWardrobeView.tsx | 4 +- src/components/campaign/CalendarItemView.tsx | 2 +- src/components/campaign/CampaignView.tsx | 2 +- .../catalog/CatalogMessageHandler.tsx | 2 +- .../catalog/common/FurniCategory.ts | 46 ++++++------- .../catalog/views/gift/CatalogGiftView.tsx | 4 +- .../page/layout/CatalogLayoutVipBuyView.tsx | 20 +++--- .../CatalogLayoutMarketplaceItemView.tsx | 2 +- ...atalogLayoutMarketplacePublicItemsView.tsx | 2 +- .../page/layout/vip-gifts/VipGiftItemView.tsx | 2 +- .../page/widgets/CatalogSpinnerWidgetView.tsx | 2 +- .../chat-history/ChatHistoryView.tsx | 2 +- .../chat-history/common/Utilities.ts | 2 +- .../floorplan-editor/FloorplanEditorView.tsx | 2 +- .../floorplan-editor/common/Constants.ts | 2 +- .../floorplan-editor/common/Utils.ts | 2 +- .../views/FloorplanImportExportView.tsx | 2 +- .../views/FloorplanOptionsView.tsx | 4 +- .../views/friends-bar/FriendBarItemView.tsx | 16 ++--- .../friends-list/FriendsListSearchView.tsx | 4 +- .../views/friends-list/FriendsListView.tsx | 4 +- .../FriendsMessengerThreadGroup.tsx | 2 +- .../groups/views/GroupBadgeCreatorView.tsx | 20 +++--- .../groups/views/GroupCreatorView.tsx | 2 +- .../groups/views/GroupInformationView.tsx | 2 +- .../groups/views/GroupManagerView.tsx | 4 +- .../groups/views/GroupMembersView.tsx | 20 +++--- .../groups/views/tabs/GroupTabColorsView.tsx | 8 +-- .../tabs/GroupTabCreatorConfirmationView.tsx | 4 +- .../guide-tool/views/GuideToolOngoingView.tsx | 8 +-- src/components/hc-center/HcCenterView.tsx | 26 ++++---- .../help/views/SanctionStatusView.tsx | 6 +- .../help/views/SelectReportedUserView.tsx | 2 +- .../views/name-change/NameChangeInputView.tsx | 4 +- .../help/views/name-change/NameChangeView.tsx | 2 +- src/components/hotel-view/HotelView.tsx | 44 ++++++------- .../views/widgets/GetWidgetLayout.tsx | 4 +- .../views/widgets/WidgetSlotView.tsx | 4 +- .../bonus-rare/BonusRareWidgetView.tsx | 2 +- .../promo-article/PromoArticleWidgetView.tsx | 65 ++++++++----------- .../widget-container/WidgetContainerView.tsx | 10 +-- src/components/inventory/InventoryView.tsx | 2 +- .../views/furniture/InventoryTradeView.tsx | 12 ++-- src/components/mod-tools/ModToolsView.tsx | 4 +- .../mod-tools/views/chatlog/ChatlogView.tsx | 2 +- .../views/room/ModToolsChatlogView.tsx | 2 +- .../mod-tools/views/room/ModToolsRoomView.tsx | 2 +- .../views/tickets/CfhChatlogView.tsx | 4 +- .../views/tickets/ModToolsIssueInfoView.tsx | 4 +- .../views/tickets/ModToolsTicketsView.tsx | 6 +- .../views/user/ModToolsUserChatlogView.tsx | 4 +- .../views/user/ModToolsUserModActionView.tsx | 10 +-- .../views/user/ModToolsUserRoomVisitsView.tsx | 4 +- .../user/ModToolsUserSendMessageView.tsx | 4 +- .../mod-tools/views/user/ModToolsUserView.tsx | 4 +- .../navigator/NavigatorMessageHandler.tsx | 2 +- .../views/NavigatorRoomCreatorView.tsx | 2 +- .../NavigatorRoomSettingsView.tsx | 4 +- .../NavigatorRoomSettingsVipChatTabView.tsx | 2 +- .../NavigatorSearchResultItemInfoView.tsx | 22 +++---- .../search/NavigatorSearchResultItemView.tsx | 8 +-- .../search/NavigatorSearchResultView.tsx | 4 +- .../views/search/NavigatorSearchView.tsx | 2 +- src/components/nitropedia/NitropediaView.tsx | 6 +- .../views/alert-layouts/GetAlertLayout.tsx | 4 +- .../NotificationDefaultAlertView.tsx | 16 ++--- .../NotificationSearchAlertView.tsx | 4 +- .../NotificationDefaultConfirmView.tsx | 4 +- src/components/room/RoomView.tsx | 16 ++--- .../room/widgets/RoomWidgetsView.tsx | 4 +- .../AvatarInfoRentableBotChatView.tsx | 2 +- .../AvatarInfoWidgetAvatarView.tsx | 10 +-- .../avatar-info/AvatarInfoWidgetNameView.tsx | 2 +- .../AvatarInfoWidgetOwnPetView.tsx | 4 +- .../avatar-info/AvatarInfoWidgetView.tsx | 8 +-- .../avatar-info/common/BotSkillsEnum.ts | 26 ++++---- .../widgets/chat/ChatWidgetMessageView.tsx | 2 +- .../widgets/choosers/ChooserWidgetView.tsx | 2 +- .../furniture/dimmer/FurnitureDimmerView.tsx | 6 +- .../stickie/FurnitureStickieView.tsx | 8 +-- .../furniture/trophy/FurnitureTrophyView.tsx | 8 +-- .../FurnitureYoutubeDisplayView.tsx | 12 ++-- .../infostand/InfoStandWidgetFurniView.tsx | 4 +- .../infostand/InfoStandWidgetPetView.tsx | 6 +- .../InfoStandWidgetUserRelationshipsView.tsx | 2 +- .../widgets/infostand/InfoStandWidgetView.tsx | 2 +- .../widgets/word-quiz/WordQuizWidgetView.tsx | 4 +- src/components/toolbar/ToolbarMeView.tsx | 2 +- src/components/toolbar/ToolbarView.tsx | 4 +- .../toolbar/common/ToolbarViewItems.ts | 22 +++---- .../user-profile/UserProfileView.tsx | 2 +- .../views/FriendsContainerView.tsx | 2 +- .../views/GroupsContainerView.tsx | 2 +- .../user-profile/views/UserContainerView.tsx | 2 +- .../user-settings/UserSettingsView.tsx | 2 +- src/components/wired/WiredView.tsx | 2 +- .../actions/WiredActionGiveRewardView.tsx | 12 ++-- src/workers/WorkerBuilder.ts | 2 +- 125 files changed, 447 insertions(+), 456 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index c818be31..63b77e0c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -140,7 +140,7 @@ export const App: FC<{}> = props => return ( { (!isReady || isError) && - } + } diff --git a/src/api/friends/OpenMessengerChat.ts b/src/api/friends/OpenMessengerChat.ts index 10add8c3..7573bafb 100644 --- a/src/api/friends/OpenMessengerChat.ts +++ b/src/api/friends/OpenMessengerChat.ts @@ -3,5 +3,5 @@ import { CreateLinkEvent } from '..'; export function OpenMessengerChat(friendId: number = 0): void { if(friendId === 0) CreateLinkEvent('friends-messenger/open'); - else CreateLinkEvent(`friends-messenger/${friendId}`); + else CreateLinkEvent(`friends-messenger/${ friendId }`); } diff --git a/src/api/groups/GetGroupManager.ts b/src/api/groups/GetGroupManager.ts index bd5a6c70..d372ace2 100644 --- a/src/api/groups/GetGroupManager.ts +++ b/src/api/groups/GetGroupManager.ts @@ -2,5 +2,5 @@ import { CreateLinkEvent } from '..'; export function GetGroupManager(groupId: number): void { - CreateLinkEvent(`groups/manage/${groupId}`); + CreateLinkEvent(`groups/manage/${ groupId }`); } diff --git a/src/api/inventory/FurnitureItem.ts b/src/api/inventory/FurnitureItem.ts index 009591a3..4d84cab9 100644 --- a/src/api/inventory/FurnitureItem.ts +++ b/src/api/inventory/FurnitureItem.ts @@ -31,28 +31,28 @@ export class FurnitureItem implements IFurnitureItem { if(!parser) return; - this._locked = false; - this._id = parser.itemId; - this._type = parser.spriteId; - this._ref = parser.ref; - this._category = parser.category; - this._groupable = ((parser.isGroupable) && (!(parser.rentable))); - this._tradeable = parser.tradable; - this._recyclable = parser.isRecycleable; - this._sellable = parser.sellable; - this._stuffData = parser.stuffData; - this._extra = parser.extra; - this._secondsToExpiration = parser.secondsToExpiration; - this._expirationTimeStamp = parser.expirationTimeStamp; - this._hasRentPeriodStarted = parser.hasRentPeriodStarted; - this._creationDay = parser.creationDay; - this._creationMonth = parser.creationMonth; - this._creationYear = parser.creationYear; - this._slotId = parser.slotId; - this._songId = parser.songId; - this._flatId = parser.flatId; - this._isRented = parser.rentable; - this._isWallItem = parser.isWallItem; + this._locked = false; + this._id = parser.itemId; + this._type = parser.spriteId; + this._ref = parser.ref; + this._category = parser.category; + this._groupable = ((parser.isGroupable) && (!(parser.rentable))); + this._tradeable = parser.tradable; + this._recyclable = parser.isRecycleable; + this._sellable = parser.sellable; + this._stuffData = parser.stuffData; + this._extra = parser.extra; + this._secondsToExpiration = parser.secondsToExpiration; + this._expirationTimeStamp = parser.expirationTimeStamp; + this._hasRentPeriodStarted = parser.hasRentPeriodStarted; + this._creationDay = parser.creationDay; + this._creationMonth = parser.creationMonth; + this._creationYear = parser.creationYear; + this._slotId = parser.slotId; + this._songId = parser.songId; + this._flatId = parser.flatId; + this._isRented = parser.rentable; + this._isWallItem = parser.isWallItem; } public get rentable(): boolean diff --git a/src/api/inventory/GroupItem.ts b/src/api/inventory/GroupItem.ts index 9a16c36d..96477f92 100644 --- a/src/api/inventory/GroupItem.ts +++ b/src/api/inventory/GroupItem.ts @@ -95,8 +95,8 @@ export class GroupItem if(!furnitureItem) return items; - let found = 0; - let i = 0; + let found = 0; + let i = 0; while(i < this._items.length) { @@ -201,8 +201,8 @@ export class GroupItem { if(this._category === FurniCategory.POST_IT) { - let count = 0; - let index = 0; + let count = 0; + let index = 0; while(index < this._items.length) { diff --git a/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts b/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts index 27069cfd..b532d1af 100644 --- a/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts +++ b/src/api/navigator/NavigatorSearchResultViewDisplayMode.ts @@ -1,6 +1,6 @@ export class NavigatorSearchResultViewDisplayMode { - public static readonly LIST: number = 0; - public static readonly THUMBNAILS: number = 1; - public static readonly FORCED_THUMBNAILS: number = 2; + public static readonly LIST: number = 0; + public static readonly THUMBNAILS: number = 1; + public static readonly FORCED_THUMBNAILS: number = 2; } diff --git a/src/api/navigator/RoomSettingsData.ts b/src/api/navigator/RoomSettingsData.ts index cc6f7996..84cce5ae 100644 --- a/src/api/navigator/RoomSettingsData.ts +++ b/src/api/navigator/RoomSettingsData.ts @@ -40,37 +40,37 @@ export class RoomSettingsData { if(!parser) throw new Error('invalid_parser'); - this.roomId = parser.roomId; - this.roomName = parser.name; - this.roomOriginalName = parser.name; - this.roomDescription = parser.description; - this.categoryId = parser.categoryId; - this.userCount = parser.userCount; - this.tags = parser.tags; - this.tradeState = parser.tradeMode; - this.allowWalkthrough = parser.allowWalkthrough; + this.roomId = parser.roomId; + this.roomName = parser.name; + this.roomOriginalName = parser.name; + this.roomDescription = parser.description; + this.categoryId = parser.categoryId; + this.userCount = parser.userCount; + this.tags = parser.tags; + this.tradeState = parser.tradeMode; + this.allowWalkthrough = parser.allowWalkthrough; - this.lockState = parser.state; - this.originalLockState = parser.state; - this.password = null; - this.confirmPassword = null; - this.allowPets = parser.allowPets; - this.allowPetsEat = parser.allowPetsEat; + this.lockState = parser.state; + this.originalLockState = parser.state; + this.password = null; + this.confirmPassword = null; + this.allowPets = parser.allowPets; + this.allowPetsEat = parser.allowPetsEat; - this.usersWithRights = new Map(); + this.usersWithRights = new Map(); - this.hideWalls = parser.hideWalls; - this.wallThickness = parser.thicknessWall; - this.floorThickness = parser.thicknessFloor; - this.chatBubbleMode = parser.chatSettings.mode; - this.chatBubbleWeight = parser.chatSettings.weight; - this.chatBubbleSpeed = parser.chatSettings.speed; - this.chatFloodProtection = parser.chatSettings.protection; - this.chatDistance = parser.chatSettings.distance; + this.hideWalls = parser.hideWalls; + this.wallThickness = parser.thicknessWall; + this.floorThickness = parser.thicknessFloor; + this.chatBubbleMode = parser.chatSettings.mode; + this.chatBubbleWeight = parser.chatSettings.weight; + this.chatBubbleSpeed = parser.chatSettings.speed; + this.chatFloodProtection = parser.chatSettings.protection; + this.chatDistance = parser.chatSettings.distance; - this.muteState = parser.moderationSettings.allowMute; - this.kickState = parser.moderationSettings.allowKick; - this.banState = parser.moderationSettings.allowBan; - this.bannedUsers = []; + this.muteState = parser.moderationSettings.allowMute; + this.kickState = parser.moderationSettings.allowKick; + this.banState = parser.moderationSettings.allowBan; + this.bannedUsers = []; } } diff --git a/src/api/nitro/room/DispatchMouseEvent.ts b/src/api/nitro/room/DispatchMouseEvent.ts index 6d18f2e8..56efd5c0 100644 --- a/src/api/nitro/room/DispatchMouseEvent.ts +++ b/src/api/nitro/room/DispatchMouseEvent.ts @@ -28,8 +28,8 @@ export function DispatchMouseEvent(roomId: number, canvasId: number, event: Mous { if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; - clickCount = 0; - lastClick = null; + clickCount = 0; + lastClick = null; } } diff --git a/src/api/nitro/room/DispatchTouchEvent.ts b/src/api/nitro/room/DispatchTouchEvent.ts index 7053318e..a04d515c 100644 --- a/src/api/nitro/room/DispatchTouchEvent.ts +++ b/src/api/nitro/room/DispatchTouchEvent.ts @@ -29,8 +29,8 @@ export function DispatchTouchEvent(roomId: number, canvasId: number, event: Touc { eventType = MouseEventType.DOUBLE_CLICK; - clickCount = 0; - lastClick = null; + clickCount = 0; + lastClick = null; } } diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts index 27e9fd13..80dea562 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts +++ b/src/api/nitro/room/widgets/events/RoomWidgetUpdateDimmerStateEvent.ts @@ -14,11 +14,11 @@ export class RoomWidgetUpdateDimmerStateEvent extends RoomWidgetUpdateEvent { super(RoomWidgetUpdateDimmerStateEvent.DIMMER_STATE); - this._state = state; - this._presetId = presetId; - this._effectId = effectId; - this._color = color; - this._brightness = brightness; + this._state = state; + this._presetId = presetId; + this._effectId = effectId; + this._color = color; + this._brightness = brightness; } public get state(): number diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts index 6ec8bf86..aa9b7258 100644 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts +++ b/src/api/nitro/room/widgets/events/RoomWidgetUpdateRoomObjectEvent.ts @@ -20,9 +20,9 @@ export class RoomWidgetUpdateRoomObjectEvent extends RoomWidgetUpdateEvent { super(type); - this._id = id; - this._category = category; - this._roomId = roomId; + this._id = id; + this._category = category; + this._roomId = roomId; } public get id(): number diff --git a/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts index 42405054..6de7aa2f 100644 --- a/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts +++ b/src/api/nitro/room/widgets/handlers/FurniturePresentWidgetHandler.ts @@ -9,10 +9,10 @@ import { RoomWidgetHandler } from './RoomWidgetHandler'; export class FurniturePresentWidgetHandler extends RoomWidgetHandler implements IGetImageListener { - private static FLOOR: string = 'floor'; - private static WALLPAPER: string = 'wallpaper'; - private static LANDSCAPE: string = 'landscape'; - private static POSTER: string = 'poster'; + private static FLOOR: string = 'floor'; + private static WALLPAPER: string = 'wallpaper'; + private static LANDSCAPE: string = 'landscape'; + private static POSTER: string = 'poster'; private _lastFurniId: number = -1; private _name: string = null; diff --git a/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts index 9b345109..8554977a 100644 --- a/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts +++ b/src/api/nitro/room/widgets/handlers/FurnitureTrophyWidgetHandler.ts @@ -24,7 +24,7 @@ export class FurnitureTrophyWidgetHandler extends RoomWidgetHandler const color = roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR); const extra = parseInt(roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS)); - let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); const ownerName = data.substring(0, data.indexOf('\t')); diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts index d658d7d9..678f9e56 100644 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts +++ b/src/api/nitro/room/widgets/messages/RoomWidgetFurniActionMessage.ts @@ -19,10 +19,10 @@ export class RoomWidgetFurniActionMessage extends RoomWidgetMessage { super(type); - this._furniId = id; + this._furniId = id; this._furniCategory = category; - this._offerId = offerId; - this._objectData = objectData; + this._offerId = offerId; + this._objectData = objectData; } public get furniId(): number diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts index 59054ff2..959d7f2b 100644 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts +++ b/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts @@ -24,9 +24,9 @@ export class RoomWidgetFurniToWidgetMessage extends RoomWidgetMessage { super(type); - this._objectId = objectId; - this._category = category; - this._roomId = roomId; + this._objectId = objectId; + this._category = category; + this._roomId = roomId; } public get objectId(): number diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts index cc82b85c..98ce28dd 100644 --- a/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts +++ b/src/api/nitro/room/widgets/messages/RoomWidgetRoomObjectMessage.ts @@ -15,8 +15,8 @@ export class RoomWidgetRoomObjectMessage extends RoomWidgetMessage { super(type); - this._id = id; - this._category = category; + this._id = id; + this._category = category; } public get id(): number diff --git a/src/api/nitro/session/IsOwnerOfFurniture.ts b/src/api/nitro/session/IsOwnerOfFurniture.ts index 20c70f3e..56b7fc34 100644 --- a/src/api/nitro/session/IsOwnerOfFurniture.ts +++ b/src/api/nitro/session/IsOwnerOfFurniture.ts @@ -5,7 +5,7 @@ export function IsOwnerOfFurniture(roomObject: IRoomObject): boolean { if(!roomObject || !roomObject.model) return false; - const userId = GetSessionDataManager().userId; + const userId = GetSessionDataManager().userId; const objectOwnerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); return (userId === objectOwnerId); diff --git a/src/api/utils/ColorUtils.ts b/src/api/utils/ColorUtils.ts index 126d271d..9377255e 100644 --- a/src/api/utils/ColorUtils.ts +++ b/src/api/utils/ColorUtils.ts @@ -13,7 +13,7 @@ export class ColorUtils const diff = 6 - val.length; for(let i = 0; i < diff; i++) { - val = '0' + val; + val = '0' + val; } } return ( '#' + val); diff --git a/src/api/wired/WiredSelectionFilter.ts b/src/api/wired/WiredSelectionFilter.ts index b0b5ae32..d661bcf7 100644 --- a/src/api/wired/WiredSelectionFilter.ts +++ b/src/api/wired/WiredSelectionFilter.ts @@ -38,9 +38,9 @@ export class WiredSelectionFilter extends NitroFilter super(vertex, fragment); this.uniforms.lineColor = new Float32Array(3); - this.uniforms.color = new Float32Array(3); - this.lineColor = lineColor; - this.color = color; + this.uniforms.color = new Float32Array(3); + this.lineColor = lineColor; + this.color = color; } public get lineColor(): number | number[] diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index d167c3d1..c2a7f301 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -107,8 +107,8 @@ export const DraggableWindow: FC = props => { if(!elementRef.current || !dragHandler) return; - let offsetX = (offset.x + delta.x); - let offsetY = (offset.y + delta.y); + let offsetX = (offset.x + delta.x); + let offsetY = (offset.y + delta.y); const left = elementRef.current.offsetLeft + offsetX; const top = elementRef.current.offsetTop + offsetY; diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx index bc7894bc..d4e56d82 100644 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ b/src/common/layout/LayoutNotificationAlertView.tsx @@ -27,7 +27,7 @@ export const LayoutNotificationAlertView: FC = return ( - + { children } diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx index a8114b75..8f821717 100644 --- a/src/common/layout/LayoutProgressBar.tsx +++ b/src/common/layout/LayoutProgressBar.tsx @@ -25,7 +25,7 @@ export const LayoutProgressBar: FC = props => { text && (text.length > 0) && { text } } - + { children } ); diff --git a/src/common/layout/UserProfileIconView.tsx b/src/common/layout/UserProfileIconView.tsx index 769cf625..d31fa66b 100644 --- a/src/common/layout/UserProfileIconView.tsx +++ b/src/common/layout/UserProfileIconView.tsx @@ -10,7 +10,7 @@ export interface UserProfileIconViewProps extends BaseProps export const UserProfileIconView: FC = props => { - const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; + const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props; const getClassNames = useMemo(() => { diff --git a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts b/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts index dc583f38..a277b5ad 100644 --- a/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts +++ b/src/components/avatar-editor/common/AvatarEditorGridPartItem.ts @@ -5,8 +5,8 @@ import { FigureData } from './FigureData'; export class AvatarEditorGridPartItem implements IAvatarImageListener { private static ALPHA_FILTER: NitroAlphaFilter = new NitroAlphaFilter(0.2); - private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; - private static DRAW_ORDER: string[] = [ + private static THUMB_DIRECTIONS: number[] = [ 2, 6, 0, 4, 3, 1 ]; + private static DRAW_ORDER: string[] = [ AvatarFigurePartType.LEFT_HAND_ITEM, AvatarFigurePartType.LEFT_HAND, AvatarFigurePartType.LEFT_SLEEVE, @@ -201,13 +201,13 @@ export class AvatarEditorGridPartItem implements IAvatarImageListener if(this._partSet) { - this._isHC = (this._partSet.clubLevel > 0); - this._isSellable = this._partSet.isSellable; + this._isHC = (this._partSet.clubLevel > 0); + this._isSellable = this._partSet.isSellable; } else { - this._isHC = false; - this._isSellable = false; + this._isHC = false; + this._isSellable = false; } if(this._isDisabled) this.setAlpha(container, 0.2); diff --git a/src/components/avatar-editor/common/CategoryBaseModel.ts b/src/components/avatar-editor/common/CategoryBaseModel.ts index 5cd311c0..34dd9330 100644 --- a/src/components/avatar-editor/common/CategoryBaseModel.ts +++ b/src/components/avatar-editor/common/CategoryBaseModel.ts @@ -11,7 +11,7 @@ export class CategoryBaseModel implements IAvatarEditorCategoryModel constructor() { - this._isInitalized = false; + this._isInitalized = false; this._maxPaletteCount = 0; } diff --git a/src/components/avatar-editor/common/FigureData.ts b/src/components/avatar-editor/common/FigureData.ts index 072ced1c..78014d11 100644 --- a/src/components/avatar-editor/common/FigureData.ts +++ b/src/components/avatar-editor/common/FigureData.ts @@ -199,8 +199,8 @@ export class FigureData { let figureString = ''; - const setTypes: string[] = [ FigureData.FACE ]; - const figureSets: string[] = []; + const setTypes: string[] = [ FigureData.FACE ]; + const figureSets: string[] = []; for(const setType of setTypes) { diff --git a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx index ba0d2da7..3382a71f 100644 --- a/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx +++ b/src/components/avatar-editor/views/model/AvatarEditorModelView.tsx @@ -67,7 +67,7 @@ export const AvatarEditorModelView: FC = props => } - { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => + { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name => { const category = model.categories.get(name); diff --git a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx index f480c900..96252ff4 100644 --- a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx +++ b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx @@ -55,13 +55,13 @@ export const AvatarEditorWardrobeView: FC = props items.push( { figureContainer && - } + } { (clubLevel > 0) && } { figureContainer && - } + } ); diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx index 33df1ff7..7a745c18 100644 --- a/src/components/campaign/CalendarItemView.tsx +++ b/src/components/campaign/CalendarItemView.tsx @@ -33,7 +33,7 @@ export const CalendarItemView: FC = props => } return ( - onClick(itemId) }> + onClick(itemId) }> { (state === CalendarItemState.STATE_UNLOCKED) && diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index 62867b51..3af14b5e 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -103,7 +103,7 @@ export const CampaignView: FC<{}> = props => return ( <> {(calendarData && isCalendarOpen) && - + } ) diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx index dfbf89d2..3f2d88e9 100644 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ b/src/components/catalog/CatalogMessageHandler.tsx @@ -272,7 +272,7 @@ export const CatalogMessageHandler: FC<{}> = props => title = LocalizeText('inventory.marketplace.result.title.failure'); } - const message = LocalizeText(`inventory.marketplace.result.${parser.result}`); + const message = LocalizeText(`inventory.marketplace.result.${ parser.result }`); NotificationUtilities.simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); }, []); diff --git a/src/components/catalog/common/FurniCategory.ts b/src/components/catalog/common/FurniCategory.ts index 7eeeca24..07195cb0 100644 --- a/src/components/catalog/common/FurniCategory.ts +++ b/src/components/catalog/common/FurniCategory.ts @@ -1,26 +1,26 @@ export class FurniCategory { - public static DEFAULT: number = 1; - public static WALL_PAPER: number = 2; - public static FLOOR: number = 3; - public static LANDSCAPE: number = 4; - public static POST_IT: number = 5; - public static POSTER: number = 6; - public static SOUND_SET: number = 7; - public static TRAX_SONG: number = 8; - public static PRESENT: number = 9; - public static ECOTRON_BOX: number = 10; - public static TROPHY: number = 11; - public static CREDIT_FURNI: number = 12; - public static PET_SHAMPOO: number = 13; - public static PET_CUSTOM_PART: number = 14; - public static PET_CUSTOM_PART_SHAMPOO: number = 15; - public static PET_SADDLE: number = 16; - public static GUILD_FURNI: number = 17; - public static GAME_FURNI: number = 18; - public static MONSTERPLANT_SEED: number = 19; - public static MONSTERPLANT_REVIVAL: number = 20; - public static MONSTERPLANT_REBREED: number = 21; - public static MONSTERPLANT_FERTILIZE: number = 22; - public static FIGURE_PURCHASABLE_SET: number = 23; + public static DEFAULT: number = 1; + public static WALL_PAPER: number = 2; + public static FLOOR: number = 3; + public static LANDSCAPE: number = 4; + public static POST_IT: number = 5; + public static POSTER: number = 6; + public static SOUND_SET: number = 7; + public static TRAX_SONG: number = 8; + public static PRESENT: number = 9; + public static ECOTRON_BOX: number = 10; + public static TROPHY: number = 11; + public static CREDIT_FURNI: number = 12; + public static PET_SHAMPOO: number = 13; + public static PET_CUSTOM_PART: number = 14; + public static PET_CUSTOM_PART_SHAMPOO: number = 15; + public static PET_SADDLE: number = 16; + public static GUILD_FURNI: number = 17; + public static GAME_FURNI: number = 18; + public static MONSTERPLANT_SEED: number = 19; + public static MONSTERPLANT_REVIVAL: number = 20; + public static MONSTERPLANT_REBREED: number = 21; + public static MONSTERPLANT_FERTILIZE: number = 22; + public static FIGURE_PURCHASABLE_SET: number = 23; } \ No newline at end of file diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 2da0b69b..d3e94506 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -135,7 +135,7 @@ export const CatalogGiftView: FC<{}> = props => if(!giftData) continue; - if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: `#${giftData.colors[0].toString(16)}` }); + if(giftData.colors && giftData.colors.length > 0) newColors.push({ id: colorId, color: `#${ giftData.colors[0].toString(16) }` }); } setMaxBoxIndex(giftConfiguration.boxTypes.length - 1); @@ -210,7 +210,7 @@ export const CatalogGiftView: FC<{}> = props => { LocalizeText('catalog.gift_wrapping.pick_color') } - { colors.map(color =>
    +
    + + ); +} diff --git a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx new file mode 100644 index 00000000..85ae3b29 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx @@ -0,0 +1,12 @@ +import { FC } from 'react'; +import { LayoutTrophyView } from '../../../../common'; +import { useFurnitureTrophyWidget } from '../../../../hooks'; + +export const FurnitureTrophyView: FC<{}> = props => +{ + const { objectId = -1, color = '1', senderName = '', date = '', message = '' } = useFurnitureTrophyWidget(); + + if(objectId === -1) return null; + + return ; +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss index b6a09bcf..8bf5bf6f 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ b/src/components/room/widgets/furniture/FurnitureWidgets.scss @@ -17,13 +17,14 @@ .dimmer-banner { width: 56px; height: 79px; - background: url('../../../../assets/images/room-widgets/dimmer-widget/dimmer_banner.png') center no-repeat; + background: url("../../../../assets/images/room-widgets/dimmer-widget/dimmer_banner.png") + center no-repeat; } .color-swatch { height: 30px; border: 2px solid $white; - box-shadow: inset 3px 3px rgba(0, 0, 0, .2); + box-shadow: inset 3px 3px rgba(0, 0, 0, 0.2); &.active { box-shadow: none; @@ -36,14 +37,13 @@ height: $nitro-widget-exchange-credit-height; .exchange-image { - background-image: url('../../../../assets/images/room-widgets/exchange-credit/exchange-credit-image.png'); + background-image: url("../../../../assets/images/room-widgets/exchange-credit/exchange-credit-image.png"); width: 103px; height: 103px; } } .nitro-external-image-widget { - .picture-preview { width: 320px; height: 320px; @@ -51,24 +51,129 @@ } .nitro-gift-opening { - + width: 340px; + resize: none; } .nitro-mannequin { + width: 300px; + + .mannequin-preview { + display: flex; + justify-content: center; + align-items: center; + width: 83px; + height: 130px; + background-image: url("../../../../assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png"); + overflow: hidden; + + .avatar-image { + background-position: unset; + top: -8px; + } + } } -.mannequin-preview { - display: flex; - justify-content: center; - align-items: center; - width: 83px; - height: 130px; - background-image: url('../../../../assets/images/room-widgets/mannequin-widget/mannequin-spritesheet.png'); - overflow: hidden; +.nitro-stickie { + position: relative; + width: 185px; + height: 178px; + top: 25px; + left: 25px; + padding: 1px; + pointer-events: all; + + .stickie-header { + width: 183px; + height: 18px; + padding: 0 7px; + + .header-trash, + .header-close { + cursor: pointer; + } + + .stickie-color { + width: 10px; + height: 10px; + cursor: pointer; + } + } + + .stickie-context { + width: 183px; + height: 145px; + padding: 2px 7px; + font-size: 12px; + color: $black; + + .context-text { + width: 100%; + height: 100%; + padding: 0; + overflow-wrap: break-word; + white-space: break-spaces; + overflow-y: auto; + } + + textarea { + background: transparent; + border: 0; + outline: none; + box-shadow: none; + resize: none; + font-style: italic; + + &:active { + border: 0; + outline: none; + box-shadow: none; + } + } + } } -@import './friend-furni/FurnitureFriendFurniView'; -@import './manipulation-menu/FurnitureManipulationMenuView'; -@import './stickie/FurnitureStickieView'; -@import './high-score/FurnitureHighScoreView'; -@import './youtube-tv/FurnitureYoutubeDisplayView'; +.nitro-stickie-image { + background-image: url("../../../../assets/images/room-widgets/stickie-widget/stickie-spritesheet.png"); + + &.stickie-blue, + &.stickie-yellow, + &.stickie-green, + &.stickie-pink { + width: 185px; + height: 178px; + } + + &.stickie-blue { + background-position: -2px -2px; + } + + &.stickie-yellow { + background-image: url("../../../../assets/images/room-widgets/stickie-widget/stickie-yellow.png"); + //background-position: -191px -184px; + } + + &.stickie-green { + background-position: -191px -2px; + } + + &.stickie-pink { + background-position: -2px -184px; + } + + &.stickie-close { + width: 10px; + height: 10px; + background-position: -2px -366px; + } + + &.stickie-trash { + width: 9px; + height: 10px; + background-position: -16px -366px; + } +} + +@import "./friend-furni/FurnitureFriendFurniView"; +@import "./high-score/FurnitureHighScoreView"; +@import "./youtube-tv/FurnitureYoutubeDisplayView"; diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index 553965d6..e3bfbc12 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -1,24 +1,25 @@ import { FC } from 'react'; -import { FurnitureBackgroundColorView } from './background-color/FurnitureBackgroundColorView'; -import { FurnitureBadgeDisplayView } from './badge-display/FurnitureBadgeDisplayView'; +import { Base } from '../../../../common'; import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; -import { FurnitureCustomStackHeightView } from './custom-stack-height/FurnitureCustomStackHeightView'; import { FurnitureDimmerView } from './dimmer/FurnitureDimmerView'; -import { FurnitureExchangeCreditView } from './exchange-credit/FurnitureExchangeCreditView'; -import { FurnitureExternalImageView } from './external-image/FurnitureExternalImageView'; import { FurnitureFriendFurniView } from './friend-furni/FurnitureFriendFurniView'; -import { FurnitureGiftOpeningView } from './gift-opening/FurnitureGiftOpeningView'; +import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; +import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; +import { FurnitureCustomStackHeightView } from './FurnitureCustomStackHeightView'; +import { FurnitureExchangeCreditView } from './FurnitureExchangeCreditView'; +import { FurnitureExternalImageView } from './FurnitureExternalImageView'; +import { FurnitureGiftOpeningView } from './FurnitureGiftOpeningView'; +import { FurnitureManipulationMenuView } from './FurnitureManipulationMenuView'; +import { FurnitureMannequinView } from './FurnitureMannequinView'; +import { FurnitureStickieView } from './FurnitureStickieView'; +import { FurnitureTrophyView } from './FurnitureTrophyView'; import { FurnitureHighScoreView } from './high-score/FurnitureHighScoreView'; -import { FurnitureManipulationMenuView } from './manipulation-menu/FurnitureManipulationMenuView'; -import { FurnitureMannequinView } from './mannequin/FurnitureMannequinView'; -import { FurnitureStickieView } from './stickie/FurnitureStickieView'; -import { FurnitureTrophyView } from './trophy/FurnitureTrophyView'; import { FurnitureYoutubeDisplayView } from './youtube-tv/FurnitureYoutubeDisplayView'; export const FurnitureWidgetsView: FC<{}> = props => { return ( -
    + @@ -34,6 +35,6 @@ export const FurnitureWidgetsView: FC<{}> = props => -
    + ); } diff --git a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx b/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx deleted file mode 100644 index 28b21e0e..00000000 --- a/src/components/room/widgets/furniture/background-color/FurnitureBackgroundColorView.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { ApplyTonerComposer, RoomControllerLevel, RoomEngineObjectEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { GetRoomEngine, GetSessionDataManager, LocalizeText, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SendMessageComposer } from '../../../../../api'; -import { Button, Column, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -export const FurnitureBackgroundColorView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ hue, setHue ] = useState(0); - const [ saturation, setSaturation ] = useState(0); - const [ lightness, setLightness ] = useState(0); - const { roomSession = null, eventDispatcher = null } = useRoomContext(); - - const close = useCallback(() => - { - eventDispatcher.dispatchEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW)); - - setObjectId(-1); - }, [ eventDispatcher ]); - - const canOpenBackgroundToner = useCallback(() => - { - return (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); - }, [ roomSession ]); - - const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR: { - if(!canOpenBackgroundToner()) return; - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - const model = roomObject.model; - - setObjectId(roomObject.id); - setHue(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_HUE))); - setSaturation(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION))); - setLightness(parseInt(model.getValue(RoomObjectVariable.FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS))); - - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - if(objectId !== event.objectId) return; - - close(); - return; - } - } - }, [ objectId, canOpenBackgroundToner, close ]); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, onRoomEngineObjectEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onRoomEngineObjectEvent); - - const processAction = useCallback((name: string) => - { - switch(name) - { - case 'apply': - SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); - break; - case 'toggle': - roomSession.useMultistateItem(objectId); - break; - } - }, [ roomSession, objectId, hue, saturation, lightness ]); - - useEffect(() => - { - if(objectId === -1) return; - - eventDispatcher.dispatchEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, hue, saturation, lightness)); - }, [ eventDispatcher, objectId, hue, saturation, lightness ]); - - if(objectId === -1) return null; - - return ( - - - - - - { LocalizeText('widget.backgroundcolor.hue') } - setHue(event) } - thumbClassName={ 'thumb degree' } - renderThumb={ (props, state) =>
    { state.valueNow }
    } /> -
    - - { LocalizeText('widget.backgroundcolor.saturation') } - setSaturation(event) } - thumbClassName={ 'thumb percent' } - renderThumb={ (props, state) =>
    { state.valueNow }
    } /> -
    - - { LocalizeText('widget.backgroundcolor.lightness') } - setLightness(event) } - thumbClassName={ 'thumb percent' } - renderThumb={ (props, state) =>
    { state.valueNow }
    } /> -
    -
    - - - - -
    -
    - ); -} diff --git a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx b/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx deleted file mode 100644 index 22a15b8a..00000000 --- a/src/components/room/widgets/furniture/badge-display/FurnitureBadgeDisplayView.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, StringDataType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, LocalizeBadgeDescription, LocalizeBadgeName, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { LayoutTrophyView } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureTrophyData } from '../trophy/FurnitureTrophyData'; - -export const FurnitureBadgeDisplayView: FC<{}> = props => -{ - const [ trophyData, setTrophyData ] = useState(null); - const { widgetHandler = null } = useRoomContext(); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: - case RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const stringStuff = new StringDataType(); - - stringStuff.initializeFromRoomObjectModel(roomObject.model); - - const badgeName = LocalizeBadgeName(stringStuff.getValue(1)); - const badgeDesc = LocalizeBadgeDescription(stringStuff.getValue(1)); - const date = stringStuff.getValue(2); - const senderName = stringStuff.getValue(3); - - setTrophyData(new FurnitureTrophyData(widgetEvent.objectId, widgetEvent.category, '1', senderName, date, badgeDesc, badgeName)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, onNitroEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setTrophyData(null); - return; - } - }, []); - - if(!trophyData) return null; - - return processAction('close') } />; -} diff --git a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx b/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx deleted file mode 100644 index 694a9c4a..00000000 --- a/src/components/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { FurnitureStackHeightComposer, FurnitureStackHeightEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import ReactSlider from 'react-slider'; -import { LocalizeText, RoomWidgetUpdateCustomStackHeightEvent, SendMessageComposer } from '../../../../../api'; -import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -const MAX_HEIGHT: number = 40; - -export const FurnitureCustomStackHeightView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ height, setHeight ] = useState(0); - const [ pendingHeight, setPendingHeight ] = useState(-1); - const { eventDispatcher = null } = useRoomContext(); - - const close = () => - { - setObjectId(-1); - setHeight(0); - } - - const updateHeight = useCallback((height: number, fromServer: boolean = false) => - { - if(!height) height = 0; - - height = Math.abs(height); - - if(!fromServer) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); - - setHeight(parseFloat(height.toFixed(2))); - - if(!fromServer) setPendingHeight(height * 100); - }, []); - - const onRoomWidgetUpdateCustomStackHeightEvent = useCallback((event: RoomWidgetUpdateCustomStackHeightEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT: { - setObjectId(event.objectId); - updateHeight(event.height, true); - } - } - }, [ updateHeight ]); - - UseEventDispatcherHook(RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT, eventDispatcher, onRoomWidgetUpdateCustomStackHeightEvent); - - const onFurnitureStackHeightEvent = useCallback((event: FurnitureStackHeightEvent) => - { - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - updateHeight(parser.height, true); - }, [ objectId, updateHeight ]); - - UseMessageEventHook(FurnitureStackHeightEvent, onFurnitureStackHeightEvent); - - const sendUpdate = useCallback((height: number) => - { - SendMessageComposer(new FurnitureStackHeightComposer(objectId, ~~(height))); - }, [ objectId ]); - - useEffect(() => - { - if((objectId === -1) || (pendingHeight === -1)) return; - - const timeout = setTimeout(() => sendUpdate(~~(pendingHeight)), 10); - - return () => clearTimeout(timeout); - }, [ objectId, pendingHeight, sendUpdate ]); - - if(objectId === -1) return null; - - return ( - - - - { LocalizeText('widget.custom.stack.height.text') } - - updateHeight(event) } - renderThumb={ (props, state) =>
    { state.valueNow }
    } /> - updateHeight(parseFloat(event.target.value)) } /> -
    - - - - -
    -
    - ); -} diff --git a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx b/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx deleted file mode 100644 index f7e197cb..00000000 --- a/src/components/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { FC, useCallback, useState } from 'react'; -import { IPhotoData, LocalizeText, RoomWidgetUpdateExternalImageEvent } from '../../../../../api'; -import { Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -export const FurnitureExternalImageView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ photoData, setPhotoData ] = useState(null); - const { eventDispatcher = null } = useRoomContext(); - - const close = () => - { - setObjectId(-1); - setPhotoData(null) - } - - const onRoomWidgetUpdateExternalImageEvent = useCallback((event: RoomWidgetUpdateExternalImageEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE: - setObjectId(event.objectId); - setPhotoData(event.photoData); - return; - } - }, []); - - UseEventDispatcherHook(RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE, eventDispatcher, onRoomWidgetUpdateExternalImageEvent); - - if((objectId === -1) || !photoData) return null; - - return ( - - - - - { !photoData.w && - { LocalizeText('camera.loading') } } - - { photoData.m && photoData.m.length && - { photoData.m } } - - { (photoData.n || '') } - { new Date(photoData.t * 1000).toLocaleDateString() } - - - - ); -} diff --git a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx b/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx deleted file mode 100644 index 8d30018d..00000000 --- a/src/components/room/widgets/furniture/gift-opening/FurnitureGiftOpeningView.tsx +++ /dev/null @@ -1,241 +0,0 @@ -import { RoomObjectCategory, RoomObjectOperationType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import { CreateLinkEvent, GetRoomEngine, GetSessionDataManager, LocalizeText, ProductTypeEnum, RoomWidgetPresentOpenMessage, RoomWidgetUpdatePresentDataEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { Button, Column, Flex, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook } from '../../../../../hooks/events/UseEventDispatcherHook'; -import { useRoomContext } from '../../../RoomContext'; - -const FLOOR: string = 'floor'; -const WALLPAPER: string = 'wallpaper'; -const LANDSCAPE: string = 'landscape'; - -const ACTION_GIVE_GIFT = 0; -const ACTION_OPEN = 1; -const ACTION_PLACE = 2; -const ACTION_INVENTORY = 3; - -export const FurnitureGiftOpeningView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ classId, setClassId ] = useState(-1); - const [ itemType, setItemType ] = useState(null); - const [ text, setText ] = useState(null); - const [ isOwnerOfFurniture, setIsOwnerOfFurniture ] = useState(false); - const [ senderName, setSenderName ] = useState(null); - const [ senderFigure, setSenderFigure ] = useState(null); - const [ placedItemId, setPlacedItemId ] = useState(-1); - const [ placedItemType, setPlacedItemType ] = useState(null); - const [ placedInRoom, setPlacedInRoom ] = useState(false); - const [ imageUrl, setImageUrl ] = useState(null); - const [ openRequested, setOpenRequested ] = useState(false); - const { roomSession = null, eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const clearGift = useCallback(() => - { - if(!openRequested) setObjectId(-1); - - setText(null); - setIsOwnerOfFurniture(false); - }, [ openRequested ]); - - const getGiftImageUrl = useCallback((name: string) => - { - return ''; - }, []); - - const onRoomWidgetUpdatePresentDataEvent = useCallback((event: RoomWidgetUpdatePresentDataEvent) => - { - switch(event.type) - { - case RoomWidgetUpdatePresentDataEvent.PACKAGEINFO: { - setOpenRequested(false); - setObjectId(event.objectId); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setSenderName(event.purchaserName); - setSenderFigure(event.purchaserFigure); - setImageUrl(event.imageUrl); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR: - case RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE: - case RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER: { - let imageType: string = null; - - if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR) imageType = 'packagecard_icon_floor'; - else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE) imageType = 'packagecard_icon_landscape'; - else if(event.type === RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER) imageType = 'packagecard_icon_wallpaper'; - - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(getGiftImageUrl(imageType)); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB: { - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setImageUrl(getGiftImageUrl('packagecard_icon_hc')); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS: { - if(!openRequested) return; - - setObjectId(event.objectId); - setClassId(event.classId); - setItemType(event.itemType); - setText(event.giftMessage); - setIsOwnerOfFurniture(event.isController); - setPlacedItemId(event.placedItemId); - setPlacedItemType(event.placedItemType); - setPlacedInRoom(event.placedInRoom); - setImageUrl(event.imageUrl); - return; - } - case RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE: { - if(!openRequested) return; - - setImageUrl(event.imageUrl); - } - } - }, [ openRequested, getGiftImageUrl ]); - - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.PACKAGEINFO, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_FLOOR, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_LANDSCAPE, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_WALLPAPER, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_CLUB, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - UseEventDispatcherHook(RoomWidgetUpdatePresentDataEvent.CONTENTS_IMAGE, eventDispatcher, onRoomWidgetUpdatePresentDataEvent); - - const onRoomWidgetRoomObjectUpdateEvent = useCallback((event: RoomWidgetUpdateRoomObjectEvent) => - { - if(event.id === objectId) clearGift(); - - if(event.id === placedItemId) - { - if(placedInRoom) setPlacedInRoom(false); - } - }, [ objectId, placedItemId, placedInRoom, clearGift ]); - - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - - const close = useCallback(() => - { - setObjectId(-1); - setOpenRequested(false); - setPlacedItemId(-1); - setPlacedInRoom(false); - setText(null); - setIsOwnerOfFurniture(false); - }, []); - - const isSpaces = useMemo(() => - { - if(itemType !== ProductTypeEnum.WALL) return false; - - const furniData = GetSessionDataManager().getWallItemData(classId); - - if(!furniData) return false; - - const className = furniData.className; - - return (className === FLOOR || className === LANDSCAPE || className === WALLPAPER); - }, [ classId, itemType ]); - - const productName = useMemo(() => - { - if(objectId === -1) return ''; - - if(isSpaces) return 'widget.furni.present.spaces.message_opened'; - - return 'widget.furni.present.message_opened'; - }, [ objectId, isSpaces ]); - - const handleAction = useCallback((action: number) => - { - switch(action) - { - case ACTION_GIVE_GIFT: - CreateLinkEvent('catalog/open'); - return; - case ACTION_OPEN: - setOpenRequested(true); - widgetHandler.processWidgetMessage(new RoomWidgetPresentOpenMessage(RoomWidgetPresentOpenMessage.OPEN_PRESENT, objectId)); - return; - case ACTION_PLACE: - return; - case ACTION_INVENTORY: - if((placedItemId > 0) && placedInRoom) - { - if(placedItemType === ProductTypeEnum.PET) - { - roomSession.pickupPet(placedItemId); - } - else - { - const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, placedItemId, RoomObjectCategory.FLOOR); - - if(roomObject) GetRoomEngine().processRoomObjectOperation(roomObject.id, RoomObjectCategory.FLOOR, RoomObjectOperationType.OBJECT_PICKUP); - } - } - - close(); - return; - } - }, [ roomSession, widgetHandler, objectId, placedInRoom, placedItemId, placedItemType, close ]); - - if(objectId === -1) return null; - - return ( - - - - { (placedItemId === -1) && - - - - - - { senderName && - } - - - } - { (placedItemId > -1) && - - - - { LocalizeText(productName, [ 'product' ], [ text ]) } - - - - - - - { (senderName && senderName.length) && - } - - } - - - ); -} diff --git a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.scss b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx b/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx deleted file mode 100644 index 7d7777e7..00000000 --- a/src/components/room/widgets/furniture/manipulation-menu/FurnitureManipulationMenuView.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { RoomObjectOperationType } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { ProcessRoomObjectOperation, RoomWidgetUpdateDecorateModeEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { ObjectLocationView } from '../../object-location/ObjectLocationView'; - -export const FurnitureManipulationMenuView: FC<{}> = props => -{ - const [ isVisible, setIsVisible ] = useState(false); - const [ objectId, setObjectId ] = useState(-1); - const [ objectType, setObjectType ] = useState(-1); - const { roomSession = null, eventDispatcher = null, widgetHandler = null } = useRoomContext(); - - const rotateFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_ROTATE_POSITIVE); - }, [ objectId, objectType ]); - - const moveFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_MOVE); - }, [ objectId, objectType ]); - - const pickupFurniture = useCallback(() => - { - ProcessRoomObjectOperation(objectId, objectType, RoomObjectOperationType.OBJECT_PICKUP); - }, [ objectId, objectType ]); - - const onRoomWidgetRoomObjectUpdateEvent = useCallback((event: RoomWidgetUpdateRoomObjectEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateRoomObjectEvent.OBJECT_REQUEST_MANIPULATION: { - setIsVisible(true); - setObjectId(event.id); - setObjectType(event.category); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - if(event.id === objectId) - { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - } - return; - } - case RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED: { - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - return; - } - } - }, [ objectId ]); - - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_REQUEST_MANIPULATION, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.OBJECT_DESELECTED, eventDispatcher, onRoomWidgetRoomObjectUpdateEvent); - - const onRoomWidgetUpdateDecorateModeEvent = useCallback((event: RoomWidgetUpdateDecorateModeEvent) => - { - if(event.isDecorating) return; - - moveFurniture(); - - setIsVisible(false); - setObjectId(-1); - setObjectType(-1); - }, [ moveFurniture ]); - - UseEventDispatcherHook(RoomWidgetUpdateDecorateModeEvent.UPDATE_DECORATE, eventDispatcher, onRoomWidgetUpdateDecorateModeEvent); - - useEffect(() => - { - if(!isVisible) - { - eventDispatcher.dispatchEvent(new RoomWidgetUpdateDecorateModeEvent(false)); - - return; - } - - eventDispatcher.dispatchEvent(new RoomWidgetUpdateDecorateModeEvent(true)); - - moveFurniture(); - }, [ eventDispatcher, isVisible, moveFurniture ]); - - if(!isVisible) return null; - - return ( - -
    - - -
    -
    - ); -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts deleted file mode 100644 index 1cf1160d..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinData.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class FurnitureMannequinData -{ - constructor( - public objectId: number, - public category: number, - public name: string, - public figure: string, - public gender: string, - public clubLevel: number, - public renderedFigure: string = null) - {} -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx deleted file mode 100644 index 4b5732db..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinPreviewView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { FC } from 'react'; -import { Base, LayoutAvatarImageView, LayoutCurrencyIcon } from '../../../../../common'; - -interface FurnitureMannequinPreviewViewProps -{ - figure: string; - clubLevel: number; -} - -export const FurnitureMannequinPreviewView: FC = props => -{ - const { figure = null, clubLevel = 0 } = props; - - return ( - - - { (clubLevel > 0) && - } - - ); -} diff --git a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx b/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx deleted file mode 100644 index fa7f32e7..00000000 --- a/src/components/room/widgets/furniture/mannequin/FurnitureMannequinView.tsx +++ /dev/null @@ -1,221 +0,0 @@ -import { AvatarFigurePartType, FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, HabboClubLevelEnum, IAvatarFigureContainer, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { FC, KeyboardEvent, useCallback, useEffect, useState } from 'react'; -import { GetAvatarRenderManager, GetClubMemberLevel, GetSessionDataManager, LocalizeText, RoomWidgetUpdateMannequinEvent, SendMessageComposer } from '../../../../../api'; -import { Base, Button, Column, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; - -const MODE_NONE: number = -1; -const MODE_CONTROLLER: number = 0; -const MODE_UPDATE: number = 1; -const MODE_PEER: number = 2; -const MODE_NO_CLUB: number = 3; -const MODE_WRONG_GENDER: number = 4; - -const ACTION_SET_NAME: number = 1; -const ACTION_WEAR: number = 2; -const ACTION_SAVE: number = 3; - -const MANNEQUIN_FIGURE = [ 'hd', 99999, [ 99998 ] ]; -const MANNEQUIN_CLOTHING_PART_TYPES = [ - AvatarFigurePartType.CHEST_ACCESSORY, - AvatarFigurePartType.COAT_CHEST, - AvatarFigurePartType.CHEST, - AvatarFigurePartType.LEGS, - AvatarFigurePartType.SHOES, - AvatarFigurePartType.WAIST_ACCESSORY -]; - -export const FurnitureMannequinView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ figure, setFigure ] = useState(null); - const [ gender, setGender ] = useState(null); - const [ name, setName ] = useState(null); - const [ clubLevel, setClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); - const [ renderedFigure, setRenderedFigure ] = useState(null); - const [ renderedClubLevel, setRenderedClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); - const [ mode, setMode ] = useState(MODE_NONE); - const { roomSession = null, eventDispatcher = null } = useRoomContext(); - - const onRoomWidgetUpdateMannequinEvent = useCallback((event: RoomWidgetUpdateMannequinEvent) => - { - const figureContainer = GetAvatarRenderManager().createFigureContainer(event.figure); - const figureClubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, event.gender, MANNEQUIN_CLOTHING_PART_TYPES); - - setObjectId(event.objectId); - setFigure(event.figure); - setGender(event.gender); - setName(event.name); - setClubLevel(figureClubLevel); - - if(roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator) - { - setMode(MODE_CONTROLLER); - } - - else if(GetSessionDataManager().gender.toLowerCase() !== event.gender.toLowerCase()) - { - setMode(MODE_WRONG_GENDER); - } - - else if(GetClubMemberLevel() < figureClubLevel) - { - setMode(MODE_NO_CLUB); - } - else - { - setMode(MODE_PEER); - } - }, [ roomSession ]); - - UseEventDispatcherHook(RoomWidgetUpdateMannequinEvent.MANNEQUIN_UPDATE, eventDispatcher, onRoomWidgetUpdateMannequinEvent); - - const getMergedFigureContainer = (figure: string, targetFigure: string) => - { - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - const targetFigureContainer = GetAvatarRenderManager().createFigureContainer(targetFigure); - - for(const part of MANNEQUIN_CLOTHING_PART_TYPES) figureContainer.removePart(part); - - for(const part of targetFigureContainer.getPartTypeIds()) - { - figureContainer.updatePart(part, targetFigureContainer.getPartSetId(part), targetFigureContainer.getPartColorIds(part)); - } - - return figureContainer; - } - - const transformAsMannequinFigure = (figureContainer: IAvatarFigureContainer) => - { - for(const part of figureContainer.getPartTypeIds()) - { - if(MANNEQUIN_CLOTHING_PART_TYPES.indexOf(part) >= 0) continue; - - figureContainer.removePart(part); - } - - figureContainer.updatePart((MANNEQUIN_FIGURE[0] as string), (MANNEQUIN_FIGURE[1] as number), (MANNEQUIN_FIGURE[2] as number[])); - }; - - const processAction = useCallback((action: number, value: string = null) => - { - switch(action) - { - case ACTION_SAVE: - SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); - break; - case ACTION_WEAR: - SendMessageComposer(new FurnitureMultiStateComposer(objectId)); - break; - case ACTION_SET_NAME: - SendMessageComposer(new FurnitureMannequinSaveNameComposer(objectId, name)); - return; - } - - setMode(MODE_NONE); - }, [ objectId, name ]); - - const handleKeyDown = (event: KeyboardEvent) => - { - if(event.key !== 'Enter') return; - - processAction(ACTION_SET_NAME); - }; - - useEffect(() => - { - switch(mode) - { - case MODE_CONTROLLER: - case MODE_WRONG_GENDER: { - const figureContainer = GetAvatarRenderManager().createFigureContainer(figure); - - transformAsMannequinFigure(figureContainer); - - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - break; - } - case MODE_UPDATE: { - const figureContainer = GetAvatarRenderManager().createFigureContainer(GetSessionDataManager().figure); - - transformAsMannequinFigure(figureContainer); - - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(GetAvatarRenderManager().getFigureClubLevel(figureContainer, GetSessionDataManager().gender, MANNEQUIN_CLOTHING_PART_TYPES)); - break; - } - case MODE_PEER: - case MODE_NO_CLUB: { - const figureContainer = getMergedFigureContainer(GetSessionDataManager().figure, figure); - - setRenderedFigure(figureContainer.getFigureString()); - setRenderedClubLevel(clubLevel); - break; - } - } - }, [ mode, figure, clubLevel ]); - - if(mode === MODE_NONE) return null; - - return ( - - setMode(MODE_NONE) } /> - - - - - - { (clubLevel > 0) && - } - - - - { (mode === MODE_CONTROLLER) && - <> - setName(event.target.value) } onKeyDown={ event => handleKeyDown(event) } /> - - - - - } - { (mode === MODE_UPDATE) && - <> - - { name } - { LocalizeText('mannequin.widget.savetext') } - - - setMode(MODE_CONTROLLER) }> - { LocalizeText('mannequin.widget.back') } - - - - } - { (mode === MODE_PEER) && - <> - - { name } - { LocalizeText('mannequin.widget.weartext') } - - - } - { (mode === MODE_NO_CLUB) && - { LocalizeText('mannequin.widget.clubnotification') } } - { (mode === MODE_WRONG_GENDER) && - { LocalizeText('mannequin.widget.wronggender') } } - - - - - ); -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts deleted file mode 100644 index 7ab1b184..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieData.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class FurnitureStickieData -{ - constructor( - public objectId: number, - public category: number, - public color: string, - public text: string, - public canModify: boolean = false, - public isEditing: boolean = false) - {} -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts b/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts deleted file mode 100644 index 2894294d..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieUtils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; -export const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; - -export function getStickieColorName(color: string): string -{ - let index = STICKIE_COLORS.indexOf(color); - - if(index === -1) index = 0; - - return STICKIE_COLOR_NAMES[index]; -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss deleted file mode 100644 index 95c8aecd..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.scss +++ /dev/null @@ -1,99 +0,0 @@ -.nitro-stickie { - position: relative; - width: 185px; - height: 178px; - top: 25px; - left: 25px; - padding: 1px; - pointer-events: all; - - .stickie-header { - width: 183px; - height: 18px; - padding: 0 7px; - - .header-trash, - .header-close { - cursor: pointer; - } - - .stickie-color { - width: 10px; - height: 10px; - cursor: pointer; - } - } - - .stickie-context { - width: 183px; - height: 145px; - padding: 2px 7px; - font-size: 12px; - color: $black; - - .context-text { - width: 100%; - height: 100%; - padding: 0; - overflow-wrap: break-word; - white-space: break-spaces; - overflow-y: auto; - } - - textarea { - background: transparent; - border: 0; - outline: none; - box-shadow: none; - resize: none; - font-style: italic; - - &:active { - border: 0; - outline: none; - box-shadow: none; - } - } - } -} - -.nitro-stickie-image { - background-image: url('../../../../../assets/images/room-widgets/stickie-widget/stickie-spritesheet.png'); - - &.stickie-blue, - &.stickie-yellow, - &.stickie-green, - &.stickie-pink { - width: 185px; - height: 178px; - } - - &.stickie-blue { - background-position: -2px -2px; - } - - &.stickie-yellow { - background-image: url('../../../../../assets/images/room-widgets/stickie-widget/stickie-yellow.png'); - //background-position: -191px -184px; - } - - &.stickie-green { - background-position: -191px -2px; - } - - &.stickie-pink { - background-position: -2px -184px; - } - - &.stickie-close { - width: 10px; - height: 10px; - background-position: -2px -366px; - } - - &.stickie-trash { - width: 9px; - height: 10px; - background-position: -16px -366px; - } -} diff --git a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx deleted file mode 100644 index 6e28f260..00000000 --- a/src/components/room/widgets/furniture/stickie/FurnitureStickieView.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { ColorUtils, GetRoomEngine, GetRoomSession, GetSessionDataManager, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { DraggableWindow, DraggableWindowPosition } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureStickieData } from './FurnitureStickieData'; -import { getStickieColorName, STICKIE_COLORS } from './FurnitureStickieUtils'; - -export const FurnitureStickieView: FC<{}> = props => -{ - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ stickieData, setStickieData ] = useState(null); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_STICKIE: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_ITEMDATA); - - if(data.length < 6) return; - - let color: string = null; - let text: string = null; - - if(data.indexOf(' ') > 0) - { - color = data.slice(0, data.indexOf(' ')); - text = data.slice((data.indexOf(' ') + 1), data.length); - } - else - { - color = data; - } - - setStickieData(new FurnitureStickieData(widgetEvent.objectId, widgetEvent.category, color, text, (GetRoomSession().isRoomOwner || GetSessionDataManager().isModerator), false)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setStickieData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_STICKIE, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setStickieData(null); - return; - case 'trash': - setStickieData(prevState => - { - if(!prevState) return null; - - GetRoomEngine().deleteRoomObject(prevState.objectId, prevState.category); - - return null; - }); - return; - case 'changeColor': - setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, value, prevState.text, prevState.canModify); - - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - - return newStickieData; - }); - return; - case 'changeText': - setStickieData(prevState => - { - const newStickieData = new FurnitureStickieData(prevState.objectId, prevState.category, prevState.color, value, prevState.canModify); - - GetRoomEngine().modifyRoomObjectData(newStickieData.objectId, newStickieData.category, newStickieData.color, newStickieData.text); - - return newStickieData; - }); - return; - case 'editMode': - setStickieData(prevValue => - { - if(!prevValue.canModify) return prevValue; - - return new FurnitureStickieData(prevValue.objectId, prevValue.category, prevValue.color, prevValue.text, prevValue.canModify, true); - }); - return; - } - }, []); - - if(!stickieData) return null; - - return ( - -
    -
    -
    - { stickieData.canModify && - <> -
    processAction('trash') }>
    - { STICKIE_COLORS.map(color => - { - return
    processAction('changeColor', color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> - }) } - } -
    -
    processAction('close') }>
    -
    -
    - { !stickieData.isEditing ?
    processAction('editMode') }>{ stickieData.text }
    : } -
    -
    - - ); -} diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts b/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts deleted file mode 100644 index 66b50e61..00000000 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyData.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class FurnitureTrophyData -{ - constructor( - public objectId: number, - public category: number, - public color: string, - public ownerName: string, - public date: string, - public message: string, - public customTitle?: string) - {} -} diff --git a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx deleted file mode 100644 index 721061df..00000000 --- a/src/components/room/widgets/furniture/trophy/FurnitureTrophyView.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { LayoutTrophyView } from '../../../../../common'; -import { UseEventDispatcherHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureTrophyData } from './FurnitureTrophyData'; - -export const FurnitureTrophyView: FC<{}> = props => -{ - - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ trophyData, setTrophyData ] = useState(null); - - const onNitroEvent = useCallback((event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_TROPHY: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - let data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let extra = roomObject.model.getValue(RoomObjectVariable.FURNITURE_EXTRAS); - - if(!extra) extra = '0'; - - const color = roomObject.model.getValue(RoomObjectVariable.FURNITURE_COLOR); - const ownerName = data.substring(0, data.indexOf('\t')); - - data = data.substring((ownerName.length + 1), data.length); - - const trophyDate = data.substring(0, data.indexOf('\t')); - const trophyText = data.substr((trophyDate.length + 1), data.length); - - setTrophyData(new FurnitureTrophyData(widgetEvent.objectId, widgetEvent.category, color, ownerName, trophyDate, trophyText)); - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setTrophyData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }, []); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close': - setTrophyData(null); - return; - } - }, []); - - if(!trophyData) return null; - - return processAction('close') } />; -} From dc89f4117a5e96c21ba6fffcb49a9e52e56df7b1 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 17 Apr 2022 21:22:02 -0400 Subject: [PATCH 247/331] Fix the busted room info popover in navi --- .../NavigatorSearchResultItemInfoView.tsx | 42 ++++--------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx index 6d434a5c..432fce48 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx @@ -1,6 +1,6 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RoomDataParser } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useEffect, useState } from 'react'; +import { FC, useRef, useState } from 'react'; import { Overlay, Popover } from 'react-bootstrap'; import { LocalizeText } from '../../../../api'; import { Base, Column, Flex, LayoutBadgeImageView, LayoutRoomThumbnailView, NitroCardContentView, Text, UserProfileIconView } from '../../../../common'; @@ -13,8 +13,8 @@ interface NavigatorSearchResultItemInfoViewProps export const NavigatorSearchResultItemInfoView: FC = props => { const { roomData = null } = props; - const [ target, setTarget ] = useState<(EventTarget & HTMLElement)>(null); const [ isVisible, setIsVisible ] = useState(false); + const elementRef = useRef(); const getUserCounterColor = () => { @@ -38,33 +38,10 @@ export const NavigatorSearchResultItemInfoView: FC) => - { - event.stopPropagation(); - - let visible = false; - - setIsVisible(prevValue => - { - visible = !prevValue; - - return visible; - }); - - if(visible) setTarget((event.target as (EventTarget & HTMLElement))); - } - - useEffect(() => - { - if(isVisible) return; - - setTarget(null); - }, [ isVisible ]); - return ( <> - - + setIsVisible(true) } onMouseLeave={ event => setIsVisible(false) } /> + @@ -78,14 +55,14 @@ export const NavigatorSearchResultItemInfoView: FC { roomData.roomName } - + { LocalizeText('navigator.roomownercaption') } - - { roomData.ownerName } + + + { roomData.ownerName } + { roomData.description } @@ -99,7 +76,6 @@ export const NavigatorSearchResultItemInfoView: FC - ); } From 803ba76285abfc1b71463b982802e5967ea5dbef Mon Sep 17 00:00:00 2001 From: MyNameIsBatman Date: Wed, 20 Apr 2022 09:44:39 -0300 Subject: [PATCH 248/331] Move navigator models to ui-config --- public/ui-config.json.example | 37 +++++++++++++++ src/api/navigator/IRoomModel.ts | 6 +++ src/api/navigator/RoomModels.ts | 46 ------------------- src/api/navigator/index.ts | 2 +- .../views/NavigatorRoomCreatorView.tsx | 24 +++++++--- 5 files changed, 62 insertions(+), 53 deletions(-) create mode 100644 src/api/navigator/IRoomModel.ts delete mode 100644 src/api/navigator/RoomModels.ts diff --git a/public/ui-config.json.example b/public/ui-config.json.example index e67ee9a9..1145a59a 100644 --- a/public/ui-config.json.example +++ b/public/ui-config.json.example @@ -16,6 +16,43 @@ "badge.descriptions.enabled": true, "motto.max.length": 38, "bot.name.max.length": 15, + "navigator.room.models": [ + { "clubLevel": 0, "tileSize": 104, "name": "a" }, + { "clubLevel": 0, "tileSize": 94, "name": "b" }, + { "clubLevel": 0, "tileSize": 36, "name": "c" }, + { "clubLevel": 0, "tileSize": 84, "name": "d" }, + { "clubLevel": 0, "tileSize": 80, "name": "e" }, + { "clubLevel": 0, "tileSize": 80, "name": "f" }, + { "clubLevel": 0, "tileSize": 416, "name": "i" }, + { "clubLevel": 0, "tileSize": 320, "name": "j" }, + { "clubLevel": 0, "tileSize": 448, "name": "k" }, + { "clubLevel": 0, "tileSize": 352, "name": "l" }, + { "clubLevel": 0, "tileSize": 384, "name": "m" }, + { "clubLevel": 0, "tileSize": 372, "name": "n" }, + { "clubLevel": 1, "tileSize": 80, "name": "g" }, + { "clubLevel": 1, "tileSize": 74, "name": "h" }, + { "clubLevel": 1, "tileSize": 416, "name": "o" }, + { "clubLevel": 1, "tileSize": 352, "name": "p" }, + { "clubLevel": 1, "tileSize": 304, "name": "q" }, + { "clubLevel": 1, "tileSize": 336, "name": "r" }, + { "clubLevel": 1, "tileSize": 748, "name": "u" }, + { "clubLevel": 1, "tileSize": 438, "name": "v" }, + { "clubLevel": 2, "tileSize": 540, "name": "t" }, + { "clubLevel": 2, "tileSize": 512, "name": "w" }, + { "clubLevel": 2, "tileSize": 396, "name": "x" }, + { "clubLevel": 2, "tileSize": 440, "name": "y" }, + { "clubLevel": 2, "tileSize": 456, "name": "z" }, + { "clubLevel": 2, "tileSize": 208, "name": "0" }, + { "clubLevel": 2, "tileSize": 1009, "name": "1" }, + { "clubLevel": 2, "tileSize": 1044, "name": "2" }, + { "clubLevel": 2, "tileSize": 183, "name": "3" }, + { "clubLevel": 2, "tileSize": 254, "name": "4" }, + { "clubLevel": 2, "tileSize": 1024, "name": "5" }, + { "clubLevel": 2, "tileSize": 801, "name": "6" }, + { "clubLevel": 2, "tileSize": 354, "name": "7" }, + { "clubLevel": 2, "tileSize": 888, "name": "8" }, + { "clubLevel": 2, "tileSize": 926, "name": "9" } + ], "hotelview": { "show.avatar": true, "widgets": { diff --git a/src/api/navigator/IRoomModel.ts b/src/api/navigator/IRoomModel.ts new file mode 100644 index 00000000..73dfe278 --- /dev/null +++ b/src/api/navigator/IRoomModel.ts @@ -0,0 +1,6 @@ +export interface IRoomModel +{ + clubLevel: number; + tileSize: number; + name: string; +} diff --git a/src/api/navigator/RoomModels.ts b/src/api/navigator/RoomModels.ts deleted file mode 100644 index c2b40066..00000000 --- a/src/api/navigator/RoomModels.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { HabboClubLevelEnum } from '@nitrots/nitro-renderer'; - -export interface IRoomModel -{ - clubLevel: number; - tileSize: number; - name: string; -} - -export const RoomModels: IRoomModel[] = [ - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 104, name: 'a' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 94, name: 'b' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 36, name: 'c' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 84, name: 'd' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 80, name: 'e' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 80, name: 'f' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 416, name: 'i' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 320, name: 'j' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 448, name: 'k' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 352, name: 'l' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 384, name: 'm' }, - { clubLevel: HabboClubLevelEnum.NO_CLUB, tileSize: 372, name: 'n' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 80, name: 'g' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 74, name: 'h' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 416, name: 'o' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 352, name: 'p' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 304, name: 'q' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 336, name: 'r' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 748, name: 'u' }, - { clubLevel: HabboClubLevelEnum.CLUB, tileSize: 438, name: 'v' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 540, name: 't' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 512, name: 'w' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 396, name: 'x' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 440, name: 'y' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 456, name: 'z' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 208, name: '0' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 1009, name: '1' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 1044, name: '2' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 183, name: '3' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 254, name: '4' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 1024, name: '5' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 801, name: '6' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 354, name: '7' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 888, name: '8' }, - { clubLevel: HabboClubLevelEnum.VIP, tileSize: 926, name: '9' } -]; diff --git a/src/api/navigator/index.ts b/src/api/navigator/index.ts index ade27895..77b0a417 100644 --- a/src/api/navigator/index.ts +++ b/src/api/navigator/index.ts @@ -3,10 +3,10 @@ export * from './INavigatorData'; export * from './INavigatorSearchFilter'; export * from './IRoomChatSettings'; export * from './IRoomData'; +export * from './IRoomModel'; export * from './IRoomModerationSettings'; export * from './NavigatorSearchResultViewDisplayMode'; export * from './RoomInfoData'; -export * from './RoomModels'; export * from './RoomSettingsData'; export * from './RoomSettingsUtils'; export * from './SearchFilterOptions'; diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx index 97b979c0..94610125 100644 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -1,7 +1,7 @@ /* eslint-disable no-template-curly-in-string */ import { HabboClubLevelEnum, RoomCreateComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; -import { GetClubMemberLevel, GetConfiguration, IRoomModel, LocalizeText, RoomModels, SendMessageComposer } from '../../../api'; +import { GetClubMemberLevel, GetConfiguration, IRoomModel, LocalizeText, SendMessageComposer } from '../../../api'; import { Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, Text } from '../../../common'; import { useNavigatorContext } from '../NavigatorContext'; @@ -13,7 +13,8 @@ export const NavigatorRoomCreatorView: FC<{}> = props => const [ category, setCategory ] = useState(null); const [ visitorsCount, setVisitorsCount ] = useState(null); const [ tradesSetting, setTradesSetting ] = useState(0); - const [ selectedModelName, setSelectedModelName ] = useState(RoomModels[0].name); + const [ roomModels, setRoomModels ] = useState([]); + const [ selectedModelName, setSelectedModelName ] = useState(''); const { categories = null } = useNavigatorContext(); const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; @@ -22,13 +23,13 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { if(!model || (model.clubLevel > GetClubMemberLevel())) return; - setSelectedModelName(RoomModels[index].name); - } + setSelectedModelName(roomModels[index].name); + }; const createRoom = () => { SendMessageComposer(new RoomCreateComposer(name, description, 'model_' + selectedModelName, Number(category), Number(visitorsCount), tradesSetting)); - } + }; useEffect(() => { @@ -48,6 +49,17 @@ export const NavigatorRoomCreatorView: FC<{}> = props => if(categories && categories.length) setCategory(categories[0].id); }, [ categories ]); + useEffect(() => + { + const models = GetConfiguration('navigator.room.models'); + + if(models && models.length) + { + setRoomModels(models); + setSelectedModelName(models[0].name); + } + }, []); + return ( @@ -89,7 +101,7 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { - RoomModels.map((model, index )=> + roomModels.map((model, index )=> { return ( selectModel(model, index) } itemActive={ (selectedModelName === model.name) } overflow="unset" gap={ 0 } className="p-1" disabled={ (GetClubMemberLevel() < model.clubLevel) }> From 1b30b6b507bdb62ae294b6b3dba7a551cec7e3b9 Mon Sep 17 00:00:00 2001 From: MyNameIsBatman Date: Wed, 20 Apr 2022 10:45:01 -0300 Subject: [PATCH 249/331] HC Disabled config in AvatarEditor and Navigator --- .../views/figure-set/AvatarEditorFigureSetItemView.tsx | 5 ++++- .../views/palette-set/AvatarEditorPaletteSetItemView.tsx | 5 ++++- .../views/wardrobe/AvatarEditorWardrobeView.tsx | 8 +++++--- .../navigator/views/NavigatorRoomCreatorView.tsx | 4 +++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx index 12d9c153..9bc42217 100644 --- a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx +++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx @@ -1,4 +1,5 @@ import { FC, useCallback, useEffect, useState } from 'react'; +import { GetConfiguration } from '../../../../api'; import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; import { AvatarEditorGridPartItem } from '../../common/AvatarEditorGridPartItem'; import { AvatarEditorIcon } from '../AvatarEditorIcon'; @@ -13,6 +14,8 @@ export const AvatarEditorFigureSetItemView: FC('hc.disabled', false); + const rerender = useCallback(() => { setUpdateId(prevValue => (prevValue + 1)); @@ -30,7 +33,7 @@ export const AvatarEditorFigureSetItemView: FC - { partItem.isHC && } + { !hcDisabled && partItem.isHC && } { partItem.isClear && } { partItem.isSellable && } { children } diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx index 94ebb40c..2933c244 100644 --- a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx +++ b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx @@ -1,4 +1,5 @@ import { FC, useCallback, useEffect, useState } from 'react'; +import { GetConfiguration } from '../../../../api'; import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common'; import { AvatarEditorGridColorItem } from '../../common/AvatarEditorGridColorItem'; @@ -12,6 +13,8 @@ export const AvatarEditorPaletteSetItem: FC = p const { colorItem = null, children = null, ...rest } = props; const [ updateId, setUpdateId ] = useState(-1); + const hcDisabled = GetConfiguration('hc.disabled', false); + const rerender = useCallback(() => { setUpdateId(prevValue => (prevValue + 1)); @@ -26,7 +29,7 @@ export const AvatarEditorPaletteSetItem: FC = p return ( - { colorItem.isHC && } + { !hcDisabled && colorItem.isHC && } { children } ); diff --git a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx index 96252ff4..6efea5ed 100644 --- a/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx +++ b/src/components/avatar-editor/views/wardrobe/AvatarEditorWardrobeView.tsx @@ -1,6 +1,6 @@ import { IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react'; -import { GetAvatarRenderManager, GetClubMemberLevel, LocalizeText, SendMessageComposer } from '../../../../api'; +import { GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../../api'; import { AutoGrid, Base, Button, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, LayoutGridItem } from '../../../../common'; import { FigureData } from '../../common/FigureData'; @@ -16,6 +16,8 @@ export const AvatarEditorWardrobeView: FC = props { const { figureData = null, savedFigures = [], setSavedFigures = null, loadAvatarInEditor = null } = props; + const hcDisabled = GetConfiguration('hc.disabled', false); + const wearFigureAtIndex = useCallback((index: number) => { if((index >= savedFigures.length) || (index < 0)) return; @@ -57,7 +59,7 @@ export const AvatarEditorWardrobeView: FC = props { figureContainer && } - { (clubLevel > 0) && } + { !hcDisabled && (clubLevel > 0) && } { figureContainer && @@ -68,7 +70,7 @@ export const AvatarEditorWardrobeView: FC = props }); return items; - }, [ savedFigures, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); + }, [ savedFigures, hcDisabled, saveFigureAtWardrobeIndex, wearFigureAtIndex ]); return ( diff --git a/src/components/navigator/views/NavigatorRoomCreatorView.tsx b/src/components/navigator/views/NavigatorRoomCreatorView.tsx index 94610125..90ac95b2 100644 --- a/src/components/navigator/views/NavigatorRoomCreatorView.tsx +++ b/src/components/navigator/views/NavigatorRoomCreatorView.tsx @@ -17,6 +17,8 @@ export const NavigatorRoomCreatorView: FC<{}> = props => const [ selectedModelName, setSelectedModelName ] = useState(''); const { categories = null } = useNavigatorContext(); + const hcDisabled = GetConfiguration('hc.disabled', false); + const getRoomModelImage = (name: string) => GetConfiguration('images.url') + `/navigator/models/model_${ name }.png`; const selectModel = (model: IRoomModel, index: number) => @@ -108,7 +110,7 @@ export const NavigatorRoomCreatorView: FC<{}> = props => { model.tileSize } { LocalizeText('navigator.createroom.tilesize') } - { model.clubLevel > HabboClubLevelEnum.NO_CLUB && } + { !hcDisabled && model.clubLevel > HabboClubLevelEnum.NO_CLUB && } ); }) } From 560a520e75d1789951ab5f49523dd822b5197d16 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 11:43:44 -0400 Subject: [PATCH 250/331] Update catalog state --- .../catalog/BuilderFurniPlaceableStatus.ts | 10 + .../common => api/catalog}/CatalogNode.ts | 0 .../common => api/catalog}/CatalogPage.ts | 0 .../common => api/catalog}/CatalogPageName.ts | 0 .../catalog}/CatalogPetPalette.ts | 0 .../catalog}/CatalogPurchaseState.ts | 0 .../common => api/catalog}/CatalogType.ts | 0 .../catalog}/CatalogUtilities.ts | 2 +- .../common => api/catalog}/FurnitureOffer.ts | 2 +- .../catalog}/GiftWrappingConfiguration.ts | 0 .../common => api/catalog}/ICatalogNode.ts | 0 .../common => api/catalog}/ICatalogOptions.ts | 0 .../common => api/catalog}/ICatalogPage.ts | 0 .../catalog}/IPageLocalization.ts | 0 .../common => api/catalog}/IProduct.ts | 0 .../catalog}/IPurchasableOffer.ts | 0 .../catalog}/IPurchaseOptions.ts | 0 .../catalog/common => api/catalog}/Offer.ts | 2 +- .../catalog}/PageLocalization.ts | 2 +- src/api/catalog/PlacedObjectPurchaseData.ts | 41 ++ .../catalog/common => api/catalog}/Product.ts | 3 +- .../common => api/catalog}/RequestedPage.ts | 0 .../common => api/catalog}/SearchResult.ts | 0 src/api/catalog/index.ts | 23 + src/api/inventory/FurnitureItem.ts | 12 +- src/api/inventory/IFurnitureItem.ts | 2 +- src/api/utils/LocalStorageKeys.ts | 5 + src/api/utils/index.ts | 1 + src/components/catalog/CatalogContext.tsx | 83 --- .../catalog/CatalogMessageHandler.tsx | 291 --------- src/components/catalog/CatalogView.tsx | 433 ++----------- .../catalog/common/AttemptCatalogPlacement.ts | 29 - .../catalog/common/FurniCategory.ts | 26 - src/components/catalog/common/IPurse.ts | 14 - .../catalog/common/IsCatalogOfferDraggable.ts | 7 - src/components/catalog/common/Purse.ts | 144 ----- .../catalog/common/SubscriptionInfo.ts | 18 - .../views/CatalogPurchaseConfirmView.tsx | 10 + .../catalog/views/gift/CatalogGiftView.tsx | 5 +- .../navigation/CatalogNavigationItemView.tsx | 9 +- .../navigation/CatalogNavigationSetView.tsx | 2 +- .../navigation/CatalogNavigationView.tsx | 9 +- .../page/common/CatalogGridOfferView.tsx | 34 +- .../views/page/common/CatalogSearchView.tsx | 18 +- .../views/page/layout/CatalogLayout.types.ts | 2 +- .../layout/CatalogLayoutBadgeDisplayView.tsx | 4 +- .../page/layout/CatalogLayoutDefaultView.tsx | 4 +- .../CatalogLayoutGuildCustomFurniView.tsx | 10 +- .../layout/CatalogLayoutGuildForumView.tsx | 4 +- .../page/layout/CatalogLayoutSpacesView.tsx | 10 +- .../page/layout/CatalogLayoutTrophiesView.tsx | 9 +- .../page/layout/CatalogLayoutVipBuyView.tsx | 8 +- .../views/page/layout/GetCatalogLayout.tsx | 2 +- .../CatalogLayoutFrontpage4View.tsx | 7 +- .../marketplace/MarketplacePostOfferView.tsx | 5 +- .../pets/CatalogLayoutPetPurchaseView.tsx | 4 +- .../page/layout/pets/CatalogLayoutPetView.tsx | 8 +- .../vip-gifts/CatalogLayoutVipGiftsView.tsx | 5 +- .../widgets/CatalogAddOnBadgeWidgetView.tsx | 4 +- .../CatalogBadgeSelectorWidgetView.tsx | 5 +- .../widgets/CatalogBundleGridWidgetView.tsx | 7 +- .../CatalogFirstProductSelectorWidgetView.tsx | 4 +- .../widgets/CatalogGuildBadgeWidgetView.tsx | 4 +- .../CatalogGuildSelectorWidgetView.tsx | 4 +- .../widgets/CatalogItemGridWidgetView.tsx | 9 +- .../widgets/CatalogLimitedItemWidgetView.tsx | 6 +- .../widgets/CatalogPriceDisplayWidgetView.tsx | 6 +- .../widgets/CatalogPurchaseWidgetView.tsx | 22 +- .../widgets/CatalogSimplePriceWidgetView.tsx | 6 +- .../page/widgets/CatalogSpacesWidgetView.tsx | 39 +- .../page/widgets/CatalogSpinnerWidgetView.tsx | 7 +- .../page/widgets/CatalogTotalPriceWidget.tsx | 6 +- .../widgets/CatalogViewProductWidgetView.tsx | 8 +- .../groups/views/GroupInformationView.tsx | 3 +- .../user-settings/UserSettingsView.tsx | 12 +- .../catalog/CatalogInitPurchaseEvent.ts | 26 - src/events/catalog/CatalogWidgetEvent.ts | 1 - .../catalog/SetRoomPreviewerStuffDataEvent.ts | 2 +- src/events/catalog/index.ts | 1 - src/events/index.ts | 1 + .../inventory/InventoryFurniAddedEvent.ts | 14 + src/events/inventory/index.ts | 1 + src/hooks/catalog/index.ts | 5 + src/hooks/catalog/useCatalog.ts | 611 ++++++++++++++++++ src/hooks/catalog/useCatalogBuildersClub.ts | 54 ++ src/hooks/catalog/useCatalogItemMover.ts | 321 +++++++++ .../catalog/useCatalogPlaceMultipleItems.ts | 7 + .../useCatalogSkipPurchaseConfirmation.ts | 7 + src/hooks/index.ts | 2 + src/hooks/inventory/useInventoryFurni.ts | 6 + src/hooks/useLocalStorage.ts | 43 ++ 91 files changed, 1371 insertions(+), 1202 deletions(-) create mode 100644 src/api/catalog/BuilderFurniPlaceableStatus.ts rename src/{components/catalog/common => api/catalog}/CatalogNode.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogPage.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogPageName.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogPetPalette.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogPurchaseState.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogType.ts (100%) rename src/{components/catalog/common => api/catalog}/CatalogUtilities.ts (99%) rename src/{components/catalog/common => api/catalog}/FurnitureOffer.ts (99%) rename src/{components/catalog/common => api/catalog}/GiftWrappingConfiguration.ts (100%) rename src/{components/catalog/common => api/catalog}/ICatalogNode.ts (100%) rename src/{components/catalog/common => api/catalog}/ICatalogOptions.ts (100%) rename src/{components/catalog/common => api/catalog}/ICatalogPage.ts (100%) rename src/{components/catalog/common => api/catalog}/IPageLocalization.ts (100%) rename src/{components/catalog/common => api/catalog}/IProduct.ts (100%) rename src/{components/catalog/common => api/catalog}/IPurchasableOffer.ts (100%) rename src/{components/catalog/common => api/catalog}/IPurchaseOptions.ts (100%) rename src/{components/catalog/common => api/catalog}/Offer.ts (99%) rename src/{components/catalog/common => api/catalog}/PageLocalization.ts (94%) create mode 100644 src/api/catalog/PlacedObjectPurchaseData.ts rename src/{components/catalog/common => api/catalog}/Product.ts (97%) rename src/{components/catalog/common => api/catalog}/RequestedPage.ts (100%) rename src/{components/catalog/common => api/catalog}/SearchResult.ts (100%) create mode 100644 src/api/utils/LocalStorageKeys.ts delete mode 100644 src/components/catalog/CatalogContext.tsx delete mode 100644 src/components/catalog/CatalogMessageHandler.tsx delete mode 100644 src/components/catalog/common/AttemptCatalogPlacement.ts delete mode 100644 src/components/catalog/common/FurniCategory.ts delete mode 100644 src/components/catalog/common/IPurse.ts delete mode 100644 src/components/catalog/common/IsCatalogOfferDraggable.ts delete mode 100644 src/components/catalog/common/Purse.ts delete mode 100644 src/components/catalog/common/SubscriptionInfo.ts create mode 100644 src/components/catalog/views/CatalogPurchaseConfirmView.tsx delete mode 100644 src/events/catalog/CatalogInitPurchaseEvent.ts create mode 100644 src/events/inventory/InventoryFurniAddedEvent.ts create mode 100644 src/events/inventory/index.ts create mode 100644 src/hooks/catalog/index.ts create mode 100644 src/hooks/catalog/useCatalog.ts create mode 100644 src/hooks/catalog/useCatalogBuildersClub.ts create mode 100644 src/hooks/catalog/useCatalogItemMover.ts create mode 100644 src/hooks/catalog/useCatalogPlaceMultipleItems.ts create mode 100644 src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts create mode 100644 src/hooks/useLocalStorage.ts diff --git a/src/api/catalog/BuilderFurniPlaceableStatus.ts b/src/api/catalog/BuilderFurniPlaceableStatus.ts new file mode 100644 index 00000000..40eb6f65 --- /dev/null +++ b/src/api/catalog/BuilderFurniPlaceableStatus.ts @@ -0,0 +1,10 @@ +export class BuilderFurniPlaceableStatus +{ + public static OKAY: number = 0; + public static MISSING_OFFER: number = 1; + public static FURNI_LIMIT_REACHED: number = 2; + public static NOT_IN_ROOM: number = 3; + public static NOT_ROOM_OWNER: number = 4; + public static GUILD_ROOM: number = 5; + public static VISITORS_IN_ROOM: number = 6; +} diff --git a/src/components/catalog/common/CatalogNode.ts b/src/api/catalog/CatalogNode.ts similarity index 100% rename from src/components/catalog/common/CatalogNode.ts rename to src/api/catalog/CatalogNode.ts diff --git a/src/components/catalog/common/CatalogPage.ts b/src/api/catalog/CatalogPage.ts similarity index 100% rename from src/components/catalog/common/CatalogPage.ts rename to src/api/catalog/CatalogPage.ts diff --git a/src/components/catalog/common/CatalogPageName.ts b/src/api/catalog/CatalogPageName.ts similarity index 100% rename from src/components/catalog/common/CatalogPageName.ts rename to src/api/catalog/CatalogPageName.ts diff --git a/src/components/catalog/common/CatalogPetPalette.ts b/src/api/catalog/CatalogPetPalette.ts similarity index 100% rename from src/components/catalog/common/CatalogPetPalette.ts rename to src/api/catalog/CatalogPetPalette.ts diff --git a/src/components/catalog/common/CatalogPurchaseState.ts b/src/api/catalog/CatalogPurchaseState.ts similarity index 100% rename from src/components/catalog/common/CatalogPurchaseState.ts rename to src/api/catalog/CatalogPurchaseState.ts diff --git a/src/components/catalog/common/CatalogType.ts b/src/api/catalog/CatalogType.ts similarity index 100% rename from src/components/catalog/common/CatalogType.ts rename to src/api/catalog/CatalogType.ts diff --git a/src/components/catalog/common/CatalogUtilities.ts b/src/api/catalog/CatalogUtilities.ts similarity index 99% rename from src/components/catalog/common/CatalogUtilities.ts rename to src/api/catalog/CatalogUtilities.ts index 54319610..5ca8fed5 100644 --- a/src/components/catalog/common/CatalogUtilities.ts +++ b/src/api/catalog/CatalogUtilities.ts @@ -1,5 +1,5 @@ import { SellablePetPaletteData } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../../../api'; +import { GetRoomEngine } from '../nitro'; import { ICatalogNode } from './ICatalogNode'; export const GetPixelEffectIcon = (id: number) => diff --git a/src/components/catalog/common/FurnitureOffer.ts b/src/api/catalog/FurnitureOffer.ts similarity index 99% rename from src/components/catalog/common/FurnitureOffer.ts rename to src/api/catalog/FurnitureOffer.ts index b25c376f..4c9c9f94 100644 --- a/src/components/catalog/common/FurnitureOffer.ts +++ b/src/api/catalog/FurnitureOffer.ts @@ -1,5 +1,5 @@ import { GetProductOfferComposer, IFurnitureData } from '@nitrots/nitro-renderer'; -import { GetProductDataForLocalization, SendMessageComposer } from '../../../api'; +import { GetProductDataForLocalization, SendMessageComposer } from '..'; import { ICatalogPage } from './ICatalogPage'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; diff --git a/src/components/catalog/common/GiftWrappingConfiguration.ts b/src/api/catalog/GiftWrappingConfiguration.ts similarity index 100% rename from src/components/catalog/common/GiftWrappingConfiguration.ts rename to src/api/catalog/GiftWrappingConfiguration.ts diff --git a/src/components/catalog/common/ICatalogNode.ts b/src/api/catalog/ICatalogNode.ts similarity index 100% rename from src/components/catalog/common/ICatalogNode.ts rename to src/api/catalog/ICatalogNode.ts diff --git a/src/components/catalog/common/ICatalogOptions.ts b/src/api/catalog/ICatalogOptions.ts similarity index 100% rename from src/components/catalog/common/ICatalogOptions.ts rename to src/api/catalog/ICatalogOptions.ts diff --git a/src/components/catalog/common/ICatalogPage.ts b/src/api/catalog/ICatalogPage.ts similarity index 100% rename from src/components/catalog/common/ICatalogPage.ts rename to src/api/catalog/ICatalogPage.ts diff --git a/src/components/catalog/common/IPageLocalization.ts b/src/api/catalog/IPageLocalization.ts similarity index 100% rename from src/components/catalog/common/IPageLocalization.ts rename to src/api/catalog/IPageLocalization.ts diff --git a/src/components/catalog/common/IProduct.ts b/src/api/catalog/IProduct.ts similarity index 100% rename from src/components/catalog/common/IProduct.ts rename to src/api/catalog/IProduct.ts diff --git a/src/components/catalog/common/IPurchasableOffer.ts b/src/api/catalog/IPurchasableOffer.ts similarity index 100% rename from src/components/catalog/common/IPurchasableOffer.ts rename to src/api/catalog/IPurchasableOffer.ts diff --git a/src/components/catalog/common/IPurchaseOptions.ts b/src/api/catalog/IPurchaseOptions.ts similarity index 100% rename from src/components/catalog/common/IPurchaseOptions.ts rename to src/api/catalog/IPurchaseOptions.ts diff --git a/src/components/catalog/common/Offer.ts b/src/api/catalog/Offer.ts similarity index 99% rename from src/components/catalog/common/Offer.ts rename to src/api/catalog/Offer.ts index 4b6f4f4e..c14d6ac1 100644 --- a/src/components/catalog/common/Offer.ts +++ b/src/api/catalog/Offer.ts @@ -1,4 +1,4 @@ -import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '../../../api'; +import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '..'; import { ICatalogPage } from './ICatalogPage'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; diff --git a/src/components/catalog/common/PageLocalization.ts b/src/api/catalog/PageLocalization.ts similarity index 94% rename from src/components/catalog/common/PageLocalization.ts rename to src/api/catalog/PageLocalization.ts index 6a51830d..91e3ce6f 100644 --- a/src/components/catalog/common/PageLocalization.ts +++ b/src/api/catalog/PageLocalization.ts @@ -1,4 +1,4 @@ -import { GetConfiguration } from '../../../api'; +import { GetConfiguration } from '../nitro'; import { IPageLocalization } from './IPageLocalization'; export class PageLocalization implements IPageLocalization diff --git a/src/api/catalog/PlacedObjectPurchaseData.ts b/src/api/catalog/PlacedObjectPurchaseData.ts new file mode 100644 index 00000000..84bad8cd --- /dev/null +++ b/src/api/catalog/PlacedObjectPurchaseData.ts @@ -0,0 +1,41 @@ +import { IFurnitureData, IProductData } from '@nitrots/nitro-renderer'; +import { IPurchasableOffer } from './IPurchasableOffer'; + +export class PlacedObjectPurchaseData +{ + constructor( + public readonly roomId: number, + public readonly objectId: number, + public readonly category: number, + public readonly wallLocation: string, + public readonly x: number, + public readonly y: number, + public readonly direction: number, + public readonly offer: IPurchasableOffer) + {} + + public get offerId(): number + { + return this.offer.offerId; + } + + public get productClassId(): number + { + return this.offer.product.productClassId; + } + + public get productData(): IProductData + { + return this.offer.product.productData; + } + + public get furniData(): IFurnitureData + { + return this.offer.product.furnitureData; + } + + public get extraParam(): string + { + return this.offer.product.extraParam; + } +} diff --git a/src/components/catalog/common/Product.ts b/src/api/catalog/Product.ts similarity index 97% rename from src/components/catalog/common/Product.ts rename to src/api/catalog/Product.ts index 52c7136c..bfb760fc 100644 --- a/src/components/catalog/common/Product.ts +++ b/src/api/catalog/Product.ts @@ -1,8 +1,9 @@ import { IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer'; -import { GetConfiguration, GetRoomEngine, GetSessionDataManager, ProductTypeEnum } from '../../../api'; +import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../nitro'; import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities'; import { IProduct } from './IProduct'; import { IPurchasableOffer } from './IPurchasableOffer'; +import { ProductTypeEnum } from './ProductTypeEnum'; export class Product implements IProduct { diff --git a/src/components/catalog/common/RequestedPage.ts b/src/api/catalog/RequestedPage.ts similarity index 100% rename from src/components/catalog/common/RequestedPage.ts rename to src/api/catalog/RequestedPage.ts diff --git a/src/components/catalog/common/SearchResult.ts b/src/api/catalog/SearchResult.ts similarity index 100% rename from src/components/catalog/common/SearchResult.ts rename to src/api/catalog/SearchResult.ts diff --git a/src/api/catalog/index.ts b/src/api/catalog/index.ts index 9b5a552f..ba084bc8 100644 --- a/src/api/catalog/index.ts +++ b/src/api/catalog/index.ts @@ -1 +1,24 @@ +export * from './BuilderFurniPlaceableStatus'; +export * from './CatalogNode'; +export * from './CatalogPage'; +export * from './CatalogPageName'; +export * from './CatalogPetPalette'; +export * from './CatalogPurchaseState'; +export * from './CatalogType'; +export * from './CatalogUtilities'; +export * from './FurnitureOffer'; +export * from './GiftWrappingConfiguration'; +export * from './ICatalogNode'; +export * from './ICatalogOptions'; +export * from './ICatalogPage'; +export * from './IPageLocalization'; +export * from './IProduct'; +export * from './IPurchasableOffer'; +export * from './IPurchaseOptions'; +export * from './Offer'; +export * from './PageLocalization'; +export * from './PlacedObjectPurchaseData'; +export * from './Product'; export * from './ProductTypeEnum'; +export * from './RequestedPage'; +export * from './SearchResult'; diff --git a/src/api/inventory/FurnitureItem.ts b/src/api/inventory/FurnitureItem.ts index 4d84cab9..dc055010 100644 --- a/src/api/inventory/FurnitureItem.ts +++ b/src/api/inventory/FurnitureItem.ts @@ -95,7 +95,7 @@ export class FurnitureItem implements IFurnitureItem return this._extra; } - public get _Str_16260(): boolean + public get recyclable(): boolean { return this._recyclable; } @@ -135,17 +135,17 @@ export class FurnitureItem implements IFurnitureItem return time; } - public get _Str_8932(): number + public get creationDay(): number { return this._creationDay; } - public get _Str_9050(): number + public get creationMonth(): number { return this._creationMonth; } - public get _Str_9408(): number + public get creationYear(): number { return this._creationYear; } @@ -155,7 +155,7 @@ export class FurnitureItem implements IFurnitureItem return this._slotId; } - public get _Str_3951(): number + public get songId(): number { return this._songId; } @@ -185,7 +185,7 @@ export class FurnitureItem implements IFurnitureItem return this._hasRentPeriodStarted; } - public get _Str_10616(): number + public get expirationTimeStamp(): number { return this._expirationTimeStamp; } diff --git a/src/api/inventory/IFurnitureItem.ts b/src/api/inventory/IFurnitureItem.ts index 7e030c52..435597d2 100644 --- a/src/api/inventory/IFurnitureItem.ts +++ b/src/api/inventory/IFurnitureItem.ts @@ -8,7 +8,7 @@ export interface IFurnitureItem stuffData: IObjectData; extra: number; category: number; - _Str_16260: boolean; + recyclable: boolean; isTradable: boolean; isGroupable: boolean; sellable: boolean; diff --git a/src/api/utils/LocalStorageKeys.ts b/src/api/utils/LocalStorageKeys.ts new file mode 100644 index 00000000..6c922790 --- /dev/null +++ b/src/api/utils/LocalStorageKeys.ts @@ -0,0 +1,5 @@ +export class LocalStorageKeys +{ + public static CATALOG_PLACE_MULTIPLE_OBJECTS: string = 'catalogPlaceMultipleObjects'; + public static CATALOG_SKIP_PURCHASE_CONFIRMATION: string = 'catalogSkipPurchaseConfirmation'; +} diff --git a/src/api/utils/index.ts b/src/api/utils/index.ts index 0b5596ee..eeb74fce 100644 --- a/src/api/utils/index.ts +++ b/src/api/utils/index.ts @@ -5,6 +5,7 @@ export * from './LocalizeBageName'; export * from './LocalizeFormattedNumber'; export * from './LocalizeShortNumber'; export * from './LocalizeText'; +export * from './LocalStorageKeys'; export * from './PlaySound'; export * from './ProductImageUtility'; export * from './Randomizer'; diff --git a/src/components/catalog/CatalogContext.tsx b/src/components/catalog/CatalogContext.tsx deleted file mode 100644 index 6d6f9492..00000000 --- a/src/components/catalog/CatalogContext.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { FrontPageItem, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react'; -import { ICatalogNode } from './common/ICatalogNode'; -import { ICatalogOptions } from './common/ICatalogOptions'; -import { ICatalogPage } from './common/ICatalogPage'; -import { IPageLocalization } from './common/IPageLocalization'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { IPurchaseOptions } from './common/IPurchaseOptions'; -import { SearchResult } from './common/SearchResult'; - -interface ICatalogContext -{ - isVisible: boolean; - isBusy: boolean; - setIsBusy: Dispatch>; - pageId: number; - currentType: string; - setCurrentType: Dispatch>; - rootNode: ICatalogNode; - setRootNode: Dispatch>; - offersToNodes: Map; - setOffersToNodes: Dispatch>>; - currentPage: ICatalogPage; - setCurrentPage: Dispatch>; - currentOffer: IPurchasableOffer; - setCurrentOffer: Dispatch>; - activeNodes: ICatalogNode[]; - setActiveNodes: Dispatch>; - searchResult: SearchResult; - setSearchResult: Dispatch>; - frontPageItems: FrontPageItem[]; - setFrontPageItems: Dispatch>; - roomPreviewer: RoomPreviewer; - purchaseOptions: IPurchaseOptions; - setPurchaseOptions: Dispatch>; - catalogOptions: ICatalogOptions; - setCatalogOptions: Dispatch>; - resetState: () => void; - getNodesByOfferId: (offerId: number, flag?: boolean) => ICatalogNode[]; - loadCatalogPage: (pageId: number, offerId: number) => void; - showCatalogPage: (pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => void; - activateNode: (targetNode: ICatalogNode) => void; -} - -const CatalogContext = createContext({ - isVisible: null, - isBusy: null, - setIsBusy: null, - pageId: null, - currentType: null, - setCurrentType: null, - rootNode: null, - setRootNode: null, - offersToNodes: null, - setOffersToNodes: null, - currentPage: null, - setCurrentPage: null, - currentOffer: null, - setCurrentOffer: null, - activeNodes: null, - setActiveNodes: null, - searchResult: null, - setSearchResult: null, - frontPageItems: null, - setFrontPageItems: null, - roomPreviewer: null, - purchaseOptions: null, - setPurchaseOptions: null, - catalogOptions: null, - setCatalogOptions: null, - resetState: null, - getNodesByOfferId: null, - loadCatalogPage: null, - showCatalogPage: null, - activateNode: null -}); - -export const CatalogContextProvider: FC> = props => -{ - return { props.children } -} - -export const useCatalogContext = () => useContext(CatalogContext); diff --git a/src/components/catalog/CatalogMessageHandler.tsx b/src/components/catalog/CatalogMessageHandler.tsx deleted file mode 100644 index b1a53941..00000000 --- a/src/components/catalog/CatalogMessageHandler.tsx +++ /dev/null @@ -1,291 +0,0 @@ -import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, ClubGiftInfoEvent, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, SellablePetPalettesMessageEvent } from '@nitrots/nitro-renderer'; -import { GuildMembershipsMessageEvent } from '@nitrots/nitro-renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent'; -import { FC, useCallback } from 'react'; -import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, NotificationAlertType, NotificationUtilities, ProductTypeEnum } from '../../api'; -import { CatalogGiftReceiverNotFoundEvent, CatalogNameResultEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent } from '../../events'; -import { DispatchUiEvent, UseMessageEventHook } from '../../hooks'; -import { useCatalogContext } from './CatalogContext'; -import { CatalogNode } from './common/CatalogNode'; -import { CatalogPetPalette } from './common/CatalogPetPalette'; -import { CatalogType } from './common/CatalogType'; -import { GiftWrappingConfiguration } from './common/GiftWrappingConfiguration'; -import { ICatalogNode } from './common/ICatalogNode'; -import { IProduct } from './common/IProduct'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { Offer } from './common/Offer'; -import { PageLocalization } from './common/PageLocalization'; -import { Product } from './common/Product'; - -export const CatalogMessageHandler: FC<{}> = props => -{ - const { setIsBusy, pageId, currentType, setRootNode, setOffersToNodes, currentPage, setCurrentOffer, setFrontPageItems, resetState, showCatalogPage, setCatalogOptions, setPurchaseOptions } = useCatalogContext(); - - const onCatalogPagesListEvent = useCallback((event: CatalogPagesListEvent) => - { - const parser = event.getParser(); - const offers: Map = new Map(); - - const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) => - { - const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode); - - for(const offerId of catalogNode.offerIds) - { - if(offers.has(offerId)) offers.get(offerId).push(catalogNode); - else offers.set(offerId, [ catalogNode ]); - } - - depth++; - - for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); - - return catalogNode; - } - - setRootNode(getCatalogNode(parser.root, 0, null)); - setOffersToNodes(offers); - }, [ setRootNode, setOffersToNodes ]); - - const onCatalogPageMessageEvent = useCallback((event: CatalogPageMessageEvent) => - { - const parser = event.getParser(); - - if(parser.catalogType !== currentType) return; - - const purchasableOffers: IPurchasableOffer[] = []; - - for(const offer of parser.offers) - { - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offer.localizationId); - - for(const product of offer.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - if(!products.length) continue; - - const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed); - - if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); - } - - if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); - - setIsBusy(false); - - if(pageId === parser.pageId) - { - showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); - } - }, [ currentType, pageId, setFrontPageItems, setIsBusy, showCatalogPage ]); - - const onPurchaseOKMessageEvent = useCallback((event: PurchaseOKMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchasedEvent(parser.offer)); - }, []); - - const onPurchaseErrorMessageEvent = useCallback((event: PurchaseErrorMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code)); - }, []); - - const onPurchaseNotAllowedMessageEvent = useCallback((event: PurchaseNotAllowedMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code)); - }, []); - - const onLimitedEditionSoldOutEvent = useCallback((event: LimitedEditionSoldOutEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogPurchaseSoldOutEvent()); - }, []); - - const onProductOfferEvent = useCallback((event: ProductOfferEvent) => - { - const parser = event.getParser(); - const offerData = parser.offer; - - if(!offerData || !offerData.products.length) return; - - const offerProductData = offerData.products[0]; - - if(offerProductData.uniqueLimitedItem) - { - // update unique - } - - const products: IProduct[] = []; - const productData = GetProductDataForLocalization(offerData.localizationId); - - for(const product of offerData.products) - { - const furnitureData = GetFurnitureData(product.furniClassId, product.productType); - - products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); - } - - const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed); - - if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return; - - offer.page = currentPage; - - setCurrentOffer(offer); - - if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) - { - if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) - { - setPurchaseOptions(prevValue => - { - const newValue = { ...prevValue }; - - newValue.extraData =( offer.product.extraParam || null); - - return newValue; - }); - } - } - - // (this._isObjectMoverRequested) && (this._purchasableOffer) - }, [ currentType, currentPage, setCurrentOffer, setPurchaseOptions ]); - - const onSellablePetPalettesMessageEvent = useCallback((event: SellablePetPalettesMessageEvent) => - { - const parser = event.getParser(); - const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); - - setCatalogOptions(prevValue => - { - const petPalettes = []; - - if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); - - for(let i = 0; i < petPalettes.length; i++) - { - const palette = petPalettes[i]; - - if(palette.breed === petPalette.breed) - { - petPalettes.splice(i, 1); - - break; - } - } - - petPalettes.push(petPalette); - - return { ...prevValue, petPalettes }; - }); - }, [ setCatalogOptions ]); - - const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogNameResultEvent(parser.result, parser.validationInfo)); - }, []); - - const onGiftReceiverNotFoundEvent = useCallback(() => - { - DispatchUiEvent(new CatalogGiftReceiverNotFoundEvent()); - }, []); - - const onHabboClubOffersMessageEvent = useCallback((event: HabboClubOffersMessageEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubOffers = parser.offers; - - return { ...prevValue, clubOffers }; - }); - }, [ setCatalogOptions ]); - - const onGuildMembershipsMessageEvent = useCallback((event: GuildMembershipsMessageEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const groups = parser.groups; - - return { ...prevValue, groups }; - }); - }, [ setCatalogOptions ]); - - const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const giftConfiguration = new GiftWrappingConfiguration(parser); - - return { ...prevValue, giftConfiguration }; - }); - }, [ setCatalogOptions ]); - - const onMarketplaceMakeOfferResult = useCallback((event: MarketplaceMakeOfferResult) => - { - const parser = event.getParser(); - - if(!parser) return; - - let title = ''; - if(parser.result === 1) - { - title = LocalizeText('inventory.marketplace.result.title.success'); - } - else - { - title = LocalizeText('inventory.marketplace.result.title.failure'); - } - - const message = LocalizeText(`inventory.marketplace.result.${ parser.result }`); - - NotificationUtilities.simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); - }, []); - - const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => - { - const parser = event.getParser(); - - setCatalogOptions(prevValue => - { - const clubGifts = parser; - - return { ...prevValue, clubGifts }; - }); - }, [ setCatalogOptions ]); - - UseMessageEventHook(CatalogPagesListEvent, onCatalogPagesListEvent); - UseMessageEventHook(CatalogPageMessageEvent, onCatalogPageMessageEvent); - UseMessageEventHook(PurchaseOKMessageEvent, onPurchaseOKMessageEvent); - UseMessageEventHook(PurchaseErrorMessageEvent, onPurchaseErrorMessageEvent); - UseMessageEventHook(PurchaseNotAllowedMessageEvent, onPurchaseNotAllowedMessageEvent); - UseMessageEventHook(LimitedEditionSoldOutEvent, onLimitedEditionSoldOutEvent); - UseMessageEventHook(ProductOfferEvent, onProductOfferEvent); - UseMessageEventHook(GuildMembershipsMessageEvent, onGuildMembershipsMessageEvent); - UseMessageEventHook(SellablePetPalettesMessageEvent, onSellablePetPalettesMessageEvent); - UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); - UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); - UseMessageEventHook(HabboClubOffersMessageEvent, onHabboClubOffersMessageEvent); - UseMessageEventHook(GiftWrappingConfigurationEvent, onGiftWrappingConfigurationEvent); - UseMessageEventHook(ClubGiftInfoEvent, onClubGiftInfoEvent); - UseMessageEventHook(MarketplaceMakeOfferResult, onMarketplaceMakeOfferResult); - - return null; -} diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index c8645189..28b6e8de 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -1,406 +1,75 @@ -import { CatalogPublishedMessageEvent, FrontPageItem, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, ILinkEventTracker, RoomPreviewer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { AddEventLinkTracker, GetRoomEngine, LocalizeText, NotificationAlertType, NotificationUtilities, PlaySound, RemoveLinkEventTracker, SendMessageComposer, SoundNames } from '../../api'; +import { ILinkEventTracker } from '@nitrots/nitro-renderer'; +import { FC, useEffect } from 'react'; +import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api'; import { Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; -import { CatalogPurchasedEvent } from '../../events'; -import { UseMessageEventHook, UseUiEvent } from '../../hooks'; -import { CatalogContextProvider } from './CatalogContext'; -import { CatalogMessageHandler } from './CatalogMessageHandler'; -import { CatalogPage } from './common/CatalogPage'; -import { CatalogType } from './common/CatalogType'; -import { ICatalogNode } from './common/ICatalogNode'; -import { ICatalogOptions } from './common/ICatalogOptions'; -import { ICatalogPage } from './common/ICatalogPage'; -import { IPageLocalization } from './common/IPageLocalization'; -import { IPurchasableOffer } from './common/IPurchasableOffer'; -import { IPurchaseOptions } from './common/IPurchaseOptions'; -import { RequestedPage } from './common/RequestedPage'; -import { SearchResult } from './common/SearchResult'; +import { useCatalog } from '../../hooks'; import { CatalogGiftView } from './views/gift/CatalogGiftView'; import { CatalogNavigationView } from './views/navigation/CatalogNavigationView'; import { GetCatalogLayout } from './views/page/layout/GetCatalogLayout'; import { MarketplacePostOfferView } from './views/page/layout/marketplace/MarketplacePostOfferView'; -const REQUESTED_PAGE = new RequestedPage(); - export const CatalogView: FC<{}> = props => { - const [ isVisible, setIsVisible ] = useState(false); - const [ isBusy, setIsBusy ] = useState(false); - const [ pageId, setPageId ] = useState(-1); - const [ previousPageId, setPreviousPageId ] = useState(-1); - const [ currentType, setCurrentType ] = useState(CatalogType.NORMAL); - const [ rootNode, setRootNode ] = useState(null); - const [ offersToNodes, setOffersToNodes ] = useState>(null); - const [ currentPage, setCurrentPage ] = useState(null); - const [ currentOffer, setCurrentOffer ] = useState(null); - const [ activeNodes, setActiveNodes ] = useState([]); - const [ searchResult, setSearchResult ] = useState(null); - const [ frontPageItems, setFrontPageItems ] = useState([]); - const [ roomPreviewer, setRoomPreviewer ] = useState(null); - const [ navigationHidden, setNavigationHidden ] = useState(false); - const [ purchaseOptions, setPurchaseOptions ] = useState({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); - const [ catalogOptions, setCatalogOptions ] = useState({}); - - const resetState = useCallback(() => - { - setPageId(-1); - setPreviousPageId(-1); - setRootNode(null); - setOffersToNodes(null); - setCurrentPage(null); - setCurrentOffer(null); - setActiveNodes([]); - setSearchResult(null); - setFrontPageItems([]); - setIsVisible(false); - }, []); - - const onCatalogPublishedMessageEvent = useCallback((event: CatalogPublishedMessageEvent) => - { - const wasVisible = isVisible; - - resetState(); - - if(wasVisible) NotificationUtilities.simpleAlert(LocalizeText('catalog.alert.published.description'), NotificationAlertType.ALERT, null, null, LocalizeText('catalog.alert.published.title')); - }, [ isVisible, resetState ]); - - UseMessageEventHook(CatalogPublishedMessageEvent, onCatalogPublishedMessageEvent); - - const getNodeById = useCallback((id: number, node: ICatalogNode) => - { - if((node.pageId === id) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeById(id, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodeByName = useCallback((name: string, node: ICatalogNode) => - { - if((node.pageName === name) && (node !== rootNode)) return node; - - for(const child of node.children) - { - const found = (getNodeByName(name, child) as ICatalogNode); - - if(found) return found; - } - - return null; - }, [ rootNode ]); - - const getNodesByOfferId = useCallback((offerId: number, flag: boolean = false) => - { - if(!offersToNodes || !offersToNodes.size) return null; - - if(flag) - { - const nodes: ICatalogNode[] = []; - const offers = offersToNodes.get(offerId); - - if(offers && offers.length) for(const offer of offers) (offer.isVisible && nodes.push(offer)); - - if(nodes.length) return nodes; - } - - return offersToNodes.get(offerId); - }, [ offersToNodes ]); - - const loadCatalogPage = useCallback((pageId: number, offerId: number) => - { - if(pageId < 0) return; - - setIsBusy(true); - setPageId(pageId); - - if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); - }, [ currentType ]); - - const showCatalogPage = useCallback((pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => - { - const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); - - setCurrentPage(catalogPage); - setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); - setNavigationHidden(false); - - if((offerId > -1) && catalogPage.offers.length) - { - for(const offer of catalogPage.offers) - { - if(offer.offerId !== offerId) continue; - - setCurrentOffer(offer) - - break; - } - } - }, []); - - const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => - { - if(targetNode.parent.pageName === 'root') - { - if(targetNode.children.length) - { - for(const child of targetNode.children) - { - if(!child.isVisible) continue; - - targetNode = child; - - break; - } - } - } - - const nodes: ICatalogNode[] = []; - - let node = targetNode; - - while(node && (node.pageName !== 'root')) - { - nodes.push(node); - - node = node.parent; - } - - nodes.reverse(); - - setActiveNodes(prevValue => - { - const isActive = (prevValue.indexOf(targetNode) >= 0); - const isOpen = targetNode.isOpen; - - for(const existing of prevValue) - { - existing.deactivate(); - - if(nodes.indexOf(existing) === -1) existing.close(); - } - - for(const n of nodes) - { - n.activate(); - - if(n.parent) n.open(); - - if((n === targetNode.parent) && n.children.length) n.open(); - } - - if(isActive && isOpen) targetNode.close(); - else targetNode.open(); - - return nodes; - }); - - if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); - }, [ setActiveNodes, loadCatalogPage ]); - - const openPageById = useCallback((id: number) => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestById = id; - - setIsVisible(true); - } - else - { - const node = getNodeById(id, rootNode); - - if(node) activateNode(node); - } - }, [ isVisible, rootNode, getNodeById, activateNode ]); - - const openPageByName = useCallback((name: string) => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestByName = name; - - setIsVisible(true); - } - else - { - const node = getNodeByName(name, rootNode); - - if(node) activateNode(node); - } - }, [ isVisible, rootNode, getNodeByName, activateNode ]); - - const openPageByOfferId = useCallback((offerId: number) => - { - setSearchResult(null); - - if(!isVisible) - { - REQUESTED_PAGE.requestedByOfferId = offerId; - - setIsVisible(true); - } - else - { - const nodes = getNodesByOfferId(offerId); - - if(!nodes || !nodes.length) return; - - activateNode(nodes[0], offerId); - } - }, [ isVisible, getNodesByOfferId, activateNode ]); - - const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => - { - PlaySound(SoundNames.CREDITS); - }, []); - - UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); - - 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; - case 'open': - if(parts.length > 2) - { - if(parts.length === 4) - { - switch(parts[2]) - { - case 'offerId': - openPageByOfferId(parseInt(parts[3])); - return; - } - } - else - { - openPageByName(parts[2]); - } - } - else - { - setIsVisible(true); - } - - return; - } - }, [ openPageByOfferId, openPageByName ]); + const { isVisible = false, setIsVisible = null, rootNode = null, currentPage = null, navigationHidden = false, setNavigationHidden = null, activeNodes = [], searchResult = null, setSearchResult = null, getNodeById = null, openPageByName = null, openPageByOfferId = null, activateNode = null } = useCatalog(); useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (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; + case 'open': + if(parts.length > 2) + { + if(parts.length === 4) + { + switch(parts[2]) + { + case 'offerId': + openPageByOfferId(parseInt(parts[3])); + return; + } + } + else + { + openPageByName(parts[2]); + } + } + else + { + setIsVisible(true); + } + + return; + } + }, eventUrlPrefix: 'catalog/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); - - useEffect(() => - { - setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER)); - - return () => - { - setRoomPreviewer(prevValue => - { - prevValue.dispose(); - - return null; - }); - } - }, []); - - useEffect(() => - { - if(!isVisible || rootNode) return; - - SendMessageComposer(new GetGiftWrappingConfigurationComposer()); - SendMessageComposer(new GetClubGiftInfo()); - SendMessageComposer(new GetCatalogIndexComposer(currentType)); - }, [ isVisible, rootNode, currentType ]); - - useEffect(() => - { - if(!isVisible || !rootNode) return; - - switch(REQUESTED_PAGE.requestType) - { - case RequestedPage.REQUEST_TYPE_NONE: - if(activeNodes && activeNodes.length) return; - - if(rootNode.isBranch) - { - for(const child of rootNode.children) - { - if(child && child.isVisible) - { - activateNode(child); - - return; - } - } - } - return; - case RequestedPage.REQUEST_TYPE_ID: - openPageById(REQUESTED_PAGE.requestById); - REQUESTED_PAGE.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_OFFER: - openPageByOfferId(REQUESTED_PAGE.requestedByOfferId); - REQUESTED_PAGE.resetRequest(); - return; - case RequestedPage.REQUEST_TYPE_NAME: - openPageByName(REQUESTED_PAGE.requestByName); - REQUESTED_PAGE.resetRequest(); - return; - } - }, [ isVisible, rootNode, activeNodes, activateNode, openPageById, openPageByOfferId, openPageByName ]); - - useEffect(() => - { - if(!searchResult && currentPage && (currentPage.pageId === -1)) openPageById(previousPageId); - }, [ searchResult, currentPage, previousPageId, openPageById ]); - - useEffect(() => - { - return () => setCurrentOffer(null); - }, [ currentPage ]); + }, [ setIsVisible, openPageByOfferId, openPageByName ]); return ( - - + <> { isVisible && - - { - setIsVisible(false); - } } /> + setIsVisible(false) } /> { rootNode && (rootNode.children.length > 0) && rootNode.children.map(child => { @@ -433,6 +102,6 @@ export const CatalogView: FC<{}> = props => } - + ); } diff --git a/src/components/catalog/common/AttemptCatalogPlacement.ts b/src/components/catalog/common/AttemptCatalogPlacement.ts deleted file mode 100644 index 2eb418a3..00000000 --- a/src/components/catalog/common/AttemptCatalogPlacement.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { CatalogPageMessageOfferData, RoomObjectCategory, RoomObjectPlacementSource } from '@nitrots/nitro-renderer'; -import { GetRoomEngine, ProductTypeEnum } from '../../../api'; -import { IsCatalogOfferDraggable } from './IsCatalogOfferDraggable'; - -export const AttemptCatalogPlacement = (offer: CatalogPageMessageOfferData) => -{ - if(!IsCatalogOfferDraggable(offer)) return; - - const product = offer.products[0]; - - let category: number = -1; - - switch(product.productType) - { - case ProductTypeEnum.FLOOR: - category = RoomObjectCategory.FLOOR; - break; - case ProductTypeEnum.WALL: - category = RoomObjectCategory.WALL; - break; - } - - if(category === -1) return; - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.furniClassId, (product.extraParam) ? product.extraParam.toString() : null)) - { - - } -} diff --git a/src/components/catalog/common/FurniCategory.ts b/src/components/catalog/common/FurniCategory.ts deleted file mode 100644 index 07195cb0..00000000 --- a/src/components/catalog/common/FurniCategory.ts +++ /dev/null @@ -1,26 +0,0 @@ -export class FurniCategory -{ - public static DEFAULT: number = 1; - public static WALL_PAPER: number = 2; - public static FLOOR: number = 3; - public static LANDSCAPE: number = 4; - public static POST_IT: number = 5; - public static POSTER: number = 6; - public static SOUND_SET: number = 7; - public static TRAX_SONG: number = 8; - public static PRESENT: number = 9; - public static ECOTRON_BOX: number = 10; - public static TROPHY: number = 11; - public static CREDIT_FURNI: number = 12; - public static PET_SHAMPOO: number = 13; - public static PET_CUSTOM_PART: number = 14; - public static PET_CUSTOM_PART_SHAMPOO: number = 15; - public static PET_SADDLE: number = 16; - public static GUILD_FURNI: number = 17; - public static GAME_FURNI: number = 18; - public static MONSTERPLANT_SEED: number = 19; - public static MONSTERPLANT_REVIVAL: number = 20; - public static MONSTERPLANT_REBREED: number = 21; - public static MONSTERPLANT_FERTILIZE: number = 22; - public static FIGURE_PURCHASABLE_SET: number = 23; -} \ No newline at end of file diff --git a/src/components/catalog/common/IPurse.ts b/src/components/catalog/common/IPurse.ts deleted file mode 100644 index bd365ba6..00000000 --- a/src/components/catalog/common/IPurse.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface IPurse -{ - _Str_14389: boolean; - _Str_4458: number; - credits: number; - clubDays: number; - clubPeriods: number; - _Str_13571: boolean; - _Str_3738: boolean; - _Str_6288: number; - _Str_4605: number; - _Str_6312: number; - _Str_5590(_arg_1: number): number; -} diff --git a/src/components/catalog/common/IsCatalogOfferDraggable.ts b/src/components/catalog/common/IsCatalogOfferDraggable.ts deleted file mode 100644 index 976bd2e1..00000000 --- a/src/components/catalog/common/IsCatalogOfferDraggable.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CatalogPageMessageOfferData, RoomControllerLevel } from '@nitrots/nitro-renderer'; -import { GetRoomSession, ProductTypeEnum } from '../../../api'; - -export const IsCatalogOfferDraggable = (offer: CatalogPageMessageOfferData) => -{ - return ((GetRoomSession().isRoomOwner || (GetRoomSession().isGuildRoom && (GetRoomSession().controllerLevel >= RoomControllerLevel.GUILD_MEMBER))) && (offer.products.length === 1) && (offer.products[0].productType !== ProductTypeEnum.EFFECT) && (offer.products[0].productType !== ProductTypeEnum.HABBO_CLUB)) -} diff --git a/src/components/catalog/common/Purse.ts b/src/components/catalog/common/Purse.ts deleted file mode 100644 index eebaacf8..00000000 --- a/src/components/catalog/common/Purse.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { GetNitroInstance } from '../../../api'; -import { IPurse } from './IPurse'; - -export class Purse implements IPurse -{ - private _credits: number = 0; - private _activityPoints: Map; - private _clubDays: number = 0; - private _clubPeriods: number = 0; - private _isVIP: boolean = false; - private _pastClubDays: number = 0; - private _pastVipDays: number = 0; - private _isExpiring: boolean = false; - private _minutesUntilExpiration: number = 0; - private _minutesSinceLastModified: number; - private _lastUpdated: number; - - public get credits(): number - { - return this._credits; - } - - public set credits(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._credits = k; - } - - public get clubDays(): number - { - return this._clubDays; - } - - public set clubDays(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._clubDays = k; - } - - public get clubPeriods(): number - { - return this._clubPeriods; - } - - public set clubPeriods(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._clubPeriods = k; - } - - public get _Str_13571(): boolean - { - return (this._clubDays > 0) || (this._clubPeriods > 0); - } - - public get _Str_3738(): boolean - { - return this._isVIP; - } - - public get _Str_14389(): boolean - { - return this._isExpiring; - } - - public set _Str_14389(k: boolean) - { - this._isExpiring = k; - } - - public set _Str_3738(k: boolean) - { - this._isVIP = k; - } - - public get _Str_6288(): number - { - return this._pastClubDays; - } - - public set _Str_6288(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._pastClubDays = k; - } - - public get _Str_4605(): number - { - return this._pastVipDays; - } - - public set _Str_4605(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._pastVipDays = k; - } - - public get _Str_18527(): Map - { - return this._activityPoints; - } - - public set _Str_18527(k: Map) - { - this._lastUpdated = GetNitroInstance().time; - this._activityPoints = k; - } - - public _Str_5590(k: number): number - { - return this._activityPoints[k]; - } - - public set _Str_4458(k: number) - { - this._lastUpdated = GetNitroInstance().time; - - this._minutesUntilExpiration = k; - } - - public get _Str_4458(): number - { - const k = ((GetNitroInstance().time - this._lastUpdated) / (1000 * 60)); - const _local_2 = (this._minutesUntilExpiration - k); - - return (_local_2 > 0) ? _local_2 : 0; - } - - public set _Str_6312(k: number) - { - this._lastUpdated = GetNitroInstance().time; - this._minutesSinceLastModified = k; - } - - public get _Str_6312(): number - { - return this._minutesSinceLastModified; - } - - public get _Str_26225(): number - { - return this._lastUpdated; - } -} diff --git a/src/components/catalog/common/SubscriptionInfo.ts b/src/components/catalog/common/SubscriptionInfo.ts deleted file mode 100644 index 72d16e69..00000000 --- a/src/components/catalog/common/SubscriptionInfo.ts +++ /dev/null @@ -1,18 +0,0 @@ - -export class SubscriptionInfo -{ - private _lastUpdated: number; - - constructor( - public readonly clubDays: number = 0, - public readonly clubPeriods: number = 0, - public readonly isVip: boolean = false, - public readonly pastDays: number = 0, - public readonly pastVipDays: number = 0) - {} - - public get lastUpdated(): number - { - return this._lastUpdated; - } -} diff --git a/src/components/catalog/views/CatalogPurchaseConfirmView.tsx b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx new file mode 100644 index 00000000..30dcfc3b --- /dev/null +++ b/src/components/catalog/views/CatalogPurchaseConfirmView.tsx @@ -0,0 +1,10 @@ +import { FC } from 'react'; + +export const CatalogPurchaseConfirmView: FC<{}> = props => +{ + const {} = props; + + return ( +
    + ); +} diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index d3e94506..0180eaec 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -5,8 +5,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetSessionDataManager, LocalizeText, ProductTypeEnum, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; -import { UseUiEvent } from '../../../../hooks'; -import { useCatalogContext } from '../../CatalogContext'; +import { useCatalog, UseUiEvent } from '../../../../hooks'; export const CatalogGiftView: FC<{}> = props => { @@ -24,7 +23,7 @@ export const CatalogGiftView: FC<{}> = props => const [ maxBoxIndex, setMaxBoxIndex ] = useState(0); const [ maxRibbonIndex, setMaxRibbonIndex ] = useState(0); const [ receiverNotFound, setReceiverNotFound ] = useState(false); - const { catalogOptions = null } = useCatalogContext(); + const { catalogOptions = null } = useCatalog(); const { giftConfiguration = null } = catalogOptions; const close = useCallback(() => diff --git a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx b/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx index d3893e86..5eb1c45c 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationItemView.tsx @@ -1,9 +1,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FC } from 'react'; -import { LayoutGridItem } from '../../../../common/layout/LayoutGridItem'; -import { Text } from '../../../../common/Text'; -import { useCatalogContext } from '../../CatalogContext'; -import { ICatalogNode } from '../../common/ICatalogNode'; +import { ICatalogNode } from '../../../../api'; +import { LayoutGridItem, Text } from '../../../../common'; +import { useCatalog } from '../../../../hooks'; import { CatalogIconView } from '../catalog-icon/CatalogIconView'; import { CatalogNavigationSetView } from './CatalogNavigationSetView'; @@ -15,7 +14,7 @@ export interface CatalogNavigationItemViewProps export const CatalogNavigationItemView: FC = props => { const { node = null } = props; - const { activateNode = null } = useCatalogContext(); + const { activateNode = null } = useCatalog(); return ( <> diff --git a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx index e1553631..19f71f47 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationSetView.tsx @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { ICatalogNode } from '../../common/ICatalogNode'; +import { ICatalogNode } from '../../../../api'; import { CatalogNavigationItemView } from './CatalogNavigationItemView'; export interface CatalogNavigationSetViewProps diff --git a/src/components/catalog/views/navigation/CatalogNavigationView.tsx b/src/components/catalog/views/navigation/CatalogNavigationView.tsx index c1d187f4..3924928d 100644 --- a/src/components/catalog/views/navigation/CatalogNavigationView.tsx +++ b/src/components/catalog/views/navigation/CatalogNavigationView.tsx @@ -1,8 +1,7 @@ import { FC } from 'react'; -import { AutoGrid } from '../../../../common/AutoGrid'; -import { Column } from '../../../../common/Column'; -import { useCatalogContext } from '../../CatalogContext'; -import { ICatalogNode } from '../../common/ICatalogNode'; +import { ICatalogNode } from '../../../../api'; +import { AutoGrid, Column } from '../../../../common'; +import { useCatalog } from '../../../../hooks'; import { CatalogSearchView } from '../page/common/CatalogSearchView'; import { CatalogNavigationItemView } from './CatalogNavigationItemView'; import { CatalogNavigationSetView } from './CatalogNavigationSetView'; @@ -15,7 +14,7 @@ export interface CatalogNavigationViewProps export const CatalogNavigationView: FC = props => { const { node = null } = props; - const { searchResult = null } = useCatalogContext(); + const { searchResult = null } = useCatalog(); return ( <> diff --git a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx index fa8d3e28..79d79d38 100644 --- a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx +++ b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx @@ -1,17 +1,20 @@ -import { FC, useMemo } from 'react'; -import { ProductTypeEnum } from '../../../../../api'; +import { MouseEventType } from '@nitrots/nitro-renderer'; +import { FC, MouseEvent, useMemo, useState } from 'react'; +import { IPurchasableOffer, Offer, ProductTypeEnum } from '../../../../../api'; import { LayoutAvatarImageView, LayoutGridItem, LayoutGridItemProps } from '../../../../../common'; -import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; -import { Offer } from '../../../common/Offer'; +import { useCatalog } from '../../../../../hooks'; interface CatalogGridOfferViewProps extends LayoutGridItemProps { offer: IPurchasableOffer; + selectOffer: (offer: IPurchasableOffer) => void; } export const CatalogGridOfferView: FC = props => { - const { offer = null, ...rest } = props; + const { offer = null, selectOffer = null, itemActive = false, ...rest } = props; + const [ isMouseDown, setMouseDown ] = useState(false); + const { requestOfferToMover = null } = useCatalog(); const iconUrl = useMemo(() => { @@ -23,12 +26,31 @@ export const CatalogGridOfferView: FC = props => return offer.product.getIconUrl(offer); }, [ offer ]); + const onMouseEvent = (event: MouseEvent) => + { + switch(event.type) + { + case MouseEventType.MOUSE_DOWN: + selectOffer(offer); + setMouseDown(true); + return; + case MouseEventType.MOUSE_UP: + setMouseDown(false); + return; + case MouseEventType.ROLL_OUT: + if(!isMouseDown || !itemActive) return; + + requestOfferToMover(offer); + return; + } + } + const product = offer.product; if(!product) return null; return ( - + { (offer.product.productType === ProductTypeEnum.ROBOT) && } diff --git a/src/components/catalog/views/page/common/CatalogSearchView.tsx b/src/components/catalog/views/page/common/CatalogSearchView.tsx index 2a375fbf..bd0f0caf 100644 --- a/src/components/catalog/views/page/common/CatalogSearchView.tsx +++ b/src/components/catalog/views/page/common/CatalogSearchView.tsx @@ -1,25 +1,15 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IFurnitureData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { GetSessionDataManager, LocalizeText } from '../../../../../api'; -import { Button } from '../../../../../common/Button'; -import { Flex } from '../../../../../common/Flex'; -import { useCatalogContext } from '../../../CatalogContext'; -import { CatalogPage } from '../../../common/CatalogPage'; -import { CatalogType } from '../../../common/CatalogType'; -import { FilterCatalogNode, GetOfferNodes } from '../../../common/CatalogUtilities'; -import { FurnitureOffer } from '../../../common/FurnitureOffer'; -import { ICatalogNode } from '../../../common/ICatalogNode'; -import { ICatalogPage } from '../../../common/ICatalogPage'; -import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; -import { PageLocalization } from '../../../common/PageLocalization'; -import { SearchResult } from '../../../common/SearchResult'; +import { CatalogPage, CatalogType, FilterCatalogNode, FurnitureOffer, GetOfferNodes, GetSessionDataManager, ICatalogNode, ICatalogPage, IPurchasableOffer, LocalizeText, PageLocalization, SearchResult } from '../../../../../api'; +import { Button, Flex } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; export const CatalogSearchView: FC<{}> = props => { const [ searchValue, setSearchValue ] = useState(''); const [ needsProcessing, setNeedsProcessing ] = useState(false); - const { currentType = null, rootNode = null, setActiveNodes = null, offersToNodes = null, searchResult = null, setSearchResult = null, setCurrentPage = null } = useCatalogContext(); + const { currentType = null, rootNode = null, offersToNodes = null, searchResult = null, setSearchResult = null, setCurrentPage = null } = useCatalog(); const updateSearchValue = (value: string) => { diff --git a/src/components/catalog/views/page/layout/CatalogLayout.types.ts b/src/components/catalog/views/page/layout/CatalogLayout.types.ts index a64e9412..b05bccf9 100644 --- a/src/components/catalog/views/page/layout/CatalogLayout.types.ts +++ b/src/components/catalog/views/page/layout/CatalogLayout.types.ts @@ -1,4 +1,4 @@ -import { ICatalogPage } from '../../../common/ICatalogPage'; +import { ICatalogPage } from '../../../../../api'; export interface CatalogLayoutProps { diff --git a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx index 849fff8d..b3a619f3 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutBadgeDisplayView.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; import { CatalogBadgeSelectorWidgetView } from '../widgets/CatalogBadgeSelectorWidgetView'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; @@ -14,7 +14,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayoutBadgeDisplayView: FC = props => { const { page = null } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( <> diff --git a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx index 8aa7a913..969b536b 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; import { CatalogLimitedItemWidgetView } from '../widgets/CatalogLimitedItemWidgetView'; @@ -13,7 +13,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayoutDefaultView: FC = props => { const { page = null } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx index 9016f004..cf129517 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildCustomFurniView.tsx @@ -1,10 +1,6 @@ import { FC } from 'react'; -import { Base } from '../../../../../common/Base'; -import { Column } from '../../../../../common/Column'; -import { Flex } from '../../../../../common/Flex'; -import { Grid } from '../../../../../common/Grid'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogGuildBadgeWidgetView } from '../widgets/CatalogGuildBadgeWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; @@ -16,7 +12,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayouGuildCustomFurniView: FC = props => { const { page = null } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( diff --git a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx index 2e63e14d..b5a89ca6 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutGuildForumView.tsx @@ -2,7 +2,7 @@ import { CatalogGroupsComposer } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../../api'; import { Base, Column, Flex, Grid, Text } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; import { CatalogGuildSelectorWidgetView } from '../widgets/CatalogGuildSelectorWidgetView'; import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; @@ -13,7 +13,7 @@ export const CatalogLayouGuildForumView: FC = props => { const { page = null } = props; const [ selectedGroupIndex, setSelectedGroupIndex ] = useState(0); - const { currentOffer = null, setCurrentOffer = null, catalogOptions = null } = useCatalogContext(); + const { currentOffer = null, setCurrentOffer = null, catalogOptions = null } = useCatalog(); const { groups = null } = catalogOptions; useEffect(() => diff --git a/src/components/catalog/views/page/layout/CatalogLayoutSpacesView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutSpacesView.tsx index d83b2d8d..88cd30b6 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutSpacesView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutSpacesView.tsx @@ -1,11 +1,7 @@ import { NitroPoint } from '@nitrots/nitro-renderer'; import { FC, useEffect } from 'react'; -import { Base } from '../../../../../common/Base'; -import { Column } from '../../../../../common/Column'; -import { Flex } from '../../../../../common/Flex'; -import { Grid } from '../../../../../common/Grid'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; import { CatalogSpacesWidgetView } from '../widgets/CatalogSpacesWidgetView'; import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; @@ -15,7 +11,7 @@ import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayoutSpacesView: FC = props => { const { page = null } = props; - const { currentOffer = null, roomPreviewer = null } = useCatalogContext(); + const { currentOffer = null, roomPreviewer = null } = useCatalog(); useEffect(() => { diff --git a/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx index 1ecb9192..5db43b78 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutTrophiesView.tsx @@ -1,9 +1,6 @@ import { FC, useEffect, useState } from 'react'; -import { Column } from '../../../../../common/Column'; -import { Flex } from '../../../../../common/Flex'; -import { Grid } from '../../../../../common/Grid'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Column, Flex, Grid, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; import { CatalogPurchaseWidgetView } from '../widgets/CatalogPurchaseWidgetView'; import { CatalogTotalPriceWidget } from '../widgets/CatalogTotalPriceWidget'; @@ -14,7 +11,7 @@ export const CatalogLayoutTrophiesView: FC = props => { const { page = null } = props; const [ trophyText, setTrophyText ] = useState(''); - const { currentOffer = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, setPurchaseOptions = null } = useCatalog(); useEffect(() => { diff --git a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx index 00aaad8e..36a1a72b 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutVipBuyView.tsx @@ -1,18 +1,16 @@ import { ClubOfferData, GetClubOffersMessageComposer, PurchaseFromCatalogComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../../api'; +import { CatalogPurchaseState, LocalizeText, SendMessageComposer } from '../../../../../api'; import { AutoGrid, Button, Column, Flex, Grid, LayoutCurrencyIcon, LayoutGridItem, LayoutLoadingSpinnerView, Text } from '../../../../../common'; import { CatalogEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent } from '../../../../../events'; -import { usePurse, UseUiEvent } from '../../../../../hooks'; -import { useCatalogContext } from '../../../CatalogContext'; -import { CatalogPurchaseState } from '../../../common/CatalogPurchaseState'; +import { useCatalog, usePurse, UseUiEvent } from '../../../../../hooks'; import { CatalogLayoutProps } from './CatalogLayout.types'; export const CatalogLayoutVipBuyView: FC = props => { const [ pendingOffer, setPendingOffer ] = useState(null); const [ purchaseState, setPurchaseState ] = useState(CatalogPurchaseState.NONE); - const { currentPage = null, catalogOptions = null } = useCatalogContext(); + const { currentPage = null, catalogOptions = null } = useCatalog(); const { purse = null, getCurrencyAmount = null } = usePurse(); const { clubOffers = null } = catalogOptions; diff --git a/src/components/catalog/views/page/layout/GetCatalogLayout.tsx b/src/components/catalog/views/page/layout/GetCatalogLayout.tsx index 78674428..5748ef88 100644 --- a/src/components/catalog/views/page/layout/GetCatalogLayout.tsx +++ b/src/components/catalog/views/page/layout/GetCatalogLayout.tsx @@ -1,4 +1,4 @@ -import { ICatalogPage } from '../../../common/ICatalogPage'; +import { ICatalogPage } from '../../../../../api'; import { CatalogLayoutProps } from './CatalogLayout.types'; import { CatalogLayoutBadgeDisplayView } from './CatalogLayoutBadgeDisplayView'; import { CatalogLayoutDefaultView } from './CatalogLayoutDefaultView'; diff --git a/src/components/catalog/views/page/layout/frontpage4/CatalogLayoutFrontpage4View.tsx b/src/components/catalog/views/page/layout/frontpage4/CatalogLayoutFrontpage4View.tsx index 807adbf8..f2e1da6c 100644 --- a/src/components/catalog/views/page/layout/frontpage4/CatalogLayoutFrontpage4View.tsx +++ b/src/components/catalog/views/page/layout/frontpage4/CatalogLayoutFrontpage4View.tsx @@ -1,9 +1,8 @@ import { FrontPageItem } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect } from 'react'; import { CreateLinkEvent } from '../../../../../../api'; -import { Column } from '../../../../../../common/Column'; -import { Grid } from '../../../../../../common/Grid'; -import { useCatalogContext } from '../../../../CatalogContext'; +import { Column, Grid } from '../../../../../../common'; +import { useCatalog } from '../../../../../../hooks'; import { CatalogRedeemVoucherView } from '../../common/CatalogRedeemVoucherView'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutFrontPageItemView } from './CatalogLayoutFrontPageItemView'; @@ -11,7 +10,7 @@ import { CatalogLayoutFrontPageItemView } from './CatalogLayoutFrontPageItemView export const CatalogLayoutFrontpage4View: FC = props => { const { page = null, hideNavigation = null } = props; - const { frontPageItems = [] } = useCatalogContext(); + const { frontPageItems = [] } = useCatalog(); const selectItem = useCallback((item: FrontPageItem) => { diff --git a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx index 9b73be89..4ad0545f 100644 --- a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx @@ -3,14 +3,13 @@ import { FC, useCallback, useEffect, useState } from 'react'; import { FurnitureItem, LocalizeText, NotificationUtilities, ProductTypeEnum, SendMessageComposer } from '../../../../../../api'; import { Base, Button, Column, Grid, LayoutFurniImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../../common'; import { CatalogPostMarketplaceOfferEvent } from '../../../../../../events'; -import { UseMessageEventHook, UseUiEvent } from '../../../../../../hooks'; -import { useCatalogContext } from '../../../../CatalogContext'; +import { useCatalog, UseMessageEventHook, UseUiEvent } from '../../../../../../hooks'; export const MarketplacePostOfferView : FC<{}> = props => { const [ item, setItem ] = useState(null); const [ askingPrice, setAskingPrice ] = useState(0); - const { catalogOptions = null, setCatalogOptions = null } = useCatalogContext(); + const { catalogOptions = null, setCatalogOptions = null } = useCatalog(); const { marketplaceConfiguration = null } = catalogOptions; const onMarketplaceConfigurationEvent = useCallback((event: MarketplaceConfigurationEvent) => diff --git a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx index a9bd44a5..694b8e26 100644 --- a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx +++ b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx @@ -1,11 +1,9 @@ import { ApproveNameMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../../../api'; +import { IPurchasableOffer, LocalizeText, Offer, SendMessageComposer } from '../../../../../../api'; import { Column, Flex, LayoutCurrencyIcon, Text } from '../../../../../../common'; import { CatalogPurchasedEvent } from '../../../../../../events'; import { UseUiEvent } from '../../../../../../hooks'; -import { IPurchasableOffer } from '../../../../common/IPurchasableOffer'; -import { Offer } from '../../../../common/Offer'; import { CatalogPurchaseWidgetView } from '../../widgets/CatalogPurchaseWidgetView'; import { CatalogPetNameApprovalView } from './CatalogPetNameApprovalView'; diff --git a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx index 665a7a4a..b0f23bd7 100644 --- a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx +++ b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx @@ -1,12 +1,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { ApproveNameMessageComposer, ColorConverter, GetSellablePetPalettesComposer, PurchaseFromCatalogComposer, SellablePetPaletteData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, SendMessageComposer } from '../../../../../../api'; +import { GetPetAvailableColors, GetPetIndexFromLocalization, LocalizeText, SendMessageComposer } from '../../../../../../api'; import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, LayoutPetImageView, Text } from '../../../../../../common'; import { CatalogNameResultEvent, CatalogPurchaseFailureEvent, CatalogWidgetEvent } from '../../../../../../events'; -import { DispatchUiEvent, UseUiEvent } from '../../../../../../hooks'; -import { useCatalogContext } from '../../../../CatalogContext'; -import { GetPetAvailableColors, GetPetIndexFromLocalization } from '../../../../common/CatalogUtilities'; +import { DispatchUiEvent, useCatalog, UseUiEvent } from '../../../../../../hooks'; import { CatalogAddOnBadgeWidgetView } from '../../widgets/CatalogAddOnBadgeWidgetView'; import { CatalogPurchaseWidgetView } from '../../widgets/CatalogPurchaseWidgetView'; import { CatalogTotalPriceWidget } from '../../widgets/CatalogTotalPriceWidget'; @@ -25,7 +23,7 @@ export const CatalogLayoutPetView: FC = props => const [ petName, setPetName ] = useState(''); const [ approvalPending, setApprovalPending ] = useState(true); const [ approvalResult, setApprovalResult ] = useState(-1); - const { currentOffer = null, setCurrentOffer = null, setPurchaseOptions = null, catalogOptions = null, roomPreviewer = null } = useCatalogContext(); + const { currentOffer = null, setCurrentOffer = null, setPurchaseOptions = null, catalogOptions = null, roomPreviewer = null } = useCatalog(); const { petPalettes = null } = catalogOptions; const getColor = useMemo(() => diff --git a/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx b/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx index 3b760d27..e339ec80 100644 --- a/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx +++ b/src/components/catalog/views/page/layout/vip-gifts/CatalogLayoutVipGiftsView.tsx @@ -2,15 +2,14 @@ import { SelectClubGiftComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { LocalizeText, NotificationUtilities, SendMessageComposer } from '../../../../../../api'; import { AutoGrid, Text } from '../../../../../../common'; -import { usePurse } from '../../../../../../hooks'; -import { useCatalogContext } from '../../../../CatalogContext'; +import { useCatalog, usePurse } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { VipGiftItem } from './VipGiftItemView'; export const CatalogLayoutVipGiftsView: FC = props => { const { purse = null } = usePurse(); - const { catalogOptions = null, setCatalogOptions = null } = useCatalogContext(); + const { catalogOptions = null, setCatalogOptions = null } = useCatalog(); const { clubGifts = null } = catalogOptions; const giftsAvailable = useCallback(() => diff --git a/src/components/catalog/views/page/widgets/CatalogAddOnBadgeWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogAddOnBadgeWidgetView.tsx index 0b041536..38892cea 100644 --- a/src/components/catalog/views/page/widgets/CatalogAddOnBadgeWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogAddOnBadgeWidgetView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { BaseProps, LayoutBadgeImageView } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; interface CatalogAddOnBadgeWidgetViewProps extends BaseProps { @@ -10,7 +10,7 @@ interface CatalogAddOnBadgeWidgetViewProps extends BaseProps export const CatalogAddOnBadgeWidgetView: FC = props => { const { ...rest } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); if(!currentOffer || !currentOffer.badgeCode || !currentOffer.badgeCode.length) return null; diff --git a/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx index b3c6c028..04891dde 100644 --- a/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogBadgeSelectorWidgetView.tsx @@ -1,8 +1,7 @@ import { StringDataType } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { AutoGrid, AutoGridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../../../common'; -import { useInventoryBadges } from '../../../../../hooks'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog, useInventoryBadges } from '../../../../../hooks'; const EXCLUDED_BADGE_CODES: string[] = []; @@ -16,7 +15,7 @@ export const CatalogBadgeSelectorWidgetView: FC(null); - const { currentOffer = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, setPurchaseOptions = null } = useCatalog(); const { badgeCodes = [], activate = null, deactivate = null } = useInventoryBadges(); const previewStuffData = useMemo(() => diff --git a/src/components/catalog/views/page/widgets/CatalogBundleGridWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogBundleGridWidgetView.tsx index e684387b..d98ff1dd 100644 --- a/src/components/catalog/views/page/widgets/CatalogBundleGridWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogBundleGridWidgetView.tsx @@ -1,7 +1,6 @@ import { FC } from 'react'; -import { AutoGrid, AutoGridProps } from '../../../../../common/AutoGrid'; -import { LayoutGridItem } from '../../../../../common/layout/LayoutGridItem'; -import { useCatalogContext } from '../../../CatalogContext'; +import { AutoGrid, AutoGridProps, LayoutGridItem } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; interface CatalogBundleGridWidgetViewProps extends AutoGridProps { @@ -11,7 +10,7 @@ interface CatalogBundleGridWidgetViewProps extends AutoGridProps export const CatalogBundleGridWidgetView: FC = props => { const { columnCount = 5, children = null, ...rest } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); if(!currentOffer) return null; diff --git a/src/components/catalog/views/page/widgets/CatalogFirstProductSelectorWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogFirstProductSelectorWidgetView.tsx index dfab4d85..a0d71033 100644 --- a/src/components/catalog/views/page/widgets/CatalogFirstProductSelectorWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogFirstProductSelectorWidgetView.tsx @@ -1,9 +1,9 @@ import { FC, useEffect } from 'react'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; export const CatalogFirstProductSelectorWidgetView: FC<{}> = props => { - const { currentPage = null, setCurrentOffer = null } = useCatalogContext(); + const { currentPage = null, setCurrentOffer = null } = useCatalog(); useEffect(() => { diff --git a/src/components/catalog/views/page/widgets/CatalogGuildBadgeWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogGuildBadgeWidgetView.tsx index ae7deb55..db893ad3 100644 --- a/src/components/catalog/views/page/widgets/CatalogGuildBadgeWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogGuildBadgeWidgetView.tsx @@ -1,7 +1,7 @@ import { StringDataType } from '@nitrots/nitro-renderer'; import { FC, useMemo } from 'react'; import { BaseProps, LayoutBadgeImageView } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; interface CatalogGuildBadgeWidgetViewProps extends BaseProps { @@ -11,7 +11,7 @@ interface CatalogGuildBadgeWidgetViewProps extends BaseProps export const CatalogGuildBadgeWidgetView: FC = props => { const { ...rest } = props; - const { currentOffer = null, purchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, purchaseOptions = null } = useCatalog(); const { previewStuffData = null } = purchaseOptions; const badgeCode = useMemo(() => diff --git a/src/components/catalog/views/page/widgets/CatalogGuildSelectorWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogGuildSelectorWidgetView.tsx index 919fa038..d097bd36 100644 --- a/src/components/catalog/views/page/widgets/CatalogGuildSelectorWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogGuildSelectorWidgetView.tsx @@ -2,12 +2,12 @@ import { CatalogGroupsComposer, StringDataType } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useState } from 'react'; import { LocalizeText, SendMessageComposer } from '../../../../../api'; import { Base, Button, Flex } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; +import { useCatalog } from '../../../../../hooks'; export const CatalogGuildSelectorWidgetView: FC<{}> = props => { const [ selectedGroupIndex, setSelectedGroupIndex ] = useState(0); - const { currentOffer = null, catalogOptions = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, catalogOptions = null, setPurchaseOptions = null } = useCatalog(); const { groups = null } = catalogOptions; const previewStuffData = useMemo(() => diff --git a/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx index d5e941ca..933dede6 100644 --- a/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogItemGridWidgetView.tsx @@ -1,8 +1,7 @@ import { FC } from 'react'; -import { ProductTypeEnum } from '../../../../../api'; +import { IPurchasableOffer, ProductTypeEnum } from '../../../../../api'; import { AutoGrid, AutoGridProps } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; -import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; +import { useCatalog } from '../../../../../hooks'; import { CatalogGridOfferView } from '../common/CatalogGridOfferView'; interface CatalogItemGridWidgetViewProps extends AutoGridProps @@ -13,7 +12,7 @@ interface CatalogItemGridWidgetViewProps extends AutoGridProps export const CatalogItemGridWidgetView: FC = props => { const { columnCount = 5, children = null, ...rest } = props; - const { currentOffer = null, setCurrentOffer = null, currentPage = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, setCurrentOffer = null, currentPage = null, setPurchaseOptions = null } = useCatalog(); if(!currentPage) return null; @@ -40,7 +39,7 @@ export const CatalogItemGridWidgetView: FC = pro return ( - { currentPage.offers && (currentPage.offers.length > 0) && currentPage.offers.map((offer, index) => selectOffer(offer) } />) } + { currentPage.offers && (currentPage.offers.length > 0) && currentPage.offers.map((offer, index) => ) } { children } ); diff --git a/src/components/catalog/views/page/widgets/CatalogLimitedItemWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogLimitedItemWidgetView.tsx index 035d7d44..70b52cbd 100644 --- a/src/components/catalog/views/page/widgets/CatalogLimitedItemWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogLimitedItemWidgetView.tsx @@ -1,12 +1,12 @@ import { FC } from 'react'; +import { Offer } from '../../../../../api'; import { Base, BaseProps, LayoutLimitedEditionCompletePlateView } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; -import { Offer } from '../../../common/Offer'; +import { useCatalog } from '../../../../../hooks'; export const CatalogLimitedItemWidgetView: FC> = props => { const { children = null, ...rest } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); if(!currentOffer || (currentOffer.pricingModel !== Offer.PRICING_MODEL_SINGLE) || !currentOffer.product.isUniqueLimitedItem) return null; diff --git a/src/components/catalog/views/page/widgets/CatalogPriceDisplayWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogPriceDisplayWidgetView.tsx index 7cf8c76b..0ca15604 100644 --- a/src/components/catalog/views/page/widgets/CatalogPriceDisplayWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogPriceDisplayWidgetView.tsx @@ -1,8 +1,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FC } from 'react'; +import { IPurchasableOffer } from '../../../../../api'; import { Flex, LayoutCurrencyIcon, Text } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; -import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; +import { useCatalog } from '../../../../../hooks'; interface CatalogPriceDisplayWidgetViewProps { @@ -13,7 +13,7 @@ interface CatalogPriceDisplayWidgetViewProps export const CatalogPriceDisplayWidgetView: FC = props => { const { offer = null, separator = false } = props; - const { purchaseOptions = null } = useCatalogContext(); + const { purchaseOptions = null } = useCatalog(); const { quantity = 1 } = purchaseOptions; if(!offer) return null; diff --git a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx index 7a874acc..93637305 100644 --- a/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogPurchaseWidgetView.tsx @@ -1,12 +1,9 @@ import { PurchaseFromCatalogComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { CreateLinkEvent, GetClubMemberLevel, LocalizeText, SendMessageComposer } from '../../../../../api'; +import { CatalogPurchaseState, CreateLinkEvent, GetClubMemberLevel, LocalizeText, LocalStorageKeys, Offer, SendMessageComposer } from '../../../../../api'; import { Button, LayoutLoadingSpinnerView } from '../../../../../common'; -import { CatalogEvent, CatalogInitGiftEvent, CatalogInitPurchaseEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, CatalogWidgetEvent } from '../../../../../events'; -import { DispatchUiEvent, usePurse, UseUiEvent } from '../../../../../hooks'; -import { useCatalogContext } from '../../../CatalogContext'; -import { CatalogPurchaseState } from '../../../common/CatalogPurchaseState'; -import { Offer } from '../../../common/Offer'; +import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent } from '../../../../../events'; +import { DispatchUiEvent, useCatalog, useLocalStorage, usePurse, UseUiEvent } from '../../../../../hooks'; interface CatalogPurchaseWidgetViewProps { @@ -19,19 +16,10 @@ export const CatalogPurchaseWidgetView: FC = pro const { noGiftOption = false, purchaseCallback = null } = props; const [ purchaseWillBeGift, setPurchaseWillBeGift ] = useState(false); const [ purchaseState, setPurchaseState ] = useState(CatalogPurchaseState.NONE); - const { currentOffer = null, currentPage = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalogContext(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useLocalStorage(LocalStorageKeys.CATALOG_SKIP_PURCHASE_CONFIRMATION, false); + const { currentOffer = null, currentPage = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalog(); const { getCurrencyAmount = null } = usePurse(); - const onCatalogInitPurchaseEvent = useCallback((event: CatalogInitPurchaseEvent) => - { - if(!currentOffer) return; - - // show purchase confirmation - // offer, page.pageId, extraData, quantity, previewStuffData, null, true, null - }, [ currentOffer ]); - - UseUiEvent(CatalogWidgetEvent.INIT_PURCHASE, onCatalogInitPurchaseEvent); - const onCatalogEvent = useCallback((event: CatalogEvent) => { switch(event.type) diff --git a/src/components/catalog/views/page/widgets/CatalogSimplePriceWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogSimplePriceWidgetView.tsx index 80b5dafb..694507df 100644 --- a/src/components/catalog/views/page/widgets/CatalogSimplePriceWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogSimplePriceWidgetView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; -import { Flex, FlexProps } from '../../../../../common/Flex'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Flex, FlexProps } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogPriceDisplayWidgetView } from './CatalogPriceDisplayWidgetView'; interface CatalogSimplePriceWidgetViewProps extends FlexProps @@ -11,7 +11,7 @@ interface CatalogSimplePriceWidgetViewProps extends FlexProps export const CatalogSimplePriceWidgetView: FC = props => { const { gap = 1, ...rest } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( diff --git a/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx index d2dc9550..fdc3f5f4 100644 --- a/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogSpacesWidgetView.tsx @@ -1,9 +1,7 @@ import { FC, useEffect, useState } from 'react'; -import { LocalizeText, ProductTypeEnum } from '../../../../../api'; +import { IPurchasableOffer, LocalizeText, Offer, ProductTypeEnum } from '../../../../../api'; import { AutoGrid, AutoGridProps, Button, ButtonGroup } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; -import { IPurchasableOffer } from '../../../common/IPurchasableOffer'; -import { Offer } from '../../../common/Offer'; +import { useCatalog } from '../../../../../hooks'; import { CatalogGridOfferView } from '../common/CatalogGridOfferView'; interface CatalogSpacesWidgetViewProps extends AutoGridProps @@ -19,7 +17,21 @@ export const CatalogSpacesWidgetView: FC = props = const [ groupedOffers, setGroupedOffers ] = useState(null); const [ selectedGroupIndex, setSelectedGroupIndex ] = useState(-1); const [ selectedOfferForGroup, setSelectedOfferForGroup ] = useState(null); - const { currentPage = null, currentOffer = null, setCurrentOffer = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentPage = null, currentOffer = null, setCurrentOffer = null, setPurchaseOptions = null } = useCatalog(); + + const setSelectedOffer = (offer: IPurchasableOffer) => + { + if(!offer) return; + + setSelectedOfferForGroup(prevValue => + { + const newValue = [ ...prevValue ]; + + newValue[selectedGroupIndex] = offer; + + return newValue; + }); + } useEffect(() => { @@ -89,22 +101,7 @@ export const CatalogSpacesWidgetView: FC = props = { SPACES_GROUP_NAMES.map((name, index) => ) } - { offers && (offers.length > 0) && offers.map((offer, index) => - { - const setSelectedOffer = () => - { - setSelectedOfferForGroup(prevValue => - { - const newValue = [ ...prevValue ]; - - newValue[selectedGroupIndex] = offer; - - return newValue; - }); - } - - return ; - }) } + { offers && (offers.length > 0) && offers.map((offer, index) => setSelectedOffer(offer) } />) } { children } diff --git a/src/components/catalog/views/page/widgets/CatalogSpinnerWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogSpinnerWidgetView.tsx index df50e347..2749fa7b 100644 --- a/src/components/catalog/views/page/widgets/CatalogSpinnerWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogSpinnerWidgetView.tsx @@ -1,16 +1,15 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FC } from 'react'; import { LocalizeText } from '../../../../../api'; -import { Flex } from '../../../../../common/Flex'; -import { Text } from '../../../../../common/Text'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Flex, Text } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; const MIN_VALUE: number = 1; const MAX_VALUE: number = 100; export const CatalogSpinnerWidgetView: FC<{}> = props => { - const { currentOffer = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, purchaseOptions = null, setPurchaseOptions = null } = useCatalog(); const { quantity = 1 } = purchaseOptions; const updateQuantity = (value: number) => diff --git a/src/components/catalog/views/page/widgets/CatalogTotalPriceWidget.tsx b/src/components/catalog/views/page/widgets/CatalogTotalPriceWidget.tsx index ae10d810..b3f935ae 100644 --- a/src/components/catalog/views/page/widgets/CatalogTotalPriceWidget.tsx +++ b/src/components/catalog/views/page/widgets/CatalogTotalPriceWidget.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; -import { Column, ColumnProps } from '../../../../../common/Column'; -import { useCatalogContext } from '../../../CatalogContext'; +import { Column, ColumnProps } from '../../../../../common'; +import { useCatalog } from '../../../../../hooks'; import { CatalogPriceDisplayWidgetView } from './CatalogPriceDisplayWidgetView'; interface CatalogSimplePriceWidgetViewProps extends ColumnProps @@ -10,7 +10,7 @@ interface CatalogSimplePriceWidgetViewProps extends ColumnProps export const CatalogTotalPriceWidget: FC = props => { const { gap = 1, ...rest } = props; - const { currentOffer = null } = useCatalogContext(); + const { currentOffer = null } = useCatalog(); return ( diff --git a/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx index 27e21c23..620ece15 100644 --- a/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx @@ -1,14 +1,12 @@ import { Vector3d } from '@nitrots/nitro-renderer'; import { FC, useEffect } from 'react'; -import { GetAvatarRenderManager, GetSessionDataManager, ProductTypeEnum } from '../../../../../api'; +import { FurniCategory, GetAvatarRenderManager, GetSessionDataManager, Offer, ProductTypeEnum } from '../../../../../api'; import { AutoGrid, Column, LayoutGridItem, LayoutRoomPreviewerView } from '../../../../../common'; -import { useCatalogContext } from '../../../CatalogContext'; -import { FurniCategory } from '../../../common/FurniCategory'; -import { Offer } from '../../../common/Offer'; +import { useCatalog } from '../../../../../hooks'; export const CatalogViewProductWidgetView: FC<{}> = props => { - const { currentOffer = null, roomPreviewer = null, purchaseOptions = null } = useCatalogContext(); + const { currentOffer = null, roomPreviewer = null, purchaseOptions = null } = useCatalog(); const { previewStuffData = null } = purchaseOptions; useEffect(() => diff --git a/src/components/groups/views/GroupInformationView.tsx b/src/components/groups/views/GroupInformationView.tsx index 1021bf4b..e330898a 100644 --- a/src/components/groups/views/GroupInformationView.tsx +++ b/src/components/groups/views/GroupInformationView.tsx @@ -1,8 +1,7 @@ import { GroupInformationParser, GroupRemoveMemberComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; -import { CreateLinkEvent, GetGroupManager, GetGroupMembers, GetSessionDataManager, LocalizeText, NotificationUtilities, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; +import { CatalogPageName, CreateLinkEvent, GetGroupManager, GetGroupMembers, GetSessionDataManager, LocalizeText, NotificationUtilities, SendMessageComposer, TryJoinGroup, TryVisitRoom } from '../../../api'; import { Button, Column, Flex, Grid, GridProps, LayoutBadgeImageView, Text } from '../../../common'; -import { CatalogPageName } from '../../catalog/common/CatalogPageName'; import { GroupMembershipType } from '../common/GroupMembershipType'; import { GroupType } from '../common/GroupType'; diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 6768c898..3564203b 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -3,12 +3,14 @@ import { ILinkEventTracker, NitroSettingsEvent, UserSettingsCameraFollowComposer import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common'; -import { DispatchMainEvent, DispatchUiEvent, UseMessageEventHook } from '../../hooks'; +import { DispatchMainEvent, DispatchUiEvent, useCatalogPlaceMultipleItems, useCatalogSkipPurchaseConfirmation, UseMessageEventHook } from '../../hooks'; export const UserSettingsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ userSettings, setUserSettings ] = useState(null); + const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); const onUserSettingsEvent = useCallback((event: UserSettingsEvent) => { @@ -141,6 +143,14 @@ export const UserSettingsView: FC<{}> = props => processAction('camera_follow', event.target.checked) } /> { LocalizeText('memenu.settings.other.disable.room.camera.follow') } + + setCatalogPlaceMultipleObjects(event.target.checked) } /> + { LocalizeText('memenu.settings.other.place.multiple.objects') } + + + setCatalogSkipPurchaseConfirmation(event.target.checked) } /> + { LocalizeText('memenu.settings.other.skip.purchase.confirmation') } +
    { LocalizeText('widget.memenu.settings.volume') } diff --git a/src/events/catalog/CatalogInitPurchaseEvent.ts b/src/events/catalog/CatalogInitPurchaseEvent.ts deleted file mode 100644 index 2b2661fa..00000000 --- a/src/events/catalog/CatalogInitPurchaseEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogInitPurchaseEvent extends NitroEvent -{ - private _enableBuyAsGift: boolean = true; - private _userName: string; - - constructor(enableBuyAsGift: boolean = true, userName: string = null) - { - super(CatalogWidgetEvent.INIT_PURCHASE); - - this._enableBuyAsGift = enableBuyAsGift; - this._userName = userName; - } - - public get enableBuyAsGift(): boolean - { - return this._enableBuyAsGift; - } - - public get userName(): string - { - return this._userName; - } -} diff --git a/src/events/catalog/CatalogWidgetEvent.ts b/src/events/catalog/CatalogWidgetEvent.ts index 57df2d7b..9f3f5a41 100644 --- a/src/events/catalog/CatalogWidgetEvent.ts +++ b/src/events/catalog/CatalogWidgetEvent.ts @@ -14,7 +14,6 @@ export class CatalogWidgetEvent extends NitroEvent public static APPROVE_RESULT: string = 'CWE_CWE_APPROVE_RESULT'; public static PURCHASE_OVERRIDE: string = 'CWE_PURCHASE_OVERRIDE'; public static SELLABLE_PET_PALETTES: string = 'CWE_SELLABLE_PET_PALETTES'; - public static INIT_PURCHASE: string = 'CWE_INIT_PURCHASE'; public static UPDATE_ROOM_PREVIEW: string = 'CWE_UPDATE_ROOM_PREVIEW'; public static GUILD_SELECTED: string = 'CWE_GUILD_SELECTED'; public static TOTAL_PRICE_WIDGET_INITIALIZED: string = 'CWE_TOTAL_PRICE_WIDGET_INITIALIZED'; diff --git a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts b/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts index 03e11862..5332dfd9 100644 --- a/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts +++ b/src/events/catalog/SetRoomPreviewerStuffDataEvent.ts @@ -1,5 +1,5 @@ import { IObjectData, NitroEvent } from '@nitrots/nitro-renderer'; -import { IPurchasableOffer } from '../../components/catalog/common/IPurchasableOffer'; +import { IPurchasableOffer } from '../../api'; export class SetRoomPreviewerStuffDataEvent extends NitroEvent { diff --git a/src/events/catalog/index.ts b/src/events/catalog/index.ts index 1e2cd919..d8bc3f33 100644 --- a/src/events/catalog/index.ts +++ b/src/events/catalog/index.ts @@ -1,7 +1,6 @@ export * from './CatalogEvent'; export * from './CatalogGiftReceiverNotFoundEvent'; export * from './CatalogInitGiftEvent'; -export * from './CatalogInitPurchaseEvent'; export * from './CatalogNameResultEvent'; export * from './CatalogPostMarketplaceOfferEvent'; export * from './CatalogPurchasedEvent'; diff --git a/src/events/index.ts b/src/events/index.ts index 288b2364..40e7a162 100644 --- a/src/events/index.ts +++ b/src/events/index.ts @@ -1,6 +1,7 @@ export * from './catalog'; export * from './guide-tool'; export * from './help'; +export * from './inventory'; export * from './mod-tools'; export * from './notification-center'; export * from './room-widgets'; diff --git a/src/events/inventory/InventoryFurniAddedEvent.ts b/src/events/inventory/InventoryFurniAddedEvent.ts new file mode 100644 index 00000000..409f0be8 --- /dev/null +++ b/src/events/inventory/InventoryFurniAddedEvent.ts @@ -0,0 +1,14 @@ +import { NitroEvent } from '@nitrots/nitro-renderer'; + +export class InventoryFurniAddedEvent extends NitroEvent +{ + public static FURNI_ADDED: string = 'IFAE_FURNI_ADDED'; + + constructor( + public readonly id: number, + public readonly spriteId: number, + public readonly category: number) + { + super(InventoryFurniAddedEvent.FURNI_ADDED); + } +} diff --git a/src/events/inventory/index.ts b/src/events/inventory/index.ts new file mode 100644 index 00000000..58503ead --- /dev/null +++ b/src/events/inventory/index.ts @@ -0,0 +1 @@ +export * from './InventoryFurniAddedEvent'; diff --git a/src/hooks/catalog/index.ts b/src/hooks/catalog/index.ts new file mode 100644 index 00000000..9798d048 --- /dev/null +++ b/src/hooks/catalog/index.ts @@ -0,0 +1,5 @@ +export * from './useCatalog'; +export * from './useCatalogBuildersClub'; +export * from './useCatalogItemMover'; +export * from './useCatalogPlaceMultipleItems'; +export * from './useCatalogSkipPurchaseConfirmation'; diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts new file mode 100644 index 00000000..ca2d4701 --- /dev/null +++ b/src/hooks/catalog/useCatalog.ts @@ -0,0 +1,611 @@ +import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, FrontPageItem, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, GuildMembershipsMessageEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomPreviewer, SellablePetPalettesMessageEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useBetween } from 'use-between'; +import { CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, GetFurnitureData, GetProductDataForLocalization, GetRoomEngine, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, NotificationUtilities, Offer, PageLocalization, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; +import { CatalogGiftReceiverNotFoundEvent, CatalogNameResultEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent } from '../../events'; +import { DispatchUiEvent, UseUiEvent } from '../events'; +import { UseMessageEventHook } from '../messages'; +import { useCatalogBuildersClub } from './useCatalogBuildersClub'; +import { useCatalogItemMover } from './useCatalogItemMover'; + +const useCatalogState = () => +{ + const [ isVisible, setIsVisible ] = useState(false); + const [ isBusy, setIsBusy ] = useState(false); + const [ pageId, setPageId ] = useState(-1); + const [ previousPageId, setPreviousPageId ] = useState(-1); + const [ currentType, setCurrentType ] = useState(CatalogType.NORMAL); + const [ rootNode, setRootNode ] = useState(null); + const [ offersToNodes, setOffersToNodes ] = useState>(null); + const [ currentPage, setCurrentPage ] = useState(null); + const [ currentOffer, setCurrentOffer ] = useState(null); + const [ activeNodes, setActiveNodes ] = useState([]); + const [ searchResult, setSearchResult ] = useState(null); + const [ frontPageItems, setFrontPageItems ] = useState([]); + const [ roomPreviewer, setRoomPreviewer ] = useState(null); + const [ navigationHidden, setNavigationHidden ] = useState(false); + const [ purchaseOptions, setPurchaseOptions ] = useState({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); + const [ catalogOptions, setCatalogOptions ] = useState({}); + const { furniCount = 0, furniLimit = 0, secondsLeft = 0 } = useCatalogBuildersClub(); + const { requestOfferToMover = null, cancelObjectMover = null } = useCatalogItemMover({ currentType, pageId, currentOffer, purchaseOptions }, { furniCount, furniLimit, secondsLeft }); + const requestedPage = useRef(new RequestedPage()); + + const resetState = useCallback(() => + { + setPageId(-1); + setPreviousPageId(-1); + setRootNode(null); + setOffersToNodes(null); + setCurrentPage(null); + setCurrentOffer(null); + setActiveNodes([]); + setSearchResult(null); + setFrontPageItems([]); + setIsVisible(false); + }, []); + + const getNodeById = useCallback((id: number, node: ICatalogNode) => + { + if((node.pageId === id) && (node !== rootNode)) return node; + + for(const child of node.children) + { + const found = (getNodeById(id, child) as ICatalogNode); + + if(found) return found; + } + + return null; + }, [ rootNode ]); + + const getNodeByName = useCallback((name: string, node: ICatalogNode) => + { + if((node.pageName === name) && (node !== rootNode)) return node; + + for(const child of node.children) + { + const found = (getNodeByName(name, child) as ICatalogNode); + + if(found) return found; + } + + return null; + }, [ rootNode ]); + + const getNodesByOfferId = useCallback((offerId: number, flag: boolean = false) => + { + if(!offersToNodes || !offersToNodes.size) return null; + + if(flag) + { + const nodes: ICatalogNode[] = []; + const offers = offersToNodes.get(offerId); + + if(offers && offers.length) for(const offer of offers) (offer.isVisible && nodes.push(offer)); + + if(nodes.length) return nodes; + } + + return offersToNodes.get(offerId); + }, [ offersToNodes ]); + + const loadCatalogPage = useCallback((pageId: number, offerId: number) => + { + if(pageId < 0) return; + + setIsBusy(true); + setPageId(pageId); + + if(pageId > -1) SendMessageComposer(new GetCatalogPageComposer(pageId, offerId, currentType)); + }, [ currentType ]); + + const showCatalogPage = useCallback((pageId: number, layoutCode: string, localization: IPageLocalization, offers: IPurchasableOffer[], offerId: number, acceptSeasonCurrencyAsCredits: boolean) => + { + const catalogPage = (new CatalogPage(pageId, layoutCode, localization, offers, acceptSeasonCurrencyAsCredits) as ICatalogPage); + + setCurrentPage(catalogPage); + setPreviousPageId(prevValue => ((pageId !== -1) ? pageId : prevValue)); + setNavigationHidden(false); + + if((offerId > -1) && catalogPage.offers.length) + { + for(const offer of catalogPage.offers) + { + if(offer.offerId !== offerId) continue; + + setCurrentOffer(offer) + + break; + } + } + }, []); + + const activateNode = useCallback((targetNode: ICatalogNode, offerId: number = -1) => + { + cancelObjectMover(); + + if(targetNode.parent.pageName === 'root') + { + if(targetNode.children.length) + { + for(const child of targetNode.children) + { + if(!child.isVisible) continue; + + targetNode = child; + + break; + } + } + } + + const nodes: ICatalogNode[] = []; + + let node = targetNode; + + while(node && (node.pageName !== 'root')) + { + nodes.push(node); + + node = node.parent; + } + + nodes.reverse(); + + setActiveNodes(prevValue => + { + const isActive = (prevValue.indexOf(targetNode) >= 0); + const isOpen = targetNode.isOpen; + + for(const existing of prevValue) + { + existing.deactivate(); + + if(nodes.indexOf(existing) === -1) existing.close(); + } + + for(const n of nodes) + { + n.activate(); + + if(n.parent) n.open(); + + if((n === targetNode.parent) && n.children.length) n.open(); + } + + if(isActive && isOpen) targetNode.close(); + else targetNode.open(); + + return nodes; + }); + + if(targetNode.pageId > -1) loadCatalogPage(targetNode.pageId, offerId); + }, [ setActiveNodes, loadCatalogPage, cancelObjectMover ]); + + const openPageById = useCallback((id: number) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestById = id; + + setIsVisible(true); + } + else + { + const node = getNodeById(id, rootNode); + + if(node) activateNode(node); + } + }, [ isVisible, rootNode, getNodeById, activateNode ]); + + const openPageByName = useCallback((name: string) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestByName = name; + + setIsVisible(true); + } + else + { + const node = getNodeByName(name, rootNode); + + if(node) activateNode(node); + } + }, [ isVisible, rootNode, getNodeByName, activateNode ]); + + const openPageByOfferId = useCallback((offerId: number) => + { + setSearchResult(null); + + if(!isVisible) + { + requestedPage.current.requestedByOfferId = offerId; + + setIsVisible(true); + } + else + { + const nodes = getNodesByOfferId(offerId); + + if(!nodes || !nodes.length) return; + + activateNode(nodes[0], offerId); + } + }, [ isVisible, getNodesByOfferId, activateNode ]); + + const onCatalogPagesListEvent = useCallback((event: CatalogPagesListEvent) => + { + const parser = event.getParser(); + const offers: Map = new Map(); + + const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) => + { + const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode); + + for(const offerId of catalogNode.offerIds) + { + if(offers.has(offerId)) offers.get(offerId).push(catalogNode); + else offers.set(offerId, [ catalogNode ]); + } + + depth++; + + for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode)); + + return catalogNode; + } + + setRootNode(getCatalogNode(parser.root, 0, null)); + setOffersToNodes(offers); + }, [ setRootNode, setOffersToNodes ]); + + UseMessageEventHook(CatalogPagesListEvent, onCatalogPagesListEvent); + + const onCatalogPageMessageEvent = useCallback((event: CatalogPageMessageEvent) => + { + const parser = event.getParser(); + + if(parser.catalogType !== currentType) return; + + const purchasableOffers: IPurchasableOffer[] = []; + + for(const offer of parser.offers) + { + const products: IProduct[] = []; + const productData = GetProductDataForLocalization(offer.localizationId); + + for(const product of offer.products) + { + const furnitureData = GetFurnitureData(product.furniClassId, product.productType); + + products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); + } + + if(!products.length) continue; + + const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed); + + if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer); + } + + if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems); + + setIsBusy(false); + + if(pageId === parser.pageId) + { + showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits); + } + }, [ currentType, pageId, setFrontPageItems, setIsBusy, showCatalogPage ]); + + UseMessageEventHook(CatalogPageMessageEvent, onCatalogPageMessageEvent); + + const onPurchaseOKMessageEvent = useCallback((event: PurchaseOKMessageEvent) => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchasedEvent(parser.offer)); + }, []); + + UseMessageEventHook(PurchaseOKMessageEvent, onPurchaseOKMessageEvent); + + const onPurchaseErrorMessageEvent = useCallback((event: PurchaseErrorMessageEvent) => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code)); + }, []); + + UseMessageEventHook(PurchaseErrorMessageEvent, onPurchaseErrorMessageEvent); + + const onPurchaseNotAllowedMessageEvent = useCallback((event: PurchaseNotAllowedMessageEvent) => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code)); + }, []); + + UseMessageEventHook(PurchaseNotAllowedMessageEvent, onPurchaseNotAllowedMessageEvent); + + const onLimitedEditionSoldOutEvent = useCallback((event: LimitedEditionSoldOutEvent) => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogPurchaseSoldOutEvent()); + }, []); + + UseMessageEventHook(LimitedEditionSoldOutEvent, onLimitedEditionSoldOutEvent); + + const onProductOfferEvent = useCallback((event: ProductOfferEvent) => + { + const parser = event.getParser(); + const offerData = parser.offer; + + if(!offerData || !offerData.products.length) return; + + const offerProductData = offerData.products[0]; + + if(offerProductData.uniqueLimitedItem) + { + // update unique + } + + const products: IProduct[] = []; + const productData = GetProductDataForLocalization(offerData.localizationId); + + for(const product of offerData.products) + { + const furnitureData = GetFurnitureData(product.furniClassId, product.productType); + + products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft)); + } + + const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed); + + if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return; + + offer.page = currentPage; + + setCurrentOffer(offer); + + if(offer.product && (offer.product.productType === ProductTypeEnum.WALL)) + { + setPurchaseOptions(prevValue => + { + const newValue = { ...prevValue }; + + newValue.extraData =( offer.product.extraParam || null); + + return newValue; + }); + } + + // (this._isObjectMoverRequested) && (this._purchasableOffer) + }, [ currentType, currentPage, setCurrentOffer, setPurchaseOptions ]); + + UseMessageEventHook(ProductOfferEvent, onProductOfferEvent); + + const onSellablePetPalettesMessageEvent = useCallback((event: SellablePetPalettesMessageEvent) => + { + const parser = event.getParser(); + const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice()); + + setCatalogOptions(prevValue => + { + const petPalettes = []; + + if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes); + + for(let i = 0; i < petPalettes.length; i++) + { + const palette = petPalettes[i]; + + if(palette.breed === petPalette.breed) + { + petPalettes.splice(i, 1); + + break; + } + } + + petPalettes.push(petPalette); + + return { ...prevValue, petPalettes }; + }); + }, [ setCatalogOptions ]); + + UseMessageEventHook(SellablePetPalettesMessageEvent, onSellablePetPalettesMessageEvent); + + const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => + { + const parser = event.getParser(); + + DispatchUiEvent(new CatalogNameResultEvent(parser.result, parser.validationInfo)); + }, []); + + UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); + + const onGiftReceiverNotFoundEvent = useCallback(() => + { + DispatchUiEvent(new CatalogGiftReceiverNotFoundEvent()); + }, []); + + UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); + + const onHabboClubOffersMessageEvent = useCallback((event: HabboClubOffersMessageEvent) => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const clubOffers = parser.offers; + + return { ...prevValue, clubOffers }; + }); + }, [ setCatalogOptions ]); + + UseMessageEventHook(HabboClubOffersMessageEvent, onHabboClubOffersMessageEvent); + + const onGuildMembershipsMessageEvent = useCallback((event: GuildMembershipsMessageEvent) => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const groups = parser.groups; + + return { ...prevValue, groups }; + }); + }, [ setCatalogOptions ]); + + UseMessageEventHook(GuildMembershipsMessageEvent, onGuildMembershipsMessageEvent); + + const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const giftConfiguration = new GiftWrappingConfiguration(parser); + + return { ...prevValue, giftConfiguration }; + }); + }, [ setCatalogOptions ]); + + UseMessageEventHook(GiftWrappingConfigurationEvent, onGiftWrappingConfigurationEvent); + + const onMarketplaceMakeOfferResult = useCallback((event: MarketplaceMakeOfferResult) => + { + const parser = event.getParser(); + + if(!parser) return; + + let title = ''; + if(parser.result === 1) + { + title = LocalizeText('inventory.marketplace.result.title.success'); + } + else + { + title = LocalizeText('inventory.marketplace.result.title.failure'); + } + + const message = LocalizeText(`inventory.marketplace.result.${ parser.result }`); + + NotificationUtilities.simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title); + }, []); + + UseMessageEventHook(MarketplaceMakeOfferResult, onMarketplaceMakeOfferResult); + + const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) => + { + const parser = event.getParser(); + + setCatalogOptions(prevValue => + { + const clubGifts = parser; + + return { ...prevValue, clubGifts }; + }); + }, [ setCatalogOptions ]); + + UseMessageEventHook(ClubGiftInfoEvent, onClubGiftInfoEvent); + + const onCatalogPublishedMessageEvent = useCallback((event: CatalogPublishedMessageEvent) => + { + const wasVisible = isVisible; + + resetState(); + + if(wasVisible) NotificationUtilities.simpleAlert(LocalizeText('catalog.alert.published.description'), NotificationAlertType.ALERT, null, null, LocalizeText('catalog.alert.published.title')); + }, [ isVisible, resetState ]); + + UseMessageEventHook(CatalogPublishedMessageEvent, onCatalogPublishedMessageEvent); + + const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => + { + PlaySound(SoundNames.CREDITS); + }, []); + + UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); + + useEffect(() => + { + return () => setCurrentOffer(null); + }, [ currentPage ]); + + useEffect(() => + { + if(!isVisible || !rootNode || !requestedPage.current) return; + + switch(requestedPage.current.requestType) + { + case RequestedPage.REQUEST_TYPE_NONE: + if(activeNodes && activeNodes.length) return; + + if(rootNode.isBranch) + { + for(const child of rootNode.children) + { + if(child && child.isVisible) + { + activateNode(child); + + return; + } + } + } + return; + case RequestedPage.REQUEST_TYPE_ID: + openPageById(requestedPage.current.requestById); + requestedPage.current.resetRequest(); + return; + case RequestedPage.REQUEST_TYPE_OFFER: + openPageByOfferId(requestedPage.current.requestedByOfferId); + requestedPage.current.resetRequest(); + return; + case RequestedPage.REQUEST_TYPE_NAME: + openPageByName(requestedPage.current.requestByName); + requestedPage.current.resetRequest(); + return; + } + }, [ isVisible, rootNode, activeNodes, activateNode, openPageById, openPageByOfferId, openPageByName ]); + + useEffect(() => + { + if(!searchResult && currentPage && (currentPage.pageId === -1)) openPageById(previousPageId); + }, [ searchResult, currentPage, previousPageId, openPageById ]); + + useEffect(() => + { + if(!isVisible || rootNode) return; + + SendMessageComposer(new GetGiftWrappingConfigurationComposer()); + SendMessageComposer(new GetClubGiftInfo()); + SendMessageComposer(new GetCatalogIndexComposer(currentType)); + }, [ isVisible, rootNode, currentType ]); + + useEffect(() => + { + setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER)); + + return () => + { + setRoomPreviewer(prevValue => + { + prevValue.dispose(); + + return null; + }); + } + }, []); + + return { isVisible, setIsVisible, isBusy, pageId, previousPageId, currentType, rootNode, offersToNodes, currentPage, setCurrentPage, currentOffer, setCurrentOffer, activeNodes, searchResult, setSearchResult, frontPageItems, roomPreviewer, navigationHidden, setNavigationHidden, purchaseOptions, setPurchaseOptions, catalogOptions, setCatalogOptions, getNodeById, getNodeByName, activateNode, openPageById, openPageByName, openPageByOfferId, requestOfferToMover }; +} + +export const useCatalog = () => useBetween(useCatalogState); diff --git a/src/hooks/catalog/useCatalogBuildersClub.ts b/src/hooks/catalog/useCatalogBuildersClub.ts new file mode 100644 index 00000000..538277a1 --- /dev/null +++ b/src/hooks/catalog/useCatalogBuildersClub.ts @@ -0,0 +1,54 @@ +import { BuildersClubFurniCountMessageEvent, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useEffect, useState } from 'react'; +import { GetNitroInstance, SendMessageComposer } from '../../api'; +import { UseMessageEventHook } from '../messages'; + +const useCatalogBuildersClubState = () => +{ + const [ furniCount, setFurniCount ] = useState(0); + const [ furniLimit, setFurniLimit ] = useState(0); + const [ maxFurniLimit, setMaxFurniLimit ] = useState(0); + const [ secondsLeft, setSecondsLeft ] = useState(0); + const [ updateTime, setUpdateTime ] = useState(0); + const [ secondsLeftWithGrace, setSecondsLeftWithGrace ] = useState(0); + + const refreshBuilderStatus = useCallback(() => + { + + }, []); + + const onBuildersClubFurniCountMessageEvent = useCallback((event: BuildersClubFurniCountMessageEvent) => + { + const parser = event.getParser(); + + setFurniCount(parser.furniCount); + + refreshBuilderStatus(); + }, [ refreshBuilderStatus ]); + + UseMessageEventHook(BuildersClubFurniCountMessageEvent, onBuildersClubFurniCountMessageEvent); + + const onBuildersClubSubscriptionStatusMessageEvent = useCallback((event: BuildersClubSubscriptionStatusMessageEvent) => + { + const parser = event.getParser(); + + setFurniLimit(parser._Str_15864); + setMaxFurniLimit(parser._Str_24094); + setSecondsLeft(parser._Str_3709); + setUpdateTime(GetNitroInstance().time); + setSecondsLeftWithGrace(parser._Str_24379); + + refreshBuilderStatus(); + }, [ refreshBuilderStatus ]); + + UseMessageEventHook(BuildersClubSubscriptionStatusMessageEvent, onBuildersClubSubscriptionStatusMessageEvent); + + useEffect(() => + { + SendMessageComposer(new BuildersClubQueryFurniCountMessageComposer()); + }, []); + + return { furniCount, furniLimit, maxFurniLimit, secondsLeft, updateTime, secondsLeftWithGrace }; +} + +export const useCatalogBuildersClub = useCatalogBuildersClubState; diff --git a/src/hooks/catalog/useCatalogItemMover.ts b/src/hooks/catalog/useCatalogItemMover.ts new file mode 100644 index 00000000..e6b8960d --- /dev/null +++ b/src/hooks/catalog/useCatalogItemMover.ts @@ -0,0 +1,321 @@ +import { BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, FurniturePlaceComposer, FurniturePlacePaintComposer, LegacyDataType, PurchaseFromCatalogComposer, RoomControllerLevel, RoomEngineObjectPlacedEvent, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType, RoomObjectVariable, Vector3d } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { BuilderFurniPlaceableStatus, CatalogType, CreateLinkEvent, FurniCategory, GetRoomEngine, GetRoomSession, IPurchasableOffer, IPurchaseOptions, Offer, PlacedObjectPurchaseData, ProductTypeEnum, SendMessageComposer } from '../../api'; +import { InventoryFurniAddedEvent } from '../../events'; +import { UseRoomEngineEvent, UseUiEvent } from '../events'; +import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; +import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; + +const DUMMY_PAGE_ID_FOR_OFFER_SEARCH = -12345678; +const DRAG_AND_DROP_ENABLED = true; + +const useCatalogItemMoverState = (catalog: { currentType: string, pageId: number, currentOffer: IPurchasableOffer, purchaseOptions: IPurchaseOptions }, buildersClub: { furniCount: number, furniLimit: number, secondsLeft: number }) => +{ + const [ objectMoverRequested, setObjectMoverRequested ] = useState(false); + const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); + const [ purchasableOffer, setPurchaseableOffer ] = useState(null); + const [ placedObjectPurchaseData, setPlacedObjectPurchaseData ] = useState(null); + + const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) => + { + if(!offer) return BuilderFurniPlaceableStatus.MISSING_OFFER; + + if((buildersClub.furniCount < 0) || (buildersClub.furniCount >= buildersClub.furniLimit)) return BuilderFurniPlaceableStatus.FURNI_LIMIT_REACHED; + + const roomSession = GetRoomSession(); + + if(!roomSession) return BuilderFurniPlaceableStatus.NOT_IN_ROOM; + + if(!roomSession.isRoomOwner) return BuilderFurniPlaceableStatus.NOT_ROOM_OWNER; + + if(buildersClub.secondsLeft <= 0) + { + const roomEngine = GetRoomEngine(); + + let objectCount = roomEngine.getRoomObjectCount(roomSession.roomId, RoomObjectCategory.UNIT); + + while(objectCount > 0) + { + const roomObject = roomEngine.getRoomObjectByIndex(roomSession.roomId, objectCount, RoomObjectCategory.UNIT); + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(userData && (userData.type === RoomObjectType.USER) && (userData.roomIndex !== roomSession.ownRoomIndex) && !userData.isModerator) return BuilderFurniPlaceableStatus.VISITORS_IN_ROOM; + + objectCount--; + } + } + + return BuilderFurniPlaceableStatus.OKAY; + }, [ buildersClub.furniCount, buildersClub.furniLimit, buildersClub.secondsLeft ]); + + const isDraggable = useCallback((offer: IPurchasableOffer) => + { + const roomSession = GetRoomSession(); + + if(((DRAG_AND_DROP_ENABLED && roomSession && offer.page && (offer.page.layoutCode !== 'sold_ltd_items') && (catalog.currentType === CatalogType.NORMAL) && (roomSession.isRoomOwner || (roomSession.isGuildRoom && (roomSession.controllerLevel >= RoomControllerLevel.GUILD_MEMBER)))) || ((catalog.currentType === CatalogType.BUILDER) && (getBuilderFurniPlaceableStatus(offer) === BuilderFurniPlaceableStatus.OKAY))) && (offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.product.productType !== ProductTypeEnum.EFFECT) && (offer.product.productType !== ProductTypeEnum.HABBO_CLUB)) return true; + + return false; + }, [ catalog.currentType, getBuilderFurniPlaceableStatus ]); + + const requestOfferToMover = useCallback((offer: IPurchasableOffer) => + { + if(!isDraggable(offer)) return; + + const product = offer.product; + + if(!product) return; + + let category = 0; + + switch(product.productType) + { + case ProductTypeEnum.FLOOR: + category = RoomObjectCategory.FLOOR; + break; + case ProductTypeEnum.WALL: + category = RoomObjectCategory.WALL; + break; + } + + if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.productClassId, product.extraParam)) + { + setPurchaseableOffer(offer); + setObjectMoverRequested(true); + + CreateLinkEvent('catalog/hide'); + } + }, [ isDraggable ]); + + const resetRoomPaint = useCallback((planeType: string, type: string) => + { + const roomEngine = GetRoomEngine(); + + let wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + let floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + let landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + wallType = (wallType && wallType.length) ? wallType : '101'; + floorType = (floorType && floorType.length) ? floorType : '101'; + landscapeType = (landscapeType && landscapeType.length) ? landscapeType : '1.1'; + + switch(planeType) + { + case 'floor': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, type, wallType, landscapeType, true); + return; + case 'wallpaper': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, type, landscapeType, true); + return; + case 'landscape': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, type, true); + return; + default: + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, landscapeType, true); + return; + } + }, []); + + const cancelObjectMover = useCallback(() => + { + if(!purchasableOffer) return; + + GetRoomEngine().cancelRoomObjectInsert(); + + setObjectMoverRequested(false); + setPurchaseableOffer(null); + }, [ purchasableOffer ]); + + const resetObjectMover = useCallback((flag: boolean = true) => + { + setObjectMoverRequested(prevValue => + { + if(prevValue && flag) + { + CreateLinkEvent('catalog/open'); + } + + return false; + }); + }, []); + + const resetPlacedOfferData = useCallback((flag: boolean = false) => + { + if(!flag) resetObjectMover(); + + setPlacedObjectPurchaseData(prevValue => + { + if(prevValue) + { + switch(prevValue.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().removeRoomObjectFloor(prevValue.roomId, prevValue.objectId); + break; + case RoomObjectCategory.WALL: { + + switch(prevValue.furniData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint('reset', ''); + break; + default: + GetRoomEngine().removeRoomObjectWall(prevValue.roomId, prevValue.objectId); + break; + } + break; + } + default: + GetRoomEngine().deleteRoomObject(prevValue.objectId, prevValue.category); + break; + } + } + + return null; + }); + }, [ resetObjectMover, resetRoomPaint ]); + + const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) => + { + if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; + + resetPlacedOfferData(true); + + if(!purchasableOffer) + { + resetObjectMover(); + + return; + } + + let placed = false; + + const product = purchasableOffer.product; + + if(event.category === RoomObjectCategory.WALL) + { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + placed = (event.placedOnFloor || event.placedOnWall); + break; + default: + placed = event.placedInRoom; + break; + } + } + else + { + placed = event.placedInRoom; + } + + if(!placed) + { + resetObjectMover(); + + return; + } + + setPlacedObjectPurchaseData(new PlacedObjectPurchaseData(event.roomId, event.objectId, event.category, event.wallLocation, event.x, event.y, event.direction, purchasableOffer)); + + switch(catalog.currentType) + { + case CatalogType.NORMAL: { + switch(event.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().addFurnitureFloor(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction), 0, new LegacyDataType()); + break; + case RoomObjectCategory.WALL: { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint(product.furnitureData.className, product.extraParam); + break; + default: + GetRoomEngine().addFurnitureWall(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction * 45), 0, event.instanceData, 0); + break; + } + } + } + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); + + SendMessageComposer(new PurchaseFromCatalogComposer(catalog.pageId, purchasableOffer.offerId, product.extraParam, 1)); + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + break; + } + case CatalogType.BUILDER: { + let pageId = purchasableOffer.page.pageId; + + if(pageId === DUMMY_PAGE_ID_FOR_OFFER_SEARCH) + { + pageId = -1; + } + + switch(event.category) + { + case RoomObjectCategory.FLOOR: + SendMessageComposer(new BuildersClubPlaceRoomItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.x, event.y, event.direction)); + break; + case RoomObjectCategory.WALL: + SendMessageComposer(new BuildersClubPlaceWallItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.wallLocation)); + break; + } + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + break; + } + } + }, [ objectMoverRequested, purchasableOffer, catalogPlaceMultipleObjects, catalog, resetPlacedOfferData, resetObjectMover, resetRoomPaint, requestOfferToMover ]); + + UseRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, onRoomEngineObjectPlacedEvent); + + const onInventoryFurniAddedEvent = useCallback((event: InventoryFurniAddedEvent) => + { + const roomEngine = GetRoomEngine(); + + if(!placedObjectPurchaseData || (placedObjectPurchaseData.productClassId !== event.spriteId) || (placedObjectPurchaseData.roomId !== roomEngine.activeRoomId)) return; + + switch(event.category) + { + case FurniCategory.FLOOR: { + const floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + + if(placedObjectPurchaseData.extraParam !== floorType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.WALL_PAPER: { + const wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + + if(placedObjectPurchaseData.extraParam !== wallType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.LANDSCAPE: { + const landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + if(placedObjectPurchaseData.extraParam !== landscapeType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + default: + SendMessageComposer(new FurniturePlaceComposer(event.id, placedObjectPurchaseData.category, placedObjectPurchaseData.wallLocation, placedObjectPurchaseData.x, placedObjectPurchaseData.y, placedObjectPurchaseData.direction)); + } + + if(!catalogPlaceMultipleObjects) resetPlacedOfferData(); + }, [ placedObjectPurchaseData, catalogPlaceMultipleObjects, resetPlacedOfferData ]); + + UseUiEvent(InventoryFurniAddedEvent.FURNI_ADDED, onInventoryFurniAddedEvent); + + return { requestOfferToMover, cancelObjectMover }; +} + +export const useCatalogItemMover = useCatalogItemMoverState; diff --git a/src/hooks/catalog/useCatalogPlaceMultipleItems.ts b/src/hooks/catalog/useCatalogPlaceMultipleItems.ts new file mode 100644 index 00000000..39cfd28c --- /dev/null +++ b/src/hooks/catalog/useCatalogPlaceMultipleItems.ts @@ -0,0 +1,7 @@ +import { useBetween } from 'use-between'; +import { LocalStorageKeys } from '../../api'; +import { useLocalStorage } from '../useLocalStorage'; + +const useCatalogPlaceMultipleItemsState = () => useLocalStorage(LocalStorageKeys.CATALOG_PLACE_MULTIPLE_OBJECTS, false); + +export const useCatalogPlaceMultipleItems = () => useBetween(useCatalogPlaceMultipleItemsState); diff --git a/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts b/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts new file mode 100644 index 00000000..b2d69a2a --- /dev/null +++ b/src/hooks/catalog/useCatalogSkipPurchaseConfirmation.ts @@ -0,0 +1,7 @@ +import { useBetween } from 'use-between'; +import { LocalStorageKeys } from '../../api'; +import { useLocalStorage } from '../useLocalStorage'; + +const useCatalogSkipPurchaseConfirmationState = () => useLocalStorage(LocalStorageKeys.CATALOG_SKIP_PURCHASE_CONFIRMATION, false); + +export const useCatalogSkipPurchaseConfirmation = () => useBetween(useCatalogSkipPurchaseConfirmationState); diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 8713e5db..44d7ec57 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,4 +1,5 @@ export * from './achievements'; +export * from './catalog'; export * from './events'; export * from './events/core'; export * from './events/nitro'; @@ -10,5 +11,6 @@ export * from './navigator'; export * from './purse'; export * from './rooms'; export * from './session'; +export * from './useLocalStorage'; export * from './UseMountEffect'; export * from './useSharedVisibility'; diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 8ce8379d..13d19463 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -4,6 +4,8 @@ import { useBetween } from 'use-between'; import { useInventoryUnseenTracker } from '.'; import { UseMessageEventHook } from '..'; import { addFurnitureItem, attemptItemPlacement, cancelRoomObjectPlacement, CloneObject, CreateLinkEvent, FurnitureItem, getAllItemIds, getPlacingItemId, GroupItem, mergeFurniFragments, SendMessageComposer, UnseenItemCategory } from '../../api'; +import { InventoryFurniAddedEvent } from '../../events'; +import { DispatchUiEvent } from '../events'; import { useSharedVisibility } from '../useSharedVisibility'; let furniMsgFragments: Map[] = null; @@ -73,6 +75,8 @@ const useInventoryFurniState = () => const furniture = new FurnitureItem(item); addFurnitureItem(newValue, furniture, isUnseen(UnseenItemCategory.FURNI, item.itemId)); + + DispatchUiEvent(new InventoryFurniAddedEvent(furniture.id, furniture.type, furniture.category)); } } @@ -148,6 +152,8 @@ const useInventoryFurniState = () => addFurnitureItem(newValue, item, isUnseen(UnseenItemCategory.FURNI, itemId)); + DispatchUiEvent(new InventoryFurniAddedEvent(item.id, item.type, item.category)); + } return newValue; diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts new file mode 100644 index 00000000..e231cc29 --- /dev/null +++ b/src/hooks/useLocalStorage.ts @@ -0,0 +1,43 @@ +import { NitroLogger } from '@nitrots/nitro-renderer'; +import { Dispatch, SetStateAction, useState } from 'react'; + +const useLocalStorageState = (key: string, initialValue: T): [ T, Dispatch>] => +{ + const [ storedValue, setStoredValuie ] = useState(() => + { + if(typeof window === 'undefined') return initialValue; + + try + { + const item = window.localStorage.getItem(key); + + return item ? JSON.parse(item) : initialValue; + } + + catch(error) + { + return initialValue; + } + }); + + const setValue = (value: T) => + { + try + { + const valueToStore = value instanceof Function ? value(storedValue) : value; + + setStoredValuie(valueToStore); + + if(typeof window !== 'undefined') window.localStorage.setItem(key, JSON.stringify(valueToStore)); + } + + catch(error) + { + NitroLogger.error(error); + } + } + + return [ storedValue, setValue ]; +} + +export const useLocalStorage = useLocalStorageState; From c33c3e6004130d9fc208c07c966e3a33add3aafb Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 13:33:19 -0400 Subject: [PATCH 251/331] Update item mover --- src/hooks/catalog/useCatalogItemMover.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/hooks/catalog/useCatalogItemMover.ts b/src/hooks/catalog/useCatalogItemMover.ts index e6b8960d..2df4d140 100644 --- a/src/hooks/catalog/useCatalogItemMover.ts +++ b/src/hooks/catalog/useCatalogItemMover.ts @@ -249,9 +249,18 @@ const useCatalogItemMoverState = (catalog: { currentType: string, pageId: number if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); - SendMessageComposer(new PurchaseFromCatalogComposer(catalog.pageId, purchasableOffer.offerId, product.extraParam, 1)); + if(catalogSkipPurchaseConfirmation) + { + SendMessageComposer(new PurchaseFromCatalogComposer(catalog.pageId, purchasableOffer.offerId, product.extraParam, 1)); - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } + else + { + // confirm + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } break; } case CatalogType.BUILDER: { @@ -276,7 +285,7 @@ const useCatalogItemMoverState = (catalog: { currentType: string, pageId: number break; } } - }, [ objectMoverRequested, purchasableOffer, catalogPlaceMultipleObjects, catalog, resetPlacedOfferData, resetObjectMover, resetRoomPaint, requestOfferToMover ]); + }, [ objectMoverRequested, purchasableOffer, catalogPlaceMultipleObjects, catalogSkipPurchaseConfirmation, catalog, resetPlacedOfferData, resetObjectMover, resetRoomPaint, requestOfferToMover ]); UseRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, onRoomEngineObjectPlacedEvent); From 328ca7b669ffd7c73d632e338c9dcab004171cce Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 13:34:14 -0400 Subject: [PATCH 252/331] Bump renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a15b4ec8..3a1738e8 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.2.2", + "@nitrots/nitro-renderer": "^1.2.3", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index b6ee0612..b9048174 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1450,10 +1450,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.2.2.tgz#9dabba24dc701162cc1f1980aa54d20d72532ef2" - integrity sha512-fIBcBhUp1bQexbh2L77bcmkWDQZ/LwTsy+S7KwNxbIRS5B+WVRqDqsZeTaCcaoB2H+GBYakhah5akVMKeos9Wg== +"@nitrots/nitro-renderer@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.2.3.tgz#692fbec1a8bf3b81af46788be56ace5d393100cf" + integrity sha512-v+tJA6QyTWPbbl/cEtYB3478OkhmB18BKFrGkL7dKIgN97sCQToTvbmfVXyyn3X3k81JIifApSb+vxyXvc0QXA== dependencies: "@pixi/app" "^6.3.0" "@pixi/basis" "^6.3.0" From c45a8030b4e5ca278fe31025995a77334f02a503 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 19:33:23 -0400 Subject: [PATCH 253/331] More catalog changes --- src/components/catalog/CatalogView.tsx | 2 +- .../catalog/views/gift/CatalogGiftView.tsx | 15 +- .../page/common/CatalogGridOfferView.tsx | 5 +- .../pets/CatalogLayoutPetPurchaseView.tsx | 67 --- .../page/layout/pets/CatalogLayoutPetView.tsx | 16 +- .../pets/CatalogPetNameApprovalView.tsx | 68 ---- src/events/catalog/CatalogEvent.ts | 1 - .../CatalogGiftReceiverNotFoundEvent.ts | 9 - src/events/catalog/CatalogNameResultEvent.ts | 26 -- src/events/catalog/CatalogWidgetEvent.ts | 1 - src/events/catalog/index.ts | 2 - src/hooks/catalog/index.ts | 2 - src/hooks/catalog/useCatalog.ts | 383 ++++++++++++++++-- src/hooks/catalog/useCatalogBuildersClub.ts | 54 --- src/hooks/catalog/useCatalogItemMover.ts | 330 --------------- src/hooks/inventory/useInventoryFurni.ts | 2 +- 16 files changed, 382 insertions(+), 601 deletions(-) delete mode 100644 src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx delete mode 100644 src/components/catalog/views/page/layout/pets/CatalogPetNameApprovalView.tsx delete mode 100644 src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts delete mode 100644 src/events/catalog/CatalogNameResultEvent.ts delete mode 100644 src/hooks/catalog/useCatalogBuildersClub.ts delete mode 100644 src/hooks/catalog/useCatalogItemMover.ts diff --git a/src/components/catalog/CatalogView.tsx b/src/components/catalog/CatalogView.tsx index 28b6e8de..3af9b189 100644 --- a/src/components/catalog/CatalogView.tsx +++ b/src/components/catalog/CatalogView.tsx @@ -10,7 +10,7 @@ import { MarketplacePostOfferView } from './views/page/layout/marketplace/Market export const CatalogView: FC<{}> = props => { - const { isVisible = false, setIsVisible = null, rootNode = null, currentPage = null, navigationHidden = false, setNavigationHidden = null, activeNodes = [], searchResult = null, setSearchResult = null, getNodeById = null, openPageByName = null, openPageByOfferId = null, activateNode = null } = useCatalog(); + const { isVisible = false, setIsVisible = null, rootNode = null, currentPage = null, navigationHidden = false, setNavigationHidden = null, activeNodes = [], searchResult = null, setSearchResult = null, openPageByName = null, openPageByOfferId = null, activateNode = null } = useCatalog(); useEffect(() => { diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 0180eaec..74cb4a84 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -1,11 +1,11 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; +import { GiftReceiverNotFoundEvent, PurchaseFromCatalogAsGiftComposer } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetSessionDataManager, LocalizeText, ProductTypeEnum, SendMessageComposer } from '../../../../api'; import { Base, Button, ButtonGroup, Column, Flex, FormGroup, LayoutCurrencyIcon, LayoutFurniImageView, LayoutGiftTagView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { CatalogEvent, CatalogInitGiftEvent, CatalogPurchasedEvent } from '../../../../events'; -import { useCatalog, UseUiEvent } from '../../../../hooks'; +import { useCatalog, UseMessageEventHook, UseUiEvent } from '../../../../hooks'; export const CatalogGiftView: FC<{}> = props => { @@ -58,15 +58,11 @@ export const CatalogGiftView: FC<{}> = props => setExtraData(castedEvent.extraData); setIsVisible(true); return; - case CatalogEvent.GIFT_RECEIVER_NOT_FOUND: - setReceiverNotFound(true); - return; } }, [ close ]); UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogEvent); UseUiEvent(CatalogEvent.INIT_GIFT, onCatalogEvent); - UseUiEvent(CatalogEvent.GIFT_RECEIVER_NOT_FOUND, onCatalogEvent); const isBoxDefault = useMemo(() => { @@ -117,6 +113,13 @@ export const CatalogGiftView: FC<{}> = props => } }, [ extraData, maxBoxIndex, maxRibbonIndex, message, offerId, pageId, receiverName, selectedBoxIndex, selectedColorId, selectedRibbonIndex, showMyFace ]); + const onGiftReceiverNotFoundEvent = useCallback(() => + { + setReceiverNotFound(true); + }, []); + + UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); + useEffect(() => { setReceiverNotFound(false); diff --git a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx index 79d79d38..507bb6c7 100644 --- a/src/components/catalog/views/page/common/CatalogGridOfferView.tsx +++ b/src/components/catalog/views/page/common/CatalogGridOfferView.tsx @@ -2,7 +2,7 @@ import { MouseEventType } from '@nitrots/nitro-renderer'; import { FC, MouseEvent, useMemo, useState } from 'react'; import { IPurchasableOffer, Offer, ProductTypeEnum } from '../../../../../api'; import { LayoutAvatarImageView, LayoutGridItem, LayoutGridItemProps } from '../../../../../common'; -import { useCatalog } from '../../../../../hooks'; +import { useCatalog, useInventoryFurni } from '../../../../../hooks'; interface CatalogGridOfferViewProps extends LayoutGridItemProps { @@ -15,6 +15,7 @@ export const CatalogGridOfferView: FC = props => const { offer = null, selectOffer = null, itemActive = false, ...rest } = props; const [ isMouseDown, setMouseDown ] = useState(false); const { requestOfferToMover = null } = useCatalog(); + const { isVisible = false } = useInventoryFurni(); const iconUrl = useMemo(() => { @@ -38,7 +39,7 @@ export const CatalogGridOfferView: FC = props => setMouseDown(false); return; case MouseEventType.ROLL_OUT: - if(!isMouseDown || !itemActive) return; + if(!isMouseDown || !itemActive || !isVisible) return; requestOfferToMover(offer); return; diff --git a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx deleted file mode 100644 index 694b8e26..00000000 --- a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetPurchaseView.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { ApproveNameMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { IPurchasableOffer, LocalizeText, Offer, SendMessageComposer } from '../../../../../../api'; -import { Column, Flex, LayoutCurrencyIcon, Text } from '../../../../../../common'; -import { CatalogPurchasedEvent } from '../../../../../../events'; -import { UseUiEvent } from '../../../../../../hooks'; -import { CatalogPurchaseWidgetView } from '../../widgets/CatalogPurchaseWidgetView'; -import { CatalogPetNameApprovalView } from './CatalogPetNameApprovalView'; - -export interface CatalogLayoutPetPurchaseViewProps -{ - offer: IPurchasableOffer; - pageId: number; - extra?: string; -} - -export const CatalogLayoutPetPurchaseView: FC = props => -{ - const { offer = null, pageId = -1, extra = '' } = props; - const [ petNameValue, setPetNameValue ] = useState(''); - const [ nameApproved, setNameApproved ] = useState(false); - - const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => - { - setNameApproved(false); - }, []); - - UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); - - const beforePurchase = useCallback(() => - { - SendMessageComposer(new ApproveNameMessageComposer(petNameValue, 1)); - }, [ petNameValue ]); - - const extraData = `${ petNameValue }\n${ extra }`; - - return ( - -
    - -
    - -
    - { LocalizeText('catalog.bundlewidget.price') } -
    - - { ((offer.priceType === Offer.PRICE_TYPE_CREDITS_ACTIVITYPOINTS) || (offer.priceType === Offer.PRICE_TYPE_CREDITS)) && - - { offer.priceInCredits } - - } - { ((offer.priceType === Offer.PRICE_TYPE_CREDITS_ACTIVITYPOINTS) || (offer.priceType === Offer.PRICE_TYPE_ACTIVITYPOINTS)) && - - { offer.priceInActivityPoints } - - } - -
    - - - { /* - { offer.giftable && - } */ } - -
    - ); -} diff --git a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx index b0f23bd7..39d0c95e 100644 --- a/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx +++ b/src/components/catalog/views/page/layout/pets/CatalogLayoutPetView.tsx @@ -1,10 +1,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { ApproveNameMessageComposer, ColorConverter, GetSellablePetPalettesComposer, PurchaseFromCatalogComposer, SellablePetPaletteData } from '@nitrots/nitro-renderer'; +import { ApproveNameMessageComposer, ApproveNameMessageEvent, ColorConverter, GetSellablePetPalettesComposer, PurchaseFromCatalogComposer, SellablePetPaletteData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { GetPetAvailableColors, GetPetIndexFromLocalization, LocalizeText, SendMessageComposer } from '../../../../../../api'; import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, LayoutPetImageView, Text } from '../../../../../../common'; -import { CatalogNameResultEvent, CatalogPurchaseFailureEvent, CatalogWidgetEvent } from '../../../../../../events'; -import { DispatchUiEvent, useCatalog, UseUiEvent } from '../../../../../../hooks'; +import { CatalogPurchaseFailureEvent } from '../../../../../../events'; +import { DispatchUiEvent, useCatalog, UseMessageEventHook } from '../../../../../../hooks'; import { CatalogAddOnBadgeWidgetView } from '../../widgets/CatalogAddOnBadgeWidgetView'; import { CatalogPurchaseWidgetView } from '../../widgets/CatalogPurchaseWidgetView'; import { CatalogTotalPriceWidget } from '../../widgets/CatalogTotalPriceWidget'; @@ -104,15 +104,17 @@ export const CatalogLayoutPetView: FC = props => } }, [ page, currentOffer, petName, petPurchaseString, approvalResult ]); - const onCatalogNameResultEvent = useCallback((event: CatalogNameResultEvent) => + const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => { - setApprovalResult(event.result); + const parser = event.getParser(); - if(event.result === 0) purchasePet(); + setApprovalResult(parser.result); + + if(parser.result === 0) purchasePet(); else DispatchUiEvent(new CatalogPurchaseFailureEvent(-1)); }, [ purchasePet ]); - UseUiEvent(CatalogWidgetEvent.APPROVE_RESULT, onCatalogNameResultEvent); + UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); useEffect(() => { diff --git a/src/components/catalog/views/page/layout/pets/CatalogPetNameApprovalView.tsx b/src/components/catalog/views/page/layout/pets/CatalogPetNameApprovalView.tsx deleted file mode 100644 index ca22262d..00000000 --- a/src/components/catalog/views/page/layout/pets/CatalogPetNameApprovalView.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../../../api'; -import { CatalogEvent, CatalogNameResultEvent } from '../../../../../../events'; -import { UseUiEvent } from '../../../../../../hooks'; - -export interface CatalogPetNameApprovalViewProps -{ - petNameValue: string; - setPetNameValue: Dispatch>; - nameApproved: boolean; - setNameApproved: Dispatch>; -} - -export const CatalogPetNameApprovalView: FC = props => -{ - const { petNameValue = null, setPetNameValue = null, nameApproved = false, setNameApproved = null } = props; - const [ validationResult, setValidationResult ] = useState(-1); - - const onCatalogNameResultEvent = useCallback((event: CatalogNameResultEvent) => - { - if(event.result === 0) - { - setNameApproved(true); - - return; - } - - setValidationResult(event.result); - }, [ setNameApproved ]); - - UseUiEvent(CatalogEvent.APPROVE_NAME_RESULT, onCatalogNameResultEvent); - - const validationErrorMessage = () => - { - let key: string = ''; - - switch(validationResult) - { - case 1: - key = 'catalog.alert.petname.long'; - break; - case 2: - key = 'catalog.alert.petname.short'; - break; - case 3: - key = 'catalog.alert.petname.chars'; - break; - case 4: - key = 'catalog.alert.petname.bobba'; - break; - } - - return LocalizeText(key); - } - - useEffect(() => - { - setValidationResult(-1); - }, [ petNameValue ]); - - return ( -
    - 0) ? 'is-invalid ' : '') } placeholder={ LocalizeText('widgets.petpackage.name.title') } value={ petNameValue } onChange={ event => setPetNameValue(event.target.value) } /> - { (validationResult > 0) && -
    { validationErrorMessage }
    } -
    - ); -} diff --git a/src/events/catalog/CatalogEvent.ts b/src/events/catalog/CatalogEvent.ts index 58ef7b7b..893775a5 100644 --- a/src/events/catalog/CatalogEvent.ts +++ b/src/events/catalog/CatalogEvent.ts @@ -7,7 +7,6 @@ export class CatalogEvent extends NitroEvent public static TOGGLE_CATALOG: string = 'CE_TOGGLE_CATALOG'; public static SOLD_OUT: string = 'CE_SOLD_OUT'; public static APPROVE_NAME_RESULT: string = 'CE_APPROVE_NAME_RESULT'; - public static GIFT_RECEIVER_NOT_FOUND: string = 'CE_GIFT_RECEIVER_NOT_FOUND'; public static PURCHASE_APPROVED: string = 'CE_PURCHASE_APPROVED'; public static INIT_GIFT: string = 'CE_INIT_GIFT'; public static CATALOG_RESET: string = 'CE_RESET'; diff --git a/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts b/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts deleted file mode 100644 index 611eaff7..00000000 --- a/src/events/catalog/CatalogGiftReceiverNotFoundEvent.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { CatalogEvent } from './CatalogEvent'; - -export class CatalogGiftReceiverNotFoundEvent extends CatalogEvent -{ - constructor() - { - super(CatalogEvent.GIFT_RECEIVER_NOT_FOUND); - } -} diff --git a/src/events/catalog/CatalogNameResultEvent.ts b/src/events/catalog/CatalogNameResultEvent.ts deleted file mode 100644 index 70e4c0ec..00000000 --- a/src/events/catalog/CatalogNameResultEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NitroEvent } from '@nitrots/nitro-renderer'; -import { CatalogWidgetEvent } from './CatalogWidgetEvent'; - -export class CatalogNameResultEvent extends NitroEvent -{ - private _result: number; - private _validationInfo: string; - - constructor(result: number, validationInfo: string) - { - super(CatalogWidgetEvent.APPROVE_RESULT); - - this._result = result; - this._validationInfo = validationInfo; - } - - public get result(): number - { - return this._result; - } - - public get validationInfo(): string - { - return this._validationInfo; - } -} diff --git a/src/events/catalog/CatalogWidgetEvent.ts b/src/events/catalog/CatalogWidgetEvent.ts index 9f3f5a41..fd0e6026 100644 --- a/src/events/catalog/CatalogWidgetEvent.ts +++ b/src/events/catalog/CatalogWidgetEvent.ts @@ -11,7 +11,6 @@ export class CatalogWidgetEvent extends NitroEvent public static COLOUR_INDEX: string = 'CWE_COLOUR_INDEX'; public static TEXT_INPUT: string = 'CWE_TEXT_INPUT'; public static DROPMENU_SELECT: string = 'CWE_CWE_DROPMENU_SELECT'; - public static APPROVE_RESULT: string = 'CWE_CWE_APPROVE_RESULT'; public static PURCHASE_OVERRIDE: string = 'CWE_PURCHASE_OVERRIDE'; public static SELLABLE_PET_PALETTES: string = 'CWE_SELLABLE_PET_PALETTES'; public static UPDATE_ROOM_PREVIEW: string = 'CWE_UPDATE_ROOM_PREVIEW'; diff --git a/src/events/catalog/index.ts b/src/events/catalog/index.ts index d8bc3f33..a7c15725 100644 --- a/src/events/catalog/index.ts +++ b/src/events/catalog/index.ts @@ -1,7 +1,5 @@ export * from './CatalogEvent'; -export * from './CatalogGiftReceiverNotFoundEvent'; export * from './CatalogInitGiftEvent'; -export * from './CatalogNameResultEvent'; export * from './CatalogPostMarketplaceOfferEvent'; export * from './CatalogPurchasedEvent'; export * from './CatalogPurchaseFailureEvent'; diff --git a/src/hooks/catalog/index.ts b/src/hooks/catalog/index.ts index 9798d048..75d29849 100644 --- a/src/hooks/catalog/index.ts +++ b/src/hooks/catalog/index.ts @@ -1,5 +1,3 @@ export * from './useCatalog'; -export * from './useCatalogBuildersClub'; -export * from './useCatalogItemMover'; export * from './useCatalogPlaceMultipleItems'; export * from './useCatalogSkipPurchaseConfirmation'; diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts index ca2d4701..2e90d17a 100644 --- a/src/hooks/catalog/useCatalog.ts +++ b/src/hooks/catalog/useCatalog.ts @@ -1,12 +1,15 @@ -import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, FrontPageItem, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, GuildMembershipsMessageEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomPreviewer, SellablePetPalettesMessageEvent } from '@nitrots/nitro-renderer'; +import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetClubGiftInfo, GetGiftWrappingConfigurationComposer, GiftWrappingConfigurationEvent, GuildMembershipsMessageEvent, HabboClubOffersMessageEvent, LegacyDataType, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomControllerLevel, RoomEngineObjectPlacedEvent, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType, RoomObjectVariable, RoomPreviewer, SellablePetPalettesMessageEvent, Vector3d } from '@nitrots/nitro-renderer'; import { useCallback, useEffect, useRef, useState } from 'react'; import { useBetween } from 'use-between'; -import { CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, GetFurnitureData, GetProductDataForLocalization, GetRoomEngine, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, NotificationUtilities, Offer, PageLocalization, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; -import { CatalogGiftReceiverNotFoundEvent, CatalogNameResultEvent, CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent } from '../../events'; -import { DispatchUiEvent, UseUiEvent } from '../events'; +import { BuilderFurniPlaceableStatus, CatalogNode, CatalogPage, CatalogPetPalette, CatalogType, CreateLinkEvent, FurniCategory, GetFurnitureData, GetNitroInstance, GetProductDataForLocalization, GetRoomEngine, GetRoomSession, GiftWrappingConfiguration, ICatalogNode, ICatalogOptions, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, NotificationUtilities, Offer, PageLocalization, PlacedObjectPurchaseData, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api'; +import { CatalogPurchasedEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogPurchaseSoldOutEvent, InventoryFurniAddedEvent } from '../../events'; +import { DispatchUiEvent, UseRoomEngineEvent, UseUiEvent } from '../events'; import { UseMessageEventHook } from '../messages'; -import { useCatalogBuildersClub } from './useCatalogBuildersClub'; -import { useCatalogItemMover } from './useCatalogItemMover'; +import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; +import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; + +const DUMMY_PAGE_ID_FOR_OFFER_SEARCH = -12345678; +const DRAG_AND_DROP_ENABLED = true; const useCatalogState = () => { @@ -26,8 +29,17 @@ const useCatalogState = () => const [ navigationHidden, setNavigationHidden ] = useState(false); const [ purchaseOptions, setPurchaseOptions ] = useState({ quantity: 1, extraData: null, extraParamRequired: false, previewStuffData: null }); const [ catalogOptions, setCatalogOptions ] = useState({}); - const { furniCount = 0, furniLimit = 0, secondsLeft = 0 } = useCatalogBuildersClub(); - const { requestOfferToMover = null, cancelObjectMover = null } = useCatalogItemMover({ currentType, pageId, currentOffer, purchaseOptions }, { furniCount, furniLimit, secondsLeft }); + const [ objectMoverRequested, setObjectMoverRequested ] = useState(false); + const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); + const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); + const [ purchasableOffer, setPurchaseableOffer ] = useState(null); + const [ placedObjectPurchaseData, setPlacedObjectPurchaseData ] = useState(null); + const [ furniCount, setFurniCount ] = useState(0); + const [ furniLimit, setFurniLimit ] = useState(0); + const [ maxFurniLimit, setMaxFurniLimit ] = useState(0); + const [ secondsLeft, setSecondsLeft ] = useState(0); + const [ updateTime, setUpdateTime ] = useState(0); + const [ secondsLeftWithGrace, setSecondsLeftWithGrace ] = useState(0); const requestedPage = useRef(new RequestedPage()); const resetState = useCallback(() => @@ -44,6 +56,166 @@ const useCatalogState = () => setIsVisible(false); }, []); + const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) => + { + if(!offer) return BuilderFurniPlaceableStatus.MISSING_OFFER; + + if((furniCount < 0) || (furniCount >= furniLimit)) return BuilderFurniPlaceableStatus.FURNI_LIMIT_REACHED; + + const roomSession = GetRoomSession(); + + if(!roomSession) return BuilderFurniPlaceableStatus.NOT_IN_ROOM; + + if(!roomSession.isRoomOwner) return BuilderFurniPlaceableStatus.NOT_ROOM_OWNER; + + if(secondsLeft <= 0) + { + const roomEngine = GetRoomEngine(); + + let objectCount = roomEngine.getRoomObjectCount(roomSession.roomId, RoomObjectCategory.UNIT); + + while(objectCount > 0) + { + const roomObject = roomEngine.getRoomObjectByIndex(roomSession.roomId, objectCount, RoomObjectCategory.UNIT); + const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); + + if(userData && (userData.type === RoomObjectType.USER) && (userData.roomIndex !== roomSession.ownRoomIndex) && !userData.isModerator) return BuilderFurniPlaceableStatus.VISITORS_IN_ROOM; + + objectCount--; + } + } + + return BuilderFurniPlaceableStatus.OKAY; + }, [ furniCount, furniLimit, secondsLeft ]); + + const isDraggable = useCallback((offer: IPurchasableOffer) => + { + const roomSession = GetRoomSession(); + + if(((DRAG_AND_DROP_ENABLED && roomSession && offer.page && (offer.page.layoutCode !== 'sold_ltd_items') && (currentType === CatalogType.NORMAL) && (roomSession.isRoomOwner || (roomSession.isGuildRoom && (roomSession.controllerLevel >= RoomControllerLevel.GUILD_MEMBER)))) || ((currentType === CatalogType.BUILDER) && (getBuilderFurniPlaceableStatus(offer) === BuilderFurniPlaceableStatus.OKAY))) && (offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.product.productType !== ProductTypeEnum.EFFECT) && (offer.product.productType !== ProductTypeEnum.HABBO_CLUB)) return true; + + return false; + }, [ currentType, getBuilderFurniPlaceableStatus ]); + + const requestOfferToMover = useCallback((offer: IPurchasableOffer) => + { + if(!isDraggable(offer)) return; + + const product = offer.product; + + if(!product) return; + + let category = 0; + + switch(product.productType) + { + case ProductTypeEnum.FLOOR: + category = RoomObjectCategory.FLOOR; + break; + case ProductTypeEnum.WALL: + category = RoomObjectCategory.WALL; + break; + } + + if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.productClassId, product.extraParam)) + { + setPurchaseableOffer(offer); + setObjectMoverRequested(true); + + setIsVisible(false); + } + }, [ isDraggable ]); + + const resetRoomPaint = useCallback((planeType: string, type: string) => + { + const roomEngine = GetRoomEngine(); + + let wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + let floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + let landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + wallType = (wallType && wallType.length) ? wallType : '101'; + floorType = (floorType && floorType.length) ? floorType : '101'; + landscapeType = (landscapeType && landscapeType.length) ? landscapeType : '1.1'; + + switch(planeType) + { + case 'floor': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, type, wallType, landscapeType, true); + return; + case 'wallpaper': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, type, landscapeType, true); + return; + case 'landscape': + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, type, true); + return; + default: + roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, landscapeType, true); + return; + } + }, []); + + const cancelObjectMover = useCallback(() => + { + if(!purchasableOffer) return; + + GetRoomEngine().cancelRoomObjectInsert(); + + setObjectMoverRequested(false); + setPurchaseableOffer(null); + }, [ purchasableOffer ]); + + const resetObjectMover = useCallback((flag: boolean = true) => + { + setObjectMoverRequested(prevValue => + { + if(prevValue && flag) + { + CreateLinkEvent('catalog/open'); + } + + return false; + }); + }, []); + + const resetPlacedOfferData = useCallback((flag: boolean = false) => + { + if(!flag) resetObjectMover(); + + setPlacedObjectPurchaseData(prevValue => + { + if(prevValue) + { + switch(prevValue.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().removeRoomObjectFloor(prevValue.roomId, prevValue.objectId); + break; + case RoomObjectCategory.WALL: { + + switch(prevValue.furniData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint('reset', ''); + break; + default: + GetRoomEngine().removeRoomObjectWall(prevValue.roomId, prevValue.objectId); + break; + } + break; + } + default: + GetRoomEngine().deleteRoomObject(prevValue.objectId, prevValue.category); + break; + } + } + + return null; + }); + }, [ resetObjectMover, resetRoomPaint ]); + const getNodeById = useCallback((id: number, node: ICatalogNode) => { if((node.pageId === id) && (node !== rootNode)) return node; @@ -238,6 +410,11 @@ const useCatalogState = () => } }, [ isVisible, getNodesByOfferId, activateNode ]); + const refreshBuilderStatus = useCallback(() => + { + + }, []); + const onCatalogPagesListEvent = useCallback((event: CatalogPagesListEvent) => { const parser = event.getParser(); @@ -421,22 +598,6 @@ const useCatalogState = () => UseMessageEventHook(SellablePetPalettesMessageEvent, onSellablePetPalettesMessageEvent); - const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) => - { - const parser = event.getParser(); - - DispatchUiEvent(new CatalogNameResultEvent(parser.result, parser.validationInfo)); - }, []); - - UseMessageEventHook(ApproveNameMessageEvent, onApproveNameMessageEvent); - - const onGiftReceiverNotFoundEvent = useCallback(() => - { - DispatchUiEvent(new CatalogGiftReceiverNotFoundEvent()); - }, []); - - UseMessageEventHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent); - const onHabboClubOffersMessageEvent = useCallback((event: HabboClubOffersMessageEvent) => { const parser = event.getParser(); @@ -527,6 +688,32 @@ const useCatalogState = () => UseMessageEventHook(CatalogPublishedMessageEvent, onCatalogPublishedMessageEvent); + const onBuildersClubFurniCountMessageEvent = useCallback((event: BuildersClubFurniCountMessageEvent) => + { + const parser = event.getParser(); + + setFurniCount(parser.furniCount); + + refreshBuilderStatus(); + }, [ refreshBuilderStatus ]); + + UseMessageEventHook(BuildersClubFurniCountMessageEvent, onBuildersClubFurniCountMessageEvent); + + const onBuildersClubSubscriptionStatusMessageEvent = useCallback((event: BuildersClubSubscriptionStatusMessageEvent) => + { + const parser = event.getParser(); + + setFurniLimit(parser._Str_15864); + setMaxFurniLimit(parser._Str_24094); + setSecondsLeft(parser._Str_3709); + setUpdateTime(GetNitroInstance().time); + setSecondsLeftWithGrace(parser._Str_24379); + + refreshBuilderStatus(); + }, [ refreshBuilderStatus ]); + + UseMessageEventHook(BuildersClubSubscriptionStatusMessageEvent, onBuildersClubSubscriptionStatusMessageEvent); + const onCatalogPurchasedEvent = useCallback((event: CatalogPurchasedEvent) => { PlaySound(SoundNames.CREDITS); @@ -534,6 +721,153 @@ const useCatalogState = () => UseUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogPurchasedEvent); + const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) => + { + if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; + + resetPlacedOfferData(true); + + if(!purchasableOffer) + { + resetObjectMover(); + + return; + } + + let placed = false; + + const product = purchasableOffer.product; + + if(event.category === RoomObjectCategory.WALL) + { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + placed = (event.placedOnFloor || event.placedOnWall); + break; + default: + placed = event.placedInRoom; + break; + } + } + else + { + placed = event.placedInRoom; + } + + if(!placed) + { + resetObjectMover(); + + return; + } + + setPlacedObjectPurchaseData(new PlacedObjectPurchaseData(event.roomId, event.objectId, event.category, event.wallLocation, event.x, event.y, event.direction, purchasableOffer)); + + switch(currentType) + { + case CatalogType.NORMAL: { + switch(event.category) + { + case RoomObjectCategory.FLOOR: + GetRoomEngine().addFurnitureFloor(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction), 0, new LegacyDataType()); + break; + case RoomObjectCategory.WALL: { + switch(product.furnitureData.className) + { + case 'floor': + case 'wallpaper': + case 'landscape': + resetRoomPaint(product.furnitureData.className, product.extraParam); + break; + default: + GetRoomEngine().addFurnitureWall(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction * 45), 0, event.instanceData, 0); + break; + } + } + } + + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); + + if(catalogSkipPurchaseConfirmation) + { + SendMessageComposer(new PurchaseFromCatalogComposer(pageId, purchasableOffer.offerId, product.extraParam, 1)); + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } + else + { + // confirm + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + } + break; + } + case CatalogType.BUILDER: { + let pageId = purchasableOffer.page.pageId; + + if(pageId === DUMMY_PAGE_ID_FOR_OFFER_SEARCH) + { + pageId = -1; + } + + switch(event.category) + { + case RoomObjectCategory.FLOOR: + SendMessageComposer(new BuildersClubPlaceRoomItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.x, event.y, event.direction)); + break; + case RoomObjectCategory.WALL: + SendMessageComposer(new BuildersClubPlaceWallItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.wallLocation)); + break; + } + + if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); + break; + } + } + }, [ objectMoverRequested, purchasableOffer, catalogPlaceMultipleObjects, catalogSkipPurchaseConfirmation, currentType, pageId, resetPlacedOfferData, resetObjectMover, resetRoomPaint, requestOfferToMover ]); + + UseRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, onRoomEngineObjectPlacedEvent); + + const onInventoryFurniAddedEvent = useCallback((event: InventoryFurniAddedEvent) => + { + const roomEngine = GetRoomEngine(); + + if(!placedObjectPurchaseData || (placedObjectPurchaseData.productClassId !== event.spriteId) || (placedObjectPurchaseData.roomId !== roomEngine.activeRoomId)) return; + + switch(event.category) + { + case FurniCategory.FLOOR: { + const floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); + + if(placedObjectPurchaseData.extraParam !== floorType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.WALL_PAPER: { + const wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); + + if(placedObjectPurchaseData.extraParam !== wallType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + case FurniCategory.LANDSCAPE: { + const landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); + + if(placedObjectPurchaseData.extraParam !== landscapeType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); + break; + } + default: + SendMessageComposer(new FurniturePlaceComposer(event.id, placedObjectPurchaseData.category, placedObjectPurchaseData.wallLocation, placedObjectPurchaseData.x, placedObjectPurchaseData.y, placedObjectPurchaseData.direction)); + } + + if(!catalogPlaceMultipleObjects) resetPlacedOfferData(); + }, [ placedObjectPurchaseData, catalogPlaceMultipleObjects, resetPlacedOfferData ]); + + UseUiEvent(InventoryFurniAddedEvent.FURNI_ADDED, onInventoryFurniAddedEvent); + useEffect(() => { return () => setCurrentOffer(null); @@ -588,6 +922,7 @@ const useCatalogState = () => SendMessageComposer(new GetGiftWrappingConfigurationComposer()); SendMessageComposer(new GetClubGiftInfo()); SendMessageComposer(new GetCatalogIndexComposer(currentType)); + SendMessageComposer(new BuildersClubQueryFurniCountMessageComposer()); }, [ isVisible, rootNode, currentType ]); useEffect(() => diff --git a/src/hooks/catalog/useCatalogBuildersClub.ts b/src/hooks/catalog/useCatalogBuildersClub.ts deleted file mode 100644 index 538277a1..00000000 --- a/src/hooks/catalog/useCatalogBuildersClub.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { BuildersClubFurniCountMessageEvent, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent } from '@nitrots/nitro-renderer'; -import { useCallback, useEffect, useState } from 'react'; -import { GetNitroInstance, SendMessageComposer } from '../../api'; -import { UseMessageEventHook } from '../messages'; - -const useCatalogBuildersClubState = () => -{ - const [ furniCount, setFurniCount ] = useState(0); - const [ furniLimit, setFurniLimit ] = useState(0); - const [ maxFurniLimit, setMaxFurniLimit ] = useState(0); - const [ secondsLeft, setSecondsLeft ] = useState(0); - const [ updateTime, setUpdateTime ] = useState(0); - const [ secondsLeftWithGrace, setSecondsLeftWithGrace ] = useState(0); - - const refreshBuilderStatus = useCallback(() => - { - - }, []); - - const onBuildersClubFurniCountMessageEvent = useCallback((event: BuildersClubFurniCountMessageEvent) => - { - const parser = event.getParser(); - - setFurniCount(parser.furniCount); - - refreshBuilderStatus(); - }, [ refreshBuilderStatus ]); - - UseMessageEventHook(BuildersClubFurniCountMessageEvent, onBuildersClubFurniCountMessageEvent); - - const onBuildersClubSubscriptionStatusMessageEvent = useCallback((event: BuildersClubSubscriptionStatusMessageEvent) => - { - const parser = event.getParser(); - - setFurniLimit(parser._Str_15864); - setMaxFurniLimit(parser._Str_24094); - setSecondsLeft(parser._Str_3709); - setUpdateTime(GetNitroInstance().time); - setSecondsLeftWithGrace(parser._Str_24379); - - refreshBuilderStatus(); - }, [ refreshBuilderStatus ]); - - UseMessageEventHook(BuildersClubSubscriptionStatusMessageEvent, onBuildersClubSubscriptionStatusMessageEvent); - - useEffect(() => - { - SendMessageComposer(new BuildersClubQueryFurniCountMessageComposer()); - }, []); - - return { furniCount, furniLimit, maxFurniLimit, secondsLeft, updateTime, secondsLeftWithGrace }; -} - -export const useCatalogBuildersClub = useCatalogBuildersClubState; diff --git a/src/hooks/catalog/useCatalogItemMover.ts b/src/hooks/catalog/useCatalogItemMover.ts deleted file mode 100644 index 2df4d140..00000000 --- a/src/hooks/catalog/useCatalogItemMover.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, FurniturePlaceComposer, FurniturePlacePaintComposer, LegacyDataType, PurchaseFromCatalogComposer, RoomControllerLevel, RoomEngineObjectPlacedEvent, RoomObjectCategory, RoomObjectPlacementSource, RoomObjectType, RoomObjectVariable, Vector3d } from '@nitrots/nitro-renderer'; -import { useCallback, useState } from 'react'; -import { BuilderFurniPlaceableStatus, CatalogType, CreateLinkEvent, FurniCategory, GetRoomEngine, GetRoomSession, IPurchasableOffer, IPurchaseOptions, Offer, PlacedObjectPurchaseData, ProductTypeEnum, SendMessageComposer } from '../../api'; -import { InventoryFurniAddedEvent } from '../../events'; -import { UseRoomEngineEvent, UseUiEvent } from '../events'; -import { useCatalogPlaceMultipleItems } from './useCatalogPlaceMultipleItems'; -import { useCatalogSkipPurchaseConfirmation } from './useCatalogSkipPurchaseConfirmation'; - -const DUMMY_PAGE_ID_FOR_OFFER_SEARCH = -12345678; -const DRAG_AND_DROP_ENABLED = true; - -const useCatalogItemMoverState = (catalog: { currentType: string, pageId: number, currentOffer: IPurchasableOffer, purchaseOptions: IPurchaseOptions }, buildersClub: { furniCount: number, furniLimit: number, secondsLeft: number }) => -{ - const [ objectMoverRequested, setObjectMoverRequested ] = useState(false); - const [ catalogPlaceMultipleObjects, setCatalogPlaceMultipleObjects ] = useCatalogPlaceMultipleItems(); - const [ catalogSkipPurchaseConfirmation, setCatalogSkipPurchaseConfirmation ] = useCatalogSkipPurchaseConfirmation(); - const [ purchasableOffer, setPurchaseableOffer ] = useState(null); - const [ placedObjectPurchaseData, setPlacedObjectPurchaseData ] = useState(null); - - const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) => - { - if(!offer) return BuilderFurniPlaceableStatus.MISSING_OFFER; - - if((buildersClub.furniCount < 0) || (buildersClub.furniCount >= buildersClub.furniLimit)) return BuilderFurniPlaceableStatus.FURNI_LIMIT_REACHED; - - const roomSession = GetRoomSession(); - - if(!roomSession) return BuilderFurniPlaceableStatus.NOT_IN_ROOM; - - if(!roomSession.isRoomOwner) return BuilderFurniPlaceableStatus.NOT_ROOM_OWNER; - - if(buildersClub.secondsLeft <= 0) - { - const roomEngine = GetRoomEngine(); - - let objectCount = roomEngine.getRoomObjectCount(roomSession.roomId, RoomObjectCategory.UNIT); - - while(objectCount > 0) - { - const roomObject = roomEngine.getRoomObjectByIndex(roomSession.roomId, objectCount, RoomObjectCategory.UNIT); - const userData = roomSession.userDataManager.getUserDataByIndex(roomObject.id); - - if(userData && (userData.type === RoomObjectType.USER) && (userData.roomIndex !== roomSession.ownRoomIndex) && !userData.isModerator) return BuilderFurniPlaceableStatus.VISITORS_IN_ROOM; - - objectCount--; - } - } - - return BuilderFurniPlaceableStatus.OKAY; - }, [ buildersClub.furniCount, buildersClub.furniLimit, buildersClub.secondsLeft ]); - - const isDraggable = useCallback((offer: IPurchasableOffer) => - { - const roomSession = GetRoomSession(); - - if(((DRAG_AND_DROP_ENABLED && roomSession && offer.page && (offer.page.layoutCode !== 'sold_ltd_items') && (catalog.currentType === CatalogType.NORMAL) && (roomSession.isRoomOwner || (roomSession.isGuildRoom && (roomSession.controllerLevel >= RoomControllerLevel.GUILD_MEMBER)))) || ((catalog.currentType === CatalogType.BUILDER) && (getBuilderFurniPlaceableStatus(offer) === BuilderFurniPlaceableStatus.OKAY))) && (offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.product.productType !== ProductTypeEnum.EFFECT) && (offer.product.productType !== ProductTypeEnum.HABBO_CLUB)) return true; - - return false; - }, [ catalog.currentType, getBuilderFurniPlaceableStatus ]); - - const requestOfferToMover = useCallback((offer: IPurchasableOffer) => - { - if(!isDraggable(offer)) return; - - const product = offer.product; - - if(!product) return; - - let category = 0; - - switch(product.productType) - { - case ProductTypeEnum.FLOOR: - category = RoomObjectCategory.FLOOR; - break; - case ProductTypeEnum.WALL: - category = RoomObjectCategory.WALL; - break; - } - - if(GetRoomEngine().processRoomObjectPlacement(RoomObjectPlacementSource.CATALOG, -(offer.offerId), category, product.productClassId, product.extraParam)) - { - setPurchaseableOffer(offer); - setObjectMoverRequested(true); - - CreateLinkEvent('catalog/hide'); - } - }, [ isDraggable ]); - - const resetRoomPaint = useCallback((planeType: string, type: string) => - { - const roomEngine = GetRoomEngine(); - - let wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); - let floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); - let landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); - - wallType = (wallType && wallType.length) ? wallType : '101'; - floorType = (floorType && floorType.length) ? floorType : '101'; - landscapeType = (landscapeType && landscapeType.length) ? landscapeType : '1.1'; - - switch(planeType) - { - case 'floor': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, type, wallType, landscapeType, true); - return; - case 'wallpaper': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, type, landscapeType, true); - return; - case 'landscape': - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, type, true); - return; - default: - roomEngine.updateRoomInstancePlaneType(roomEngine.activeRoomId, floorType, wallType, landscapeType, true); - return; - } - }, []); - - const cancelObjectMover = useCallback(() => - { - if(!purchasableOffer) return; - - GetRoomEngine().cancelRoomObjectInsert(); - - setObjectMoverRequested(false); - setPurchaseableOffer(null); - }, [ purchasableOffer ]); - - const resetObjectMover = useCallback((flag: boolean = true) => - { - setObjectMoverRequested(prevValue => - { - if(prevValue && flag) - { - CreateLinkEvent('catalog/open'); - } - - return false; - }); - }, []); - - const resetPlacedOfferData = useCallback((flag: boolean = false) => - { - if(!flag) resetObjectMover(); - - setPlacedObjectPurchaseData(prevValue => - { - if(prevValue) - { - switch(prevValue.category) - { - case RoomObjectCategory.FLOOR: - GetRoomEngine().removeRoomObjectFloor(prevValue.roomId, prevValue.objectId); - break; - case RoomObjectCategory.WALL: { - - switch(prevValue.furniData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - resetRoomPaint('reset', ''); - break; - default: - GetRoomEngine().removeRoomObjectWall(prevValue.roomId, prevValue.objectId); - break; - } - break; - } - default: - GetRoomEngine().deleteRoomObject(prevValue.objectId, prevValue.category); - break; - } - } - - return null; - }); - }, [ resetObjectMover, resetRoomPaint ]); - - const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) => - { - if(!objectMoverRequested || (event.type !== RoomEngineObjectPlacedEvent.PLACED)) return; - - resetPlacedOfferData(true); - - if(!purchasableOffer) - { - resetObjectMover(); - - return; - } - - let placed = false; - - const product = purchasableOffer.product; - - if(event.category === RoomObjectCategory.WALL) - { - switch(product.furnitureData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - placed = (event.placedOnFloor || event.placedOnWall); - break; - default: - placed = event.placedInRoom; - break; - } - } - else - { - placed = event.placedInRoom; - } - - if(!placed) - { - resetObjectMover(); - - return; - } - - setPlacedObjectPurchaseData(new PlacedObjectPurchaseData(event.roomId, event.objectId, event.category, event.wallLocation, event.x, event.y, event.direction, purchasableOffer)); - - switch(catalog.currentType) - { - case CatalogType.NORMAL: { - switch(event.category) - { - case RoomObjectCategory.FLOOR: - GetRoomEngine().addFurnitureFloor(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction), 0, new LegacyDataType()); - break; - case RoomObjectCategory.WALL: { - switch(product.furnitureData.className) - { - case 'floor': - case 'wallpaper': - case 'landscape': - resetRoomPaint(product.furnitureData.className, product.extraParam); - break; - default: - GetRoomEngine().addFurnitureWall(event.roomId, event.objectId, product.productClassId, new Vector3d(event.x, event.y, event.z), new Vector3d(event.direction * 45), 0, event.instanceData, 0); - break; - } - } - } - - const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); - - if(roomObject) roomObject.model.setValue(RoomObjectVariable.FURNITURE_ALPHA_MULTIPLIER, 0.5); - - if(catalogSkipPurchaseConfirmation) - { - SendMessageComposer(new PurchaseFromCatalogComposer(catalog.pageId, purchasableOffer.offerId, product.extraParam, 1)); - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - } - else - { - // confirm - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - } - break; - } - case CatalogType.BUILDER: { - let pageId = purchasableOffer.page.pageId; - - if(pageId === DUMMY_PAGE_ID_FOR_OFFER_SEARCH) - { - pageId = -1; - } - - switch(event.category) - { - case RoomObjectCategory.FLOOR: - SendMessageComposer(new BuildersClubPlaceRoomItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.x, event.y, event.direction)); - break; - case RoomObjectCategory.WALL: - SendMessageComposer(new BuildersClubPlaceWallItemMessageComposer(pageId, purchasableOffer.offerId, product.extraParam, event.wallLocation)); - break; - } - - if(catalogPlaceMultipleObjects) requestOfferToMover(purchasableOffer); - break; - } - } - }, [ objectMoverRequested, purchasableOffer, catalogPlaceMultipleObjects, catalogSkipPurchaseConfirmation, catalog, resetPlacedOfferData, resetObjectMover, resetRoomPaint, requestOfferToMover ]); - - UseRoomEngineEvent(RoomEngineObjectPlacedEvent.PLACED, onRoomEngineObjectPlacedEvent); - - const onInventoryFurniAddedEvent = useCallback((event: InventoryFurniAddedEvent) => - { - const roomEngine = GetRoomEngine(); - - if(!placedObjectPurchaseData || (placedObjectPurchaseData.productClassId !== event.spriteId) || (placedObjectPurchaseData.roomId !== roomEngine.activeRoomId)) return; - - switch(event.category) - { - case FurniCategory.FLOOR: { - const floorType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_FLOOR_TYPE); - - if(placedObjectPurchaseData.extraParam !== floorType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - case FurniCategory.WALL_PAPER: { - const wallType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_WALL_TYPE); - - if(placedObjectPurchaseData.extraParam !== wallType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - case FurniCategory.LANDSCAPE: { - const landscapeType = roomEngine.getRoomInstanceVariable(roomEngine.activeRoomId, RoomObjectVariable.ROOM_LANDSCAPE_TYPE); - - if(placedObjectPurchaseData.extraParam !== landscapeType) SendMessageComposer(new FurniturePlacePaintComposer(event.id)); - break; - } - default: - SendMessageComposer(new FurniturePlaceComposer(event.id, placedObjectPurchaseData.category, placedObjectPurchaseData.wallLocation, placedObjectPurchaseData.x, placedObjectPurchaseData.y, placedObjectPurchaseData.direction)); - } - - if(!catalogPlaceMultipleObjects) resetPlacedOfferData(); - }, [ placedObjectPurchaseData, catalogPlaceMultipleObjects, resetPlacedOfferData ]); - - UseUiEvent(InventoryFurniAddedEvent.FURNI_ADDED, onInventoryFurniAddedEvent); - - return { requestOfferToMover, cancelObjectMover }; -} - -export const useCatalogItemMover = useCatalogItemMoverState; diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 13d19463..18c0b740 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -268,7 +268,7 @@ const useInventoryFurniState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate }; + return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate }; } export const useInventoryFurni = () => useBetween(useInventoryFurniState); From f20fb698bcf1cedf369f8f8cf7b2a4a0eb8b2da0 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 23:06:57 -0400 Subject: [PATCH 254/331] Fix max call stack --- src/hooks/catalog/useCatalog.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hooks/catalog/useCatalog.ts b/src/hooks/catalog/useCatalog.ts index 2e90d17a..be0e0df7 100644 --- a/src/hooks/catalog/useCatalog.ts +++ b/src/hooks/catalog/useCatalog.ts @@ -880,7 +880,7 @@ const useCatalogState = () => switch(requestedPage.current.requestType) { case RequestedPage.REQUEST_TYPE_NONE: - if(activeNodes && activeNodes.length) return; + if(currentPage) return; if(rootNode.isBranch) { @@ -908,7 +908,7 @@ const useCatalogState = () => requestedPage.current.resetRequest(); return; } - }, [ isVisible, rootNode, activeNodes, activateNode, openPageById, openPageByOfferId, openPageByName ]); + }, [ isVisible, rootNode, currentPage, activateNode, openPageById, openPageByOfferId, openPageByName ]); useEffect(() => { From 0be763c59b63ec2d7b7ab317a4936e5050b4d47d Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Apr 2022 23:59:38 -0400 Subject: [PATCH 255/331] Update friend furni widget --- .../furniture/FurnitureFriendFurniView.tsx | 66 +++++++++ .../widgets/furniture/FurnitureWidgets.scss | 78 +++++++++- .../furniture/FurnitureWidgetsView.tsx | 2 +- .../friend-furni/FriendFurniLockData.ts | 11 -- .../FurnitureFriendFurniView.scss | 76 ---------- .../friend-furni/FurnitureFriendFurniView.tsx | 139 ------------------ src/hooks/rooms/widgets/furniture/index.ts | 1 + .../useFurnitureFriendFurniWidget.ts | 83 +++++++++++ 8 files changed, 228 insertions(+), 228 deletions(-) create mode 100644 src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx delete mode 100644 src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts delete mode 100644 src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss delete mode 100644 src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts diff --git a/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx new file mode 100644 index 00000000..546d89f3 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx @@ -0,0 +1,66 @@ +import { FC } from 'react'; +import { LocalizeText } from '../../../../api'; +import { Button, Column, DraggableWindow, Flex, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; +import { useFurnitureFriendFurniWidget } from '../../../../hooks'; + +export const FurnitureFriendFurniView: FC<{}> = props => +{ + const { objectId = -1, type = 0, stage = 0, usernames = [], figures = [], date = null, close = null, respond = null } = useFurnitureFriendFurniWidget(); + + if(objectId === -1) return null; + + if(stage > 0) + { + return ( + + + +
    + { LocalizeText('friend.furniture.confirm.lock.subtitle') } +
    +
    +
    +
    + { (stage === 2) && +
    { LocalizeText('friend.furniture.confirm.lock.other.locked') }
    } + + + + +
    +
    + ); + } + + if(usernames.length > 0) + { + return ( + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    + { (type === 0) && LocalizeText('lovelock.engraving.caption') } + { (type === 3) && LocalizeText('wildwest.engraving.caption') } +
    +
    { date }
    +
    + +
    { usernames[0] }
    +
    { usernames[1] }
    +
    +
    +
    + + ); + } +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss index 8bf5bf6f..84bf1758 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ b/src/components/room/widgets/furniture/FurnitureWidgets.scss @@ -174,6 +174,82 @@ } } -@import "./friend-furni/FurnitureFriendFurniView"; +.nitro-engraving-lock { + width: 300px; + + .engraving-lock-stage-1 { + width: 31px; + height: 39px; + background-position: -380px -43px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + } + + .engraving-lock-stage-2 { + width: 36px; + height: 43px; + background-position: -375px 0px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + } +} + +.nitro-engraving-lock-view { + width: 375px; + height: 210px; + background-position: 0px 0px; + background-image: url('../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); + + color: #622e54; + font-weight: bold; + font-size: 16px; + text-shadow: 0px 1px white; + + &.engraving-lock-3 { + background-position: 0px -210px; + color: #614110; + } + + &.engraving-lock-4 { + background-position: 0px -420px; + color: #f1dcc8; + text-shadow: 0px 2px rgba(0, 0, 0, .4); + + .engraving-lock-avatar { + margin-bottom: 10px; + } + } + + .engraving-lock-close { + position: absolute; + cursor: pointer; + width: 15px; + height: 15px; + top: 34px; + right: 27px; + } + + .engraving-lock-avatar { + width: 70px; + height: 120px; + + div { + position: absolute; + margin-top: -5px; + } + + &:nth-child(1) { + div { + margin-left: -10px; + } + } + + &:nth-child(2) { + div { + margin-left: -15px; + } + } + } + +} + @import "./high-score/FurnitureHighScoreView"; @import "./youtube-tv/FurnitureYoutubeDisplayView"; diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index e3bfbc12..b560d8b1 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -2,12 +2,12 @@ import { FC } from 'react'; import { Base } from '../../../../common'; import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; import { FurnitureDimmerView } from './dimmer/FurnitureDimmerView'; -import { FurnitureFriendFurniView } from './friend-furni/FurnitureFriendFurniView'; import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; import { FurnitureCustomStackHeightView } from './FurnitureCustomStackHeightView'; import { FurnitureExchangeCreditView } from './FurnitureExchangeCreditView'; import { FurnitureExternalImageView } from './FurnitureExternalImageView'; +import { FurnitureFriendFurniView } from './FurnitureFriendFurniView'; import { FurnitureGiftOpeningView } from './FurnitureGiftOpeningView'; import { FurnitureManipulationMenuView } from './FurnitureManipulationMenuView'; import { FurnitureMannequinView } from './FurnitureMannequinView'; diff --git a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts b/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts deleted file mode 100644 index da7e349e..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FriendFurniLockData.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class FurnitureEngravingLockData -{ - constructor( - public objectId: number, - public category: number = 0, - public type: number = 0, - public usernames: string[] = [], - public figures: string[] = [], - public date: string = null) - {} -} diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss deleted file mode 100644 index eb6d8987..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.scss +++ /dev/null @@ -1,76 +0,0 @@ -.nitro-engraving-lock { - width: 300px; - - .engraving-lock-stage-1 { - width: 31px; - height: 39px; - background-position: -380px -43px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } - - .engraving-lock-stage-2 { - width: 36px; - height: 43px; - background-position: -375px 0px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - } -} - -.nitro-engraving-lock-view { - width: 375px; - height: 210px; - background-position: 0px 0px; - background-image: url('../../../../../assets/images/room-widgets/engraving-lock-widget/engraving-lock-spritesheet.png'); - - color: #622e54; - font-weight: bold; - font-size: 16px; - text-shadow: 0px 1px white; - - &.engraving-lock-3 { - background-position: 0px -210px; - color: #614110; - } - - &.engraving-lock-4 { - background-position: 0px -420px; - color: #f1dcc8; - text-shadow: 0px 2px rgba(0, 0, 0, .4); - - .engraving-lock-avatar { - margin-bottom: 10px; - } - } - - .engraving-lock-close { - position: absolute; - cursor: pointer; - width: 15px; - height: 15px; - top: 34px; - right: 27px; - } - - .engraving-lock-avatar { - width: 70px; - height: 120px; - - div { - position: absolute; - margin-top: -5px; - } - - &:nth-child(1) { - div { - margin-left: -10px; - } - } - - &:nth-child(2) { - div { - margin-left: -15px; - } - } - } - -} diff --git a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx deleted file mode 100644 index c476b59d..00000000 --- a/src/components/room/widgets/furniture/friend-furni/FurnitureFriendFurniView.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, GetRoomSession, LocalizeText, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; -import { DraggableWindow, LayoutAvatarImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { UseEventDispatcherHook, UseMessageEventHook, UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { FurnitureEngravingLockData } from './FriendFurniLockData'; - -export const FurnitureFriendFurniView: FC<{}> = props => -{ - const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); - const [ engravingLockData, setEngravingLockData ] = useState(null); - const [ engravingStage, setEngravingStage ] = useState(0); - - const onNitroEvent = (event: NitroEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); - const type = roomObject.model.getValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING); - - if(data[0] === '1') - { - if(data.length !== 6) return; - - setEngravingLockData(new FurnitureEngravingLockData(widgetEvent.objectId, widgetEvent.category, type, [ data[1], data[2] ], [ data[3], data[4] ], data[5])); - setEngravingStage(0); - } - return; - } - case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); - - setEngravingLockData(prevState => - { - if(!prevState || (widgetEvent.id !== prevState.objectId) || (widgetEvent.category !== prevState.category)) return prevState; - - return null; - }); - return; - } - } - }; - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, onNitroEvent); - UseEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent); - - const onLoveLockFurniStartEvent = useCallback((event: LoveLockFurniStartEvent) => - { - const parser = event.getParser(); - - setEngravingLockData(new FurnitureEngravingLockData(parser.furniId)); - setEngravingStage(parser.start ? 1 : 2); - }, []); - - UseMessageEventHook(LoveLockFurniStartEvent, onLoveLockFurniStartEvent); - - const processAction = useCallback((type: string, value: string = null) => - { - switch(type) - { - case 'close_view': - setEngravingLockData(null); - return; - case 'accept_request': - GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(engravingLockData.objectId, true)); - processAction('close_request'); - return; - case 'reject_request': - GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(engravingLockData.objectId, false)); - processAction('close_request'); - return; - case 'close_request': - setEngravingStage(0); - setEngravingLockData(null); - return; - } - }, [ engravingLockData ]); - - const onLoveLockDoneEvent = useCallback((event: LoveLockFurniFinishedEvent | LoveLockFurniFriendConfirmedEvent) => - { - processAction('close_request'); - }, [ processAction ]); - - UseMessageEventHook(LoveLockFurniFinishedEvent, onLoveLockDoneEvent); - UseMessageEventHook(LoveLockFurniFriendConfirmedEvent, onLoveLockDoneEvent); - - return ( - <> - { (engravingStage > 0) && - processAction('close_request') } /> - -
    - { LocalizeText('friend.furniture.confirm.lock.subtitle') } -
    -
    -
    -
    - { engravingStage === 2 &&
    { LocalizeText('friend.furniture.confirm.lock.other.locked') }
    } -
    - - -
    -
    -
    } - { engravingLockData && engravingLockData.usernames.length > 0 && -
    -
    processAction('close_view') }>
    -
    -
    - -
    -
    - -
    -
    -
    -
    - { engravingLockData.type === 0 && LocalizeText('lovelock.engraving.caption') } - { engravingLockData.type === 3 && LocalizeText('wildwest.engraving.caption') } -
    -
    { engravingLockData.date }
    -
    -
    { engravingLockData.usernames[0] }
    -
    { engravingLockData.usernames[1] }
    -
    -
    -
    -
    } - - ); -} diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts index f642bb87..478ede29 100644 --- a/src/hooks/rooms/widgets/furniture/index.ts +++ b/src/hooks/rooms/widgets/furniture/index.ts @@ -2,6 +2,7 @@ export * from './useFurnitureBackgroundColorWidget'; export * from './useFurnitureBadgeDisplayWidget'; export * from './useFurnitureExchangeWidget'; export * from './useFurnitureExternalImageWidget'; +export * from './useFurnitureFriendFurniWidget'; export * from './useFurnitureManipulationWidget'; export * from './useFurnitureMannequinWidget'; export * from './useFurniturePresentWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts new file mode 100644 index 00000000..ad8ddc2c --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts @@ -0,0 +1,83 @@ +import { FriendFurniConfirmLockMessageComposer, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { GetRoomEngine, GetRoomSession } from '../../../../api'; +import { UseRoomEngineEvent } from '../../../events'; +import { UseMessageEventHook } from '../../../messages'; +import { useFurniRemovedEvent } from '../../useFurniRemovedEvent'; + +const useFurnitureFriendFurniWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ type, setType ] = useState(0); + const [ usernames, setUsernames ] = useState([]); + const [ figures, setFigures ] = useState([]); + const [ date, setDate ] = useState(null); + const [ stage, setStage ] = useState(0); + + const close = useCallback(() => + { + setObjectId(-1); + setCategory(-1); + setType(0); + setUsernames([]); + setFigures([]); + setDate(null); + }, []); + + const respond = (flag: boolean) => + { + GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(objectId, flag)); + + close(); + } + + const onLoveLockFurniStartEvent = useCallback((event: LoveLockFurniStartEvent) => + { + const parser = event.getParser(); + + setObjectId(parser.furniId); + setStage(parser.start ? 1 : 2); + }, []); + + UseMessageEventHook(LoveLockFurniStartEvent, onLoveLockFurniStartEvent); + + const onLoveLockDoneEvent = useCallback((event: LoveLockFurniFinishedEvent | LoveLockFurniFriendConfirmedEvent) => + { + close(); + }, [ close ]); + + UseMessageEventHook(LoveLockFurniFinishedEvent, onLoveLockDoneEvent); + UseMessageEventHook(LoveLockFurniFriendConfirmedEvent, onLoveLockDoneEvent); + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + const type = roomObject.model.getValue(RoomObjectVariable.FURNITURE_FRIENDFURNI_ENGRAVING); + + if((data[0] !== '1') || (data.length !== 6)) return; + + setObjectId(event.objectId); + setCategory(event.category); + setType(type); + setUsernames([ data[1], data[2] ]); + setFigures([ data[3], data[4] ]); + setDate(data[5]); + setStage(0); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + close(); + }); + + return { objectId, type, usernames, figures, date, stage, close, respond }; +} + +export const useFurnitureFriendFurniWidget = useFurnitureFriendFurniWidgetState; From ed211519a7a8a4b8824582dc5e26d76dcb4159a4 Mon Sep 17 00:00:00 2001 From: MyNameIsBatman Date: Sat, 23 Apr 2022 16:00:14 -0300 Subject: [PATCH 256/331] Spectator Mode --- .../room_spectator_bottom_left.png | Bin 0 -> 461 bytes .../room_spectator_bottom_right.png | Bin 0 -> 456 bytes .../room_spectator_middle_bottom.png | Bin 0 -> 98 bytes .../room_spectator_middle_left.png | Bin 0 -> 94 bytes .../room_spectator_middle_right.png | Bin 0 -> 94 bytes .../room_spectator_middle_top.png | Bin 0 -> 95 bytes .../room_spectator_top_left.png | Bin 0 -> 408 bytes .../room_spectator_top_right.png | Bin 0 -> 412 bytes src/components/room/RoomView.scss | 1 + src/components/room/RoomView.tsx | 4 +++ .../room/spectator/RoomSpectatorView.scss | 26 ++++++++++++++++++ .../room/spectator/RoomSpectatorView.tsx | 8 ++++++ .../room/widgets/chat-input/ChatInputView.tsx | 4 ++- 13 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/assets/images/room-spectator/room_spectator_bottom_left.png create mode 100644 src/assets/images/room-spectator/room_spectator_bottom_right.png create mode 100644 src/assets/images/room-spectator/room_spectator_middle_bottom.png create mode 100644 src/assets/images/room-spectator/room_spectator_middle_left.png create mode 100644 src/assets/images/room-spectator/room_spectator_middle_right.png create mode 100644 src/assets/images/room-spectator/room_spectator_middle_top.png create mode 100644 src/assets/images/room-spectator/room_spectator_top_left.png create mode 100644 src/assets/images/room-spectator/room_spectator_top_right.png create mode 100644 src/components/room/spectator/RoomSpectatorView.scss create mode 100644 src/components/room/spectator/RoomSpectatorView.tsx diff --git a/src/assets/images/room-spectator/room_spectator_bottom_left.png b/src/assets/images/room-spectator/room_spectator_bottom_left.png new file mode 100644 index 0000000000000000000000000000000000000000..01688cb295d0e7551042935ed2f4f3109aba7c77 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^(LkKX!3HEf8uQy37#OE`x;TbZ+3@i2r9VQgauiG$dG6K)(p$WA zfY2Bh`DR&W!}Md@@<3wy)VA4A65X&CWQ=vv?%P1-Z-t!K>l$+JvL{BDv*tXQy0J0* zz`vT^e}D1qIkZXm7e__QUdHMjFTTv2bl|^g)l1_`?eCiX7uf6li@Oor9oJ>oET6bO z;!A|kFNuFXjMp`jwad;ey8ftN)Zk2$QJ-%1d*eyXv!fmS6kAWv^3yBpbiJ;zBqefl z>bp|6z5}+=k;Rd{wZ~lJRcD{)IKp&;bI)t5?sc8K+nLJ#&sj2=X`@0J)BDAzH>D)< zUrc>opOsRbaJWr(Ln1dY6j;r28hNF+9l*jrKR2IYH`k`;ayMgv(Zt~C>gTe~DWM4f DB_q~? literal 0 HcmV?d00001 diff --git a/src/assets/images/room-spectator/room_spectator_bottom_right.png b/src/assets/images/room-spectator/room_spectator_bottom_right.png new file mode 100644 index 0000000000000000000000000000000000000000..59c8ef2c2daef66a18a2a2dd18dea786943ace29 GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^(LkKX!3HEf8uQy37#RCKT^vIyZoR#}F}K-4qAhWj zM$oG-aSFNL5@mM1nb>(kq^Dpaw}2Ac=i(>SHX5VgvaN**K^72w3d4zy9obBEK)eM#_ zONxXXT>zn0*t_`Tt7^25Y8F+H{$gTe~ HDWM4fUf$6q literal 0 HcmV?d00001 diff --git a/src/assets/images/room-spectator/room_spectator_middle_bottom.png b/src/assets/images/room-spectator/room_spectator_middle_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6fdecccebd3460ca5d32675b070dbddbbab852 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf$!3HE*_k3grQktGFjv*Ddk`odVew@E>@#4q% x2d9Xhh+3-L@3^P_|37=?h`YX(>l|Gf7`EN_?kMv1F9T{~@O1TaS?83{1OP^IAYK3f literal 0 HcmV?d00001 diff --git a/src/assets/images/room-spectator/room_spectator_middle_left.png b/src/assets/images/room-spectator/room_spectator_middle_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9aaa7958b41a907aacae0e1025f191f43c5418 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T(!3HF4{HDeLDOFDw$B>F!$vZU9f1NLJ=D>ju t|Ns8}{{Oe@jld0>+K2!5_3>@6VOaQ6#dBs-r7BPZgQu&X%Q~loCIAFlAkzQ< literal 0 HcmV?d00001 diff --git a/src/assets/images/room-spectator/room_spectator_middle_right.png b/src/assets/images/room-spectator/room_spectator_middle_right.png new file mode 100644 index 0000000000000000000000000000000000000000..9d963b3d111202dc6ba066b300ee3e378186d025 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T(!3HF4{HDeLDOFDw$B>F!$q5MwKki?=`0@Uf tsSoS-b69iL{r~s3e!?H$O1(t}3}&7xo*jP_76LUec)I$ztaD0e0sy?l9^n80 literal 0 HcmV?d00001 diff --git a/src/assets/images/room-spectator/room_spectator_middle_top.png b/src/assets/images/room-spectator/room_spectator_middle_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f6559cee0eb6b9c10edbe88989d77f6781520a82 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{R!3HD)xzixJtr z2d=!_-1X+TmG;Kd-_B^o9Ae>CY`M7NefgJ|9Z$3Qru*~Uf4_bAw9Ezu>1~JF)^12V z9Cl;+Q9i{N^NuO>KVD%i)#q@&fB(I>_w%f4AIvTO9J%rN=Zu8( zm=iNMray6i@WEL3cMtdfij%ir7+<<{DB1AWzVo+Uq)v~j;9Qedm-WwDSyQ}D#E8-3 z-jb-YGl#YxD2ol3UoHAZnLGYaY-8=aC2`-Twf=XFJ761MG!z$;~z zb7RBpW8VtbK-oYkUTL#8CSXNC7En5o8$^J`fsE+mY*1mKNOS^B7%tBW)?y!9$H3lL W`0exJA! z9_ubY7um^Q>gP25^~B(UmeLpn)oH0^jk1+<%`b^x$=}B|ao>Ia$fQXM2ikNuBy#86 z*uYwL{f7PIr8c`aJg+<#G|%?M%g<9bO?mqI?N@%QHws@eXRSJzDE=sJ|6x9-{WjAl z2Ql;Q-gJ@s%hSD5zaOhUomP3wEkEy@Mc>ZUs+en0i_Md_|Kse42rF6qJz@L2XQ!>Q z7?<|erMy{oTB>bf2BW*#ubCTHPcO`7{C*)@`tSUW;o={p_p{Wly|{tgh4bbR9bJ-0V7-{zGz z19E=<^f&~R1qmN+g9!Drw?h~(5jK#*#KUGAsu^&}z?5#_ebcw`{K>AuZ`}tiSb?F= N;OXk;vd$@?2>@0kz9#?x literal 0 HcmV?d00001 diff --git a/src/components/room/RoomView.scss b/src/components/room/RoomView.scss index 7cd8fbe4..739e3cbb 100644 --- a/src/components/room/RoomView.scss +++ b/src/components/room/RoomView.scss @@ -1 +1,2 @@ +@import "./spectator/RoomSpectatorView"; @import "./widgets/RoomWidgets"; diff --git a/src/components/room/RoomView.tsx b/src/components/room/RoomView.tsx index b30fec81..661d1452 100644 --- a/src/components/room/RoomView.tsx +++ b/src/components/room/RoomView.tsx @@ -5,12 +5,14 @@ import { Base } from '../../common'; import { UseRoomEngineEvent, UseRoomSessionManagerEvent } from '../../hooks'; import { RoomColorView } from './RoomColorView'; import { RoomContextProvider } from './RoomContext'; +import { RoomSpectatorView } from './spectator/RoomSpectatorView'; import { RoomWidgetsView } from './widgets/RoomWidgetsView'; export const RoomView: FC<{}> = props => { const [ roomSession, setRoomSession ] = useState(null); const [ widgetHandler, setWidgetHandler ] = useState(null); + const [ isSpectator, setIsSpectator ] = useState(false); const elementRef = useRef(); const onRoomEngineEvent = useCallback((event: RoomEngineEvent) => @@ -143,6 +145,7 @@ export const RoomView: FC<{}> = props => stage.addChild(displayObject); SetActiveRoomId(roomSession.roomId); + setIsSpectator(roomSession.isSpectator); }, [ roomSession, resize ]); useEffect(() => @@ -184,6 +187,7 @@ export const RoomView: FC<{}> = props => <> + { isSpectator && } } diff --git a/src/components/room/spectator/RoomSpectatorView.scss b/src/components/room/spectator/RoomSpectatorView.scss new file mode 100644 index 00000000..4663566f --- /dev/null +++ b/src/components/room/spectator/RoomSpectatorView.scss @@ -0,0 +1,26 @@ +.room-spectator { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: calc(100% - 50px); + user-select: none; + pointer-events: none; + opacity: 0.8; + background: url("../../../assets/images/room-spectator/room_spectator_top_left.png") no-repeat top left, + url("../../../assets/images/room-spectator/room_spectator_top_right.png") no-repeat top right, + url("../../../assets/images/room-spectator/room_spectator_bottom_right.png") no-repeat bottom right, + url("../../../assets/images/room-spectator/room_spectator_bottom_left.png") no-repeat bottom left, + url("../../../assets/images/room-spectator/room_spectator_middle_left.png") repeat-y left, + url("../../../assets/images/room-spectator/room_spectator_middle_top.png") repeat-x top, + url("../../../assets/images/room-spectator/room_spectator_middle_right.png") repeat-y right, + url("../../../assets/images/room-spectator/room_spectator_middle_bottom.png") repeat-x bottom + ; +} +/* +border-image-slice: 91 91 110 91 fill; +border-image-width: 79px 79px 79px 79px; +border-image-outset: 0px 0px 0px 0px; +border-image-repeat: repeat repeat; +border-image-source: url("../../../assets/images/room-spectator/room_spectator.png"); +*/ diff --git a/src/components/room/spectator/RoomSpectatorView.tsx b/src/components/room/spectator/RoomSpectatorView.tsx new file mode 100644 index 00000000..909b1cc5 --- /dev/null +++ b/src/components/room/spectator/RoomSpectatorView.tsx @@ -0,0 +1,8 @@ +import { FC } from 'react'; + +export const RoomSpectatorView: FC<{}> = props => +{ + return ( +
    + ); +}; diff --git a/src/components/room/widgets/chat-input/ChatInputView.tsx b/src/components/room/widgets/chat-input/ChatInputView.tsx index a5295ca2..1cf885f6 100644 --- a/src/components/room/widgets/chat-input/ChatInputView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputView.tsx @@ -1,7 +1,7 @@ import { HabboClubLevelEnum, RoomControllerLevel } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; -import { GetClubMemberLevel, GetConfiguration, GetSessionDataManager, LocalizeText, RoomWidgetChatMessage, RoomWidgetChatTypingMessage, RoomWidgetFloodControlEvent, RoomWidgetUpdateChatInputContentEvent, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; +import { GetClubMemberLevel, GetConfiguration, GetRoomSession, GetSessionDataManager, LocalizeText, RoomWidgetChatMessage, RoomWidgetChatTypingMessage, RoomWidgetFloodControlEvent, RoomWidgetUpdateChatInputContentEvent, RoomWidgetUpdateInfostandUserEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../../api'; import { Text } from '../../../../common'; import { UseEventDispatcherHook } from '../../../../hooks'; import { useRoomContext } from '../../RoomContext'; @@ -355,6 +355,8 @@ export const ChatInputView: FC<{}> = props => inputRef.current.parentElement.dataset.value = chatValue; }, [ chatValue ]); + if(GetRoomSession().isSpectator) return null; + return ( createPortal(
    From 5c2ead34818c97bf9c4a65744053864ba4c0b6d5 Mon Sep 17 00:00:00 2001 From: MyNameIsBatman Date: Sun, 24 Apr 2022 00:47:00 -0300 Subject: [PATCH 257/331] Extra --- src/components/room/RoomView.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/room/RoomView.tsx b/src/components/room/RoomView.tsx index 661d1452..84e3d70e 100644 --- a/src/components/room/RoomView.tsx +++ b/src/components/room/RoomView.tsx @@ -12,7 +12,6 @@ export const RoomView: FC<{}> = props => { const [ roomSession, setRoomSession ] = useState(null); const [ widgetHandler, setWidgetHandler ] = useState(null); - const [ isSpectator, setIsSpectator ] = useState(false); const elementRef = useRef(); const onRoomEngineEvent = useCallback((event: RoomEngineEvent) => @@ -145,7 +144,6 @@ export const RoomView: FC<{}> = props => stage.addChild(displayObject); SetActiveRoomId(roomSession.roomId); - setIsSpectator(roomSession.isSpectator); }, [ roomSession, resize ]); useEffect(() => @@ -187,7 +185,7 @@ export const RoomView: FC<{}> = props => <> - { isSpectator && } + { roomSession.isSpectator && } } From 08804ea5b7ad729e06f3d73bc3da2cf81d8452df Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 29 Apr 2022 12:19:08 -0400 Subject: [PATCH 258/331] More widget updates --- .../RoomWidgetUpdateYoutubeDisplayEvent.ts | 27 -- src/api/nitro/room/widgets/events/index.ts | 1 - .../handlers/FurnitureDimmerWidgetHandler.ts | 112 -------- .../handlers/FurnitureInternalLinkHandler.ts | 53 ---- .../handlers/FurnitureRoomLinkHandler.ts | 59 ----- .../FurnitureYoutubeDisplayWidgetHandler.ts | 70 ----- src/api/nitro/room/widgets/handlers/index.ts | 4 - .../RoomWidgetDimmerChangeStateMessage.ts | 11 - .../RoomWidgetDimmerPreviewMessage.ts | 34 --- .../RoomWidgetDimmerSavePresetMessage.ts | 48 ---- .../RoomWidgetFurniToWidgetMessage.ts | 4 - src/api/nitro/room/widgets/messages/index.ts | 3 - .../DimmerFurnitureWidgetPresetItem.ts | 0 .../widgets}/YoutubeVideoPlaybackStateEnum.ts | 0 src/api/room/widgets/index.ts | 2 + .../room/widgets/RoomWidgetsView.tsx | 41 +-- .../{dimmer => }/FurnitureDimmerView.tsx | 27 +- .../furniture/FurnitureHighScoreView.tsx | 60 +++++ .../furniture/FurnitureInternalLinkView.tsx | 9 + .../furniture/FurnitureRoomLinkView.tsx | 9 + .../widgets/furniture/FurnitureWidgets.scss | 63 ++++- .../furniture/FurnitureWidgetsView.tsx | 18 +- .../furniture/FurnitureYoutubeDisplayView.tsx | 104 ++++++++ .../high-score/FurnitureHighScoreView.scss | 6 - .../high-score/FurnitureHighScoreView.tsx | 107 -------- .../FurnitureYoutubeDisplayView.scss | 54 ---- .../FurnitureYoutubeDisplayView.tsx | 239 ------------------ .../room-tools/RoomToolsWidgetView.tsx | 4 +- .../user-settings/UserSettingsView.tsx | 2 +- src/hooks/rooms/useRoom.ts | 6 +- src/hooks/rooms/widgets/furniture/index.ts | 5 + .../useFurnitureBadgeDisplayWidget.ts | 21 +- .../furniture/useFurnitureDimmerWidget.ts | 71 ++++++ .../furniture/useFurnitureHighScoreWidget.ts | 56 ++++ .../useFurnitureInternalLinkWidget.ts | 27 ++ .../furniture/useFurnitureRoomLinkWidget.ts | 58 +++++ .../furniture/useFurnitureYoutubeWidget.ts | 136 ++++++++++ 37 files changed, 643 insertions(+), 908 deletions(-) delete mode 100644 src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts delete mode 100644 src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts delete mode 100644 src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts delete mode 100644 src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts delete mode 100644 src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts delete mode 100644 src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts delete mode 100644 src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts delete mode 100644 src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts rename src/{components/room/widgets/furniture/dimmer => api/room/widgets}/DimmerFurnitureWidgetPresetItem.ts (100%) rename src/{components/room/widgets/furniture/youtube-tv/utils => api/room/widgets}/YoutubeVideoPlaybackStateEnum.ts (100%) rename src/components/room/widgets/furniture/{dimmer => }/FurnitureDimmerView.tsx (86%) create mode 100644 src/components/room/widgets/furniture/FurnitureHighScoreView.tsx create mode 100644 src/components/room/widgets/furniture/FurnitureInternalLinkView.tsx create mode 100644 src/components/room/widgets/furniture/FurnitureRoomLinkView.tsx create mode 100644 src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx delete mode 100644 src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss delete mode 100644 src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx delete mode 100644 src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss delete mode 100644 src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts diff --git a/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts b/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts deleted file mode 100644 index 0a4773e1..00000000 --- a/src/api/nitro/room/widgets/events/RoomWidgetUpdateYoutubeDisplayEvent.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; - -export class RoomWidgetUpdateYoutubeDisplayEvent extends RoomWidgetUpdateEvent -{ - public static UPDATE_YOUTUBE_DISPLAY: string = 'RWUEIE_UPDATE_YOUTUBE_DISPLAY'; - - private _objectId: number; - private _hasControl: boolean; - - constructor(objectId: number, hasControl = false) - { - super(RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY); - - this._objectId = objectId; - this._hasControl = hasControl; - } - - public get objectId(): number - { - return this._objectId; - } - - public get hasControl(): boolean - { - return this._hasControl; - } -} diff --git a/src/api/nitro/room/widgets/events/index.ts b/src/api/nitro/room/widgets/events/index.ts index 7c9ae507..5814d9e2 100644 --- a/src/api/nitro/room/widgets/events/index.ts +++ b/src/api/nitro/room/widgets/events/index.ts @@ -25,7 +25,6 @@ export * from './RoomWidgetUpdateRoomObjectEvent'; export * from './RoomWidgetUpdateSongEvent'; export * from './RoomWidgetUpdateTrophyEvent'; export * from './RoomWidgetUpdateUserDataEvent'; -export * from './RoomWidgetUpdateYoutubeDisplayEvent'; export * from './RoomWidgetUseProductBubbleEvent'; export * from './RoomWidgetWordQuizUpdateEvent'; export * from './UseProductItem'; diff --git a/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts deleted file mode 100644 index b0d62b45..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureDimmerWidgetHandler.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { NitroEvent, RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomSessionDimmerPresetsEvent, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { GetRoomEngine } from '../..'; -import { GetSessionDataManager } from '../../..'; -import { RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent, RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetDimmerChangeStateMessage, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetFurniToWidgetMessage, RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureDimmerWidgetHandler extends RoomWidgetHandler -{ - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS: { - const presetsEvent = (event as RoomSessionDimmerPresetsEvent); - const updateEvent = new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.PRESETS); - - updateEvent.selectedPresetId = presetsEvent.selectedPresetId; - - let i = 0; - - while(i < presetsEvent.presetCount) - { - const preset = presetsEvent.getPreset(i); - - if(preset) updateEvent.setPresetValues(preset.id, preset.type, preset.color, preset.brightness); - - i++; - } - - this.container.eventDispatcher.dispatchEvent(updateEvent); - return; - } - case RoomEngineDimmerStateEvent.ROOM_COLOR: { - const stateEvent = (event as RoomEngineDimmerStateEvent); - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerStateEvent(stateEvent.state, stateEvent.presetId, stateEvent.effectId, stateEvent.color, stateEvent.brightness)); - return; - } - case RoomEngineTriggerWidgetEvent.REMOVE_DIMMER: { - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.HIDE)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - case RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER: { - if(this.canOpenWidget()) this.container.roomSession.requestMoodlightSettings(); - - break; - } - case RoomWidgetDimmerSavePresetMessage.SAVE_PRESET: { - if(this.canOpenWidget()) - { - const savePresetMessage = (message as RoomWidgetDimmerSavePresetMessage); - - this.container.roomSession.updateMoodlightData(savePresetMessage.presetNumber, savePresetMessage.effectTypeId, savePresetMessage.color, savePresetMessage.brightness, savePresetMessage.apply); - } - - break; - } - case RoomWidgetDimmerChangeStateMessage.CHANGE_STATE: { - if(this.canOpenWidget()) this.container.roomSession.toggleMoodlightState(); - - break; - } - case RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET: { - const roomId = this.container.roomSession.roomId; - const previewMessage = (message as RoomWidgetDimmerPreviewMessage); - - GetRoomEngine().updateObjectRoomColor(roomId, previewMessage.color, previewMessage.brightness, previewMessage.bgOnly); - - break; - } - } - - return null; - } - - private canOpenWidget(): boolean - { - return (this.container.roomSession.isRoomOwner || (this.container.roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_DIMMER; - } - - public get eventTypes(): string[] - { - return [ - RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, - RoomEngineDimmerStateEvent.ROOM_COLOR, - RoomEngineTriggerWidgetEvent.REMOVE_DIMMER - ]; - } - - public get messageTypes(): string[] - { - return [ - RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER, - RoomWidgetDimmerSavePresetMessage.SAVE_PRESET, - RoomWidgetDimmerChangeStateMessage.CHANGE_STATE, - RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET - ]; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts deleted file mode 100644 index 8996cf38..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureInternalLinkHandler.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from '../../../CreateLinkEvent'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureInternalLinkHandler extends RoomWidgetHandler -{ - private static readonly INTERNALLINK = 'internalLink'; - - public processEvent(event: NitroEvent): void - { - if(!event) return; - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK: - const linkEvent = event as RoomEngineTriggerWidgetEvent; - const roomEngine = GetRoomEngine(); - if(!linkEvent || !roomEngine) return; - - const object = roomEngine.getRoomObject(linkEvent.roomId, linkEvent.objectId, linkEvent.category); - if(object) - { - let data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let link = data[FurnitureInternalLinkHandler.INTERNALLINK]; - if(!link || !link.length) link = object.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - if(link && link.length) CreateLinkEvent(link); - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - public get type(): string - { - return RoomWidgetEnum.INTERNAL_LINK; - } - - public get eventTypes(): string[] - { - return [ RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK ]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts deleted file mode 100644 index 2f0a74d1..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureRoomLinkHandler.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { IMessageEvent, NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from '@nitrots/nitro-renderer'; -import { CreateLinkEvent } from '../../../CreateLinkEvent'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateEvent } from '../events'; -import { RoomWidgetMessage } from '../messages'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureRoomLinkHandler extends RoomWidgetHandler -{ - private static readonly INTERNALLINK = 'internalLink'; - - private onRoomInfo(event: IMessageEvent): void - { - //todo - } - - public processEvent(event: NitroEvent): void - { - if(!event) return; - - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK: - const roomLinkEvent = (event as RoomEngineTriggerWidgetEvent); - const roomEngine = GetRoomEngine(); - - if(!roomLinkEvent || !roomEngine) return; - - const object = roomEngine.getRoomObject(roomLinkEvent.roomId, roomLinkEvent.objectId, roomLinkEvent.category); - if(object) - { - const data = object.model.getValue(RoomObjectVariable.FURNITURE_DATA); - let roomId = data[FurnitureRoomLinkHandler.INTERNALLINK]; - if(!roomId || !roomId.length) roomId = object.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); - if(roomId && roomId.length) CreateLinkEvent('navigator/goto/' + roomId); - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - return null; - } - - public get type(): string - { - return RoomWidgetEnum.ROOM_LINK; - } - - public get eventTypes(): string[] - { - return [ RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK ]; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts b/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts deleted file mode 100644 index 8974053b..00000000 --- a/src/api/nitro/room/widgets/handlers/FurnitureYoutubeDisplayWidgetHandler.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { GetYoutubeDisplayStatusMessageComposer, NitroEvent, RoomWidgetEnum, SecurityLevel } from '@nitrots/nitro-renderer'; -import { RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer/'; -import { RoomWidgetMessage, RoomWidgetUpdateEvent } from '..'; -import { GetSessionDataManager, IsOwnerOfFurniture, SendMessageComposer } from '../../..'; -import { GetRoomEngine } from '../../GetRoomEngine'; -import { RoomWidgetUpdateYoutubeDisplayEvent } from '../events'; -import { RoomWidgetHandler } from './RoomWidgetHandler'; - -export class FurnitureYoutubeDisplayWidgetHandler extends RoomWidgetHandler -{ - public static readonly CONTROL_COMMAND_PREVIOUS_VIDEO = 0; - public static readonly CONTROL_COMMAND_NEXT_VIDEO = 1; - public static readonly CONTROL_COMMAND_PAUSE_VIDEO = 2; - public static readonly CONTROL_COMMAND_CONTINUE_VIDEO = 3; - - private _lastFurniId: number = -1; - - public processEvent(event: NitroEvent): void - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); - - if(!roomObject) return; - - this._lastFurniId = widgetEvent.objectId; - - const hasControl = GetSessionDataManager().hasSecurity(SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject); - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateYoutubeDisplayEvent(roomObject.id, hasControl)); - SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(this._lastFurniId)); - return; - } - case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: { - const widgetEvent = (event as RoomEngineTriggerWidgetEvent); - - if(widgetEvent.objectId !== this._lastFurniId) return; - - this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateYoutubeDisplayEvent(-1)); - return; - } - } - } - - public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent - { - switch(message.type) - { - } - - return null; - } - - public get type(): string - { - return RoomWidgetEnum.YOUTUBE; - } - - public get eventTypes(): string[] - { - return []; - } - - public get messageTypes(): string[] - { - return []; - } -} diff --git a/src/api/nitro/room/widgets/handlers/index.ts b/src/api/nitro/room/widgets/handlers/index.ts index 00496ab9..189cd817 100644 --- a/src/api/nitro/room/widgets/handlers/index.ts +++ b/src/api/nitro/room/widgets/handlers/index.ts @@ -1,8 +1,4 @@ export * from './FurnitureContextMenuWidgetHandler'; -export * from './FurnitureDimmerWidgetHandler'; -export * from './FurnitureInternalLinkHandler'; -export * from './FurnitureRoomLinkHandler'; -export * from './FurnitureYoutubeDisplayWidgetHandler'; export * from './IRoomWidgetHandler'; export * from './IRoomWidgetHandlerManager'; export * from './PollWidgetHandler'; diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts deleted file mode 100644 index de83f498..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerChangeStateMessage extends RoomWidgetMessage -{ - public static CHANGE_STATE: string = 'RWCDSM_CHANGE_STATE'; - - constructor() - { - super(RoomWidgetDimmerChangeStateMessage.CHANGE_STATE); - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts deleted file mode 100644 index 39708872..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerPreviewMessage.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerPreviewMessage extends RoomWidgetMessage -{ - public static PREVIEW_DIMMER_PRESET: string = 'RWDPM_PREVIEW_DIMMER_PRESET'; - - private _color: number; - private _brightness: number; - private _bgOnly: boolean; - - constructor(color: number, brightness: number, bgOnly: boolean) - { - super(RoomWidgetDimmerPreviewMessage.PREVIEW_DIMMER_PRESET); - - this._color = color; - this._brightness = brightness; - this._bgOnly = bgOnly; - } - - public get color(): number - { - return this._color; - } - - public get brightness(): number - { - return this._brightness; - } - - public get bgOnly(): boolean - { - return this._bgOnly; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts deleted file mode 100644 index 8e7bd831..00000000 --- a/src/api/nitro/room/widgets/messages/RoomWidgetDimmerSavePresetMessage.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { RoomWidgetMessage } from './RoomWidgetMessage'; - -export class RoomWidgetDimmerSavePresetMessage extends RoomWidgetMessage -{ - public static SAVE_PRESET: string = 'RWSDPM_SAVE_PRESET'; - - private _presetNumber: number; - private _effectTypeId: number; - private _color: number; - private _brightness: number; - private _apply: boolean; - - constructor(presetNumber: number, effectTypeId: number, color: number, brightness: number, apply: boolean) - { - super(RoomWidgetDimmerSavePresetMessage.SAVE_PRESET); - - this._presetNumber = presetNumber; - this._effectTypeId = effectTypeId; - this._color = color; - this._brightness = brightness; - this._apply = apply; - } - - public get presetNumber(): number - { - return this._presetNumber; - } - - public get effectTypeId(): number - { - return this._effectTypeId; - } - - public get color(): number - { - return this._color; - } - - public get brightness(): number - { - return this._brightness; - } - - public get apply(): boolean - { - return this._apply; - } -} diff --git a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts b/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts index 08210c18..364fb2dd 100644 --- a/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts +++ b/src/api/nitro/room/widgets/messages/RoomWidgetFurniToWidgetMessage.ts @@ -4,13 +4,9 @@ export class RoomWidgetFurniToWidgetMessage extends RoomWidgetMessage { public static REQUEST_TEASER: string = 'RWFWM_MESSAGE_REQUEST_TEASER'; public static REQUEST_ECOTRONBOX: string = 'RWFWM_MESSAGE_REQUEST_ECOTRONBOX'; - public static REQUEST_DIMMER: string = 'RWFWM_MESSAGE_REQUEST_DIMMER'; public static REQUEST_PLACEHOLDER: string = 'RWFWM_MESSAGE_REQUEST_PLACEHOLDER'; public static REQUEST_CLOTHING_CHANGE: string = 'RWFWM_MESSAGE_REQUEST_CLOTHING_CHANGE'; public static REQUEST_PLAYLIST_EDITOR: string = 'RWFWM_MESSAGE_REQUEST_PLAYLIST_EDITOR'; - public static REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING'; - public static REQUEST_ACHIEVEMENT_RESOLUTION_FAILED: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_ACHIEVEMENT_RESOLUTION_FAILED'; - public static REQUEST_BADGE_DISPLAY_ENGRAVING: string = 'RWFWM_WIDGET_MESSAGE_REQUEST_BADGE_DISPLAY_ENGRAVING'; private _objectId: number; private _category: number; diff --git a/src/api/nitro/room/widgets/messages/index.ts b/src/api/nitro/room/widgets/messages/index.ts index ede5ad63..5bccb026 100644 --- a/src/api/nitro/room/widgets/messages/index.ts +++ b/src/api/nitro/room/widgets/messages/index.ts @@ -6,9 +6,6 @@ export * from './RoomWidgetChatSelectAvatarMessage'; export * from './RoomWidgetChatTypingMessage'; export * from './RoomWidgetCreditFurniRedeemMessage'; export * from './RoomWidgetDanceMessage'; -export * from './RoomWidgetDimmerChangeStateMessage'; -export * from './RoomWidgetDimmerPreviewMessage'; -export * from './RoomWidgetDimmerSavePresetMessage'; export * from './RoomWidgetFurniActionMessage'; export * from './RoomWidgetFurniToWidgetMessage'; export * from './RoomWidgetMessage'; diff --git a/src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts b/src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts similarity index 100% rename from src/components/room/widgets/furniture/dimmer/DimmerFurnitureWidgetPresetItem.ts rename to src/api/room/widgets/DimmerFurnitureWidgetPresetItem.ts diff --git a/src/components/room/widgets/furniture/youtube-tv/utils/YoutubeVideoPlaybackStateEnum.ts b/src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts similarity index 100% rename from src/components/room/widgets/furniture/youtube-tv/utils/YoutubeVideoPlaybackStateEnum.ts rename to src/api/room/widgets/YoutubeVideoPlaybackStateEnum.ts diff --git a/src/api/room/widgets/index.ts b/src/api/room/widgets/index.ts index 70f25143..2f7df592 100644 --- a/src/api/room/widgets/index.ts +++ b/src/api/room/widgets/index.ts @@ -1 +1,3 @@ +export * from './DimmerFurnitureWidgetPresetItem'; export * from './MannequinUtilities'; +export * from './YoutubeVideoPlaybackStateEnum'; diff --git a/src/components/room/widgets/RoomWidgetsView.tsx b/src/components/room/widgets/RoomWidgetsView.tsx index 878f3750..46c1e808 100644 --- a/src/components/room/widgets/RoomWidgetsView.tsx +++ b/src/components/room/widgets/RoomWidgetsView.tsx @@ -1,6 +1,6 @@ -import { RoomEngineEvent, RoomEngineObjectEvent, RoomEngineRoomAdEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomId, RoomObjectVariable, RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFavoriteGroupUpdateEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionPollEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, RoomSessionWordQuizEvent, RoomZoomEvent } from '@nitrots/nitro-renderer'; +import { RoomEngineEvent, RoomEngineObjectEvent, RoomEngineRoomAdEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomId, RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFavoriteGroupUpdateEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPetStatusUpdateEvent, RoomSessionPollEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, RoomSessionWordQuizEvent, RoomZoomEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; -import { GetRoomEngine, GetSessionDataManager, LocalizeText, NotificationAlertType, NotificationUtilities, RoomWidgetFurniToWidgetMessage, RoomWidgetUpdateRoomEngineEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../api'; +import { GetRoomEngine, LocalizeText, NotificationAlertType, NotificationUtilities, RoomWidgetFurniToWidgetMessage, RoomWidgetUpdateRoomEngineEvent, RoomWidgetUpdateRoomObjectEvent } from '../../../api'; import { DispatchUiEvent, UseRoomEngineEvent, UseRoomSessionManagerEvent } from '../../../hooks'; import { useRoomContext } from '../RoomContext'; import { AvatarInfoWidgetView } from './avatar-info/AvatarInfoWidgetView'; @@ -73,9 +73,6 @@ export const RoomWidgetsView: FC<{}> = props => case RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX: widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_ECOTRONBOX, objectId, category, event.roomId)); break; - case RoomEngineTriggerWidgetEvent.REQUEST_DIMMER: - widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER, objectId, category, event.roomId)); - break; case RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER: widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_PLACEHOLDER, objectId, category, event.roomId)); break; @@ -85,35 +82,12 @@ export const RoomWidgetsView: FC<{}> = props => case RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR: widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_PLAYLIST_EDITOR, objectId, category, event.roomId)); break; - case RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: - widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, objectId, category, event.roomId)); - break; - case RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING: - widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_BADGE_DISPLAY_ENGRAVING, objectId, category, event.roomId)); - break; - case RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED: { - const roomObject = GetRoomEngine().getRoomObject(event.roomId, objectId, category); - const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); - - if(ownerId === GetSessionDataManager().userId) - { - widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, objectId, category, event.roomId)); - } - break; - } case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: - case RoomEngineTriggerWidgetEvent.REMOVE_DIMMER: case RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY: case RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM: - case RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR: - case RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING: - case RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY: - case RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY: - case RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK: - case RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK: widgetHandler.processEvent(event); break; case RoomEngineRoomAdEvent.FURNI_CLICK: @@ -143,26 +117,15 @@ export const RoomWidgetsView: FC<{}> = props => UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TEASER, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.OPEN_WIDGET, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.CLOSE_WIDGET, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REMOVE_DIMMER, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_INVENTORY, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BACKGROUND_COLOR, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, onRoomEngineObjectEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineRoomAdEvent.FURNI_CLICK, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineRoomAdEvent.FURNI_DOUBLE_CLICK, onRoomEngineObjectEvent); UseRoomEngineEvent(RoomEngineRoomAdEvent.TOOLTIP_SHOW, onRoomEngineObjectEvent); diff --git a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx b/src/components/room/widgets/furniture/FurnitureDimmerView.tsx similarity index 86% rename from src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx rename to src/components/room/widgets/furniture/FurnitureDimmerView.tsx index 544c1f35..39222896 100644 --- a/src/components/room/widgets/furniture/dimmer/FurnitureDimmerView.tsx +++ b/src/components/room/widgets/furniture/FurnitureDimmerView.tsx @@ -2,11 +2,10 @@ import { NitroEvent } from '@nitrots/nitro-renderer'; import classNames from 'classnames'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import ReactSlider from 'react-slider'; -import { ColorUtils, GetConfiguration, LocalizeText, RoomWidgetDimmerChangeStateMessage, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent } from '../../../../../api'; -import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../../common'; -import { UseEventDispatcherHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { DimmerFurnitureWidgetPresetItem } from './DimmerFurnitureWidgetPresetItem'; +import { ColorUtils, DimmerFurnitureWidgetPresetItem, GetConfiguration, LocalizeText, RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent } from '../../../../api'; +import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../common'; +import { UseEventDispatcherHook, useFurnitureDimmerWidget } from '../../../../hooks'; +import { useRoomContext } from '../../RoomContext'; const AVAILABLE_COLORS: number[] = [ 7665141, 21495, 15161822, 15353138, 15923281, 8581961, 0 ]; const HTML_COLORS: string[] = [ '#74F5F5', '#0053F7', '#E759DE', '#EA4532', '#F2F851', '#82F349', '#000000' ]; @@ -26,6 +25,7 @@ export const FurnitureDimmerView: FC<{}> = props => const [ selectedEffectId, setSelectedEffectId ] = useState(0); const [ selectedColor, setSelectedColor ] = useState(0); const [ selectedBrightness, setSelectedBrightness ] = useState(0); + const { savePreset = null, changeState = null, previewDimmer = null } = useFurnitureDimmerWidget(); const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); const onNitroEvent = useCallback((event: NitroEvent) => @@ -85,15 +85,12 @@ export const FurnitureDimmerView: FC<{}> = props => const close = useCallback(() => { - widgetHandler.processWidgetMessage(new RoomWidgetDimmerPreviewMessage(color, brightness, (effectId === 2))); + previewDimmer(color, brightness, (effectId === 2)); setIsVisible(false); - }, [ widgetHandler, color, brightness, effectId ]); + }, [ color, brightness, effectId, previewDimmer ]); - const toggleState = useCallback(() => - { - widgetHandler.processWidgetMessage(new RoomWidgetDimmerChangeStateMessage()); - }, [ widgetHandler ]); + const toggleState = () => changeState(); const applyChanges = useCallback(() => { @@ -116,8 +113,8 @@ export const FurnitureDimmerView: FC<{}> = props => return newValue; }); - widgetHandler.processWidgetMessage(new RoomWidgetDimmerSavePresetMessage(preset.id, selectedEffectId, selectedColor, selectedBrightness, true)); - }, [ widgetHandler, dimmerState, selectedPresetId, presets, selectedEffectId, selectedColor, selectedBrightness ]); + savePreset(preset.id, selectedEffectId, selectedColor, selectedBrightness, true); + }, [ dimmerState, selectedPresetId, presets, selectedEffectId, selectedColor, selectedBrightness, savePreset ]); const scaledBrightness = useCallback((value: number) => { @@ -130,8 +127,8 @@ export const FurnitureDimmerView: FC<{}> = props => { if((dimmerState === 0) && (lastDimmerState === 0)) return; - widgetHandler.processWidgetMessage(new RoomWidgetDimmerPreviewMessage(selectedColor, selectedBrightness, (selectedEffectId === 2))); - }, [ widgetHandler, dimmerState, lastDimmerState, selectedColor, selectedBrightness, selectedEffectId ]); + previewDimmer(selectedColor, selectedBrightness, (selectedEffectId === 2)); + }, [ dimmerState, lastDimmerState, selectedColor, selectedBrightness, selectedEffectId, previewDimmer ]); if(!isVisible) return null; diff --git a/src/components/room/widgets/furniture/FurnitureHighScoreView.tsx b/src/components/room/widgets/furniture/FurnitureHighScoreView.tsx new file mode 100644 index 00000000..e8b3fa97 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureHighScoreView.tsx @@ -0,0 +1,60 @@ +import { RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { LocalizeText } from '../../../../api'; +import { Column, Flex, Text } from '../../../../common'; +import { useFurnitureHighScoreWidget } from '../../../../hooks'; +import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; +import { ContextMenuListView } from '../context-menu/ContextMenuListView'; +import { ObjectLocationView } from '../object-location/ObjectLocationView'; + +export const FurnitureHighScoreView: FC<{}> = props => +{ + const { stuffDatas = null, getScoreType = null, getClearType = null } = useFurnitureHighScoreWidget(); + + if(!stuffDatas || !stuffDatas.size) return null; + + return ( + <> + { Array.from(stuffDatas.entries()).map(([ objectId, stuffData ], index) => + { + return ( + + + + { LocalizeText('high.score.display.caption', [ 'scoretype', 'cleartype' ], [ LocalizeText(`high.score.display.scoretype.${ getScoreType(stuffData.scoreType) }`), LocalizeText(`high.score.display.cleartype.${ getClearType(stuffData.clearType) }`) ]) } + + + + + + { LocalizeText('high.score.display.users.header') } + + + { LocalizeText('high.score.display.score.header') } + + +
    +
    + + { stuffData.entries.map((entry, index) => + { + return ( + + + { entry.users.join(', ') } + + + { entry.score } + + + ); + }) } + +
    +
    +
    + ); + }) } + + ); +} diff --git a/src/components/room/widgets/furniture/FurnitureInternalLinkView.tsx b/src/components/room/widgets/furniture/FurnitureInternalLinkView.tsx new file mode 100644 index 00000000..49ede026 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureInternalLinkView.tsx @@ -0,0 +1,9 @@ +import { FC } from 'react'; +import { useFurnitureInternalLinkWidget } from '../../../../hooks'; + +export const FurnitureInternalLinkView: FC<{}> = props => +{ + const {} = useFurnitureInternalLinkWidget(); + + return null; +} diff --git a/src/components/room/widgets/furniture/FurnitureRoomLinkView.tsx b/src/components/room/widgets/furniture/FurnitureRoomLinkView.tsx new file mode 100644 index 00000000..ea651902 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureRoomLinkView.tsx @@ -0,0 +1,9 @@ +import { FC } from 'react'; +import { useFurnitureRoomLinkWidget } from '../../../../hooks'; + +export const FurnitureRoomLinkView: FC<{}> = props => +{ + const {} = useFurnitureRoomLinkWidget(); + + return null; +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgets.scss b/src/components/room/widgets/furniture/FurnitureWidgets.scss index 84bf1758..a129da04 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgets.scss +++ b/src/components/room/widgets/furniture/FurnitureWidgets.scss @@ -248,8 +248,65 @@ } } } - } -@import "./high-score/FurnitureHighScoreView"; -@import "./youtube-tv/FurnitureYoutubeDisplayView"; +.nitro-widget-high-score { + width: 250px; + max-width: 250px; + height: 200px; +} + +.youtube-tv-widget { + width: 600px; + height: 380px; + + .youtube-video-container { + //min-height: 366px; + + .empty-video { + background-color: black; + color: white; + width: 100%; + height: 100%; + text-align: center; + } + + .youtubeContainer { + position: relative; + width: 100%; + height: 100%; + //height: 0; + //padding-bottom: 56.25%; + overflow: hidden; + margin-bottom: 50px; + } + + .youtubeContainer iframe { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + } + } + + .playlist-container { + overflow-y: hidden; + margin-right: -10px; + color: black; + height: 100%; + + .playlist-controls { + width: 100%; + .icon { + margin-right: 10px; + margin-bottom: 10px; + } + } + + .playlist-grid { + height: 100%; + width: 100%; + } + } +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index b560d8b1..59237ba3 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -1,39 +1,43 @@ import { FC } from 'react'; import { Base } from '../../../../common'; import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuView'; -import { FurnitureDimmerView } from './dimmer/FurnitureDimmerView'; import { FurnitureBackgroundColorView } from './FurnitureBackgroundColorView'; import { FurnitureBadgeDisplayView } from './FurnitureBadgeDisplayView'; import { FurnitureCustomStackHeightView } from './FurnitureCustomStackHeightView'; +import { FurnitureDimmerView } from './FurnitureDimmerView'; import { FurnitureExchangeCreditView } from './FurnitureExchangeCreditView'; import { FurnitureExternalImageView } from './FurnitureExternalImageView'; import { FurnitureFriendFurniView } from './FurnitureFriendFurniView'; import { FurnitureGiftOpeningView } from './FurnitureGiftOpeningView'; +import { FurnitureHighScoreView } from './FurnitureHighScoreView'; +import { FurnitureInternalLinkView } from './FurnitureInternalLinkView'; import { FurnitureManipulationMenuView } from './FurnitureManipulationMenuView'; import { FurnitureMannequinView } from './FurnitureMannequinView'; +import { FurnitureRoomLinkView } from './FurnitureRoomLinkView'; import { FurnitureStickieView } from './FurnitureStickieView'; import { FurnitureTrophyView } from './FurnitureTrophyView'; -import { FurnitureHighScoreView } from './high-score/FurnitureHighScoreView'; -import { FurnitureYoutubeDisplayView } from './youtube-tv/FurnitureYoutubeDisplayView'; +import { FurnitureYoutubeDisplayView } from './FurnitureYoutubeDisplayView'; export const FurnitureWidgetsView: FC<{}> = props => { return ( - + + + - + + - - + ); diff --git a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx new file mode 100644 index 00000000..0f967981 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx @@ -0,0 +1,104 @@ +import { FC, useCallback, useEffect, useState } from 'react'; +import YouTube, { Options } from 'react-youtube'; +import { YouTubePlayer } from 'youtube-player/dist/types'; +import { LocalizeText, YoutubeVideoPlaybackStateEnum } from '../../../../api'; +import { Grid, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; +import { useFurnitureYoutubeWidget } from '../../../../hooks'; + +export const FurnitureYoutubeDisplayView: FC<{}> = props => +{ + const [ player, setPlayer ] = useState(null); + const { objectId = -1, videoId = null, videoStart = 0, videoEnd = 0, currentVideoState = null, selectedVideo = null, playlists = [], close = null, previous = null, next = null, pause = null, play = null, selectVideo = null } = useFurnitureYoutubeWidget(); + + const onStateChange = useCallback((event: { target: YouTubePlayer; data: number }) => + { + setPlayer(event.target); + + if(objectId === -1) return; + + switch(event.target.getPlayerState()) + { + case -1: + case 1: + if(currentVideoState === 2) + { + //event.target.pauseVideo(); + } + + if(currentVideoState !== 1) play(); + return; + case 2: + if(currentVideoState !== 2) pause(); + } + }, [ objectId, currentVideoState, play, pause ]); + + useEffect(() => + { + if((currentVideoState === null) || !player) return; + + if((currentVideoState === YoutubeVideoPlaybackStateEnum.PLAYING) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PLAYING)) + { + player.playVideo(); + + return; + } + + if((currentVideoState === YoutubeVideoPlaybackStateEnum.PAUSED) && (player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PAUSED)) + { + player.pauseVideo(); + + return; + } + }, [ currentVideoState, player ]); + + if(objectId === -1) return null; + + const youtubeOptions: Options = { + height: '375', + width: '500', + playerVars: { + autoplay: 1, + disablekb: 1, + controls: 0, + origin: window.origin, + modestbranding: 1, + start: videoStart, + end: videoEnd + } + } + + return ( + + + +
    +
    + { (videoId && videoId.length > 0) && + setPlayer(event.target) } onStateChange={ onStateChange } containerClassName={ 'youtubeContainer' } /> + } + { (!videoId || videoId.length === 0) && +
    { LocalizeText('widget.furni.video_viewer.no_videos') }
    + } +
    +
    + + + + +
    { LocalizeText('widget.furni.video_viewer.playlists') }
    + + { playlists && playlists.map((entry, index) => + { + return ( + selectVideo(entry.video) } itemActive={ (entry.video === selectedVideo) }> + { entry.title } - { entry.description } + + ) + }) } + +
    +
    +
    +
    + ) +} diff --git a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss deleted file mode 100644 index a02f8b69..00000000 --- a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.scss +++ /dev/null @@ -1,6 +0,0 @@ -.nitro-widget-high-score -{ - width: 250px; - max-width: 250px; - height: 200px; -} diff --git a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx b/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx deleted file mode 100644 index 77c70570..00000000 --- a/src/components/room/widgets/furniture/high-score/FurnitureHighScoreView.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, LocalizeText } from '../../../../../api'; -import { Column, Flex, Text } from '../../../../../common'; -import { UseRoomEngineEvent } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView'; -import { ContextMenuListView } from '../../context-menu/ContextMenuListView'; -import { ObjectLocationView } from '../../object-location/ObjectLocationView'; - -const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; -const CLEAR_TYPES = [ 'alltime', 'daily', 'weekly', 'monthly' ]; - -export const FurnitureHighScoreView: FC<{}> = props => -{ - const [ stuffDatas, setStuffDatas ] = useState>(new Map()); - const { roomSession = null } = useRoomContext(); - - const onRoomEngineTriggerWidgetEvent = useCallback((event: RoomEngineTriggerWidgetEvent) => - { - switch(event.type) - { - case RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY: { - const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category); - - if(!object) return; - - const formatKey = object.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); - const stuffData = (ObjectDataFactory.getData(formatKey) as HighScoreDataType); - - stuffData.initializeFromRoomObjectModel(object.model); - - setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); - - newValue.set(object.id, stuffData); - - return newValue; - }); - return; - } - case RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY: - if(event.roomId !== roomSession.roomId) return; - - setStuffDatas(prevValue => - { - const newValue = new Map(prevValue); - - newValue.delete(event.objectId); - - return newValue; - }); - return; - } - }, [ roomSession ]); - - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, onRoomEngineTriggerWidgetEvent); - - if(!stuffDatas.size) return null; - - return ( - <> - { Array.from(stuffDatas.entries()).map(([ objectId, stuffData ], index) => - { - return ( - - - - { LocalizeText('high.score.display.caption', [ 'scoretype', 'cleartype' ], [ LocalizeText(`high.score.display.scoretype.${ SCORE_TYPES[stuffData.scoreType] }`), LocalizeText(`high.score.display.cleartype.${ CLEAR_TYPES[stuffData.clearType] }`) ]) } - - - - - - { LocalizeText('high.score.display.users.header') } - - - { LocalizeText('high.score.display.score.header') } - - -
    -
    - - { stuffData.entries.map((entry, index) => - { - return ( - - - { entry.users.join(', ') } - - - { entry.score } - - - ); - }) } - -
    -
    -
    - ); - }) } - - ); -} diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss deleted file mode 100644 index c782b781..00000000 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.scss +++ /dev/null @@ -1,54 +0,0 @@ -.youtube-tv-widget { - width: 600px; - height: 380px; - - .youtube-video-container { - //min-height: 366px; - - .empty-video { - background-color: black; - color: white; - width: 100%; - height: 100%; - text-align: center; - } - - .youtubeContainer { - position: relative; - width: 100%; - height: 100%; - //height: 0; - //padding-bottom: 56.25%; - overflow: hidden; - margin-bottom: 50px; - } - - .youtubeContainer iframe { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - } - } - - .playlist-container { - overflow-y: hidden; - margin-right: -10px; - color: black; - height: 100%; - - .playlist-controls { - width: 100%; - .icon { - margin-right: 10px; - margin-bottom: 10px; - } - } - - .playlist-grid { - height: 100%; - width: 100%; - } - } -} diff --git a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx deleted file mode 100644 index 2a005287..00000000 --- a/src/components/room/widgets/furniture/youtube-tv/FurnitureYoutubeDisplayView.tsx +++ /dev/null @@ -1,239 +0,0 @@ -import { ControlYoutubeDisplayPlaybackMessageComposer, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; -import YouTube, { Options } from 'react-youtube'; -import { FurnitureYoutubeDisplayWidgetHandler, LocalizeText, RoomWidgetUpdateYoutubeDisplayEvent, SendMessageComposer } from '../../../../../api'; -import { Grid, LayoutGridItem, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../common'; -import { UseEventDispatcherHook, UseMessageEventHook } from '../../../../../hooks'; -import { useRoomContext } from '../../../RoomContext'; -import { YoutubeVideoPlaybackStateEnum } from './utils/YoutubeVideoPlaybackStateEnum'; - -export const FurnitureYoutubeDisplayView: FC<{}> = props => -{ - const [ objectId, setObjectId ] = useState(-1); - const [ videoId, setVideoId ] = useState(null); - const [ videoStart, setVideoStart ] = useState(null); - const [ videoEnd, setVideoEnd ] = useState(null); - const [ currentVideoState, setCurrentVideoState ] = useState(-1); - const [ selectedItem, setSelectedItem ] = useState(null); - const [ playlists, setPlaylists ] = useState(null); - const [ hasControl, setHasControl ] = useState(false); - const [ player, setPlayer ] = useState(null); - const { eventDispatcher = null } = useRoomContext(); - - const onRoomWidgetUpdateYoutubeDisplayEvent = useCallback((event: RoomWidgetUpdateYoutubeDisplayEvent) => - { - switch(event.type) - { - case RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY: { - setObjectId(event.objectId); - setHasControl(event.hasControl); - } - } - }, []); - - const close = useCallback(() => - { - setObjectId(-1); - setSelectedItem(null); - setPlaylists(null); - setHasControl(false); - setVideoId(null); - setVideoEnd(null); - setVideoStart(null); - setCurrentVideoState(-1); - }, []); - - UseEventDispatcherHook(RoomWidgetUpdateYoutubeDisplayEvent.UPDATE_YOUTUBE_DISPLAY, eventDispatcher, onRoomWidgetUpdateYoutubeDisplayEvent); - - const onVideo = useCallback((event: YoutubeDisplayVideoMessageEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - setVideoId(parser.videoId); - setVideoStart(parser.startAtSeconds); - setVideoEnd(parser.endAtSeconds); - setCurrentVideoState(parser.state); - }, [ objectId ]); - - const onPlaylists = useCallback((event: YoutubeDisplayPlaylistsEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - setPlaylists(parser.playlists); - setSelectedItem(parser.selectedPlaylistId); - setVideoId(null); - setCurrentVideoState(-1); - setVideoEnd(null); - setVideoStart(null); - }, [ objectId ]); - - const onControlVideo = useCallback((event: YoutubeControlVideoMessageEvent) => - { - if(objectId === -1) return; - - const parser = event.getParser(); - - if(objectId !== parser.furniId) return; - - switch(parser.commandId) - { - case 1: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING); - if(player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PLAYING) - player.playVideo(); - break; - case 2: - setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED); - if(player.getPlayerState() !== YoutubeVideoPlaybackStateEnum.PAUSED) - player.pauseVideo(); - break; - } - }, [ objectId, player ]); - - UseMessageEventHook(YoutubeDisplayVideoMessageEvent, onVideo); - UseMessageEventHook(YoutubeDisplayPlaylistsEvent, onPlaylists); - UseMessageEventHook(YoutubeControlVideoMessageEvent, onControlVideo); - - const processAction = useCallback((action: string) => - { - switch(action) - { - case 'playlist_prev': - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_PREVIOUS_VIDEO)); - break; - case 'playlist_next': - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_NEXT_VIDEO)); - break; - case 'video_pause': - if(hasControl && videoId && videoId.length) - { - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_PAUSE_VIDEO)); - } - break; - case 'video_play': - if(hasControl && videoId && videoId.length) - { - SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, FurnitureYoutubeDisplayWidgetHandler.CONTROL_COMMAND_CONTINUE_VIDEO)); - } - break; - default: - if(selectedItem === action) - { - setSelectedItem(null); - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, '')); - return; - } - SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, action)); - setSelectedItem(action); - } - }, [ hasControl, objectId, selectedItem, videoId ]); - - const onReady = useCallback((event: any) => - { - setPlayer(event.target); - }, []); - - const onStateChange = useCallback((event: any) => - { - setPlayer(event.target); - if(objectId) - { - switch(event.target.getPlayerState()) - { - case -1: - case 1: - if(currentVideoState === 2) - { - //event.target.pauseVideo(); - } - if(currentVideoState !== 1) - { - processAction('video_play'); - } - return; - case 2: - if(currentVideoState !== 2) - { - processAction('video_pause'); - } - } - } - }, [ currentVideoState, objectId, processAction ]); - - const getYoutubeOpts = useMemo( () => - { - if(!videoStart && !videoEnd) - { - return { - height: '375', - width: '500', - playerVars: { - autoplay: 1, - disablekb: 1, - controls: 0, - origin: window.origin, - modestbranding: 1 - } - } - } - - return { - height: '375', - width: '500', - playerVars: { - autoplay: 1, - disablekb: 1, - controls: 0, - origin: window.origin, - modestbranding: 1, - start: videoStart, - end: videoEnd - } - } - }, [ videoEnd, videoStart ]); - - if((objectId === -1)) return null; - - return ( - - - -
    -
    - { (videoId && videoId.length > 0) && - - } - { (!videoId || videoId.length === 0) && -
    { LocalizeText('widget.furni.video_viewer.no_videos') }
    - } -
    -
    - - processAction('playlist_prev') } /> - processAction('playlist_next') } /> - -
    { LocalizeText('widget.furni.video_viewer.playlists') }
    - - { playlists && playlists.map((entry, index) => - { - return ( - processAction(entry.video) } itemActive={ entry.video === selectedItem }> - { entry.title } - { entry.description } - - ) - }) } - -
    -
    -
    -
    - ) -} diff --git a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx index b635dedf..57bb6106 100644 --- a/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx +++ b/src/components/room/widgets/room-tools/RoomToolsWidgetView.tsx @@ -53,12 +53,12 @@ export const RoomToolsWidgetView: FC<{}> = props => { const parser = event.getParser(); - if(!parser.roomEnter) return; + if(!parser.roomEnter || (parser.data.roomId !== roomSession.roomId)) return; if(roomName !== parser.data.roomName) setRoomName(parser.data.roomName); if(roomOwner !== parser.data.ownerName) setRoomOwner(parser.data.ownerName); if(roomTags !== parser.data.tags) setRoomTags(parser.data.tags); - }, [ roomName, roomOwner, roomTags ]); + }, [ roomSession, roomName, roomOwner, roomTags ]); UseMessageEventHook(GetGuestRoomResultEvent, onGetGuestRoomResultEvent); diff --git a/src/components/user-settings/UserSettingsView.tsx b/src/components/user-settings/UserSettingsView.tsx index 3564203b..3f8fc5b2 100644 --- a/src/components/user-settings/UserSettingsView.tsx +++ b/src/components/user-settings/UserSettingsView.tsx @@ -124,7 +124,7 @@ export const UserSettingsView: FC<{}> = props => DispatchUiEvent(userSettings); }, [ userSettings ]); - if(!isVisible) return null; + if(!isVisible || !userSettings) return null; return ( diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts index 4d82cb6e..16988ff9 100644 --- a/src/hooks/rooms/useRoom.ts +++ b/src/hooks/rooms/useRoom.ts @@ -1,7 +1,7 @@ import { EventDispatcher, IRoomSession, RoomEngineEvent, RoomGeometry, RoomId, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; import { useCallback, useEffect, useState } from 'react'; import { useBetween } from 'use-between'; -import { FurnitureContextMenuWidgetHandler, FurnitureDimmerWidgetHandler, FurnitureInternalLinkHandler, FurnitureRoomLinkHandler, FurnitureYoutubeDisplayWidgetHandler, GetNitroInstance, GetRoomEngine, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IRoomWidgetHandlerManager, PollWidgetHandler, RoomWidgetAvatarInfoHandler, RoomWidgetChatHandler, RoomWidgetChatInputHandler, RoomWidgetHandlerManager, RoomWidgetInfostandHandler, SetActiveRoomId, StartRoomSession, WordQuizWidgetHandler } from '../../api'; +import { FurnitureContextMenuWidgetHandler, GetNitroInstance, GetRoomEngine, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IRoomWidgetHandlerManager, PollWidgetHandler, RoomWidgetAvatarInfoHandler, RoomWidgetChatHandler, RoomWidgetChatInputHandler, RoomWidgetHandlerManager, RoomWidgetInfostandHandler, SetActiveRoomId, StartRoomSession, WordQuizWidgetHandler } from '../../api'; import { UseRoomEngineEvent, UseRoomSessionManagerEvent } from '../events'; const useRoomState = () => @@ -85,10 +85,6 @@ const useRoomState = () => widgetHandlerManager.registerHandler(new WordQuizWidgetHandler()); widgetHandlerManager.registerHandler(new PollWidgetHandler()); widgetHandlerManager.registerHandler(new FurnitureContextMenuWidgetHandler()); - widgetHandlerManager.registerHandler(new FurnitureDimmerWidgetHandler()); - widgetHandlerManager.registerHandler(new FurnitureYoutubeDisplayWidgetHandler()); - widgetHandlerManager.registerHandler(new FurnitureInternalLinkHandler()); - widgetHandlerManager.registerHandler(new FurnitureRoomLinkHandler()); setWidgetHandler(widgetHandlerManager); diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts index 478ede29..288908a5 100644 --- a/src/hooks/rooms/widgets/furniture/index.ts +++ b/src/hooks/rooms/widgets/furniture/index.ts @@ -1,11 +1,16 @@ export * from './useFurnitureBackgroundColorWidget'; export * from './useFurnitureBadgeDisplayWidget'; +export * from './useFurnitureDimmerWidget'; export * from './useFurnitureExchangeWidget'; export * from './useFurnitureExternalImageWidget'; export * from './useFurnitureFriendFurniWidget'; +export * from './useFurnitureHighScoreWidget'; +export * from './useFurnitureInternalLinkWidget'; export * from './useFurnitureManipulationWidget'; export * from './useFurnitureMannequinWidget'; export * from './useFurniturePresentWidget'; +export * from './useFurnitureRoomLinkWidget'; export * from './useFurnitureStackHeightWidget'; export * from './useFurnitureStickieWidget'; export * from './useFurnitureTrophyWidget'; +export * from './useFurnitureYoutubeWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts index 8c20ef46..f5effe38 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts @@ -1,6 +1,6 @@ -import { RoomEngineTriggerWidgetEvent, StringDataType } from '@nitrots/nitro-renderer'; +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable, StringDataType } from '@nitrots/nitro-renderer'; import { useCallback, useState } from 'react'; -import { GetRoomEngine, LocalizeBadgeDescription, LocalizeBadgeName } from '../../../../api'; +import { GetRoomEngine, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText, NotificationUtilities } from '../../../../api'; import { UseRoomEngineEvent } from '../../../events'; import { useFurniRemovedEvent } from '../../useFurniRemovedEvent'; @@ -44,8 +44,21 @@ const useFurnitureBadgeDisplayWidgetState = () => setSenderName(stringStuff.getValue(3)); }, []); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, onRoomEngineTriggerWidgetEvent); - UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, onRoomEngineTriggerWidgetEvent); + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_BADGE_DISPLAY_ENGRAVING, onRoomEngineTriggerWidgetEvent); + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING, onRoomEngineTriggerWidgetEvent); + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ACHIEVEMENT_RESOLUTION_FAILED, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const ownerId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_OWNER_ID); + + if(ownerId !== GetSessionDataManager().userId) return; + + NotificationUtilities.simpleAlert(`${ LocalizeText('resolution.failed.subtitle') } ${ LocalizeText('resolution.failed.text') }`, null, null, null, LocalizeText('resolution.failed.title')); + }); useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => { diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts new file mode 100644 index 00000000..e990c7b5 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts @@ -0,0 +1,71 @@ +import { RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; +import { GetRoomEngine, GetSessionDataManager, RoomWidgetUpdateDimmerEvent, RoomWidgetUpdateDimmerStateEvent } from '../../../../api'; +import { UseRoomEngineEvent, UseRoomSessionManagerEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const useFurnitureDimmerWidgetState = () => +{ + const { roomSession = null, widgetHandler = null } = useRoom(); + + const canOpenWidget = () => (roomSession.isRoomOwner || (roomSession.controllerLevel >= RoomControllerLevel.GUEST) || GetSessionDataManager().isModerator); + + const savePreset = (presetNumber: number, effectTypeId: number, color: number, brightness: number, apply: boolean) => + { + if(!canOpenWidget()) return; + + roomSession.updateMoodlightData(presetNumber, effectTypeId, color, brightness, apply); + } + + const changeState = () => + { + if(!canOpenWidget()) return; + + roomSession.toggleMoodlightState(); + } + + const previewDimmer = (color: number, brightness: number, bgOnly: boolean) => + { + GetRoomEngine().updateObjectRoomColor(roomSession.roomId, color, brightness, bgOnly); + } + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, event => + { + if(!canOpenWidget()) return; + + roomSession.requestMoodlightSettings(); + }); + + UseRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => + { + widgetHandler.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerStateEvent(event.state, event.presetId, event.effectId, event.color, event.brightness)); + }); + + UseRoomSessionManagerEvent(RoomSessionDimmerPresetsEvent.ROOM_DIMMER_PRESETS, event => + { + const updateEvent = new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.PRESETS); + + updateEvent.selectedPresetId = event.selectedPresetId; + + let i = 0; + + while(i < event.presetCount) + { + const preset = event.getPreset(i); + + if(preset) updateEvent.setPresetValues(preset.id, preset.type, preset.color, preset.brightness); + + i++; + } + + widgetHandler.eventDispatcher.dispatchEvent(updateEvent); + }); + + UseRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => + { + widgetHandler.eventDispatcher.dispatchEvent(new RoomWidgetUpdateDimmerEvent(RoomWidgetUpdateDimmerEvent.HIDE)); + }); + + return { savePreset, changeState, previewDimmer }; +} + +export const useFurnitureDimmerWidget = useFurnitureDimmerWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts new file mode 100644 index 00000000..1001736d --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureHighScoreWidget.ts @@ -0,0 +1,56 @@ +import { HighScoreDataType, ObjectDataFactory, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine } from '../../../../api'; +import { UseRoomEngineEvent } from '../../../events'; +import { useRoom } from '../../useRoom'; + +const SCORE_TYPES = [ 'perteam', 'mostwins', 'classic' ]; +const CLEAR_TYPES = [ 'alltime', 'daily', 'weekly', 'monthly' ]; + +const useFurnitureHighScoreWidgetState = () => +{ + const [ stuffDatas, setStuffDatas ] = useState>(new Map()); + const { roomSession = null, widgetHandler = null } = useRoom(); + + const getScoreType = (type: number) => SCORE_TYPES[type]; + const getClearType = (type: number) => CLEAR_TYPES[type]; + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIGH_SCORE_DISPLAY, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const formatKey = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA_FORMAT); + const stuffData = (ObjectDataFactory.getData(formatKey) as HighScoreDataType); + + stuffData.initializeFromRoomObjectModel(roomObject.model); + + setStuffDatas(prevValue => + { + const newValue = new Map(prevValue); + + newValue.set(roomObject.id, stuffData); + + return newValue; + }); + }); + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_HIDE_HIGH_SCORE_DISPLAY, event => + { + if(event.roomId !== roomSession.roomId) return; + + setStuffDatas(prevValue => + { + const newValue = new Map(prevValue); + + newValue.delete(event.objectId); + + return newValue; + }); + }); + + return { stuffDatas, getScoreType, getClearType }; +} + +export const useFurnitureHighScoreWidget = useFurnitureHighScoreWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts new file mode 100644 index 00000000..8fe3e93c --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureInternalLinkWidget.ts @@ -0,0 +1,27 @@ +import { RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { CreateLinkEvent, GetRoomEngine } from '../../../../api'; +import { UseRoomEngineEvent } from '../../../events'; + +const INTERNALLINK = 'internalLink'; + +const useFurnitureInternalLinkWidgetState = () => +{ + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_INTERNAL_LINK, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + let link = data[INTERNALLINK]; + + if(!link || !link.length) link = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); + + if(link && link.length) CreateLinkEvent(link); + }); + + return {}; +} + +export const useFurnitureInternalLinkWidget = useFurnitureInternalLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts new file mode 100644 index 00000000..0e8faea4 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureRoomLinkWidget.ts @@ -0,0 +1,58 @@ +import { GetGuestRoomResultEvent, RoomEngineTriggerWidgetEvent, RoomInfoComposer, RoomObjectVariable } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; +import { GetCommunication, GetRoomEngine, SendMessageComposer } from '../../../../api'; +import { UseRoomEngineEvent } from '../../../events'; + +const INTERNALLINK = 'internalLink'; + +const useFurnitureRoomLinkWidgetState = () => +{ + const [ roomIdToEnter, setRoomIdToEnter ] = useState(0); + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_ROOM_LINK, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + if(!roomObject) return; + + const data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + let roomId = data[INTERNALLINK]; + + if(!roomId || !roomId.length) roomId = roomObject.model.getValue(RoomObjectVariable.FURNITURE_INTERNAL_LINK); + + if(!roomId || !roomId.length) return; + + roomId = parseInt(roomId, 10); + + if(roomId === NaN) return; + + setRoomIdToEnter(roomId); + + SendMessageComposer(new RoomInfoComposer(roomId, false, false)); + }); + + useEffect(() => + { + if(!roomIdToEnter) return; + + const onGetGuestRoomResultEvent = (event: GetGuestRoomResultEvent) => + { + const parser = event.getParser(); + + if(parser.data.roomId !== roomIdToEnter) return; + + setRoomIdToEnter(0); + } + + const event = new GetGuestRoomResultEvent(onGetGuestRoomResultEvent); + + GetCommunication().registerMessageEvent(event); + + return () => GetCommunication().removeMessageEvent(event); + }, [ roomIdToEnter ]); + + return {}; +} + +export const useFurnitureRoomLinkWidget = useFurnitureRoomLinkWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts new file mode 100644 index 00000000..0b672fd8 --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts @@ -0,0 +1,136 @@ +import { ControlYoutubeDisplayPlaybackMessageComposer, GetYoutubeDisplayStatusMessageComposer, RoomEngineTriggerWidgetEvent, SecurityLevel, SetYoutubeDisplayPlaylistMessageComposer, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylist, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from '@nitrots/nitro-renderer'; +import { useCallback, useState } from 'react'; +import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture, SendMessageComposer, YoutubeVideoPlaybackStateEnum } from '../../../../api'; +import { UseRoomEngineEvent } from '../../../events'; +import { UseMessageEventHook } from '../../../messages'; +import { useFurniRemovedEvent } from '../../useFurniRemovedEvent'; + +const CONTROL_COMMAND_PREVIOUS_VIDEO = 0; +const CONTROL_COMMAND_NEXT_VIDEO = 1; +const CONTROL_COMMAND_PAUSE_VIDEO = 2; +const CONTROL_COMMAND_CONTINUE_VIDEO = 3; + +const useFurnitureYoutubeWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ videoId, setVideoId ] = useState(null); + const [ videoStart, setVideoStart ] = useState(null); + const [ videoEnd, setVideoEnd ] = useState(null); + const [ currentVideoState, setCurrentVideoState ] = useState(-1); + const [ selectedVideo, setSelectedVideo ] = useState(null); + const [ playlists, setPlaylists ] = useState(null); + const [ hasControl, setHasControl ] = useState(false); + + const close = () => + { + setObjectId(-1); + setCategory(-1); + setVideoId(null); + setVideoStart(null); + setVideoEnd(null); + setCurrentVideoState(-1); + setSelectedVideo(null); + setPlaylists(null); + setHasControl(false); + } + + const previous = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PREVIOUS_VIDEO)); + + const next = () => SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_NEXT_VIDEO)); + + const pause = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_PAUSE_VIDEO)); + + const play = () => (hasControl && videoId && videoId.length) && SendMessageComposer(new ControlYoutubeDisplayPlaybackMessageComposer(objectId, CONTROL_COMMAND_CONTINUE_VIDEO)); + + const selectVideo = (video: string) => + { + if(selectedVideo === video) + { + setSelectedVideo(null); + SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, '')); + + return; + } + + setSelectedVideo(video); + SendMessageComposer(new SetYoutubeDisplayPlaylistMessageComposer(objectId, video)); + } + + UseRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_YOUTUBE, event => + { + const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category); + + console.log(roomObject); + + if(!roomObject) return; + + setObjectId(event.objectId); + setCategory(event.category); + setHasControl(GetSessionDataManager().hasSecurity(SecurityLevel.EMPLOYEE) || IsOwnerOfFurniture(roomObject)); + + console.log('??') + + SendMessageComposer(new GetYoutubeDisplayStatusMessageComposer(event.objectId)); + }); + + useFurniRemovedEvent(((objectId !== -1) && (category !== -1)), event => + { + if((event.id !== objectId) || (event.category !== category)) return; + + close(); + }); + + const onYoutubeDisplayVideoMessageEvent = useCallback((event: YoutubeDisplayVideoMessageEvent) => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + setVideoId(parser.videoId); + setVideoStart(parser.startAtSeconds); + setVideoEnd(parser.endAtSeconds); + setCurrentVideoState(parser.state); + }, [ objectId ]); + + UseMessageEventHook(YoutubeDisplayVideoMessageEvent, onYoutubeDisplayVideoMessageEvent); + + const onYoutubeDisplayPlaylistsEvent = useCallback((event: YoutubeDisplayPlaylistsEvent) => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + setPlaylists(parser.playlists); + setSelectedVideo(parser.selectedPlaylistId); + setVideoId(null); + setCurrentVideoState(-1); + setVideoEnd(null); + setVideoStart(null); + }, [ objectId ]); + + UseMessageEventHook(YoutubeDisplayPlaylistsEvent, onYoutubeDisplayPlaylistsEvent); + + const onYoutubeControlVideoMessageEvent = useCallback((event: YoutubeControlVideoMessageEvent) => + { + const parser = event.getParser(); + + if((objectId === -1) || (objectId !== parser.furniId)) return; + + switch(parser.commandId) + { + case 1: + setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PLAYING); + break; + case 2: + setCurrentVideoState(YoutubeVideoPlaybackStateEnum.PAUSED); + break; + } + }, [ objectId ]); + + UseMessageEventHook(YoutubeControlVideoMessageEvent, onYoutubeControlVideoMessageEvent); + + return { objectId, videoId, videoStart, videoEnd, currentVideoState, selectedVideo, playlists, close, previous, next, pause, play, selectVideo }; +} + +export const useFurnitureYoutubeWidget = useFurnitureYoutubeWidgetState; From 1e6d8e490b73846a420552680f79a4abcf1d025e Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 2 May 2022 02:34:10 -0400 Subject: [PATCH 259/331] Update @types/react --- package.json | 12 +- src/common/Base.tsx | 11 +- .../draggable-window/DraggableWindow.tsx | 3 +- src/common/layout/LayoutRoomPreviewerView.tsx | 7 +- .../transitions/TransitionAnimation.tsx | 3 +- .../views/AchievementDetailsView.tsx | 4 +- .../AchievementListItemView.tsx | 4 +- .../achievement-list/AchievementListView.tsx | 4 +- .../AchievementsCategoryListItemView.tsx | 4 +- .../AchievementsCategoryListView.tsx | 4 +- .../views/badge/InventoryBadgeItemView.tsx | 4 +- .../views/bot/InventoryBotItemView.tsx | 4 +- .../views/pet/InventoryPetItemView.tsx | 4 +- src/components/toolbar/ToolbarMeView.tsx | 4 +- src/components/wired/views/WiredBaseView.tsx | 4 +- .../views/actions/WiredActionBaseView.tsx | 4 +- .../conditions/WiredConditionBaseView.tsx | 4 +- .../views/triggers/WiredTriggerBaseView.tsx | 4 +- tsconfig.json | 2 +- yarn.lock | 1026 +++++++++-------- 20 files changed, 601 insertions(+), 515 deletions(-) diff --git a/package.json b/package.json index 3a1738e8..a5ea631c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "@fortawesome/fontawesome-svg-core": "^6.1.0", "@fortawesome/free-solid-svg-icons": "^6.1.0", "@fortawesome/react-fontawesome": "^0.1.17", - "@nitrots/nitro-renderer": "^1.2.3", + "@nitrots/nitro-renderer": "^1.2.5", + "@types/react-transition-group": "^4.4.4", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", @@ -33,14 +34,15 @@ "use-between": "^1.3.1" }, "resolutions": { - "react-error-overlay": "6.0.9" + "react-error-overlay": "6.0.9", + "@types/react": "^18.0.8", + "@types/react-dom": "^18.0.3" }, "devDependencies": { "@types/node": "^12.20.19", - "@types/react": "^17.0.15", - "@types/react-dom": "^17.0.9", + "@types/react": "^18.0.8", + "@types/react-dom": "^18.0.3", "@types/react-slider": "^1.3.1", - "@types/react-transition-group": "^4.4.2", "@types/react-virtualized": "^9.21.13", "@typescript-eslint/eslint-plugin": "^5.17.0", "@typescript-eslint/parser": "^5.17.0", diff --git a/src/common/Base.tsx b/src/common/Base.tsx index 8bffe170..8ba38fc3 100644 --- a/src/common/Base.tsx +++ b/src/common/Base.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, DetailedHTMLProps, FC, HTMLAttributes, MutableRefObject, useMemo } from 'react'; +import { CSSProperties, DetailedHTMLProps, FC, HTMLAttributes, MutableRefObject, ReactNode, useMemo } from 'react'; import { ColorVariantType, DisplayType, FloatType, OverflowType, PositionType } from './types'; export interface BaseProps extends DetailedHTMLProps, T> @@ -17,11 +17,12 @@ export interface BaseProps extends DetailedHTMLProps> = props => { - const { ref = null, innerRef = null, display = null, fit = false, grow = false, shrink = false, fullWidth = false, fullHeight = false, overflow = null, position = null, float = null, pointer = false, visible = null, textColor = null, classNames = [], className = '', style = {}, ...rest } = props; + const { ref = null, innerRef = null, display = null, fit = false, grow = false, shrink = false, fullWidth = false, fullHeight = false, overflow = null, position = null, float = null, pointer = false, visible = null, textColor = null, classNames = [], className = '', style = {}, children = null, ...rest } = props; const getClassNames = useMemo(() => { @@ -72,5 +73,9 @@ export const Base: FC> = props => return newStyle; }, [ style ]); - return
    ; + return ( +
    + { children } +
    + ); } diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx index c2a7f301..05813e42 100644 --- a/src/common/draggable-window/DraggableWindow.tsx +++ b/src/common/draggable-window/DraggableWindow.tsx @@ -1,5 +1,5 @@ import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer'; -import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react'; +import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, ReactNode, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { Base } from '..'; import { DraggableWindowPosition } from './DraggableWindowPosition'; @@ -18,6 +18,7 @@ export interface DraggableWindowProps dragStyle?: CSSProperties; offsetLeft?: number; offsetTop?: number; + children?: ReactNode; } export const DraggableWindow: FC = props => diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx index 508ee08b..a45ca522 100644 --- a/src/common/layout/LayoutRoomPreviewerView.tsx +++ b/src/common/layout/LayoutRoomPreviewerView.tsx @@ -1,16 +1,17 @@ import { ColorConverter, IRoomRenderingCanvas, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useCallback, useEffect, useRef, useState } from 'react'; +import { FC, MouseEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import { GetNitroInstance } from '../../api'; export interface LayoutRoomPreviewerViewProps { roomPreviewer: RoomPreviewer; height?: number; + children?: ReactNode; } export const LayoutRoomPreviewerView: FC = props => { - const { roomPreviewer = null, height = 0 } = props; + const { roomPreviewer = null, height = 0, children = null } = props; const [ renderingCanvas, setRenderingCanvas ] = useState(null); const elementRef = useRef(); @@ -98,7 +99,7 @@ export const LayoutRoomPreviewerView: FC = props = return (
    - { props.children } + { children }
    ); } diff --git a/src/common/transitions/TransitionAnimation.tsx b/src/common/transitions/TransitionAnimation.tsx index 4f52e38f..6eefd2df 100644 --- a/src/common/transitions/TransitionAnimation.tsx +++ b/src/common/transitions/TransitionAnimation.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from 'react'; +import { FC, ReactNode, useEffect, useState } from 'react'; import { Transition } from 'react-transition-group'; import { getTransitionAnimationStyle } from './TransitionAnimationStyles'; @@ -8,6 +8,7 @@ interface TransitionAnimationProps inProp: boolean; timeout?: number; className?: string; + children?: ReactNode; } export const TransitionAnimation: FC = props => diff --git a/src/components/achievements/views/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx index 0c0065a9..2503098e 100644 --- a/src/components/achievements/views/AchievementDetailsView.tsx +++ b/src/components/achievements/views/AchievementDetailsView.tsx @@ -1,5 +1,5 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; +import { FC, PropsWithChildren } from 'react'; import { GetAchievementBadgeCode, GetAchievementLevel, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api'; import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common'; import { AchievementBadgeView } from './AchievementBadgeView'; @@ -9,7 +9,7 @@ interface AchievementDetailsViewProps achievement: AchievementData; } -export const AchievementDetailsView: FC = props => +export const AchievementDetailsView: FC> = props => { const { achievement = null, children = null, ...rest } = props; diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx index 1c1d0687..bf686088 100644 --- a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx @@ -1,5 +1,5 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction } from 'react'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; import { LayoutGridItem } from '../../../../common'; import { AchievementBadgeView } from '../AchievementBadgeView'; @@ -10,7 +10,7 @@ interface AchievementListItemViewProps setSelectedAchievementId: Dispatch>; } -export const AchievementListItemView: FC = props => +export const AchievementListItemView: FC> = props => { const { achievement = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx index 25cbb942..341af280 100644 --- a/src/components/achievements/views/achievement-list/AchievementListView.tsx +++ b/src/components/achievements/views/achievement-list/AchievementListView.tsx @@ -1,5 +1,5 @@ import { AchievementData } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction } from 'react'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; import { AutoGrid } from '../../../../common'; import { AchievementListItemView } from './AchievementListItemView'; @@ -10,7 +10,7 @@ interface AchievementListViewProps setSelectedAchievementId: Dispatch>; } -export const AchievementListView: FC = props => +export const AchievementListView: FC> = props => { const { achievements = null, selectedAchievementId = -1, setSelectedAchievementId = null, children = null, ...rest } = props; diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx index 7b301486..118b357f 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx @@ -1,4 +1,4 @@ -import { Dispatch, FC, SetStateAction } from 'react'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; import { GetAchievementCategoryImageUrl, GetAchievementCategoryMaxProgress, GetAchievementCategoryProgress, GetAchievementCategoryTotalUnseen, IAchievementCategory, LocalizeText } from '../../../../api'; import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common'; @@ -9,7 +9,7 @@ interface AchievementCategoryListItemViewProps setSelectedCategoryCode: Dispatch>; } -export const AchievementsCategoryListItemView: FC = props => +export const AchievementsCategoryListItemView: FC> = props => { const { category = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx index c0f51fa4..231cd4f4 100644 --- a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx +++ b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx @@ -1,4 +1,4 @@ -import { Dispatch, FC, SetStateAction } from 'react'; +import { Dispatch, FC, PropsWithChildren, SetStateAction } from 'react'; import { IAchievementCategory } from '../../../../api'; import { AutoGrid } from '../../../../common'; import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView'; @@ -10,7 +10,7 @@ interface AchievementsCategoryListViewProps setSelectedCategoryCode: Dispatch>; } -export const AchievementsCategoryListView: FC = props => +export const AchievementsCategoryListView: FC> = props => { const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null, children = null, ...rest } = props; diff --git a/src/components/inventory/views/badge/InventoryBadgeItemView.tsx b/src/components/inventory/views/badge/InventoryBadgeItemView.tsx index 4ec8c184..e5bfb71c 100644 --- a/src/components/inventory/views/badge/InventoryBadgeItemView.tsx +++ b/src/components/inventory/views/badge/InventoryBadgeItemView.tsx @@ -1,9 +1,9 @@ -import { FC } from 'react'; +import { FC, PropsWithChildren } from 'react'; import { UnseenItemCategory } from '../../../../api'; import { LayoutBadgeImageView, LayoutGridItem } from '../../../../common'; import { useInventoryBadges, useInventoryUnseenTracker } from '../../../../hooks'; -export const InventoryBadgeItemView: FC<{ badgeCode: string }> = props => +export const InventoryBadgeItemView: FC> = props => { const { badgeCode = null, children = null, ...rest } = props; const { selectedBadgeCode = null, setSelectedBadgeCode = null, getBadgeId = null } = useInventoryBadges(); diff --git a/src/components/inventory/views/bot/InventoryBotItemView.tsx b/src/components/inventory/views/bot/InventoryBotItemView.tsx index 8f71e14e..d2a15cf4 100644 --- a/src/components/inventory/views/bot/InventoryBotItemView.tsx +++ b/src/components/inventory/views/bot/InventoryBotItemView.tsx @@ -1,10 +1,10 @@ import { MouseEventType } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useState } from 'react'; +import { FC, MouseEvent, PropsWithChildren, useState } from 'react'; import { attemptBotPlacement, IBotItem, UnseenItemCategory } from '../../../../api'; import { LayoutAvatarImageView, LayoutGridItem } from '../../../../common'; import { useInventoryBots, useInventoryUnseenTracker } from '../../../../hooks'; -export const InventoryBotItemView: FC<{ botItem: IBotItem }> = props => +export const InventoryBotItemView: FC> = props => { const { botItem = null, children = null, ...rest } = props; const [ isMouseDown, setMouseDown ] = useState(false); diff --git a/src/components/inventory/views/pet/InventoryPetItemView.tsx b/src/components/inventory/views/pet/InventoryPetItemView.tsx index 194b1a2b..41b0619e 100644 --- a/src/components/inventory/views/pet/InventoryPetItemView.tsx +++ b/src/components/inventory/views/pet/InventoryPetItemView.tsx @@ -1,10 +1,10 @@ import { MouseEventType } from '@nitrots/nitro-renderer'; -import { FC, MouseEvent, useState } from 'react'; +import { FC, MouseEvent, PropsWithChildren, useState } from 'react'; import { attemptPetPlacement, IPetItem, UnseenItemCategory } from '../../../../api'; import { LayoutGridItem, LayoutPetImageView } from '../../../../common'; import { useInventoryPets, useInventoryUnseenTracker } from '../../../../hooks'; -export const InventoryPetItemView: FC<{ petItem: IPetItem }> = props => +export const InventoryPetItemView: FC> = props => { const { petItem = null, children = null, ...rest } = props; const [ isMouseDown, setMouseDown ] = useState(false); diff --git a/src/components/toolbar/ToolbarMeView.tsx b/src/components/toolbar/ToolbarMeView.tsx index 43599d88..aec2c46d 100644 --- a/src/components/toolbar/ToolbarMeView.tsx +++ b/src/components/toolbar/ToolbarMeView.tsx @@ -1,5 +1,5 @@ import { MouseEventType, RoomObjectCategory } from '@nitrots/nitro-renderer'; -import { Dispatch, FC, SetStateAction, useEffect, useRef } from 'react'; +import { Dispatch, FC, PropsWithChildren, SetStateAction, useEffect, useRef } from 'react'; import { CreateLinkEvent, GetRoomEngine, GetRoomSession, GetSessionDataManager, GetUserProfile } from '../../api'; import { Base, Flex, LayoutItemCountView } from '../../common'; import { GuideToolEvent } from '../../events'; @@ -12,7 +12,7 @@ interface ToolbarMeViewProps setMeExpanded: Dispatch>; } -export const ToolbarMeView: FC = props => +export const ToolbarMeView: FC> = props => { const { useGuideTool = false, unseenAchievementCount = 0, setMeExpanded = null, children = null, ...rest } = props; const elementRef = useRef(); diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index e065e229..7836ce39 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from 'react'; +import { FC, PropsWithChildren, useEffect, useState } from 'react'; import { GetSessionDataManager, LocalizeText, WiredFurniType, WiredSelectionVisualizer } from '../../../api'; import { Button, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useWiredContext } from '../WiredContext'; @@ -13,7 +13,7 @@ export interface WiredBaseViewProps validate?: () => boolean; } -export const WiredBaseView: FC = props => +export const WiredBaseView: FC> = props => { const { wiredType = '', requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, validate = null, children = null, hasSpecialInput = false } = props; const [ wiredName, setWiredName ] = useState(null); diff --git a/src/components/wired/views/actions/WiredActionBaseView.tsx b/src/components/wired/views/actions/WiredActionBaseView.tsx index 17a00551..71e187a0 100644 --- a/src/components/wired/views/actions/WiredActionBaseView.tsx +++ b/src/components/wired/views/actions/WiredActionBaseView.tsx @@ -1,5 +1,5 @@ import { WiredActionDefinition } from '@nitrots/nitro-renderer'; -import { FC, useEffect } from 'react'; +import { FC, PropsWithChildren, useEffect } from 'react'; import ReactSlider from 'react-slider'; import { GetWiredTimeLocale, LocalizeText, WiredFurniType } from '../../../../api'; import { Column, Text } from '../../../../common'; @@ -13,7 +13,7 @@ export interface WiredActionBaseViewProps save: () => void; } -export const WiredActionBaseView: FC = props => +export const WiredActionBaseView: FC> = props => { const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; const { trigger = null, actionDelay = 0, setActionDelay = null } = useWiredContext(); diff --git a/src/components/wired/views/conditions/WiredConditionBaseView.tsx b/src/components/wired/views/conditions/WiredConditionBaseView.tsx index d4e73266..fc492150 100644 --- a/src/components/wired/views/conditions/WiredConditionBaseView.tsx +++ b/src/components/wired/views/conditions/WiredConditionBaseView.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react'; +import { FC, PropsWithChildren } from 'react'; import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; @@ -9,7 +9,7 @@ export interface WiredConditionBaseViewProps save: () => void; } -export const WiredConditionBaseView: FC = props => +export const WiredConditionBaseView: FC> = props => { const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; diff --git a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx index 9b4dcbf2..f8f15759 100644 --- a/src/components/wired/views/triggers/WiredTriggerBaseView.tsx +++ b/src/components/wired/views/triggers/WiredTriggerBaseView.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react'; +import { FC, PropsWithChildren } from 'react'; import { WiredFurniType } from '../../../../api'; import { WiredBaseView } from '../WiredBaseView'; @@ -9,7 +9,7 @@ export interface WiredTriggerBaseViewProps save: () => void; } -export const WiredTriggerBaseView: FC = props => +export const WiredTriggerBaseView: FC> = props => { const { requiresFurni = WiredFurniType.STUFF_SELECTION_OPTION_NONE, save = null, hasSpecialInput = false, children = null } = props; diff --git a/tsconfig.json b/tsconfig.json index ac2a9fd7..5fede090 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "strict": false, "downlevelIteration": true, "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, + "noFallthroughCasesInSwitch": false, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, diff --git a/yarn.lock b/yarn.lock index b9048174..542fee0f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,11 +3,12 @@ "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/trace-mapping" "^0.3.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@7.10.4": version "7.10.4" @@ -30,10 +31,10 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" - integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== "@babel/core@7.12.3": version "7.12.3" @@ -58,34 +59,34 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" - integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.7" - "@babel/helper-compilation-targets" "^7.17.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.8" - "@babel/parser" "^7.17.8" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.17.3", "@babel/generator@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== +"@babel/generator@^7.12.1", "@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" jsesc "^2.5.1" - source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" @@ -102,30 +103,30 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== dependencies: - "@babel/compat-data" "^7.17.7" + "@babel/compat-data" "^7.17.10" "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" + browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" - integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" + integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ== dependencies: "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" "@babel/helper-optimise-call-expression" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.16.7": +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== @@ -161,21 +162,13 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: - "@babel/helper-get-function-arity" "^7.16.7" "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.17.0" "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" @@ -184,7 +177,7 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.16.7": +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== @@ -285,28 +278,28 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.8": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106" - integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw== +"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" + integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== dependencies: "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" + "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.7.0": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240" - integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.7.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" @@ -341,7 +334,7 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.16.7": +"@babel/plugin-proposal-class-static-block@^7.17.6": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== @@ -351,13 +344,14 @@ "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz#4f0444e896bee85d35cf714a006fc5418f87ff00" - integrity sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz#67a1653be9c77ce5b6c318aa90c8287b87831619" + integrity sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.6" + "@babel/helper-create-class-features-plugin" "^7.17.9" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" "@babel/plugin-syntax-decorators" "^7.17.0" charcodes "^0.2.0" @@ -409,7 +403,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": +"@babel/plugin-proposal-object-rest-spread@^7.17.3": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== @@ -597,9 +591,9 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz#80031e6042cad6a95ed753f672ebd23c30933195" + integrity sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ== dependencies: "@babel/helper-plugin-utils" "^7.16.7" @@ -654,7 +648,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.16.7": +"@babel/plugin-transform-destructuring@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== @@ -731,17 +725,17 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz#d86b217c8e45bb5f2dbc11eefc8eab62cf980d19" - integrity sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA== +"@babel/plugin-transform-modules-commonjs@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" + integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== dependencies: "@babel/helper-module-transforms" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": +"@babel/plugin-transform-modules-systemjs@^7.17.8": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== @@ -760,12 +754,12 @@ "@babel/helper-module-transforms" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.17.0" "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" @@ -836,12 +830,12 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== +"@babel/plugin-transform-regenerator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" + integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== dependencies: - regenerator-transform "^0.14.2" + regenerator-transform "^0.15.0" "@babel/plugin-transform-reserved-words@^7.16.7": version "7.16.7" @@ -851,9 +845,9 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.16.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" - integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1" + integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -923,26 +917,26 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" "@babel/plugin-proposal-async-generator-functions" "^7.16.8" "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" "@babel/plugin-proposal-dynamic-import" "^7.16.7" "@babel/plugin-proposal-export-namespace-from" "^7.16.7" "@babel/plugin-proposal-json-strings" "^7.16.7" "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" "@babel/plugin-proposal-optional-chaining" "^7.16.7" "@babel/plugin-proposal-private-methods" "^7.16.11" @@ -968,7 +962,7 @@ "@babel/plugin-transform-block-scoping" "^7.16.7" "@babel/plugin-transform-classes" "^7.16.7" "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" "@babel/plugin-transform-dotall-regex" "^7.16.7" "@babel/plugin-transform-duplicate-keys" "^7.16.7" "@babel/plugin-transform-exponentiation-operator" "^7.16.7" @@ -977,15 +971,15 @@ "@babel/plugin-transform-literals" "^7.16.7" "@babel/plugin-transform-member-expression-literals" "^7.16.7" "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" "@babel/plugin-transform-new-target" "^7.16.7" "@babel/plugin-transform-object-super" "^7.16.7" "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" "@babel/plugin-transform-reserved-words" "^7.16.7" "@babel/plugin-transform-shorthand-properties" "^7.16.7" "@babel/plugin-transform-spread" "^7.16.7" @@ -995,11 +989,11 @@ "@babel/plugin-transform-unicode-escapes" "^7.16.7" "@babel/plugin-transform-unicode-regex" "^7.16.7" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" + "@babel/types" "^7.17.10" babel-plugin-polyfill-corejs2 "^0.3.0" babel-plugin-polyfill-corejs3 "^0.5.0" babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" + core-js-compat "^3.22.1" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -1035,17 +1029,17 @@ "@babel/plugin-transform-typescript" "^7.16.7" "@babel/runtime-corejs3@^7.10.2": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz#d7dd49fb812f29c61c59126da3792d8740d4e284" - integrity sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz#3d02d0161f0fbf3ada8e88159375af97690f4055" + integrity sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw== dependencies: core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.16", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" - integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" @@ -1058,26 +1052,26 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.0": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== dependencies: "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" + "@babel/generator" "^7.17.10" "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" "@babel/helper-hoist-variables" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== dependencies: "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" @@ -1144,10 +1138,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" - integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== +"@eslint/eslintrc@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae" + integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1432,28 +1426,41 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.2.3.tgz#692fbec1a8bf3b81af46788be56ace5d393100cf" - integrity sha512-v+tJA6QyTWPbbl/cEtYB3478OkhmB18BKFrGkL7dKIgN97sCQToTvbmfVXyyn3X3k81JIifApSb+vxyXvc0QXA== +"@nitrots/nitro-renderer@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.2.5.tgz#9cb79a2467849995c9d44d55a7e5029bf7006f93" + integrity sha512-26aShPy1kCbN3S3UDa6IIycomfHoTvNWbZryS0Qx/0wieM0YIwMfPatSbiPn3YU6dYdmgbUZsvDzLYtp0tDojw== dependencies: "@pixi/app" "^6.3.0" "@pixi/basis" "^6.3.0" @@ -1712,9 +1719,9 @@ source-map "^0.7.3" "@popperjs/core@^2.10.1": - version "2.11.4" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503" - integrity sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg== + version "2.11.5" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" + integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== "@react-aria/ssr@^3.0.1": version "3.1.2" @@ -1723,10 +1730,10 @@ dependencies: "@babel/runtime" "^7.6.2" -"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.5": - version "0.4.6" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.6.tgz#15dcf34631a618c513efc924705c7cbe349a4a0c" - integrity sha512-FzpEzy6QeLB3OpUrC9OQD/lWCluQmilLfRGa/DqbB6OmV05AEt/0Lgn3Jf6l27UIJMK0qFmNcps6p8DNLXa6Pw== +"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.6": + version "0.4.7" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" + integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== dependencies: dequal "^2.0.2" @@ -1950,9 +1957,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + version "7.17.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== dependencies: "@babel/types" "^7.3.0" @@ -1999,11 +2006,6 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== -"@types/invariant@^2.2.35": - version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" - integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -2044,14 +2046,14 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== "@types/node@^12.20.19": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== + version "12.20.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.50.tgz#14ba5198f1754ffd0472a2f84ab433b45ee0b65e" + integrity sha512-+9axpWx2b2JCVovr7Ilgt96uc6C1zBKOQMpGtRbWT9IoR/8ue32GGMfGA4woP8QyP2gBs6GQWEVM3tCybGCxDA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2069,24 +2071,24 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.0.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" + integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== -"@types/prop-types@*", "@types/prop-types@^15.7.4": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -"@types/react-dom@^17.0.9": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.14.tgz#c8f917156b652ddf807711f5becbd2ab018dea9f" - integrity sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ== +"@types/react-dom@^18.0.3": + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.3.tgz#a022ea08c75a476fe5e96b675c3e673363853831" + integrity sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ== dependencies: "@types/react" "*" @@ -2097,7 +2099,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.2", "@types/react-transition-group@^4.4.4": +"@types/react-transition-group@^4.4.4": version "4.4.4" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== @@ -2105,17 +2107,17 @@ "@types/react" "*" "@types/react-virtualized@^9.21.13": - version "9.21.20" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.20.tgz#756c78b5512a2a1804fdaf749a5f5cff3d805e5b" - integrity sha512-i8nZf1LpuX5rG4DZLaPGayIQwjxsZwmst5VdNhEznDTENel9p3A735AdRRp2iueFOyOuWBmaEaDxg8AD3GHilA== + version "9.21.21" + resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.21.tgz#65c96f25314f0fb3d40536929dc78112753b49e1" + integrity sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA== dependencies: "@types/prop-types" "*" - "@types/react" "*" + "@types/react" "^17" -"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^17.0.15": - version "17.0.43" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55" - integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^17", "@types/react@^18.0.8": + version "18.0.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.8.tgz#a051eb380a9fbcaa404550543c58e1cf5ce4ab87" + integrity sha512-+j2hk9BzCOrrOSJASi5XiOyBbERk9jG5O73Ya4M0env5Ixi6vUNli4qy994AINcEF+1IEHISYFfIT4zwr++LKw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2149,9 +2151,9 @@ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== + version "3.13.2" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.2.tgz#1044c1713fb81cb1ceef29ad8a9ee1ce08d690ef" + integrity sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q== dependencies: source-map "^0.6.1" @@ -2208,13 +2210,13 @@ tsutils "^3.21.0" "@typescript-eslint/eslint-plugin@^5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz#704eb4e75039000531255672bf1c85ee85cf1d67" - integrity sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ== + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz#bfc22e0191e6404ab1192973b3b4ea0461c1e878" + integrity sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg== dependencies: - "@typescript-eslint/scope-manager" "5.17.0" - "@typescript-eslint/type-utils" "5.17.0" - "@typescript-eslint/utils" "5.17.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/type-utils" "5.21.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -2256,13 +2258,13 @@ debug "^4.3.1" "@typescript-eslint/parser@^5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.17.0.tgz#7def77d5bcd8458d12d52909118cf3f0a45f89d5" - integrity sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig== + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.21.0.tgz#6cb72673dbf3e1905b9c432175a3c86cdaf2071f" + integrity sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg== dependencies: - "@typescript-eslint/scope-manager" "5.17.0" - "@typescript-eslint/types" "5.17.0" - "@typescript-eslint/typescript-estree" "5.17.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/typescript-estree" "5.21.0" debug "^4.3.2" "@typescript-eslint/scope-manager@4.33.0": @@ -2273,20 +2275,20 @@ "@typescript-eslint/types" "4.33.0" "@typescript-eslint/visitor-keys" "4.33.0" -"@typescript-eslint/scope-manager@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz#4cea7d0e0bc0e79eb60cad431c89120987c3f952" - integrity sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w== +"@typescript-eslint/scope-manager@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz#a4b7ed1618f09f95e3d17d1c0ff7a341dac7862e" + integrity sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ== dependencies: - "@typescript-eslint/types" "5.17.0" - "@typescript-eslint/visitor-keys" "5.17.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" -"@typescript-eslint/type-utils@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz#1c4549d68c89877662224aabb29fbbebf5fc9672" - integrity sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg== +"@typescript-eslint/type-utils@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz#ff89668786ad596d904c21b215e5285da1b6262e" + integrity sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw== dependencies: - "@typescript-eslint/utils" "5.17.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" tsutils "^3.21.0" @@ -2300,10 +2302,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== -"@typescript-eslint/types@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.17.0.tgz#861ec9e669ffa2aa9b873dd4d28d9b1ce26d216f" - integrity sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw== +"@typescript-eslint/types@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.21.0.tgz#8cdb9253c0dfce3f2ab655b9d36c03f72e684017" + integrity sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -2332,28 +2334,28 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz#a7cba7dfc8f9cc2ac78c18584e684507df4f2488" - integrity sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg== +"@typescript-eslint/typescript-estree@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz#9f0c233e28be2540eaed3df050f0d54fb5aa52de" + integrity sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg== dependencies: - "@typescript-eslint/types" "5.17.0" - "@typescript-eslint/visitor-keys" "5.17.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.17.0.tgz#549a9e1d491c6ccd3624bc3c1b098f5cfb45f306" - integrity sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA== +"@typescript-eslint/utils@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.21.0.tgz#51d7886a6f0575e23706e5548c7e87bce42d7c18" + integrity sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.17.0" - "@typescript-eslint/types" "5.17.0" - "@typescript-eslint/typescript-estree" "5.17.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/typescript-estree" "5.21.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -2372,12 +2374,12 @@ "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@5.17.0": - version "5.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz#52daae45c61b0211b4c81b53a71841911e479128" - integrity sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA== +"@typescript-eslint/visitor-keys@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz#453fb3662409abaf2f8b1f65d515699c888dd8ae" + integrity sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA== dependencies: - "@typescript-eslint/types" "5.17.0" + "@typescript-eslint/types" "5.21.0" eslint-visitor-keys "^3.0.0" "@webassemblyjs/ast@1.9.0": @@ -2536,9 +2538,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== abbrev@1: version "1.1.1" @@ -2587,15 +2589,20 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -address@1.1.2, address@^1.0.1: +address@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== +address@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + adjust-sourcemap-loader@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" @@ -2838,22 +2845,24 @@ array-unique@^0.3.2: integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.19.0" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" - integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.19.0" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" arrify@^1.0.1: version "1.0.1" @@ -2931,9 +2940,9 @@ async-limiter@~1.0.0: integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" @@ -3256,21 +3265,23 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" bonjour@^3.5.0: version "3.5.0" @@ -3401,15 +3412,15 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4: - version "4.20.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" - integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== dependencies: - caniuse-lite "^1.0.30001317" - electron-to-chromium "^1.4.84" + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" escalade "^3.1.1" - node-releases "^2.0.2" + node-releases "^2.0.3" picocolors "^1.0.0" bser@2.1.1: @@ -3592,10 +3603,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001317: - version "1.0.30001323" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001323.tgz#a451ff80dec7033016843f532efda18f02eec011" - integrity sha512-e4BF2RlCVELKx8+RmklSEIVub1TWrmdhvA5kEUueummz1XyySW0DVk+3x9HyhU9MuWTa2BhqLgEuEmUwASAdCA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001332: + version "1.0.30001334" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz#892e9965b35285033fc2b8a8eff499fe02f13d8b" + integrity sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw== capture-exit@^2.0.0: version "2.0.0" @@ -3831,9 +3842,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -3981,10 +3992,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== copy-concurrently@^1.0.0: version "1.0.5" @@ -4003,18 +4014,18 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.20.2, core-js-compat@^3.21.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.3.tgz#9b10d786052d042bc97ee8df9c0d1fb6a49c2005" + integrity sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw== dependencies: - browserslist "^4.19.1" + browserslist "^4.20.3" semver "7.0.0" core-js-pure@^3.20.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.3.tgz#181d1b6321fb29fe99c16a1f28beb840ab84ad36" + integrity sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ== core-js@^2.4.0: version "2.6.12" @@ -4022,9 +4033,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.3.tgz#498c41d997654cb00e81c7a54b44f0ab21ab01d5" + integrity sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg== core-util-is@1.0.2: version "1.0.2" @@ -4037,12 +4048,12 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.6.tgz#6d879cece8063b15ec8a3258f55a8e94893c7cca" - integrity sha512-2nEotziYJWtNtoTjKbchj9QrdTT6DBxCvqjNKoDKARw+e2yZmTQCa07uRrykLIZuvSgp69YXLH89UHc0WhdMfQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" + integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== dependencies: cosmiconfig "^7" - ts-node "^10.6.0" + ts-node "^10.7.0" cosmiconfig@^5.0.0: version "5.2.1" @@ -4491,11 +4502,12 @@ default-gateway@^4.2.0: ip-regex "^2.1.0" define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" @@ -4542,6 +4554,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -4560,10 +4577,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-newline@^3.0.0: version "3.1.0" @@ -4667,9 +4684,9 @@ dom-serializer@0: entities "^2.0.0" dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" @@ -4686,9 +4703,9 @@ domelementtype@1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^2.0.1: version "2.0.1" @@ -4784,10 +4801,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.84: - version "1.4.103" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" - integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== +electron-to-chromium@^1.3.564, electron-to-chromium@^1.4.118: + version "1.4.129" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.129.tgz#c675793885721beefff99da50f57c6525c2cd238" + integrity sha512-GgtN6bsDtHdtXJtlMYZWGB/uOyjZWjmRDumXTas7dGBaB9zUyCjzHet1DY2KhyHN8R0GLbzZWqm4efeddqqyRQ== elliptic@^6.5.3: version "6.5.4" @@ -4896,10 +4913,10 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" - integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== +es-abstract@^1.17.2, es-abstract@^1.19.1, es-abstract@^1.19.2: + version "1.19.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" + integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -4912,7 +4929,7 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: is-callable "^1.2.4" is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" is-weakref "^1.0.2" object-inspect "^1.12.0" @@ -4922,6 +4939,13 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -4932,9 +4956,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.59" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" - integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== + version "0.10.61" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" + integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -5009,7 +5033,7 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-module-utils@^2.7.2: +eslint-module-utils@^2.7.3: version "2.7.3" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== @@ -5026,23 +5050,23 @@ eslint-plugin-flowtype@^5.2.0: string-natural-compare "^3.0.1" eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.25.4: - version "2.25.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" - integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA== + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: array-includes "^3.1.4" array.prototype.flat "^1.2.5" debug "^2.6.9" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.2" + eslint-module-utils "^2.7.3" has "^1.0.3" - is-core-module "^2.8.0" + is-core-module "^2.8.1" is-glob "^4.0.3" - minimatch "^3.0.4" + minimatch "^3.1.2" object.values "^1.1.5" - resolve "^1.20.0" - tsconfig-paths "^3.12.0" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" eslint-plugin-jest@^24.1.0: version "24.7.0" @@ -5070,9 +5094,9 @@ eslint-plugin-jsx-a11y@^6.3.1, eslint-plugin-jsx-a11y@^6.5.1: minimatch "^3.0.4" eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== eslint-plugin-react@^7.21.5, eslint-plugin-react@^7.29.4: version "7.29.4" @@ -5213,11 +5237,11 @@ eslint@^7.11.0: v8-compile-cache "^2.0.3" eslint@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" - integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== + version "8.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239" + integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw== dependencies: - "@eslint/eslintrc" "^1.2.1" + "@eslint/eslintrc" "^1.2.2" "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" @@ -5414,37 +5438,38 @@ expect@^26.6.0, expect@^26.6.2: jest-regex-util "^26.0.0" express@^4.17.1: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -5594,17 +5619,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^2.1.0: @@ -5817,6 +5842,11 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -6032,9 +6062,9 @@ globule@^1.0.0: minimatch "~3.0.2" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== growly@^1.3.0: version "1.3.0" @@ -6084,10 +6114,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" @@ -6099,6 +6129,13 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -6287,15 +6324,15 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: @@ -6356,9 +6393,9 @@ https-browserify@^1.0.0: integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -6647,10 +6684,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" @@ -6767,9 +6804,9 @@ is-negative-zero@^2.0.2: integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -6854,10 +6891,12 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^1.1.0: version "1.1.0" @@ -6960,9 +6999,9 @@ istanbul-lib-instrument@^4.0.3: semver "^6.3.0" istanbul-lib-instrument@^5.0.4: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -7560,7 +7599,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: +json5@^2.1.2, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -7592,9 +7631,9 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c" - integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" + integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== dependencies: array-includes "^3.1.4" object.assign "^4.1.2" @@ -7773,6 +7812,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -8214,10 +8258,10 @@ nan@^2.12.1, nan@^2.13.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== -nanoid@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" - integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== +nanoid@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanomatch@^1.2.9: version "1.2.13" @@ -8348,10 +8392,10 @@ node-releases@^1.1.61: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== node-sass@^6.0.1: version "6.0.1" @@ -8518,7 +8562,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8596,10 +8640,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -9661,11 +9705,11 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po source-map "^0.6.1" postcss@^8.1.0: - version "8.4.12" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" - integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== + version "8.4.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.3" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -9856,10 +9900,12 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" @@ -9931,13 +9977,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9954,18 +10000,14 @@ react-app-polyfill@^2.0.0: whatwg-fetch "^3.4.1" react-bootstrap@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.2.2.tgz#cddf53174df295253c471df54f131e1730a6660f" - integrity sha512-zfVGUU14BMZo7KqR1QHXBAqpbWa6bu4S9dZ6O4rd/hDZi1tiNeGkISbuBednb1TxyXrOwpvnvlHNk3OuYQNq6w== + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.3.1.tgz#f14239efb89ca24044766e20cc829b7a264db11d" + integrity sha512-+k68LdaSS62Zc/1gr18NC9QpDk/wwhNk+90QgcTMYSA8BzlXC1G2ogWWrz2LFuP2FlmCtVjcr/UXw3mpdxVmWw== dependencies: "@babel/runtime" "^7.17.2" - "@restart/hooks" "^0.4.5" + "@restart/hooks" "^0.4.6" "@restart/ui" "^1.2.0" - "@types/invariant" "^2.2.35" - "@types/prop-types" "^15.7.4" - "@types/react" ">=16.14.8" "@types/react-transition-group" "^4.4.4" - "@types/warning" "^3.0.0" classnames "^2.3.1" dom-helpers "^5.2.1" invariant "^2.2.4" @@ -10006,12 +10048,12 @@ react-dev-utils@^11.0.3: text-table "0.2.0" react-dom@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023" - integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw== + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== dependencies: loose-envify "^1.1.0" - scheduler "^0.21.0" + scheduler "^0.22.0" react-error-overlay@6.0.9, react-error-overlay@^6.0.9: version "6.0.9" @@ -10143,9 +10185,9 @@ react-youtube@^7.13.1: youtube-player "5.5.2" react@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" - integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== + version "18.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== dependencies: loose-envify "^1.1.0" @@ -10243,10 +10285,10 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== dependencies: "@babel/runtime" "^7.8.4" @@ -10264,12 +10306,13 @@ regex-parser@^2.2.11: integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" + functions-have-names "^1.2.2" regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" @@ -10435,7 +10478,7 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -10641,10 +10684,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== +scheduler@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== dependencies: loose-envify "^1.1.0" @@ -10716,30 +10759,30 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@^4.0.0: version "4.0.0" @@ -10768,15 +10811,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -11003,11 +11046,18 @@ source-map@^0.5.0, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.7.3, source-map@~0.7.2: +source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -11128,7 +11178,12 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -11520,13 +11575,13 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.3.4: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== dependencies: acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" + source-map "~0.8.0-beta.0" source-map-support "~0.5.20" test-exclude@^6.0.0: @@ -11642,6 +11697,13 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -11666,7 +11728,7 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-node@^10.6.0: +ts-node@^10.7.0: version "10.7.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== @@ -11690,7 +11752,7 @@ ts-pnp@1.2.0, ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tsconfig-paths@^3.12.0: +tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== @@ -11706,9 +11768,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" @@ -11814,18 +11876,18 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.3.5: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" uncontrollable@^7.2.1: @@ -12040,9 +12102,9 @@ uuid@^8.3.0, uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" @@ -12143,6 +12205,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -12296,6 +12363,15 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" From cf4a7f6fdfb821b22a13a443b2f52f6327db13b3 Mon Sep 17 00:00:00 2001 From: robbis95 <82042925+robbis95@users.noreply.github.com> Date: Sun, 15 May 2022 13:34:21 +0200 Subject: [PATCH 260/331] Css fixes image-rendering --- .../views/search/NavigatorSearchResultItemInfoView.tsx | 2 +- .../room/widgets/chat-input/ChatInputStyleSelectorView.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx index 432fce48..b02b834e 100644 --- a/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx +++ b/src/components/navigator/views/search/NavigatorSearchResultItemInfoView.tsx @@ -43,7 +43,7 @@ export const NavigatorSearchResultItemInfoView: FC setIsVisible(true) } onMouseLeave={ event => setIsVisible(false) } /> - + { roomData.habboGroupId > 0 && ( diff --git a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx index 505bc375..f5cbbe50 100644 --- a/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx +++ b/src/components/room/widgets/chat-input/ChatInputStyleSelectorView.tsx @@ -46,7 +46,7 @@ export const ChatInputStyleSelectorView: FC = p <> - + { chatStyleIds && (chatStyleIds.length > 0) && chatStyleIds.map((styleId) => From d2add37bfff87fdc3078a6d0d8ea22d0bcd58f98 Mon Sep 17 00:00:00 2001 From: robbis95 <82042925+robbis95@users.noreply.github.com> Date: Sun, 15 May 2022 13:35:46 +0200 Subject: [PATCH 261/331] Fix camera checkout inventory toggle --- .../camera/views/checkout/CameraWidgetCheckoutView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx index 2c8680f3..cd10dcd3 100644 --- a/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx +++ b/src/components/camera/views/checkout/CameraWidgetCheckoutView.tsx @@ -121,7 +121,7 @@ export const CameraWidgetCheckoutView: FC = props { (picturesBought > 0) && { LocalizeText('camera.purchase.count.info') } { picturesBought } - CreateLinkEvent('inventory/open') }>{ LocalizeText('camera.open.inventory') } + CreateLinkEvent('inventory/toggle') }>{ LocalizeText('camera.open.inventory') } } From e0f232f50d88f33366966fd2d6a6df3f49b82de7 Mon Sep 17 00:00:00 2001 From: robbis95 <82042925+robbis95@users.noreply.github.com> Date: Sun, 15 May 2022 14:02:46 +0200 Subject: [PATCH 262/331] Css report fix --- src/App.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index 9dd4dcfd..9a3bd885 100644 --- a/src/App.scss +++ b/src/App.scss @@ -52,7 +52,7 @@ $friends-list-width: 250px; $friends-list-height: 300px; $help-width: 450px; -$help-height: 250px; +$help-height: 290px; $nitropedia-width: 400px; $nitropedia-height: 400px; From 2eaf0495c810969b90839247de9ae267736ee4b9 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 25 May 2022 10:37:07 -0400 Subject: [PATCH 263/331] Start ChatInputWidget hook --- src/hooks/rooms/widgets/useChatInputWidget.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/hooks/rooms/widgets/useChatInputWidget.ts diff --git a/src/hooks/rooms/widgets/useChatInputWidget.ts b/src/hooks/rooms/widgets/useChatInputWidget.ts new file mode 100644 index 00000000..022a64a7 --- /dev/null +++ b/src/hooks/rooms/widgets/useChatInputWidget.ts @@ -0,0 +1,18 @@ +import { useEffect, useState } from 'react'; +import { useRoom } from '../useRoom'; + +const useChatInputWidgetState = () => +{ + const [ isTyping, setIsTyping ] = useState(false); + + const { roomSession = null, widgetHandler = null } = useRoom(); + + useEffect(() => + { + if(!isTyping || !roomSession) return; + + + }, [ isTyping, roomSession ]); +} + +export const useChatInputWidget = useChatInputWidgetState; From df6d672df85ff3fdf24a98e3d6f766c5381d9a8e Mon Sep 17 00:00:00 2001 From: dank074 Date: Fri, 17 Jun 2022 20:55:29 -0500 Subject: [PATCH 264/331] updated packets --- src/api/navigator/TryVisitRoom.ts | 4 +- src/api/utils/PlaySound.ts | 3 +- .../page/layout/CatalogLayoutRoomAdsView.tsx | 71 +++++++++++++++++++ .../views/page/layout/GetCatalogLayout.tsx | 3 + .../navigator/NavigatorMessageHandler.tsx | 22 +++--- .../views/NavigatorRoomCreatorView.tsx | 4 +- .../navigator/views/NavigatorRoomInfoView.tsx | 6 +- .../room-tools/RoomToolsWidgetView.tsx | 4 +- 8 files changed, 95 insertions(+), 22 deletions(-) create mode 100644 src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx diff --git a/src/api/navigator/TryVisitRoom.ts b/src/api/navigator/TryVisitRoom.ts index 94d8e6fc..81138d6c 100644 --- a/src/api/navigator/TryVisitRoom.ts +++ b/src/api/navigator/TryVisitRoom.ts @@ -1,7 +1,7 @@ -import { RoomInfoComposer } from '@nitrots/nitro-renderer'; +import { GetGuestRoomMessageComposer } from '@nitrots/nitro-renderer'; import { SendMessageComposer } from '../nitro'; export function TryVisitRoom(roomId: number): void { - SendMessageComposer(new RoomInfoComposer(roomId, false, true)); + SendMessageComposer(new GetGuestRoomMessageComposer(roomId, false, true)); } diff --git a/src/api/utils/PlaySound.ts b/src/api/utils/PlaySound.ts index 94c50ee9..70f6aad7 100644 --- a/src/api/utils/PlaySound.ts +++ b/src/api/utils/PlaySound.ts @@ -1,5 +1,4 @@ -import { MouseEventType } from '@nitrots/nitro-renderer'; -import { NitroSoundEvent } from '@nitrots/nitro-renderer/src/nitro/events/NitroSoundEvent'; +import { MouseEventType, NitroSoundEvent } from '@nitrots/nitro-renderer'; import { DispatchMainEvent } from '../../hooks'; let canPlaySound = false; diff --git a/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx new file mode 100644 index 00000000..cbc4e497 --- /dev/null +++ b/src/components/catalog/views/page/layout/CatalogLayoutRoomAdsView.tsx @@ -0,0 +1,71 @@ +import { GetRoomAdPurchaseInfoComposer, PurchaseRoomAdMessageComposer, RoomAdPurchaseInfoEvent, RoomEntryData } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { LocalizeText, SendMessageComposer } from '../../../../../api'; +import { Base, Column, Text } from '../../../../../common'; +import { UseMessageEventHook } from '../../../../../hooks'; +import { CatalogLayoutProps } from './CatalogLayout.types'; + +export const CatalogLayoutRoomAdsView: FC = props => +{ + const { page = null } = props; + const [ eventName, setEventName ] = useState(''); + const [ eventDesc, setEventDesc ] = useState(''); + const [ roomId, setRoomId ] = useState(null); + const [ availableRooms, setAvailableRooms ] = useState([]); + const [ extended, setExtended ] = useState(false); + const [ categories, setCategories ] = useState(null); + + const onRoomAdPurchaseInfoEvent = useCallback((event: RoomAdPurchaseInfoEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + setAvailableRooms(parser.rooms); + }, []); + + UseMessageEventHook(RoomAdPurchaseInfoEvent, onRoomAdPurchaseInfoEvent); + + const purchaseAd = useCallback(() => + { + const pageId = page.pageId; + const offerId = page.offers.length >= 1 ? page.offers[0].offerId : -1; + const flatId = roomId; + const name = eventName; + const desc = eventDesc; + const categoryId = -1; + + SendMessageComposer(new PurchaseRoomAdMessageComposer(pageId, offerId, flatId, name, extended, desc, categoryId)) + }, [eventDesc, eventName, extended, page.offers, page.pageId, roomId]); + + useEffect(() => + { + SendMessageComposer(new GetRoomAdPurchaseInfoComposer()); + //SendMessageComposer(new GetUserEventCatsMessageComposer()); + }, []); + + return (<> + {LocalizeText('roomad.catalog_header')} + + {LocalizeText('roomad.catalog_text')} + + + { LocalizeText('roomad.catalog_name') } + setEventName(event.target.value) } /> + + + < Text bold>{LocalizeText('roomad.catalog_description')} + + { LocalizeText('friendlist.invite.note') } diff --git a/src/components/friends/views/friends-list/FriendsListView.tsx b/src/components/friends/views/friends-list/FriendsListView.tsx index d1aeb943..d98e93a6 100644 --- a/src/components/friends/views/friends-list/FriendsListView.tsx +++ b/src/components/friends/views/friends-list/FriendsListView.tsx @@ -62,9 +62,10 @@ export const FriendsListView: FC<{}> = props => const sendRoomInvite = (message: string) => { - if(selectedFriendsIds.length === 0 || !message || message.length === 0) return; + if(!selectedFriendsIds.length || !message || !message.length || (message.length > 255)) return; SendMessageComposer(new SendRoomInviteComposer(message, selectedFriendsIds)); + setShowRoomInvite(false); } diff --git a/src/hooks/friends/useMessenger.ts b/src/hooks/friends/useMessenger.ts index 3dab1106..a48b6cf1 100644 --- a/src/hooks/friends/useMessenger.ts +++ b/src/hooks/friends/useMessenger.ts @@ -85,7 +85,7 @@ const useMessengerState = () => const ownMessage = (senderId === GetSessionDataManager().userId); - if(ownMessage) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); + if(ownMessage && (messageText.length <= 255)) SendMessageComposer(new SendMessageComposerPacket(thread.participant.id, messageText)); setMessageThreads(prevValue => { From a183c9c0ac1f5c385fc5e9dc004345f156aec0a5 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 18:44:02 -0400 Subject: [PATCH 298/331] Group fixes --- src/components/groups/GroupsView.tsx | 3 ++- .../groups/views/GroupCreatorView.tsx | 2 +- .../groups/views/GroupManagerView.tsx | 26 ++++++++----------- .../views/tabs/GroupTabIdentityView.tsx | 6 ++--- src/hooks/groups/useGroup.ts | 18 ++++++------- 5 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/components/groups/GroupsView.tsx b/src/components/groups/GroupsView.tsx index e6017b4c..bbaee28b 100644 --- a/src/components/groups/GroupsView.tsx +++ b/src/components/groups/GroupsView.tsx @@ -1,7 +1,7 @@ import { GroupPurchasedEvent, GroupSettingsComposer, ILinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { AddEventLinkTracker, RemoveLinkEventTracker, SendMessageComposer, TryVisitRoom } from '../../api'; -import { useMessageEvent } from '../../hooks'; +import { useGroup, useMessageEvent } from '../../hooks'; import { GroupCreatorView } from './views/GroupCreatorView'; import { GroupInformationStandaloneView } from './views/GroupInformationStandaloneView'; import { GroupManagerView } from './views/GroupManagerView'; @@ -10,6 +10,7 @@ import { GroupMembersView } from './views/GroupMembersView'; export const GroupsView: FC<{}> = props => { const [ isCreatorVisible, setCreatorVisible ] = useState(false); + const {} = useGroup(); useMessageEvent(GroupPurchasedEvent, event => { diff --git a/src/components/groups/views/GroupCreatorView.tsx b/src/components/groups/views/GroupCreatorView.tsx index 4b1401ff..9998349b 100644 --- a/src/components/groups/views/GroupCreatorView.tsx +++ b/src/components/groups/views/GroupCreatorView.tsx @@ -143,7 +143,7 @@ export const GroupCreatorView: FC = props => { (currentTab === 1) && - } + } { (currentTab === 2) && } { (currentTab === 3) && diff --git a/src/components/groups/views/GroupManagerView.tsx b/src/components/groups/views/GroupManagerView.tsx index 43c4882a..4c42416e 100644 --- a/src/components/groups/views/GroupManagerView.tsx +++ b/src/components/groups/views/GroupManagerView.tsx @@ -1,5 +1,5 @@ import { GroupBadgePart, GroupInformationEvent, GroupSettingsEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; +import { FC, useState } from 'react'; import { IGroupData, LocalizeText } from '../../../api'; import { Base, Column, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../common'; import { useMessageEvent } from '../../../hooks'; @@ -16,7 +16,7 @@ export const GroupManagerView: FC<{}> = props => const [ closeAction, setCloseAction ] = useState<{ action: () => boolean }>(null); const [ groupData, setGroupData ] = useState(null); - const close = () => + const onClose = () => { setCloseAction(prevValue => { @@ -35,7 +35,7 @@ export const GroupManagerView: FC<{}> = props => setCurrentTab(tab); } - const onGroupInformationEvent = useCallback((event: GroupInformationEvent) => + useMessageEvent(GroupInformationEvent, event => { const parser = event.getParser(); @@ -52,11 +52,9 @@ export const GroupManagerView: FC<{}> = props => return newValue; }); - }, [ groupData ]); + }); - useMessageEvent(GroupInformationEvent, onGroupInformationEvent); - - const onGroupSettingsEvent = useCallback((event: GroupSettingsEvent) => + useMessageEvent(GroupSettingsEvent, event => { const parser = event.getParser(); @@ -82,9 +80,7 @@ export const GroupManagerView: FC<{}> = props => groupColors: [ parser.colorA, parser.colorB ], groupBadgeParts }); - }, [ setGroupData ]); - - useMessageEvent(GroupSettingsEvent, onGroupSettingsEvent); + }); if(!groupData || (groupData.groupId <= 0)) return null; @@ -108,13 +104,13 @@ export const GroupManagerView: FC<{}> = props => - { currentTab === 1 && - } - { currentTab === 2 && + { (currentTab === 1) && + } + { (currentTab === 2) && } - { currentTab === 3 && + { (currentTab === 3) && } - { currentTab === 5 && + { (currentTab === 5) && } diff --git a/src/components/groups/views/tabs/GroupTabIdentityView.tsx b/src/components/groups/views/tabs/GroupTabIdentityView.tsx index 110d3ef5..025babb9 100644 --- a/src/components/groups/views/tabs/GroupTabIdentityView.tsx +++ b/src/components/groups/views/tabs/GroupTabIdentityView.tsx @@ -9,14 +9,14 @@ interface GroupTabIdentityViewProps groupData: IGroupData; setGroupData: Dispatch>; setCloseAction: Dispatch boolean }>>; - close: () => void; + onClose: () => void; isCreator?: boolean; availableRooms?: { id: number, name: string }[]; } export const GroupTabIdentityView: FC = props => { - const { groupData = null, setGroupData = null, setCloseAction = null, close = null, isCreator = false, availableRooms = [] } = props; + const { groupData = null, setGroupData = null, setCloseAction = null, onClose = null, isCreator = false, availableRooms = [] } = props; const [ groupName, setGroupName ] = useState(''); const [ groupDescription, setGroupDescription ] = useState(''); const [ groupHomeroomId, setGroupHomeroomId ] = useState(-1); @@ -30,7 +30,7 @@ export const GroupTabIdentityView: FC = props => { SendMessageComposer(new GroupDeleteComposer(groupData.groupId)); - if(close) close(); + if(onClose) onClose(); }, null, null, null, LocalizeText('group.deleteconfirm.title')); } diff --git a/src/hooks/groups/useGroup.ts b/src/hooks/groups/useGroup.ts index b9303fcf..7a9fd22e 100644 --- a/src/hooks/groups/useGroup.ts +++ b/src/hooks/groups/useGroup.ts @@ -4,15 +4,6 @@ import { useBetween } from 'use-between'; import { IGroupCustomize, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../events'; -const CompareId = (a, b) => -{ - if(a.id < b.id) return -1; - - if(a.id > b.id) return 1; - - return 0; -} - const useGroupState = () => { const [ groupCustomize, setGroupCustomize ] = useState(null); @@ -35,6 +26,15 @@ const useGroupState = () => parser.colorsA.forEach((color, id) => customize.groupColorsA.push({ id, color })); parser.colorsB.forEach((color, id) => customize.groupColorsB.push({ id, color })); + const CompareId = (a: { id: number }, b: { id: number }) => + { + if(a.id < b.id) return -1; + + if(a.id > b.id) return 1; + + return 0; + } + customize.badgeBases.sort(CompareId); customize.badgeSymbols.sort(CompareId); customize.badgePartColors.sort(CompareId); From ea185a441a36a187ff5e4742bcdef8cec03e2cff Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:08:53 -0400 Subject: [PATCH 299/331] Rename all close functions to onClose --- .../accordion/NitroCardAccordionSetView.tsx | 6 ++-- .../layout/LayoutNotificationAlertView.tsx | 6 ++-- .../layout/LayoutNotificationBubbleView.tsx | 10 +++--- src/components/campaign/CalendarView.tsx | 6 ++-- src/components/campaign/CampaignView.tsx | 2 +- .../catalog/views/gift/CatalogGiftView.tsx | 12 +++---- .../groups/views/GroupCreatorView.tsx | 4 +-- .../groups/views/GroupManagerView.tsx | 2 +- src/components/help/HelpView.tsx | 4 +-- src/components/inventory/InventoryView.tsx | 6 ++-- .../views/NavigatorDoorStateView.tsx | 8 ++--- .../NavigatorRoomSettingsBasicTabView.tsx | 6 ++-- .../NavigatorRoomSettingsView.tsx | 6 ++-- .../views/alert-layouts/GetAlertLayout.tsx | 4 +-- .../alert-layouts/NitroSystemAlertView.tsx | 4 +-- .../NotificationDefaultAlertView.tsx | 10 +++--- .../NotificationSearchAlertView.tsx | 10 +++--- .../views/bubble-layouts/GetBubbleLayout.tsx | 4 +-- .../NotificationClubGiftBubbleView.tsx | 6 ++-- .../NotificationDefaultBubbleView.tsx | 4 +-- .../confirm-layouts/GetConfirmLayout.tsx | 4 +-- .../NotificationDefaultConfirmView.tsx | 8 ++--- .../AvatarInfoRentableBotChatView.tsx | 8 ++--- .../AvatarInfoUseProductConfirmView.tsx | 12 +++---- .../avatar-info/AvatarInfoUseProductView.tsx | 6 ++-- .../avatar-info/AvatarInfoWidgetView.tsx | 32 +++++++++---------- .../infostand/InfoStandWidgetBotView.tsx | 6 ++-- .../infostand/InfoStandWidgetFurniView.tsx | 6 ++-- .../infostand/InfoStandWidgetPetView.tsx | 6 ++-- .../InfoStandWidgetRentableBotView.tsx | 6 ++-- .../infostand/InfoStandWidgetUserView.tsx | 6 ++-- .../menu/AvatarInfoWidgetAvatarView.tsx | 8 ++--- .../menu/AvatarInfoWidgetDecorateView.tsx | 2 +- .../menu/AvatarInfoWidgetFurniView.tsx | 6 ++-- .../menu/AvatarInfoWidgetNameView.tsx | 6 ++-- .../menu/AvatarInfoWidgetOwnAvatarView.tsx | 8 ++--- .../menu/AvatarInfoWidgetOwnPetView.tsx | 8 ++--- .../menu/AvatarInfoWidgetPetView.tsx | 8 ++--- .../menu/AvatarInfoWidgetRentableBotView.tsx | 10 +++--- .../widgets/choosers/ChooserWidgetView.tsx | 6 ++-- .../choosers/FurniChooserWidgetView.tsx | 4 +-- .../choosers/UserChooserWidgetView.tsx | 4 +-- .../widgets/context-menu/ContextMenuView.tsx | 8 ++--- .../FurnitureBackgroundColorView.tsx | 4 +-- .../furniture/FurnitureBadgeDisplayView.tsx | 4 +-- .../widgets/furniture/FurnitureDimmerView.tsx | 4 +-- .../furniture/FurnitureExchangeCreditView.tsx | 4 +-- .../furniture/FurnitureExternalImageView.tsx | 4 +-- .../furniture/FurnitureFriendFurniView.tsx | 6 ++-- .../furniture/FurnitureGiftOpeningView.tsx | 4 +-- .../furniture/FurnitureMannequinView.tsx | 4 +-- .../furniture/FurnitureStackHeightView.tsx | 4 +-- .../furniture/FurnitureStickieView.tsx | 4 +-- .../widgets/furniture/FurnitureTrophyView.tsx | 4 +-- .../furniture/FurnitureYoutubeDisplayView.tsx | 4 +-- .../context-menu/EffectBoxConfirmView.tsx | 10 +++--- .../context-menu/FurnitureContextMenuView.tsx | 10 +++--- .../MonsterPlantSeedConfirmView.tsx | 14 ++++---- .../PurchasableClothingConfirmView.tsx | 14 ++++---- src/components/wired/views/WiredBaseView.tsx | 6 ++-- .../useFurnitureBackgroundColorWidget.ts | 6 ++-- .../useFurnitureBadgeDisplayWidget.ts | 6 ++-- .../useFurnitureContextMenuWidget.ts | 14 ++++---- .../furniture/useFurnitureExchangeWidget.ts | 8 ++--- .../useFurnitureExternalImageWidget.ts | 6 ++-- .../useFurnitureFriendFurniWidget.ts | 12 +++---- .../furniture/useFurnitureMannequinWidget.ts | 10 +++--- .../furniture/useFurniturePresentWidget.ts | 8 ++--- .../useFurnitureStackHeightWidget.ts | 6 ++-- .../furniture/useFurnitureStickieWidget.ts | 6 ++-- .../furniture/useFurnitureTrophyWidget.ts | 6 ++-- .../furniture/useFurnitureYoutubeWidget.ts | 6 ++-- .../rooms/widgets/useFurniChooserWidget.ts | 4 +-- .../rooms/widgets/useUserChooserWidget.ts | 4 +-- 74 files changed, 252 insertions(+), 252 deletions(-) diff --git a/src/common/card/accordion/NitroCardAccordionSetView.tsx b/src/common/card/accordion/NitroCardAccordionSetView.tsx index 0be64d08..86eda4cb 100644 --- a/src/common/card/accordion/NitroCardAccordionSetView.tsx +++ b/src/common/card/accordion/NitroCardAccordionSetView.tsx @@ -22,7 +22,7 @@ export const NitroCardAccordionSetView: FC = pro setIsOpen(prevValue => !prevValue); } - const close = useCallback(() => setIsOpen(false), []); + const onClose = useCallback(() => setIsOpen(false), []); const getClassNames = useMemo(() => { @@ -42,7 +42,7 @@ export const NitroCardAccordionSetView: FC = pro useEffect(() => { - const closeFunction = close; + const closeFunction = onClose; setClosers(prevValue => { @@ -66,7 +66,7 @@ export const NitroCardAccordionSetView: FC = pro return newClosers; }); } - }, [ close, setClosers ]); + }, [ onClose, setClosers ]); return ( diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx index d4e56d82..8db771af 100644 --- a/src/common/layout/LayoutNotificationAlertView.tsx +++ b/src/common/layout/LayoutNotificationAlertView.tsx @@ -6,12 +6,12 @@ export interface LayoutNotificationAlertViewProps extends NitroCardViewProps { title?: string; type?: string; - close: () => void; + onClose: () => void; } export const LayoutNotificationAlertView: FC = props => { - const { title = '', close = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props; + const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props; const getClassNames = useMemo(() => { @@ -26,7 +26,7 @@ export const LayoutNotificationAlertView: FC = return ( - + { children } diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx index 5e5fdd9f..a4821664 100644 --- a/src/common/layout/LayoutNotificationBubbleView.tsx +++ b/src/common/layout/LayoutNotificationBubbleView.tsx @@ -6,12 +6,12 @@ export interface LayoutNotificationBubbleViewProps extends FlexProps { fadesOut?: boolean; timeoutMs?: number; - close: () => void; + onClose: () => void; } export const LayoutNotificationBubbleView: FC = props => { - const { fadesOut = true, timeoutMs = 8000, close = null, overflow = 'hidden', classNames = [], ...rest } = props; + const { fadesOut = true, timeoutMs = 8000, onClose = null, overflow = 'hidden', classNames = [], ...rest } = props; const [ isVisible, setIsVisible ] = useState(false); const getClassNames = useMemo(() => @@ -38,15 +38,15 @@ export const LayoutNotificationBubbleView: FC { setIsVisible(false); - setTimeout(() => close(), 300); + setTimeout(() => onClose(), 300); }, timeoutMs); return () => clearTimeout(timeout); - }, [ fadesOut, timeoutMs, close ]); + }, [ fadesOut, timeoutMs, onClose ]); return ( - + ); } diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx index 48538fe3..e2961294 100644 --- a/src/components/campaign/CalendarView.tsx +++ b/src/components/campaign/CalendarView.tsx @@ -5,7 +5,7 @@ import { CalendarItemView } from './CalendarItemView'; interface CalendarViewProps { - close(): void; + onClose(): void; openPackage(id: number, asStaff: boolean): void; receivedProducts: Map; campaignName: string; @@ -19,7 +19,7 @@ const TOTAL_SHOWN_ITEMS = 5; export const CalendarView: FC = props => { - const { close = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props; + const { onClose = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props; const [ selectedDay, setSelectedDay ] = useState(currentDay); const [ index, setIndex ] = useState(Math.max(0, (selectedDay - 1))); @@ -97,7 +97,7 @@ export const CalendarView: FC = props => return ( - + diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index 6692beeb..230416e1 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -103,7 +103,7 @@ export const CampaignView: FC<{}> = props => return ( <> { (calendarData && isCalendarOpen) && - + } ) diff --git a/src/components/catalog/views/gift/CatalogGiftView.tsx b/src/components/catalog/views/gift/CatalogGiftView.tsx index 8034ef03..cf293529 100644 --- a/src/components/catalog/views/gift/CatalogGiftView.tsx +++ b/src/components/catalog/views/gift/CatalogGiftView.tsx @@ -26,7 +26,7 @@ export const CatalogGiftView: FC<{}> = props => const { catalogOptions = null } = useCatalog(); const { giftConfiguration = null } = catalogOptions; - const close = useCallback(() => + const onClose = useCallback(() => { setIsVisible(false); setPageId(0); @@ -46,12 +46,12 @@ export const CatalogGiftView: FC<{}> = props => switch(event.type) { case CatalogPurchasedEvent.PURCHASE_SUCCESS: - close(); + onClose(); return; case CatalogEvent.INIT_GIFT: const castedEvent = (event as CatalogInitGiftEvent); - close(); + onClose(); setPageId(castedEvent.pageId); setOfferId(castedEvent.offerId); @@ -59,7 +59,7 @@ export const CatalogGiftView: FC<{}> = props => setIsVisible(true); return; } - }, [ close ]); + }, [ onClose ]); useUiEvent(CatalogPurchasedEvent.PURCHASE_SUCCESS, onCatalogEvent); useUiEvent(CatalogEvent.INIT_GIFT, onCatalogEvent); @@ -158,7 +158,7 @@ export const CatalogGiftView: FC<{}> = props => return ( - + { LocalizeText('catalog.gift_wrapping.receiver') } @@ -216,7 +216,7 @@ export const CatalogGiftView: FC<{}> = props => - } - } @@ -99,7 +99,7 @@ export const NavigatorDoorStateView: FC<{}> = props => - diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx index 8fb0d876..26eb4c04 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsBasicTabView.tsx @@ -14,13 +14,13 @@ interface NavigatorRoomSettingsTabViewProps { roomData: IRoomData; handleChange: (field: string, value: string | number | boolean) => void; - close: () => void; + onClose: () => void; } export const NavigatorRoomSettingsBasicTabView: FC = props => { - const { roomData = null, handleChange = null, close = null } = props; + const { roomData = null, handleChange = null, onClose = null } = props; const [ roomName, setRoomName ] = useState(''); const [ roomDescription, setRoomDescription ] = useState(''); const { showConfirm = null } = useNotification(); @@ -32,7 +32,7 @@ export const NavigatorRoomSettingsBasicTabView: FC = props => useMessageEvent(RoomSettingsDataEvent, onRoomSettingsEvent); - const close = () => + const onClose = () => { setRoomData(null); setCurrentTab(TABS[0]); @@ -181,7 +181,7 @@ export const NavigatorRoomSettingsView: FC<{}> = props => return ( - + { TABS.map(tab => { @@ -190,7 +190,7 @@ export const NavigatorRoomSettingsView: FC<{}> = props => { (currentTab === TABS[0]) && - } + } { (currentTab === TABS[1]) && } { (currentTab === TABS[2]) && diff --git a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx index 6021b1b5..1c37e5a6 100644 --- a/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx +++ b/src/components/notification-center/views/alert-layouts/GetAlertLayout.tsx @@ -3,11 +3,11 @@ import { NitroSystemAlertView } from './NitroSystemAlertView'; import { NotificationDefaultAlertView } from './NotificationDefaultAlertView'; import { NotificationSeachAlertView } from './NotificationSearchAlertView'; -export const GetAlertLayout = (item: NotificationAlertItem, close: () => void) => +export const GetAlertLayout = (item: NotificationAlertItem, onClose: () => void) => { if(!item) return null; - const props = { key: item.id, item, close }; + const props = { key: item.id, item, onClose }; switch(item.alertType) { diff --git a/src/components/notification-center/views/alert-layouts/NitroSystemAlertView.tsx b/src/components/notification-center/views/alert-layouts/NitroSystemAlertView.tsx index b5cccaba..9855384e 100644 --- a/src/components/notification-center/views/alert-layouts/NitroSystemAlertView.tsx +++ b/src/components/notification-center/views/alert-layouts/NitroSystemAlertView.tsx @@ -9,10 +9,10 @@ interface NotificationDefaultAlertViewProps extends LayoutNotificationAlertViewP export const NitroSystemAlertView: FC = props => { - const { title = 'Nitro', close = null, ...rest } = props; + const { title = 'Nitro', onClose = null, ...rest } = props; return ( - +   diff --git a/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx b/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx index 73ba2ee0..38ae337b 100644 --- a/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx +++ b/src/components/notification-center/views/alert-layouts/NotificationDefaultAlertView.tsx @@ -9,7 +9,7 @@ interface NotificationDefaultAlertViewProps extends LayoutNotificationAlertViewP export const NotificationDefaultAlertView: FC = props => { - const { item = null, title = ((props.item && props.item.title) || ''), close = null, ...rest } = props; + const { item = null, title = ((props.item && props.item.title) || ''), onClose = null, ...rest } = props; const [ imageFailed, setImageFailed ] = useState(false) @@ -17,13 +17,13 @@ export const NotificationDefaultAlertView: FC { OpenUrl(item.clickUrl); - close(); - }, [ item, close ]); + onClose(); + }, [ item, onClose ]); const hasFrank = item.alertType === NotificationAlertType.DEFAULT; return ( - + { hasFrank && !item.imageUrl && } { item.imageUrl && !imageFailed && { @@ -47,7 +47,7 @@ export const NotificationDefaultAlertView: FC
    { !item.clickUrl && - } + } { item.clickUrl && (item.clickUrl.length > 0) && }
    } diff --git a/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx b/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx index 273a6aa6..508a142d 100644 --- a/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx +++ b/src/components/notification-center/views/alert-layouts/NotificationSearchAlertView.tsx @@ -9,7 +9,7 @@ interface NotificationDefaultAlertViewProps extends LayoutNotificationAlertViewP export const NotificationSeachAlertView: FC = props => { - const { item = null, title = ((props.item && props.item.title) || ''), close = null, ...rest } = props; + const { item = null, title = ((props.item && props.item.title) || ''), onClose = null, ...rest } = props; const [ searchValue, setSearchValue ] = useState(''); const [ results, setResults ] = useState([]); @@ -18,8 +18,8 @@ export const NotificationSeachAlertView: FC = { OpenUrl(item.clickUrl); - close(); - }, [ item, close ]); + onClose(); + }, [ item, onClose ]); useEffect(() => { @@ -36,7 +36,7 @@ export const NotificationSeachAlertView: FC = const isAction = (item.clickUrl && item.clickUrl.startsWith('event:')); return ( - + updateSearchValue(event.target.value) } /> @@ -51,7 +51,7 @@ export const NotificationSeachAlertView: FC =
    { !isAction && !item.clickUrl && - } + } { item.clickUrl && (item.clickUrl.length > 0) && } diff --git a/src/components/notification-center/views/bubble-layouts/GetBubbleLayout.tsx b/src/components/notification-center/views/bubble-layouts/GetBubbleLayout.tsx index 6293f442..b22a2f61 100644 --- a/src/components/notification-center/views/bubble-layouts/GetBubbleLayout.tsx +++ b/src/components/notification-center/views/bubble-layouts/GetBubbleLayout.tsx @@ -2,11 +2,11 @@ import { NotificationBubbleItem, NotificationBubbleType } from '../../../../api' import { NotificationClubGiftBubbleView } from './NotificationClubGiftBubbleView'; import { NotificationDefaultBubbleView } from './NotificationDefaultBubbleView'; -export const GetBubbleLayout = (item: NotificationBubbleItem, close: () => void) => +export const GetBubbleLayout = (item: NotificationBubbleItem, onClose: () => void) => { if(!item) return null; - const props = { key: item.id, item, close }; + const props = { key: item.id, item, onClose }; switch(item.notificationType) { diff --git a/src/components/notification-center/views/bubble-layouts/NotificationClubGiftBubbleView.tsx b/src/components/notification-center/views/bubble-layouts/NotificationClubGiftBubbleView.tsx index c5bb304d..0ec73552 100644 --- a/src/components/notification-center/views/bubble-layouts/NotificationClubGiftBubbleView.tsx +++ b/src/components/notification-center/views/bubble-layouts/NotificationClubGiftBubbleView.tsx @@ -9,17 +9,17 @@ export interface NotificationClubGiftBubbleViewProps extends LayoutNotificationB export const NotificationClubGiftBubbleView: FC = props => { - const { item = null, close = null, ...rest } = props; + const { item = null, onClose = null, ...rest } = props; return ( - +
    { LocalizeText('notifications.text.club_gift') }
    - { LocalizeText('notifications.button.later') } + { LocalizeText('notifications.button.later') }
    ); diff --git a/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx b/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx index 76041b45..91f00119 100644 --- a/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx +++ b/src/components/notification-center/views/bubble-layouts/NotificationDefaultBubbleView.tsx @@ -9,12 +9,12 @@ export interface NotificationDefaultBubbleViewProps extends LayoutNotificationBu export const NotificationDefaultBubbleView: FC = props => { - const { item = null, close = null, ...rest } = props; + const { item = null, onClose = null, ...rest } = props; const htmlText = item.message.replace(/\r\n|\r|\n/g, '
    '); return ( - (item.linkUrl && item.linkUrl.length && OpenUrl(item.linkUrl)) } { ...rest }> + (item.linkUrl && item.linkUrl.length && OpenUrl(item.linkUrl)) } { ...rest }> { (item.iconUrl && item.iconUrl.length) && } diff --git a/src/components/notification-center/views/confirm-layouts/GetConfirmLayout.tsx b/src/components/notification-center/views/confirm-layouts/GetConfirmLayout.tsx index c2e97d77..fc3cfb4e 100644 --- a/src/components/notification-center/views/confirm-layouts/GetConfirmLayout.tsx +++ b/src/components/notification-center/views/confirm-layouts/GetConfirmLayout.tsx @@ -1,11 +1,11 @@ import { NotificationConfirmItem } from '../../../../api'; import { NotificationDefaultConfirmView } from './NotificationDefaultConfirmView'; -export const GetConfirmLayout = (item: NotificationConfirmItem, close: () => void) => +export const GetConfirmLayout = (item: NotificationConfirmItem, onClose: () => void) => { if(!item) return null; - const props = { key: item.id, item, close }; + const props = { key: item.id, item, onClose }; switch(item.confirmType) { diff --git a/src/components/notification-center/views/confirm-layouts/NotificationDefaultConfirmView.tsx b/src/components/notification-center/views/confirm-layouts/NotificationDefaultConfirmView.tsx index 48f41387..cb0351a0 100644 --- a/src/components/notification-center/views/confirm-layouts/NotificationDefaultConfirmView.tsx +++ b/src/components/notification-center/views/confirm-layouts/NotificationDefaultConfirmView.tsx @@ -9,25 +9,25 @@ export interface NotificationDefaultConfirmViewProps extends LayoutNotificationA export const NotificationDefaultConfirmView: FC = props => { - const { item = null, close = null, ...rest } = props; + const { item = null, onClose = null, ...rest } = props; const { message = null, onConfirm = null, onCancel = null, confirmText = null, cancelText = null, title = null } = item; const confirm = () => { if(onConfirm) onConfirm(); - close(); + onClose(); } const cancel = () => { if(onCancel) onCancel(); - close(); + onClose(); } return ( - + { message } diff --git a/src/components/room/widgets/avatar-info/AvatarInfoRentableBotChatView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoRentableBotChatView.tsx index 9b24ccc0..524fa496 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoRentableBotChatView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoRentableBotChatView.tsx @@ -7,12 +7,12 @@ import { ContextMenuHeaderView } from '../context-menu/ContextMenuHeaderView'; interface AvatarInfoRentableBotChatViewProps { chatEvent: RoomWidgetUpdateRentableBotChatEvent; - close(): void; + onClose(): void; } export const AvatarInfoRentableBotChatView: FC = props => { - const { chatEvent = null, close = null } = props; + const { chatEvent = null, onClose = null } = props; // eslint-disable-next-line no-template-curly-in-string const [ newText, setNewText ] = useState(chatEvent.chat === '${bot.skill.chatter.configuration.text.placeholder}' ? '' : chatEvent.chat); const [ automaticChat, setAutomaticChat ] = useState(chatEvent.automaticChat); @@ -29,7 +29,7 @@ export const AvatarInfoRentableBotChatView: FC
    - + diff --git a/src/components/room/widgets/avatar-info/AvatarInfoUseProductConfirmView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoUseProductConfirmView.tsx index 755b5687..e9d6718b 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoUseProductConfirmView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoUseProductConfirmView.tsx @@ -7,7 +7,7 @@ import { useRoom } from '../../../../hooks'; interface AvatarInfoUseProductConfirmViewProps { item: UseProductItem; - close: () => void; + onClose: () => void; } const _Str_5091: number = -1; @@ -21,7 +21,7 @@ const _Str_9653: number = 6; export const AvatarInfoUseProductConfirmView: FC = props => { - const { item = null, close = null } = props; + const { item = null, onClose = null } = props; const [ mode, setMode ] = useState(_Str_5091); const [ petData, setPetData ] = useState(null); const [ furniData, setFurniData ] = useState(null); @@ -38,8 +38,8 @@ export const AvatarInfoUseProductConfirmView: FC { @@ -223,7 +223,7 @@ export const AvatarInfoUseProductConfirmView: FC - + @@ -270,7 +270,7 @@ export const AvatarInfoUseProductConfirmView: FC } - + diff --git a/src/components/room/widgets/avatar-info/AvatarInfoUseProductView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoUseProductView.tsx index b0c3f1fb..7b001801 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoUseProductView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoUseProductView.tsx @@ -10,7 +10,7 @@ interface AvatarInfoUseProductViewProps { item: UseProductItem; updateConfirmingProduct: (product: UseProductItem) => void; - close: () => void; + onClose: () => void; } const PRODUCT_PAGE_UKNOWN: number = 0; @@ -24,7 +24,7 @@ const PRODUCT_PAGE_FERTILIZE: number = 7; export const AvatarInfoUseProductView: FC = props => { - const { item = null, updateConfirmingProduct = null, close = null } = props; + const { item = null, updateConfirmingProduct = null, onClose = null } = props; const [ mode, setMode ] = useState(0); const { roomSession = null } = useRoom(); @@ -87,7 +87,7 @@ export const AvatarInfoUseProductView: FC = props }, [ item, updateConfirmingProduct ]); return ( - + { item.name } diff --git a/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx b/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx index 7f476b8f..410f515e 100644 --- a/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx +++ b/src/components/room/widgets/avatar-info/AvatarInfoWidgetView.tsx @@ -51,7 +51,7 @@ export const AvatarInfoWidgetView: FC<{}> = props => { if(!roomSession || isGameMode) return null; - if(activeNameBubble) return setActiveNameBubble(null) } />; + if(activeNameBubble) return setActiveNameBubble(null) } />; if(avatarInfo) { @@ -62,7 +62,7 @@ export const AvatarInfoWidgetView: FC<{}> = props => if(!isDecorating) return null; - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; } case AvatarInfoUser.OWN_USER: case AvatarInfoUser.PEER: { @@ -74,20 +74,20 @@ export const AvatarInfoWidgetView: FC<{}> = props => { if(RoomEnterEffect.isRunning()) return null; - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; } - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; } case AvatarInfoPet.PET_INFO: { const info = (avatarInfo as AvatarInfoPet); - if(info.isOwner) return setAvatarInfo(null) } />; + if(info.isOwner) return setAvatarInfo(null) } />; - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; } case AvatarInfoRentableBot.RENTABLE_BOT: { - return setAvatarInfo(null) } /> + return setAvatarInfo(null) } /> } } } @@ -102,16 +102,16 @@ export const AvatarInfoWidgetView: FC<{}> = props => switch(avatarInfo.type) { case AvatarInfoFurni.FURNI: - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; case AvatarInfoUser.OWN_USER: case AvatarInfoUser.PEER: - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; case AvatarInfoUser.BOT: - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; case AvatarInfoRentableBot.RENTABLE_BOT: - return setAvatarInfo(null) } />; + return setAvatarInfo(null) } />; case AvatarInfoPet.PET_INFO: - return setAvatarInfo(null) } /> + return setAvatarInfo(null) } /> } } @@ -124,13 +124,13 @@ export const AvatarInfoWidgetView: FC<{}> = props => { getInfostandView() } } - { (nameBubbles.length > 0) && nameBubbles.map((name, index) => removeNameBubble(index) } />) } + { (nameBubbles.length > 0) && nameBubbles.map((name, index) => removeNameBubble(index) } />) } { (productBubbles.length > 0) && productBubbles.map((item, index) => { - return removeProductBubble(index) } />; + return removeProductBubble(index) } />; }) } - { rentableBotChatEvent && setRentableBotChatEvent(null) }/> } - { confirmingProduct && updateConfirmingProduct(null) } /> } + { rentableBotChatEvent && setRentableBotChatEvent(null) }/> } + { confirmingProduct && updateConfirmingProduct(null) } /> } ) } diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetBotView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetBotView.tsx index a02bc918..7389cf34 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetBotView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetBotView.tsx @@ -6,12 +6,12 @@ import { Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text } from interface InfoStandWidgetBotViewProps { avatarInfo: AvatarInfoUser; - close: () => void; + onClose: () => void; } export const InfoStandWidgetBotView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; if(!avatarInfo) return null; @@ -21,7 +21,7 @@ export const InfoStandWidgetBotView: FC = props => { avatarInfo.name } - +
    diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetFurniView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetFurniView.tsx index eaaf4483..98816a13 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetFurniView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetFurniView.tsx @@ -8,7 +8,7 @@ import { useMessageEvent, useRoom } from '../../../../../hooks'; interface InfoStandWidgetFurniViewProps { avatarInfo: AvatarInfoFurni; - close: () => void; + onClose: () => void; } const PICKUP_MODE_NONE: number = 0; @@ -17,7 +17,7 @@ const PICKUP_MODE_FULL: number = 2; export const InfoStandWidgetFurniView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const { roomSession = null } = useRoom(); const [ pickupMode, setPickupMode ] = useState(0); @@ -278,7 +278,7 @@ export const InfoStandWidgetFurniView: FC = props { avatarInfo.name } - +
    diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetPetView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetPetView.tsx index 648f2c1e..7847f439 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetPetView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetPetView.tsx @@ -6,12 +6,12 @@ import { Base, Column, Flex, LayoutPetImageView, Text, UserProfileIconView } fro interface InfoStandWidgetPetViewProps { avatarInfo: AvatarInfoPet; - close: () => void; + onClose: () => void; } export const InfoStandWidgetPetView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; if(!avatarInfo) return null; @@ -21,7 +21,7 @@ export const InfoStandWidgetPetView: FC = props => { avatarInfo.name } - + { LocalizeText(`pet.breed.${ avatarInfo.petType }.${ avatarInfo.petBreed }`) }
    diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetRentableBotView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetRentableBotView.tsx index 667c4fdc..13aa9b62 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetRentableBotView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetRentableBotView.tsx @@ -7,12 +7,12 @@ import { Button, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text interface InfoStandWidgetRentableBotViewProps { avatarInfo: AvatarInfoRentableBot; - close: () => void; + onClose: () => void; } export const InfoStandWidgetRentableBotView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const canPickup = useMemo(() => { @@ -34,7 +34,7 @@ export const InfoStandWidgetRentableBotView: FC { avatarInfo.name } - +
    diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx index d48eaf5e..a0e4086b 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx @@ -10,12 +10,12 @@ interface InfoStandWidgetUserViewProps { avatarInfo: AvatarInfoUser; setAvatarInfo: Dispatch>; - close: () => void; + onClose: () => void; } export const InfoStandWidgetUserView: FC = props => { - const { avatarInfo = null, setAvatarInfo = null, close = null } = props; + const { avatarInfo = null, setAvatarInfo = null, onClose = null } = props; const [ motto, setMotto ] = useState(null); const [ isEditingMotto, setIsEditingMotto ] = useState(false); const [ relationships, setRelationships ] = useState(null); @@ -128,7 +128,7 @@ export const InfoStandWidgetUserView: FC = props = { avatarInfo.name }
    - +

    diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx index 792be669..e852bcb1 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx @@ -11,7 +11,7 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetAvatarViewProps { avatarInfo: AvatarInfoUser; - close: () => void; + onClose: () => void; } const MODE_NORMAL = 0; @@ -24,7 +24,7 @@ const MODE_RELATIONSHIP = 6; export const AvatarInfoWidgetAvatarView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const [ mode, setMode ] = useState(MODE_NORMAL); const [ respectsLeft, setRespectsLeft ] = useState(0); const { canRequestFriend = null } = useFriends(); @@ -197,7 +197,7 @@ export const AvatarInfoWidgetAvatarView: FC = p } } - if(hideMenu) close(); + if(hideMenu) onClose(); } useEffect(() => @@ -207,7 +207,7 @@ export const AvatarInfoWidgetAvatarView: FC = p }, [ avatarInfo ]); return ( - + GetUserProfile(avatarInfo.webID) }> { avatarInfo.name } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetDecorateView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetDecorateView.tsx index 672e0e4d..5ad5a680 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetDecorateView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetDecorateView.tsx @@ -18,7 +18,7 @@ export const AvatarInfoWidgetDecorateView: FC const { userId = -1, userName = '', roomIndex = -1, setIsDecorating = null } = props; return ( - + setIsDecorating(false) }> { LocalizeText('widget.avatar.stop_decorating') } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetFurniView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetFurniView.tsx index cb7a287e..62b9103c 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetFurniView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetFurniView.tsx @@ -10,12 +10,12 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetFurniViewProps { avatarInfo: AvatarInfoFurni; - close: () => void; + onClose: () => void; } export const AvatarInfoWidgetFurniView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const processAction = (name: string) => { @@ -42,7 +42,7 @@ export const AvatarInfoWidgetFurniView: FC = pro } return ( - + { avatarInfo.name } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetNameView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetNameView.tsx index 27500351..00e115bd 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetNameView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetNameView.tsx @@ -5,12 +5,12 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetNameViewProps { nameInfo: AvatarInfoName; - close: () => void; + onClose: () => void; } export const AvatarInfoWidgetNameView: FC = props => { - const { nameInfo = null, close = null } = props; + const { nameInfo = null, onClose = null } = props; const getClassNames = useMemo(() => { @@ -22,7 +22,7 @@ export const AvatarInfoWidgetNameView: FC = props }, [ nameInfo ]); return ( - +
    { nameInfo.name }
    diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx index e14aff74..a4de1a6a 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx @@ -14,7 +14,7 @@ interface AvatarInfoWidgetOwnAvatarViewProps avatarInfo: AvatarInfoUser; isDancing: boolean; setIsDecorating: Dispatch>; - close: () => void; + onClose: () => void; } const MODE_NORMAL = 0; @@ -25,7 +25,7 @@ const MODE_SIGNS = 4; export const AvatarInfoWidgetOwnAvatarView: FC = props => { - const { avatarInfo = null, isDancing = false, setIsDecorating = null, close = null } = props; + const { avatarInfo = null, isDancing = false, setIsDecorating = null, onClose = null } = props; const [ mode, setMode ] = useState((isDancing && HasHabboClub()) ? MODE_CLUB_DANCES : MODE_NORMAL); const { roomSession = null } = useRoom(); @@ -107,7 +107,7 @@ export const AvatarInfoWidgetOwnAvatarView: FC (avatarInfo.amIOwner || avatarInfo.amIAnyRoomController || (avatarInfo.roomControllerLevel > RoomControllerLevel.GUEST)); @@ -115,7 +115,7 @@ export const AvatarInfoWidgetOwnAvatarView: FC + GetUserProfile(avatarInfo.webID) }> { avatarInfo.name } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnPetView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnPetView.tsx index e69ce62a..107393b5 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnPetView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnPetView.tsx @@ -9,7 +9,7 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetOwnPetViewProps { avatarInfo: AvatarInfoPet; - close: () => void; + onClose: () => void; } const MODE_NORMAL: number = 0; @@ -19,7 +19,7 @@ const MODE_MONSTER_PLANT: number = 3; export const AvatarInfoWidgetOwnPetView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const [ mode, setMode ] = useState(MODE_NORMAL); const [ respectsLeft, setRespectsLeft ] = useState(0); const { roomSession = null } = useRoom(); @@ -118,7 +118,7 @@ export const AvatarInfoWidgetOwnPetView: FC = p } } - if(hideMenu) close(); + if(hideMenu) onClose(); } useEffect(() => @@ -136,7 +136,7 @@ export const AvatarInfoWidgetOwnPetView: FC = p }, [ avatarInfo ]); return ( - + { avatarInfo.name } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetPetView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetPetView.tsx index 08fd69cf..a4cc6721 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetPetView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetPetView.tsx @@ -9,7 +9,7 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetPetViewProps { avatarInfo: AvatarInfoPet; - close: () => void; + onClose: () => void; } const MODE_NORMAL: number = 0; @@ -19,7 +19,7 @@ const MODE_MONSTER_PLANT: number = 3; export const AvatarInfoWidgetPetView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const [ mode, setMode ] = useState(MODE_NORMAL); const [ respectsLeft, setRespectsLeft ] = useState(0); const { roomSession = null } = useRoom(); @@ -85,7 +85,7 @@ export const AvatarInfoWidgetPetView: FC = props = } } - if(hideMenu) close(); + if(hideMenu) onClose(); } useEffect(() => @@ -103,7 +103,7 @@ export const AvatarInfoWidgetPetView: FC = props = }, [ avatarInfo ]); return ( - + { avatarInfo.name } diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetRentableBotView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetRentableBotView.tsx index 3f4ff04e..65e15132 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetRentableBotView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetRentableBotView.tsx @@ -10,7 +10,7 @@ import { ContextMenuView } from '../../context-menu/ContextMenuView'; interface AvatarInfoWidgetRentableBotViewProps { avatarInfo: AvatarInfoRentableBot; - close: () => void; + onClose: () => void; } const MODE_NORMAL = 0; @@ -19,7 +19,7 @@ const MODE_CHANGE_MOTTO = 2; export const AvatarInfoWidgetRentableBotView: FC = props => { - const { avatarInfo = null, close = null } = props; + const { avatarInfo = null, onClose = null } = props; const [ mode, setMode ] = useState(MODE_NORMAL); const [ newName, setNewName ] = useState(''); const [ newMotto, setNewMotto ] = useState(''); @@ -55,7 +55,7 @@ export const AvatarInfoWidgetRentableBotView: FC @@ -131,7 +131,7 @@ export const AvatarInfoWidgetRentableBotView: FC + { avatarInfo.name } diff --git a/src/components/room/widgets/choosers/ChooserWidgetView.tsx b/src/components/room/widgets/choosers/ChooserWidgetView.tsx index b424760b..12c5387f 100644 --- a/src/components/room/widgets/choosers/ChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/ChooserWidgetView.tsx @@ -8,12 +8,12 @@ interface ChooserWidgetViewProps title: string; items: RoomObjectItem[]; selectItem: (item: RoomObjectItem) => void; - close: () => void; + onClose: () => void; } export const ChooserWidgetView: FC = props => { - const { title = null, items = [], selectItem = null, close = null } = props; + const { title = null, items = [], selectItem = null, onClose = null } = props; const [ selectedItem, setSelectedItem ] = useState(null); const [ searchValue, setSearchValue ] = useState(''); const canSeeId = GetSessionDataManager().isModerator; @@ -45,7 +45,7 @@ export const ChooserWidgetView: FC = props => return ( - + setSearchValue(event.target.value) } /> diff --git a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx index 2bd804ee..ae84e601 100644 --- a/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/FurniChooserWidgetView.tsx @@ -6,7 +6,7 @@ import { ChooserWidgetView } from './ChooserWidgetView'; export const FurniChooserWidgetView: FC<{}> = props => { - const { items = null, close = null, selectItem = null, populateChooser = null } = useFurniChooserWidget(); + const { items = null, onClose = null, selectItem = null, populateChooser = null } = useFurniChooserWidget(); useEffect(() => { @@ -27,5 +27,5 @@ export const FurniChooserWidgetView: FC<{}> = props => if(!items) return null; - return ; + return ; } diff --git a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx index 53986117..f73e074f 100644 --- a/src/components/room/widgets/choosers/UserChooserWidgetView.tsx +++ b/src/components/room/widgets/choosers/UserChooserWidgetView.tsx @@ -6,7 +6,7 @@ import { ChooserWidgetView } from './ChooserWidgetView'; export const UserChooserWidgetView: FC<{}> = props => { - const { items = null, close = null, selectItem = null, populateChooser = null } = useUserChooserWidget(); + const { items = null, onClose = null, selectItem = null, populateChooser = null } = useUserChooserWidget(); useEffect(() => { @@ -27,5 +27,5 @@ export const UserChooserWidgetView: FC<{}> = props => if(!items) return null; - return ; + return ; } diff --git a/src/components/room/widgets/context-menu/ContextMenuView.tsx b/src/components/room/widgets/context-menu/ContextMenuView.tsx index b1c5c3d2..7b80bf80 100644 --- a/src/components/room/widgets/context-menu/ContextMenuView.tsx +++ b/src/components/room/widgets/context-menu/ContextMenuView.tsx @@ -10,7 +10,7 @@ interface ContextMenuViewProps extends BaseProps category: number; userType?: number; fades?: boolean; - close: () => void; + onClose: () => void; collapsable?: boolean; } @@ -27,7 +27,7 @@ let FADE_TIME = 1; export const ContextMenuView: FC = props => { - const { objectId = -1, category = -1, userType = -1, fades = false, close = null, position = 'absolute', classNames = [], style = {}, children = null, collapsable = false, ...rest } = props; + const { objectId = -1, category = -1, userType = -1, fades = false, onClose = null, position = 'absolute', classNames = [], style = {}, children = null, collapsable = false, ...rest } = props; const [ pos, setPos ] = useState<{ x: number, y: number }>({ x: null, y: null }); const [ opacity, setOpacity ] = useState(1); const [ isFading, setIsFading ] = useState(false); @@ -44,13 +44,13 @@ export const ContextMenuView: FC = props => if(newOpacity <= 0) { - close(); + onClose(); return false; } setOpacity(newOpacity); - }, [ isFading, close ]); + }, [ isFading, onClose ]); const updatePosition = useCallback((bounds: NitroRectangle, location: NitroPoint) => { diff --git a/src/components/room/widgets/furniture/FurnitureBackgroundColorView.tsx b/src/components/room/widgets/furniture/FurnitureBackgroundColorView.tsx index cd720f72..ce8e8a82 100644 --- a/src/components/room/widgets/furniture/FurnitureBackgroundColorView.tsx +++ b/src/components/room/widgets/furniture/FurnitureBackgroundColorView.tsx @@ -6,13 +6,13 @@ import { useFurnitureBackgroundColorWidget } from '../../../../hooks'; export const FurnitureBackgroundColorView: FC<{}> = props => { - const { objectId = -1, hue = 0, setHue = null, saturation = 0, setSaturation = null, lightness = 0, setLightness = null, applyToner = null, toggleToner = null, close = null } = useFurnitureBackgroundColorWidget(); + const { objectId = -1, hue = 0, setHue = null, saturation = 0, setSaturation = null, lightness = 0, setLightness = null, applyToner = null, toggleToner = null, onClose = null } = useFurnitureBackgroundColorWidget(); if(objectId === -1) return null; return ( - + diff --git a/src/components/room/widgets/furniture/FurnitureBadgeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureBadgeDisplayView.tsx index c36b58a4..6c449d2d 100644 --- a/src/components/room/widgets/furniture/FurnitureBadgeDisplayView.tsx +++ b/src/components/room/widgets/furniture/FurnitureBadgeDisplayView.tsx @@ -4,9 +4,9 @@ import { useFurnitureBadgeDisplayWidget } from '../../../../hooks'; export const FurnitureBadgeDisplayView: FC<{}> = props => { - const { objectId = -1, color = '1', badgeName = '', badgeDesc = '', date = '', senderName = '', close = null } = useFurnitureBadgeDisplayWidget(); + const { objectId = -1, color = '1', badgeName = '', badgeDesc = '', date = '', senderName = '', onClose = null } = useFurnitureBadgeDisplayWidget(); if(objectId === -1) return null; - return ; + return ; } diff --git a/src/components/room/widgets/furniture/FurnitureDimmerView.tsx b/src/components/room/widgets/furniture/FurnitureDimmerView.tsx index 9d3f6699..4b17e281 100644 --- a/src/components/room/widgets/furniture/FurnitureDimmerView.tsx +++ b/src/components/room/widgets/furniture/FurnitureDimmerView.tsx @@ -11,7 +11,7 @@ export const FurnitureDimmerView: FC<{}> = props => const [ isVisible, setIsVisible ] = useState(false); const { presets = [], dimmerState = 0, selectedPresetId = 0, color = 0xFFFFFF, brightness = 0xFF, effectId = 0, selectedColor = 0, setSelectedColor = null, selectedBrightness = 0, setSelectedBrightness = null, selectedEffectId = 0, setSelectedEffectId = null, selectPresetId = null, applyChanges } = useFurnitureDimmerWidget(); - const close = () => + const onClose = () => { FurnitureDimmerUtilities.previewDimmer(color, brightness, (effectId === 2)); @@ -33,7 +33,7 @@ export const FurnitureDimmerView: FC<{}> = props => return ( - + { (dimmerState === 1) && { presets.map(preset => selectPresetId(preset.id) }>{ LocalizeText(`widget.dimmer.tab.${ preset.id }`) }) } diff --git a/src/components/room/widgets/furniture/FurnitureExchangeCreditView.tsx b/src/components/room/widgets/furniture/FurnitureExchangeCreditView.tsx index 3cf28a9f..130646fe 100644 --- a/src/components/room/widgets/furniture/FurnitureExchangeCreditView.tsx +++ b/src/components/room/widgets/furniture/FurnitureExchangeCreditView.tsx @@ -5,13 +5,13 @@ import { useFurnitureExchangeWidget } from '../../../../hooks'; export const FurnitureExchangeCreditView: FC<{}> = props => { - const { objectId = -1, value = 0, close = null, redeem = null } = useFurnitureExchangeWidget(); + const { objectId = -1, value = 0, onClose = null, redeem = null } = useFurnitureExchangeWidget(); if(objectId === -1) return null; return ( - + diff --git a/src/components/room/widgets/furniture/FurnitureExternalImageView.tsx b/src/components/room/widgets/furniture/FurnitureExternalImageView.tsx index 1deb3241..c014d2c9 100644 --- a/src/components/room/widgets/furniture/FurnitureExternalImageView.tsx +++ b/src/components/room/widgets/furniture/FurnitureExternalImageView.tsx @@ -5,13 +5,13 @@ import { useFurnitureExternalImageWidget } from '../../../../hooks'; export const FurnitureExternalImageView: FC<{}> = props => { - const { objectId = -1, photoData = null, close = null } = useFurnitureExternalImageWidget(); + const { objectId = -1, photoData = null, onClose = null } = useFurnitureExternalImageWidget(); if((objectId === -1) || !photoData) return null; return ( - + { !photoData.w && diff --git a/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx b/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx index 546d89f3..96e3320c 100644 --- a/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx +++ b/src/components/room/widgets/furniture/FurnitureFriendFurniView.tsx @@ -5,7 +5,7 @@ import { useFurnitureFriendFurniWidget } from '../../../../hooks'; export const FurnitureFriendFurniView: FC<{}> = props => { - const { objectId = -1, type = 0, stage = 0, usernames = [], figures = [], date = null, close = null, respond = null } = useFurnitureFriendFurniWidget(); + const { objectId = -1, type = 0, stage = 0, usernames = [], figures = [], date = null, onClose = null, respond = null } = useFurnitureFriendFurniWidget(); if(objectId === -1) return null; @@ -13,7 +13,7 @@ export const FurnitureFriendFurniView: FC<{}> = props => { return ( - +
    { LocalizeText('friend.furniture.confirm.lock.subtitle') } @@ -37,7 +37,7 @@ export const FurnitureFriendFurniView: FC<{}> = props => return (
    -
    +
    diff --git a/src/components/room/widgets/furniture/FurnitureGiftOpeningView.tsx b/src/components/room/widgets/furniture/FurnitureGiftOpeningView.tsx index 75e83dd4..d6a8c001 100644 --- a/src/components/room/widgets/furniture/FurnitureGiftOpeningView.tsx +++ b/src/components/room/widgets/furniture/FurnitureGiftOpeningView.tsx @@ -5,13 +5,13 @@ import { useFurniturePresentWidget } from '../../../../hooks'; export const FurnitureGiftOpeningView: FC<{}> = props => { - const { objectId = -1, classId = -1, itemType = null, text = null, isOwnerOfFurniture = false, senderName = null, senderFigure = null, placedItemId = -1, placedItemType = null, placedInRoom = false, imageUrl = null, openPresent = null, close = null } = useFurniturePresentWidget(); + const { objectId = -1, classId = -1, itemType = null, text = null, isOwnerOfFurniture = false, senderName = null, senderFigure = null, placedItemId = -1, placedItemType = null, placedInRoom = false, imageUrl = null, openPresent = null, onClose = null } = useFurniturePresentWidget(); if(objectId === -1) return null; return ( - + { (placedItemId === -1) && diff --git a/src/components/room/widgets/furniture/FurnitureMannequinView.tsx b/src/components/room/widgets/furniture/FurnitureMannequinView.tsx index 4e52a105..a5c3cedc 100644 --- a/src/components/room/widgets/furniture/FurnitureMannequinView.tsx +++ b/src/components/room/widgets/furniture/FurnitureMannequinView.tsx @@ -15,7 +15,7 @@ export const FurnitureMannequinView: FC<{}> = props => { const [ renderedFigure, setRenderedFigure ] = useState(null); const [ mode, setMode ] = useState(MODE_NONE); - const { objectId = -1, figure = null, gender = null, clubLevel = HabboClubLevelEnum.NO_CLUB, name = null, setName = null, saveFigure = null, wearFigure = null, saveName = null, close = null } = useFurnitureMannequinWidget(); + const { objectId = -1, figure = null, gender = null, clubLevel = HabboClubLevelEnum.NO_CLUB, name = null, setName = null, saveFigure = null, wearFigure = null, saveName = null, onClose = null } = useFurnitureMannequinWidget(); useEffect(() => { @@ -82,7 +82,7 @@ export const FurnitureMannequinView: FC<{}> = props => return ( - + diff --git a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx index 08e6982d..f3a73b6c 100644 --- a/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx +++ b/src/components/room/widgets/furniture/FurnitureStackHeightView.tsx @@ -7,13 +7,13 @@ import { useFurnitureStackHeightWidget } from '../../../../hooks'; export const FurnitureStackHeightView: FC<{}> = props => { - const { objectId = -1, height = 0, maxHeight = 40, close = null, updateHeight = null } = useFurnitureStackHeightWidget(); + const { objectId = -1, height = 0, maxHeight = 40, onClose = null, updateHeight = null } = useFurnitureStackHeightWidget(); if(objectId === -1) return null; return ( - + { LocalizeText('widget.custom.stack.height.text') } diff --git a/src/components/room/widgets/furniture/FurnitureStickieView.tsx b/src/components/room/widgets/furniture/FurnitureStickieView.tsx index e171bb69..f44b0182 100644 --- a/src/components/room/widgets/furniture/FurnitureStickieView.tsx +++ b/src/components/room/widgets/furniture/FurnitureStickieView.tsx @@ -17,7 +17,7 @@ const getStickieColorName = (color: string) => export const FurnitureStickieView: FC<{}> = props => { - const { objectId = -1, color = '0', text = '', canModify = false, updateColor = null, updateText = null, trash = null, close = null } = useFurnitureStickieWidget(); + const { objectId = -1, color = '0', text = '', canModify = false, updateColor = null, updateText = null, trash = null, onClose = null } = useFurnitureStickieWidget(); const [ isEditing, setIsEditing ] = useState(false); useEffect(() => @@ -41,7 +41,7 @@ export const FurnitureStickieView: FC<{}> = props => }) } }
    -
    +
    { !isEditing ?
    setIsEditing(true) }>{ text }
    : } diff --git a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx index 1f6bf79e..7977097e 100644 --- a/src/components/room/widgets/furniture/FurnitureTrophyView.tsx +++ b/src/components/room/widgets/furniture/FurnitureTrophyView.tsx @@ -4,9 +4,9 @@ import { useFurnitureTrophyWidget } from '../../../../hooks'; export const FurnitureTrophyView: FC<{}> = props => { - const { objectId = -1, color = '1', senderName = '', date = '', message = '', close = null } = useFurnitureTrophyWidget(); + const { objectId = -1, color = '1', senderName = '', date = '', message = '', onClose = null } = useFurnitureTrophyWidget(); if(objectId === -1) return null; - return ; + return ; } diff --git a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx index 0f967981..a235f25b 100644 --- a/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx +++ b/src/components/room/widgets/furniture/FurnitureYoutubeDisplayView.tsx @@ -8,7 +8,7 @@ import { useFurnitureYoutubeWidget } from '../../../../hooks'; export const FurnitureYoutubeDisplayView: FC<{}> = props => { const [ player, setPlayer ] = useState(null); - const { objectId = -1, videoId = null, videoStart = 0, videoEnd = 0, currentVideoState = null, selectedVideo = null, playlists = [], close = null, previous = null, next = null, pause = null, play = null, selectVideo = null } = useFurnitureYoutubeWidget(); + const { objectId = -1, videoId = null, videoStart = 0, videoEnd = 0, currentVideoState = null, selectedVideo = null, playlists = [], onClose = null, previous = null, next = null, pause = null, play = null, selectVideo = null } = useFurnitureYoutubeWidget(); const onStateChange = useCallback((event: { target: YouTubePlayer; data: number }) => { @@ -69,7 +69,7 @@ export const FurnitureYoutubeDisplayView: FC<{}> = props => return ( - +
    diff --git a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx index 644ffd81..f7e35b91 100644 --- a/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/EffectBoxConfirmView.tsx @@ -6,30 +6,30 @@ import { useRoom } from '../../../../../hooks'; interface EffectBoxConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } export const EffectBoxConfirmView: FC = props => { - const { objectId = -1, close = null } = props; + const { objectId = -1, onClose = null } = props; const { roomSession = null } = useRoom(); const useProduct = () => { roomSession.useMultistateItem(objectId); - close(); + onClose(); } return ( - + { LocalizeText('effectbox.header.description') } - + diff --git a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx index 1c431643..4ea67733 100644 --- a/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx +++ b/src/components/room/widgets/furniture/context-menu/FurnitureContextMenuView.tsx @@ -16,18 +16,18 @@ const EFFECTBOX_OPEN: string = 'EFFECTBOX_OPEN'; export const FurnitureContextMenuView: FC<{}> = props => { - const { closeConfirm = null, processAction = null, objectId = -1, mode = null, confirmMode = null, confirmingObjectId = -1, groupData = null, isGroupMember = false } = useFurnitureContextMenuWidget(); + const { closeConfirm = null, processAction = null, onClose = null, objectId = -1, mode = null, confirmMode = null, confirmingObjectId = -1, groupData = null, isGroupMember = false } = useFurnitureContextMenuWidget(); return ( <> { (confirmMode === MONSTERPLANT_SEED_CONFIRMATION) && - } + } { (confirmMode === PURCHASABLE_CLOTHING_CONFIRMATION) && - } + } { (confirmMode === EFFECTBOX_OPEN) && - } + } { (objectId >= 0) && mode && - + { (mode === ContextMenuEnum.FRIEND_FURNITURE) && <> diff --git a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx index 619b719c..b7163cc5 100644 --- a/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/MonsterPlantSeedConfirmView.tsx @@ -7,7 +7,7 @@ import { useRoom } from '../../../../../hooks'; interface MonsterPlantSeedConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } const MODE_DEFAULT: number = -1; @@ -15,7 +15,7 @@ const MODE_MONSTERPLANT_SEED: number = 0; export const MonsterPlantSeedConfirmView: FC = props => { - const { objectId = -1, close = null } = props; + const { objectId = -1, onClose = null } = props; const [ furniData, setFurniData ] = useState(null); const [ mode, setMode ] = useState(MODE_DEFAULT); const { roomSession = null } = useRoom(); @@ -24,7 +24,7 @@ export const MonsterPlantSeedConfirmView: FC = { roomSession.useMultistateItem(objectId); - close(); + onClose(); } useEffect(() => @@ -48,19 +48,19 @@ export const MonsterPlantSeedConfirmView: FC = if(mode === MODE_DEFAULT) { - close(); + onClose(); return; } setMode(mode); - }, [ roomSession, objectId, close ]); + }, [ roomSession, objectId, onClose ]); if(mode === MODE_DEFAULT) return null; return ( - + @@ -74,7 +74,7 @@ export const MonsterPlantSeedConfirmView: FC = { LocalizeText('useproduct.widget.info.plant_seed') } - + diff --git a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx index 60bbb2f9..d07d5e82 100644 --- a/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx +++ b/src/components/room/widgets/furniture/context-menu/PurchasableClothingConfirmView.tsx @@ -7,7 +7,7 @@ import { useRoom } from '../../../../../hooks'; interface PurchasableClothingConfirmViewProps { objectId: number; - close: () => void; + onClose: () => void; } const MODE_DEFAULT: number = -1; @@ -15,7 +15,7 @@ const MODE_PURCHASABLE_CLOTHING: number = 0; export const PurchasableClothingConfirmView: FC = props => { - const { objectId = -1, close = null } = props; + const { objectId = -1, onClose = null } = props; const [ mode, setMode ] = useState(MODE_DEFAULT); const [ gender, setGender ] = useState(FigureData.MALE); const [ newFigure, setNewFigure ] = useState(null); @@ -26,7 +26,7 @@ export const PurchasableClothingConfirmView: FC @@ -62,7 +62,7 @@ export const PurchasableClothingConfirmView: FC - + @@ -93,7 +93,7 @@ export const PurchasableClothingConfirmView: FC{ LocalizeText('useproduct.widget.info.bind_clothing') } - + diff --git a/src/components/wired/views/WiredBaseView.tsx b/src/components/wired/views/WiredBaseView.tsx index c18a0cea..6227c669 100644 --- a/src/components/wired/views/WiredBaseView.tsx +++ b/src/components/wired/views/WiredBaseView.tsx @@ -21,7 +21,7 @@ export const WiredBaseView: FC> = props => const [ needsSave, setNeedsSave ] = useState(false); const { trigger = null, setTrigger = null, setIntParams = null, setStringParam = null, setFurniIds = null, saveWired = null } = useWired(); - const close = () => setTrigger(null); + const onClose = () => setTrigger(null); const onSave = () => { @@ -85,7 +85,7 @@ export const WiredBaseView: FC> = props => return ( - + @@ -103,7 +103,7 @@ export const WiredBaseView: FC> = props => } - + diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts index b9855daa..1e882e2d 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBackgroundColorWidget.ts @@ -17,7 +17,7 @@ const useFurnitureBackgroundColorWidgetState = () => const applyToner = () => SendMessageComposer(new ApplyTonerComposer(objectId, hue, saturation, lightness)); const toggleToner = () => roomSession.useMultistateItem(objectId); - const close = () => + const onClose = () => { DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW)); @@ -46,7 +46,7 @@ const useFurnitureBackgroundColorWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); useEffect(() => @@ -56,7 +56,7 @@ const useFurnitureBackgroundColorWidgetState = () => DispatchUiEvent(new RoomWidgetUpdateBackgroundColorPreviewEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, hue, saturation, lightness)); }, [ objectId, category, hue, saturation, lightness ]); - return { objectId, hue, setHue, saturation, setSaturation, lightness, setLightness, applyToner, toggleToner, close }; + return { objectId, hue, setHue, saturation, setSaturation, lightness, setLightness, applyToner, toggleToner, onClose }; } export const useFurnitureBackgroundColorWidget = useFurnitureBackgroundColorWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts index c8fb0185..5ef2bfc4 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureBadgeDisplayWidget.ts @@ -16,7 +16,7 @@ const useFurnitureBadgeDisplayWidgetState = () => const [ senderName, setSenderName ] = useState(''); const { simpleAlert = null } = useNotification(); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -66,10 +66,10 @@ const useFurnitureBadgeDisplayWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, category, color, badgeName, badgeDesc, date, senderName, close }; + return { objectId, category, color, badgeName, badgeDesc, date, senderName, onClose }; } export const useFurnitureBadgeDisplayWidget = useFurnitureBadgeDisplayWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts index 4ff68913..8cd0cb30 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureContextMenuWidget.ts @@ -19,7 +19,7 @@ const useFurnitureContextMenuWidgetState = () => const [ isGroupMember, setIsGroupMember ] = useState(false); const { roomSession = null } = useRoom(); - const close = useCallback(() => + const onClose = useCallback(() => { setObjectId(-1); setGroupData(null); @@ -63,7 +63,7 @@ const useFurnitureContextMenuWidgetState = () => } } - close(); + onClose(); } useRoomEngineEvent([ @@ -86,7 +86,7 @@ const useFurnitureContextMenuWidgetState = () => setConfirmingObjectId(object.id); setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION); - close(); + onClose(); return; case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG: if(!IsOwnerOfFurniture(object)) return; @@ -94,7 +94,7 @@ const useFurnitureContextMenuWidgetState = () => setConfirmingObjectId(object.id); setConfirmMode(EFFECTBOX_OPEN); - close(); + onClose(); return; case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: if(!IsOwnerOfFurniture(object)) return; @@ -102,7 +102,7 @@ const useFurnitureContextMenuWidgetState = () => setConfirmingObjectId(object.id); setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION); - close(); + onClose(); return; case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU: @@ -128,7 +128,7 @@ const useFurnitureContextMenuWidgetState = () => return; case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU: - if(object.id === objectId) close(); + if(object.id === objectId) onClose(); return; } }); @@ -143,7 +143,7 @@ const useFurnitureContextMenuWidgetState = () => setMode(GROUP_FURNITURE); }); - return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, closeConfirm, processAction }; + return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, closeConfirm, processAction, onClose }; } export const useFurnitureContextMenuWidget = useFurnitureContextMenuWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts index 2999d65c..5162607d 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExchangeWidget.ts @@ -10,7 +10,7 @@ const useFurnitureExchangeWidgetState = () => const [ category, setCategory ] = useState(-1); const [ value, setValue ] = useState(0); - const close = useCallback(() => + const onClose = useCallback(() => { setObjectId(-1); setCategory(-1); @@ -21,7 +21,7 @@ const useFurnitureExchangeWidgetState = () => { GetRoomSession().connection.send(new FurnitureExchangeComposer(objectId)); - close(); + onClose(); } useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_CREDITFURNI, event => @@ -39,10 +39,10 @@ const useFurnitureExchangeWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, value, redeem, close }; + return { objectId, value, redeem, onClose }; } export const useFurnitureExchangeWidget = useFurnitureExchangeWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts index e530bacc..5c6a6b17 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureExternalImageWidget.ts @@ -10,7 +10,7 @@ const useFurnitureExternalImageWidgetState = () => const [ category, setCategory ] = useState(-1); const [ photoData, setPhotoData ] = useState(null); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -35,10 +35,10 @@ const useFurnitureExternalImageWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, photoData, close }; + return { objectId, photoData, onClose }; } export const useFurnitureExternalImageWidget = useFurnitureExternalImageWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts index 52c96bce..e658189d 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureFriendFurniWidget.ts @@ -14,7 +14,7 @@ const useFurnitureFriendFurniWidgetState = () => const [ date, setDate ] = useState(null); const [ stage, setStage ] = useState(0); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -28,7 +28,7 @@ const useFurnitureFriendFurniWidgetState = () => { GetRoomSession().connection.send(new FriendFurniConfirmLockMessageComposer(objectId, flag)); - close(); + onClose(); } useMessageEvent(LoveLockFurniStartEvent, event => @@ -39,8 +39,8 @@ const useFurnitureFriendFurniWidgetState = () => setStage(parser.start ? 1 : 2); }); - useMessageEvent(LoveLockFurniFinishedEvent, event => close()); - useMessageEvent(LoveLockFurniFriendConfirmedEvent, event => close()); + useMessageEvent(LoveLockFurniFinishedEvent, event => onClose()); + useMessageEvent(LoveLockFurniFriendConfirmedEvent, event => onClose()); useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_FRIEND_FURNITURE_ENGRAVING, event => { @@ -66,10 +66,10 @@ const useFurnitureFriendFurniWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, type, usernames, figures, date, stage, close, respond }; + return { objectId, type, usernames, figures, date, stage, onClose, respond }; } export const useFurnitureFriendFurniWidget = useFurnitureFriendFurniWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts index 0ecedf9b..60429757 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureMannequinWidget.ts @@ -13,7 +13,7 @@ const useFurnitureMannequinWidgetState = () => const [ clubLevel, setClubLevel ] = useState(HabboClubLevelEnum.NO_CLUB); const [ name, setName ] = useState(null); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -28,7 +28,7 @@ const useFurnitureMannequinWidgetState = () => SendMessageComposer(new FurnitureMannequinSaveLookComposer(objectId)); - close(); + onClose(); } const wearFigure = () => @@ -37,7 +37,7 @@ const useFurnitureMannequinWidgetState = () => SendMessageComposer(new FurnitureMultiStateComposer(objectId)); - close(); + onClose(); } const saveName = () => @@ -71,10 +71,10 @@ const useFurnitureMannequinWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, figure, gender, clubLevel, name, setName, saveFigure, wearFigure, saveName, close }; + return { objectId, figure, gender, clubLevel, name, setName, saveFigure, wearFigure, saveName, onClose }; } export const useFurnitureMannequinWidget = useFurnitureMannequinWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts index 56f73be1..8342b512 100644 --- a/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurniturePresentWidget.ts @@ -25,7 +25,7 @@ const useFurniturePresentWidgetState = () => const [ imageUrl, setImageUrl ] = useState(null); const { roomSession = null } = useRoom(); - const close = () => + const onClose = () => { setObjectId(-1); setClassId(-1); @@ -199,7 +199,7 @@ const useFurniturePresentWidgetState = () => if(!roomObject) return null; - close(); + onClose(); setObjectId(event.objectId); setClassId(-1); @@ -211,7 +211,7 @@ const useFurniturePresentWidgetState = () => useFurniRemovedEvent((objectId !== -1), event => { - if(event.id === objectId) close(); + if(event.id === objectId) onClose(); if(event.id === placedItemId) { @@ -219,7 +219,7 @@ const useFurniturePresentWidgetState = () => } }); - return { objectId, classId, itemType, text, isOwnerOfFurniture, senderName, senderFigure, placedItemId, placedItemType, placedInRoom, imageUrl, openPresent, close }; + return { objectId, classId, itemType, text, isOwnerOfFurniture, senderName, senderFigure, placedItemId, placedItemType, placedInRoom, imageUrl, openPresent, onClose }; } export const useFurniturePresentWidget = useFurniturePresentWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts index be5bb215..0ac47137 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStackHeightWidget.ts @@ -13,7 +13,7 @@ const useFurnitureStackHeightWidgetState = () => const [ height, setHeight ] = useState(0); const [ pendingHeight, setPendingHeight ] = useState(-1); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -61,7 +61,7 @@ const useFurnitureStackHeightWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); useEffect(() => @@ -73,7 +73,7 @@ const useFurnitureStackHeightWidgetState = () => return () => clearTimeout(timeout); }, [ objectId, pendingHeight ]); - return { objectId, height, maxHeight: MAX_HEIGHT, close, updateHeight }; + return { objectId, height, maxHeight: MAX_HEIGHT, onClose, updateHeight }; } export const useFurnitureStackHeightWidget = useFurnitureStackHeightWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts index f43109c8..f1e89134 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureStickieWidget.ts @@ -12,7 +12,7 @@ const useFurnitureStickieWidgetState = () => const [ text, setText ] = useState(''); const [ canModify, setCanModify ] = useState(false); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -73,10 +73,10 @@ const useFurnitureStickieWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, color, text, canModify, updateColor, updateText, trash, close }; + return { objectId, color, text, canModify, updateColor, updateText, trash, onClose }; } export const useFurnitureStickieWidget = useFurnitureStickieWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts index 8a3ee666..d5a1e331 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureTrophyWidget.ts @@ -13,7 +13,7 @@ const useFurnitureTrophyWidgetState = () => const [ date, setDate ] = useState(''); const [ message, setMessage ] = useState(''); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -54,10 +54,10 @@ const useFurnitureTrophyWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, color, senderName, date, message, close }; + return { objectId, color, senderName, date, message, onClose }; } export const useFurnitureTrophyWidget = useFurnitureTrophyWidgetState; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts index d433b0b8..79548e78 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureYoutubeWidget.ts @@ -21,7 +21,7 @@ const useFurnitureYoutubeWidgetState = () => const [ playlists, setPlaylists ] = useState(null); const [ hasControl, setHasControl ] = useState(false); - const close = () => + const onClose = () => { setObjectId(-1); setCategory(-1); @@ -118,10 +118,10 @@ const useFurnitureYoutubeWidgetState = () => { if((event.id !== objectId) || (event.category !== category)) return; - close(); + onClose(); }); - return { objectId, videoId, videoStart, videoEnd, currentVideoState, selectedVideo, playlists, close, previous, next, pause, play, selectVideo }; + return { objectId, videoId, videoStart, videoEnd, currentVideoState, selectedVideo, playlists, onClose, previous, next, pause, play, selectVideo }; } export const useFurnitureYoutubeWidget = useFurnitureYoutubeWidgetState; diff --git a/src/hooks/rooms/widgets/useFurniChooserWidget.ts b/src/hooks/rooms/widgets/useFurniChooserWidget.ts index 5022e3e9..4542dbac 100644 --- a/src/hooks/rooms/widgets/useFurniChooserWidget.ts +++ b/src/hooks/rooms/widgets/useFurniChooserWidget.ts @@ -9,7 +9,7 @@ const useFurniChooserWidgetState = () => const [ items, setItems ] = useState(null); const { roomSession = null } = useRoom(); - const close = () => setItems(null); + const onClose = () => setItems(null); const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); @@ -126,7 +126,7 @@ const useFurniChooserWidgetState = () => }); }); - return { items, close, selectItem, populateChooser }; + return { items, onClose, selectItem, populateChooser }; } export const useFurniChooserWidget = useFurniChooserWidgetState; diff --git a/src/hooks/rooms/widgets/useUserChooserWidget.ts b/src/hooks/rooms/widgets/useUserChooserWidget.ts index 511a3c1a..857922a2 100644 --- a/src/hooks/rooms/widgets/useUserChooserWidget.ts +++ b/src/hooks/rooms/widgets/useUserChooserWidget.ts @@ -9,7 +9,7 @@ const useUserChooserWidgetState = () => const [ items, setItems ] = useState(null); const { roomSession = null } = useRoom(); - const close = () => setItems(null); + const onClose = () => setItems(null); const selectItem = (item: RoomObjectItem) => item && GetRoomEngine().selectRoomObject(GetRoomSession().roomId, item.id, item.category); @@ -74,7 +74,7 @@ const useUserChooserWidgetState = () => }); }); - return { items, close, selectItem, populateChooser }; + return { items, onClose, selectItem, populateChooser }; } export const useUserChooserWidget = useUserChooserWidgetState; From 31416476c937b6ee968cab6c248dcc7ded92ebfc Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:16:21 -0400 Subject: [PATCH 300/331] Update link event trackers --- .../avatar-editor/AvatarEditorView.tsx | 42 +++-- src/components/campaign/CampaignView.tsx | 41 +++-- .../groups/views/GroupMembersView.tsx | 29 ++-- src/components/main/MainView.tsx | 84 +++++----- src/components/navigator/NavigatorView.tsx | 148 +++++++++--------- src/components/nitropedia/NitropediaView.tsx | 29 ++-- 6 files changed, 177 insertions(+), 196 deletions(-) diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx index e757eab5..ad638ab2 100644 --- a/src/components/avatar-editor/AvatarEditorView.tsx +++ b/src/components/avatar-editor/AvatarEditorView.tsx @@ -148,37 +148,35 @@ export const AvatarEditorView: FC<{}> = props => setFigureData(figures.get(gender)); }, [ figures ]); - 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; - } - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (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; + } + }, eventUrlPrefix: 'avatar-editor/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { diff --git a/src/components/campaign/CampaignView.tsx b/src/components/campaign/CampaignView.tsx index 230416e1..6b3a9db8 100644 --- a/src/components/campaign/CampaignView.tsx +++ b/src/components/campaign/CampaignView.tsx @@ -1,4 +1,4 @@ -import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; +import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { AddEventLinkTracker, CalendarItem, RemoveLinkEventTracker, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../../hooks'; @@ -75,30 +75,29 @@ export const CampaignView: FC<{}> = props => setCalendarOpen(false); }, []); - const onLinkReceived = useCallback((link: string) => - { - const value = link.split('/'); - - if(value.length < 2) return; - - switch(value[1]) - { - case 'calendar': - setCalendarOpen(true); - break; - } - }, []); - useEffect(() => { - const linkTracker = { linkReceived: onLinkReceived, eventUrlPrefix: 'openView/' }; + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const value = url.split('/'); + + if(value.length < 2) return; + + switch(value[1]) + { + case 'calendar': + setCalendarOpen(true); + break; + } + }, + eventUrlPrefix: 'openView/' + }; + AddEventLinkTracker(linkTracker); - return () => - { - RemoveLinkEventTracker(linkTracker); - } - }, [ onLinkReceived ]); + return () => RemoveLinkEventTracker(linkTracker); + }, []); return ( <> diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index ef7241ae..95806f09 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -100,30 +100,29 @@ export const GroupMembersView: FC<{}> = props => useMessageEvent(GroupConfirmMemberRemoveEvent, onGroupConfirmMemberRemoveEvent); - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - const groupId = (parseInt(parts[1]) || -1); - const levelId = (parseInt(parts[2]) || 3); - - setGroupId(groupId); - setLevelId(levelId); - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + const groupId = (parseInt(parts[1]) || -1); + const levelId = (parseInt(parts[2]) || 3); + + setGroupId(groupId); + setLevelId(levelId); + setPageId(-1); + }, eventUrlPrefix: 'group-members/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); useEffect(() => { diff --git a/src/components/main/MainView.tsx b/src/components/main/MainView.tsx index 65db8e67..3dec4d05 100644 --- a/src/components/main/MainView.tsx +++ b/src/components/main/MainView.tsx @@ -1,5 +1,5 @@ -import { HabboWebTools, RoomSessionEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { HabboWebTools, ILinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer'; +import { FC, useEffect, useState } from 'react'; import { AddEventLinkTracker, GetCommunication, RemoveLinkEventTracker } from '../../api'; import { Base, TransitionAnimation, TransitionAnimationTypes } from '../../common'; import { useRoomSessionManagerEvent } from '../../hooks'; @@ -32,47 +32,8 @@ export const MainView: FC<{}> = props => const [ isReady, setIsReady ] = useState(false); const [ landingViewVisible, setLandingViewVisible ] = useState(true); - const onRoomSessionEvent = useCallback((event: RoomSessionEvent) => - { - switch(event.type) - { - case RoomSessionEvent.CREATED: - setLandingViewVisible(false); - return; - case RoomSessionEvent.ENDED: - setLandingViewVisible(event.openLandingView); - return; - } - }, []); - - useRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent); - useRoomSessionManagerEvent(RoomSessionEvent.ENDED, onRoomSessionEvent); - - const onLinkReceived = useCallback((link: string) => - { - const parts = link.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'open': - if(parts.length > 2) - { - switch(parts[2]) - { - case 'credits': - //HabboWebTools.openWebPageAndMinimizeClient(this._windowManager.getProperty(ExternalVariables.WEB_SHOP_RELATIVE_URL)); - break; - default: { - const name = parts[2]; - HabboWebTools.openHabblet(name); - } - } - } - return; - } - }, []); + useRoomSessionManagerEvent(RoomSessionEvent.CREATED, event => setLandingViewVisible(false)); + useRoomSessionManagerEvent(RoomSessionEvent.ENDED, event => setLandingViewVisible(event.openLandingView)); useEffect(() => { @@ -83,14 +44,39 @@ export const MainView: FC<{}> = props => useEffect(() => { - const linkTracker = { linkReceived: onLinkReceived, eventUrlPrefix: 'habblet/' }; + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'open': + if(parts.length > 2) + { + switch(parts[2]) + { + case 'credits': + //HabboWebTools.openWebPageAndMinimizeClient(this._windowManager.getProperty(ExternalVariables.WEB_SHOP_RELATIVE_URL)); + break; + default: { + const name = parts[2]; + HabboWebTools.openHabblet(name); + } + } + } + return; + } + }, + eventUrlPrefix: 'habblet/' + }; + AddEventLinkTracker(linkTracker); - return () => - { - RemoveLinkEventTracker(linkTracker); - } - }, [ onLinkReceived ]); + return () => RemoveLinkEventTracker(linkTracker); + }, []); return ( diff --git a/src/components/navigator/NavigatorView.tsx b/src/components/navigator/NavigatorView.tsx index 728b3b67..e5bdff45 100644 --- a/src/components/navigator/NavigatorView.tsx +++ b/src/components/navigator/NavigatorView.tsx @@ -85,90 +85,88 @@ export const NavigatorView: FC<{}> = props => sendSearch('', topLevelContext.code); }, [ isReady, searchResult, topLevelContext, sendSearch ]); - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'show': { - setIsVisible(true); - setNeedsSearch(true); - return; - } - case 'hide': - setIsVisible(false); - return; - case 'toggle': { - if(isVisible) - { - setIsVisible(false); - - return; - } - - setIsVisible(true); - setNeedsSearch(true); - return; - } - case 'toggle-room-info': - setRoomInfoOpen(value => !value); - return; - case 'toggle-room-link': - setRoomLinkOpen(value => !value); - return; - case 'goto': - if(parts.length <= 2) return; - - switch(parts[2]) - { - case 'home': - if(navigatorData.homeRoomId <= 0) return; - - TryVisitRoom(navigatorData.homeRoomId); - break; - default: { - const roomId = parseInt(parts[2]); - - TryVisitRoom(roomId); - } - } - return; - case 'create': - setIsVisible(true); - setCreatorOpen(true); - return; - case 'search': - if(parts.length > 2) - { - const topLevelContextCode = parts[2]; - - let searchValue = ''; - - if(parts.length > 3) searchValue = parts[3]; - - pendingSearch.current = { value: searchValue, code: topLevelContextCode }; - - setIsVisible(true); - setNeedsSearch(true); - } - return; - } - }, [ isVisible, navigatorData ]); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': { + setIsVisible(true); + setNeedsSearch(true); + return; + } + case 'hide': + setIsVisible(false); + return; + case 'toggle': { + if(isVisible) + { + setIsVisible(false); + + return; + } + + setIsVisible(true); + setNeedsSearch(true); + return; + } + case 'toggle-room-info': + setRoomInfoOpen(value => !value); + return; + case 'toggle-room-link': + setRoomLinkOpen(value => !value); + return; + case 'goto': + if(parts.length <= 2) return; + + switch(parts[2]) + { + case 'home': + if(navigatorData.homeRoomId <= 0) return; + + TryVisitRoom(navigatorData.homeRoomId); + break; + default: { + const roomId = parseInt(parts[2]); + + TryVisitRoom(roomId); + } + } + return; + case 'create': + setIsVisible(true); + setCreatorOpen(true); + return; + case 'search': + if(parts.length > 2) + { + const topLevelContextCode = parts[2]; + + let searchValue = ''; + + if(parts.length > 3) searchValue = parts[3]; + + pendingSearch.current = { value: searchValue, code: topLevelContextCode }; + + setIsVisible(true); + setNeedsSearch(true); + } + return; + } + }, eventUrlPrefix: 'navigator/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, [ isVisible, navigatorData ]); useEffect(() => { diff --git a/src/components/nitropedia/NitropediaView.tsx b/src/components/nitropedia/NitropediaView.tsx index 788e2208..e2fc9380 100644 --- a/src/components/nitropedia/NitropediaView.tsx +++ b/src/components/nitropedia/NitropediaView.tsx @@ -1,4 +1,4 @@ -import { NitroLogger } from '@nitrots/nitro-renderer'; +import { ILinkEventTracker, NitroLogger } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useRef, useState } from 'react'; import { AddEventLinkTracker, GetConfiguration, OpenUrl, RemoveLinkEventTracker } from '../../api'; import { Base, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; @@ -48,25 +48,26 @@ export const NitropediaView: FC<{}> = props => } }, []); - const onLinkReceived = useCallback((link: string) => - { - const value = link.split('/'); - - if(value.length < 2) return; - - value.shift(); - - openPage(GetConfiguration('habbopages.url') + value.join('/')); - }, [ openPage ]); - useEffect(() => { - const linkTracker = { linkReceived: onLinkReceived, eventUrlPrefix: 'habbopages/' }; + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const value = url.split('/'); + + if(value.length < 2) return; + + value.shift(); + + openPage(GetConfiguration('habbopages.url') + value.join('/')); + }, + eventUrlPrefix: 'habbopages/' + }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ onLinkReceived ]); + }, [ openPage ]); useEffect(() => { From 07fde6efe141ea6372b95f6d017c37040941f3bc Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:18:45 -0400 Subject: [PATCH 301/331] More fixes --- .../groups/views/GroupMembersView.tsx | 2 +- src/components/guide-tool/GuideToolView.tsx | 30 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/components/groups/views/GroupMembersView.tsx b/src/components/groups/views/GroupMembersView.tsx index 95806f09..91a8bf96 100644 --- a/src/components/groups/views/GroupMembersView.tsx +++ b/src/components/groups/views/GroupMembersView.tsx @@ -114,7 +114,7 @@ export const GroupMembersView: FC<{}> = props => setGroupId(groupId); setLevelId(levelId); - setPageId(-1); + setPageId(0); }, eventUrlPrefix: 'group-members/' }; diff --git a/src/components/guide-tool/GuideToolView.tsx b/src/components/guide-tool/GuideToolView.tsx index 7d94fa33..589a5485 100644 --- a/src/components/guide-tool/GuideToolView.tsx +++ b/src/components/guide-tool/GuideToolView.tsx @@ -260,31 +260,29 @@ export const GuideToolView: FC<{}> = props => useMessageEvent(GuideSessionDetachedMessageEvent, onGuideSessionDetachedMessageEvent); - const linkReceived = useCallback((url: string) => - { - const parts = url.split('/'); - - if(parts.length < 2) return; - - switch(parts[1]) - { - case 'tour': - //Create Tour Request - return; - } - }, []); - useEffect(() => { const linkTracker: ILinkEventTracker = { - linkReceived, + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'tour': + //Create Tour Request + return; + } + }, eventUrlPrefix: 'help/' }; AddEventLinkTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); - }, [ linkReceived ]); + }, []); const processAction = useCallback((action: string) => { From f41817c85e4feb2b82cb4730e98a93aa6124e714 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:22:18 -0400 Subject: [PATCH 302/331] Allow group badge base 0 --- src/api/groups/GroupBadgePart.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/groups/GroupBadgePart.ts b/src/api/groups/GroupBadgePart.ts index 3e24ed6f..3b74875f 100644 --- a/src/api/groups/GroupBadgePart.ts +++ b/src/api/groups/GroupBadgePart.ts @@ -1,3 +1,4 @@ + export class GroupBadgePart { public static BASE: string = 'b'; @@ -18,7 +19,7 @@ export class GroupBadgePart public get code(): string { - if(this.key === 0) return null; + if((this.key === 0) && (this.type !== GroupBadgePart.BASE)) return null; return GroupBadgePart.getCode(this.type, this.key, this.color, this.position); } From 0a5b33cedae4e816be6f22b0020142c6e38cff4e Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:34:09 -0400 Subject: [PATCH 303/331] Fix room perm ban --- .../widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx index e852bcb1..3a4185aa 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetAvatarView.tsx @@ -291,7 +291,7 @@ export const AvatarInfoWidgetAvatarView: FC = p processAction('ban_day') }> { LocalizeText('infostand.button.ban_day') } - processAction('ban_perm') }> + processAction('perm_ban') }> { LocalizeText('infostand.button.perm_ban') } processAction('back_moderate') }> From 6a6d7f69478cca93aa4aa80ab9fecab5f3a1b6e6 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:46:22 -0400 Subject: [PATCH 304/331] Fix friend issues --- src/api/friends/OpenMessengerChat.ts | 2 +- .../views/messenger/FriendsMessengerView.tsx | 17 +++++++++++------ .../rooms/widgets/useFriendRequestWidget.ts | 2 -- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/api/friends/OpenMessengerChat.ts b/src/api/friends/OpenMessengerChat.ts index 7573bafb..9270981c 100644 --- a/src/api/friends/OpenMessengerChat.ts +++ b/src/api/friends/OpenMessengerChat.ts @@ -2,6 +2,6 @@ import { CreateLinkEvent } from '..'; export function OpenMessengerChat(friendId: number = 0): void { - if(friendId === 0) CreateLinkEvent('friends-messenger/open'); + if(friendId === 0) CreateLinkEvent('friends-messenger/toggle'); else CreateLinkEvent(`friends-messenger/${ friendId }`); } diff --git a/src/components/friends/views/messenger/FriendsMessengerView.tsx b/src/components/friends/views/messenger/FriendsMessengerView.tsx index 10d854c1..8e3e6c69 100644 --- a/src/components/friends/views/messenger/FriendsMessengerView.tsx +++ b/src/components/friends/views/messenger/FriendsMessengerView.tsx @@ -49,15 +49,20 @@ export const FriendsMessengerView: FC<{}> = props => return; } - else + + if(parts[1] === 'toggle') { - const thread = getMessageThread(parseInt(parts[1])); + setIsVisible(prevValue => !prevValue); - if(!thread) return; - - setActiveThreadId(thread.threadId); - setIsVisible(true); + return; } + + const thread = getMessageThread(parseInt(parts[1])); + + if(!thread) return; + + setActiveThreadId(thread.threadId); + setIsVisible(true); } }, eventUrlPrefix: 'friends-messenger/' diff --git a/src/hooks/rooms/widgets/useFriendRequestWidget.ts b/src/hooks/rooms/widgets/useFriendRequestWidget.ts index f54dda5c..548cfb74 100644 --- a/src/hooks/rooms/widgets/useFriendRequestWidget.ts +++ b/src/hooks/rooms/widgets/useFriendRequestWidget.ts @@ -62,8 +62,6 @@ const useFriendRequestWidgetState = () => useEffect(() => { - if(!requests || !requests.length) return; - const newDisplayedRequests: { roomIndex: number, request: MessengerRequest }[] = []; for(const request of requests) From 2b9f6b5634d5cca57f68281520fbfc035bf19cd8 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 19:49:08 -0400 Subject: [PATCH 305/331] Touch event fixes --- src/api/nitro/room/DispatchTouchEvent.ts | 69 +++++++++++------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/src/api/nitro/room/DispatchTouchEvent.ts b/src/api/nitro/room/DispatchTouchEvent.ts index 669fa089..50175445 100644 --- a/src/api/nitro/room/DispatchTouchEvent.ts +++ b/src/api/nitro/room/DispatchTouchEvent.ts @@ -4,38 +4,9 @@ import { GetRoomEngine } from './GetRoomEngine'; let didMouseMove = false; let lastClick = 0; let clickCount = 0; -let touchTimer: ReturnType = null; export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, longTouch: boolean = false, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false) => { - let eventType = event.type; - - if(longTouch) eventType = TouchEventType.TOUCH_LONG; - - if(eventType === TouchEventType.TOUCH_END && !didMouseMove) - { - eventType = MouseEventType.MOUSE_CLICK; - - if(lastClick) - { - clickCount = 1; - - if(lastClick >= (Date.now() - 300)) clickCount++; - } - - lastClick = Date.now(); - - if(clickCount === 2) - { - eventType = MouseEventType.DOUBLE_CLICK; - - clickCount = 0; - lastClick = null; - } - } - - if(touchTimer) clearTimeout(touchTimer); - let x = 0; let y = 0; @@ -50,6 +21,32 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long x = event.changedTouches[0].clientX; y = event.changedTouches[0].clientY; } + + let eventType = event.type; + + if(longTouch) eventType = TouchEventType.TOUCH_LONG; + + if(eventType === MouseEventType.MOUSE_CLICK || eventType === TouchEventType.TOUCH_END) + { + eventType = MouseEventType.MOUSE_CLICK; + + if(lastClick) + { + clickCount = 1; + + if(lastClick >= (Date.now() - 300)) clickCount++; + } + + lastClick = Date.now(); + + if(clickCount === 2) + { + if(!didMouseMove) eventType = MouseEventType.DOUBLE_CLICK; + + clickCount = 0; + lastClick = null; + } + } switch(eventType) { @@ -57,14 +54,7 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long break; case MouseEventType.DOUBLE_CLICK: break; - case TouchEventType.TOUCH_START: - touchTimer = setTimeout(() => - { - if(didMouseMove) return; - - DispatchTouchEvent(event, canvasId, true); - }, 300); - + case TouchEventType.TOUCH_START: eventType = MouseEventType.MOUSE_DOWN; didMouseMove = false; @@ -83,5 +73,10 @@ export const DispatchTouchEvent = (event: TouchEvent, canvasId: number = 1, long default: return; } + if (eventType === TouchEventType.TOUCH_START) + { + GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); + } + GetRoomEngine().dispatchMouseEvent(canvasId, x, y, eventType, altKey, ctrlKey, shiftKey, false); } From 548c6528b414b3f5ee392187c7d7254f026fa06c Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 20:42:32 -0400 Subject: [PATCH 306/331] Marketplace updates --- src/api/catalog/GetImageIconUrlForProduct.ts | 19 +++++++++++++++++ src/api/catalog/index.ts | 1 + .../layout/LayoutFurniIconImageView.tsx | 21 ++----------------- src/common/layout/LayoutGridItem.tsx | 4 ++-- .../CatalogLayoutMarketplaceItemView.tsx | 10 +++++---- .../navigator/views/NavigatorRoomLinkView.tsx | 4 ++-- 6 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 src/api/catalog/GetImageIconUrlForProduct.ts diff --git a/src/api/catalog/GetImageIconUrlForProduct.ts b/src/api/catalog/GetImageIconUrlForProduct.ts new file mode 100644 index 00000000..1e8d8c0b --- /dev/null +++ b/src/api/catalog/GetImageIconUrlForProduct.ts @@ -0,0 +1,19 @@ +import { GetRoomEngine } from '../nitro'; +import { ProductTypeEnum } from './ProductTypeEnum'; + +export const GetImageIconUrlForProduct = (productType: string, productClassId: number, extraData: string = null) => +{ + let imageUrl: string = null; + + switch(productType.toLocaleLowerCase()) + { + case ProductTypeEnum.FLOOR: + imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(productClassId); + break; + case ProductTypeEnum.WALL: + imageUrl = GetRoomEngine().getFurnitureWallIconUrl(productClassId, extraData); + break; + } + + return imageUrl; +} diff --git a/src/api/catalog/index.ts b/src/api/catalog/index.ts index ba084bc8..5b2bde35 100644 --- a/src/api/catalog/index.ts +++ b/src/api/catalog/index.ts @@ -7,6 +7,7 @@ export * from './CatalogPurchaseState'; export * from './CatalogType'; export * from './CatalogUtilities'; export * from './FurnitureOffer'; +export * from './GetImageIconUrlForProduct'; export * from './GiftWrappingConfiguration'; export * from './ICatalogNode'; export * from './ICatalogOptions'; diff --git a/src/common/layout/LayoutFurniIconImageView.tsx b/src/common/layout/LayoutFurniIconImageView.tsx index 21bb7601..b1191dbd 100644 --- a/src/common/layout/LayoutFurniIconImageView.tsx +++ b/src/common/layout/LayoutFurniIconImageView.tsx @@ -1,6 +1,6 @@ import { FC } from 'react'; import { LayoutImage, LayoutImageProps } from '.'; -import { GetRoomEngine, ProductTypeEnum } from '../../api'; +import { GetImageIconUrlForProduct } from '../../api'; interface LayoutFurniIconImageViewProps extends LayoutImageProps { @@ -13,22 +13,5 @@ export const LayoutFurniIconImageView: FC = props { const { productType = 's', productClassId = -1, extraData = '', ...rest } = props; - const getImageIconUrl = () => - { - let imageUrl: string = null; - - switch(productType.toLocaleLowerCase()) - { - case ProductTypeEnum.FLOOR: - imageUrl = GetRoomEngine().getFurnitureFloorIconUrl(productClassId); - break; - case ProductTypeEnum.WALL: - imageUrl = GetRoomEngine().getFurnitureWallIconUrl(productClassId, extraData); - break; - } - - return imageUrl; - } - - return ; + return ; } diff --git a/src/common/layout/LayoutGridItem.tsx b/src/common/layout/LayoutGridItem.tsx index 0a630d00..e1a32e5a 100644 --- a/src/common/layout/LayoutGridItem.tsx +++ b/src/common/layout/LayoutGridItem.tsx @@ -49,14 +49,14 @@ export const LayoutGridItem: FC = props => { let newStyle = { ...style }; - if(itemImage) newStyle.backgroundImage = `url(${ itemImage })`; + if(itemImage && !(itemUniqueSoldout || (itemUniqueNumber > 0))) newStyle.backgroundImage = `url(${ itemImage })`; if(itemColor) newStyle.backgroundColor = itemColor; if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ style, itemImage, itemColor ]); + }, [ style, itemImage, itemColor, itemUniqueSoldout, itemUniqueNumber ]); return ( diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index 22d7dfd9..d5441fbd 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -1,6 +1,6 @@ import { FC, useCallback, useMemo } from 'react'; -import { LocalizeText, ProductTypeEnum } from '../../../../../../api'; -import { Button, Column, LayoutFurniIconImageView, LayoutGridItem, Text } from '../../../../../../common'; +import { GetImageIconUrlForProduct, LocalizeText, ProductTypeEnum } from '../../../../../../api'; +import { Button, Column, LayoutGridItem, Text } from '../../../../../../common'; import { MarketplaceOfferData } from './common/MarketplaceOfferData'; import { MarketPlaceOfferState } from './common/MarketplaceOfferState'; @@ -49,7 +49,9 @@ export const CatalogLayoutMarketplaceItemView: FC = pr return ( - + + + { getMarketplaceOfferTitle } { (type === OWN_OFFER) && @@ -59,7 +61,7 @@ export const CatalogLayoutMarketplaceItemView: FC = pr } { (type === PUBLIC_OFFER) && <> - { LocalizeText('catalog.marketplace.offer.price_public_item', [ 'price', 'average' ], [ offerData.price.toString(), offerData.averagePrice.toString() ]) } + { LocalizeText('catalog.marketplace.offer.price_public_item', [ 'price', 'average' ], [ offerData.price.toString(), ((offerData.averagePrice > 0) ? offerData.averagePrice.toString() : '-') ]) } { LocalizeText('catalog.marketplace.offer_count', [ 'count' ], [ offerData.offerCount.toString() ]) } } diff --git a/src/components/navigator/views/NavigatorRoomLinkView.tsx b/src/components/navigator/views/NavigatorRoomLinkView.tsx index 62bb619f..a09da832 100644 --- a/src/components/navigator/views/NavigatorRoomLinkView.tsx +++ b/src/components/navigator/views/NavigatorRoomLinkView.tsx @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { LocalizeText } from '../../../api'; +import { GetConfiguration, LocalizeText } from '../../../api'; import { Column, Flex, LayoutRoomThumbnailView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common'; import { useNavigatorContext } from '../NavigatorContext'; @@ -24,7 +24,7 @@ export const NavigatorRoomLinkView: FC = props => { LocalizeText('navigator.embed.headline') } { LocalizeText('navigator.embed.info') } - + ('url.prefix', '')) } /> From 5a4dd893195a637cd265297eb6cc14c89690a86f Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 27 Jul 2022 22:38:51 -0400 Subject: [PATCH 307/331] Marketplace commission fix --- .../marketplace/MarketplacePostOfferView.tsx | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx index 82232703..f9f614d5 100644 --- a/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/MarketplacePostOfferView.tsx @@ -1,5 +1,5 @@ import { GetMarketplaceConfigurationMessageComposer, MakeOfferMessageComposer, MarketplaceConfigurationEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { FurnitureItem, LocalizeText, ProductTypeEnum, SendMessageComposer } from '../../../../../../api'; import { Base, Button, Column, Grid, LayoutFurniImageView, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../../../common'; import { CatalogPostMarketplaceOfferEvent } from '../../../../../../events'; @@ -13,7 +13,7 @@ export const MarketplacePostOfferView : FC<{}> = props => const { marketplaceConfiguration = null } = catalogOptions; const { showConfirm = null } = useNotification(); - const onMarketplaceConfigurationEvent = useCallback((event: MarketplaceConfigurationEvent) => + useMessageEvent(MarketplaceConfigurationEvent, event => { const parser = event.getParser(); @@ -25,16 +25,9 @@ export const MarketplacePostOfferView : FC<{}> = props => return newValue; }); - }, [ setCatalogOptions ]); + }); - useMessageEvent(MarketplaceConfigurationEvent, onMarketplaceConfigurationEvent); - - const onCatalogPostMarketplaceOfferEvent = useCallback( (event: CatalogPostMarketplaceOfferEvent) => - { - setItem(event.item); - }, []); - - useUiEvent(CatalogPostMarketplaceOfferEvent.POST_MARKETPLACE, onCatalogPostMarketplaceOfferEvent); + useUiEvent(CatalogPostMarketplaceOfferEvent.POST_MARKETPLACE, event => setItem(event.item)); useEffect(() => { @@ -55,9 +48,11 @@ export const MarketplacePostOfferView : FC<{}> = props => const getFurniTitle = (item ? LocalizeText(item.isWallItem ? 'wallItem.name.' + item.type : 'roomItem.name.' + item.type) : ''); const getFurniDescription = (item ? LocalizeText(item.isWallItem ? 'wallItem.desc.' + item.type : 'roomItem.desc.' + item.type) : ''); + const getCommission = () => Math.max(Math.ceil(((marketplaceConfiguration.commission * 0.01) * askingPrice)), 1); + const postItem = () => { - if(!item || (askingPrice <= marketplaceConfiguration.minimumPrice)) return; + if(!item || (askingPrice < marketplaceConfiguration.minimumPrice)) return; showConfirm(LocalizeText('inventory.marketplace.confirm_offer.info', [ 'furniname', 'price' ], [ getFurniTitle, askingPrice.toString() ]), () => { @@ -99,7 +94,7 @@ export const MarketplacePostOfferView : FC<{}> = props => } { (!((askingPrice < marketplaceConfiguration.minimumPrice) || (askingPrice > marketplaceConfiguration.maximumPrice) || isNaN(askingPrice))) && - { LocalizeText('inventory.marketplace.make_offer.final_price', [ 'commission', 'finalprice' ], [ marketplaceConfiguration.commission.toString(), (askingPrice + marketplaceConfiguration.commission).toString() ]) } + { LocalizeText('inventory.marketplace.make_offer.final_price', [ 'commission', 'finalprice' ], [ getCommission().toString(), (askingPrice + getCommission()).toString() ]) } }
    - - - } - { openRooms && openRooms.map(roomId => - { - return handleClick('close_room', roomId.toString()) } />; - }) - } - { openRoomChatlogs && openRoomChatlogs.map(roomId => - { - return handleClick('close_room_chatlog', roomId.toString()) } />; - }) - } - { openUserInfo && openUserInfo.map(userId => - { - return handleClick('close_user_info', userId.toString()) }/> - }) - } - { openUserChatlogs && openUserChatlogs.map(userId => - { - return handleClick('close_user_chatlog', userId.toString()) }/> - }) - } + { (openRooms.length > 0) && openRooms.map(roomId => CreateLinkEvent(`mod-tools/close-room-info/${ roomId }`) } />) } + { (openRoomChatlogs.length > 0) && openRoomChatlogs.map(roomId => CreateLinkEvent(`mod-tools/close-room-chatlog/${ roomId }`) } />) } + { (openUserInfos.length > 0) && openUserInfos.map(userId => CreateLinkEvent(`mod-tools/close-user-info/${ userId }`) }/>) } + { (openUserChatlogs.length > 0) && openUserChatlogs.map(userId => CreateLinkEvent(`mod-tools/close-user-chatlog/${ userId }`) }/>) } { isTicketsVisible && setIsTicketsVisible(false) } /> } - + ); } diff --git a/src/components/mod-tools/common/GetCFHCategories.ts b/src/components/mod-tools/common/GetCFHCategories.ts deleted file mode 100644 index a9e8a57f..00000000 --- a/src/components/mod-tools/common/GetCFHCategories.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CallForHelpCategoryData } from '@nitrots/nitro-renderer'; - -let cfhCategories: CallForHelpCategoryData[] = []; - -export const SetCfhCategories = (categories: CallForHelpCategoryData[]) => (cfhCategories = categories); - -export const GetCfhCategories = () => cfhCategories; diff --git a/src/components/mod-tools/common/ModActionDefinition.ts b/src/components/mod-tools/common/ModActionDefinition.ts deleted file mode 100644 index b8318afa..00000000 --- a/src/components/mod-tools/common/ModActionDefinition.ts +++ /dev/null @@ -1,49 +0,0 @@ -export class ModActionDefinition -{ - public static ALERT:number = 1; - public static MUTE:number = 2; - public static BAN:number = 3; - public static KICK:number = 4; - public static TRADE_LOCK:number = 5; - public static MESSAGE:number = 6; - - private readonly _actionId:number; - private readonly _name:string; - private readonly _actionType:number; - private readonly _sanctionTypeId:number; - private readonly _actionLengthHours:number; - - constructor(actionId:number, actionName:string, actionType:number, sanctionTypeId:number, actionLengthHours:number) - { - this._actionId = actionId; - this._name = actionName; - this._actionType = actionType; - this._sanctionTypeId = sanctionTypeId; - this._actionLengthHours = actionLengthHours; - } - - public get actionId():number - { - return this._actionId; - } - - public get name():string - { - return this._name; - } - - public get actionType():number - { - return this._actionType; - } - - public get sanctionTypeId():number - { - return this._sanctionTypeId; - } - - public get actionLengthHours():number - { - return this._actionLengthHours; - } -} diff --git a/src/components/mod-tools/reducers/ModToolsReducer.tsx b/src/components/mod-tools/reducers/ModToolsReducer.tsx deleted file mode 100644 index b6fcf343..00000000 --- a/src/components/mod-tools/reducers/ModToolsReducer.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { CallForHelpCategoryData, IssueMessageData, ModeratorInitData } from '@nitrots/nitro-renderer'; -import { Reducer } from 'react'; - -export interface IModToolsState -{ - settings: ModeratorInitData; - currentRoomId: number; - openRooms: number[]; - openRoomChatlogs: number[]; - openUserInfo: number[]; - openUserChatlogs: number[]; - tickets: IssueMessageData[] - cfhCategories: CallForHelpCategoryData[]; -} - -export interface IModToolsAction -{ - type: string; - payload: { - settings?: ModeratorInitData; - currentRoomId?: number; - openRooms?: number[]; - openRoomChatlogs?: number[]; - openUserInfo?: number[]; - openUserChatlogs?: number[]; - tickets?: IssueMessageData[]; - cfhCategories?: CallForHelpCategoryData[]; - } -} - -export class ModToolsActions -{ - public static SET_INIT_DATA: string = 'MTA_SET_INIT_DATA'; - public static SET_CURRENT_ROOM_ID: string = 'MTA_SET_CURRENT_ROOM_ID'; - public static SET_OPEN_ROOMS: string = 'MTA_SET_OPEN_ROOMS'; - public static SET_OPEN_USERINFO: string = 'MTA_SET_OPEN_USERINFO'; - public static SET_OPEN_ROOM_CHATLOGS: string = 'MTA_SET_OPEN_CHATLOGS'; - public static SET_OPEN_USER_CHATLOGS: string = 'MTA_SET_OPEN_USER_CHATLOGS'; - public static SET_TICKETS: string = 'MTA_SET_TICKETS'; - public static SET_CFH_CATEGORIES: string = 'MTA_SET_CFH_CATEGORIES'; - public static RESET_STATE: string = 'MTA_RESET_STATE'; -} - -export const initialModTools: IModToolsState = { - settings: null, - currentRoomId: null, - openRooms: null, - openRoomChatlogs: null, - openUserChatlogs: null, - openUserInfo: null, - tickets: null, - cfhCategories: null -}; - -export const ModToolsReducer: Reducer = (state, action) => -{ - switch(action.type) - { - case ModToolsActions.SET_INIT_DATA: { - const settings = (action.payload.settings || state.settings || null); - - return { ...state, settings }; - } - case ModToolsActions.SET_CURRENT_ROOM_ID: { - const currentRoomId = (action.payload.currentRoomId || state.currentRoomId || null); - - return { ...state, currentRoomId }; - } - case ModToolsActions.SET_OPEN_ROOMS: { - const openRooms = (action.payload.openRooms || state.openRooms || null); - - return { ...state, openRooms }; - } - case ModToolsActions.SET_OPEN_USERINFO: { - const openUserInfo = (action.payload.openUserInfo || state.openUserInfo || null); - - return { ...state, openUserInfo }; - } - case ModToolsActions.SET_OPEN_ROOM_CHATLOGS: { - const openRoomChatlogs = (action.payload.openRoomChatlogs || state.openRoomChatlogs || null); - - return { ...state, openRoomChatlogs }; - } - case ModToolsActions.SET_OPEN_USER_CHATLOGS: { - const openUserChatlogs = (action.payload.openUserChatlogs || state.openUserChatlogs || null); - - return { ...state, openUserChatlogs }; - } - case ModToolsActions.SET_TICKETS: { - const tickets = (action.payload.tickets || state.tickets || null); - - return { ...state, tickets }; - } - case ModToolsActions.SET_CFH_CATEGORIES: { - const cfhCategories = (action.payload.cfhCategories || state.cfhCategories || null); - - return { ...state, cfhCategories }; - } - case ModToolsActions.RESET_STATE: { - return { ...initialModTools }; - } - default: - return state; - } -} diff --git a/src/components/mod-tools/views/chatlog/ChatlogView.tsx b/src/components/mod-tools/views/chatlog/ChatlogView.tsx index 114c0da5..58a57c6d 100644 --- a/src/components/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/components/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,10 +1,9 @@ import { ChatRecordData } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, Key, useCallback } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps } from 'react-virtualized'; -import { DispatchUiEvent, TryVisitRoom } from '../../../../api'; +import { CreateLinkEvent, TryVisitRoom } from '../../../../api'; import { Base, Button, Column, Flex, Grid, Text } from '../../../../common'; -import { ModToolsOpenUserInfoEvent } from '../../../../events'; -import { ModToolsOpenRoomInfoEvent } from '../../../../events/mod-tools/ModToolsOpenRoomInfoEvent'; +import { useModTools } from '../../../../hooks'; interface ChatlogViewProps { @@ -14,6 +13,7 @@ interface ChatlogViewProps export const ChatlogView: FC = props => { const { records = null } = props; + const { openRoomInfo = null } = useModTools(); const rowRenderer = (props: ListRowProps) => { @@ -29,7 +29,7 @@ export const ChatlogView: FC = props => > { chatlogEntry.timestamp } - DispatchUiEvent(new ModToolsOpenUserInfoEvent(chatlogEntry.userId)) }>{ chatlogEntry.userName } + CreateLinkEvent(`mod-tools/open-user-info/${ chatlogEntry.userId }`) }>{ chatlogEntry.userName } { chatlogEntry.message } @@ -79,7 +79,7 @@ export const ChatlogView: FC = props => { !isRoomInfo && { chatlogEntry.timestamp } - DispatchUiEvent(new ModToolsOpenUserInfoEvent(chatlogEntry.userId)) }>{ chatlogEntry.userName } + CreateLinkEvent(`mod-tools/open-user-info/${ chatlogEntry.userId }`) }>{ chatlogEntry.userName } { chatlogEntry.message } } @@ -109,7 +109,7 @@ export const ChatlogView: FC = props => - + ); diff --git a/src/components/mod-tools/views/room/ModToolsChatlogView.tsx b/src/components/mod-tools/views/room/ModToolsChatlogView.tsx index e85528a9..f9ea05e1 100644 --- a/src/components/mod-tools/views/room/ModToolsChatlogView.tsx +++ b/src/components/mod-tools/views/room/ModToolsChatlogView.tsx @@ -1,5 +1,5 @@ import { ChatRecordData, GetRoomChatlogMessageComposer, RoomChatlogEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../api'; import { DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useMessageEvent } from '../../../../hooks'; @@ -16,16 +16,14 @@ export const ModToolsChatlogView: FC = props => const { roomId = null, onCloseClick = null } = props; const [ roomChatlog, setRoomChatlog ] = useState(null); - const onModtoolRoomChatlogEvent = useCallback((event: RoomChatlogEvent) => + useMessageEvent(RoomChatlogEvent, event => { const parser = event.getParser(); if(!parser || parser.data.roomId !== roomId) return; setRoomChatlog(parser.data); - }, [ roomId ]); - - useMessageEvent(RoomChatlogEvent, onModtoolRoomChatlogEvent); + }); useEffect(() => { diff --git a/src/components/mod-tools/views/room/ModToolsRoomView.tsx b/src/components/mod-tools/views/room/ModToolsRoomView.tsx index d7b6e607..f5c86dc2 100644 --- a/src/components/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/components/mod-tools/views/room/ModToolsRoomView.tsx @@ -1,8 +1,7 @@ import { GetModeratorRoomInfoMessageComposer, ModerateRoomMessageComposer, ModeratorActionMessageComposer, ModeratorRoomInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { DispatchUiEvent, SendMessageComposer, TryVisitRoom } from '../../../../api'; +import { FC, useEffect, useState } from 'react'; +import { CreateLinkEvent, SendMessageComposer, TryVisitRoom } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { ModToolsOpenRoomChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; import { useMessageEvent } from '../../../../hooks'; interface ModToolsRoomViewProps @@ -14,39 +13,19 @@ interface ModToolsRoomViewProps export const ModToolsRoomView: FC = props => { const { roomId = null, onCloseClick = null } = props; - const [ infoRequested, setInfoRequested ] = useState(false); const [ loadedRoomId, setLoadedRoomId ] = useState(null); - const [ name, setName ] = useState(null); const [ ownerId, setOwnerId ] = useState(null); const [ ownerName, setOwnerName ] = useState(null); const [ ownerInRoom, setOwnerInRoom ] = useState(false); const [ usersInRoom, setUsersInRoom ] = useState(0); - - //form data const [ kickUsers, setKickUsers ] = useState(false); const [ lockRoom, setLockRoom ] = useState(false); const [ changeRoomName, setChangeRoomName ] = useState(false); const [ message, setMessage ] = useState(''); - const onModtoolRoomInfoEvent = useCallback((event: ModeratorRoomInfoEvent) => - { - const parser = event.getParser(); - - if(!parser || parser.data.flatId !== roomId) return; - - setLoadedRoomId(parser.data.flatId); - setName(parser.data.room.name); - setOwnerId(parser.data.ownerId); - setOwnerName(parser.data.ownerName); - setOwnerInRoom(parser.data.ownerInRoom); - setUsersInRoom(parser.data.userCount); - }, [ roomId ]); - - useMessageEvent(ModeratorRoomInfoEvent, onModtoolRoomInfoEvent); - - const handleClick = useCallback((action: string, value?: string) => + const handleClick = (action: string, value?: string) => { if(!action) return; @@ -65,7 +44,21 @@ export const ModToolsRoomView: FC = props => SendMessageComposer(new ModerateRoomMessageComposer(roomId, lockRoom ? 1 : 0, changeRoomName ? 1 : 0, kickUsers ? 1 : 0)); return; } - }, [ changeRoomName, kickUsers, lockRoom, message, roomId ]); + } + + useMessageEvent(ModeratorRoomInfoEvent, event => + { + const parser = event.getParser(); + + if(!parser || parser.data.flatId !== roomId) return; + + setLoadedRoomId(parser.data.flatId); + setName(parser.data.room.name); + setOwnerId(parser.data.ownerId); + setOwnerName(parser.data.ownerName); + setOwnerInRoom(parser.data.ownerInRoom); + setUsersInRoom(parser.data.userCount); + }); useEffect(() => { @@ -96,7 +89,7 @@ export const ModToolsRoomView: FC = props => - + diff --git a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx index 0409f059..c8bdd7b1 100644 --- a/src/components/mod-tools/views/tickets/CfhChatlogView.tsx +++ b/src/components/mod-tools/views/tickets/CfhChatlogView.tsx @@ -1,5 +1,5 @@ import { CfhChatlogData, CfhChatlogEvent, GetCfhChatlogMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useMessageEvent } from '../../../../hooks'; @@ -16,22 +16,20 @@ export const CfhChatlogView: FC = props => const { onCloseClick = null, issueId = null } = props; const [ chatlogData, setChatlogData ] = useState(null); + useMessageEvent(CfhChatlogEvent, event => + { + const parser = event.getParser(); + + if(!parser || parser.data.issueId !== issueId) return; + + setChatlogData(parser.data); + }); + useEffect(() => { SendMessageComposer(new GetCfhChatlogMessageComposer(issueId)); }, [ issueId ]); - const onCfhChatlogEvent = useCallback((event: CfhChatlogEvent) => - { - const parser = event.getParser(); - - if(!parser || parser.data.issueId !== issueId) return; - - setChatlogData(parser.data); - }, [ issueId ]); - - useMessageEvent(CfhChatlogEvent, onCfhChatlogEvent); - return ( diff --git a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx b/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx index 21dfbd13..1179d417 100644 --- a/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsIssueInfoView.tsx @@ -1,10 +1,8 @@ import { CloseIssuesMessageComposer, ReleaseIssuesMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useMemo, useState } from 'react'; -import { DispatchUiEvent, LocalizeText, SendMessageComposer } from '../../../../api'; +import { FC, useState } from 'react'; +import { GetIssueCategoryName, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { ModToolsOpenUserInfoEvent } from '../../../../events'; -import { getSourceName } from '../../common/IssueCategoryNames'; -import { useModToolsContext } from '../../ModToolsContext'; +import { useModTools } from '../../../../hooks'; import { CfhChatlogView } from './CfhChatlogView'; interface IssueInfoViewProps @@ -16,16 +14,9 @@ interface IssueInfoViewProps export const ModToolsIssueInfoView: FC = props => { const { issueId = null, onIssueInfoClosed = null } = props; - const { modToolsState = null } = useModToolsContext(); - const { tickets = null } = modToolsState; const [ cfhChatlogOpen, setcfhChatlogOpen ] = useState(false); - - const ticket = useMemo(() => - { - if(!tickets || !tickets.length) return null; - - return tickets.find(issue => issue.issueId === issueId); - }, [ issueId, tickets ]); + const { tickets = [], openUserInfo = null } = useModTools(); + const ticket = tickets.find(issue => (issue.issueId === issueId)); const releaseIssue = (issueId: number) => { @@ -40,8 +31,6 @@ export const ModToolsIssueInfoView: FC = props => onIssueInfoClosed(issueId) } - - const openUserInfo = (userId: number) => DispatchUiEvent(new ModToolsOpenUserInfoEvent(userId)); return ( <> @@ -55,7 +44,7 @@ export const ModToolsIssueInfoView: FC = props => Source - { getSourceName(ticket.categoryId) } + { GetIssueCategoryName(ticket.categoryId) } Category diff --git a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx index 2db159b8..2e1827a4 100644 --- a/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsMyIssuesTabView.tsx @@ -6,14 +6,12 @@ import { Base, Button, Column, Grid } from '../../../../common'; interface ModToolsMyIssuesTabViewProps { myIssues: IssueMessageData[]; - onIssueHandleClick(issueId: number): void; + handleIssue: (issueId: number) => void; } export const ModToolsMyIssuesTabView: FC = props => { - const { myIssues = null, onIssueHandleClick = null } = props; - - const onReleaseIssue = (issueId: number) => SendMessageComposer(new ReleaseIssuesMessageComposer([ issueId ])); + const { myIssues = null, handleIssue = null } = props; return ( @@ -35,10 +33,10 @@ export const ModToolsMyIssuesTabView: FC = props = { issue.reportedUserName } { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - + - + ); diff --git a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx index c328025b..6ee23cd5 100644 --- a/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx @@ -12,8 +12,6 @@ export const ModToolsOpenIssuesTabView: FC = pro { const { openIssues = null } = props; - const onPickIssue = (issueId: number) => SendMessageComposer(new PickIssuesMessageComposer([ issueId ], false, 0, 'pick issue button')); - return ( @@ -33,7 +31,7 @@ export const ModToolsOpenIssuesTabView: FC = pro { issue.reportedUserName } { new Date(Date.now() - issue.issueAgeInMilliseconds).toLocaleTimeString() } - + ); diff --git a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx index b7c00967..d6597dad 100644 --- a/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/components/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -1,8 +1,8 @@ import { IssueMessageData } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useMemo, useState } from 'react'; +import { FC, useState } from 'react'; import { GetSessionDataManager } from '../../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../common'; -import { useModToolsContext } from '../../ModToolsContext'; +import { useModTools } from '../../../../hooks'; import { ModToolsIssueInfoView } from './ModToolsIssueInfoView'; import { ModToolsMyIssuesTabView } from './ModToolsMyIssuesTabView'; import { ModToolsOpenIssuesTabView } from './ModToolsOpenIssuesTabView'; @@ -22,67 +22,52 @@ const TABS: string[] = [ export const ModToolsTicketsView: FC = props => { const { onCloseClick = null } = props; - const { modToolsState = null } = useModToolsContext(); - const { tickets= null } = modToolsState; const [ currentTab, setCurrentTab ] = useState(0); const [ issueInfoWindows, setIssueInfoWindows ] = useState([]); + const { tickets = [] } = useModTools(); - const openIssues = useMemo(() => + const openIssues = tickets.filter(issue => issue.state === IssueMessageData.STATE_OPEN); + const myIssues = tickets.filter(issue => (issue.state === IssueMessageData.STATE_PICKED) && (issue.pickerUserId === GetSessionDataManager().userId)); + const pickedIssues = tickets.filter(issue => issue.state === IssueMessageData.STATE_PICKED); + + const closeIssue = (issueId: number) => { - if(!tickets) return []; - - return tickets.filter(issue => issue.state === IssueMessageData.STATE_OPEN); - }, [ tickets ]); - - const myIssues = useMemo(() => - { - if(!tickets) return []; - - return tickets.filter(issue => (issue.state === IssueMessageData.STATE_PICKED) && (issue.pickerUserId === GetSessionDataManager().userId)); - }, [ tickets ]); - - const pickedIssues = useMemo(() => - { - if(!tickets) return []; - - return tickets.filter(issue => issue.state === IssueMessageData.STATE_PICKED); - }, [ tickets ]); - - const onIssueInfoClosed = useCallback((issueId: number) => - { - const indexOfValue = issueInfoWindows.indexOf(issueId); - - if(indexOfValue === -1) return; - - const newValues = Array.from(issueInfoWindows); - newValues.splice(indexOfValue, 1); - setIssueInfoWindows(newValues); - }, [ issueInfoWindows ]); - - const onIssueHandleClicked = useCallback((issueId: number) => - { - if(issueInfoWindows.indexOf(issueId) === -1) + setIssueInfoWindows(prevValue => { - const newValues = Array.from(issueInfoWindows); - newValues.push(issueId); - setIssueInfoWindows(newValues); - } - else - { - onIssueInfoClosed(issueId); - } - }, [ issueInfoWindows, onIssueInfoClosed ]); + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(issueId); - const CurrentTabComponent = useCallback(() => + if(existingIndex >= 0) newValue.splice(existingIndex, 1); + + return newValue; + }); + } + + const handleIssue = (issueId: number) => + { + setIssueInfoWindows(prevValue => + { + const newValue = [ ...prevValue ]; + const existingIndex = newValue.indexOf(issueId); + + if(existingIndex === -1) newValue.push(issueId); + else newValue.splice(existingIndex, 1); + + return newValue; + }) + } + + const CurrentTabComponent = () => { switch(currentTab) { case 0: return ; - case 1: return ; + case 1: return ; case 2: return ; - default: return null; } - }, [ currentTab, myIssues, onIssueHandleClicked, openIssues, pickedIssues ]); + + return null; + } return ( <> @@ -100,7 +85,7 @@ export const ModToolsTicketsView: FC = props => - { issueInfoWindows && (issueInfoWindows.length > 0) && issueInfoWindows.map(issueId => ) } + { issueInfoWindows && (issueInfoWindows.length > 0) && issueInfoWindows.map(issueId => ) } ); } diff --git a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx index f2ab66eb..7bfb2e10 100644 --- a/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserChatlogView.tsx @@ -1,5 +1,5 @@ import { ChatRecordData, GetUserChatlogMessageComposer, UserChatlogEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { SendMessageComposer } from '../../../../api'; import { DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; import { useMessageEvent } from '../../../../hooks'; @@ -16,8 +16,8 @@ export const ModToolsUserChatlogView: FC = props = const { userId = null, onCloseClick = null } = props; const [ userChatlog, setUserChatlog ] = useState(null); const [ username, setUsername ] = useState(null); - - const onModtoolUserChatlogEvent = useCallback((event: UserChatlogEvent) => + + useMessageEvent(UserChatlogEvent, event => { const parser = event.getParser(); @@ -25,9 +25,7 @@ export const ModToolsUserChatlogView: FC = props = setUsername(parser.data.username); setUserChatlog(parser.data.roomChatlogs); - }, [ userId ]); - - useMessageEvent(UserChatlogEvent, onModtoolUserChatlogEvent); + }); useEffect(() => { diff --git a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx b/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx index b8235709..bd4c2d5d 100644 --- a/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserModActionView.tsx @@ -1,11 +1,8 @@ import { CallForHelpTopicData, DefaultSanctionMessageComposer, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModTradingLockMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useMemo, useState } from 'react'; -import { LocalizeText, NotificationAlertType, SendMessageComposer } from '../../../../api'; +import { ISelectedUser, LocalizeText, ModActionDefinition, NotificationAlertType, SendMessageComposer } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Flex, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; -import { useNotification } from '../../../../hooks'; -import { ISelectedUser } from '../../common/ISelectedUser'; -import { ModActionDefinition } from '../../common/ModActionDefinition'; -import { useModToolsContext } from '../../ModToolsContext'; +import { useModTools, useNotification } from '../../../../hooks'; interface ModToolsUserModActionViewProps { @@ -34,8 +31,7 @@ export const ModToolsUserModActionView: FC = pro const [ selectedTopic, setSelectedTopic ] = useState(-1); const [ selectedAction, setSelectedAction ] = useState(-1); const [ message, setMessage ] = useState(''); - const { modToolsState = null } = useModToolsContext(); - const { cfhCategories = null, settings = null } = modToolsState; + const { cfhCategories = null, settings = null } = useModTools(); const { simpleAlert = null } = useNotification(); const topics = useMemo(() => @@ -53,19 +49,22 @@ export const ModToolsUserModActionView: FC = pro return values; }, [ cfhCategories ]); - const sendAlert = (message: string) => - { - simpleAlert(message, NotificationAlertType.DEFAULT, null, null, 'Error'); - } + const sendAlert = (message: string) => simpleAlert(message, NotificationAlertType.DEFAULT, null, null, 'Error'); const sendDefaultSanction = () => { let errorMessage: string = null; + const category = topics[selectedTopic]; + if(selectedTopic === -1) errorMessage = 'You must select a CFH topic'; + if(errorMessage) return sendAlert(errorMessage); + const messageOrDefault = (message.trim().length === 0) ? LocalizeText(`help.cfh.topic.${ category.id }`) : message; + SendMessageComposer(new DefaultSanctionMessageComposer(user.userId, selectedTopic, messageOrDefault)); + onCloseClick(); } diff --git a/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx b/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx index e53c3997..f3d9ac80 100644 --- a/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserRoomVisitsView.tsx @@ -1,5 +1,5 @@ import { GetRoomVisitsMessageComposer, RoomVisitsData, RoomVisitsEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { AutoSizer, List, ListRowProps } from 'react-virtualized'; import { SendMessageComposer, TryVisitRoom } from '../../../../api'; import { Base, Column, DraggableWindowPosition, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; @@ -16,16 +16,21 @@ export const ModToolsUserRoomVisitsView: FC = p const { userId = null, onCloseClick = null } = props; const [ roomVisitData, setRoomVisitData ] = useState(null); - const onModtoolReceivedRoomsUserEvent = useCallback((event: RoomVisitsEvent) => + useMessageEvent(RoomVisitsEvent, event => { const parser = event.getParser(); - if(!parser || (parser.data.userId !== userId)) return; + if(parser.data.userId !== userId) return; setRoomVisitData(parser.data); + }); + + useEffect(() => + { + SendMessageComposer(new GetRoomVisitsMessageComposer(userId)); }, [ userId ]); - useMessageEvent(RoomVisitsEvent, onModtoolReceivedRoomsUserEvent); + if(!userId) return null; const RowRenderer = (props: ListRowProps) => { @@ -40,13 +45,6 @@ export const ModToolsUserRoomVisitsView: FC = p ); } - useEffect(() => - { - SendMessageComposer(new GetRoomVisitsMessageComposer(userId)); - }, [ userId ]); - - if(!userId) return null; - return ( diff --git a/src/components/mod-tools/views/user/ModToolsUserSendMessageView.tsx b/src/components/mod-tools/views/user/ModToolsUserSendMessageView.tsx index 8f2b8dea..963b5820 100644 --- a/src/components/mod-tools/views/user/ModToolsUserSendMessageView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserSendMessageView.tsx @@ -1,9 +1,8 @@ import { ModMessageMessageComposer } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useState } from 'react'; -import { SendMessageComposer } from '../../../../api'; +import { FC, useState } from 'react'; +import { ISelectedUser, SendMessageComposer } from '../../../../api'; import { Button, DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../../common'; import { useNotification } from '../../../../hooks'; -import { ISelectedUser } from '../../common/ISelectedUser'; interface ModToolsUserSendMessageViewProps { @@ -17,7 +16,9 @@ export const ModToolsUserSendMessageView: FC = const [ message, setMessage ] = useState(''); const { simpleAlert = null } = useNotification(); - const sendMessage = useCallback(() => + if(!user) return null; + + const sendMessage = () => { if(message.trim().length === 0) { @@ -29,9 +30,7 @@ export const ModToolsUserSendMessageView: FC = SendMessageComposer(new ModMessageMessageComposer(user.userId, message, -999)); onCloseClick(); - }, [ message, user, onCloseClick, simpleAlert ]); - - if(!user) return null; + } return ( diff --git a/src/components/mod-tools/views/user/ModToolsUserView.tsx b/src/components/mod-tools/views/user/ModToolsUserView.tsx index c4d82ba1..4454a0c9 100644 --- a/src/components/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/components/mod-tools/views/user/ModToolsUserView.tsx @@ -1,8 +1,7 @@ import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { DispatchUiEvent, LocalizeText, SendMessageComposer } from '../../../../api'; +import { FC, useEffect, useMemo, useState } from 'react'; +import { CreateLinkEvent, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, DraggableWindowPosition, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../common'; -import { ModToolsOpenUserChatlogEvent } from '../../../../events'; import { useMessageEvent } from '../../../../hooks'; import { ModToolsUserModActionView } from './ModToolsUserModActionView'; import { ModToolsUserRoomVisitsView } from './ModToolsUserRoomVisitsView'; @@ -22,17 +21,6 @@ export const ModToolsUserView: FC = props => const [ modActionVisible, setModActionVisible ] = useState(false); const [ roomVisitsVisible, setRoomVisitsVisible ] = useState(false); - const onModtoolUserInfoEvent = useCallback((event: ModeratorUserInfoEvent) => - { - const parser = event.getParser(); - - if(!parser || parser.data.userId !== userId) return; - - setUserInfo(parser.data); - }, [ userId ]); - - useMessageEvent(ModeratorUserInfoEvent, onModtoolUserInfoEvent); - const userProperties = useMemo(() => { if(!userInfo) return null; @@ -98,6 +86,15 @@ export const ModToolsUserView: FC = props => ]; }, [ userInfo ]); + useMessageEvent(ModeratorUserInfoEvent, event => + { + const parser = event.getParser(); + + if(!parser || parser.data.userId !== userId) return; + + setUserInfo(parser.data); + }); + useEffect(() => { SendMessageComposer(new GetModeratorUserInfoMessageComposer(userId)); @@ -132,7 +129,7 @@ export const ModToolsUserView: FC = props => -
    - { !isEditing ?
    setIsEditing(true) }>{ text }
    : } + { (!isEditing || !canModify) ?
    (canModify && setIsEditing(true)) }>{ text }
    : }
    From 474f8944e2edea1f57439d62dd5d31d9c4f66a69 Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 30 Jul 2022 23:16:35 -0400 Subject: [PATCH 317/331] Add FurnitureSpamWallPostItWidget / :multi --- .../furniture/FurnitureSpamWallPostItView.tsx | 46 +++++++++++++++ .../furniture/FurnitureWidgetsView.tsx | 4 +- src/hooks/inventory/useInventoryFurni.ts | 30 +++++++++- src/hooks/rooms/widgets/furniture/index.ts | 1 + .../useFurnitureSpamWallPostItWidget.ts | 59 +++++++++++++++++++ 5 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/components/room/widgets/furniture/FurnitureSpamWallPostItView.tsx create mode 100644 src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts diff --git a/src/components/room/widgets/furniture/FurnitureSpamWallPostItView.tsx b/src/components/room/widgets/furniture/FurnitureSpamWallPostItView.tsx new file mode 100644 index 00000000..c093d462 --- /dev/null +++ b/src/components/room/widgets/furniture/FurnitureSpamWallPostItView.tsx @@ -0,0 +1,46 @@ +import { FC } from 'react'; +import { ColorUtils } from '../../../../api'; +import { DraggableWindow, DraggableWindowPosition } from '../../../../common'; +import { useFurnitureSpamWallPostItWidget } from '../../../../hooks'; + +const STICKIE_COLORS = [ '9CCEFF','FF9CFF', '9CFF9C','FFFF33' ]; +const STICKIE_COLOR_NAMES = [ 'blue', 'pink', 'green', 'yellow' ]; + +const getStickieColorName = (color: string) => +{ + let index = STICKIE_COLORS.indexOf(color); + + if(index === -1) index = 0; + + return STICKIE_COLOR_NAMES[index]; +} + +export const FurnitureSpamWallPostItView: FC<{}> = props => +{ + const { objectId = -1, color = '0', setColor = null, text = '', setText = null, canModify = false, onClose = null } = useFurnitureSpamWallPostItWidget(); + + if(objectId === -1) return null; + + return ( + +
    +
    +
    + { canModify && + <> +
    + { STICKIE_COLORS.map(color => + { + return
    setColor(color) } style={ { backgroundColor: ColorUtils.makeColorHex(color) } } /> + }) } + } +
    +
    +
    +
    + +
    +
    + + ); +} diff --git a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx index 7850e936..207d934a 100644 --- a/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/components/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -12,6 +12,7 @@ import { FurnitureHighScoreView } from './FurnitureHighScoreView'; import { FurnitureInternalLinkView } from './FurnitureInternalLinkView'; import { FurnitureMannequinView } from './FurnitureMannequinView'; import { FurnitureRoomLinkView } from './FurnitureRoomLinkView'; +import { FurnitureSpamWallPostItView } from './FurnitureSpamWallPostItView'; import { FurnitureStackHeightView } from './FurnitureStackHeightView'; import { FurnitureStickieView } from './FurnitureStickieView'; import { FurnitureTrophyView } from './FurnitureTrophyView'; @@ -23,7 +24,6 @@ export const FurnitureWidgetsView: FC<{}> = props => - @@ -33,6 +33,8 @@ export const FurnitureWidgetsView: FC<{}> = props => + + diff --git a/src/hooks/inventory/useInventoryFurni.ts b/src/hooks/inventory/useInventoryFurni.ts index 15b2d0a4..47b1e989 100644 --- a/src/hooks/inventory/useInventoryFurni.ts +++ b/src/hooks/inventory/useInventoryFurni.ts @@ -17,6 +17,34 @@ const useInventoryFurniState = () => const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility(); const { isUnseen = null, resetCategory = null } = useInventoryUnseenTracker(); + const getWallItemById = (id: number) => + { + if(!groupItems || !groupItems.length) return; + + for(const groupItem of groupItems) + { + const item = groupItem.getItemById(id); + + if(item && item.isWallItem) return groupItem; + } + + return null; + } + + const getFloorItemById = (id: number) => + { + if(!groupItems || !groupItems.length) return; + + for(const groupItem of groupItems) + { + const item = groupItem.getItemById(id); + + if(item && !item.isWallItem) return groupItem; + } + + return null; + } + useMessageEvent(FurnitureListAddOrUpdateEvent, event => { const parser = event.getParser(); @@ -257,7 +285,7 @@ const useInventoryFurniState = () => setNeedsUpdate(false); }, [ isVisible, needsUpdate ]); - return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate }; + return { isVisible, groupItems, setGroupItems, selectedItem, setSelectedItem, activate, deactivate, getWallItemById, getFloorItemById }; } export const useInventoryFurni = () => useBetween(useInventoryFurniState); diff --git a/src/hooks/rooms/widgets/furniture/index.ts b/src/hooks/rooms/widgets/furniture/index.ts index ddc0a2fb..58a31058 100644 --- a/src/hooks/rooms/widgets/furniture/index.ts +++ b/src/hooks/rooms/widgets/furniture/index.ts @@ -10,6 +10,7 @@ export * from './useFurnitureInternalLinkWidget'; export * from './useFurnitureMannequinWidget'; export * from './useFurniturePresentWidget'; export * from './useFurnitureRoomLinkWidget'; +export * from './useFurnitureSpamWallPostItWidget'; export * from './useFurnitureStackHeightWidget'; export * from './useFurnitureStickieWidget'; export * from './useFurnitureTrophyWidget'; diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts new file mode 100644 index 00000000..64f89b0b --- /dev/null +++ b/src/hooks/rooms/widgets/furniture/useFurnitureSpamWallPostItWidget.ts @@ -0,0 +1,59 @@ +import { AddSpamWallPostItMessageComposer, RequestSpamWallPostItMessageEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { useState } from 'react'; +import { GetRoomEngine, SendMessageComposer } from '../../../../api'; +import { useMessageEvent } from '../../../events'; +import { useInventoryFurni } from '../../../inventory'; + +const useFurnitureSpamWallPostItWidgetState = () => +{ + const [ objectId, setObjectId ] = useState(-1); + const [ category, setCategory ] = useState(-1); + const [ itemType, setItemType ] = useState(''); + const [ location, setLocation ] = useState(''); + const [ color, setColor ] = useState('0'); + const [ text, setText ] = useState(''); + const [ canModify, setCanModify ] = useState(false); + const { getWallItemById = null } = useInventoryFurni(); + + const onClose = () => + { + SendMessageComposer(new AddSpamWallPostItMessageComposer(objectId, location, color, text)); + + setObjectId(-1); + setCategory(-1); + setItemType(''); + setLocation(''); + setColor('0'); + setText(''); + setCanModify(false); + } + + useMessageEvent(RequestSpamWallPostItMessageEvent, event => + { + const parser = event.getParser(); + + setObjectId(parser.itemId); + setCategory(RoomObjectCategory.WALL); + + const inventoryItem = getWallItemById(parser.itemId); + + let itemType = 'post_it'; + + if(inventoryItem) + { + const wallItemType = GetRoomEngine().getFurnitureWallName(inventoryItem.type); + + if(wallItemType.match('post_it_')) itemType = wallItemType; + } + + setItemType(itemType); + setLocation(parser.location); + setColor('FFFF33'); + setText(''); + setCanModify(true); + }); + + return { objectId, color, setColor, text, setText, canModify, onClose }; +} + +export const useFurnitureSpamWallPostItWidget = useFurnitureSpamWallPostItWidgetState; From 9af557cb3f308dfc80b2f621834178bee9eb34dd Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 1 Aug 2022 12:05:00 -0400 Subject: [PATCH 318/331] Fix room settings --- .../room-settings/NavigatorRoomSettingsModTabView.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx b/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx index 2bf48c2a..fb71db16 100644 --- a/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx +++ b/src/components/navigator/views/room-settings/NavigatorRoomSettingsModTabView.tsx @@ -1,4 +1,4 @@ -import { BannedUserData, BannedUsersFromRoomEvent, RoomBannedUsersComposer, RoomUnbanUserComposer } from '@nitrots/nitro-renderer'; +import { BannedUserData, BannedUsersFromRoomEvent, RoomBannedUsersComposer, RoomModerationSettings, RoomUnbanUserComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { IRoomData, LocalizeText, SendMessageComposer } from '../../../../api'; import { Button, Column, Flex, Grid, Text, UserProfileIconView } from '../../../../common'; @@ -73,25 +73,25 @@ export const NavigatorRoomSettingsModTabView: FC { LocalizeText('navigator.roomsettings.moderation.mute.header') } - handleChange('moderation_mute', (event.target.checked ? 1 : 0)) } /> + handleChange('moderation_mute', (event.target.checked ? RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS : RoomModerationSettings.MODERATION_LEVEL_NONE)) } /> { LocalizeText('navigator.roomsettings.moderation.rights') } { LocalizeText('navigator.roomsettings.moderation.kick.header') } - handleChange('moderation_kick', (event.target.checked ? 0 : 2)) } /> + handleChange('moderation_kick', (event.target.checked ? RoomModerationSettings.MODERATION_LEVEL_ALL : RoomModerationSettings.MODERATION_LEVEL_NONE)) } /> { LocalizeText('navigator.roomsettings.moderation.all') } - handleChange('moderation_kick', (event.target.checked ? 1 : 2)) } /> + = RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS) } disabled={ (roomData.moderationSettings.allowKick === RoomModerationSettings.MODERATION_LEVEL_ALL) } onChange={ event => handleChange('moderation_kick', (event.target.checked ? RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS : RoomModerationSettings.MODERATION_LEVEL_NONE)) } /> { LocalizeText('navigator.roomsettings.moderation.rights') } { LocalizeText('navigator.roomsettings.moderation.ban.header') } - handleChange('moderation_ban', (event.target.checked ? 1 : 0)) } /> + handleChange('moderation_ban', (event.target.checked ? RoomModerationSettings.MODERATION_LEVEL_USER_WITH_RIGHTS : RoomModerationSettings.MODERATION_LEVEL_NONE)) } /> { LocalizeText('navigator.roomsettings.moderation.rights') } From b21fce3e069ea3e9240912b75e57d6ae9b2e2b74 Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 1 Aug 2022 12:11:59 -0400 Subject: [PATCH 319/331] Bump renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index adaedcfb..d2e465bb 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.2.0", - "@nitrots/nitro-renderer": "^1.3.2", + "@nitrots/nitro-renderer": "^1.3.3", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index ea4ef0a3..fc65f560 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1484,10 +1484,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.3.2.tgz#005f6c3c30fa274efed1d17d8a063d8b36e3234a" - integrity sha512-gJB5JyZptOW0AQzQW7JDmvpa2GeWe5GYUyefu/HKvCJtGiuf8LZHWbvWs45ssYWGZgKMrXyn8AFHZJRSkcOBsQ== +"@nitrots/nitro-renderer@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.3.3.tgz#47bff70bed966f95d8bc4abb946618bfeff9f9ba" + integrity sha512-Sx/9X/TRMLEl4eHls8zcdVkYxlixsLkn0PfVwt75jwx3aFNS39RpFs3SQ6+W6ONw0iVZWwucpf5TDHr7a/Ds8g== dependencies: "@pixi/app" "~6.4.2" "@pixi/basis" "~6.4.2" From 5d48efff3e5724b4e4272d31930c86031da3d7a8 Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 1 Aug 2022 12:17:05 -0400 Subject: [PATCH 320/331] Save dismissed friend requests from room to room --- src/hooks/friends/useFriends.ts | 3 ++- src/hooks/rooms/widgets/useFriendRequestWidget.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts index 35d72c5d..d14a9553 100644 --- a/src/hooks/friends/useFriends.ts +++ b/src/hooks/friends/useFriends.ts @@ -9,6 +9,7 @@ const useFriendsState = () => const [ friends, setFriends ] = useState([]); const [ requests, setRequests ] = useState([]); const [ sentRequests, setSentRequests ] = useState([]); + const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); const [ settings, setSettings ] = useState(null); const onlineFriends = useMemo(() => @@ -257,7 +258,7 @@ const useFriendsState = () => } }, []); - return { friends, requests, sentRequests, settings, onlineFriends, offlineFriends, getFriend, canRequestFriend, requestFriend, requestResponse, followFriend, updateRelationship }; + return { friends, requests, sentRequests, dismissedRequestIds, setDismissedRequestIds, settings, onlineFriends, offlineFriends, getFriend, canRequestFriend, requestFriend, requestResponse, followFriend, updateRelationship }; } export const useFriends = () => useBetween(useFriendsState); diff --git a/src/hooks/rooms/widgets/useFriendRequestWidget.ts b/src/hooks/rooms/widgets/useFriendRequestWidget.ts index 548cfb74..82bf6a25 100644 --- a/src/hooks/rooms/widgets/useFriendRequestWidget.ts +++ b/src/hooks/rooms/widgets/useFriendRequestWidget.ts @@ -7,8 +7,7 @@ import { useUserAddedEvent, useUserRemovedEvent } from '../engine'; const useFriendRequestWidgetState = () => { const [ activeRequests, setActiveRequests ] = useState<{ roomIndex: number, request: MessengerRequest }[]>([]); - const [ dismissedRequestIds, setDismissedRequestIds ] = useState([]); - const { requests = [] } = useFriends(); + const { requests = [], dismissedRequestIds = [], setDismissedRequestIds = null } = useFriends(); const displayedRequests = useMemo(() => activeRequests.filter(request => (dismissedRequestIds.indexOf(request.request.requesterUserId) === -1)), [ activeRequests, dismissedRequestIds ]); From 23163a8791bedd9962bcecb9fcadf54740045b3f Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 1 Aug 2022 13:26:16 -0400 Subject: [PATCH 321/331] Marketplace LTD fix --- .../layout/marketplace/CatalogLayoutMarketplaceItemView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index d5441fbd..44d1489e 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -50,7 +50,7 @@ export const CatalogLayoutMarketplaceItemView: FC = pr return ( - + { getMarketplaceOfferTitle } From 2cb2e59d0164c7b289e02d50a0de1d0708e0c398 Mon Sep 17 00:00:00 2001 From: Bill Date: Mon, 1 Aug 2022 13:29:38 -0400 Subject: [PATCH 322/331] Don't show friend request button for yourself --- src/hooks/friends/useFriends.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hooks/friends/useFriends.ts b/src/hooks/friends/useFriends.ts index d14a9553..05437b2a 100644 --- a/src/hooks/friends/useFriends.ts +++ b/src/hooks/friends/useFriends.ts @@ -1,7 +1,7 @@ import { AcceptFriendMessageComposer, DeclineFriendMessageComposer, FollowFriendMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendParser, FriendRequestsEvent, GetFriendRequestsComposer, MessengerInitComposer, MessengerInitEvent, NewFriendRequestEvent, RequestFriendComposer, SetRelationshipStatusComposer } from '@nitrots/nitro-renderer'; import { useEffect, useMemo, useState } from 'react'; import { useBetween } from 'use-between'; -import { CloneObject, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; +import { CloneObject, GetSessionDataManager, MessengerFriend, MessengerRequest, MessengerSettings, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../events'; const useFriendsState = () => @@ -60,6 +60,8 @@ const useFriendsState = () => const canRequestFriend = (userId: number) => { + if(userId === GetSessionDataManager().userId) return false; + if(getFriend(userId)) return false; if(requests.find(request => (request.requesterUserId === userId))) return false; From 5fd0cdd21bfa0ecff8899e1cc096527e19426101 Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 2 Aug 2022 01:16:48 -0400 Subject: [PATCH 323/331] Fix chat clicking --- src/components/room/widgets/chat/ChatWidgetMessageView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/room/widgets/chat/ChatWidgetMessageView.tsx b/src/components/room/widgets/chat/ChatWidgetMessageView.tsx index 98891e94..ef3537ff 100644 --- a/src/components/room/widgets/chat/ChatWidgetMessageView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetMessageView.tsx @@ -1,4 +1,4 @@ -import { RoomChatSettings } from '@nitrots/nitro-renderer'; +import { RoomChatSettings, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useRef, useState } from 'react'; import { ChatBubbleMessage, GetRoomEngine } from '../../../../api'; @@ -69,7 +69,7 @@ export const ChatWidgetMessageView: FC = props => useEffect(() => setIsVisible(chat.visible), [ chat.visible ]); return ( -
    GetRoomEngine().setSelectedAvatar(chat.roomId, chat.senderId) }> +
    GetRoomEngine().selectRoomObject(chat.roomId, chat.senderId, RoomObjectCategory.UNIT) }> { (chat.styleId === 0) &&
    }
    From 9888183ff2f20cf6a93f58b05a65eb759491f079 Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 2 Aug 2022 13:47:59 -0400 Subject: [PATCH 324/331] Fix canvas / background resizing --- src/components/room/RoomColorView.tsx | 135 -------------- src/components/room/RoomView.tsx | 21 +-- src/hooks/rooms/useRoom.ts | 164 +++++++++++++++--- .../furniture/useFurnitureDimmerWidget.ts | 4 +- 4 files changed, 147 insertions(+), 177 deletions(-) delete mode 100644 src/components/room/RoomColorView.tsx diff --git a/src/components/room/RoomColorView.tsx b/src/components/room/RoomColorView.tsx deleted file mode 100644 index 4260571e..00000000 --- a/src/components/room/RoomColorView.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { ColorConverter, NitroAdjustmentFilter, NitroContainer, NitroSprite, NitroTexture, RoomBackgroundColorEvent, RoomEngineDimmerStateEvent, RoomId, RoomObjectHSLColorEnabledEvent } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { GetNitroInstance, GetRoomEngine, RoomWidgetUpdateBackgroundColorPreviewEvent } from '../../api'; -import { useRoom, useRoomEngineEvent, useUiEvent } from '../../hooks'; - -export const RoomColorView: FC<{}> = props => -{ - const [ roomBackground, setRoomBackground ] = useState(null); - const [ roomFilter, setRoomFilter ] = useState(null); - const [ originalRoomBackgroundColor, setOriginalRoomBackgroundColor ] = useState(0); - const { roomSession = null } = useRoom(); - - const updateRoomBackgroundColor = (hue: number, saturation: number, lightness: number, original: boolean = false) => - { - if(!roomBackground) return; - - const newColor = ColorConverter.hslToRGB(((((hue & 0xFF) << 16) + ((saturation & 0xFF) << 8)) + (lightness & 0xFF))); - - if(original) setOriginalRoomBackgroundColor(newColor); - - if(!hue && !saturation && !lightness) - { - roomBackground.tint = 0; - } - else - { - roomBackground.tint = newColor; - } - } - - const updateRoomFilter = (color: number) => - { - if(!roomFilter) return; - - const r = ((color >> 16) & 0xFF); - const g = ((color >> 8) & 0xFF); - const b = (color & 0xFF); - - roomFilter.red = (r / 255); - roomFilter.green = (g / 255); - roomFilter.blue = (b / 255); - } - - useRoomEngineEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - if(event.enable) updateRoomBackgroundColor(event.hue, event.saturation, event.lightness, true); - else updateRoomBackgroundColor(0, 0, 0, true); - }); - - useRoomEngineEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - - let color = 0x000000; - let brightness = 0xFF; - - if(!event.bgOnly) - { - color = event.color; - brightness = event.brightness; - } - - updateRoomFilter(ColorConverter.hslToRGB(((ColorConverter.rgbToHSL(color) & 0xFFFF00) + brightness))); - }); - - useRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => - { - if(RoomId.isRoomPreviewerId(event.roomId)) return; - }); - - useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, event => updateRoomBackgroundColor(event.hue, event.saturation, event.lightness)); - - useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW, event => - { - if(!roomBackground) return; - - roomBackground.tint = originalRoomBackgroundColor; - }); - - useEffect(() => - { - if(!roomSession) return; - - const canvas = GetRoomEngine().getRoomInstanceRenderingCanvas(roomSession.roomId, 1); - - if(!canvas) return; - - const background = new NitroSprite(NitroTexture.WHITE); - const filter = new NitroAdjustmentFilter(); - const master = (canvas.master as NitroContainer); - - background.tint = 0; - background.width = GetNitroInstance().width; - background.height = GetNitroInstance().height; - - master.addChildAt(background, 0); - master.filters = [ filter ]; - - setRoomBackground(background); - setRoomFilter(filter); - - const resize = (event: UIEvent) => - { - background.width = GetNitroInstance().width; - background.height = GetNitroInstance().height; - } - - window.addEventListener('resize', resize); - - return () => - { - setRoomBackground(prevValue => - { - if(prevValue) prevValue.destroy(); - - return null; - }); - - setRoomFilter(prevValue => - { - if(prevValue) prevValue.destroy(); - - return null; - }); - - setOriginalRoomBackgroundColor(0); - - window.removeEventListener('resize', resize); - } - }, [ roomSession ]); - - return null; -} diff --git a/src/components/room/RoomView.tsx b/src/components/room/RoomView.tsx index 088def60..b8c65dc9 100644 --- a/src/components/room/RoomView.tsx +++ b/src/components/room/RoomView.tsx @@ -2,13 +2,12 @@ import { FC, useEffect, useRef } from 'react'; import { DispatchMouseEvent, DispatchTouchEvent, GetNitroInstance } from '../../api'; import { Base } from '../../common'; import { useRoom } from '../../hooks'; -import { RoomColorView } from './RoomColorView'; import { RoomSpectatorView } from './spectator/RoomSpectatorView'; import { RoomWidgetsView } from './widgets/RoomWidgetsView'; export const RoomView: FC<{}> = props => { - const { roomSession = null, resize = null } = useRoom(); + const { roomSession = null } = useRoom(); const elementRef = useRef(); useEffect(() => @@ -27,27 +26,17 @@ export const RoomView: FC<{}> = props => canvas.ontouchend = event => DispatchTouchEvent(event); canvas.ontouchcancel = event => DispatchTouchEvent(event); - resize(); - const element = elementRef.current; - if(element) element.appendChild(canvas); - - window.addEventListener('resize', resize); - - return () => - { - if(element) element.removeChild(canvas); - - window.removeEventListener('resize', resize); - } - }, [ resize ]); + if(!element) return; + + element.appendChild(canvas); + }, []); return ( { roomSession && <> - { roomSession.isSpectator && } } diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts index 01291dab..a8804a8b 100644 --- a/src/hooks/rooms/useRoom.ts +++ b/src/hooks/rooms/useRoom.ts @@ -1,31 +1,79 @@ -import { IRoomSession, RoomEngineEvent, RoomEngineObjectEvent, RoomGeometry, RoomId, RoomObjectCategory, RoomObjectOperationType, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; -import { useCallback, useEffect, useState } from 'react'; +import { ColorConverter, IRoomSession, NitroAdjustmentFilter, NitroContainer, NitroSprite, NitroTexture, RoomBackgroundColorEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomGeometry, RoomId, RoomObjectCategory, RoomObjectHSLColorEnabledEvent, RoomObjectOperationType, RoomSessionEvent, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; +import { useEffect, useState } from 'react'; import { useBetween } from 'use-between'; -import { CanManipulateFurniture, DispatchUiEvent, GetNitroInstance, GetRoomEngine, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IsFurnitureSelectionDisabled, ProcessRoomObjectOperation, RoomWidgetUpdateRoomObjectEvent, SetActiveRoomId, StartRoomSession } from '../../api'; -import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../events'; +import { CanManipulateFurniture, DispatchUiEvent, GetNitroInstance, GetRoomEngine, GetRoomSession, InitializeRoomInstanceRenderingCanvas, IsFurnitureSelectionDisabled, ProcessRoomObjectOperation, RoomWidgetUpdateBackgroundColorPreviewEvent, RoomWidgetUpdateRoomObjectEvent, SetActiveRoomId, StartRoomSession } from '../../api'; +import { useRoomEngineEvent, useRoomSessionManagerEvent, useUiEvent } from '../events'; const useRoomState = () => { const [ roomSession, setRoomSession ] = useState(null); + const [ roomBackground, setRoomBackground ] = useState(null); + const [ roomFilter, setRoomFilter ] = useState(null); + const [ originalRoomBackgroundColor, setOriginalRoomBackgroundColor ] = useState(0); - const resize = useCallback((event: UIEvent = null) => + const updateRoomBackgroundColor = (hue: number, saturation: number, lightness: number, original: boolean = false) => { - const canvas = GetNitroInstance().renderer.view; - - if(!canvas) return; - - canvas.style.width = `${ Math.floor(window.innerWidth) }px`; - canvas.style.height = `${ Math.floor(window.innerHeight) }px`; - - const nitroInstance = GetNitroInstance(); - - nitroInstance.renderer.resolution = window.devicePixelRatio; - nitroInstance.renderer.resize(window.innerWidth, window.innerHeight); + if(!roomBackground) return; - InitializeRoomInstanceRenderingCanvas(window.innerWidth, window.innerHeight, 1); + const newColor = ColorConverter.hslToRGB(((((hue & 0xFF) << 16) + ((saturation & 0xFF) << 8)) + (lightness & 0xFF))); - nitroInstance.render(); - }, []); + if(original) setOriginalRoomBackgroundColor(newColor); + + if(!hue && !saturation && !lightness) + { + roomBackground.tint = 0; + } + else + { + roomBackground.tint = newColor; + } + } + + const updateRoomFilter = (color: number) => + { + if(!roomFilter) return; + + const r = ((color >> 16) & 0xFF); + const g = ((color >> 8) & 0xFF); + const b = (color & 0xFF); + + roomFilter.red = (r / 255); + roomFilter.green = (g / 255); + roomFilter.blue = (b / 255); + } + + useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.PREVIEW, event => updateRoomBackgroundColor(event.hue, event.saturation, event.lightness)); + + useUiEvent(RoomWidgetUpdateBackgroundColorPreviewEvent.CLEAR_PREVIEW, event => + { + if(!roomBackground) return; + + roomBackground.tint = originalRoomBackgroundColor; + }); + + useRoomEngineEvent(RoomObjectHSLColorEnabledEvent.ROOM_BACKGROUND_COLOR, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + if(event.enable) updateRoomBackgroundColor(event.hue, event.saturation, event.lightness, true); + else updateRoomBackgroundColor(0, 0, 0, true); + }); + + useRoomEngineEvent(RoomBackgroundColorEvent.ROOM_COLOR, event => + { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + + let color = 0x000000; + let brightness = 0xFF; + + if(!event.bgOnly) + { + color = event.color; + brightness = event.brightness; + } + + updateRoomFilter(ColorConverter.hslToRGB(((ColorConverter.rgbToHSL(color) & 0xFFFF00) + brightness))); + }); useRoomEngineEvent([ RoomEngineEvent.INITIALIZED, @@ -145,15 +193,40 @@ const useRoomState = () => { if(!roomSession) return; + const nitroInstance = GetNitroInstance(); const roomEngine = GetRoomEngine(); const roomId = roomSession.roomId; const canvasId = 1; + const width = Math.floor(window.innerWidth); + const height = Math.floor(window.innerHeight); + const renderer = nitroInstance.renderer; - resize(); + if(renderer) + { + renderer.view.style.width = `${ width }px`; + renderer.view.style.height = `${ height }px`; + renderer.resolution = window.devicePixelRatio; + renderer.resize(width, height); + } - const displayObject = roomEngine.getRoomInstanceDisplay(roomId, canvasId, window.innerWidth, window.innerHeight, RoomGeometry.SCALE_ZOOMED_IN); + const displayObject = roomEngine.getRoomInstanceDisplay(roomId, canvasId, width, height, RoomGeometry.SCALE_ZOOMED_IN); + const canvas = GetRoomEngine().getRoomInstanceRenderingCanvas(roomId, canvasId); - if(!displayObject) return; + if(!displayObject || !canvas) return; + + const background = new NitroSprite(NitroTexture.WHITE); + const filter = new NitroAdjustmentFilter(); + const master = (canvas.master as NitroContainer); + + background.tint = 0; + background.width = width; + background.height = height; + + master.addChildAt(background, 0); + master.filters = [ filter ]; + + setRoomBackground(background); + setRoomFilter(filter); const geometry = (roomEngine.getRoomInstanceGeometry(roomId, canvasId) as RoomGeometry); @@ -177,16 +250,57 @@ const useRoomState = () => geometry.location = new Vector3d(x, y, z); } - const stage = GetNitroInstance().stage; + const stage = nitroInstance.stage; if(!stage) return; stage.addChild(displayObject); SetActiveRoomId(roomSession.roomId); - }, [ roomSession, resize ]); - return { roomSession, resize }; + const resize = (event: UIEvent) => + { + const width = Math.floor(window.innerWidth); + const height = Math.floor(window.innerHeight); + + renderer.view.style.width = `${ width }px`; + renderer.view.style.height = `${ height }px`; + renderer.resolution = window.devicePixelRatio; + renderer.resize(width, height); + + background.width = width; + background.height = height; + + InitializeRoomInstanceRenderingCanvas(width, height, 1); + + nitroInstance.render(); + } + + window.addEventListener('resize', resize); + + return () => + { + setRoomBackground(prevValue => + { + if(prevValue) prevValue.destroy(); + + return null; + }); + + setRoomFilter(prevValue => + { + if(prevValue) prevValue.destroy(); + + return null; + }); + + setOriginalRoomBackgroundColor(0); + + window.removeEventListener('resize', resize); + } + }, [ roomSession ]); + + return { roomSession }; } export const useRoom = () => useBetween(useRoomState); diff --git a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts index b56b0525..6ac8f89f 100644 --- a/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts +++ b/src/hooks/rooms/widgets/furniture/useFurnitureDimmerWidget.ts @@ -1,4 +1,4 @@ -import { RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; +import { RoomControllerLevel, RoomEngineDimmerStateEvent, RoomEngineTriggerWidgetEvent, RoomId, RoomSessionDimmerPresetsEvent } from '@nitrots/nitro-renderer'; import { useEffect, useState } from 'react'; import { DimmerFurnitureWidgetPresetItem, FurnitureDimmerUtilities, GetSessionDataManager } from '../../../../api'; import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../events'; @@ -84,6 +84,8 @@ const useFurnitureDimmerWidgetState = () => useRoomEngineEvent(RoomEngineDimmerStateEvent.ROOM_COLOR, event => { + if(RoomId.isRoomPreviewerId(event.roomId)) return; + setLastDimmerState(dimmerState); setDimmerState(event.state); setSelectedPresetId(event.presetId); From 784d7cbecd15e062bf71e5fb133b41c040b0d66c Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 2 Aug 2022 16:14:27 -0400 Subject: [PATCH 325/331] Fix the error I made --- src/hooks/rooms/useRoom.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/hooks/rooms/useRoom.ts b/src/hooks/rooms/useRoom.ts index a8804a8b..7481bd2a 100644 --- a/src/hooks/rooms/useRoom.ts +++ b/src/hooks/rooms/useRoom.ts @@ -280,20 +280,8 @@ const useRoomState = () => return () => { - setRoomBackground(prevValue => - { - if(prevValue) prevValue.destroy(); - - return null; - }); - - setRoomFilter(prevValue => - { - if(prevValue) prevValue.destroy(); - - return null; - }); - + setRoomBackground(null); + setRoomFilter(null); setOriginalRoomBackgroundColor(0); window.removeEventListener('resize', resize); From e35bfde81682c23669e6e2bcde1ee051c5f0ffd6 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 10:13:45 -0400 Subject: [PATCH 326/331] Infostand layout changes --- ...nfoStandWidgetUserRelationshipItemView.tsx | 31 +++++++++++++++ .../InfoStandWidgetUserRelationshipsView.tsx | 35 +++-------------- .../infostand/InfoStandWidgetUserView.tsx | 38 ++++++++++--------- 3 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipItemView.tsx diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipItemView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipItemView.tsx new file mode 100644 index 00000000..95911931 --- /dev/null +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipItemView.tsx @@ -0,0 +1,31 @@ +import { RelationshipStatusEnum, RelationshipStatusInfo } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { GetUserProfile, LocalizeText } from '../../../../../api'; +import { Flex, Text } from '../../../../../common'; + +interface InfoStandWidgetUserRelationshipsRelationshipItemViewProps +{ + type: number; + relationship: RelationshipStatusInfo; +} + +export const InfoStandWidgetUserRelationshipsRelationshipItemView: FC = props => +{ + const { type = -1, relationship = null } = props; + + if(!relationship) return null; + + const relationshipName = RelationshipStatusEnum.RELATIONSHIP_NAMES[type].toLocaleLowerCase(); + + return ( + + + + GetUserProfile(relationship.randomFriendId) }> + { relationship.randomFriendName } + { (relationship.friendCount > 1) && (' ' + LocalizeText(`extendedprofile.relstatus.others.${ relationshipName }`, [ 'count' ], [ (relationship.friendCount - 1).toString() ])) } + + + + ); +} diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipsView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipsView.tsx index 0a71a09a..bd280ffd 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipsView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserRelationshipsView.tsx @@ -1,48 +1,23 @@ import { RelationshipStatusEnum, RelationshipStatusInfoMessageParser } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { GetUserProfile, LocalizeText } from '../../../../../api'; -import { Flex, Text } from '../../../../../common'; +import { InfoStandWidgetUserRelationshipsRelationshipItemView } from './InfoStandWidgetUserRelationshipItemView'; interface InfoStandWidgetUserRelationshipsViewProps { relationships: RelationshipStatusInfoMessageParser; } -interface InfoStandWidgetUserRelationshipsRelationshipViewProps -{ - type: number; -} - export const InfoStandWidgetUserRelationshipsView: FC = props => { const { relationships = null } = props; - const RelationshipComponent = ({ type }: InfoStandWidgetUserRelationshipsRelationshipViewProps) => - { - const relationshipInfo = (relationships && relationships.relationshipStatusMap.hasKey(type)) ? relationships.relationshipStatusMap.getValue(type) : null; - - if(!relationshipInfo || !relationshipInfo.friendCount) return null; - - const relationshipName = RelationshipStatusEnum.RELATIONSHIP_NAMES[type].toLocaleLowerCase(); - - return ( - - - - GetUserProfile(relationshipInfo.randomFriendId) }> - { relationshipInfo.randomFriendName } - { (relationshipInfo.friendCount > 1) && (' ' + LocalizeText(`extendedprofile.relstatus.others.${ relationshipName }`, [ 'count' ], [ (relationshipInfo.friendCount - 1).toString() ])) } - - - - ); - } + if(!relationships || !relationships.relationshipStatusMap.length) return null; return ( <> - - - + + + ); } diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx index a0e4086b..238ffae1 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandWidgetUserView.tsx @@ -2,7 +2,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { RelationshipStatusInfoEvent, RelationshipStatusInfoMessageParser, RoomSessionFavoriteGroupUpdateEvent, RoomSessionUserBadgesEvent, RoomSessionUserFigureUpdateEvent, UserRelationshipsComposer } from '@nitrots/nitro-renderer'; import { Dispatch, FC, FocusEvent, KeyboardEvent, SetStateAction, useEffect, useState } from 'react'; import { AvatarInfoUser, CloneObject, GetConfiguration, GetGroupInformation, GetSessionDataManager, GetUserProfile, LocalizeText, SendMessageComposer } from '../../../../../api'; -import { Base, Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text, UserProfileIconView } from '../../../../../common'; +import { Column, Flex, LayoutAvatarImageView, LayoutBadgeImageView, Text, UserProfileIconView } from '../../../../../common'; import { useMessageEvent, useRoom, useRoomSessionManagerEvent } from '../../../../../hooks'; import { InfoStandWidgetUserRelationshipsView } from './InfoStandWidgetUserRelationshipsView'; @@ -20,7 +20,6 @@ export const InfoStandWidgetUserView: FC = props = const [ isEditingMotto, setIsEditingMotto ] = useState(false); const [ relationships, setRelationships ] = useState(null); const { roomSession = null } = useRoom(); - const maxBadgeCount = GetConfiguration('user.badges.max.slots', 5); const saveMotto = (motto: string) => { @@ -49,6 +48,10 @@ export const InfoStandWidgetUserView: FC = props = { if(!avatarInfo || (avatarInfo.webID !== event.userId)) return; + const oldBadges = avatarInfo.badges.join(''); + + if(oldBadges === event.badges.join('')) return; + setAvatarInfo(prevValue => { const newValue = CloneObject(prevValue); @@ -82,7 +85,6 @@ export const InfoStandWidgetUserView: FC = props = setAvatarInfo(prevValue => { const newValue = CloneObject(prevValue); - const clearGroup = ((event.status === -1) || (event.habboGroupId <= 0)); newValue.groupId = clearGroup ? -1 : event.habboGroupId; @@ -137,31 +139,31 @@ export const InfoStandWidgetUserView: FC = props = GetUserProfile(avatarInfo.webID) }> - + - + { avatarInfo.badges[0] && } - - 0) } className="badge-image" onClick={ event => GetGroupInformation(avatarInfo.groupId) }> + + 0) } className="badge-image" onClick={ event => GetGroupInformation(avatarInfo.groupId) }> { avatarInfo.groupId > 0 && } - + - - + + { avatarInfo.badges[1] && } - - + + { avatarInfo.badges[2] && } - + - - + + { avatarInfo.badges[3] && } - - + + { avatarInfo.badges[4] && } - + From 72bc5562fd6d0d452c81ab3e835bb9dae36ce487 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 20:29:00 -0400 Subject: [PATCH 327/331] Changes --- .../catalog}/IMarketplaceSearchOptions.ts | 3 ++- .../catalog}/MarketplaceOfferData.ts | 0 .../catalog}/MarketplaceOfferState.ts | 0 .../catalog}/MarketplaceSearchType.ts | 0 src/api/catalog/index.ts | 4 ++++ .../CatalogLayoutMarketplaceItemView.tsx | 4 +--- .../CatalogLayoutMarketplaceOwnItemsView.tsx | 4 +--- .../CatalogLayoutMarketplacePublicItemsView.tsx | 5 +---- .../CatalogLayoutMarketplaceSearchFormView.tsx | 9 ++------- .../marketplace/common/MarketplaceConfirmType.ts | 6 ------ src/components/help/views/HelpIndexView.tsx | 4 ++-- src/components/toolbar/common/ToolbarViewItems.ts | 15 --------------- 12 files changed, 13 insertions(+), 41 deletions(-) rename src/{components/catalog/views/page/layout/marketplace/common => api/catalog}/IMarketplaceSearchOptions.ts (64%) rename src/{components/catalog/views/page/layout/marketplace/common => api/catalog}/MarketplaceOfferData.ts (100%) rename src/{components/catalog/views/page/layout/marketplace/common => api/catalog}/MarketplaceOfferState.ts (100%) rename src/{components/catalog/views/page/layout/marketplace/common => api/catalog}/MarketplaceSearchType.ts (100%) delete mode 100644 src/components/catalog/views/page/layout/marketplace/common/MarketplaceConfirmType.ts delete mode 100644 src/components/toolbar/common/ToolbarViewItems.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts b/src/api/catalog/IMarketplaceSearchOptions.ts similarity index 64% rename from src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts rename to src/api/catalog/IMarketplaceSearchOptions.ts index 77734c3a..9489ef0f 100644 --- a/src/components/catalog/views/page/layout/marketplace/common/IMarketplaceSearchOptions.ts +++ b/src/api/catalog/IMarketplaceSearchOptions.ts @@ -1,4 +1,5 @@ -export interface IMarketplaceSearchOptions { +export interface IMarketplaceSearchOptions +{ query: string; type: number; minPrice: number; diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferData.ts b/src/api/catalog/MarketplaceOfferData.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferData.ts rename to src/api/catalog/MarketplaceOfferData.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferState.ts b/src/api/catalog/MarketplaceOfferState.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceOfferState.ts rename to src/api/catalog/MarketplaceOfferState.ts diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceSearchType.ts b/src/api/catalog/MarketplaceSearchType.ts similarity index 100% rename from src/components/catalog/views/page/layout/marketplace/common/MarketplaceSearchType.ts rename to src/api/catalog/MarketplaceSearchType.ts diff --git a/src/api/catalog/index.ts b/src/api/catalog/index.ts index 5b2bde35..6c5b9e2e 100644 --- a/src/api/catalog/index.ts +++ b/src/api/catalog/index.ts @@ -12,10 +12,14 @@ export * from './GiftWrappingConfiguration'; export * from './ICatalogNode'; export * from './ICatalogOptions'; export * from './ICatalogPage'; +export * from './IMarketplaceSearchOptions'; export * from './IPageLocalization'; export * from './IProduct'; export * from './IPurchasableOffer'; export * from './IPurchaseOptions'; +export * from './MarketplaceOfferData'; +export * from './MarketplaceOfferState'; +export * from './MarketplaceSearchType'; export * from './Offer'; export * from './PageLocalization'; export * from './PlacedObjectPurchaseData'; diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx index 44d1489e..1f19b6bf 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceItemView.tsx @@ -1,8 +1,6 @@ import { FC, useCallback, useMemo } from 'react'; -import { GetImageIconUrlForProduct, LocalizeText, ProductTypeEnum } from '../../../../../../api'; +import { GetImageIconUrlForProduct, LocalizeText, MarketplaceOfferData, MarketPlaceOfferState, ProductTypeEnum } from '../../../../../../api'; import { Button, Column, LayoutGridItem, Text } from '../../../../../../common'; -import { MarketplaceOfferData } from './common/MarketplaceOfferData'; -import { MarketPlaceOfferState } from './common/MarketplaceOfferState'; export interface MarketplaceItemViewProps { diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx index 5a18378d..b74ab491 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceOwnItemsView.tsx @@ -1,12 +1,10 @@ import { CancelMarketplaceOfferMessageComposer, GetMarketplaceOwnOffersMessageComposer, MarketplaceCancelOfferResultEvent, MarketplaceOwnOffersEvent, RedeemMarketplaceOfferCreditsMessageComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalizeText, NotificationAlertType, SendMessageComposer } from '../../../../../../api'; +import { LocalizeText, MarketplaceOfferData, MarketPlaceOfferState, NotificationAlertType, SendMessageComposer } from '../../../../../../api'; import { Button, Column, Text } from '../../../../../../common'; import { useMessageEvent, useNotification } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, OWN_OFFER } from './CatalogLayoutMarketplaceItemView'; -import { MarketplaceOfferData } from './common/MarketplaceOfferData'; -import { MarketPlaceOfferState } from './common/MarketplaceOfferState'; export const CatalogLayoutMarketplaceOwnItemsView: FC = props => { diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx index 172e3001..1225a0d7 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplacePublicItemsView.tsx @@ -1,14 +1,11 @@ import { BuyMarketplaceOfferMessageComposer, GetMarketplaceOffersMessageComposer, MarketplaceBuyOfferResultEvent, MarketPlaceOffersEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useMemo, useState } from 'react'; -import { LocalizeText, NotificationAlertType, SendMessageComposer } from '../../../../../../api'; +import { IMarketplaceSearchOptions, LocalizeText, MarketplaceOfferData, MarketplaceSearchType, NotificationAlertType, SendMessageComposer } from '../../../../../../api'; import { Button, ButtonGroup, Column, Text } from '../../../../../../common'; import { useMessageEvent, useNotification, usePurse } from '../../../../../../hooks'; import { CatalogLayoutProps } from '../CatalogLayout.types'; import { CatalogLayoutMarketplaceItemView, PUBLIC_OFFER } from './CatalogLayoutMarketplaceItemView'; import { SearchFormView } from './CatalogLayoutMarketplaceSearchFormView'; -import { IMarketplaceSearchOptions } from './common/IMarketplaceSearchOptions'; -import { MarketplaceOfferData } from './common/MarketplaceOfferData'; -import { MarketplaceSearchType } from './common/MarketplaceSearchType'; const SORT_TYPES_VALUE = [ 1, 2 ]; const SORT_TYPES_ACTIVITY = [ 3, 4, 5, 6 ]; diff --git a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx index 9fa74263..e07a7b2b 100644 --- a/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx +++ b/src/components/catalog/views/page/layout/marketplace/CatalogLayoutMarketplaceSearchFormView.tsx @@ -1,11 +1,6 @@ import { FC, useCallback, useEffect, useState } from 'react'; -import { LocalizeText } from '../../../../../../api'; -import { Button } from '../../../../../../common/Button'; -import { Column } from '../../../../../../common/Column'; -import { Flex } from '../../../../../../common/Flex'; -import { Text } from '../../../../../../common/Text'; -import { IMarketplaceSearchOptions } from './common/IMarketplaceSearchOptions'; -import { MarketplaceSearchType } from './common/MarketplaceSearchType'; +import { IMarketplaceSearchOptions, LocalizeText, MarketplaceSearchType } from '../../../../../../api'; +import { Button, Column, Flex, Text } from '../../../../../../common'; export interface SearchFormViewProps { diff --git a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceConfirmType.ts b/src/components/catalog/views/page/layout/marketplace/common/MarketplaceConfirmType.ts deleted file mode 100644 index dbc17f2a..00000000 --- a/src/components/catalog/views/page/layout/marketplace/common/MarketplaceConfirmType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class MarketplaceConfirmType -{ - public static readonly PURCHASE_CONFIRM_TYPE_NORMAL = 1; - public static readonly PURCHASE_CONFIRM_TYPE_HIGHER = 2; - public static readonly PURCHASE_CONFIRM_TYPE_INVALID = 3; -} diff --git a/src/components/help/views/HelpIndexView.tsx b/src/components/help/views/HelpIndexView.tsx index 6b6feb03..b4f0743a 100644 --- a/src/components/help/views/HelpIndexView.tsx +++ b/src/components/help/views/HelpIndexView.tsx @@ -21,7 +21,7 @@ export const HelpIndexView: FC<{}> = props => return ( <> - + { LocalizeText('help.main.frame.title') } { LocalizeText('help.main.self.description') } @@ -29,8 +29,8 @@ export const HelpIndexView: FC<{}> = props => - + ) } diff --git a/src/components/toolbar/common/ToolbarViewItems.ts b/src/components/toolbar/common/ToolbarViewItems.ts deleted file mode 100644 index dd05f863..00000000 --- a/src/components/toolbar/common/ToolbarViewItems.ts +++ /dev/null @@ -1,15 +0,0 @@ -export class ToolbarViewItems -{ - public static NAVIGATOR_ITEM: string = 'TVI_NAVIGATOR_ITEM'; - public static INVENTORY_ITEM: string = 'TVI_INVENTORY_ITEM'; - public static CATALOG_ITEM: string = 'TVI_CATALOG_ITEM'; - public static FRIEND_LIST_ITEM: string = 'TVI_FRIEND_LIST_ITEM'; - public static FRIEND_CHAT_ITEM: string = 'TVI_FRIEND_CHAT_ITEM'; - public static CLOTHING_ITEM: string = 'TVI_CLOTHING_ITEM'; - public static CAMERA_ITEM: string = 'TVI_CAMERA_ITEM'; - public static MOD_TOOLS_ITEM: string = 'TVI_MOD_TOOLS_ITEM'; - public static ACHIEVEMENTS_ITEM: string = 'TVI_ACHIEVEMENTS_ITEM'; - public static PROFILE_ITEM: string = 'TVI_PROFILE_ITEM'; - public static SETTINGS_ITEM: string = 'TVI_SETTINGS_ITEM'; - public static GUIDE_TOOL_ITEM: string = 'TVI_GUIDE_TOOL_ITEM'; -} From 3298471651a7fa44cc0c3cff1451f7903ebbad65 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 21:44:00 -0400 Subject: [PATCH 328/331] Fix badge only catalog items --- .../page/layout/CatalogLayoutDefaultView.tsx | 17 +++++++++++------ .../widgets/CatalogViewProductWidgetView.tsx | 5 ++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx index 969b536b..262685ae 100644 --- a/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx +++ b/src/components/catalog/views/page/layout/CatalogLayoutDefaultView.tsx @@ -1,5 +1,6 @@ import { FC } from 'react'; -import { Base, Column, Flex, Grid, Text } from '../../../../../common'; +import { ProductTypeEnum } from '../../../../../api'; +import { Column, Flex, Grid, Text } from '../../../../../common'; import { useCatalog } from '../../../../../hooks'; import { CatalogAddOnBadgeWidgetView } from '../widgets/CatalogAddOnBadgeWidgetView'; import { CatalogItemGridWidgetView } from '../widgets/CatalogItemGridWidgetView'; @@ -28,11 +29,15 @@ export const CatalogLayoutDefaultView: FC = props => } { currentOffer && <> - - - - - + + { (currentOffer.product.productType !== ProductTypeEnum.BADGE) && + <> + + + + } + { (currentOffer.product.productType === ProductTypeEnum.BADGE) && } + { currentOffer.localizationName } diff --git a/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx b/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx index 620ece15..e89b8ab3 100644 --- a/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx +++ b/src/components/catalog/views/page/widgets/CatalogViewProductWidgetView.tsx @@ -17,6 +17,8 @@ export const CatalogViewProductWidgetView: FC<{}> = props => if(!product) return; + roomPreviewer.reset(false); + switch(product.productType) { case ProductTypeEnum.FLOOR: { @@ -49,15 +51,12 @@ export const CatalogViewProductWidgetView: FC<{}> = props => switch(product.furnitureData.specialType) { case FurniCategory.FLOOR: - roomPreviewer.reset(false); roomPreviewer.updateObjectRoom(product.extraParam); return; case FurniCategory.WALL_PAPER: - roomPreviewer.reset(false); roomPreviewer.updateObjectRoom(null, product.extraParam); return; case FurniCategory.LANDSCAPE: { - roomPreviewer.reset(false); roomPreviewer.updateObjectRoom(null, null, product.extraParam); const furniData = GetSessionDataManager().getWallItemDataByName('ads_twi_windw'); From e6522743b2eb7335ad1da4ae8402cb4ad4ebf98a Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 22:07:23 -0400 Subject: [PATCH 329/331] Bump renderer version --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d2e465bb..ade60155 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/react-fontawesome": "^0.2.0", - "@nitrots/nitro-renderer": "^1.3.3", + "@nitrots/nitro-renderer": "^1.3.4", "animate.css": "^4.1.1", "classnames": "^2.3.1", "cross-env": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index fc65f560..6b568a4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1484,10 +1484,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@nitrots/nitro-renderer@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.3.3.tgz#47bff70bed966f95d8bc4abb946618bfeff9f9ba" - integrity sha512-Sx/9X/TRMLEl4eHls8zcdVkYxlixsLkn0PfVwt75jwx3aFNS39RpFs3SQ6+W6ONw0iVZWwucpf5TDHr7a/Ds8g== +"@nitrots/nitro-renderer@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@nitrots/nitro-renderer/-/nitro-renderer-1.3.4.tgz#1cde08c7988795a5e016930bd47bdb93279d6560" + integrity sha512-HmgRZkoM5BQQz27BWKujyioTTMokzVIPzxL9juiGagt+qFupM5Hj8Nm7Udx0XeuEGH1E7gghv+ggCCl1FKweoA== dependencies: "@pixi/app" "~6.4.2" "@pixi/basis" "~6.4.2" From a9bac2afa679240813ff27ba35d499d2fcf75ed2 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 22:16:44 -0400 Subject: [PATCH 330/331] Chat changes --- src/api/utils/RoomChatFormatter.ts | 13 ++++++------- src/components/room/widgets/chat/ChatWidgetView.tsx | 7 ++++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/api/utils/RoomChatFormatter.ts b/src/api/utils/RoomChatFormatter.ts index 9c80de72..8da83aca 100644 --- a/src/api/utils/RoomChatFormatter.ts +++ b/src/api/utils/RoomChatFormatter.ts @@ -1,6 +1,7 @@ import * as joypixels from 'emoji-toolkit'; const allowedColours: Map = new Map(); + allowedColours.set('r', 'red'); allowedColours.set('b', 'blue'); allowedColours.set('g', 'green'); @@ -23,14 +24,13 @@ allowedColours.set('brown', 'brown'); allowedColours.set('purple', 'purple'); allowedColours.set('pink', 'pink'); -function encodeHTML(str: string) +const encodeHTML = (str: string) => { - return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) + return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, (full, char, next) => { if(char !== '&' || next !== '#') { - if(/[\u00A0-\u9999<>&]/.test(next)) - next = '&#' + next.charCodeAt(0) + ';'; + if(/[\u00A0-\u9999<>&]/.test(next)) next = '&#' + next.charCodeAt(0) + ';'; return '&#' + char.charCodeAt(0) + ';' + next; } @@ -39,12 +39,11 @@ function encodeHTML(str: string) }); } - -export function RoomChatFormatter(content: string): string +export const RoomChatFormatter = (content: string) => { let result = ''; - content = encodeHTML(content) + content = encodeHTML(content); content = (joypixels.shortnameToUnicode(content) as string) if(content.startsWith('@') && content.indexOf('@', 1) > -1) diff --git a/src/components/room/widgets/chat/ChatWidgetView.tsx b/src/components/room/widgets/chat/ChatWidgetView.tsx index 4a28746b..88d97e60 100644 --- a/src/components/room/widgets/chat/ChatWidgetView.tsx +++ b/src/components/room/widgets/chat/ChatWidgetView.tsx @@ -22,16 +22,17 @@ export const ChatWidgetView: FC<{}> = props => { const collides = chatMessages[i]; - if(!collides || (chat === collides) || (tempChats.indexOf(collides) >= 0) || ((collides.top - moved) >= (chat.top + chat.height))) continue; + if(!collides || (chat === collides) || (tempChats.indexOf(collides) >= 0) || (((collides.top + collides.height) - moved) > (chat.top + chat.height))) continue; - if(DoChatsOverlap(chat, collides, -moved, 4)) + chat.skipMovement = true; + + if(DoChatsOverlap(chat, collides, -moved, 0)) { const amount = Math.abs((collides.top + collides.height) - chat.top); tempChats.push(collides); collides.top -= amount; - collides.skipMovement = true; checkOverlappingChats(collides, amount, tempChats); From 058397aae002642642b1b8398d4eb961661a60b0 Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 3 Aug 2022 22:18:46 -0400 Subject: [PATCH 331/331] Version 2.1.0 --- README.md | 10 +++++----- package.json | 2 +- src/api/GetUIVersion.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e420b3df..b9932897 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Nitro React +# Nitro React v2.1 ## Prerequisites -- You must have [git](https://git-scm.com/) installed -- You must have [NodeJS](https://nodejs.org/) >= 16.13 installed -- We recommend you use [Yarn](https://yarnpkg.com/) over [npm](https://npmjs.com/) - - `npm i yarn -g` +- [Git](https://git-scm.com/) +- [NodeJS](https://nodejs.org/) >= 18 + - If using NodeJS < 18 remove `--openssl-legacy-provider` from the package.json scripts +- [Yarn](https://yarnpkg.com/) `npm i yarn -g` ## Installation diff --git a/package.json b/package.json index ade60155..8e6a95fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nitro-react", - "version": "2.0.0", + "version": "2.1.0", "private": true, "scripts": { "start": "cross-env SKIP_PREFLIGHT_CHECK=true BROWSER=none IMAGE_INLINE_SIZE_LIMIT=100000 craco --openssl-legacy-provider start", diff --git a/src/api/GetUIVersion.ts b/src/api/GetUIVersion.ts index fb69e1ce..881eea94 100644 --- a/src/api/GetUIVersion.ts +++ b/src/api/GetUIVersion.ts @@ -1 +1 @@ -export const GetUIVersion = () => '2.0.0'; +export const GetUIVersion = () => '2.1.0';