/** * 덱 즐겨찾기 (localStorage, share_code 기준) */ (function initDeckFavorites() { const STORAGE_KEY = 'uadeck.deckFavorites'; /** * @returns {Set} */ 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} 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 }; })();