/
menu.js
80 lines (61 loc) · 1.98 KB
/
menu.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
'use strict'
var $ = require('jquery')
var Rx = require('rx')
var fromEvent = Rx.Observable.fromEvent;
var menuContainer = $('.lower-navbar');
var trayContainer = $('.nav-tray-container');
var navItems = $('#nav-tray-links li');
var navTrays = $('.nav-tray');
var mouseEnterMenuItem = fromEvent(navItems, 'mouseenter');
var mouseLeaveMenuItem = fromEvent(navItems, 'mouseleave');
var mouseEnterTray = fromEvent(navTrays, 'mouseenter');
var mouseLeaveTray = fromEvent(navTrays, 'mouseleave');
var inMenu = mouseEnterMenuItem.map(getMenuItem).merge(mouseLeaveMenuItem.map( () => { return false }))
var inTray = mouseEnterTray.map( () => { return true } ).merge(mouseLeaveTray.map( () => {return false })).startWith(false)
let eventStream = Rx.Observable.combineLatest(inMenu, inTray)
.debounce(200)
// .throttle(400)
// .distinctUntilChanged()
eventStream.filter( (args) => { return args[0] })
.map( (args) => {return args[0] })
.subscribe(openTray)
eventStream.filter( (args) => { return !args[0] && !args[1] })
.do(removeOverlay)
.subscribe(closeTray)
function addOverlay() {
let overlay = $('.nav-page-overlay');
if (overlay.length == 0) {
overlay = $('<div class="nav-page-overlay"></div>');
$('body').append(overlay);
}
setTimeout( () => {
overlay.addClass('active');
}, 10);
}
function removeOverlay() {
var overlay = $('.nav-page-overlay');
overlay.removeClass('active');
overlay.remove();
}
function resetItems() {
navItems.removeClass('active');
navTrays.removeClass('active');
}
function openTray(menuItem) {
resetItems()
menuItem.addClass('active');
let trayId = menuItem.data('link')
let tray = $(trayId)
trayContainer.addClass('active');
$(tray).addClass('active');
addOverlay()
}
function closeTray() {
navItems.removeClass('active');
trayContainer.removeClass('active');
menuContainer.removeClass('active');
}
function getMenuItem(event){
let $target = $(event.target)
return $target.is('li') ? $target : $target.parents('li')
}