diff --git a/src/views/room/RoomView.tsx b/src/views/room/RoomView.tsx index ed5f14aa..a82d4b9a 100644 --- a/src/views/room/RoomView.tsx +++ b/src/views/room/RoomView.tsx @@ -1,6 +1,5 @@ import { EventDispatcher, NitroRectangle, RoomGeometry, RoomVariableEnum, Vector3d } from '@nitrots/nitro-renderer'; -import { FC, useEffect, useState } from 'react'; -import { createPortal } from 'react-dom'; +import { FC, useEffect, useRef, useState } from 'react'; import { GetNitroInstance, InitializeRoomInstanceRenderingCanvas } from '../../api'; import { DispatchMouseEvent } from '../../api/nitro/room/DispatchMouseEvent'; import { DispatchTouchEvent } from '../../api/nitro/room/DispatchTouchEvent'; @@ -21,6 +20,7 @@ export const RoomView: FC = props => const [ roomCanvas, setRoomCanvas ] = useState(null); const [ canvasId, setCanvasId ] = useState(-1); const [ widgetHandler, setWidgetHandler ] = useState(null); + const elementRef = useRef(); useEffect(() => { @@ -111,6 +111,8 @@ export const RoomView: FC = props => GetNitroInstance().render(); } + if(elementRef && elementRef.current) elementRef.current.appendChild(canvas); + setRoomCanvas(canvas); setCanvasId(canvasId); }, [ roomSession ]); @@ -119,15 +121,12 @@ export const RoomView: FC = props => return ( -
-
- { roomCanvas && createPortal(null, document.getElementById('room-view').appendChild(roomCanvas)) } - { widgetHandler && - <> - - - } -
+
+ { widgetHandler && + <> + + + } ); } diff --git a/src/views/room/widgets/context-menu/ContextMenuView.tsx b/src/views/room/widgets/context-menu/ContextMenuView.tsx index ce3a4397..81a28b5a 100644 --- a/src/views/room/widgets/context-menu/ContextMenuView.tsx +++ b/src/views/room/widgets/context-menu/ContextMenuView.tsx @@ -80,8 +80,8 @@ export const ContextMenuView: FC = props => const deltaY = (location.y - maxStack); - let x = (location.x - (elementRef.current.offsetWidth / 2)); - let y = (deltaY + offset); + let x = Math.round(location.x - (elementRef.current.offsetWidth / 2)); + let y = Math.round(deltaY + offset); const maxLeft = ((GetNitroInstance().width - elementRef.current.offsetWidth) - SPACE_AROUND_EDGES); const maxTop = ((GetNitroInstance().height - elementRef.current.offsetHeight) - SPACE_AROUND_EDGES); diff --git a/src/views/shared/friendly-time/FriendlyTimeView.tsx b/src/views/shared/friendly-time/FriendlyTimeView.tsx new file mode 100644 index 00000000..4df913e6 --- /dev/null +++ b/src/views/shared/friendly-time/FriendlyTimeView.tsx @@ -0,0 +1,34 @@ +import { FriendlyTime } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { FriendlyTimeViewProps } from './FriendlyTimeView.types'; + +export const FriendlyTimeView: FC = props => +{ + const { seconds = 0, isShort = false, ...rest } = props; + const [ updateId, setUpdateId ] = useState(-1); + + const getStartSeconds = useMemo(() => + { + return (Math.round(new Date().getSeconds()) - seconds); + }, [ seconds ]); + + const getFriendlyTime = useCallback(() => + { + const value = (Math.round(new Date().getSeconds()) - getStartSeconds); + + if(isShort) return FriendlyTime.format(value); + + return FriendlyTime.format(value); + }, [ getStartSeconds, isShort ]); + + useEffect(() => + { + const interval = setInterval(() => setUpdateId(prevValue => (prevValue + 1)), 10000); + + return () => clearInterval(interval); + }, []); + + return ( +
{ getFriendlyTime() }
+ ); +} diff --git a/src/views/shared/friendly-time/FriendlyTimeView.types.ts b/src/views/shared/friendly-time/FriendlyTimeView.types.ts new file mode 100644 index 00000000..7ce31f31 --- /dev/null +++ b/src/views/shared/friendly-time/FriendlyTimeView.types.ts @@ -0,0 +1,7 @@ +import { DetailsHTMLAttributes } from 'react'; + +export interface FriendlyTimeViewProps extends DetailsHTMLAttributes +{ + seconds: number; + isShort?: boolean; +}