next/lib/client/chapterSchema.ts

56 lines
2.3 KiB
TypeScript
Raw Normal View History

import * as yup from "yup";
import { FormChapter, FormStory } from "./types/FormStory";
export const cs = yup.object<FormChapter>().shape({
chapterTitle: yup.string().ensure().min(1).trim().required("Chapter title cannot be blank."),
summary: yup.string().ensure().min(10).required("Summary cannot be blank"),
notes: yup.string().ensure(),
bands: yup.array().ensure().of(yup.number()).min(1, "One or more bands must be selected."),
characters: yup.array().ensure().min(1, "One or more characters must be selected"),
relationships: yup.array().ensure().of(
yup.array().ensure().of(
yup.string()
).min(2, "Pairings must have at least two characters!").max(3, "Pairings can have no more than three characters!")
),
nsfw: yup.boolean().oneOf([true, false]),
loggedInOnly: yup.boolean()
.when("nsfw", ([nsfw], schema) => {
return nsfw ? schema.oneOf([true], "If your story contains adult content, you MUST restrict the ability to read it to logged-in users only. Failure to comply may result in a takedown.") : schema.oneOf([true, false])
}),
hidden: yup.boolean().oneOf([true, false]),
pot: yup.string().oneOf(["pasteOrType", "upload"]).required("Story content is required!"),
storytext: yup.string().when("pot",
([pot], schema) => {
return pot === "pasteOrType" ? schema.test("numWords", "Story must be at least 50 words",
(value:any, context) => {
return value?.split(/\W+/).length > 50 || false
}).required("Story text can't be blank!") : schema.min(0)
}),
// hello Celeste
docFile: yup.mixed().when("pot", ([pot], schema) => {
return pot === "upload" ? yup.mixed().test("exists", "You need to upload a file!", (value) => {
// console.debug("file: ", value)
return !!value;
}).test("fileType", "Supported files are *.docx and *.doc", (value) => {
let ext;
if(typeof value == "string") {
ext = value?.split(".").reverse()[0]
} else {
ext = (value as File)?.name?.split(".").reverse()[0]
}
// console.log(ext)
let reg = /(docx|doc)$/i
return reg.test(ext)
}) : yup.mixed()
} /* {
is: "upload",
then: ,
otherwise: yup.mixed()
} */)
})
export const storySchema = yup.object().shape({
title: yup.string().ensure().min(5).required("Title cannot be blank"),
chapters: yup.array().ensure().of(cs),
completed: yup.boolean().oneOf([true, false])
})