- useFavorites: 收藏管理 - useHistory: 播放历史 - useSettings: 用户设置 - useChannels: 频道数据获取和解析 - useGroups: 分组管理 - useChannelFilter: 频道过滤 - useDates: 日期列表 - usePrograms: 节目单管理 - useEvent: 键盘事件
77 lines
1.6 KiB
JavaScript
77 lines
1.6 KiB
JavaScript
import { ref, onMounted } from "vue";
|
||
import { useStorage } from "./useStorage.js";
|
||
|
||
const STORAGE_KEY = "favorites_data";
|
||
|
||
// 全局状态
|
||
const favorites = ref(new Set());
|
||
let initialized = false;
|
||
let loadPromise = null;
|
||
|
||
export function useFavorites() {
|
||
const storage = useStorage();
|
||
|
||
// 加载收藏(从 useStorage)
|
||
const loadFavorites = async () => {
|
||
if (loadPromise) return loadPromise;
|
||
|
||
loadPromise = (async () => {
|
||
try {
|
||
const saved = await storage.get(STORAGE_KEY);
|
||
if (saved) {
|
||
favorites.value = new Set(saved);
|
||
}
|
||
} catch (e) {
|
||
console.error("加载收藏失败:", e);
|
||
}
|
||
initialized = true;
|
||
})();
|
||
|
||
return loadPromise;
|
||
};
|
||
|
||
// 保存收藏(到 useStorage)
|
||
const saveFavorites = async () => {
|
||
try {
|
||
await storage.set(STORAGE_KEY, [...favorites.value]);
|
||
} catch (e) {
|
||
console.error("保存收藏失败:", e);
|
||
}
|
||
};
|
||
|
||
// 切换收藏状态
|
||
const toggleFavorite = async (channelId) => {
|
||
if (!channelId) return;
|
||
if (favorites.value.has(channelId)) {
|
||
favorites.value.delete(channelId);
|
||
} else {
|
||
favorites.value.add(channelId);
|
||
}
|
||
await saveFavorites();
|
||
};
|
||
|
||
// 检查是否已收藏
|
||
const isFavorite = (channelId) => {
|
||
return favorites.value.has(channelId);
|
||
};
|
||
|
||
// 获取所有收藏
|
||
const getFavorites = () => {
|
||
return [...favorites.value];
|
||
};
|
||
|
||
// 初始化加载
|
||
onMounted(() => {
|
||
if (!initialized) {
|
||
loadFavorites();
|
||
}
|
||
});
|
||
|
||
return {
|
||
favorites,
|
||
toggleFavorite,
|
||
isFavorite,
|
||
getFavorites,
|
||
};
|
||
}
|