From 7688711cbd4a73a13bdf29f8e7fa194535e848a8 Mon Sep 17 00:00:00 2001 From: WolverinDEV Date: Sat, 26 Sep 2020 22:57:53 +0200 Subject: [PATCH] Fixed the server log scroll bar on server handler switching --- shared/js/ui/frames/log/Definitions.ts | 3 ++- shared/js/ui/frames/log/Renderer.tsx | 18 ++++++++++++------ shared/js/ui/frames/log/ServerEventLog.tsx | 11 +++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/shared/js/ui/frames/log/Definitions.ts b/shared/js/ui/frames/log/Definitions.ts index 86a7a70c..48c23154 100644 --- a/shared/js/ui/frames/log/Definitions.ts +++ b/shared/js/ui/frames/log/Definitions.ts @@ -332,5 +332,6 @@ export interface ServerLogUIEvents { }, "notify_log_add": { event: LogMessage - } + }, + "notify_show": {} } \ No newline at end of file diff --git a/shared/js/ui/frames/log/Renderer.tsx b/shared/js/ui/frames/log/Renderer.tsx index bd2b68e8..852691b8 100644 --- a/shared/js/ui/frames/log/Renderer.tsx +++ b/shared/js/ui/frames/log/Renderer.tsx @@ -71,13 +71,19 @@ export const ServerLogRenderer = (props: { events: Registry, setRevision(revision + 1); }); - useEffect(() => { - const id = requestAnimationFrame(() => { - if(!refContainer.current) - return; + const fixScroll = () => { + if(!refContainer.current) + return; - refContainer.current.scrollTop = scrollOffset.current === "bottom" ? refContainer.current.scrollHeight : scrollOffset.current; - }); + refContainer.current.scrollTop = scrollOffset.current === "bottom" ? refContainer.current.scrollHeight : scrollOffset.current; + }; + + props.events.reactUse("notify_show", () => { + requestAnimationFrame(fixScroll); + }); + + useEffect(() => { + const id = requestAnimationFrame(fixScroll); return () => cancelAnimationFrame(id); }); diff --git a/shared/js/ui/frames/log/ServerEventLog.tsx b/shared/js/ui/frames/log/ServerEventLog.tsx index 89a5ade8..c8a9e74c 100644 --- a/shared/js/ui/frames/log/ServerEventLog.tsx +++ b/shared/js/ui/frames/log/ServerEventLog.tsx @@ -14,6 +14,8 @@ let uniqueLogEventId = 0; export class ServerEventLog { private readonly connection: ConnectionHandler; private readonly uiEvents: Registry; + private readonly listenerHandlerVisibilityChanged; + private htmlTag: HTMLDivElement; private maxHistoryLength: number = 100; @@ -31,6 +33,12 @@ export class ServerEventLog { }); ReactDOM.render(, this.htmlTag); + + this.connection.events().on("notify_visibility_changed", this.listenerHandlerVisibilityChanged =event => { + if(event.visible) { + this.uiEvents.fire("notify_show"); + } + }); } log(type: T, data: TypeInfo[T]) { @@ -70,6 +78,9 @@ export class ServerEventLog { this.htmlTag = undefined; } + this.connection.events().off(this.listenerHandlerVisibilityChanged); this.eventLog = undefined; + + this.uiEvents.destroy(); } } \ No newline at end of file