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