diff --git a/src/features/IndexPage/IndexPage.tsx b/src/features/IndexPage/IndexPage.tsx index 0fcaa8b..3d5c9b2 100644 --- a/src/features/IndexPage/IndexPage.tsx +++ b/src/features/IndexPage/IndexPage.tsx @@ -1,21 +1,58 @@ import { GetStaticProps } from 'next'; -import { createClient } from 'libs/graphql'; +import { + createClient, + Profession, + Qualification, + Query, + QueryProfessionsArgs, +} from 'libs/graphql'; +import { QUERY_PROFESSIONS } from './queries'; import Layout from 'common/Layout/Layout'; import Header from './components/Header/Header'; -const IndexPage = () => { +interface IndexPageProps { + professions: Profession[]; + qualifications: Qualification[]; +} + +const IndexPage = ({ qualifications }: IndexPageProps) => { return ( -
+
); }; -export const getStaticProps: GetStaticProps = async context => { - const pageProps = {}; +const getQualificationsFromProfessions = ( + professions: Profession[] +): Qualification[] => { + const map = new Map(); + professions.forEach(profession => { + profession.qualifications.forEach(qualification => { + map.set(qualification.id, qualification); + }); + }); + return Array.from(map.values()); +}; + +export const getStaticProps: GetStaticProps = async () => { + const pageProps: IndexPageProps = { professions: [], qualifications: [] }; const client = createClient(); + try { + const resp = await client.request< + Pick, + QueryProfessionsArgs + >(QUERY_PROFESSIONS, { sort: ['name ASC'] }); + if (Array.isArray(resp.professions?.items)) { + pageProps.professions = resp.professions.items; + pageProps.qualifications = getQualificationsFromProfessions( + resp.professions.items + ); + } + } catch (e) {} + return { props: pageProps, revalidate: 60, diff --git a/src/features/IndexPage/components/Header/Header.tsx b/src/features/IndexPage/components/Header/Header.tsx index e0c8909..f7e8440 100644 --- a/src/features/IndexPage/components/Header/Header.tsx +++ b/src/features/IndexPage/components/Header/Header.tsx @@ -1,3 +1,6 @@ +import { useState } from 'react'; +import { Maybe, Qualification } from 'libs/graphql'; + import Image from 'next/image'; import { makeStyles } from '@material-ui/core/styles'; import { @@ -6,10 +9,24 @@ import { Grid, Typography, Divider, + TextField, + InputAdornment, } from '@material-ui/core'; +import { Search as SearchIcon } from '@material-ui/icons'; +import { Autocomplete } from '@material-ui/lab'; +import ThemeProvider from 'libs/material-ui/ThemeProvider'; -const Header = () => { +interface HeaderProps { + qualifications: Qualification[]; +} + +const Header = ({ qualifications = [] }: HeaderProps) => { + const [selectedQualification, setSelectedQualification] = useState< + Maybe + >(null); const classes = useStyles(); + + console.log(selectedQualification); return (
@@ -21,12 +38,43 @@ const Header = () => { Prosta droga do zdania egzaminu zawodowego - + zdamegzaminzawodowy.pl to ogromna baza pytań z różnych egzaminów zawodowych. Pytania pochodzą z arkuszy z lat ubiegłych. Wyszukaj poniżej interesującą Cię kwalifikację i zacznij rozwiązywać testy! + + `${option.name} (${option.code})`} + noOptionsText="Nie znaleziono żadnej kwalifikacji" + clearText="Wyczyść" + onChange={(e, value) => { + setSelectedQualification(value); + }} + renderInput={params => { + return ( + + + + ), + }} + /> + ); + }} + options={qualifications} + /> + ({ color: theme.palette.common.white, position: 'relative', backgroundColor: theme.palette.primary.dark, - // backgroundImage: `linear-gradient(45deg, ${theme.palette.primary.light}, ${theme.palette.primary.dark})`, overflowX: 'hidden', }, container: { diff --git a/src/libs/graphql/types.ts b/src/libs/graphql/types.ts index 5899d83..664728b 100644 --- a/src/libs/graphql/types.ts +++ b/src/libs/graphql/types.ts @@ -16,26 +16,58 @@ export type Scalars = { -export type QuestionInput = { - content?: Maybe; +export type Question = { + id: Scalars['ID']; from?: Maybe; + content: Scalars['String']; explanation?: Maybe; - correctAnswer?: Maybe; - qualificationID?: Maybe; - image?: Maybe; - deleteImage?: Maybe; + correctAnswer: Answer; + image?: Maybe; answerA?: Maybe; - answerAImage?: Maybe; - deleteAnswerAImage?: Maybe; + answerAImage?: Maybe; answerB?: Maybe; - answerBImage?: Maybe; - deleteAnswerBImage?: Maybe; + answerBImage?: Maybe; answerC?: Maybe; - answerCImage?: Maybe; - deleteAnswerCImage?: Maybe; + answerCImage?: Maybe; answerD?: Maybe; - answerDImage?: Maybe; - deleteAnswerDImage?: Maybe; + answerDImage?: Maybe; + qualification?: Maybe; + createdAt: Scalars['Time']; + updatedAt: Scalars['Time']; +}; + +export type UpdateManyUsersInput = { + role?: Maybe; + activated?: 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 = { @@ -54,6 +86,165 @@ export type QuestionFilter = { 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>; + 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; @@ -154,73 +345,6 @@ export type ProfessionList = { items?: Maybe>; }; -export type Profession = { - id: Scalars['ID']; - slug: Scalars['String']; - name: Scalars['String']; - description?: Maybe; - createdAt: Scalars['Time']; -}; - -export enum Answer { - A = 'a', - B = 'b', - C = 'c', - D = 'd' -} - -export type UserList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -export type Question = { - id: Scalars['ID']; - from?: Maybe; - content: Scalars['String']; - explanation?: Maybe; - correctAnswer: Answer; - image?: Maybe; - answerA?: Maybe; - answerAImage?: Maybe; - answerB?: Maybe; - answerBImage?: Maybe; - answerC?: Maybe; - answerCImage?: Maybe; - answerD?: Maybe; - answerDImage?: Maybe; - qualification?: Maybe; - createdAt: Scalars['Time']; - updatedAt: Scalars['Time']; -}; - -export type UpdateManyUsersInput = { - role?: Maybe; - activated?: Maybe; -}; - -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 QualificationFilter = { id?: Maybe>; idNEQ?: Maybe>; @@ -247,82 +371,31 @@ export type QualificationFilter = { or?: Maybe; }; -export type ProfessionInput = { - name?: Maybe; - description?: 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 QuestionList = { +export type UserList = { total: Scalars['Int']; - items?: Maybe>; -}; - -export enum Role { - Admin = 'admin', - User = 'user' -} - -export type UserWithToken = { - token: Scalars['String']; - user: User; -}; - - -export type UserInput = { - displayName?: Maybe; - password?: Maybe; - email?: Maybe; - role?: Maybe; - activated?: Maybe; -}; - -export type QualificationList = { - total: Scalars['Int']; - items?: Maybe>; -}; - -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 User = { - id: Scalars['ID']; - displayName: Scalars['String']; - role: Role; - email: Scalars['String']; - activated: Scalars['Boolean']; - createdAt: Scalars['Time']; + items?: Maybe>; }; export type UserFilterOr = { @@ -332,79 +405,7 @@ export type UserFilterOr = { emailMATCH?: 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 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 UserWithToken = { + token: Scalars['String']; + user: User; }; diff --git a/src/libs/material-ui/ThemeProvider.tsx b/src/libs/material-ui/ThemeProvider.tsx index 2698249..eb09637 100644 --- a/src/libs/material-ui/ThemeProvider.tsx +++ b/src/libs/material-ui/ThemeProvider.tsx @@ -1,16 +1,32 @@ +import { useMemo } from 'react'; +import createTheme from './createTheme'; + import { ThemeProvider as MuiThemeProvider } from '@material-ui/styles'; import { CssBaseline } from '@material-ui/core'; -import createTheme from './createTheme'; +import { PaletteOptions } from '@material-ui/core/styles/createPalette'; interface ThemeProviderProps { children?: React.ReactNode; + paletteType?: PaletteOptions['type']; + cssBaseline?: boolean; } -function ThemeProvider({ children }: ThemeProviderProps) { +function ThemeProvider({ + children, + paletteType, + cssBaseline = true, +}: ThemeProviderProps) { + const theme = useMemo(() => createTheme(paletteType), [paletteType]); return ( - - {children} - + + {cssBaseline ? ( + <> + {children} + + + ) : ( + children + )} ); } diff --git a/src/libs/material-ui/createTheme.ts b/src/libs/material-ui/createTheme.ts index 8b992c3..d2d6499 100644 --- a/src/libs/material-ui/createTheme.ts +++ b/src/libs/material-ui/createTheme.ts @@ -3,9 +3,10 @@ import { responsiveFontSizes, Theme, } from '@material-ui/core/styles'; +import { PaletteOptions } from '@material-ui/core/styles/createPalette'; import { blue, pink } from '@material-ui/core/colors'; -const createTheme = (): Theme => { +const createTheme = (paletteType?: PaletteOptions['type']): Theme => { return responsiveFontSizes( createMuiTheme({ typography: { @@ -14,6 +15,7 @@ const createTheme = (): Theme => { }, }, palette: { + type: paletteType, primary: { main: blue['A200'], },