Skip to content

Commit c988098

Browse files
committed
refactor: streamline resource loading and improve font handling in dashboard and index pages
1 parent 9c3cd6d commit c988098

4 files changed

Lines changed: 136 additions & 57 deletions

File tree

dashboard.html

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,14 @@
1818
<link rel="apple-touch-icon" sizes="192x192" href="https://ulems.my.id/assets/images/icon-192x192.png">
1919
<link rel="icon" type="image/x-icon" href="https://ulems.my.id/assets/favicon.ico">
2020

21-
<!-- Preconnect CDN -->
21+
<!-- Preconnect + Preload CDN -->
2222
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
23-
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
24-
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
2523
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin="anonymous">
26-
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="anonymous">
27-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
28-
29-
<!-- Preload Resources -->
30-
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Josefin+Sans&display=swap" as="style">
3124
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" integrity="sha256-zRgmWB5PK4CvTx4FiXsxbHaYRBBjz/rvu97sOC7kzXI=" crossorigin="anonymous" as="style">
32-
<link rel="preload" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css" integrity="sha256-dABdfBfUoC8vJUBOwGVdm8L9qlMWaHTIfXt+7GnZCIo=" crossorigin="anonymous" as="style">
33-
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js" integrity="sha256-NfRUfZNkERrKSFA0c1a8VmCplPDYtpTYj5lQmKe1R/o=" crossorigin="anonymous" as="script">
34-
35-
<!-- Font -->
36-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Josefin+Sans&display=swap">
3725

38-
<!-- Dependencies CSS -->
26+
<!-- Dependencies -->
3927
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" integrity="sha256-zRgmWB5PK4CvTx4FiXsxbHaYRBBjz/rvu97sOC7kzXI=" crossorigin="anonymous">
40-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css" integrity="sha256-dABdfBfUoC8vJUBOwGVdm8L9qlMWaHTIfXt+7GnZCIo=" crossorigin="anonymous">
4128
<link rel="stylesheet" href="./css/admin.css">
42-
43-
<!-- Dependencies JS -->
44-
<script defer src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js" integrity="sha256-NfRUfZNkERrKSFA0c1a8VmCplPDYtpTYj5lQmKe1R/o=" crossorigin="anonymous"></script>
4529
<script src="./dist/admin.js"></script>
4630
</head>
4731

index.html

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,34 +40,14 @@
4040
<link rel="apple-touch-icon" sizes="192x192" href="https://ulems.my.id/assets/images/icon-192x192.png">
4141
<link rel="icon" type="image/x-icon" href="https://ulems.my.id/assets/favicon.ico">
4242

43-
<!-- Preconnect CDN -->
43+
<!-- Preconnect + Preload CDN -->
4444
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net">
45-
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
46-
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
4745
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin="anonymous">
48-
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="anonymous">
49-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
50-
51-
<!-- Preload Resources -->
52-
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Josefin+Sans&display=swap" as="style">
53-
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Sacramento&display=swap" as="style">
54-
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic&display=swap" as="style">
5546
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" integrity="sha256-zRgmWB5PK4CvTx4FiXsxbHaYRBBjz/rvu97sOC7kzXI=" crossorigin="anonymous" as="style">
56-
<link rel="preload" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css" integrity="sha256-dABdfBfUoC8vJUBOwGVdm8L9qlMWaHTIfXt+7GnZCIo=" crossorigin="anonymous" as="style">
57-
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js" integrity="sha256-NfRUfZNkERrKSFA0c1a8VmCplPDYtpTYj5lQmKe1R/o=" crossorigin="anonymous" as="script">
58-
59-
<!-- Fonts -->
60-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Josefin+Sans&display=swap">
61-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sacramento&display=swap">
62-
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic&display=swap">
6347

64-
<!-- Dependencies CSS -->
48+
<!-- Dependencies -->
6549
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" integrity="sha256-zRgmWB5PK4CvTx4FiXsxbHaYRBBjz/rvu97sOC7kzXI=" crossorigin="anonymous">
66-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css" integrity="sha256-dABdfBfUoC8vJUBOwGVdm8L9qlMWaHTIfXt+7GnZCIo=" crossorigin="anonymous">
6750
<link rel="stylesheet" href="./css/guest.css">
68-
69-
<!-- Dependencies JS -->
70-
<script defer src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js" integrity="sha256-NfRUfZNkERrKSFA0c1a8VmCplPDYtpTYj5lQmKe1R/o=" crossorigin="anonymous"></script>
7151
<script src="./dist/guest.js"></script>
7252
</head>
7353

js/app/admin/admin.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { auth } from './auth.js';
22
import { navbar } from './navbar.js';
33
import { util } from '../../common/util.js';
4+
import { loader } from '../../libs/loader.js';
45
import { dto } from '../../connection/dto.js';
56
import { theme } from '../../common/theme.js';
67
import { lang } from '../../common/language.js';
@@ -326,7 +327,9 @@ export const admin = (() => {
326327
window.history.replaceState({}, document.title, window.location.pathname);
327328
}
328329

329-
session.isValid() ? getUserStats() : auth.clearSession();
330+
loader({ aos: false, confetti: false, additionalFont: false }).then(() => {
331+
session.isValid() ? getUserStats() : auth.clearSession();
332+
});
330333
};
331334

332335
/**

js/libs/loader.js

Lines changed: 128 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
import { cache } from '../connection/cache.js';
22

3-
const urlAosCss = 'https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css';
4-
const urlAosJs = 'https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js';
5-
const urlConfetti = 'https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.3/dist/confetti.browser.js';
6-
73
/**
84
* @param {ReturnType<typeof cache>} c
95
* @returns {Promise<void>}
106
*/
117
const loadAOS = (c) => {
128

9+
const urlCss = 'https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css';
10+
const urlJs = 'https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js';
11+
1312
/**
1413
* @returns {Promise<void>}
1514
*/
16-
const loadCss = () => c.get(urlAosCss).then((uri) => new Promise((res, rej) => {
15+
const loadCss = () => c.get(urlCss).then((uri) => new Promise((res, rej) => {
1716
const link = document.createElement('link');
1817
link.onload = res;
1918
link.onerror = rej;
@@ -26,7 +25,7 @@ const loadAOS = (c) => {
2625
/**
2726
* @returns {Promise<void>}
2827
*/
29-
const loadJs = () => c.get(urlAosJs).then((uri) => new Promise((res, rej) => {
28+
const loadJs = () => c.get(urlJs).then((uri) => new Promise((res, rej) => {
3029
const sc = document.createElement('script');
3130
sc.onload = res;
3231
sc.onerror = rej;
@@ -48,28 +47,137 @@ const loadAOS = (c) => {
4847
* @param {ReturnType<typeof cache>} c
4948
* @returns {Promise<void>}
5049
*/
51-
const loadConfetti = (c) => c.get(urlConfetti).then((uri) => new Promise((res, rej) => {
52-
const sc = document.createElement('script');
53-
sc.onerror = rej;
54-
sc.onload = () => {
55-
typeof window.confetti === 'undefined' ? rej(new Error('Confetti library failed to load')) : res();
56-
};
50+
const loadConfetti = (c) => {
51+
const url = 'https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.3/dist/confetti.browser.js';
52+
53+
return c.get(url).then((uri) => new Promise((res, rej) => {
54+
const sc = document.createElement('script');
55+
sc.onerror = rej;
56+
sc.onload = () => {
57+
typeof window.confetti === 'undefined' ? rej(new Error('Confetti library failed to load')) : res();
58+
};
59+
60+
sc.src = uri;
61+
document.head.appendChild(sc);
62+
}));
63+
};
64+
65+
/**
66+
* @param {ReturnType<typeof cache>} c
67+
* @returns {Promise<void>}
68+
*/
69+
const loadBootstrap = (c) => {
70+
const url = 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js';
71+
72+
return c.get(url).then((uri) => new Promise((res, rej) => {
73+
const sc = document.createElement('script');
74+
sc.onerror = rej;
75+
sc.onload = () => {
76+
typeof window.bootstrap === 'undefined' ? rej(new Error('Bootstrap library failed to load')) : res();
77+
};
78+
79+
sc.src = uri;
80+
document.head.appendChild(sc);
81+
}));
82+
};
83+
84+
/**
85+
* @param {ReturnType<typeof cache>} c
86+
* @returns {Promise<void>}
87+
*/
88+
const loadFont = (c) => {
89+
90+
const font = 'https://fonts.googleapis.com/css2?family=Josefin+Sans&display=swap';
91+
92+
return c.get(font).then((uri) => new Promise((res, rej) => {
93+
const link = document.createElement('link');
94+
link.onload = res;
95+
link.onerror = rej;
96+
97+
link.rel = 'stylesheet';
98+
link.href = uri;
99+
document.head.appendChild(link);
100+
}));
101+
};
102+
103+
/**
104+
* @param {ReturnType<typeof cache>} c
105+
* @returns {Promise<void>}
106+
*/
107+
const loadAdditionalFont = (c) => {
108+
109+
const fonts = [
110+
'https://fonts.googleapis.com/css2?family=Sacramento&display=swap',
111+
'https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic&display=swap',
112+
];
113+
114+
/**
115+
* @param {string} font
116+
* @returns {Promise<void>}
117+
*/
118+
const loadCss = (font) => c.get(font).then((uri) => new Promise((res, rej) => {
119+
const link = document.createElement('link');
120+
link.onload = res;
121+
link.onerror = rej;
122+
123+
link.rel = 'stylesheet';
124+
link.href = uri;
125+
document.head.appendChild(link);
126+
}));
127+
128+
return Promise.all(fonts.map(loadCss));
129+
};
130+
131+
/**
132+
* @param {ReturnType<typeof cache>} c
133+
* @returns {Promise<void>}
134+
*/
135+
const loadIcon = (c) => {
136+
137+
const url = 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.0.0';
138+
139+
return c.get(`${url}/css/all.min.css`)
140+
.then(window.fetch)
141+
.then((r) => r.text())
142+
.then((txt) => {
143+
const urls = [...new Set([...txt.matchAll(/url\(["']?([^"')]+)["']?\)/g)])];
144+
145+
return Promise.all(urls.map((m) => {
146+
const orig = m[0];
147+
const rel = m[1].replace('..', '');
148+
149+
return c.get(url + rel).then((abs) => ({ orig, abs }));
150+
})).then((res) => {
151+
for (const { orig, abs } of res) {
152+
txt = txt.replaceAll(orig, `url(${abs})`);
153+
}
57154

58-
sc.src = uri;
59-
document.head.appendChild(sc);
60-
}));
155+
return txt;
156+
});
157+
})
158+
.then((txt) => new Promise((res, rej) => {
159+
const link = document.createElement('link');
160+
link.onload = res;
161+
link.onerror = rej;
162+
163+
link.rel = 'stylesheet';
164+
link.href = URL.createObjectURL(new Blob([txt]));
165+
document.head.appendChild(link);
166+
}));
167+
};
61168

62169
/**
63170
* @param {Object} [opt]
64171
* @param {boolean} [opt.aos=true] - Load AOS library
65172
* @param {boolean} [opt.confetti=true] - Load Confetti library
173+
* @param {boolean} [opt.additionalFont=true] - Load Additional Font
66174
* @returns {Promise<void>}
67175
*/
68176
export const loader = (opt = {}) => {
69177
const c = cache('libs');
70178

71179
return c.open().then(() => {
72-
const promises = [];
180+
const promises = [loadFont(c), loadIcon(c), loadBootstrap(c)];
73181

74182
if (opt?.aos ?? true) {
75183
promises.push(loadAOS(c));
@@ -79,6 +187,10 @@ export const loader = (opt = {}) => {
79187
promises.push(loadConfetti(c));
80188
}
81189

190+
if (opt?.additionalFont ?? true) {
191+
promises.push(loadAdditionalFont(c));
192+
}
193+
82194
return Promise.all(promises);
83195
});
84196
};

0 commit comments

Comments
 (0)