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