feat(client-side): create yup schema for story form and chapter sub-forms
This commit is contained in:
		
							parent
							
								
									c9574dfc29
								
							
						
					
					
						commit
						f3a3240134
					
				
							
								
								
									
										107
									
								
								lib/client/storyFormSchema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								lib/client/storyFormSchema.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| 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]), | ||||
| }); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user