84 lines
2.3 KiB
TypeScript
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 || '';
|
|
}
|