69 | );
70 | }
71 |
72 | export const getServerSideProps: GetServerSideProps = async (ctx) => {
73 | const id = ctx.params.id;
74 | const db = await openDB();
75 | const car = await db.get(
76 | 'SELECT * FROM Car where id = ?',
77 | id
78 | );
79 | return { props: { car: car || null } };
80 | };
81 |
--------------------------------------------------------------------------------
/src/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button, FormControl, Grid, InputLabel, makeStyles, MenuItem, Paper, Select, SelectProps } from '@material-ui/core';
2 | import { Field, Form, Formik, useField, useFormikContext } from 'formik';
3 | import { GetServerSideProps } from 'next';
4 | import router, { useRouter } from 'next/router';
5 | import { useEffect, useState } from 'react';
6 | import useSWR from 'swr';
7 | import { getMakes, Make } from '../database/getMakes';
8 | import { getModels, Model } from '../database/getModels';
9 | import { getAsString } from '../getAsString';
10 |
11 | export interface SearchProps {
12 | makes: Make[];
13 | models: Model[];
14 | singleColumn?: boolean;
15 | }
16 |
17 | const useStyles = makeStyles((theme) => ({
18 | paper: {
19 | margin: 'auto',
20 | maxWidth: 500,
21 | padding: theme.spacing(3),
22 | },
23 | }));
24 |
25 | const prices = [500, 1000, 5000, 15000, 25000, 50000, 250000];
26 |
27 | export default function Search({ makes, models, singleColumn }: SearchProps) {
28 | const classes = useStyles();
29 | const { query } = useRouter();
30 | const smValue = singleColumn ? 12 : 6;
31 |
32 | const [initialValues] = useState({
33 | make: getAsString(query.make) || 'all',
34 | model: getAsString(query.model) || 'all',
35 | minPrice: getAsString(query.minPrice) || 'all',
36 | maxPrice: getAsString(query.maxPrice) || 'all',
37 | });
38 |
39 | return (
40 | {
43 | router.push(
44 | {
45 | pathname: '/cars',
46 | query: { ...values, page: 1 },
47 | },
48 | undefined,
49 | { shallow: true }
50 | );
51 | }}
52 | >
53 | {({ values }) => (
54 |
134 | )}
135 |
136 | );
137 | }
138 |
139 | export interface ModelSelectProps extends SelectProps {
140 | name: string;
141 | models: Model[];
142 | make: string;
143 | initialMake: string;
144 | }
145 |
146 | export function ModelSelect({ initialMake, models, make, ...props }: ModelSelectProps) {
147 | const { setFieldValue } = useFormikContext();
148 | const [field] = useField({
149 | name: props.name
150 | });
151 |
152 | const initialModelsOrUndefined = make === initialMake ? models : undefined;
153 |
154 | const { data: newModels } = useSWR('/api/models?make=' + make, {
155 | dedupingInterval: 60000,
156 | initialData: make === 'all' ? [] : initialModelsOrUndefined
157 | });
158 |
159 | useEffect(() => {
160 | if (!newModels?.map((a) => a.model).includes(field.value)) {
161 | setFieldValue('model', 'all');
162 | }
163 | }, [make, newModels]);
164 |
165 | return (
166 |
167 | Model
168 |
184 |
185 | );
186 | }
187 |
188 | export const getServerSideProps: GetServerSideProps = async (
189 | ctx
190 | ) => {
191 | const make = getAsString(ctx.query.make);
192 |
193 | const [makes, models] = await Promise.all([getMakes(), getModels(make)]);
194 |
195 | return { props: { makes, models } };
196 | };
197 |
--------------------------------------------------------------------------------
/migrations/001-helloworld.sql:
--------------------------------------------------------------------------------
1 | -- FAQ
2 | CREATE TABLE FAQ (
3 | id INTEGER PRIMARY KEY AUTOINCREMENT,
4 | question TEXT,
5 | answer TEXT,
6 | createDate DATE
7 | );
8 |
9 | INSERT INTO FAQ (question, answer, createDate) values('How to be safe buying online?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2019-11-01'));
10 | INSERT INTO FAQ (question, answer, createDate) values('Do I have any assurance on my new car?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2020-11-01'));
11 | INSERT INTO FAQ (question, answer, createDate) values('How many kilometers a normal car can have?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2018-11-01'));
12 | INSERT INTO FAQ (question, answer, createDate) values('What is the best month to buy a car?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2018-11-01'));
13 | INSERT INTO FAQ (question, answer, createDate) values('How to know the car history?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2018-11-01'));
14 | INSERT INTO FAQ (question, answer, createDate) values('How much do I pay a month to use the service?', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo', DATE('2018-11-01'));
15 |
16 | -- CAR
17 | CREATE TABLE Car (
18 | id INTEGER PRIMARY KEY AUTOINCREMENT,
19 | make TEXT,
20 | model TEXT,
21 | year INTEGER,
22 | fuelType TEXT,
23 | kilometers INTEGER,
24 | details TEXT,
25 | price INTEGER,
26 | photoUrl TEXT
27 | );
28 |
29 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Audi', 'A2', 2003 ,123456, 'Petrol' ,8199, '/photos/cars/audi-a2-2003-8199.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
30 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('BMW', '116', 2013 ,1231231, 'Petrol' ,12999, '/photos/cars/bmw-116-d-line-urban-2013.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
31 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('BMW', '320', 2009 ,655656, 'Petrol' ,18999, '/photos/cars/bmw-320-2009-18000.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
32 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('BMW', 'x1', 2012 ,565656, 'Diesel' ,24000, '/photos/cars/bmw-x1-2012-24999.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
33 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Ford', 'Fiesta', 2008 ,433444, 'Petrol' ,5590, '/photos/cars/ford-fiesta-2008-5950.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
34 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Ford', 'Fiesta', 2014 ,343434, 'Petrol' ,9950, '/photos/cars/ford-fiesta-2014-9950.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
35 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Mazda', '6', 2015 ,343411, 'Petrol' ,21000, '/photos/cars/mazda-6-2015.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
36 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Merces-Benz', '200', 2015 ,111111, 'Petrol' ,24999, '/photos/cars/mercedes-benz-200-2015-24999.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
37 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Merces-Benz', 'e250', 2011 ,123443, 'Diesel' ,29800, '/photos/cars/mercedes-benz-e250-2011-29800.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
38 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Peugeot', '3008', 2014 ,77000, 'Petrol' ,18999, '/photos/cars/peugeot-3008-2014-17999.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
39 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Renault', 'Clio', 2017 ,123133, 'Diesel' ,13485, '/photos/cars/renault-clio-2017-13485.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
40 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Renault', 'Espace', 2004 ,123123, 'Petrol' ,9800, '/photos/cars/renault-espace-2004.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
41 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Renault', 'Megane IV', 2016 ,123123, 'Diesel' ,15890, '/photos/cars/renault-megane-2016-15890.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
42 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Seat', 'Leon', 2010 ,44444, 'Diesel' ,13650, '/photos/cars/seat-leon-2010-13650.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
43 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Smart', 'for two', 2008 ,5534, 'Diesel' ,5800, '/photos/cars/smart-fortwo-2008-5800.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
44 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Smart', 'for two', 2012 ,43434, 'Diesel' ,7950, '/photos/cars/smart-fortwo-2012-7950.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
45 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Smart', 'for two', 2003 ,343434, 'Diesel' ,8850, '/photos/cars/smart-fortwo-passion-2003-8888.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
46 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Smart', 'for two', 2015 ,343434, 'Diesel' ,11500, '/photos/cars/smart-fortwo-passion-2015-11500.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
47 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Volkswagen', 'EOS', 2008 ,343434, 'Diesel' ,14700, '/photos/cars/volkswagen-eos-2008-14700.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
48 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Volkswagen', 'Golf', 2013 ,123123, 'Diesel' ,18300, '/photos/cars/volkswagen-golf-2013-18300.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
49 | INSERT INTO Car (make, model, year, kilometers, fuelType, price, photoUrl, details) values('Volkswagen', 'Tiguan', 2007 ,1231234, 'Petrol' ,14299, '/photos/cars/volkswagen-tiguan-2007-14299.jpg', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.');
50 |
51 | -- Down
52 | DROP TABLE Car;
53 | DROP TABLE FAQ;
--------------------------------------------------------------------------------