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 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 navigation = useNavigate();
const handleLaptopRedirect = () => {
navigation('/laptop');
};
const handleTVRedirect = () => {
navigation('/tv');
};
return (
<div className={classes.home}>
<Laptop className={classes.laptop} />
<div className={classes.container}></div>
<h1 className={classes.title}>Выберите тип обученной модели</h1>
<div className={classes.container}>
<HomeButton imgSrc={Laptop} onClick={handleLaptopRedirect} />
<HomeButton imgSrc={TV} onClick={handleTVRedirect} />
</div>
</div>
);
};

View File

@ -1,36 +1,20 @@
@use '../../shared/assets/styles/adaptive' as adaptive;
$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
),
);
@use '@shared/assets/styles/fonts' as fonts;
.home {
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
@include adaptive.set-adaptive($adaptive, flex-direction, flex-direction);
gap: 36px;
.laptop {
@include adaptive.set-adaptive($adaptive, width, size);
@include adaptive.set-adaptive($adaptive, height, size);
.title {
margin: 0 auto;
@include fonts.urbanist-font(40px, 600);
}
.container {
padding: 15px;
@include adaptive.set-adaptive($adaptive, width, container-width);
display: flex;
margin: 0 auto;
gap: 24px;
}
}

View File

@ -1,13 +1,13 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Layout from '@app/layout/layout';
import HomePage from '@pages/home/home.page';
import { LaptopPage } from '@pages/laptop';
// import { TVPage } from '@pages/tv/tv.page';
import { LaptopPredictPage } from '@pages/laptop';
import { TVPredictPage } from '@pages/tv';
const routes = [
{ path: '/', element: <HomePage /> },
{ path: '/laptop', element: <LaptopPage /> },
// { path: '/tv', element: <TVPage /> },
{ path: '/laptop', element: <LaptopPredictPage /> },
{ path: '/tv', element: <TVPredictPage /> },
];
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 {
@include adaptive.set-adaptive($adaptive, width, size);
@include adaptive.set-adaptive($adaptive, height, size);
@media (max-width: 768px) {
padding: 8px;
}
}
.container {

View File

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

View File

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

View File

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

View File

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

View File

@ -14,4 +14,11 @@
flex-direction: column;
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';
const Navbar = () => {
const navigation = useNavigate();
const handleHomeRedirect = () => {
navigation('/');
};
return (
<nav className={classes.navbar}>
<div className={classes.container}>
<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>
</div>
</div>

View File

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