From 1c2dacfa25016846e7f09825d68a8a6971b956e7 Mon Sep 17 00:00:00 2001 From: EnzoVezzaro Date: Wed, 21 Sep 2022 10:29:38 -0400 Subject: [PATCH] dynamic validation on name field WIP: looking at another solution to dynamically validate all the fields instead of one by one --- src/components/Publish/_validation.ts | 81 +++++++++++++-------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/src/components/Publish/_validation.ts b/src/components/Publish/_validation.ts index 0f7c1ee95..732a9fa82 100644 --- a/src/components/Publish/_validation.ts +++ b/src/components/Publish/_validation.ts @@ -6,48 +6,43 @@ import { retrieveShaclSchema } from '@utils/aquarius' // TODO: conditional validation // e.g. when algo is selected, Docker image is required // hint, hint: https://github.com/jquense/yup#mixedwhenkeys-string--arraystring-builder-object--value-schema-schema-schema - -const getValidationMetadata = async () => { - const { metadata } = await retrieveShaclSchema() - console.log(metadata) - - return { - type: Yup.string() - .matches(/dataset|algorithm/g, { excludeEmptyString: true }) - .required('Required'), - name: Yup.string() - .min(4, (param) => `Title must be at least ${param.min} characters`) - .max( - metadata.name.maxLength, - (param) => `Description must have maximum ${param.max} characters` - ) - .required('Required'), - description: Yup.string() - .min( - 10, - (param) => `Description must be at least ${param.min} characters` - ) - .max( - metadata.description.maxLength, - (param) => `Description must have maximum ${param.max} characters` - ) - .required('Required'), - author: Yup.string() - .max( - metadata.author.maxLength, - (param) => `Author must have maximum ${param.max} characters` - ) - .required('Required'), - tags: Yup.string() - .max( - metadata.tags.maxLength, - (param) => `Tags must have maximum ${param.max} characters` - ) - .nullable(), - termsAndConditions: Yup.boolean() - .required('Required') - .isTrue('Please agree to the Terms and Conditions.') - } +const validationMetadata = { + type: Yup.string() + .matches(/dataset|algorithm/g, { excludeEmptyString: true }) + .required('Required'), + name: Yup.string() + .test(async function (value) { + // Use function + try { + const schema = await retrieveShaclSchema() + const fieldValidation = schema.metadata.name + if (value.length < 4) { + // TODO: replace hardcoded with resp from schacl when integrated + return this.createError({ + message: `Name must be at least ${4} characters` + }) + } else if (value.length > fieldValidation.maxLength) { + return this.createError({ + message: `Name must have maximum ${fieldValidation.maxLength} characters` + }) + } else { + return value + } + } catch (e) { + console.log(e) + } + }) + .required('Required'), + description: Yup.string() + .min(10, (param) => `Description must be at least ${param.min} characters`) + .max( + 5000, + (param) => `Description must have maximum ${param.max} characters` + ) + .required('Required'), + author: Yup.string().required('Required'), + tags: Yup.string().nullable(), + termsAndConditions: Yup.boolean() } const validationService = { @@ -114,7 +109,7 @@ export const validationSchema: Yup.SchemaOf = Yup.object().shape({ chainId: Yup.number().required('Required'), accountId: Yup.string().required('Required') }), - metadata: Yup.object().shape(getValidationMetadata()), + metadata: Yup.object().shape(validationMetadata), services: Yup.array().of(Yup.object().shape(validationService)), pricing: Yup.object().shape(validationPricing) })