Compare commits

..

6 Commits

Author SHA1 Message Date
RustamRu
95d26e58a3 Merge branch 'feat/landing' of ssh://85.143.175.152:222/dry_wash_inc/dry-wash-pl into feat/landing
All checks were successful
it-academy/dry-wash-pl/pipeline/head This commit looks good
2024-11-16 19:38:06 +03:00
RustamRu
bc629eabdf feat: add navigation keys and routing check (#24) 2024-11-16 19:37:50 +03:00
RustamRu
cba5beda72 feat: add navigation keys and routing check (#24)
All checks were successful
it-academy/dry-wash-pl/pipeline/head This commit looks good
2024-11-16 15:41:14 +03:00
RustamRu
3ade6f83cc Merge branch 'feat/landing' of ssh://85.143.175.152:222/dry_wash_inc/dry-wash-pl into feat/landing
All checks were successful
it-academy/dry-wash-pl/pipeline/head This commit looks good
2024-11-16 14:24:05 +03:00
RustamRu
897602c471 fix: align footer to bottom (#7) 2024-11-16 14:24:02 +03:00
RustamRu
d2b74a1467 fix: align footer to bottom (#7)
All checks were successful
it-academy/dry-wash-pl/pipeline/head This commit looks good
2024-11-10 12:34:01 +03:00
13 changed files with 83 additions and 42 deletions

9
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "0.0.0", "version": "0.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@brojs/cli": "^1.6.1", "@brojs/cli": "^1.6.2",
"@chakra-ui/icons": "^2.2.4", "@chakra-ui/icons": "^2.2.4",
"@chakra-ui/react": "^2.4.2", "@chakra-ui/react": "^2.4.2",
"@emotion/react": "^11.4.1", "@emotion/react": "^11.4.1",
@@ -1564,9 +1564,10 @@
} }
}, },
"node_modules/@brojs/cli": { "node_modules/@brojs/cli": {
"version": "1.6.1", "version": "1.6.2",
"resolved": "https://git.bro-js.ru/api/packages/bro-js/npm/%40brojs%2Fcli/-/1.6.1/cli-1.6.1.tgz", "resolved": "https://git.bro-js.ru/api/packages/bro-js/npm/%40brojs%2Fcli/-/1.6.2/cli-1.6.2.tgz",
"integrity": "sha512-jcRv68xUxQKYdVOH+eFcuV2DquOU1qHqduozghho02aGNUN8/oB2RL5WQ8ssi4wPJ+HpwRpmpqcqQAnnb9F7Cg==", "integrity": "sha512-IDGX5SMt1VQxW2TfY6onazeSjQgUaRut4rwRZVWgBfzHrdp7cHgobciQkF65baT8SfAeaM3w/XHaQr8X1VKGEg==",
"license": "ISC",
"dependencies": { "dependencies": {
"@brojs/dev-server": "^1.6.1", "@brojs/dev-server": "^1.6.1",
"@brojs/fire.app": "^1.6.1", "@brojs/fire.app": "^1.6.1",

View File

@@ -17,7 +17,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@brojs/cli": "^1.6.1", "@brojs/cli": "^1.6.2",
"@chakra-ui/icons": "^2.2.4", "@chakra-ui/icons": "^2.2.4",
"@chakra-ui/react": "^2.4.2", "@chakra-ui/react": "^2.4.2",
"@emotion/react": "^11.4.1", "@emotion/react": "^11.4.1",

24
src/__data__/urls.ts Normal file
View File

@@ -0,0 +1,24 @@
import { generatePath } from "react-router-dom";
import { getNavigationValue } from "@brojs/cli";
import { Order } from "../models";
export const URLs = {
landing: {
url: getNavigationValue("dry-wash.main"),
getUrl() {
return this.url;
}
},
orderForm: {
url: getNavigationValue("dry-wash.create"),
getUrl() {
return this.url;
}
},
orderView: {
url: getNavigationValue("dry-wash.view.order"),
getUrl(orderId: Order.Id) {
return generatePath(this.url, { orderId });
}
}
};

View File

@@ -3,19 +3,13 @@ import Sidebar from '../Sidebar';
import Orders from '../Orders'; import Orders from '../Orders';
import Masters from '../Masters'; import Masters from '../Masters';
import React from 'react'; import React from 'react';
import { Navigate, Route, Routes } from 'react-router-dom';
const LayoutArm = () => ( const LayoutArm = ({ currentPage, onSelectPage }) => (
<Flex h='100vh'> <Flex h='100vh'>
<Sidebar /> <Sidebar onSelectPage={onSelectPage} />
<Box flex='1' bg='gray.50'> <Box flex='1' bg='gray.50'>
<Routes> {currentPage === 'orders' && <Orders />}
<Route> {currentPage === 'masters' && <Masters />}
<Route index element={<Navigate to='orders' replace />} />
<Route path='orders' element={<Orders />} />
<Route path='masters' element={<Masters />} />
</Route>
</Routes>
</Box> </Box>
</Flex> </Flex>
); );

View File

@@ -2,9 +2,7 @@ import { Box, Button, Heading, VStack } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import { Divider } from '@chakra-ui/react'; import { Divider } from '@chakra-ui/react';
import i18next from 'i18next'; import i18next from 'i18next';
import { Link } from 'react-router-dom'; const Sidebar = ({ onSelectPage }) => (
const Sidebar = () => (
<Box <Box
borderRight='1px solid black' borderRight='1px solid black'
bg='gray.50' bg='gray.50'
@@ -20,8 +18,7 @@ const Sidebar = () => (
<VStack align='start' spacing='4'> <VStack align='start' spacing='4'>
<Divider /> <Divider />
<Button <Button
as={Link} onClick={() => onSelectPage('orders')}
to='orders'
w='100%' w='100%'
colorScheme='green' colorScheme='green'
variant='ghost' variant='ghost'
@@ -30,8 +27,7 @@ const Sidebar = () => (
</Button> </Button>
<Divider /> <Divider />
<Button <Button
as={Link} onClick={() => onSelectPage('masters')}
to='masters'
w='100%' w='100%'
colorScheme='green' colorScheme='green'
variant='ghost' variant='ghost'

View File

@@ -1,10 +1,11 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Link as RouterLink } from 'react-router-dom'; import { Link as RouterLink } from 'react-router-dom';
import { ButtonProps, Button } from '@chakra-ui/react'; import { ButtonProps, Button } from '@chakra-ui/react';
import { URLs } from '../../../__data__/urls';
export const CtaButton: FC<ButtonProps> = (props) => { export const CtaButton: FC<ButtonProps> = (props) => {
return ( return (
<Button as={RouterLink} to='/dry-wash/order-form' colorScheme='primary' {...props}> <Button as={RouterLink} to={URLs.orderForm.getUrl()} colorScheme='primary' {...props}>
Сделать заказ Сделать заказ
</Button> </Button>
); );

View File

@@ -1,3 +1,5 @@
import { Order } from "../../models";
type ReviewItem = { type ReviewItem = {
id: string; id: string;
firstname: string; firstname: string;
@@ -31,4 +33,10 @@ export const mockReviews: ReviewItem[] = [
picture: 'https://img.freepik.com/free-photo/portrait-young-blonde-woman-with-plait-polka-dot-blouse_273609-10490.jpg', picture: 'https://img.freepik.com/free-photo/portrait-young-blonde-woman-with-plait-polka-dot-blouse_273609-10490.jpg',
text: "К сожалению, мой опыт с сухой мойкой автомобилей оказался неудачным. Ожидала увидеть чистую машину после процедуры, но многие участки остались незаделанными. Кроме того, процедура заняла больше времени, чем мне обещали. Возможно, в этом конкретном центре что-то пошло не так, но я бы не стала повторно обращаться за этой услугой." text: "К сожалению, мой опыт с сухой мойкой автомобилей оказался неудачным. Ожидала увидеть чистую машину после процедуры, но многие участки остались незаделанными. Кроме того, процедура заняла больше времени, чем мне обещали. Возможно, в этом конкретном центре что-то пошло не так, но я бы не стала повторно обращаться за этой услугой."
}, },
].map((data, i) => ({ id: `review${i}`, ...data })); ].map((data, i) => ({ id: `review${i}`, ...data }));
export const mockOrders: Order.View[] = [
{ id: 'id1' },
{ id: 'id2' },
{ id: 'id3' },
];

1
src/models/index.ts Normal file
View File

@@ -0,0 +1 @@
export * as Order from './order';

5
src/models/order.ts Normal file
View File

@@ -0,0 +1,5 @@
export type Id = string;
export type View = {
id: Id;
};

View File

@@ -2,7 +2,9 @@ import React, { useState } from 'react';
import LayoutArm from '../../components/LayoutArm'; import LayoutArm from '../../components/LayoutArm';
const Page = () => { const Page = () => {
return <LayoutArm />; const [currentPage, setCurrentPage] = useState('orders');
return <LayoutArm currentPage={currentPage} onSelectPage={setCurrentPage} />;
}; };
export default Page; export default Page;

View File

@@ -1,5 +1,5 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Box, Container, VStack } from '@chakra-ui/react'; import { Container, VStack } from '@chakra-ui/react';
import { import {
BenefitsSection, BenefitsSection,
Footer, Footer,
@@ -19,14 +19,12 @@ const Page: FC = () => {
bg='white' bg='white'
centerContent centerContent
> >
<VStack w='full' h='full' alignItems='stretch'> <VStack w='full' h='full' alignItems='stretch' flexGrow={1}>
<HeroSection flexShrink={0} /> <HeroSection flexShrink={0} />
<Box flexGrow={1}> <VStack as='main' flexGrow={1}>
<VStack as='main'> <BenefitsSection />
<BenefitsSection /> <SocialProofSection />
<SocialProofSection /> </VStack>
</VStack>
</Box>
<Footer /> <Footer />
</VStack> </VStack>
</Container> </Container>

View File

@@ -1,7 +1,20 @@
import React from "react"; import React from 'react';
import { Link as RouterLink } from 'react-router-dom';
import { Button } from '@chakra-ui/react';
import { URLs } from '../../__data__/urls';
import { mockOrders } from '../../mocks/landing';
const Page = () => { const Page = () => {
return <h1>Order form </h1>; return (
<>
<h1>Order form</h1>
{mockOrders.map(({ id }) => (
<Button key={id} as={RouterLink} to={URLs.orderView.getUrl(id)}>
Посмотреть заказ {id}
</Button>
))}
</>
);
}; };
export default Page; export default Page;

View File

@@ -2,6 +2,7 @@ import React, { lazy, Suspense } from 'react';
import { Routes, Route } from 'react-router-dom'; import { Routes, Route } from 'react-router-dom';
import { PageSpinner } from './components'; import { PageSpinner } from './components';
import Arm from './pages/arm'; import Arm from './pages/arm';
import { URLs } from './__data__/urls';
const Landing = lazy(() => import('./pages/landing')); const Landing = lazy(() => import('./pages/landing'));
const OrderForm = lazy(() => import('./pages/order-form')); const OrderForm = lazy(() => import('./pages/order-form'));
@@ -11,15 +12,12 @@ const Routers = () => {
return ( return (
<Suspense fallback={<PageSpinner />}> <Suspense fallback={<PageSpinner />}>
<Routes> <Routes>
<Route path='/dry-wash'> <Route path={URLs.landing.url} element={<Landing />} />
<Route index element={<Landing />} /> <Route path={URLs.orderForm.url} element={<OrderForm />} />
<Route path='order-form' element={<OrderForm />} /> <Route path={URLs.orderView.url} element={<OrderView />} />
<Route path='order-view' element={<OrderView />} /> <Route path='/dry-wash/arm' element={<Arm />}></Route>
</Route>
<Route path='/dry-wash/arm/*' element={<Arm />}></Route>
</Routes> </Routes>
</Suspense> </Suspense>
); );
}; };