UNPKG

6.1 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.AppLayout = void 0;
7
8var _classnames = _interopRequireDefault(require("classnames"));
9
10var _preact = require("preact");
11
12var _logo = require("./logo");
13
14var _drawer = require("./drawer");
15
16var _shield = require("./shield");
17
18var _footer = require("./footer");
19
20var _button = require("./button");
21
22var _omit = _interopRequireDefault(require("./utils/omit"));
23
24var _throttle = require("./utils/throttle");
25
26var _envTag = _interopRequireDefault(require("./env-tag"));
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
31
32class DrawerContentWrapper extends _preact.Component {
33 constructor(props) {
34 super(props);
35 this.handleScroll = (0, _throttle.throttle)(this.handleScroll.bind(this), 200);
36 }
37
38 handleScroll() {
39 if (!this.base) {
40 return;
41 }
42
43 const {
44 updateScrolledDown,
45 scrolledDown
46 } = this.props;
47 const {
48 scrollTop
49 } = this.base;
50
51 if (scrollTop === 0 && scrolledDown) {
52 updateScrolledDown(false);
53 }
54
55 if (!scrolledDown && scrollTop > 0) {
56 updateScrolledDown(true);
57 }
58 }
59
60 componentDidMount() {
61 this.base.addEventListener('scroll', this.handleScroll, {
62 passive: true
63 });
64 }
65
66 componentWillUnMount() {
67 this.base.removeEventListener('scroll', this.handleScroll, {
68 passive: true
69 });
70 }
71
72 render({
73 style,
74 children
75 }) {
76 return (0, _preact.h)("div", {
77 className: "v-scroll h-100 w-100",
78 style: style
79 }, children);
80 }
81
82}
83
84class AppLayout extends _preact.Component {
85 constructor(props) {
86 super(props);
87 this.state = {
88 drawerScrolledDown: false
89 };
90 this.updateScrolledDown = this.updateScrolledDown.bind(this);
91 }
92
93 updateScrolledDown(scrolledDown) {
94 this.setState({
95 drawerScrolledDown: scrolledDown
96 });
97 }
98
99 render(props, {
100 drawerScrolledDown
101 }) {
102 const {
103 drawerOpen,
104 screenIsWide,
105 drawerEnabled,
106 drawerContent,
107 statusBarContent,
108 extraContent,
109 extraFooterContent,
110 drawerWidth = 256,
111 mainContent,
112 doCloseDrawer,
113 hideFooter,
114 version,
115 logoHref,
116 logoOnClick,
117 preventScroll,
118 env
119 } = props;
120 const rest = (0, _omit.default)(props, ['drawerOpen', 'screenIsWide', 'drawerEnabled', 'drawerContent', 'statusBarContent', 'extraContent', 'drawerWidth', 'mainContent', 'doCloseDrawer', 'hideFooter', 'version', 'logoHref', 'logoOnClick', 'preventScroll', 'extraFooterContent']);
121 const drawerAlwaysVisible = drawerEnabled && screenIsWide;
122 const useFloatingDrawer = drawerEnabled && !screenIsWide;
123 const showShield = useFloatingDrawer && drawerOpen;
124 const floatingDrawerHidden = useFloatingDrawer && !drawerOpen;
125 const leftMarginStyles = drawerAlwaysVisible ? {
126 width: "calc(100% - ".concat(drawerWidth, "px)"),
127 marginLeft: "".concat(drawerWidth, "px")
128 } : {
129 width: '100%'
130 };
131
132 if (showShield || preventScroll) {
133 document.body.classList.add('overflow-hidden');
134 } else {
135 document.body.classList.remove('overflow-hidden');
136 }
137
138 const drawerHeaderHeightPx = (drawerAlwaysVisible ? 80 : 60) + 'px';
139 const logoClasses = (0, _classnames.default)({
140 pointer: logoHref || logoOnClick
141 });
142 return (0, _preact.h)("div", _extends({
143 className: "bg-near-white dark-blue sans-serif min-vh-100"
144 }, rest), statusBarContent && (0, _preact.h)("div", {
145 className: "sticky no-print top-0 bg-light-gray z-1 shadow-1",
146 style: leftMarginStyles
147 }, statusBarContent), drawerEnabled && (0, _preact.h)(_drawer.Drawer, {
148 "aria-hidden": floatingDrawerHidden,
149 className: useFloatingDrawer ? 'z-4 transition' : '',
150 style: {
151 width: "".concat(drawerWidth, "px"),
152 transform: floatingDrawerHidden ? "translateX(".concat(-drawerWidth, "px)") : null
153 }
154 }, (0, _preact.h)("div", {
155 className: (0, _classnames.default)('absolute left-0 bg-dark-blue z-1 top-0 pa2 pa3-l', {
156 'shadow-1': drawerScrolledDown
157 }),
158 style: {
159 width: "".concat(drawerWidth, "px"),
160 height: drawerHeaderHeightPx
161 }
162 }, (0, _preact.h)(_envTag.default, {
163 env: env
164 }), screenIsWide && (0, _preact.h)("a", {
165 className: (0, _classnames.default)('db link white', logoClasses),
166 href: logoHref,
167 onClick: logoOnClick
168 }, (0, _preact.h)(_logo.LogoDark, null)), !screenIsWide && (0, _preact.h)("div", {
169 className: "flex items-center justify-between"
170 }, (0, _preact.h)(_button.TapIconButton, {
171 icon: "close",
172 color: "white",
173 className: "flex-shrink-0",
174 onClick: e => {
175 e.preventDefault();
176 doCloseDrawer();
177 }
178 }), (0, _preact.h)("a", {
179 className: logoClasses,
180 href: logoHref,
181 onClick: logoOnClick
182 }, (0, _preact.h)(_logo.LogoTextOnly, {
183 className: "mh3",
184 style: {
185 paddingTop: '6px',
186 width: '168px'
187 }
188 })))), (0, _preact.h)(DrawerContentWrapper, {
189 scrolledDown: drawerScrolledDown,
190 updateScrolledDown: this.updateScrolledDown,
191 style: {
192 paddingTop: drawerHeaderHeightPx,
193 paddingBottom: '120px'
194 }
195 }, drawerContent)), showShield && (0, _preact.h)(_shield.Shield, {
196 className: "z-3 dn-l",
197 onClick: () => doCloseDrawer && doCloseDrawer()
198 }), (0, _preact.h)("main", {
199 style: leftMarginStyles,
200 className: "bg-nearly-white overflow-x-hidden"
201 }, mainContent, hideFooter !== true && (0, _preact.h)(_footer.Footer, {
202 version: version,
203 extra: extraFooterContent
204 })), extraContent);
205 }
206
207}
208
209exports.AppLayout = AppLayout;
\No newline at end of file