diff --git a/src/views/room/RoomView.tsx b/src/views/room/RoomView.tsx index babde88d..c103b05a 100644 --- a/src/views/room/RoomView.tsx +++ b/src/views/room/RoomView.tsx @@ -10,6 +10,7 @@ import { RoomWidgetUpdateRoomViewEvent } from './events/RoomWidgetUpdateRoomView import { IRoomWidgetHandlerManager, RoomWidgetAvatarInfoHandler, RoomWidgetChatHandler, RoomWidgetChatInputHandler, RoomWidgetHandlerManager, RoomWidgetInfostandHandler } from './handlers'; import { FurnitureContextMenuWidgetHandler } from './handlers/FurnitureContextMenuWidgetHandler'; import { FurnitureCustomStackHeightWidgetHandler } from './handlers/FurnitureCustomStackHeightWidgetHandler'; +import { FurnitureExternalImageWidgetHandler } from './handlers/FurnitureExternalImageWidgetHandler'; import { RoomWidgetRoomToolsHandler } from './handlers/RoomWidgetRoomToolsHandler'; import { RoomColorView } from './RoomColorView'; import { RoomViewProps } from './RoomView.types'; @@ -44,6 +45,7 @@ export const RoomView: FC = props => widgetHandlerManager.registerHandler(new RoomWidgetChatHandler()); widgetHandlerManager.registerHandler(new FurnitureContextMenuWidgetHandler()); widgetHandlerManager.registerHandler(new FurnitureCustomStackHeightWidgetHandler()); + widgetHandlerManager.registerHandler(new FurnitureExternalImageWidgetHandler()); setWidgetHandler(widgetHandlerManager); diff --git a/src/views/room/events/RoomWidgetUpdateExternalImageEvent.ts b/src/views/room/events/RoomWidgetUpdateExternalImageEvent.ts new file mode 100644 index 00000000..0b8f9425 --- /dev/null +++ b/src/views/room/events/RoomWidgetUpdateExternalImageEvent.ts @@ -0,0 +1,60 @@ +import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; + +export class RoomWidgetUpdateExternalImageEvent extends RoomWidgetUpdateEvent +{ + public static UPDATE_EXTERNAL_IMAGE: string = 'RWUCSHE_UPDATE_EXTERNAL_IMAGE'; + + private _objectId: number; + private _photoData: IPhotoData; + + constructor(objectId: number, photoData: IPhotoData = null) + { + super(RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE); + + this._objectId = objectId; + this._photoData = photoData; + } + + public get objectId(): number + { + return this._objectId; + } + + public get photoData(): IPhotoData + { + return this._photoData; + } +} + +export interface IPhotoData +{ + /** + * creator username + */ + n?: string; + + /** + * creator user id + */ + s?: number; + + /** + * photo unique id + */ + u?: number; + + /** + * creation timestamp + */ + t?: number; + + /** + * photo caption + */ + m?: string; + + /** + * photo image url + */ + w?: string; +} diff --git a/src/views/room/handlers/FurnitureExternalImageWidgetHandler.ts b/src/views/room/handlers/FurnitureExternalImageWidgetHandler.ts new file mode 100644 index 00000000..080d0044 --- /dev/null +++ b/src/views/room/handlers/FurnitureExternalImageWidgetHandler.ts @@ -0,0 +1,68 @@ +import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable, RoomWidgetEnum } from 'nitro-renderer'; +import { GetRoomEngine } from '../../../api'; +import { RoomWidgetUpdateEvent } from '../events/RoomWidgetUpdateEvent'; +import { IPhotoData, RoomWidgetUpdateExternalImageEvent } from '../events/RoomWidgetUpdateExternalImageEvent'; +import { RoomWidgetMessage } from '../messages/RoomWidgetMessage'; +import { RoomWidgetHandler } from './RoomWidgetHandler'; + +export class FurnitureExternalImageWidgetHandler extends RoomWidgetHandler +{ + 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 data = roomObject.model.getValue(RoomObjectVariable.FURNITURE_DATA); + + const dataObj: IPhotoData = JSON.parse(data); + + this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateExternalImageEvent(this._lastFurniId, dataObj)); + return; + } + case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: + { + const widgetEvent = (event as RoomEngineTriggerWidgetEvent); + + if(widgetEvent.objectId !== this._lastFurniId) return; + + this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateExternalImageEvent(-1)); + return; + } + } + } + + public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent + { + switch(message.type) + { + } + + return null; + } + + public get type(): string + { + return RoomWidgetEnum.EXTERNAL_IMAGE; + } + + public get eventTypes(): string[] + { + return []; + } + + public get messageTypes(): string[] + { + return []; + } +} diff --git a/src/views/room/widgets/furniture/FurnitureWidgetsView.tsx b/src/views/room/widgets/furniture/FurnitureWidgetsView.tsx index 56d879ba..02b060de 100644 --- a/src/views/room/widgets/furniture/FurnitureWidgetsView.tsx +++ b/src/views/room/widgets/furniture/FurnitureWidgetsView.tsx @@ -4,6 +4,7 @@ import { FurnitureContextMenuView } from './context-menu/FurnitureContextMenuVie 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 { FurnitureHighScoreView } from './high-score/FurnitureHighScoreView'; import { FurnitureManipulationMenuView } from './manipulation-menu/FurnitureManipulationMenuView'; @@ -28,6 +29,7 @@ export const FurnitureWidgetsView: FC<{}> = props => + ); } diff --git a/src/views/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx b/src/views/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx new file mode 100644 index 00000000..e38bab45 --- /dev/null +++ b/src/views/room/widgets/furniture/external-image/FurnitureExternalImageView.tsx @@ -0,0 +1,45 @@ +import { FC, useCallback, useState } from 'react'; +import { CreateEventDispatcherHook } from '../../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { useRoomContext } from '../../../context/RoomContext'; +import { IPhotoData, RoomWidgetUpdateExternalImageEvent } from '../../../events/RoomWidgetUpdateExternalImageEvent'; + +export const FurnitureExternalImageView: FC<{}> = props => +{ + const [ objectId, setObjectId ] = useState(-1); + const [photoData, setPhotoData ] = useState(null); + + const { roomSession = null, eventDispatcher = null } = useRoomContext(); + + const close = useCallback(() => + { + setObjectId(-1); + setPhotoData(null) + }, []); + + const onRoomWidgetUpdateExternalImageEvent = useCallback((event: RoomWidgetUpdateExternalImageEvent) => + { + switch(event.type) + { + case RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE: { + setObjectId(event.objectId); + setPhotoData(event.photoData); + } + } + }, []); + + CreateEventDispatcherHook(RoomWidgetUpdateExternalImageEvent.UPDATE_EXTERNAL_IMAGE, eventDispatcher, onRoomWidgetUpdateExternalImageEvent); + + if(objectId === -1 || !photoData) return null; + + return( + + + + + {photoData.m &&
{photoData.m}
} +
{`${photoData.n} - ${new Date(photoData.t * 1000).toLocaleDateString()}`}
+
+
+ ); +}