complete tv page and home

This commit is contained in:
maxnes3 2024-12-11 13:10:02 +04:00
parent 63a5ecd0e4
commit 54ac7aa870
15 changed files with 179 additions and 97 deletions

View File

@ -0,0 +1,14 @@
import classes from './styles.module.scss';
type HomeButtonType = {
imgSrc: string;
onClick: () => void;
};
export const HomeButton = ({ imgSrc, onClick }: HomeButtonType) => {
return (
<button onClick={onClick} className={classes.button}>
<img src={imgSrc} className={classes.icon} />
</button>
);
};

View File

@ -0,0 +1 @@
export { HomeButton } from './home.button';

View File

@ -0,0 +1,31 @@
@use '@shared/assets/styles/adaptive' as adaptive;
@use '@shared/assets/styles/theme' as theme;
$adaptive: (
desktop: (
size: 250px,
),
table: (
size: 250px,
),
mobile: (
size: auto,
),
);
.button {
border: 0;
background-color: transparent;
border: 2px solid transparent;
border-radius: 16px;
transition: 0.3s ease;
cursor: pointer;
.icon {
padding: 8px;
@include adaptive.set-adaptive($adaptive, width, size);
@include adaptive.set-adaptive($adaptive, height, size);
}
&:hover { @include theme.hoverBorder(); }
}

View File

@ -1,11 +1,27 @@
import classes from './styles.module.scss'; import classes from './styles.module.scss';
import Laptop from '@shared/assets/icons/laptop.svg'; import TV from '@shared/assets/images/tv.png';
import Laptop from '@shared/assets/images/laptop.png';
import { HomeButton } from './components/home.button';
import { useNavigate } from 'react-router-dom';
const HomePage = () => { const HomePage = () => {
const navigation = useNavigate();
const handleLaptopRedirect = () => {
navigation('/laptop');
};
const handleTVRedirect = () => {
navigation('/tv');
};
return ( return (
<div className={classes.home}> <div className={classes.home}>
<Laptop className={classes.laptop} /> <h1 className={classes.title}>Выберите тип обученной модели</h1>
<div className={classes.container}></div> <div className={classes.container}>
<HomeButton imgSrc={Laptop} onClick={handleLaptopRedirect} />
<HomeButton imgSrc={TV} onClick={handleTVRedirect} />
</div>
</div> </div>
); );
}; };

View File

@ -1,36 +1,20 @@
@use '../../shared/assets/styles/adaptive' as adaptive; @use '@shared/assets/styles/fonts' as fonts;
$adaptive: (
desktop: (
flex-direction: row,
size: 250px,
container-width: 768px
),
table: (
flex-direction: row,
size: 250px,
container-width: 425px
),
mobile: (
flex-direction: column,
size: auto,
container-width: auto
),
);
.home { .home {
display: flex; display: flex;
flex-direction: column;
justify-content: center; justify-content: center;
width: 100%; width: 100%;
@include adaptive.set-adaptive($adaptive, flex-direction, flex-direction); gap: 36px;
.laptop { .title {
@include adaptive.set-adaptive($adaptive, width, size); margin: 0 auto;
@include adaptive.set-adaptive($adaptive, height, size); @include fonts.urbanist-font(40px, 600);
} }
.container { .container {
padding: 15px; display: flex;
@include adaptive.set-adaptive($adaptive, width, container-width); margin: 0 auto;
gap: 24px;
} }
} }

View File

@ -1,13 +1,13 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom'; import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Layout from '@app/layout/layout'; import Layout from '@app/layout/layout';
import HomePage from '@pages/home/home.page'; import HomePage from '@pages/home/home.page';
import { LaptopPage } from '@pages/laptop'; import { LaptopPredictPage } from '@pages/laptop';
// import { TVPage } from '@pages/tv/tv.page'; import { TVPredictPage } from '@pages/tv';
const routes = [ const routes = [
{ path: '/', element: <HomePage /> }, { path: '/', element: <HomePage /> },
{ path: '/laptop', element: <LaptopPage /> }, { path: '/laptop', element: <LaptopPredictPage /> },
// { path: '/tv', element: <TVPage /> }, { path: '/tv', element: <TVPredictPage /> },
]; ];
const Index = () => { const Index = () => {

View File

@ -1 +1 @@
export { default as LaptopPage } from './laptop.page'; export { default as LaptopPredictPage } from './laptop.page';

View File

@ -27,6 +27,10 @@ $adaptive: (
.icon { .icon {
@include adaptive.set-adaptive($adaptive, width, size); @include adaptive.set-adaptive($adaptive, width, size);
@include adaptive.set-adaptive($adaptive, height, size); @include adaptive.set-adaptive($adaptive, height, size);
@media (max-width: 768px) {
padding: 8px;
}
} }
.container { .container {

View File

@ -0,0 +1 @@
export { default as TVPredictPage } from './tv.page';

View File

@ -27,6 +27,10 @@ $adaptive: (
.icon { .icon {
@include adaptive.set-adaptive($adaptive, width, size); @include adaptive.set-adaptive($adaptive, width, size);
@include adaptive.set-adaptive($adaptive, height, size); @include adaptive.set-adaptive($adaptive, height, size);
@media (max-width: 768px) {
padding: 8px;
}
} }
.container { .container {

View File

@ -1,73 +1,82 @@
// import Form from '@/widgets/form/form.widget'; import Form from '@/widgets/form/form.widget';
// import classes from './styles.module.scss'; import classes from './styles.module.scss';
// import TV from '@shared/assets/images/tv.png'; import TV from '@shared/assets/images/tv.png';
// import { FormEvent, useCallback, useEffect, useState } from 'react'; import { FormEvent, useCallback, useEffect, useState } from 'react';
// import { import {
// TVCreatePredictType, TVCreatePredictType,
// TVGetDataPredictType, TVGetDataPredictType,
// PredictResponseType, PredictResponseType,
// } from '@/shared/types'; } from '@/shared/types';
// import { apiTV } from '@/shared/api'; import { apiTV } from '@/shared/api';
// const TVPredictPage = () => { const TVPredictPage = () => {
// const [requestSelectorsData, setRequestSelectorsData] = useState< const [requestSelectorsData, setRequestSelectorsData] = useState<
// TVGetDataPredictType | undefined TVGetDataPredictType | undefined
// >(); >();
// const [request, setRequest] = useState<TVCreatePredictType>({ const [request, setRequest] = useState<TVCreatePredictType>({
// display display: '',
// }); tuners: '',
features: '',
os: '',
power_of_volume: '',
screen_size: 0,
color: '',
});
// const [response, setResponse] = useState<PredictResponseType>({ const [response, setResponse] = useState<PredictResponseType>({
// predicted_price: undefined, predicted_price: undefined,
// }); });
// const handleGetPredict = async (event: FormEvent) => { const handleGetPredict = async (event: FormEvent) => {
// event.preventDefault(); event.preventDefault();
// console.log(request); console.log(request);
// const newResponse = await apiTV.predictPrice(request); const newResponse = await apiTV.predictPrice(request);
// setResponse(newResponse); setResponse(newResponse);
// }; };
// const handleInputChange = useCallback( const handleInputChange = useCallback(
// (updatedRequest: TVCreatePredictType) => { (updatedRequest: TVCreatePredictType) => {
// setRequest(updatedRequest); setRequest(updatedRequest);
// }, },
// [], [],
// ); );
// const updateField = (field: string, value: string) => { const updateField = (
// handleInputChange({ field: keyof TVGetDataPredictType,
// ...request, value: string | number,
// [field]: value, ) => {
// }); handleInputChange({
// }; ...request,
[field]: value,
});
};
// useEffect(() => { useEffect(() => {
// const fetchData = async () => { const fetchData = async () => {
// const responseSelectorData = await apiTV.getDataForRequest(); const responseSelectorData = await apiTV.getDataForRequest();
// if (!responseSelectorData) { if (!responseSelectorData) {
// return; return;
// } }
// setRequestSelectorsData(responseSelectorData); setRequestSelectorsData(responseSelectorData);
// }; };
// fetchData(); fetchData();
// }, []); }, []);
// return ( return (
// <div className={classes.tv}> <div className={classes.tv}>
// <img src={TV} className={classes.icon} /> <img src={TV} className={classes.icon} />
// <div className={classes.container}> <div className={classes.container}>
// <Form <Form
// selectorsData={requestSelectorsData} selectorsData={requestSelectorsData}
// updateField={updateField} updateField={updateField}
// handleGetPredict={handleGetPredict} handleGetPredict={handleGetPredict}
// response={response} response={response}
// /> />
// </div> </div>
// </div> </div>
// ); );
// }; };
// export default TVPredictPage; export default TVPredictPage;

View File

@ -35,6 +35,7 @@ const Form = <T extends Record<string, string[] | number[]>>({
</Expander> </Expander>
))} ))}
</div> </div>
<div className={classes.divider} />
<Button onClick={(e: FormEvent) => handleGetPredict(e)}>Submit</Button> <Button onClick={(e: FormEvent) => handleGetPredict(e)}>Submit</Button>
{response.predicted_price !== undefined && ( {response.predicted_price !== undefined && (
<span style={{ color: 'white' }}> <span style={{ color: 'white' }}>

View File

@ -14,4 +14,11 @@
flex-direction: column; flex-direction: column;
gap: 8px; gap: 8px;
} }
.divider {
height: 4px;
width: 100%;
background-color: var(--primary-white);
border-radius: 8px;
}
} }

View File

@ -1,11 +1,20 @@
import { useNavigate } from 'react-router-dom';
import classes from './styles.module.scss'; import classes from './styles.module.scss';
const Navbar = () => { const Navbar = () => {
const navigation = useNavigate();
const handleHomeRedirect = () => {
navigation('/');
};
return ( return (
<nav className={classes.navbar}> <nav className={classes.navbar}>
<div className={classes.container}> <div className={classes.container}>
<div className={classes.logo}> <div className={classes.logo}>
<h1 className={classes.title}>Price Builder</h1> <h1 className={classes.title} onClick={handleHomeRedirect}>
Price Builder
</h1>
<span className={classes.version}>v1.0.0</span> <span className={classes.version}>v1.0.0</span>
</div> </div>
</div> </div>

View File

@ -26,6 +26,7 @@ $adaptive: (
color: var(--primary-black); color: var(--primary-black);
.title { .title {
cursor: pointer;
margin: 0; margin: 0;
transition: 0.3s ease; transition: 0.3s ease;
@include fonts.urbanist-font(36px, 600); @include fonts.urbanist-font(36px, 600);