즐겨찾기·홀드 미리보기·페이지 도움말·3개국어 번역을 추가하고, 덱 저장 시 썸네일을 1200px로 통일하며 Nginx/API 업로드 제한을 상향했다. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
1.4 KiB
JavaScript
61 lines
1.4 KiB
JavaScript
/**
|
|
* 덱 즐겨찾기 (localStorage, share_code 기준)
|
|
*/
|
|
(function initDeckFavorites() {
|
|
const STORAGE_KEY = 'uadeck.deckFavorites';
|
|
|
|
/**
|
|
* @returns {Set<string>}
|
|
*/
|
|
function readSet() {
|
|
try {
|
|
const raw = localStorage.getItem(STORAGE_KEY);
|
|
const list = raw ? JSON.parse(raw) : [];
|
|
return new Set(Array.isArray(list) ? list : []);
|
|
} catch {
|
|
return new Set();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {Set<string>} set
|
|
*/
|
|
function writeSet(set) {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify([...set]));
|
|
}
|
|
|
|
/**
|
|
* @param {string} shareCode
|
|
* @returns {boolean}
|
|
*/
|
|
function isFavorite(shareCode) {
|
|
if (!shareCode) return false;
|
|
return readSet().has(shareCode);
|
|
}
|
|
|
|
/**
|
|
* @param {string} shareCode
|
|
* @returns {boolean} 토글 후 즐겨찾기 여부
|
|
*/
|
|
function toggle(shareCode) {
|
|
if (!shareCode) return false;
|
|
const set = readSet();
|
|
if (set.has(shareCode)) {
|
|
set.delete(shareCode);
|
|
} else {
|
|
set.add(shareCode);
|
|
}
|
|
writeSet(set);
|
|
return set.has(shareCode);
|
|
}
|
|
|
|
/**
|
|
* @returns {string[]}
|
|
*/
|
|
function getAll() {
|
|
return [...readSet()];
|
|
}
|
|
|
|
window.UaDeckFavorites = { isFavorite, toggle, getAll };
|
|
})();
|