forked from google/santa-tracker-web
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathloader.js
More file actions
86 lines (72 loc) · 2.71 KB
/
loader.js
File metadata and controls
86 lines (72 loc) · 2.71 KB
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
81
82
83
84
85
86
/**
* Copyright 2020 Google LLC
*
* Licensed 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 * as config from './config.js';
import {join} from '../lib/url.js';
import scenes from '../strings/scenes.js';
import {_msg} from '../magic.js';
// TODO(samthor): Load support HTML if required.
const lang = document.documentElement.lang;
const trailingIndex = `index${lang ? `_${lang}` : ''}.html`;
function urlFor(sceneName, fallback, route, hash) {
if (!sceneName) {
return null;
}
if (hash && hash[0] !== '#') {
hash = '#' + hash;
}
const params = new URLSearchParams();
if (fallback) {
params.set('fallback', '1');
}
params.set('route', route);
params.set('referrer', window.location.origin + window.location.pathname);
const p = `?${params.toString()}`;
return join(import.meta.url, '../../scenes', sceneName, trailingIndex) + p + (hash || '');
}
export function buildLoader(loadMethod, fallback=false) {
let activeRoute = undefined;
let activeSceneName = undefined;
const load = (route, data, hash) => {
// Optionally redirect; used to hide press/educators page
const redirectRoute = config.redirectRoute(route);
if (redirectRoute !== undefined) {
route = redirectRoute;
}
if (route === 'index') {
route = '';
}
activeRoute = route; // this is the chosen open route
const sceneName = config.sceneForRoute(route, fallback);
if (activeSceneName === sceneName) {
return redirectRoute; // loaded (locked or valid), do nothing
}
// Load the scene HTML but include the ID of the route. Useful for videos.
const url = urlFor(sceneName, fallback, route, hash);
activeSceneName = sceneName;
window.dispatchEvent(new CustomEvent('loader-route', {detail: route}));
ga('set', 'page', `/${route}`);
ga('send', 'pageview');
const locked = (activeSceneName === null);
loadMethod(url, {route, data, locked}).then((success) => {
document.title = scenes[route] || _msg`santatracker`;
});
return redirectRoute;
};
// If we see a config update, always try to reload the current scene (in case it locks or unlocks
// or the server redirects it to another scene).
config.listen(() => load(activeRoute));
return load;
};