Skip to content

Commit ab411fe

Browse files
committed
auto show/hide working properly
1 parent 9392b97 commit ab411fe

File tree

3 files changed

+137
-34
lines changed

3 files changed

+137
-34
lines changed

src/pages/Content/index.jsx

Lines changed: 130 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React from 'react';
33
import ReactDOM from 'react-dom';
44
import Frame from './modules/frame/frame';
55
import UpdateNotice from './modules/UpdateNotice/UpdateNotice';
6+
import { SIDEBAR_CONTAINER_ID } from '../../shared/constants';
67

78
let shouldShrinkBody = true;
89
let sidebarLocation = 'left';
@@ -131,6 +132,11 @@ chrome.storage.sync.get(['sidebarOnLeft'], (result) => {
131132
chrome.storage.sync.get(['autoShowHide'], (result) => {
132133
if (result.autoShowHide !== undefined) {
133134
autoShowHide = result.autoShowHide === true;
135+
if (autoShowHide) {
136+
mountAutoShowHideListener();
137+
}
138+
} else {
139+
unmountAutoShowHideListener();
134140
}
135141
});
136142

@@ -151,9 +157,128 @@ const checkSidebarStatus = () => {
151157

152158
checkSidebarStatus();
153159

160+
/**
161+
* Auto Show Hide
162+
*/
163+
let mouseLeftSidebarTimer = null;
164+
const openSidebarUponMouseOverWindowEdge = () => {
165+
chrome.runtime.sendMessage(
166+
{
167+
from: 'content',
168+
msg: 'REQUEST_SIDEBAR_STATUS',
169+
},
170+
(response) => {
171+
let sidebarOpen = response.sidebarOpen;
172+
if (sidebarOpen === false) {
173+
// open sidebar on this page with timer
174+
console.log('should open sidebar');
175+
if (Frame.isReady()) {
176+
isToggledOpenGloballyFromBackground = false;
177+
Frame.toggle(true);
178+
}
179+
}
180+
}
181+
);
182+
};
183+
184+
const mouseEnteredSidebarHandler = (event) => {
185+
if (isToggledOpenGloballyFromBackground === true) {
186+
return;
187+
}
188+
console.log('mouse entered');
189+
clearTimeout(mouseLeftSidebarTimer);
190+
};
191+
192+
const mouseLeftSidebarHandler = (event) => {
193+
if (isToggledOpenGloballyFromBackground === true) {
194+
return;
195+
}
196+
console.log('mouse left');
197+
mouseLeftSidebarTimer = setTimeout(() => {
198+
if (Frame.isReady()) {
199+
Frame.toggle(false);
200+
}
201+
}, 500);
202+
};
203+
204+
const focusOffSidebarHandler = (event) => {
205+
if (isToggledOpenGloballyFromBackground === true) {
206+
return;
207+
}
208+
console.log('mouse left');
209+
if (Frame.isReady()) {
210+
Frame.toggle(false);
211+
}
212+
clearTimeout(mouseLeftSidebarTimer);
213+
};
214+
215+
let isMouseWithinEdgeDelta = false;
216+
let isToggledOpenGloballyFromBackground = false;
217+
const openSidebarUponMouseOverWindowEdgeEventHandler = (event) => {
218+
if (isToggledOpenGloballyFromBackground === true) {
219+
return;
220+
}
221+
const delta = 5;
222+
if (sidebarLocation === 'left' && event.clientX < delta) {
223+
if (!isMouseWithinEdgeDelta) {
224+
console.log('reached left side');
225+
isMouseWithinEdgeDelta = true;
226+
openSidebarUponMouseOverWindowEdge();
227+
}
228+
} else if (
229+
sidebarLocation === 'right' &&
230+
event.clientX > $(document).width() - delta
231+
) {
232+
if (!isMouseWithinEdgeDelta) {
233+
console.log('reached right side');
234+
isMouseWithinEdgeDelta = true;
235+
openSidebarUponMouseOverWindowEdge();
236+
}
237+
} else {
238+
isMouseWithinEdgeDelta = false;
239+
}
240+
};
241+
242+
const mountAutoShowHideListener = () => {
243+
$(document).on('mousemove', openSidebarUponMouseOverWindowEdgeEventHandler);
244+
$(document).on(
245+
'mouseenter',
246+
`#${SIDEBAR_CONTAINER_ID}`,
247+
mouseEnteredSidebarHandler
248+
);
249+
$(document).on(
250+
'mouseleave',
251+
`#${SIDEBAR_CONTAINER_ID}`,
252+
mouseLeftSidebarHandler
253+
);
254+
255+
$(document).on('blur', `#${SIDEBAR_CONTAINER_ID}`, focusOffSidebarHandler);
256+
};
257+
258+
const unmountAutoShowHideListener = () => {
259+
$(document).off('mousemove', openSidebarUponMouseOverWindowEdgeEventHandler);
260+
$(document).off(
261+
'mouseenter',
262+
`#${SIDEBAR_CONTAINER_ID}`,
263+
mouseEnteredSidebarHandler
264+
);
265+
$(document).off(
266+
'mouseleave',
267+
`#${SIDEBAR_CONTAINER_ID}`,
268+
mouseLeftSidebarHandler
269+
);
270+
$(document).off('blur', `#${SIDEBAR_CONTAINER_ID}`, focusOffSidebarHandler);
271+
};
272+
273+
/**
274+
* Chrome runtime event listener
275+
*/
154276
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
155277
if (request.from === 'background' && request.msg === 'TOGGLE_SIDEBAR') {
156278
if (Frame.isReady()) {
279+
isToggledOpenGloballyFromBackground =
280+
request.toStatus === true ? true : false;
281+
157282
Frame.toggle(request.toStatus);
158283
}
159284
} else if (
@@ -178,6 +303,11 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
178303
) {
179304
const { toStatus } = request;
180305
autoShowHide = toStatus;
306+
if (autoShowHide) {
307+
mountAutoShowHideListener();
308+
} else {
309+
unmountAutoShowHideListener();
310+
}
181311
}
182312
});
183313

@@ -195,25 +325,3 @@ window.addEventListener('keydown', (event) => {
195325
});
196326
}
197327
});
198-
199-
const openSidebarUponMouseOverWindowEdge = () => {
200-
chrome.runtime.sendMessage({
201-
from: 'content',
202-
msg: 'REQUEST_OPEN_SIDEBAR_UPON_MOUSE_OVER_WINDOW_EDGE',
203-
});
204-
};
205-
206-
$(document).on('mousemove', (event) => {
207-
// console.log(event.clientX);
208-
const delta = 5;
209-
if (sidebarLocation === 'left' && event.clientX < delta) {
210-
// console.log('reached left side');
211-
openSidebarUponMouseOverWindowEdge();
212-
} else if (
213-
sidebarLocation === 'right' &&
214-
event.clientX > $(document).width() - delta
215-
) {
216-
// console.log('reached right side');
217-
openSidebarUponMouseOverWindowEdge();
218-
}
219-
});

src/pages/Content/modules/frame/frame.jsx

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { node, object, string, number, func } from 'prop-types';
55

66
import { Resizable } from 're-resizable';
77

8+
import { SIDEBAR_CONTAINER_ID } from '../../../../shared/constants';
9+
810
const iframeClass = css({
911
border: 'none',
1012
width: '100%',
@@ -22,7 +24,7 @@ const containerClass = css({
2224
padding: '0px 0px 0px 0px',
2325
boxSizing: 'border-box',
2426
borderRadius: '3px',
25-
boxShadow: '-1px 1px 8px rgba(0,0,0,.15)',
27+
boxShadow: '0px 0px 8px rgba(0,0,0,.15)',
2628
// transform: 'translateX(115%)',
2729
transition: 'transform .25s cubic-bezier(0, 0, 0.3, 1)',
2830
zIndex: 99999999,
@@ -48,14 +50,14 @@ const containerMinimizedClass = css({
4850
});
4951

5052
const containerRightMinimizedClass = css({
51-
transform: 'translateX(100%)',
53+
transform: 'translateX(105%)',
5254
// ':hover': {
5355
// transform: `translateX(94%)`,
5456
// },
5557
});
5658

5759
const containerLeftMinimizedClass = css({
58-
transform: 'translateX(-100%)',
60+
transform: 'translateX(-105%)',
5961
// ':hover': {
6062
// transform: `translateX(-94%)`,
6163
// },
@@ -229,7 +231,7 @@ export class Frame extends Component {
229231
return (
230232
<React.Fragment>
231233
<div
232-
id="nice"
234+
id={SIDEBAR_CONTAINER_ID}
233235
className={cx({
234236
[containerClass]: true,
235237
[containerLeftClass]: sidebarLocation === 'left',
@@ -355,14 +357,6 @@ export class Frame extends Component {
355357
src={url}
356358
ref={(frame) => (this.frame = frame)}
357359
onLoad={this.onLoad}
358-
onMouseEnter={() => {
359-
// TODO: implement auto show/hide here
360-
console.log('mouse entered');
361-
}}
362-
onMouseLeave={() => {
363-
// TODO: implement auto show/hide here
364-
console.log('mouse left');
365-
}}
366360
></iframe>
367361
</div>
368362
</div>

src/shared/constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export const APP_NAME_SHORT = 'vt';
22
export const APP_NAME_FULL = 'Vertical Tabs';
3+
export const SIDEBAR_CONTAINER_ID = 'vt-sidebar-container';

0 commit comments

Comments
 (0)