initial commit
37
.gitignore
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# next.js
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
|
# debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# local env files
|
||||||
|
.env*.local
|
||||||
|
|
||||||
|
# vercel
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
||||||
|
.idea
|
||||||
26
index.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import cors from 'cors';
|
||||||
|
import * as path from 'path';
|
||||||
|
import apiRouter from './src/api';
|
||||||
|
import bodyParser from 'body-parser';
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const port = 5000;
|
||||||
|
|
||||||
|
app.use(cors())
|
||||||
|
app.use('/static', express.static(path.join(__dirname, 'static')))
|
||||||
|
// app.use(express.static(path.join(__dirname, 'static')))
|
||||||
|
// @ts-ignore
|
||||||
|
app.use(bodyParser.raw({ type: 'application/soap+xml' }));
|
||||||
|
app.use(bodyParser.json({ limit: '20mb' }));
|
||||||
|
// app.use(express.urlencoded({ extended: false }));
|
||||||
|
// @ts-ignore
|
||||||
|
app.use(express.json());
|
||||||
|
|
||||||
|
app.use('/api', apiRouter)
|
||||||
|
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`Arkids backend app start on port ${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
26
package.json
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "arkids-main-app-backend",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/body-parser": "^1.19.2",
|
||||||
|
"@types/node": "^18.16.3",
|
||||||
|
"body-parser": "^1.20.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"nodemon": "^2.0.22",
|
||||||
|
"ts-node": "^10.9.1",
|
||||||
|
"typescript": "^5.0.4",
|
||||||
|
"uuid": "^9.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/cors": "^2.8.13",
|
||||||
|
"@types/express": "types/express",
|
||||||
|
"@types/uuid": "^9.0.1"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"dev": "nodemon index.ts",
|
||||||
|
"start": "ts-node --esm index.ts"
|
||||||
|
}
|
||||||
|
}
|
||||||
29
src/api/index.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import express, { Router } from 'express';
|
||||||
|
import { ApiRoute } from '../constants';
|
||||||
|
|
||||||
|
import hallsRouter from './routes/halls';
|
||||||
|
import questRouter from './routes/quests';
|
||||||
|
import rateRouter from './routes/rate';
|
||||||
|
import statisticsRouter from './routes/statistic';
|
||||||
|
import storiesRouter from './routes/stories';
|
||||||
|
import textRouter from './routes/text';
|
||||||
|
import infoRouter from './routes/info';
|
||||||
|
import breadcrumbsRouter from './routes/breadcrumbs';
|
||||||
|
import servicesRouter from './routes/services';
|
||||||
|
import faqRouter from './routes/faq';
|
||||||
|
|
||||||
|
const apiRouter = express.Router()
|
||||||
|
|
||||||
|
apiRouter.use(ApiRoute.BREADCRUMBS, breadcrumbsRouter)
|
||||||
|
apiRouter.use(ApiRoute.FAQ, faqRouter)
|
||||||
|
apiRouter.use(ApiRoute.INFO, infoRouter)
|
||||||
|
apiRouter.use(ApiRoute.SERVICES, servicesRouter)
|
||||||
|
apiRouter.use(ApiRoute.TEXT, textRouter)
|
||||||
|
apiRouter.use(ApiRoute.HALLS, hallsRouter)
|
||||||
|
apiRouter.use(ApiRoute.RATE, rateRouter)
|
||||||
|
apiRouter.use(ApiRoute.STORIES, storiesRouter)
|
||||||
|
apiRouter.use(ApiRoute.STATISTIC_INFO, statisticsRouter)
|
||||||
|
apiRouter.use(ApiRoute.QUESTS, questRouter)
|
||||||
|
|
||||||
|
|
||||||
|
export default apiRouter;
|
||||||
57
src/api/routes/breadcrumbs/controller.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { PAGE_LINK, PAGE_LINK_LABEL } from '../../../constants';
|
||||||
|
|
||||||
|
export type BreadcrumbsType = {
|
||||||
|
href?: string;
|
||||||
|
label: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const birthdayPageBreadcrumbs: BreadcrumbsType[] = [
|
||||||
|
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||||
|
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||||
|
{ href: PAGE_LINK.BIRTHDAY, label: PAGE_LINK_LABEL[PAGE_LINK.BIRTHDAY] },
|
||||||
|
];
|
||||||
|
|
||||||
|
const graduationPageBreadcrumbs: BreadcrumbsType[] = [
|
||||||
|
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||||
|
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||||
|
{ href: PAGE_LINK.GRADUATION, label: PAGE_LINK_LABEL[PAGE_LINK.GRADUATION] },
|
||||||
|
];
|
||||||
|
|
||||||
|
const outdoorsPageBreadcrumbs: BreadcrumbsType[] = [
|
||||||
|
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||||
|
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||||
|
{ href: PAGE_LINK.OUTDOORS, label: PAGE_LINK_LABEL[PAGE_LINK.OUTDOORS] },
|
||||||
|
];
|
||||||
|
|
||||||
|
const questsPageBreadcrumbs: BreadcrumbsType[] = [
|
||||||
|
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||||
|
{ href: PAGE_LINK.QUESTS, label: PAGE_LINK_LABEL[PAGE_LINK.QUESTS] },
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
export const getBreadcrumbs = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const {page} = req.body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayPageBreadcrumbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationPageBreadcrumbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsPageBreadcrumbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.QUESTS: {
|
||||||
|
return res.status(200).json(questsPageBreadcrumbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/api/routes/breadcrumbs/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getBreadcrumbs } from './controller';
|
||||||
|
|
||||||
|
const router = express.Router()
|
||||||
|
|
||||||
|
router.post('/', (req: Request, res: Response) => {
|
||||||
|
return getBreadcrumbs(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
||||||
93
src/api/routes/faq/controller.ts
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { PAGE_LINK } from '../../../constants';
|
||||||
|
|
||||||
|
export type QuestionType = {
|
||||||
|
answer: string;
|
||||||
|
question: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const birthdayQuestions: QuestionType[] = [
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||||
|
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
|
||||||
|
+ 'Мероприятие оплачивается на месте перед его началом.',
|
||||||
|
question: 'Как производится оплата мероприятия?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||||
|
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const graduationQuestions: QuestionType[] = [
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||||
|
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона.'
|
||||||
|
+ ' Мероприятие оплачивается на месте перед его началом.',
|
||||||
|
question: 'Как производится оплата мероприятия?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||||
|
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const outdoorsQuestions: QuestionType[] = [
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||||
|
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
|
||||||
|
+ 'Мероприятие оплачивается на месте перед его началом.',
|
||||||
|
question: 'Как производится оплата мероприятия?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||||
|
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getFaq = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const { id, page } = req.body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.QUESTS: {
|
||||||
|
switch (id) {
|
||||||
|
case 'eger':
|
||||||
|
return res.status(200).json(outdoorsQuestions);
|
||||||
|
|
||||||
|
case 'mult':
|
||||||
|
return res.status(200).json(outdoorsQuestions);
|
||||||
|
|
||||||
|
case 'faraon':
|
||||||
|
return res.status(200).json(outdoorsQuestions);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/api/routes/faq/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getFaq } from './controller';
|
||||||
|
const router = express.Router()
|
||||||
|
|
||||||
|
router.post('/', (req: Request, res: Response) => {
|
||||||
|
return getFaq(req, res)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
||||||
28
src/api/routes/halls/controller.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
|
|
||||||
|
const imageRootDir = 'static/images/information/halls/';
|
||||||
|
|
||||||
|
const Hall1Image = path.join(imageRootDir, 'hall1.jpg')
|
||||||
|
const Hall2Image = path.join(imageRootDir, 'hall2.jpg')
|
||||||
|
const Hall3Image = path.join(imageRootDir, 'hall3.jpg')
|
||||||
|
|
||||||
|
export type HallType = {
|
||||||
|
area: number;
|
||||||
|
img: {
|
||||||
|
alt: string;
|
||||||
|
src: string;
|
||||||
|
};
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const halls: HallType[] = [
|
||||||
|
{ area: 25, img: { alt: 'Средний Зал', src: Hall1Image }, name: 'Средний Зал' },
|
||||||
|
{ area: 50, img: { alt: 'Большой Зал', src: Hall2Image }, name: 'Большой Зал' },
|
||||||
|
{ area: 60, img: { alt: 'Зал Лофт', src: Hall3Image }, name: 'Зал Лофт' },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getHalls = (req: Request, res: Response) => {
|
||||||
|
return res.status(200).json(halls);
|
||||||
|
}
|
||||||
9
src/api/routes/halls/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getHalls } from './controller';
|
||||||
|
const hallsRouter = express.Router()
|
||||||
|
|
||||||
|
hallsRouter.get('/', (req: Request, res: Response) => {
|
||||||
|
return getHalls(req, res)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default hallsRouter;
|
||||||
25
src/api/routes/info/controller.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { PAGE_LINK } from '../../../constants';
|
||||||
|
|
||||||
|
const videoLink = 'https://www.youtube.com/watch?v=VqWkQCRsKD0';
|
||||||
|
|
||||||
|
type HomeInfo = {
|
||||||
|
video: string;
|
||||||
|
};
|
||||||
|
type ReturnInfoType = HomeInfo;
|
||||||
|
|
||||||
|
export const getInfo = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const body = req.body;
|
||||||
|
|
||||||
|
const { page } = body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.HOME:
|
||||||
|
return res.status(200).json({ video: videoLink });
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
10
src/api/routes/info/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getInfo } from './controller';
|
||||||
|
|
||||||
|
const router = express.Router()
|
||||||
|
|
||||||
|
router.post('/', (req: Request, res: Response) => {
|
||||||
|
return getInfo(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
||||||
432
src/api/routes/quests/controller.ts
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { COLORS, ColorVariant } from '../../../constants';
|
||||||
|
import { StoryType } from '../stories/controller';
|
||||||
|
import {v4 as uuid} from 'uuid';
|
||||||
|
|
||||||
|
const imageRootDir = 'static/images/quests/';
|
||||||
|
|
||||||
|
const egerFeedbackImage = path.join(imageRootDir, 'stories/eger/desktop/feedback.png');
|
||||||
|
const egerGalleryImage = path.join(imageRootDir, 'stories/eger/desktop/gallery.png');
|
||||||
|
const egerPlotImage = path.join(imageRootDir, 'stories/eger/desktop/plot.png');
|
||||||
|
const egerFeedbackMobileImage = path.join(imageRootDir, 'stories/eger/mobile/feedback.png');
|
||||||
|
const egerGalleryMobileImage = path.join(imageRootDir, 'stories/eger/mobile/gallery.png');
|
||||||
|
const egerPlotMobileImage = path.join(imageRootDir, 'stories/eger/mobile/plot.png');
|
||||||
|
|
||||||
|
const egerBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/eger/desktop/background.png')
|
||||||
|
const egerBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/eger/mobile/background.png')
|
||||||
|
|
||||||
|
const egerCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/eger-card.png')
|
||||||
|
const egerCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/eger-card.png')
|
||||||
|
|
||||||
|
const faraonFeedbackImage = path.join(imageRootDir, 'stories/faraon/desktop/feedback.png');
|
||||||
|
const faraonGalleryImage = path.join(imageRootDir, 'stories/faraon/desktop/gallery.png');
|
||||||
|
const faraonPlotImage = path.join(imageRootDir, 'stories/faraon/desktop/plot.png');
|
||||||
|
const faraonFeedbackMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/feedback.png');
|
||||||
|
const faraonGalleryMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/gallery.png');
|
||||||
|
const faraonPlotMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/plot.png');
|
||||||
|
|
||||||
|
const faraonBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/faraon/desktop/background.png')
|
||||||
|
const faraonBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/faraon/mobile/background.png')
|
||||||
|
|
||||||
|
const faraonCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/faraon-card.png')
|
||||||
|
const faraonCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/faraon-card.png')
|
||||||
|
|
||||||
|
const multFeedbackImage = path.join(imageRootDir, '/stories/mult/desktop/feedback.png');
|
||||||
|
const multGalleryImage = path.join(imageRootDir, '/stories/mult/desktop/gallery.png');
|
||||||
|
const multPlotImage = path.join(imageRootDir, '/stories/mult/desktop/plot.png');
|
||||||
|
const multFeedbackMobileImage = path.join(imageRootDir, '/stories/mult/mobile/feedback.png');
|
||||||
|
const multGalleryMobileImage = path.join(imageRootDir, '/stories/mult/mobile/gallery.png');
|
||||||
|
const multPlotMobileImage = path.join(imageRootDir, '/stories/mult/mobile/plot.png');
|
||||||
|
|
||||||
|
const multBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/mult/desktop/background.png')
|
||||||
|
const multBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/mult/mobile/background.png')
|
||||||
|
|
||||||
|
const multCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/mult-card.png')
|
||||||
|
const multCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/mult-card.png')
|
||||||
|
|
||||||
|
export type QuestItemType = {
|
||||||
|
age: {
|
||||||
|
styles?: object;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
backgrounds?: {
|
||||||
|
mobileSrc: string;
|
||||||
|
src: string;
|
||||||
|
};
|
||||||
|
cardBgImg: {
|
||||||
|
mobileSrc: string;
|
||||||
|
src: string;
|
||||||
|
};
|
||||||
|
description: string;
|
||||||
|
id: string;
|
||||||
|
labels: {
|
||||||
|
items: {
|
||||||
|
mark?: true;
|
||||||
|
markMobile?: true;
|
||||||
|
text: string;
|
||||||
|
}[];
|
||||||
|
styles?: object;
|
||||||
|
};
|
||||||
|
partySize: {
|
||||||
|
max: number;
|
||||||
|
min: number;
|
||||||
|
styles?: object;
|
||||||
|
};
|
||||||
|
price: number;
|
||||||
|
rating: number;
|
||||||
|
statisticsBackground: string;
|
||||||
|
stories?: StoryType[];
|
||||||
|
time: {
|
||||||
|
styles?: object;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
title: {
|
||||||
|
styles?: object;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
type: {
|
||||||
|
styles?: object;
|
||||||
|
text: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const egerStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: egerPlotImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: egerPlotMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'questPlot',
|
||||||
|
},
|
||||||
|
title: 'Сюжет',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: egerFeedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: egerFeedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: egerGalleryImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: egerGalleryMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
export const egerQuest: QuestItemType = {
|
||||||
|
age: {
|
||||||
|
text: '10+',
|
||||||
|
},
|
||||||
|
backgrounds: {
|
||||||
|
mobileSrc: egerBackgroundMobileImage,
|
||||||
|
src: egerBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
cardBgImg: {
|
||||||
|
mobileSrc: egerCardBackgroundMobileImage,
|
||||||
|
src: egerCardBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
description: 'Команда попадает в дом лесника с множеством спецэффектов и скрытых ходов. '
|
||||||
|
+ 'Есть возможность выбрать уровень сложности: от детского до самого страшного',
|
||||||
|
id: 'eger',
|
||||||
|
labels: {
|
||||||
|
items: [
|
||||||
|
{ text: 'страшный' },
|
||||||
|
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||||
|
{ mark: true, text: 'дымовые и световые спецэффекты' },
|
||||||
|
{ text: 'уровни с актёрами' },
|
||||||
|
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||||
|
{ mark: true, text: 'квест на день рождения' },
|
||||||
|
{ mark: true, markMobile: true, text: 'подвижный' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
partySize: {
|
||||||
|
max: 12,
|
||||||
|
min: 2,
|
||||||
|
},
|
||||||
|
price: 3500,
|
||||||
|
rating: 230,
|
||||||
|
statisticsBackground: COLORS[ColorVariant.GRADIENT_PERI4],
|
||||||
|
stories: egerStories,
|
||||||
|
time: {
|
||||||
|
text: '60 минут',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
styles: {
|
||||||
|
color: '#fff',
|
||||||
|
fontFamily: 'DwarvenStonecraftCyr',
|
||||||
|
fontSize: 45,
|
||||||
|
},
|
||||||
|
text: 'Егерь',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
text: 'квест\\n с актёрами',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const faraonStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: faraonPlotImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: faraonPlotMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'questPlot',
|
||||||
|
},
|
||||||
|
title: 'Сюжет',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: faraonFeedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: faraonFeedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: faraonGalleryImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: faraonGalleryMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const faraonQuest: QuestItemType = {
|
||||||
|
age: {
|
||||||
|
styles: {
|
||||||
|
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
color: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
},
|
||||||
|
text: '5+',
|
||||||
|
},
|
||||||
|
backgrounds: {
|
||||||
|
mobileSrc: faraonBackgroundMobileImage,
|
||||||
|
src: faraonBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
cardBgImg: {
|
||||||
|
mobileSrc: faraonCardBackgroundMobileImage,
|
||||||
|
src: faraonCardBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
description: 'Команда попадает в пирамиду: тоннели, лабиринты, спуски и подъёмы, продуманная '
|
||||||
|
+ 'электроника и задания как в настоящем фильме про Египет',
|
||||||
|
id: 'faraon',
|
||||||
|
labels: {
|
||||||
|
items: [
|
||||||
|
{ text: 'древний египет' },
|
||||||
|
{ mark: true, markMobile: true, text: 'уровни с актёрами' },
|
||||||
|
{ mark: true, text: 'логический квест' },
|
||||||
|
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||||
|
{ text: 'подвижный' },
|
||||||
|
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||||
|
{ mark: true, text: 'квест на день рождения' },
|
||||||
|
],
|
||||||
|
styles: {
|
||||||
|
color: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
partySize: {
|
||||||
|
max: 15,
|
||||||
|
min: 6,
|
||||||
|
styles: {
|
||||||
|
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
color: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
price: 4500,
|
||||||
|
rating: 230,
|
||||||
|
statisticsBackground: COLORS[ColorVariant.GRADIENT_ORANGE],
|
||||||
|
stories: faraonStories,
|
||||||
|
time: {
|
||||||
|
styles: {
|
||||||
|
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
color: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
},
|
||||||
|
text: '60 минут',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
styles: {
|
||||||
|
border: '3px #fff',
|
||||||
|
color: 'linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)',
|
||||||
|
fontFamily: 'Angry',
|
||||||
|
fontSize: 45,
|
||||||
|
},
|
||||||
|
text: 'Фараон',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
styles: {
|
||||||
|
color: COLORS[ColorVariant.VERI_PERI],
|
||||||
|
},
|
||||||
|
text: 'экшн-квест',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const stories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: multPlotImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Сюжет',
|
||||||
|
src: multPlotMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'questPlot',
|
||||||
|
},
|
||||||
|
title: 'Сюжет',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: multFeedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: multFeedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: multGalleryImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: multGalleryMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const multQuest: QuestItemType = {
|
||||||
|
age: {
|
||||||
|
text: '5+',
|
||||||
|
},
|
||||||
|
backgrounds: {
|
||||||
|
mobileSrc: multBackgroundMobileImage,
|
||||||
|
src: multBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
cardBgImg: {
|
||||||
|
mobileSrc: multCardBackgroundMobileImage,
|
||||||
|
src: multCardBackgroundDesktopImage,
|
||||||
|
},
|
||||||
|
description: 'Команда попадает в мультвселенную, где собраны самые популярные сюжеты мультфильмов и детские герои: '
|
||||||
|
+ 'Гравити Фолз, Алиса, Миньоны и Холодное сердце',
|
||||||
|
id: 'mult',
|
||||||
|
labels: {
|
||||||
|
items: [
|
||||||
|
{ text: 'детский квест' },
|
||||||
|
{ mark: true, markMobile: true, text: 'с сопровождающим' },
|
||||||
|
{ mark: true, text: 'логический квест' },
|
||||||
|
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||||
|
{ text: 'подвижный' },
|
||||||
|
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||||
|
{ mark: true, text: 'квест на день рождения' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
partySize: {
|
||||||
|
max: 60,
|
||||||
|
min: 3,
|
||||||
|
},
|
||||||
|
price: 7500,
|
||||||
|
rating: 230,
|
||||||
|
statisticsBackground: COLORS[ColorVariant.GRADIENT_GREEN],
|
||||||
|
stories,
|
||||||
|
time: {
|
||||||
|
text: '60 минут',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
styles: {
|
||||||
|
border: '4px #fff',
|
||||||
|
color: 'linear-gradient(134.56deg, #FFF500 11.78%, #FF3399 84.81%)',
|
||||||
|
fontFamily: 'Airfool',
|
||||||
|
fontSize: 54,
|
||||||
|
},
|
||||||
|
text: 'Мульт',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
text: 'детский квест',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getOne = (req: Request, res: Response) => {
|
||||||
|
const {id} = req.params;
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
case 'eger':
|
||||||
|
return res.status(200).json(egerQuest);
|
||||||
|
|
||||||
|
case 'faraon':
|
||||||
|
return res.status(200).json(faraonQuest);
|
||||||
|
|
||||||
|
case 'mult':
|
||||||
|
return res.status(200).json(multQuest);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const getAll = (req: Request, res: Response) => {
|
||||||
|
return res.status(200).json([
|
||||||
|
egerQuest,
|
||||||
|
faraonQuest,
|
||||||
|
multQuest,
|
||||||
|
])
|
||||||
|
}
|
||||||
14
src/api/routes/quests/index.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getAll, getOne } from './controller';
|
||||||
|
|
||||||
|
const questRouter = express.Router()
|
||||||
|
|
||||||
|
questRouter.get('/', (req: Request, res: Response) => {
|
||||||
|
return getAll(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
questRouter.get('/:id', (req: Request, res: Response) => {
|
||||||
|
return getOne(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default questRouter;
|
||||||
532
src/api/routes/rate/controller.ts
Normal file
@ -0,0 +1,532 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { PAGE_LINK, SERVICE } from '../../../constants';
|
||||||
|
|
||||||
|
const imageRootDir = 'static/images/rate/';
|
||||||
|
|
||||||
|
const BaseImg = path.join(imageRootDir, 'base.png');
|
||||||
|
const PremiumImg = path.join(imageRootDir, 'premium.png');
|
||||||
|
const StandartImg = path.join(imageRootDir, 'standart.png');
|
||||||
|
const VipImg = path.join(imageRootDir, 'vip.png');
|
||||||
|
|
||||||
|
export type SingleItemServiceType = {
|
||||||
|
enable: boolean;
|
||||||
|
price?: number;
|
||||||
|
startPrice?: number;
|
||||||
|
value?: string;
|
||||||
|
};
|
||||||
|
export type ItemServiceType = {
|
||||||
|
[name: string]: SingleItemServiceType;
|
||||||
|
};
|
||||||
|
export type RateItemType = {
|
||||||
|
id: string;
|
||||||
|
img: {
|
||||||
|
alt: string;
|
||||||
|
height?: number;
|
||||||
|
src: string;
|
||||||
|
width?: number;
|
||||||
|
};
|
||||||
|
maxPeople: number;
|
||||||
|
overpayment: number;
|
||||||
|
price?: number;
|
||||||
|
pricePerPerson?: number;
|
||||||
|
services: ItemServiceType;
|
||||||
|
title: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const birthdayPageRate: RateItemType[] = [
|
||||||
|
{
|
||||||
|
id: 'base',
|
||||||
|
img: {
|
||||||
|
alt: 'Базовый',
|
||||||
|
src: BaseImg,
|
||||||
|
},
|
||||||
|
maxPeople: 6,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 9900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATOR]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '1,5 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOS]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: false,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Базовый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'standart',
|
||||||
|
img: {
|
||||||
|
alt: 'Стандарт',
|
||||||
|
src: StandartImg,
|
||||||
|
},
|
||||||
|
maxPeople: 10,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 13900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATOR]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '2 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOS]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Стандарт',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'premium',
|
||||||
|
img: {
|
||||||
|
alt: 'Премиум',
|
||||||
|
src: PremiumImg,
|
||||||
|
},
|
||||||
|
maxPeople: 12,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 19900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATOR]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '3 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOS]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Премиум',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'vip',
|
||||||
|
img: {
|
||||||
|
alt: 'VIP',
|
||||||
|
src: VipImg,
|
||||||
|
},
|
||||||
|
maxPeople: 20,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 29900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATOR]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '4 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: true,
|
||||||
|
startPrice: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOS]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
value: '2 квеста',
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Вип',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const graduationPageRate: RateItemType[] = [
|
||||||
|
{
|
||||||
|
id: 'base',
|
||||||
|
img: {
|
||||||
|
alt: 'Базовый',
|
||||||
|
src: BaseImg,
|
||||||
|
},
|
||||||
|
maxPeople: 6,
|
||||||
|
overpayment: 500,
|
||||||
|
pricePerPerson: 1390,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: false,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DIPLOMA]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '1,5 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: false,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: false,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Базовый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'standart',
|
||||||
|
img: {
|
||||||
|
alt: 'Стандарт',
|
||||||
|
src: StandartImg,
|
||||||
|
},
|
||||||
|
maxPeople: 10,
|
||||||
|
overpayment: 500,
|
||||||
|
pricePerPerson: 1990,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: false,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DIPLOMA]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '2 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Стандарт',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'premium',
|
||||||
|
img: {
|
||||||
|
alt: 'Премиум',
|
||||||
|
src: PremiumImg,
|
||||||
|
},
|
||||||
|
maxPeople: 12,
|
||||||
|
overpayment: 500,
|
||||||
|
pricePerPerson: 2990,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DIPLOMA]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enable: true,
|
||||||
|
value: '3 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enable: true,
|
||||||
|
price: 1000,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Премиум',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const outdoorsPageRate: RateItemType[] = [
|
||||||
|
{
|
||||||
|
id: 'base',
|
||||||
|
img: {
|
||||||
|
alt: 'Базовый',
|
||||||
|
src: BaseImg,
|
||||||
|
},
|
||||||
|
maxPeople: 6,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 9900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DURATION]: {
|
||||||
|
enable: true,
|
||||||
|
value: '2 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: false,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TEAM_BUILDING]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Базовый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'standart',
|
||||||
|
img: {
|
||||||
|
alt: 'Стандарт',
|
||||||
|
src: StandartImg,
|
||||||
|
},
|
||||||
|
maxPeople: 10,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 13900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DURATION]: {
|
||||||
|
enable: true,
|
||||||
|
value: '3 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: false,
|
||||||
|
startPrice: 4900,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TEAM_BUILDING]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Стандарт',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'premium',
|
||||||
|
img: {
|
||||||
|
alt: 'Премиум',
|
||||||
|
src: PremiumImg,
|
||||||
|
},
|
||||||
|
maxPeople: 12,
|
||||||
|
overpayment: 500,
|
||||||
|
price: 19900,
|
||||||
|
services: {
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.DURATION]: {
|
||||||
|
enable: true,
|
||||||
|
value: '4 часа',
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enable: true,
|
||||||
|
price: 4000,
|
||||||
|
},
|
||||||
|
[SERVICE.TEAM_BUILDING]: {
|
||||||
|
enable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
title: 'Премиум',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getRate = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const {page} = req.body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayPageRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationPageRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsPageRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/api/routes/rate/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getRate } from './controller';
|
||||||
|
|
||||||
|
const rateRouter = express.Router()
|
||||||
|
|
||||||
|
rateRouter.post('/', (req: Request, res: Response) => {
|
||||||
|
return getRate(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default rateRouter;
|
||||||
64
src/api/routes/services/controller.ts
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { PAGE_LINK, SERVICE, servicesList, ServiceType } from '../../../constants';
|
||||||
|
|
||||||
|
|
||||||
|
const birthdayPageServices: ServiceType[] = [
|
||||||
|
servicesList[SERVICE.QUEST],
|
||||||
|
servicesList[SERVICE.HALL],
|
||||||
|
servicesList[SERVICE.ANIMATOR],
|
||||||
|
servicesList[SERVICE.DECORATION],
|
||||||
|
servicesList[SERVICE.TABLEWARE_FESTIVE],
|
||||||
|
servicesList[SERVICE.PHOTOS],
|
||||||
|
servicesList[SERVICE.SHOW_DISCO],
|
||||||
|
servicesList[SERVICE.SCREENWRITER],
|
||||||
|
servicesList[SERVICE.MASTERCLASS],
|
||||||
|
servicesList[SERVICE.CRYO_SHOW],
|
||||||
|
];
|
||||||
|
|
||||||
|
const graduationPageServices: ServiceType[] = [
|
||||||
|
servicesList[SERVICE.QUEST],
|
||||||
|
servicesList[SERVICE.HALL],
|
||||||
|
servicesList[SERVICE.ANIMATION],
|
||||||
|
servicesList[SERVICE.PHOTOGRAPHER],
|
||||||
|
servicesList[SERVICE.DECORATION],
|
||||||
|
servicesList[SERVICE.TABLEWARE_FESTIVE],
|
||||||
|
servicesList[SERVICE.DIPLOMA],
|
||||||
|
servicesList[SERVICE.SHOW_DISCO],
|
||||||
|
servicesList[SERVICE.SCREENWRITER],
|
||||||
|
servicesList[SERVICE.MASTERCLASS],
|
||||||
|
servicesList[SERVICE.FACE_PAINTING],
|
||||||
|
servicesList[SERVICE.CRYO_SHOW],
|
||||||
|
];
|
||||||
|
|
||||||
|
const outdoorsPageServices: ServiceType[] = [
|
||||||
|
servicesList[SERVICE.QUEST],
|
||||||
|
servicesList[SERVICE.DURATION],
|
||||||
|
servicesList[SERVICE.ANIMATION],
|
||||||
|
servicesList[SERVICE.PHOTOGRAPHER],
|
||||||
|
servicesList[SERVICE.TEAM_BUILDING],
|
||||||
|
servicesList[SERVICE.SHOW_DISCO],
|
||||||
|
servicesList[SERVICE.FACE_PAINTING],
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getServices = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const {page} = req.body;
|
||||||
|
// @ts-ignore
|
||||||
|
console.log('Body', req.body);
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayPageServices);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationPageServices);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsPageServices);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/api/routes/services/index.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import {
|
||||||
|
getServices } from './controller';
|
||||||
|
|
||||||
|
const router = express.Router()
|
||||||
|
|
||||||
|
router.post('/', (req: Request, res: Response) => {
|
||||||
|
return getServices(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
||||||
939
src/api/routes/statistic/controller.ts
Normal file
@ -0,0 +1,939 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { PAGE_LINK } from '../../../constants';
|
||||||
|
|
||||||
|
const imageRootDir = 'static/images/information/statistics';
|
||||||
|
|
||||||
|
const DecorationDesktopImg = path.join(imageRootDir, 'desktop/decoration.png');
|
||||||
|
const DiplomaDesktopImg = path.join(imageRootDir, 'desktop/graduation/diploma.png');
|
||||||
|
const KidsDesktopImg = path.join(imageRootDir, 'desktop/kids.png');
|
||||||
|
const LikeDesktopImg = path.join(imageRootDir, 'desktop/like.png');
|
||||||
|
const StatDecorDesktopImg = path.join(imageRootDir, 'desktop/outdoors/decoration.png');
|
||||||
|
const StatScooterDesktopImg = path.join(imageRootDir, 'desktop/outdoors/scooter.png');
|
||||||
|
const PinataDesktopImg = path.join(imageRootDir, 'desktop/pinata.png');
|
||||||
|
const ProgramsDesktopImg = path.join(imageRootDir, 'desktop/programms.png');
|
||||||
|
const BooksDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/books.png');
|
||||||
|
const KeysDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/keys.png');
|
||||||
|
const MapDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/map.png');
|
||||||
|
const RateDesktopImg = path.join(imageRootDir, 'desktop/rate.png');
|
||||||
|
const StarDesktopImg = path.join(imageRootDir, 'desktop/star.png');
|
||||||
|
|
||||||
|
const CupMobileImg = path.join(imageRootDir, 'mobile/cup.png');
|
||||||
|
const DecorationMobileImg = path.join(imageRootDir, 'mobile/decoration.png');
|
||||||
|
const DiplomaMobileImg = path.join(imageRootDir, 'mobile/graduation/diploma.png');
|
||||||
|
const KidsMobileImg = path.join(imageRootDir, 'mobile/kids.png');
|
||||||
|
const Kids2MobileImg = path.join(imageRootDir, 'mobile/kids2.png');
|
||||||
|
const LikeMobileImg = path.join(imageRootDir, 'mobile/like.png');
|
||||||
|
const StatDecorMobileImg = path.join(imageRootDir, 'mobile/outdoors/decoration.png');
|
||||||
|
const StatScooterMobileImg = path.join(imageRootDir, 'mobile/outdoors/scooter.png');
|
||||||
|
const PinataMobileImg = path.join(imageRootDir, 'mobile/pinata.png');
|
||||||
|
const ProgramsMobileImg = path.join(imageRootDir, 'mobile/programms.png');
|
||||||
|
const BooksMobileImg = path.join(imageRootDir, 'mobile/quests/eger/books.png');
|
||||||
|
const KeysMobileImg = path.join(imageRootDir, 'mobile/quests/eger/keys.png');
|
||||||
|
const MapMobileImg = path.join(imageRootDir, 'mobile/quests/eger/map.png');
|
||||||
|
const RateMobileImg = path.join(imageRootDir, 'mobile/rate.png');
|
||||||
|
const StarMobileImg = path.join(imageRootDir, 'mobile/star.png');
|
||||||
|
|
||||||
|
export type StatisticsItem = {
|
||||||
|
img?: {
|
||||||
|
alt: string;
|
||||||
|
mobilePosition?: {
|
||||||
|
bottom?: number;
|
||||||
|
left?: number;
|
||||||
|
right?: number;
|
||||||
|
top?: number;
|
||||||
|
};
|
||||||
|
mobileSrc?: string;
|
||||||
|
position?: {
|
||||||
|
bottom?: number;
|
||||||
|
left?: number;
|
||||||
|
right?: number;
|
||||||
|
top?: number;
|
||||||
|
};
|
||||||
|
src: string;
|
||||||
|
height: number;
|
||||||
|
mobileHeight?: number;
|
||||||
|
mobileWidth?: number;
|
||||||
|
width: number;
|
||||||
|
};
|
||||||
|
mobileOrder?: number;
|
||||||
|
mobileText?: string;
|
||||||
|
order?: number;
|
||||||
|
size: {
|
||||||
|
sm: number | 'auto';
|
||||||
|
width: number | 'auto';
|
||||||
|
xs: number;
|
||||||
|
};
|
||||||
|
text: string;
|
||||||
|
title: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const birthdayItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'combo',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 12,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: RateMobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 60,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: RateDesktopImg,
|
||||||
|
width: 80,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 130,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'комбо для\\n лучшего праздника',
|
||||||
|
title: 'Выгодные',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'programs',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: -20,
|
||||||
|
},
|
||||||
|
mobileSrc: ProgramsMobileImg,
|
||||||
|
mobileHeight: 84,
|
||||||
|
mobileWidth: 110,
|
||||||
|
position: {
|
||||||
|
right: 0,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: ProgramsDesktopImg,
|
||||||
|
width: 72,
|
||||||
|
height: 96
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 210,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'индивидуальные программы',
|
||||||
|
title: 'Тематические',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: DecorationMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 90,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: DecorationDesktopImg,
|
||||||
|
width: 106,
|
||||||
|
height: 80
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'украшенные\\n и просторные',
|
||||||
|
title: 'Залы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 26,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: KidsMobileImg,
|
||||||
|
mobileHeight: 108,
|
||||||
|
mobileWidth: 74,
|
||||||
|
position: {
|
||||||
|
right: -10,
|
||||||
|
top: 16,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileText: 'для детей разных возрастов',
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'для детей\\n разных возрастов',
|
||||||
|
title: 'Развлечения',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const homeItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'pinata',
|
||||||
|
mobilePosition: {
|
||||||
|
left: 37,
|
||||||
|
top: -40,
|
||||||
|
},
|
||||||
|
mobileSrc: PinataMobileImg,
|
||||||
|
mobileHeight: 131,
|
||||||
|
mobileWidth: 128,
|
||||||
|
src: PinataDesktopImg,
|
||||||
|
width: 123,
|
||||||
|
height: 120
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 150,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'праздников\\n проведено',
|
||||||
|
title: '5700 +',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'star',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 6,
|
||||||
|
top: -20,
|
||||||
|
},
|
||||||
|
mobileSrc: StarMobileImg,
|
||||||
|
mobileHeight: 112,
|
||||||
|
mobileWidth: 112,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: StarDesktopImg,
|
||||||
|
width: 66,
|
||||||
|
height: 66
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 190,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'отзывы клиентов\\n на Яндекс',
|
||||||
|
title: '5 звёзд',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'like',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 17,
|
||||||
|
top: -14,
|
||||||
|
},
|
||||||
|
mobileSrc: LikeMobileImg,
|
||||||
|
mobileHeight: 89,
|
||||||
|
mobileWidth: 87,
|
||||||
|
position: {
|
||||||
|
right: 5,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: LikeDesktopImg,
|
||||||
|
width: 76,
|
||||||
|
height: 72
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 150,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'цены и гибкий\\n подход к клиенту',
|
||||||
|
title: 'Выгодные',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'cup',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 3,
|
||||||
|
top: -29,
|
||||||
|
},
|
||||||
|
src: CupMobileImg,
|
||||||
|
height: 101,
|
||||||
|
width: 101,
|
||||||
|
mobileHeight: 131,
|
||||||
|
mobileWidth: 131
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 190,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'успешной работы\\n в сфере развлечений',
|
||||||
|
title: '6 лет',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const graduationItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'combo',
|
||||||
|
mobilePosition: {
|
||||||
|
left: 12,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: RateMobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 60,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 5,
|
||||||
|
},
|
||||||
|
src: RateDesktopImg,
|
||||||
|
width: 80,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 130,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'комбо для лучшего праздника',
|
||||||
|
title: 'Выгодные',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'diploma',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: DiplomaMobileImg,
|
||||||
|
mobileHeight: 90,
|
||||||
|
mobileWidth: 100,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: DiplomaDesktopImg,
|
||||||
|
width: 76,
|
||||||
|
height: 85
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 210,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'индивидуальных\\n дипломов',
|
||||||
|
title: 'Вручение',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: DecorationMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 90,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
src: DecorationDesktopImg,
|
||||||
|
width: 106,
|
||||||
|
height: 80
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'украшенные и просторные',
|
||||||
|
title: 'Залы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: KidsMobileImg,
|
||||||
|
mobileHeight: 108,
|
||||||
|
mobileWidth: 74,
|
||||||
|
position: {
|
||||||
|
right: -10,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'для больших\\n команд',
|
||||||
|
title: 'Квесты',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const outdoorsItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'combo',
|
||||||
|
mobilePosition: {
|
||||||
|
left: 12,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: RateMobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 60,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 5,
|
||||||
|
},
|
||||||
|
src: RateDesktopImg,
|
||||||
|
width: 80,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 130,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'комбо для\\n лучшего праздника',
|
||||||
|
title: 'Выгодные',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'programs',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 10,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: StatScooterMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 114,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: StatScooterDesktopImg,
|
||||||
|
width: 94,
|
||||||
|
height: 98
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 210,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'по Москве\\n и Московской области',
|
||||||
|
title: 'Выезд',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 14,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: StatDecorMobileImg,
|
||||||
|
mobileHeight: 76,
|
||||||
|
mobileWidth: 136,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
src: StatDecorDesktopImg,
|
||||||
|
width: 60,
|
||||||
|
height: 108
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'реквизит\\n на заказ',
|
||||||
|
title: 'Проф',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
left: 28,
|
||||||
|
top: -10,
|
||||||
|
},
|
||||||
|
mobileSrc: KidsMobileImg,
|
||||||
|
mobileHeight: 108,
|
||||||
|
mobileWidth: 74,
|
||||||
|
position: {
|
||||||
|
right: -10,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'для детей\\n разных возрастов',
|
||||||
|
title: 'Развлечения',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const egerQuestItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 15,
|
||||||
|
top: -20,
|
||||||
|
},
|
||||||
|
mobileSrc: Kids2MobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 110,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 20,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 1,
|
||||||
|
order: 1,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 200,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'для детей\\n разных возрастов',
|
||||||
|
title: 'Задания',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'programs',
|
||||||
|
mobilePosition: {
|
||||||
|
right: -20,
|
||||||
|
top: 5,
|
||||||
|
},
|
||||||
|
mobileSrc: BooksMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 122,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: BooksDesktopImg,
|
||||||
|
width: 109,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
mobileOrder: 4,
|
||||||
|
order: 2,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'сюжет\\n каждый год',
|
||||||
|
title: 'Новый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 14,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: MapMobileImg,
|
||||||
|
mobileHeight: 68,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
src: MapDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 3,
|
||||||
|
order: 3,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'различных\\n локаций',
|
||||||
|
title: 'Шесть',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 0,
|
||||||
|
top: -15,
|
||||||
|
},
|
||||||
|
mobileSrc: KeysMobileImg,
|
||||||
|
mobileHeight: 64,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 30,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: KeysDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 2,
|
||||||
|
order: 4,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 140,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'система\\n бронирования',
|
||||||
|
title: 'Быстрая',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const faraonQuestItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 15,
|
||||||
|
top: -20,
|
||||||
|
},
|
||||||
|
mobileSrc: Kids2MobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 110,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 20,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 1,
|
||||||
|
order: 1,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 200,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'для детей\\n разных возрастов',
|
||||||
|
title: 'Задания',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'programs',
|
||||||
|
mobilePosition: {
|
||||||
|
right: -20,
|
||||||
|
top: 5,
|
||||||
|
},
|
||||||
|
mobileSrc: BooksMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 122,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: BooksDesktopImg,
|
||||||
|
width: 109,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
mobileOrder: 4,
|
||||||
|
order: 2,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'сюжет\\n каждый год',
|
||||||
|
title: 'Новый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 14,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: MapMobileImg,
|
||||||
|
mobileHeight: 68,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
src: MapDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 3,
|
||||||
|
order: 3,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'различных\\n локаций',
|
||||||
|
title: 'Шесть',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 0,
|
||||||
|
top: -15,
|
||||||
|
},
|
||||||
|
mobileSrc: KeysMobileImg,
|
||||||
|
mobileHeight: 64,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 30,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: KeysDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 2,
|
||||||
|
order: 4,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 140,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'система\\n бронирования',
|
||||||
|
title: 'Быстрая',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const multQuestItems: StatisticsItem[] = [
|
||||||
|
{
|
||||||
|
size: {
|
||||||
|
sm: 'auto',
|
||||||
|
width: 'auto',
|
||||||
|
xs: 12,
|
||||||
|
},
|
||||||
|
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||||
|
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 15,
|
||||||
|
top: -20,
|
||||||
|
},
|
||||||
|
mobileSrc: Kids2MobileImg,
|
||||||
|
mobileHeight: 106,
|
||||||
|
mobileWidth: 110,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 20,
|
||||||
|
},
|
||||||
|
src: KidsDesktopImg,
|
||||||
|
width: 90,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 1,
|
||||||
|
order: 1,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 200,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'для детей\\n разных возрастов',
|
||||||
|
title: 'Задания',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'programs',
|
||||||
|
mobilePosition: {
|
||||||
|
right: -20,
|
||||||
|
top: 5,
|
||||||
|
},
|
||||||
|
mobileSrc: BooksMobileImg,
|
||||||
|
mobileHeight: 116,
|
||||||
|
mobileWidth: 122,
|
||||||
|
position: {
|
||||||
|
right: 22,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: BooksDesktopImg,
|
||||||
|
width: 109,
|
||||||
|
height: 90
|
||||||
|
},
|
||||||
|
mobileOrder: 4,
|
||||||
|
order: 2,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 180,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'сюжет\\n каждый год',
|
||||||
|
title: 'Новый',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'decor',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 14,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
mobileSrc: MapMobileImg,
|
||||||
|
mobileHeight: 68,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 35,
|
||||||
|
top: 10,
|
||||||
|
},
|
||||||
|
src: MapDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 3,
|
||||||
|
order: 3,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 160,
|
||||||
|
xs: 5,
|
||||||
|
},
|
||||||
|
text: 'различных\\n локаций',
|
||||||
|
title: 'Шесть',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: {
|
||||||
|
alt: 'kids',
|
||||||
|
mobilePosition: {
|
||||||
|
right: 0,
|
||||||
|
top: -15,
|
||||||
|
},
|
||||||
|
mobileSrc: KeysMobileImg,
|
||||||
|
mobileHeight: 64,
|
||||||
|
mobileWidth: 94,
|
||||||
|
position: {
|
||||||
|
right: 30,
|
||||||
|
top: 15,
|
||||||
|
},
|
||||||
|
src: KeysDesktopImg,
|
||||||
|
width: 69,
|
||||||
|
height: 94
|
||||||
|
},
|
||||||
|
mobileOrder: 2,
|
||||||
|
order: 4,
|
||||||
|
size: {
|
||||||
|
sm: 2,
|
||||||
|
width: 140,
|
||||||
|
xs: 6,
|
||||||
|
},
|
||||||
|
text: 'система\\n бронирования',
|
||||||
|
title: 'Быстрая',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getStatistics = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const {page, id} = req.body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.HOME: {
|
||||||
|
return res.status(200).json(homeItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.QUESTS: {
|
||||||
|
switch (id) {
|
||||||
|
case 'eger':
|
||||||
|
return res.status(200).json(egerQuestItems);
|
||||||
|
|
||||||
|
case 'mult':
|
||||||
|
return res.status(200).json(multQuestItems);
|
||||||
|
|
||||||
|
case 'faraon':
|
||||||
|
return res.status(200).json(faraonQuestItems);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/api/routes/statistic/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getStatistics } from './controller';
|
||||||
|
|
||||||
|
const statisticsRouter = express.Router()
|
||||||
|
|
||||||
|
statisticsRouter.post('/', (req: Request, res: Response) => {
|
||||||
|
return getStatistics(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default statisticsRouter;
|
||||||
327
src/api/routes/stories/controller.ts
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { v4 as uuid } from 'uuid';
|
||||||
|
import { PAGE_LINK } from '../../../constants';
|
||||||
|
|
||||||
|
const imageRootDir = 'static/images/stories/';
|
||||||
|
|
||||||
|
const faqImage = path.join(imageRootDir, 'birthday/faq.png')
|
||||||
|
const faqMobileImage = path.join(imageRootDir, 'birthday/faq_mobile.png')
|
||||||
|
const feedbackImage = path.join(imageRootDir, 'birthday/feedback.png')
|
||||||
|
const feedbackMobileImage = path.join(imageRootDir, 'birthday/feedback_mobile.png')
|
||||||
|
const photoImage = path.join(imageRootDir, 'birthday/photo.png')
|
||||||
|
const photoMobileImage = path.join(imageRootDir, 'birthday/photo_mobile.png')
|
||||||
|
|
||||||
|
const example = path.join(imageRootDir, 'example.png')
|
||||||
|
const example2 = path.join(imageRootDir, 'example2.jpg')
|
||||||
|
|
||||||
|
export type StoryFeedbackModalType = {};
|
||||||
|
export type StoryGalleryModalType = {};
|
||||||
|
export type StoryInfoModalType = {};
|
||||||
|
export type StoryQuestPlotModalType = {};
|
||||||
|
|
||||||
|
export type StoryModalContent = StoryFeedbackModalType | StoryGalleryModalType | StoryInfoModalType | StoryQuestPlotModalType;
|
||||||
|
export type StoryModalType = 'faq' | 'feedback' | 'gallery' | 'info' | 'questPlot';
|
||||||
|
export type StoryImageType = {
|
||||||
|
alt: string;
|
||||||
|
height?: number;
|
||||||
|
src: string;
|
||||||
|
width?: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type StoryType = {
|
||||||
|
border?: {
|
||||||
|
inner?: {
|
||||||
|
color: string;
|
||||||
|
};
|
||||||
|
outer?: {
|
||||||
|
color: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
id: string;
|
||||||
|
img: StoryImageType;
|
||||||
|
imgMobile?: StoryImageType;
|
||||||
|
modal: {
|
||||||
|
content?: StoryModalContent;
|
||||||
|
type: StoryModalType;
|
||||||
|
};
|
||||||
|
title?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const birthdayPageStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'faq',
|
||||||
|
},
|
||||||
|
title: 'Ответы\\n на вопросы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const graduationPageStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'faq',
|
||||||
|
},
|
||||||
|
title: 'Ответы\\n на вопросы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const outdoorsPageStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Ответы на вопросы',
|
||||||
|
src: faqMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'faq',
|
||||||
|
},
|
||||||
|
title: 'Ответы\\n на вопросы',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Отзывы наших клиентов',
|
||||||
|
src: feedbackMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'feedback',
|
||||||
|
},
|
||||||
|
title: 'Отзывы\\n наших клиентов',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoImage,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Фотографии и видео',
|
||||||
|
src: photoMobileImage,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'gallery',
|
||||||
|
},
|
||||||
|
title: 'Фотографии\n и видео',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const homePageStories: StoryType[] = [
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Рекомендации по квестам',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Рекомендации по квестам',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'Рекомендации\\n по квестам',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'День Рождения в Arkids парке',
|
||||||
|
src: example2,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'День Рождения в Arkids парке',
|
||||||
|
src: example2,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'День Рождения\\n в Arkids парке',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'Новые программы\\n для праздника',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Рекомендации по квестам',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Рекомендации по квестам',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'Рекомендации\\n по квестам',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'День Рождения в Arkids парке',
|
||||||
|
src: example2,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'День Рождения в Arkids парке',
|
||||||
|
src: example2,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'День Рождения\\n в Arkids парке',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'Новые программы\\n для праздника',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: uuid(),
|
||||||
|
img: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
imgMobile: {
|
||||||
|
alt: 'Новые программы для праздника',
|
||||||
|
src: example,
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: 'info',
|
||||||
|
},
|
||||||
|
title: 'Новые программы\\n для праздника',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getStories = (req: Request, res: Response) => {
|
||||||
|
// @ts-ignore
|
||||||
|
const {page} = req.body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
return res.status(200).json(birthdayPageStories);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
return res.status(200).json(graduationPageStories);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
return res.status(200).json(outdoorsPageStories);
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.HOME: {
|
||||||
|
return res.status(200).json(homePageStories);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/api/routes/stories/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import express, { Request, Response } from 'express';
|
||||||
|
import { getStories } from './controller';
|
||||||
|
|
||||||
|
const storiesRouter = express.Router()
|
||||||
|
|
||||||
|
storiesRouter.post('/', (req: Request, res: Response) => {
|
||||||
|
return getStories(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default storiesRouter;
|
||||||
98
src/api/routes/text/controller.ts
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { PAGE_LINK, TextSection } from '../../../constants';
|
||||||
|
|
||||||
|
const birthdayTitleText = {
|
||||||
|
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, тематические программы, '
|
||||||
|
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||||
|
title: 'День Рождения',
|
||||||
|
};
|
||||||
|
|
||||||
|
const graduationTitleText = {
|
||||||
|
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, индивидуальные дипломы, '
|
||||||
|
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||||
|
title: 'Выпускной',
|
||||||
|
};
|
||||||
|
|
||||||
|
const outdoorsTitleText = {
|
||||||
|
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, '
|
||||||
|
+ 'тематические программы, творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||||
|
title: 'Выездной праздник',
|
||||||
|
};
|
||||||
|
|
||||||
|
const questsTitleText = {
|
||||||
|
description: 'Выбираете квест для ребенка? Может, для компании своих друзей/коллег? '
|
||||||
|
+ 'Или просто хотите отдохнуть всей семьей?\\n\\n '
|
||||||
|
+ 'У нас есть решения под любые цели и для любых возрастов!\n',
|
||||||
|
title: 'Квесты',
|
||||||
|
};
|
||||||
|
|
||||||
|
const parkInfo = {
|
||||||
|
text: '-интерактивный парк нового поколения,\n'
|
||||||
|
+ ' объединяющий популярные услуги\n'
|
||||||
|
+ ' и развлечения для детей и взрослых',
|
||||||
|
title: 'Arkids Парк',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTitle = (req: Request, res: Response) => {
|
||||||
|
console.log('headers', req.headers);
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
const body = req.body;
|
||||||
|
console.log('body', body);
|
||||||
|
const { page, section } = body;
|
||||||
|
|
||||||
|
switch (page) {
|
||||||
|
case PAGE_LINK.BIRTHDAY: {
|
||||||
|
switch (section) {
|
||||||
|
case TextSection.TITLE:
|
||||||
|
return res.status(200).json(birthdayTitleText);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.GRADUATION: {
|
||||||
|
switch (section) {
|
||||||
|
case TextSection.TITLE:
|
||||||
|
return res.status(200).json(graduationTitleText);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.OUTDOORS: {
|
||||||
|
switch (section) {
|
||||||
|
case TextSection.TITLE:
|
||||||
|
return res.status(200).json(outdoorsTitleText);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.QUESTS: {
|
||||||
|
switch (section) {
|
||||||
|
case TextSection.TITLE:
|
||||||
|
return res.status(200).json(questsTitleText);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case PAGE_LINK.HOME: {
|
||||||
|
switch (section) {
|
||||||
|
case TextSection.PARK:
|
||||||
|
return res.status(200).json(parkInfo);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return res.status(404);
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/api/routes/text/index.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// const express = require('express')
|
||||||
|
|
||||||
|
import express, { NextFunction, Request, Response } from 'express';
|
||||||
|
import { getTitle } from './controller';
|
||||||
|
const router = express.Router()
|
||||||
|
|
||||||
|
// middleware that is specific to this router
|
||||||
|
router.use((req: Request, res: Response, next: NextFunction) => {
|
||||||
|
console.log('Time: ', Date.now())
|
||||||
|
next()
|
||||||
|
})
|
||||||
|
|
||||||
|
router.get('/', (req: Request, res: Response) => {
|
||||||
|
return res.send('Api text GET response')
|
||||||
|
})
|
||||||
|
|
||||||
|
router.post('/', (req: Request, res: Response) => {
|
||||||
|
return getTitle(req, res);
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
||||||
39
src/constants/colors.module.scss
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Color list
|
||||||
|
$color_veri_peri: #6767AB;
|
||||||
|
$color_veri_peri_dark: #5656A9;
|
||||||
|
$color_orange: #FFB76F;
|
||||||
|
$color_gradient_red: linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%);
|
||||||
|
$color_gradient_red_dark: linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%);
|
||||||
|
$color_gradient_peri: linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%);
|
||||||
|
$color_gradient_peri3: linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%);
|
||||||
|
$color_gradient_peri4: linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%);
|
||||||
|
$color_gradient_peri2: linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%);
|
||||||
|
$color_gradient_yellow: linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%);
|
||||||
|
$color_gradient_orange: linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%);
|
||||||
|
$color_gradient_green: linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%);;
|
||||||
|
$color_white: #FFFFFF;
|
||||||
|
$color_black: #000000;
|
||||||
|
$color_grey: #F1F7FD;
|
||||||
|
$color_green: #15B555;
|
||||||
|
$color_black_light: #3C3C3C;
|
||||||
|
|
||||||
|
:export {
|
||||||
|
veri_peri: $color_veri_peri;
|
||||||
|
veri_peri_dark: $color_veri_peri_dark;
|
||||||
|
orange: $color_orange;
|
||||||
|
gradient_red: $color_gradient_red;
|
||||||
|
gradient_red_dark: $color_gradient_red_dark;
|
||||||
|
gradient_peri: $color_gradient_peri;
|
||||||
|
gradient_peri2: $color_gradient_peri2;
|
||||||
|
gradient_peri3: $color_gradient_peri3;
|
||||||
|
gradient_peri4: $color_gradient_peri4;
|
||||||
|
gradient_yellow: $color_gradient_yellow;
|
||||||
|
gradient_orange: $color_gradient_orange;
|
||||||
|
gradient_green: $color_gradient_green;
|
||||||
|
white: $color_white;
|
||||||
|
black: $color_black;
|
||||||
|
black_light: $color_black_light;
|
||||||
|
grey: $color_grey;
|
||||||
|
green: $color_green;
|
||||||
|
transparent: 'transparent';
|
||||||
|
}
|
||||||
224
src/constants/index.ts
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
export const enum PAGE_LINK {
|
||||||
|
ABOUT = '/about',
|
||||||
|
BIRTHDAY = '/holidays/birthday',
|
||||||
|
COMBO = '/combo',
|
||||||
|
CONTACTS = '/contacts',
|
||||||
|
COOPERATION = '/cooperation',
|
||||||
|
ESCORT = '/escort',
|
||||||
|
FAQ = '/faq',
|
||||||
|
FEEDBACK = '/feedback',
|
||||||
|
FRANCHISE = '/franchise',
|
||||||
|
GALLERY = '/gallery',
|
||||||
|
GRADUATION = '/holidays/graduation',
|
||||||
|
HOLIDAYS = '/holidays',
|
||||||
|
HOME = '/',
|
||||||
|
MASTER_CLASSES = '/master_classes',
|
||||||
|
NEW_YEAR = '/new_year',
|
||||||
|
OUTDOORS = '/holidays/outdoors',
|
||||||
|
PARTNERS = '/partners',
|
||||||
|
PRICE = '/price',
|
||||||
|
QUESTS = '/quests',
|
||||||
|
RENT = '/rent',
|
||||||
|
SERVICE = '/service',
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PAGE_LINK_LABEL_TYPE = {
|
||||||
|
[key in PAGE_LINK]: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const PAGE_LINK_LABEL: PAGE_LINK_LABEL_TYPE = {
|
||||||
|
[PAGE_LINK.ABOUT]: 'О нас',
|
||||||
|
[PAGE_LINK.BIRTHDAY]: 'День Рождения',
|
||||||
|
[PAGE_LINK.HOLIDAYS]: 'Праздники',
|
||||||
|
[PAGE_LINK.HOME]: 'Главная',
|
||||||
|
[PAGE_LINK.COMBO]: 'Комбо',
|
||||||
|
[PAGE_LINK.CONTACTS]: 'Контакты',
|
||||||
|
[PAGE_LINK.COOPERATION]: 'Сотрудничество',
|
||||||
|
[PAGE_LINK.ESCORT]: 'Сопровождение',
|
||||||
|
[PAGE_LINK.FAQ]: 'Частые вопросы',
|
||||||
|
[PAGE_LINK.FEEDBACK]: 'Отзывы',
|
||||||
|
[PAGE_LINK.FRANCHISE]: 'Франшиза',
|
||||||
|
[PAGE_LINK.GRADUATION]: 'Выпускные',
|
||||||
|
[PAGE_LINK.GALLERY]: 'Галерея',
|
||||||
|
[PAGE_LINK.MASTER_CLASSES]: 'Мастер классы',
|
||||||
|
[PAGE_LINK.NEW_YEAR]: 'Новый год',
|
||||||
|
[PAGE_LINK.OUTDOORS]: 'Выездные праздники',
|
||||||
|
[PAGE_LINK.PARTNERS]: 'Корпоративным клиентам и партнёрам',
|
||||||
|
[PAGE_LINK.PRICE]: 'Цены',
|
||||||
|
[PAGE_LINK.QUESTS]: 'Квесты',
|
||||||
|
[PAGE_LINK.RENT]: 'Аренда залов',
|
||||||
|
[PAGE_LINK.SERVICE]: 'Услуги для праздника',
|
||||||
|
};
|
||||||
|
|
||||||
|
export enum TextSection {
|
||||||
|
PARK = 'parkInfo',
|
||||||
|
TITLE = 'title',
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum SERVICE {
|
||||||
|
ANIMATION = 'animation',
|
||||||
|
ANIMATOR = 'animator',
|
||||||
|
CRYO_SHOW = 'cryoShow',
|
||||||
|
DECORATION = 'decoration',
|
||||||
|
DIPLOMA = 'diploma',
|
||||||
|
DURATION = 'duration',
|
||||||
|
FACE_PAINTING = 'facePainting',
|
||||||
|
HALL = 'hall',
|
||||||
|
MASTERCLASS = 'masterclass',
|
||||||
|
PHOTOGRAPHER = 'photographer',
|
||||||
|
PHOTOS = 'photos',
|
||||||
|
QUEST = 'quest',
|
||||||
|
SCREENWRITER = 'screenWriter',
|
||||||
|
SHOW_DISCO = 'showDisco',
|
||||||
|
TABLEWARE_FESTIVE = 'tablewareFestive',
|
||||||
|
TEAM_BUILDING = 'teamBuilding',
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ServiceType = {
|
||||||
|
enabled: boolean;
|
||||||
|
id: SERVICE;
|
||||||
|
name: string;
|
||||||
|
tooltip?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export enum ApiRoute {
|
||||||
|
BREADCRUMBS = '/breadcrumbs',
|
||||||
|
FAQ = '/faq',
|
||||||
|
HALLS = '/halls',
|
||||||
|
INFO = '/info',
|
||||||
|
QUESTS = '/quests',
|
||||||
|
RATE = '/rate',
|
||||||
|
SERVICES = '/services',
|
||||||
|
STATISTIC_INFO = '/statistic',
|
||||||
|
STORIES = '/stories',
|
||||||
|
TEXT = '/text',
|
||||||
|
}
|
||||||
|
|
||||||
|
export const servicesList: { [k in SERVICE]: ServiceType } = {
|
||||||
|
[SERVICE.QUEST]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.QUEST,
|
||||||
|
name: 'Квест',
|
||||||
|
},
|
||||||
|
[SERVICE.ANIMATION]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.ANIMATION,
|
||||||
|
name: 'Тематическая анимация',
|
||||||
|
},
|
||||||
|
[SERVICE.DURATION]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.DURATION,
|
||||||
|
name: 'Продолжительность',
|
||||||
|
},
|
||||||
|
[SERVICE.ANIMATOR]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.ANIMATOR,
|
||||||
|
name: 'Аниматор',
|
||||||
|
},
|
||||||
|
[SERVICE.CRYO_SHOW]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.CRYO_SHOW,
|
||||||
|
name: 'Крио-Шоу',
|
||||||
|
},
|
||||||
|
[SERVICE.DECORATION]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.DECORATION,
|
||||||
|
name: 'Украшение зала',
|
||||||
|
},
|
||||||
|
[SERVICE.DIPLOMA]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.DIPLOMA,
|
||||||
|
name: 'Диплом выпускника',
|
||||||
|
},
|
||||||
|
[SERVICE.FACE_PAINTING]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.FACE_PAINTING,
|
||||||
|
name: 'Аква грим',
|
||||||
|
},
|
||||||
|
[SERVICE.HALL]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.HALL,
|
||||||
|
name: 'Зал для праздника',
|
||||||
|
tooltip: true,
|
||||||
|
},
|
||||||
|
[SERVICE.MASTERCLASS]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.MASTERCLASS,
|
||||||
|
name: 'Мастер класс',
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOGRAPHER]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.PHOTOGRAPHER,
|
||||||
|
name: 'Фотограф',
|
||||||
|
},
|
||||||
|
[SERVICE.PHOTOS]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.PHOTOS,
|
||||||
|
name: 'Фотографии',
|
||||||
|
},
|
||||||
|
[SERVICE.SCREENWRITER]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.SCREENWRITER,
|
||||||
|
name: 'Сценарист',
|
||||||
|
},
|
||||||
|
[SERVICE.SHOW_DISCO]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.SHOW_DISCO,
|
||||||
|
name: 'Шоу дискотека',
|
||||||
|
},
|
||||||
|
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.TABLEWARE_FESTIVE,
|
||||||
|
name: 'Праздничная посуда',
|
||||||
|
},
|
||||||
|
[SERVICE.TEAM_BUILDING]: {
|
||||||
|
enabled: true,
|
||||||
|
id: SERVICE.TEAM_BUILDING,
|
||||||
|
name: 'Тимбилдинг',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export enum ColorVariant {
|
||||||
|
BLACK,
|
||||||
|
BLACK_LIGHT,
|
||||||
|
GRADIENT_PERI,
|
||||||
|
GRADIENT_PERI2,
|
||||||
|
GRADIENT_PERI3,
|
||||||
|
GRADIENT_PERI4,
|
||||||
|
GRADIENT_RED,
|
||||||
|
GRADIENT_RED_DARK,
|
||||||
|
GRADIENT_YELLOW,
|
||||||
|
GRADIENT_ORANGE,
|
||||||
|
GRADIENT_GREEN,
|
||||||
|
GREEN,
|
||||||
|
GREY,
|
||||||
|
ORANGE,
|
||||||
|
TRANSPARENT,
|
||||||
|
VERI_PERI,
|
||||||
|
VERI_PERI_DARK,
|
||||||
|
WHITE,
|
||||||
|
}
|
||||||
|
type ColorType = {
|
||||||
|
[k in ColorVariant]: string;
|
||||||
|
};
|
||||||
|
export const COLORS: ColorType = {
|
||||||
|
[ColorVariant.BLACK]: "#000000",
|
||||||
|
[ColorVariant.BLACK_LIGHT]: "#3C3C3C",
|
||||||
|
[ColorVariant.GRADIENT_PERI]: "linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%)",
|
||||||
|
[ColorVariant.GRADIENT_PERI2]: "linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%)",
|
||||||
|
[ColorVariant.GRADIENT_PERI3]: "linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%)",
|
||||||
|
[ColorVariant.GRADIENT_PERI4]: "linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%)",
|
||||||
|
[ColorVariant.GRADIENT_RED]: "linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)",
|
||||||
|
[ColorVariant.GRADIENT_RED_DARK]: "linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%)",
|
||||||
|
[ColorVariant.GRADIENT_YELLOW]: "linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%)",
|
||||||
|
[ColorVariant.GRADIENT_ORANGE]: "linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%)",
|
||||||
|
[ColorVariant.GRADIENT_GREEN]: "linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%)",
|
||||||
|
[ColorVariant.GREEN]: "#15B555",
|
||||||
|
[ColorVariant.GREY]: "#F1F7FD",
|
||||||
|
[ColorVariant.ORANGE]: "#FFB76F",
|
||||||
|
[ColorVariant.TRANSPARENT]: 'transparent',
|
||||||
|
[ColorVariant.VERI_PERI]: "#6767AB",
|
||||||
|
[ColorVariant.VERI_PERI_DARK]: "#5656A9",
|
||||||
|
[ColorVariant.WHITE]: "#FFFFFF",
|
||||||
|
};
|
||||||
BIN
static/images/information/halls/hall1.jpg
Normal file
|
After Width: | Height: | Size: 414 KiB |
BIN
static/images/information/halls/hall2.jpg
Normal file
|
After Width: | Height: | Size: 272 KiB |
BIN
static/images/information/halls/hall3.jpg
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
static/images/information/statistics/desktop/decoration.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
BIN
static/images/information/statistics/desktop/graduation/kids.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
static/images/information/statistics/desktop/graduation/rate.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/images/information/statistics/desktop/kids.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/images/information/statistics/desktop/like.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
BIN
static/images/information/statistics/desktop/pinata.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
static/images/information/statistics/desktop/programms.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/desktop/quests/eger/map.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
static/images/information/statistics/desktop/rate.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/images/information/statistics/desktop/star.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
static/images/information/statistics/mobile/cup.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/decoration.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 13 KiB |
BIN
static/images/information/statistics/mobile/graduation/kids.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/graduation/rate.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/kids.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/kids2.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/information/statistics/mobile/like.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
BIN
static/images/information/statistics/mobile/outdoors/scooter.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
static/images/information/statistics/mobile/pinata.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
static/images/information/statistics/mobile/programms.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/keys.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/kids.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/map.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
static/images/information/statistics/mobile/rate.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/star.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
static/images/quests/backgrounds/eger/desktop/background.png
Normal file
|
After Width: | Height: | Size: 759 KiB |
BIN
static/images/quests/backgrounds/eger/mobile/background.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
static/images/quests/backgrounds/faraon/desktop/background.png
Normal file
|
After Width: | Height: | Size: 660 KiB |
BIN
static/images/quests/backgrounds/faraon/mobile/background.png
Normal file
|
After Width: | Height: | Size: 183 KiB |
BIN
static/images/quests/backgrounds/main/desktop/eger-card.png
Normal file
|
After Width: | Height: | Size: 308 KiB |
BIN
static/images/quests/backgrounds/main/desktop/faraon-card.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
static/images/quests/backgrounds/main/desktop/mult-card.png
Normal file
|
After Width: | Height: | Size: 307 KiB |
BIN
static/images/quests/backgrounds/main/desktop/quests.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
static/images/quests/backgrounds/main/mobile/eger-card.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
static/images/quests/backgrounds/main/mobile/faraon-card.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
static/images/quests/backgrounds/main/mobile/mult-card.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
static/images/quests/backgrounds/main/mobile/quests.png
Normal file
|
After Width: | Height: | Size: 335 KiB |
BIN
static/images/quests/backgrounds/mult/desktop/background.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
static/images/quests/backgrounds/mult/mobile/background.png
Normal file
|
After Width: | Height: | Size: 339 KiB |
BIN
static/images/quests/stories/eger/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
static/images/quests/stories/eger/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
static/images/quests/stories/eger/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
static/images/quests/stories/eger/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
static/images/quests/stories/eger/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
static/images/quests/stories/eger/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
static/images/quests/stories/faraon/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
static/images/quests/stories/faraon/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
static/images/quests/stories/faraon/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
static/images/quests/stories/faraon/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
static/images/quests/stories/faraon/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
static/images/quests/stories/faraon/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
static/images/quests/stories/mult/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
static/images/quests/stories/mult/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
static/images/quests/stories/mult/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
static/images/quests/stories/mult/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/quests/stories/mult/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/quests/stories/mult/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
static/images/quests/stories/stories/eger/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 25 KiB |