summaryrefslogtreecommitdiffhomepage
path: root/gui/src/renderer/components
diff options
context:
space:
mode:
Diffstat (limited to 'gui/src/renderer/components')
-rw-r--r--gui/src/renderer/components/MacOsScrollbarDetection.tsx41
1 files changed, 41 insertions, 0 deletions
diff --git a/gui/src/renderer/components/MacOsScrollbarDetection.tsx b/gui/src/renderer/components/MacOsScrollbarDetection.tsx
new file mode 100644
index 0000000000..69de63cc6a
--- /dev/null
+++ b/gui/src/renderer/components/MacOsScrollbarDetection.tsx
@@ -0,0 +1,41 @@
+import React, { useEffect, useRef } from 'react';
+import styled from 'styled-components';
+import useActions from '../lib/actionsHook';
+import userInterface from '../redux/userinterface/actions';
+import { useSelector } from '../redux/store';
+import { MacOsScrollbarVisibility } from '../../shared/ipc-schema';
+
+const StyledContainer = styled.div({
+ position: 'absolute',
+ visibility: 'hidden',
+ overflowY: 'scroll',
+ overflowX: 'hidden',
+ width: '1px',
+ height: '0px',
+});
+
+// This component is used to determine wheter scrollbars should be always visible or only visible
+// while scrolling when the system setting for this is set to "Automatic". This is detected by
+// testing if any space is taken by a scrollbar.
+export default function MacOsScrollbarDetection() {
+ const visibility = useSelector((state) => state.userInterface.macOsScrollbarVisibility);
+ const { setMacOsScrollbarVisibility } = useActions(userInterface);
+ const ref = useRef() as React.RefObject<HTMLDivElement>;
+
+ useEffect(() => {
+ if (visibility === MacOsScrollbarVisibility.automatic) {
+ // If the width is 0 then the 1 px width of the parent has been used by the scrollbar.
+ const newVisibility =
+ ref.current?.offsetWidth === 0
+ ? MacOsScrollbarVisibility.always
+ : MacOsScrollbarVisibility.whenScrolling;
+ setMacOsScrollbarVisibility(newVisibility);
+ }
+ }, [visibility]);
+
+ return (
+ <StyledContainer>
+ <div ref={ref} />
+ </StyledContainer>
+ );
+}