90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
// SPDX-FileCopyrightText: 2023 Marlon W (Mawoka)
|
|
//
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
// skipcq: JS-C1003
|
|
import * as yup from 'yup';
|
|
|
|
export const ABCDQuestionSchema = yup
|
|
.array()
|
|
.of(
|
|
yup.object({
|
|
right: yup.boolean().required(),
|
|
answer: yup.string().required('You need an answer')
|
|
})
|
|
)
|
|
.min(2, 'You need at least 2 answers')
|
|
.max(16, "You can't have more than 16 answers");
|
|
|
|
export const VotingQuestionSchema = yup
|
|
.array()
|
|
.of(
|
|
yup.object({
|
|
answer: yup.string().required('You need an answer'),
|
|
image: yup.string().optional().nullable()
|
|
})
|
|
)
|
|
.min(2, 'You need at least 2 answers')
|
|
.max(16, "You can't have more than 16 answers");
|
|
|
|
export const RangeQuestionSchema = yup.object({
|
|
min: yup.number(),
|
|
max: yup.number(),
|
|
min_correct: yup.number(),
|
|
max_correct: yup.number()
|
|
});
|
|
|
|
export const TextQuestionSchema = yup
|
|
.array()
|
|
.of(
|
|
yup.object({
|
|
case_sensitive: yup.boolean().required(),
|
|
answer: yup.string().required('You need an answer')
|
|
})
|
|
)
|
|
.min(1, 'You need at least 1 answer')
|
|
.max(16, "You can't have more than 16 answers");
|
|
|
|
export const dataSchema = yup.object({
|
|
public: yup.boolean().required(),
|
|
type: yup.string(),
|
|
title: yup
|
|
.string()
|
|
.required('A title is required')
|
|
.min(3, 'The title has to be longer than 3 characters')
|
|
.max(300, 'The title has to be shorter than 300 characters'),
|
|
description: yup
|
|
.string()
|
|
.required('The description is required!')
|
|
.min(3, 'The description has to be longer than 3 characters')
|
|
.max(500, 'The description has to be shorter than 500 characters'),
|
|
questions: yup
|
|
.array()
|
|
.of(
|
|
yup.object({
|
|
question: yup.string().required('A question-title is required').max(299),
|
|
time: yup.number().required().positive('The time has to be positive'),
|
|
image: yup.string().nullable().lowercase(),
|
|
answers: yup.lazy((v) => {
|
|
if (Array.isArray(v)) {
|
|
if (typeof v[0].right === 'boolean') {
|
|
return ABCDQuestionSchema;
|
|
} else if (typeof v[0].case_sensitive === 'boolean') {
|
|
return TextQuestionSchema;
|
|
} else if (v[0].id !== undefined) {
|
|
return VotingQuestionSchema;
|
|
} else if (v[0].answer !== undefined) {
|
|
return VotingQuestionSchema;
|
|
}
|
|
} else if (typeof v === 'string' || v instanceof String) {
|
|
return yup.string().required("The slide mustn't be empty").nullable();
|
|
} else {
|
|
return RangeQuestionSchema;
|
|
}
|
|
})
|
|
})
|
|
)
|
|
.min(1, 'You need at least one question')
|
|
.max(50, "You can't have more than 32 questions")
|
|
});
|