summaryrefslogtreecommitdiff
path: root/public/static/scripts/favorites.js
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-06-23 19:34:35 +0500
committerilotterytea <iltsu@alright.party>2025-06-23 19:34:35 +0500
commit7b50348c8c0366f0ae83ffcf9a0caea9c2b0498a (patch)
tree6940bbd8cff094468a9dfd0eac998ab33e5b2106 /public/static/scripts/favorites.js
parent2762007f636d5e9c2abb186a7f857c2491db3dd5 (diff)
feat: favorite button
Diffstat (limited to 'public/static/scripts/favorites.js')
-rw-r--r--public/static/scripts/favorites.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/public/static/scripts/favorites.js b/public/static/scripts/favorites.js
new file mode 100644
index 0000000..0986d63
--- /dev/null
+++ b/public/static/scripts/favorites.js
@@ -0,0 +1,93 @@
+function saveFavoriteFiles(files) {
+ localStorage.setItem('favorite-files', JSON.stringify(files));
+}
+
+function getFavoriteFiles() {
+ const files = JSON.parse(localStorage.getItem('favorite-files') ?? '[]');
+ return files;
+}
+
+function addFavoriteFile(f) {
+ if (isFavoriteFile(f)) {
+ return;
+ }
+
+ const files = getFavoriteFiles();
+ files.push(f);
+ saveFavoriteFiles(files);
+}
+
+function removeFavoriteFile(f) {
+ if (!isFavoriteFile(f)) {
+ return;
+ }
+
+ let files = getFavoriteFiles();
+ files = files.filter((x) => x.id != f.id);
+ saveFavoriteFiles(files);
+}
+
+function isFavoriteFile(f) {
+ const files = getFavoriteFiles();
+ return files.find((x) => x.id == f.id) != undefined;
+}
+
+window.addEventListener('load', () => {
+ const tabs = document.getElementById('file-tab-buttons');
+ if (tabs != null) {
+ const addIcon = document.createElement('img');
+ addIcon.src = '/static/img/icons/star-gray.png';
+ addIcon.alt = 'Favorite';
+
+ const delIcon = document.createElement('img');
+ delIcon.src = '/static/img/icons/star.png';
+ delIcon.alt = 'Unfavorite';
+
+ const btn = document.createElement('button');
+
+ const file = {
+ id: document.getElementById('file-id').innerText,
+ mime: document.getElementById('file-mime').innerText,
+ extension: document.getElementById('file-extension').innerText,
+ size: document.getElementById('file-size').innerText
+ };
+
+ btn.addEventListener('click', (e) => {
+ if (isFavoriteFile(file)) {
+ removeFavoriteFile(file);
+ } else {
+ addFavoriteFile(file);
+ }
+
+ btn.innerHTML = '';
+
+ const isf = isFavoriteFile(file);
+
+ btn.appendChild(isf ? delIcon : addIcon);
+ btn.title = isf ? 'Unfavorite this file' : 'Favorite file';
+ });
+
+ const isf = isFavoriteFile(file);
+
+ btn.appendChild(isf ? delIcon : addIcon);
+ btn.title = isf ? 'Unfavorite this file' : 'Favorite file';
+
+ tabs.appendChild(btn);
+ }
+
+ const files = document.getElementById('favorite-files');
+ if (files != null) {
+ const data = getFavoriteFiles();
+ if (data.length > 0) {
+ files.parentElement.style.display = 'flex';
+ files.innerHTML = '';
+ enableTab('favorite-files');
+ } else {
+ disableTab('favorite-files');
+ }
+ data.forEach((x) => {
+ const html = addUploadedFile(x);
+ files.innerHTML += html;
+ });
+ }
+}); \ No newline at end of file