mirror of
https://github.com/StepanovPlaton/torrent_frontend.git
synced 2026-04-03 20:30:48 +04:00
Add audiobooks
This commit is contained in:
43
src/entities/item/audiobook/schemas/audiobookCard.ts
Normal file
43
src/entities/item/audiobook/schemas/audiobookCard.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { z } from "zod";
|
||||
import { TypesOfItems } from "../../types";
|
||||
|
||||
export const audiobookCardBaseSchema = z.object({
|
||||
title: z.string().min(3, "Слишком короткое название"),
|
||||
cover: z.string().optional().nullable(),
|
||||
description: z.string().optional().nullable(),
|
||||
author: z.string().optional().nullable(),
|
||||
|
||||
// Добавляем к каждой аудиокниге поле, которое
|
||||
// показывает, что item является аудиокнигой
|
||||
type: z
|
||||
.any()
|
||||
.optional()
|
||||
.transform(() => TypesOfItems.audiobook),
|
||||
});
|
||||
|
||||
export const audiobookCardSchema = audiobookCardBaseSchema.merge(
|
||||
z.object({
|
||||
id: z.number().positive(),
|
||||
})
|
||||
);
|
||||
export type AudiobookCardType = z.infer<typeof audiobookCardSchema>;
|
||||
|
||||
export const isAudiobookCardStrict = (a: any): a is AudiobookCardType => {
|
||||
return audiobookCardSchema.safeParse(a).success;
|
||||
};
|
||||
|
||||
export const audiobookCardsSchema = z.array(z.any()).transform((a) => {
|
||||
const cards: AudiobookCardType[] = [];
|
||||
a.forEach((e) => {
|
||||
if (isAudiobookCardStrict(e)) cards.push(audiobookCardSchema.parse(e));
|
||||
else console.error("AudiobookCard parse error - ", e);
|
||||
});
|
||||
return cards;
|
||||
});
|
||||
|
||||
export const isAudiobook = (a: any): a is AudiobookCardType => {
|
||||
return (
|
||||
audiobookCardBaseSchema.safeParse(a).success &&
|
||||
(a as AudiobookCardType).type === TypesOfItems.audiobook
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user