From d5fb33456177fae14d94ee606b03cf13e75496a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien?= Date: Mon, 18 Sep 2023 15:21:00 -0400 Subject: [PATCH] added missing files... --- licenses/bin/moment-timezone.MIT | 20 +++++ licenses/bin/moment.MIT | 22 ++++++ web-console/src/hooks/use-resize-observer.ts | 80 ++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 licenses/bin/moment-timezone.MIT create mode 100644 licenses/bin/moment.MIT create mode 100644 web-console/src/hooks/use-resize-observer.ts diff --git a/licenses/bin/moment-timezone.MIT b/licenses/bin/moment-timezone.MIT new file mode 100644 index 000000000000..f0bb3b4bb462 --- /dev/null +++ b/licenses/bin/moment-timezone.MIT @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/licenses/bin/moment.MIT b/licenses/bin/moment.MIT new file mode 100644 index 000000000000..8618b7333d6f --- /dev/null +++ b/licenses/bin/moment.MIT @@ -0,0 +1,22 @@ +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/web-console/src/hooks/use-resize-observer.ts b/web-console/src/hooks/use-resize-observer.ts new file mode 100644 index 000000000000..921edd0b8acf --- /dev/null +++ b/web-console/src/hooks/use-resize-observer.ts @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useCallback, useEffect, useState } from 'react'; + +const emptyDOMRect = { height: 0, width: 0, x: 0, y: 0, bottom: 0, left: 0, right: 0, top: 0 }; + +function createEmptyDOMRect(): DOMRect { + // DOMRect is not defined in JSDOM + return typeof DOMRect !== 'undefined' + ? new DOMRect() + : { ...emptyDOMRect, toJSON: () => emptyDOMRect }; +} + +export function useResizeObserver(element: HTMLElement | null | undefined) { + const [rect, setRect] = useState(() => createEmptyDOMRect()); + + const maybeUpdate = useCallback( + (e: Element) => { + const newRect: DOMRect = e.getBoundingClientRect(); + if ( + !rect || + rect.bottom !== newRect.bottom || + rect.top !== newRect.top || + rect.left !== newRect.left || + rect.right !== newRect.right || + rect.width !== newRect.width || + rect.height !== newRect.height + ) { + setRect(newRect); + } + }, + [rect], + ); + + const onScroll = useCallback(() => { + if (element) { + maybeUpdate(element); + } + }, [element, maybeUpdate]); + + useEffect(() => { + const resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => { + if (!Array.isArray(entries) || !entries.length) { + return; + } + + maybeUpdate(entries[0].target); + }); + + if (element) { + resizeObserver.observe(element); + window.addEventListener('scroll', onScroll, true); + + return () => { + resizeObserver.unobserve(element); + window.removeEventListener('scroll', onScroll, true); + }; + } + + return; + }, [element, maybeUpdate, onScroll]); + + return rect; +}