next/lib/client/storyFormSchema.ts

108 lines
2.8 KiB
TypeScript

import * as yup from "yup";
import { FormChapter, FormStory } from "./types/form/story";
const emptySummary = "Summary cannot be blank";
const emptyChapterTitle = "Chapter title cannot be blank.";
const blankTitle = "Title cannot be blank.";
export const cs = yup.object<FormChapter>().shape({
chapterTitle: yup
.string()
.ensure()
.min(1, emptyChapterTitle)
.trim(emptyChapterTitle)
.required(emptyChapterTitle),
summary: yup.string().ensure().min(10, emptySummary).required(emptySummary),
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
file: yup.mixed().when(
"pot",
([pot], schema) => {
return pot === "upload"
? yup.string().ensure().trim().required("file name required")
: /* .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, blankTitle).required(blankTitle),
chapters: yup
.array()
.min(1, "There must be at least one chapter.")
.of(cs)
.ensure(),
completed: yup.boolean().oneOf([true, false]),
});