diff --git a/src/features/QualificationPage/features/TestPage/TestPage.tsx b/src/features/QualificationPage/features/TestPage/TestPage.tsx index 0c58685..60faedd 100644 --- a/src/features/QualificationPage/features/TestPage/TestPage.tsx +++ b/src/features/QualificationPage/features/TestPage/TestPage.tsx @@ -1,16 +1,20 @@ import { GetStaticPaths, GetStaticProps } from 'next'; +import { polishPlurals } from 'polish-plurals'; import { createClient, Qualification, Query, - QueryGenerateTestArgs, QueryQualificationArgs, Question, + Scalars, } from 'libs/graphql'; -import resolveHref from 'utils/resolveHref'; +import resolveAs from 'utils/resolveAs'; import { QUESTIONS } from 'config/app'; import { Route } from 'config/routing'; -import { QUERY_GENERATE_TEST, QUERY_QUALIFICATION } from './queries'; +import { + QUERY_GENERATE_TEST_SIMILAR_QUALIFICATIONS, + QUERY_QUALIFICATION, +} from './queries'; import Layout from 'common/Layout/Layout'; import SEO from 'common/SEO/SEO'; @@ -21,15 +25,20 @@ export type TestPageParams = { }; export interface TestPageProps { + qualification: Qualification; questions: Question[]; suggestions: Qualification[]; } -const TestPage = () => { +const TestPage = ({ questions, suggestions, qualification }: TestPageProps) => { + console.log(questions, suggestions, qualification); return ( - - elo + ); }; @@ -41,6 +50,12 @@ export const getStaticPaths: GetStaticPaths = async () => { }; }; +type QueryGenerateTestSimilarQualificationsArgs = { + limitTest: Scalars['Int']; + qualificationID: Scalars['ID']; + limitSuggestions: Scalars['Int']; +}; + export const getStaticProps: GetStaticProps< TestPageProps, TestPageParams @@ -48,28 +63,31 @@ export const getStaticProps: GetStaticProps< const props: TestPageProps = { suggestions: [], questions: [], + qualification: { + id: 0, + slug: '', + name: '', + code: '', + createdAt: new Date(0), + }, }; - if (!params) return { notFound: true, revalidate: 600, props }; + if (!params) return { notFound: true, revalidate: 600 }; const limit = parseInt(params.limit); const slug = params.slug.trim(); if ( - slug.length === 0 || isNaN(limit) || !QUESTIONS.some(numOfQuestions => numOfQuestions === limit) ) { return { props, redirect: { - destination: resolveHref( - '', - { - pathname: Route.TestPage, - query: { ...params, limit: QUESTIONS[QUESTIONS.length - 1] }, - }, - true - )[1], + destination: resolveAs({ + pathname: Route.TestPage, + query: { ...params, limit: QUESTIONS[QUESTIONS.length - 1] }, + }), }, + revalidate: 600, }; } @@ -82,21 +100,28 @@ export const getStaticProps: GetStaticProps< if (!qualification) { throw new Error('404'); } - const { generateTest } = await client.request< - Pick, - QueryGenerateTestArgs - >(QUERY_GENERATE_TEST, { limit, qualificationIDs: [qualification.id] }); + props.qualification = qualification; + const { generateTest, similarQualifications } = await client.request< + Pick, + QueryGenerateTestSimilarQualificationsArgs + >(QUERY_GENERATE_TEST_SIMILAR_QUALIFICATIONS, { + limitSuggestions: 6, + qualificationID: qualification.id, + limitTest: limit, + }); if (Array.isArray(generateTest)) { props.questions = generateTest; } + if (Array.isArray(similarQualifications.items)) { + props.suggestions = similarQualifications.items; + } + return { + props, + revalidate: 20, + }; } catch (e) { - return { notFound: true, revalidate: 600, props }; + return { notFound: true, revalidate: 600 }; } - - return { - props, - revalidate: 20, - }; }; export default TestPage; diff --git a/src/features/QualificationPage/features/TestPage/queries.ts b/src/features/QualificationPage/features/TestPage/queries.ts index d5afbf8..aa44f2e 100644 --- a/src/features/QualificationPage/features/TestPage/queries.ts +++ b/src/features/QualificationPage/features/TestPage/queries.ts @@ -12,9 +12,13 @@ export const QUERY_QUALIFICATION = gql` } `; -export const QUERY_GENERATE_TEST = gql` - query generateTest($limit: Int!, $qualificationIDs: [ID!]!) { - generateTest(limit: $limit, qualificationIDs: $qualificationIDs) { +export const QUERY_GENERATE_TEST_SIMILAR_QUALIFICATIONS = gql` + query generateTestAndGetSimilarQualifications( + $limitTest: Int! + $qualificationID: ID! + $limitSuggestions: Int! + ) { + generateTest(limit: $limitTest, qualificationIDs: [$qualificationID]) { id content image @@ -29,5 +33,15 @@ export const QUERY_GENERATE_TEST = gql` correctAnswer updatedAt } + similarQualifications( + limit: $limitSuggestions + qualificationID: $qualificationID + ) { + items { + id + name + code + } + } } `; diff --git a/src/libs/graphql/types.ts b/src/libs/graphql/types.ts index e6702f5..f2a7c81 100644 --- a/src/libs/graphql/types.ts +++ b/src/libs/graphql/types.ts @@ -1,11 +1,7 @@ export type Maybe = T | null; -export type Exact = { - [K in keyof T]: T[K]; -}; -export type MakeOptional = Omit & - { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & - { [SubKey in K]: Maybe }; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { ID: number; @@ -17,6 +13,31 @@ export type Scalars = { Upload: any; }; + + + +export type Qualification = { + id: Scalars['ID']; + slug: Scalars['String']; + name: Scalars['String']; + code: Scalars['String']; + formula?: Maybe; + description?: Maybe; + createdAt: Scalars['Time']; +}; + +export type UserWithToken = { + token: Scalars['String']; + user: User; +}; + +export enum Answer { + A = 'a', + B = 'b', + C = 'c', + D = 'd' +} + export type Question = { id: Scalars['ID']; from?: Maybe; @@ -37,284 +58,34 @@ export type Question = { updatedAt: Scalars['Time']; }; -export type UpdateManyUsersInput = { - role?: Maybe; - activated?: Maybe; +export type QuestionInput = { + content?: Maybe; + from?: Maybe; + explanation?: Maybe; + correctAnswer?: Maybe; + qualificationID?: Maybe; + image?: Maybe; + deleteImage?: Maybe; + answerA?: Maybe; + answerAImage?: Maybe; + deleteAnswerAImage?: Maybe; + answerB?: Maybe; + answerBImage?: Maybe; + deleteAnswerBImage?: Maybe; + answerC?: Maybe; + answerCImage?: Maybe; + deleteAnswerCImage?: Maybe; + answerD?: Maybe; + answerDImage?: Maybe; + deleteAnswerDImage?: Maybe; }; -export type ProfessionFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - slug?: Maybe>; - slugNEQ?: Maybe>; - name?: Maybe>; - nameNEQ?: Maybe>; - nameIEQ?: Maybe; - nameMATCH?: Maybe; - descriptionIEQ?: Maybe; - descriptionMATCH?: Maybe; - qualificationID?: Maybe>; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; -}; -export type Qualification = { - id: Scalars['ID']; - slug: Scalars['String']; - name: Scalars['String']; - code: Scalars['String']; - formula?: Maybe; - description?: Maybe; - createdAt: Scalars['Time']; -}; - -export type QuestionFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - from?: Maybe>; - contentIEQ?: Maybe; - contentMATCH?: Maybe; - qualificationID?: Maybe>; - qualificationIDNEQ?: Maybe>; - qualificationFilter?: Maybe; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; -}; - -export enum Role { - Admin = 'admin', - User = 'user', -} - -export enum Answer { - A = 'a', - B = 'b', - C = 'c', - D = 'd', -} - -export type UserInput = { - displayName?: Maybe; - password?: Maybe; - email?: Maybe; - role?: Maybe; - activated?: Maybe; -}; - -export type Query = { - professions: ProfessionList; - profession?: Maybe; - qualifications: QualificationList; - qualification?: Maybe; - questions: QuestionList; - generateTest?: Maybe>; - users: UserList; - user?: Maybe; - me?: Maybe; -}; - -export type QueryProfessionsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - -export type QueryProfessionArgs = { - id?: Maybe; - slug?: Maybe; -}; - -export type QueryQualificationsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - -export type QueryQualificationArgs = { - id?: Maybe; - slug?: Maybe; -}; - -export type QueryQuestionsArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - -export type QueryGenerateTestArgs = { - qualificationIDs: Array; - limit?: Maybe; -}; - -export type QueryUsersArgs = { - filter?: Maybe; - limit?: Maybe; - offset?: Maybe; - sort?: Maybe>; -}; - -export type QueryUserArgs = { - id: Scalars['Int']; -}; - -export type Profession = { - id: Scalars['ID']; - slug: Scalars['String']; - name: Scalars['String']; - description?: Maybe; - createdAt: Scalars['Time']; - qualifications: Array; -}; - -export type QualificationFilterOr = { - nameMatch?: Maybe; - nameIEQ?: Maybe; - codeMatch?: Maybe; - codeIEQ?: Maybe; -}; - -export type UserFilter = { - id?: Maybe>; - idNEQ?: Maybe>; - activated?: Maybe; - displayName?: Maybe>; - displayNameNEQ?: Maybe>; +export type UserFilterOr = { displayNameIEQ?: Maybe; displayNameMATCH?: Maybe; - email?: Maybe>; - emailNEQ?: Maybe>; emailIEQ?: Maybe; emailMATCH?: Maybe; - role?: Maybe>; - roleNEQ?: Maybe>; - createdAt?: Maybe; - createdAtGT?: Maybe; - createdAtGTE?: Maybe; - createdAtLT?: Maybe; - createdAtLTE?: Maybe; - or?: Maybe; -}; - -export type ProfessionInput = { - name?: Maybe; - description?: Maybe; -}; - -export type QualificationList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export type User = { - id: Scalars['ID']; - displayName: Scalars['String']; - role: Role; - email: Scalars['String']; - activated: Scalars['Boolean']; - createdAt: Scalars['Time']; -}; - -export type QualificationInput = { - name?: Maybe; - description?: Maybe; - code?: Maybe; - formula?: Maybe; - associateProfession?: Maybe>; - dissociateProfession?: Maybe>; -}; - -export type QuestionList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export type Mutation = { - createProfession?: Maybe; - updateProfession?: Maybe; - deleteProfessions?: Maybe>; - createQualification?: Maybe; - updateQualification?: Maybe; - deleteQualifications?: Maybe>; - createQuestion?: Maybe; - updateQuestion?: Maybe; - deleteQuestions?: Maybe>; - createUser?: Maybe; - updateUser?: Maybe; - updateManyUsers?: Maybe>; - deleteUsers?: Maybe>; - signIn?: Maybe; -}; - -export type MutationCreateProfessionArgs = { - input: ProfessionInput; -}; - -export type MutationUpdateProfessionArgs = { - id: Scalars['ID']; - input: ProfessionInput; -}; - -export type MutationDeleteProfessionsArgs = { - ids: Array; -}; - -export type MutationCreateQualificationArgs = { - input: QualificationInput; -}; - -export type MutationUpdateQualificationArgs = { - id: Scalars['ID']; - input: QualificationInput; -}; - -export type MutationDeleteQualificationsArgs = { - ids: Array; -}; - -export type MutationCreateQuestionArgs = { - input: QuestionInput; -}; - -export type MutationUpdateQuestionArgs = { - id: Scalars['ID']; - input: QuestionInput; -}; - -export type MutationDeleteQuestionsArgs = { - ids: Array; -}; - -export type MutationCreateUserArgs = { - input: UserInput; -}; - -export type MutationUpdateUserArgs = { - id: Scalars['ID']; - input: UserInput; -}; - -export type MutationUpdateManyUsersArgs = { - ids: Array; - input: UpdateManyUsersInput; -}; - -export type MutationDeleteUsersArgs = { - ids: Array; -}; - -export type MutationSignInArgs = { - email: Scalars['String']; - password: Scalars['String']; - staySignedIn?: Maybe; }; export type ProfessionList = { @@ -348,26 +119,141 @@ export type QualificationFilter = { or?: Maybe; }; -export type QuestionInput = { - content?: Maybe; - from?: Maybe; - explanation?: Maybe; - correctAnswer?: Maybe; - qualificationID?: Maybe; - image?: Maybe; - deleteImage?: Maybe; - answerA?: Maybe; - answerAImage?: Maybe; - deleteAnswerAImage?: Maybe; - answerB?: Maybe; - answerBImage?: Maybe; - deleteAnswerBImage?: Maybe; - answerC?: Maybe; - answerCImage?: Maybe; - deleteAnswerCImage?: Maybe; - answerD?: Maybe; - answerDImage?: Maybe; - deleteAnswerDImage?: Maybe; +export type User = { + id: Scalars['ID']; + displayName: Scalars['String']; + role: Role; + email: Scalars['String']; + activated: Scalars['Boolean']; + createdAt: Scalars['Time']; +}; + +export type QuestionFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + from?: Maybe>; + contentIEQ?: Maybe; + contentMATCH?: Maybe; + qualificationID?: Maybe>; + qualificationIDNEQ?: Maybe>; + qualificationFilter?: Maybe; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; +}; + +export type UpdateManyUsersInput = { + role?: Maybe; + activated?: Maybe; +}; + +export type Query = { + professions: ProfessionList; + profession?: Maybe; + qualifications: QualificationList; + similarQualifications: QualificationList; + qualification?: Maybe; + questions: QuestionList; + generateTest?: Maybe>; + users: UserList; + user?: Maybe; + me?: Maybe; +}; + + +export type QueryProfessionsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryProfessionArgs = { + id?: Maybe; + slug?: Maybe; +}; + + +export type QueryQualificationsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QuerySimilarQualificationsArgs = { + qualificationID: Scalars['ID']; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryQualificationArgs = { + id?: Maybe; + slug?: Maybe; +}; + + +export type QueryQuestionsArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryGenerateTestArgs = { + qualificationIDs: Array; + limit?: Maybe; +}; + + +export type QueryUsersArgs = { + filter?: Maybe; + limit?: Maybe; + offset?: Maybe; + sort?: Maybe>; +}; + + +export type QueryUserArgs = { + id: Scalars['Int']; +}; + +export type Profession = { + id: Scalars['ID']; + slug: Scalars['String']; + name: Scalars['String']; + description?: Maybe; + createdAt: Scalars['Time']; + qualifications: Array; +}; + + +export type QualificationInput = { + name?: Maybe; + description?: Maybe; + code?: Maybe; + formula?: Maybe; + associateProfession?: Maybe>; + dissociateProfession?: Maybe>; +}; + +export type QualificationFilterOr = { + nameMatch?: Maybe; + nameIEQ?: Maybe; + codeMatch?: Maybe; + codeIEQ?: Maybe; +}; + +export type QuestionList = { + total: Scalars['Int']; + items?: Maybe>; }; export type UserList = { @@ -375,14 +261,160 @@ export type UserList = { items?: Maybe>; }; -export type UserFilterOr = { - displayNameIEQ?: Maybe; - displayNameMATCH?: Maybe; - emailIEQ?: Maybe; - emailMATCH?: Maybe; +export type UserInput = { + displayName?: Maybe; + password?: Maybe; + email?: Maybe; + role?: Maybe; + activated?: Maybe; }; -export type UserWithToken = { - token: Scalars['String']; - user: User; +export type UserFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + activated?: Maybe; + displayName?: Maybe>; + displayNameNEQ?: Maybe>; + displayNameIEQ?: Maybe; + displayNameMATCH?: Maybe; + email?: Maybe>; + emailNEQ?: Maybe>; + emailIEQ?: Maybe; + emailMATCH?: Maybe; + role?: Maybe>; + roleNEQ?: Maybe>; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; + or?: Maybe; +}; + +export type ProfessionInput = { + name?: Maybe; + description?: Maybe; +}; + +export type ProfessionFilter = { + id?: Maybe>; + idNEQ?: Maybe>; + slug?: Maybe>; + slugNEQ?: Maybe>; + name?: Maybe>; + nameNEQ?: Maybe>; + nameIEQ?: Maybe; + nameMATCH?: Maybe; + descriptionIEQ?: Maybe; + descriptionMATCH?: Maybe; + qualificationID?: Maybe>; + createdAt?: Maybe; + createdAtGT?: Maybe; + createdAtGTE?: Maybe; + createdAtLT?: Maybe; + createdAtLTE?: Maybe; +}; + +export type QualificationList = { + total: Scalars['Int']; + items?: Maybe>; +}; + +export enum Role { + Admin = 'admin', + User = 'user' +} + +export type Mutation = { + createProfession?: Maybe; + updateProfession?: Maybe; + deleteProfessions?: Maybe>; + createQualification?: Maybe; + updateQualification?: Maybe; + deleteQualifications?: Maybe>; + createQuestion?: Maybe; + updateQuestion?: Maybe; + deleteQuestions?: Maybe>; + createUser?: Maybe; + updateUser?: Maybe; + updateManyUsers?: Maybe>; + deleteUsers?: Maybe>; + signIn?: Maybe; +}; + + +export type MutationCreateProfessionArgs = { + input: ProfessionInput; +}; + + +export type MutationUpdateProfessionArgs = { + id: Scalars['ID']; + input: ProfessionInput; +}; + + +export type MutationDeleteProfessionsArgs = { + ids: Array; +}; + + +export type MutationCreateQualificationArgs = { + input: QualificationInput; +}; + + +export type MutationUpdateQualificationArgs = { + id: Scalars['ID']; + input: QualificationInput; +}; + + +export type MutationDeleteQualificationsArgs = { + ids: Array; +}; + + +export type MutationCreateQuestionArgs = { + input: QuestionInput; +}; + + +export type MutationUpdateQuestionArgs = { + id: Scalars['ID']; + input: QuestionInput; +}; + + +export type MutationDeleteQuestionsArgs = { + ids: Array; +}; + + +export type MutationCreateUserArgs = { + input: UserInput; +}; + + +export type MutationUpdateUserArgs = { + id: Scalars['ID']; + input: UserInput; +}; + + +export type MutationUpdateManyUsersArgs = { + ids: Array; + input: UpdateManyUsersInput; +}; + + +export type MutationDeleteUsersArgs = { + ids: Array; +}; + + +export type MutationSignInArgs = { + email: Scalars['String']; + password: Scalars['String']; + staySignedIn?: Maybe; }; diff --git a/src/utils/resolveAs.ts b/src/utils/resolveAs.ts new file mode 100644 index 0000000..0fd8993 --- /dev/null +++ b/src/utils/resolveAs.ts @@ -0,0 +1,6 @@ +import { resolveHref } from 'next/dist/next-server/lib/router/router'; +import { UrlObject } from 'url'; + +const resolveAs = (url: UrlObject): string => resolveHref('', url, true)[1]; + +export default resolveAs; diff --git a/src/utils/resolveHref.ts b/src/utils/resolveHref.ts deleted file mode 100644 index e7750e7..0000000 --- a/src/utils/resolveHref.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { resolveHref } from 'next/dist/next-server/lib/router/router'; - -export default resolveHref;