import * as yup from "yup"; import { FormChapter } 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().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!"), content: 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]; } // 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]), });