mirror of
https://github.com/billsonnn/nitro-react.git
synced 2024-11-23 14:40:50 +01:00
Widget updates
This commit is contained in:
parent
8efaf59889
commit
9d26746524
@ -47,12 +47,12 @@ export function GetFurnitureInfoData(roomId: number, objectId: number, category:
|
|||||||
|
|
||||||
if(category === RoomObjectCategory.FLOOR)
|
if(category === RoomObjectCategory.FLOOR)
|
||||||
{
|
{
|
||||||
furnitureData = this._container.sessionDataManager.getFloorItemData(typeId);
|
furnitureData = GetSessionDataManager().getFloorItemData(typeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(category === RoomObjectCategory.WALL)
|
else if(category === RoomObjectCategory.WALL)
|
||||||
{
|
{
|
||||||
furnitureData = this._container.sessionDataManager.getWallItemData(typeId);
|
furnitureData = GetSessionDataManager().getWallItemData(typeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(furnitureData)
|
if(furnitureData)
|
||||||
|
38
src/api/nitro/session/GetObjectInfo.ts
Normal file
38
src/api/nitro/session/GetObjectInfo.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { RoomObjectCategory, RoomObjectType } from 'nitro-renderer';
|
||||||
|
import { FurnitureInfoData } from './FurnitureInfoData';
|
||||||
|
import { GetBotInfoData } from './GetBotInfoData';
|
||||||
|
import { GetFurnitureInfoData } from './GetFurnitureInfoData';
|
||||||
|
import { GetRentableBotInfoData } from './GetRentableBotInfoData';
|
||||||
|
import { GetRoomSession } from './GetRoomSession';
|
||||||
|
import { GetUserInfoData } from './GetUserInfoData';
|
||||||
|
import { RentableBotInfoData } from './RentableBotInfoData';
|
||||||
|
import { UserInfoData } from './UserInfoData';
|
||||||
|
|
||||||
|
export function GetObjectInfo(roomId: number, objectId: number, category: number): FurnitureInfoData | UserInfoData | RentableBotInfoData
|
||||||
|
{
|
||||||
|
switch(category)
|
||||||
|
{
|
||||||
|
case RoomObjectCategory.FLOOR:
|
||||||
|
case RoomObjectCategory.WALL:
|
||||||
|
return GetFurnitureInfoData(roomId, objectId, category);
|
||||||
|
case RoomObjectCategory.UNIT:
|
||||||
|
const userData = GetRoomSession().userDataManager.getUserDataByIndex(objectId);
|
||||||
|
|
||||||
|
if(!userData) return null;
|
||||||
|
|
||||||
|
switch(userData.type)
|
||||||
|
{
|
||||||
|
case RoomObjectType.PET:
|
||||||
|
GetRoomSession().userDataManager.requestPetInfo(userData.webID);
|
||||||
|
return null;
|
||||||
|
case RoomObjectType.USER:
|
||||||
|
return GetUserInfoData(roomId, objectId, category, userData);
|
||||||
|
case RoomObjectType.BOT:
|
||||||
|
return GetBotInfoData(roomId, objectId, category, userData);
|
||||||
|
case RoomObjectType.RENTABLE_BOT:
|
||||||
|
return GetRentableBotInfoData(roomId, objectId, category, userData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
@ -4,7 +4,7 @@ import { GetRoomSession } from './GetRoomSession';
|
|||||||
import { GetSessionDataManager } from './GetSessionDataManager';
|
import { GetSessionDataManager } from './GetSessionDataManager';
|
||||||
import { RoomObjectNameData } from './RoomObjectNameData';
|
import { RoomObjectNameData } from './RoomObjectNameData';
|
||||||
|
|
||||||
export function GetRoomObjectNameData(roomId: number, objectId: number, category: number): RoomObjectNameData
|
export function GetObjectName(roomId: number, objectId: number, category: number): RoomObjectNameData
|
||||||
{
|
{
|
||||||
let id = -1;
|
let id = -1;
|
||||||
let name: string = null;
|
let name: string = null;
|
@ -3,9 +3,10 @@ export * from './FurnitureInfoData';
|
|||||||
export * from './GetBotInfoData';
|
export * from './GetBotInfoData';
|
||||||
export * from './GetFurnitureDataForProductOffer';
|
export * from './GetFurnitureDataForProductOffer';
|
||||||
export * from './GetFurnitureInfoData';
|
export * from './GetFurnitureInfoData';
|
||||||
|
export * from './GetObjectInfo';
|
||||||
|
export * from './GetObjectName';
|
||||||
export * from './GetProductDataForLocalization';
|
export * from './GetProductDataForLocalization';
|
||||||
export * from './GetRentableBotInfoData';
|
export * from './GetRentableBotInfoData';
|
||||||
export * from './GetRoomObjectNameData';
|
|
||||||
export * from './GetRoomSession';
|
export * from './GetRoomSession';
|
||||||
export * from './GetRoomSessionManager';
|
export * from './GetRoomSessionManager';
|
||||||
export * from './GetSessionDataManager';
|
export * from './GetSessionDataManager';
|
||||||
|
@ -4,7 +4,16 @@ import { NitroCardViewProps } from './NitroCardView.types';
|
|||||||
|
|
||||||
export const NitroCardView: FC<NitroCardViewProps> = props =>
|
export const NitroCardView: FC<NitroCardViewProps> = props =>
|
||||||
{
|
{
|
||||||
const { className = '', disableDrag = false, children = null } = props;
|
const { className = '', simple = false, disableDrag = false, children = null } = props;
|
||||||
|
|
||||||
|
if(simple)
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
<div className={ 'nitro-card d-flex flex-column rounded border shadow overflow-hidden ' + className }>
|
||||||
|
{ children }
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="nitro-card-responsive">
|
<div className="nitro-card-responsive">
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
export interface NitroCardViewProps
|
export interface NitroCardViewProps
|
||||||
{
|
{
|
||||||
className?: string;
|
className?: string;
|
||||||
|
simple?: boolean;
|
||||||
disableDrag?: boolean;
|
disableDrag?: boolean;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
|
import classNames from 'classnames';
|
||||||
import { FC } from 'react';
|
import { FC } from 'react';
|
||||||
import { NitroCardContentViewProps } from './NitroCardContextView.types';
|
import { NitroCardContentViewProps } from './NitroCardContextView.types';
|
||||||
|
|
||||||
export const NitroCardContentView: FC<NitroCardContentViewProps> = props =>
|
export const NitroCardContentView: FC<NitroCardContentViewProps> = props =>
|
||||||
{
|
{
|
||||||
|
const { isDark = false } = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container-fluid bg-light content-area">
|
<div className={ 'container-fluid bg-light content-area ' + classNames({ 'bg-light': !isDark, 'bg-dark': isDark }) }>
|
||||||
{ props.children }
|
{ props.children }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
export interface NitroCardContentViewProps
|
export interface NitroCardContentViewProps
|
||||||
{
|
{
|
||||||
|
isDark?: boolean;
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,16 @@ export const NitroCardHeaderView: FC<NitroCardHeaderViewProps> = props =>
|
|||||||
const { headerText = null, onCloseClick = null } = props;
|
const { headerText = null, onCloseClick = null } = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="drag-handler container-fluid d-flex align-items-center bg-primary py-1 nitro-card-header">
|
<div className="drag-handler container-fluid bg-primary">
|
||||||
<div className="d-flex flex-grow-1 justify-content-center align-items-center">
|
<div className="row nitro-card-header">
|
||||||
<div className="h4 m-0 text-white text-shadow">{ headerText }</div>
|
<div className="col-10 offset-1 d-flex justify-content-center align-items-center">
|
||||||
</div>
|
<div className="h4 m-0 text-white text-shadow">{ headerText }</div>
|
||||||
<div className="cursor-pointer" onClick={ onCloseClick }>
|
</div>
|
||||||
<i className="fas fa-times"></i>
|
<div className="d-flex col-1 justify-content-center align-items-center">
|
||||||
|
<div className="cursor-pointer" onClick={ onCloseClick }>
|
||||||
|
<i className="fas fa-times"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -11,6 +11,7 @@ import { CameraWidgetView } from './widgets/camera/CameraWidgetView';
|
|||||||
import { ChatInputView } from './widgets/chat-input/ChatInputView';
|
import { ChatInputView } from './widgets/chat-input/ChatInputView';
|
||||||
import { ChatWidgetView } from './widgets/chat/ChatWidgetView';
|
import { ChatWidgetView } from './widgets/chat/ChatWidgetView';
|
||||||
import { FurnitureWidgetsView } from './widgets/furniture/FurnitureWidgetsView';
|
import { FurnitureWidgetsView } from './widgets/furniture/FurnitureWidgetsView';
|
||||||
|
import { InfoStandWidgetView } from './widgets/infostand/InfoStandWidgetView';
|
||||||
|
|
||||||
export function RoomView(props: RoomViewProps): JSX.Element
|
export function RoomView(props: RoomViewProps): JSX.Element
|
||||||
{
|
{
|
||||||
@ -97,6 +98,7 @@ export function RoomView(props: RoomViewProps): JSX.Element
|
|||||||
<ChatWidgetView />
|
<ChatWidgetView />
|
||||||
<ChatInputView />
|
<ChatInputView />
|
||||||
<FurnitureWidgetsView events={ events } />
|
<FurnitureWidgetsView events={ events } />
|
||||||
|
<InfoStandWidgetView events={ events } />
|
||||||
</> }
|
</> }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
@import './chat/ChatWidgetView';
|
@import './chat/ChatWidgetView';
|
||||||
@import './chat-input/ChatInputView';
|
@import './chat-input/ChatInputView';
|
||||||
@import './furniture/FurnitureWidgets';
|
@import './furniture/FurnitureWidgets';
|
||||||
|
@import './infostand/InfoStandWidgetView';
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { RoomObjectCategory } from 'nitro-renderer';
|
import { RoomObjectCategory } from 'nitro-renderer';
|
||||||
import { FC, useCallback, useState } from 'react';
|
import { FC, useCallback, useState } from 'react';
|
||||||
|
import { GetObjectName, RoomObjectNameData } from '../../../../api';
|
||||||
import { CreateEventDispatcherHook } from '../../../../hooks/events/event-dispatcher.base';
|
import { CreateEventDispatcherHook } from '../../../../hooks/events/event-dispatcher.base';
|
||||||
import { RoomWidgetRoomEngineUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../events';
|
import { RoomWidgetRoomEngineUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../events';
|
||||||
import { AvatarInfoWidgetViewProps } from './AvatarInfoWidgetView.types';
|
import { AvatarInfoWidgetViewProps } from './AvatarInfoWidgetView.types';
|
||||||
import { GetRoomObjectNameData } from './utils/GetRoomObjectNameData';
|
|
||||||
import { RoomObjectNameData } from './utils/RoomObjectNameData';
|
|
||||||
import { AvatarInfoWidgetNameView } from './views/name/AvatarInfoWidgetNameView';
|
import { AvatarInfoWidgetNameView } from './views/name/AvatarInfoWidgetNameView';
|
||||||
|
|
||||||
export const AvatarInfoWidgetView: FC<AvatarInfoWidgetViewProps> = props =>
|
export const AvatarInfoWidgetView: FC<AvatarInfoWidgetViewProps> = props =>
|
||||||
@ -17,18 +16,12 @@ export const AvatarInfoWidgetView: FC<AvatarInfoWidgetViewProps> = props =>
|
|||||||
{
|
{
|
||||||
switch(event.type)
|
switch(event.type)
|
||||||
{
|
{
|
||||||
case RoomWidgetRoomObjectUpdateEvent.OBJECT_SELECTED: {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case RoomWidgetRoomObjectUpdateEvent.OBJECT_DESELECTED: {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER: {
|
case RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER: {
|
||||||
if(isGameMode) return;
|
if(isGameMode) return;
|
||||||
|
|
||||||
if(event.category !== RoomObjectCategory.UNIT) return;
|
if(event.category !== RoomObjectCategory.UNIT) return;
|
||||||
|
|
||||||
const nameData = GetRoomObjectNameData(event.roomId, event.id, event.category);
|
const nameData = GetObjectName(event.roomId, event.id, event.category);
|
||||||
|
|
||||||
if(nameData)
|
if(nameData)
|
||||||
{
|
{
|
||||||
@ -76,8 +69,6 @@ export const AvatarInfoWidgetView: FC<AvatarInfoWidgetViewProps> = props =>
|
|||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_SELECTED, events, onRoomWidgetRoomObjectUpdateEvent);
|
|
||||||
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_DESELECTED, events, onRoomWidgetRoomObjectUpdateEvent);
|
|
||||||
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER, events, onRoomWidgetRoomObjectUpdateEvent);
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER, events, onRoomWidgetRoomObjectUpdateEvent);
|
||||||
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OUT, events, onRoomWidgetRoomObjectUpdateEvent);
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OUT, events, onRoomWidgetRoomObjectUpdateEvent);
|
||||||
|
|
||||||
|
@ -9,7 +9,9 @@ export const AvatarInfoWidgetNameView: FC<AvatarInfoWidgetNameViewProps> = props
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ObjectLocationView objectId={ objectId } category={ category }>
|
<ObjectLocationView objectId={ objectId } category={ category }>
|
||||||
{ name }
|
<div className="d-flex justify-content-center align-items-center bg-dark border border-dark">
|
||||||
|
{ name }
|
||||||
|
</div>
|
||||||
</ObjectLocationView>
|
</ObjectLocationView>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { RoomObjectNameData } from '../../utils/RoomObjectNameData';
|
import { RoomObjectNameData } from '../../../../../../api';
|
||||||
|
|
||||||
export interface AvatarInfoWidgetNameViewProps
|
export interface AvatarInfoWidgetNameViewProps
|
||||||
{
|
{
|
||||||
|
@ -49,8 +49,6 @@ export const CameraWidgetView: FC<CameraWidgetViewProps> = props =>
|
|||||||
|
|
||||||
const rectangle = new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height));
|
const rectangle = new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height));
|
||||||
|
|
||||||
console.log(rectangle);
|
|
||||||
|
|
||||||
GetRoomEngine().createRoomScreenshot(GetRoomSession().roomId, 1, rectangle);
|
GetRoomEngine().createRoomScreenshot(GetRoomSession().roomId, 1, rectangle);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
110
src/views/room/widgets/infostand/InfoStandWidgetView.scss
Normal file
110
src/views/room/widgets/infostand/InfoStandWidgetView.scss
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
.nitro-infostand-container {
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
bottom: $toolbar-height + 10px;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: $infostand-zindex;
|
||||||
|
|
||||||
|
.nitro-infostand {
|
||||||
|
position: relative;
|
||||||
|
min-width: 200px;
|
||||||
|
max-width: 200px;
|
||||||
|
z-index: $infostand-zindex;
|
||||||
|
pointer-events: auto;
|
||||||
|
|
||||||
|
.avatar-image {
|
||||||
|
position: relative;
|
||||||
|
width: 90px;
|
||||||
|
height: 130px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position-x: center;
|
||||||
|
background-position-y: -8px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pet-image {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 130px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body-image {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: rgba($secondary, 1);
|
||||||
|
width: 100%;
|
||||||
|
max-width: 68px;
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-right: 5px;
|
||||||
|
|
||||||
|
&.bot {
|
||||||
|
background-image: url('../../../../assets/images/infostand/bot_background.png');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.furni {
|
||||||
|
background-color: transparent;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
|
||||||
|
.grid-items {
|
||||||
|
|
||||||
|
.item-detail {
|
||||||
|
height: 40px;
|
||||||
|
max-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.motto-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 28px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 5px 8px;
|
||||||
|
background-color: rgba($secondary, 1);
|
||||||
|
border-radius: 3px;
|
||||||
|
|
||||||
|
i.icon {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.motto {
|
||||||
|
font-size: 12px;
|
||||||
|
width: 100%;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.motto-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 0;
|
||||||
|
outline: 0;
|
||||||
|
border: 0;
|
||||||
|
color: rgba($white, 1);
|
||||||
|
position: relative;
|
||||||
|
background: transparent;
|
||||||
|
resize: none;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-container {
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
}
|
113
src/views/room/widgets/infostand/InfoStandWidgetView.tsx
Normal file
113
src/views/room/widgets/infostand/InfoStandWidgetView.tsx
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
import { RoomSessionUserBadgesEvent } from 'nitro-renderer';
|
||||||
|
import { FC, useCallback, useState } from 'react';
|
||||||
|
import { FurnitureInfoData, GetObjectInfo, RentableBotInfoData, UserInfoData } from '../../../../api';
|
||||||
|
import { CreateEventDispatcherHook } from '../../../../hooks/events/event-dispatcher.base';
|
||||||
|
import { useRoomSessionManagerEvent } from '../../../../hooks/events/nitro/session/room-session-manager-event';
|
||||||
|
import { RoomWidgetRoomObjectUpdateEvent } from '../events';
|
||||||
|
import { InfoStandWidgetViewProps } from './InfoStandWidgetView.types';
|
||||||
|
import { InfoStandWidgetBotView } from './views/bot/InfoStandWidgetBotView';
|
||||||
|
import { InfoStandWidgetFurniView } from './views/furni/InfoStandWidgetFurniView';
|
||||||
|
import { InfoStandWidgetRentableBotView } from './views/rentable-bot/InfoStandWidgetRentableBotView';
|
||||||
|
import { InfoStandWidgetUserView } from './views/user/InfoStandWidgetUserView';
|
||||||
|
|
||||||
|
export const InfoStandWidgetView: FC<InfoStandWidgetViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { events = null } = props;
|
||||||
|
const [ objectInfo, setObjectInfo ] = useState<FurnitureInfoData | UserInfoData | RentableBotInfoData>(null);
|
||||||
|
|
||||||
|
const closeInfostand = useCallback(() =>
|
||||||
|
{
|
||||||
|
setObjectInfo(null);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const objectSelectedHandler = useCallback((event: RoomWidgetRoomObjectUpdateEvent) =>
|
||||||
|
{
|
||||||
|
const objectInfo = GetObjectInfo(event.roomId, event.id, event.category);
|
||||||
|
|
||||||
|
if(!objectInfo) return;
|
||||||
|
|
||||||
|
setObjectInfo(objectInfo);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const objectDeselectedHandler = useCallback((event: RoomWidgetRoomObjectUpdateEvent) =>
|
||||||
|
{
|
||||||
|
closeInfostand();
|
||||||
|
}, [ closeInfostand ]);
|
||||||
|
|
||||||
|
const objectRemovedHandler = useCallback((event: RoomWidgetRoomObjectUpdateEvent) =>
|
||||||
|
{
|
||||||
|
if(!objectInfo) return;
|
||||||
|
|
||||||
|
let remove = false;
|
||||||
|
|
||||||
|
switch(event.type)
|
||||||
|
{
|
||||||
|
case RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED:
|
||||||
|
if(objectInfo instanceof FurnitureInfoData)
|
||||||
|
{
|
||||||
|
if(objectInfo.id === event.id) remove = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RoomWidgetRoomObjectUpdateEvent.USER_REMOVED:
|
||||||
|
if(objectInfo instanceof UserInfoData)
|
||||||
|
{
|
||||||
|
if(objectInfo.userRoomId === event.id) remove = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(objectInfo instanceof RentableBotInfoData)
|
||||||
|
{
|
||||||
|
if(objectInfo.userRoomId === event.id) remove = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(remove) closeInfostand();
|
||||||
|
}, [ objectInfo, closeInfostand ]);
|
||||||
|
|
||||||
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_SELECTED, events, objectSelectedHandler);
|
||||||
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_DESELECTED, events, objectDeselectedHandler);
|
||||||
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.USER_REMOVED, events, objectRemovedHandler);
|
||||||
|
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED, events, objectRemovedHandler);
|
||||||
|
|
||||||
|
const onRoomSessionUserBadgesEvent = useCallback((event: RoomSessionUserBadgesEvent) =>
|
||||||
|
{
|
||||||
|
console.log(event);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useRoomSessionManagerEvent(RoomSessionUserBadgesEvent.RSUBE_BADGES, onRoomSessionUserBadgesEvent);
|
||||||
|
|
||||||
|
const getInfostandView = useCallback(() =>
|
||||||
|
{
|
||||||
|
if(objectInfo instanceof FurnitureInfoData)
|
||||||
|
{
|
||||||
|
return <InfoStandWidgetFurniView furnitureInfoData={ objectInfo } close={ closeInfostand } />;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(objectInfo instanceof UserInfoData)
|
||||||
|
{
|
||||||
|
switch(objectInfo.type)
|
||||||
|
{
|
||||||
|
case UserInfoData.OWN_USER:
|
||||||
|
case UserInfoData.PEER:
|
||||||
|
return <InfoStandWidgetUserView userInfoData={ objectInfo } close={ closeInfostand } />;
|
||||||
|
case UserInfoData.BOT:
|
||||||
|
return <InfoStandWidgetBotView botInfoData={ objectInfo } close={ closeInfostand } />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(objectInfo instanceof RentableBotInfoData)
|
||||||
|
{
|
||||||
|
return <InfoStandWidgetRentableBotView rentableBotInfoData={ objectInfo } close={ closeInfostand } />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}, [ objectInfo, closeInfostand ]);
|
||||||
|
|
||||||
|
if(!objectInfo) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="d-flex flex-column align-items-end nitro-infostand-container">
|
||||||
|
{ getInfostandView() }
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
import { RoomWidgetProps } from '../RoomWidgets.types';
|
||||||
|
|
||||||
|
export interface InfoStandWidgetViewProps extends RoomWidgetProps
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
import { InfoStandWidgetBotViewProps } from './InfoStandWidgetBotView.types';
|
||||||
|
|
||||||
|
export const InfoStandWidgetBotView: FC<InfoStandWidgetBotViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { botInfoData = null } = props;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import { UserInfoData } from '../../../../../../api';
|
||||||
|
|
||||||
|
export interface InfoStandWidgetBotViewProps
|
||||||
|
{
|
||||||
|
botInfoData: UserInfoData;
|
||||||
|
close: () => void;
|
||||||
|
}
|
@ -0,0 +1,181 @@
|
|||||||
|
import { CrackableDataType, RoomControllerLevel, RoomWidgetEnumItemExtradataParameter, RoomWidgetFurniInfoUsagePolicyEnum, StringDataType } from 'nitro-renderer';
|
||||||
|
import { FC, useCallback, useEffect, useState } from 'react';
|
||||||
|
import { FurniAction, ProcessFurniAction } from '../../../../../../api';
|
||||||
|
import { NitroCardContentView, NitroCardView } from '../../../../../../layout';
|
||||||
|
import { NitroCardSimpleHeaderView } from '../../../../../../layout/card/simple-header';
|
||||||
|
import { LocalizeText } from '../../../../../../utils/LocalizeText';
|
||||||
|
import { BadgeImageView } from '../../../../../badge-image/BadgeImageView';
|
||||||
|
import { LimitedEditionCompactPlateView } from '../../../../../limited-edition/compact-plate/LimitedEditionCompactPlateView';
|
||||||
|
import { InfoStandWidgetFurniViewProps } from './InfoStandWidgetFurniView.types';
|
||||||
|
|
||||||
|
const PICKUP_MODE_NONE: number = 0;
|
||||||
|
const PICKUP_MODE_EJECT: number = 1;
|
||||||
|
const PICKUP_MODE_FULL: number = 2;
|
||||||
|
|
||||||
|
export const InfoStandWidgetFurniView: FC<InfoStandWidgetFurniViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { furnitureInfoData = null, close = null } = props;
|
||||||
|
const [ pickupMode, setPickupMode ] = useState(0);
|
||||||
|
const [ canMove, setCanMove ] = useState(false);
|
||||||
|
const [ canRotate, setCanRotate ] = useState(false);
|
||||||
|
const [ canUse, setCanUse ] = useState(false);
|
||||||
|
const [ furniSettingsKeys, setFurniSettingsKeys ] = useState<string[]>([]);
|
||||||
|
const [ furniSettingsValues, setFurniSettingsValues ] = useState<string[]>([]);
|
||||||
|
const [ isCrackable, setIsCrackable ] = useState(false);
|
||||||
|
const [ crackableHits, setCrackableHits ] = useState(0);
|
||||||
|
const [ crackableTarget, setCrackableTarget ] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() =>
|
||||||
|
{
|
||||||
|
const isValidController = (furnitureInfoData.roomControllerLevel >= RoomControllerLevel.GUEST);
|
||||||
|
|
||||||
|
let godMode = false;
|
||||||
|
|
||||||
|
if(isValidController || furnitureInfoData.isOwner || furnitureInfoData.isRoomOwner || furnitureInfoData.isAnyRoomController)
|
||||||
|
{
|
||||||
|
setCanMove(true);
|
||||||
|
setCanRotate(!furnitureInfoData.isWallItem);
|
||||||
|
|
||||||
|
if(furnitureInfoData.roomControllerLevel >= RoomControllerLevel.MODERATOR) godMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((((furnitureInfoData.usagePolicy === RoomWidgetFurniInfoUsagePolicyEnum._Str_18353) || ((furnitureInfoData.usagePolicy === RoomWidgetFurniInfoUsagePolicyEnum._Str_18194) && isValidController)) || ((furnitureInfoData.extraParam === RoomWidgetEnumItemExtradataParameter.JUKEBOX) && isValidController)) || ((furnitureInfoData.extraParam === RoomWidgetEnumItemExtradataParameter.USABLE_PRODUCT) && isValidController)) setCanUse(true);
|
||||||
|
|
||||||
|
if(furnitureInfoData.extraParam)
|
||||||
|
{
|
||||||
|
if(furnitureInfoData.extraParam === RoomWidgetEnumItemExtradataParameter.CRACKABLE_FURNI)
|
||||||
|
{
|
||||||
|
const stuffData = (furnitureInfoData.stuffData as CrackableDataType);
|
||||||
|
|
||||||
|
setCanUse(true);
|
||||||
|
setIsCrackable(true);
|
||||||
|
setCrackableHits(stuffData.hits);
|
||||||
|
setCrackableTarget(stuffData.target);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(godMode)
|
||||||
|
{
|
||||||
|
const extraParam = furnitureInfoData.extraParam.substr(RoomWidgetEnumItemExtradataParameter.BRANDING_OPTIONS.length);
|
||||||
|
|
||||||
|
if(extraParam)
|
||||||
|
{
|
||||||
|
const parts = extraParam.split('\t');
|
||||||
|
|
||||||
|
let keys: string[] = [];
|
||||||
|
let values: string[] = [];
|
||||||
|
|
||||||
|
for(const part of parts)
|
||||||
|
{
|
||||||
|
const value = part.split('=');
|
||||||
|
|
||||||
|
if(value && (value.length === 2))
|
||||||
|
{
|
||||||
|
keys.push(value[0]);
|
||||||
|
values.push(value[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setFurniSettingsKeys(keys);
|
||||||
|
setFurniSettingsValues(values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setPickupMode(PICKUP_MODE_NONE);
|
||||||
|
|
||||||
|
if(furnitureInfoData.isOwner || furnitureInfoData.isAnyRoomController)
|
||||||
|
{
|
||||||
|
setPickupMode(PICKUP_MODE_FULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(furnitureInfoData.isRoomOwner || (furnitureInfoData.roomControllerLevel >= RoomControllerLevel.GUILD_ADMIN))
|
||||||
|
{
|
||||||
|
setPickupMode(PICKUP_MODE_EJECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(furnitureInfoData.isStickie) setPickupMode(PICKUP_MODE_NONE);
|
||||||
|
}, [ furnitureInfoData ]);
|
||||||
|
|
||||||
|
const openFurniGroupInfo = useCallback(() =>
|
||||||
|
{
|
||||||
|
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const processButtonAction = useCallback((action: string) =>
|
||||||
|
{
|
||||||
|
if(!action || (action === '')) return;
|
||||||
|
|
||||||
|
let messageType: string = null;
|
||||||
|
let objectData: string = null;
|
||||||
|
|
||||||
|
switch(action)
|
||||||
|
{
|
||||||
|
case 'move':
|
||||||
|
messageType = FurniAction.MOVE;
|
||||||
|
break;
|
||||||
|
case 'rotate':
|
||||||
|
messageType = FurniAction.ROTATE;
|
||||||
|
break;
|
||||||
|
case 'pickup':
|
||||||
|
if(pickupMode === PICKUP_MODE_FULL) messageType = FurniAction.PICKUP;
|
||||||
|
else messageType = FurniAction.EJECT;
|
||||||
|
break;
|
||||||
|
case 'use':
|
||||||
|
messageType = FurniAction.USE;
|
||||||
|
break;
|
||||||
|
// case 'save_branding_configuration':
|
||||||
|
// messageType = RoomWidgetFurniActionMessage.RWFAM_SAVE_STUFF_DATA;
|
||||||
|
// objectData = this.getSettingsAsString();
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!messageType) return;
|
||||||
|
|
||||||
|
ProcessFurniAction(messageType, furnitureInfoData.id, furnitureInfoData.category, furnitureInfoData.purchaseOfferId, objectData);
|
||||||
|
}, [ furnitureInfoData, pickupMode ]);
|
||||||
|
|
||||||
|
if(!furnitureInfoData) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<NitroCardView className="nitro-infostand" simple={ true }>
|
||||||
|
<NitroCardSimpleHeaderView headerText={ furnitureInfoData.name } onCloseClick={ close } />
|
||||||
|
<NitroCardContentView>
|
||||||
|
<div className="w-100">
|
||||||
|
{ furnitureInfoData.stuffData.isUnique &&
|
||||||
|
<LimitedEditionCompactPlateView uniqueNumber={ furnitureInfoData.stuffData.uniqueNumber } uniqueSeries={ furnitureInfoData.stuffData.uniqueSeries } /> }
|
||||||
|
{ furnitureInfoData.image.src.length &&
|
||||||
|
<img className="d-block mx-auto" src={ furnitureInfoData.image.src } alt="" /> }
|
||||||
|
</div>
|
||||||
|
<div className="d-flex flex-column mt-2">
|
||||||
|
<p className="badge badge-secondary mb-0 text-wrap">{ furnitureInfoData.description }</p>
|
||||||
|
<p className="badge badge-secondary mt-2 mb-0 text-wrap">{ LocalizeText('furni.owner', [ 'name' ], [ furnitureInfoData.ownerName ]) }</p>
|
||||||
|
{ isCrackable &&
|
||||||
|
<p className="badge badge-secondary mt-2 mb-0 text-wrap">{ LocalizeText('infostand.crackable_furni.hits_remaining', ['hits', 'target'], [ crackableHits.toString(), crackableTarget.toString() ]) }</p> }
|
||||||
|
{ (furnitureInfoData.groupId > 0) &&
|
||||||
|
<div className="badge badge-secondary mt-2 mb-0" onClick={ openFurniGroupInfo }>
|
||||||
|
<BadgeImageView badgeCode={ (furnitureInfoData.stuffData as StringDataType).getValue(2) } />
|
||||||
|
</div> }
|
||||||
|
</div>
|
||||||
|
{/* <div className="mt-3" *ngIf="((furniSettingsKeys.length && furniSettingsValues.length) && (furniSettingsKeys.length === furniSettingsValues.length))">
|
||||||
|
<ng-container *ngFor="let setting of furniSettingsKeys; let i = index">
|
||||||
|
<p className="badge badge-secondary mb-2">{{ furniSettingsKeys[i] }}</p>
|
||||||
|
<input type="text" className="form-control rounded mb-2" [(ngModel)]="furniSettingsValues[i]">
|
||||||
|
</ng-container>
|
||||||
|
</div> */}
|
||||||
|
</NitroCardContentView>
|
||||||
|
</NitroCardView>
|
||||||
|
<div className="button-container btn-group mt-2">
|
||||||
|
{ canMove &&
|
||||||
|
<button type="button" className="btn btn-dark" onClick={ event => processButtonAction('move') }>{ LocalizeText('infostand.button.move') }</button> }
|
||||||
|
{ canRotate &&
|
||||||
|
<button type="button" className="btn btn-dark" onClick={ event => processButtonAction('rotate') }>{ LocalizeText('infostand.button.rotate') }</button> }
|
||||||
|
{ (pickupMode !== PICKUP_MODE_NONE) &&
|
||||||
|
<button type="button" className="btn btn-dark" onClick={ event => processButtonAction('pickup') }>{ LocalizeText((pickupMode === PICKUP_MODE_EJECT) ? 'infostand.button.eject' : 'infostand.button.pickup') }</button> }
|
||||||
|
{ canUse &&
|
||||||
|
<button type="button" className="btn btn-dark" onClick={ event => processButtonAction('use') }>{ LocalizeText('infostand.button.use') }</button> }
|
||||||
|
{/* <button *ngIf="((furniSettingsKeys.length && furniSettingsValues.length) && (furniSettingsKeys.length === furniSettingsValues.length))" className="btn btn-primary" (click)="processButtonAction('save_branding_configuration')">{{ 'save' | translate }}</button> */}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import { FurnitureInfoData } from '../../../../../../api';
|
||||||
|
|
||||||
|
export interface InfoStandWidgetFurniViewProps
|
||||||
|
{
|
||||||
|
furnitureInfoData: FurnitureInfoData;
|
||||||
|
close: () => void;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
import { InfoStandWidgetRentableBotViewProps } from './InfoStandWidgetRentableBotView.types';
|
||||||
|
|
||||||
|
export const InfoStandWidgetRentableBotView: FC<InfoStandWidgetRentableBotViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { rentableBotInfoData = null, close = null } = props;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import { RentableBotInfoData } from '../../../../../../api';
|
||||||
|
|
||||||
|
export interface InfoStandWidgetRentableBotViewProps
|
||||||
|
{
|
||||||
|
rentableBotInfoData: RentableBotInfoData;
|
||||||
|
close: () => void;
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
import { FC } from 'react';
|
||||||
|
import { InfoStandWidgetUserViewProps } from './InfoStandWidgetUserView.types';
|
||||||
|
|
||||||
|
export const InfoStandWidgetUserView: FC<InfoStandWidgetUserViewProps> = props =>
|
||||||
|
{
|
||||||
|
const { userInfoData = null, close = null } = props;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
import { UserInfoData } from '../../../../../../api';
|
||||||
|
|
||||||
|
export interface InfoStandWidgetUserViewProps
|
||||||
|
{
|
||||||
|
userInfoData: UserInfoData;
|
||||||
|
close: () => void;
|
||||||
|
}
|
@ -6,8 +6,7 @@ import { ObjectLocationViewProps } from './ObjectLocationView.types';
|
|||||||
export const ObjectLocationView: FC<ObjectLocationViewProps> = props =>
|
export const ObjectLocationView: FC<ObjectLocationViewProps> = props =>
|
||||||
{
|
{
|
||||||
const { objectId = -1, category = -1, children = null } = props;
|
const { objectId = -1, category = -1, children = null } = props;
|
||||||
const [ posX, setPosX ] = useState(0);
|
const [ pos, setPos ] = useState<{ x: number, y: number }>({ x: -1, y: -1});
|
||||||
const [ posY, setPosY ] = useState(0);
|
|
||||||
const elementRef = useRef<HTMLDivElement>();
|
const elementRef = useRef<HTMLDivElement>();
|
||||||
|
|
||||||
const updatePosition = useCallback(() =>
|
const updatePosition = useCallback(() =>
|
||||||
@ -17,8 +16,10 @@ export const ObjectLocationView: FC<ObjectLocationViewProps> = props =>
|
|||||||
|
|
||||||
if(!objectBounds || !elementRef.current) return;
|
if(!objectBounds || !elementRef.current) return;
|
||||||
|
|
||||||
setPosX(Math.round(((objectBounds.left + (objectBounds.width / 2)) - (elementRef.current.offsetWidth / 2))));
|
setPos({
|
||||||
setPosY(Math.round((objectBounds.top - elementRef.current.offsetHeight) + 10));
|
x: Math.round(((objectBounds.left + (objectBounds.width / 2)) - (elementRef.current.offsetWidth / 2))),
|
||||||
|
y: Math.round((objectBounds.top - elementRef.current.offsetHeight) + 10)
|
||||||
|
});
|
||||||
}, [ objectId, category ]);
|
}, [ objectId, category ]);
|
||||||
|
|
||||||
useEffect(() =>
|
useEffect(() =>
|
||||||
@ -32,7 +33,7 @@ export const ObjectLocationView: FC<ObjectLocationViewProps> = props =>
|
|||||||
}, [ updatePosition ]);
|
}, [ updatePosition ]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={ elementRef } className="position-absolute" style={ { left: posX, top: posY } }>
|
<div ref={ elementRef } className={ 'position-absolute ' + (pos.x > -1 ? 'visible' : 'invisible') } style={ { left: pos.x, top: pos.y } }>
|
||||||
{ children }
|
{ children }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user