Files

84 lines
2.3 KiB
TypeScript

import { apiRequest } from '../services/api-request';
import {
legacyWorksheet,
memberStats,
type MemberPage,
} from '../services/member-api';
import tracker from './tracker';
export interface FavoriteRecord {
_id: string;
worksheetId: string;
createdAt: string;
worksheet?: {
_id: string;
title: string;
subtitle: string;
category: string;
subcategory: string;
path: string;
ageMin: number;
ageMax: number;
difficulty: number;
previewImg: string;
tags: string[];
} | null;
}
/** 收藏操作使用新后端当前账户;调用失败不能向其他用户补发。 */
export async function addFavorite(worksheetId: string): Promise<boolean> {
try {
await apiRequest(`/me/favorites/${encodeURIComponent(worksheetId)}`, {
method: 'PUT',
});
tracker.reportFavorite(currentRoute(), worksheetId, true);
return true;
} catch {
return false;
}
}
export async function removeFavorite(worksheetId: string): Promise<boolean> {
try {
await apiRequest(`/me/favorites/${encodeURIComponent(worksheetId)}`, {
method: 'DELETE',
});
tracker.reportFavorite(currentRoute(), worksheetId, false);
return true;
} catch {
return false;
}
}
export async function getFavoriteList(
page = 1,
pageSize = 20,
): Promise<FavoriteRecord[]> {
const result = await apiRequest<MemberPage>('/me/favorites', {
data: { page, pageSize },
});
return result.items.map((row) => ({
...row,
_id: row.id,
worksheet: legacyWorksheet(row.worksheet),
}));
}
export async function getFavoriteCount(): Promise<number> {
return (await memberStats()).favoriteCount;
}
export async function batchCheckFavorited(
worksheetIds: string[],
): Promise<Record<string, boolean>> {
if (!worksheetIds.length) return {};
return apiRequest('/me/favorites/check', {
method: 'POST',
data: { worksheetIds },
});
}
export async function checkFavorited(worksheetId: string): Promise<boolean> {
return (await batchCheckFavorited([worksheetId]))[worksheetId] === true;
}
function currentRoute() {
const pages = getCurrentPages();
return pages[pages.length - 1]?.route || '';
}