From 63a5ecd0e492f030c445cf14680a08ab41d75703 Mon Sep 17 00:00:00 2001 From: maxnes3 Date: Wed, 11 Dec 2024 04:28:29 +0400 Subject: [PATCH] complete laptop --- src/declaration.d.ts | 5 ++ src/pages/home/home.page.tsx | 5 +- src/pages/index.tsx | 8 ++- src/pages/laptop/index.ts | 1 + src/pages/laptop/laptop.page.tsx | 84 ++++++++++++++++++++++++++++ src/pages/laptop/styles.module.scss | 36 ++++++++++++ src/pages/tv/index.ts | 0 src/pages/tv/styles.module.scss | 36 ++++++++++++ src/pages/tv/tv.page.tsx | 73 ++++++++++++++++++++++++ src/shared/api/api.laptop.ts | 40 +++++++++++++ src/shared/api/api.ts | 24 -------- src/shared/api/api.tv.ts | 40 +++++++++++++ src/shared/api/index.ts | 2 + src/shared/assets/images/laptop.png | Bin 0 -> 22018 bytes src/shared/assets/images/tv.png | Bin 0 -> 16011 bytes src/shared/types/index.ts | 1 + src/shared/types/predict.ts | 42 +++++++++++--- src/widgets/form/form.widget.tsx | 71 +++++++---------------- 18 files changed, 382 insertions(+), 86 deletions(-) create mode 100644 src/pages/laptop/index.ts create mode 100644 src/pages/laptop/laptop.page.tsx create mode 100644 src/pages/laptop/styles.module.scss create mode 100644 src/pages/tv/index.ts create mode 100644 src/pages/tv/styles.module.scss create mode 100644 src/pages/tv/tv.page.tsx create mode 100644 src/shared/api/api.laptop.ts delete mode 100644 src/shared/api/api.ts create mode 100644 src/shared/api/api.tv.ts create mode 100644 src/shared/api/index.ts create mode 100644 src/shared/assets/images/laptop.png create mode 100644 src/shared/assets/images/tv.png create mode 100644 src/shared/types/index.ts diff --git a/src/declaration.d.ts b/src/declaration.d.ts index 5649f3a..42f3ad4 100644 --- a/src/declaration.d.ts +++ b/src/declaration.d.ts @@ -6,3 +6,8 @@ declare module '*.svg' { >; export default ReactComponent; } + +declare module '*.png' { + const value: string; + export default value; +} diff --git a/src/pages/home/home.page.tsx b/src/pages/home/home.page.tsx index f2e79ac..614c863 100644 --- a/src/pages/home/home.page.tsx +++ b/src/pages/home/home.page.tsx @@ -1,4 +1,3 @@ -import Form from '@/widgets/form/form.widget'; import classes from './styles.module.scss'; import Laptop from '@shared/assets/icons/laptop.svg'; @@ -6,9 +5,7 @@ const HomePage = () => { return (
-
-
-
+
); }; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index d3e8a76..6f9aa3d 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,8 +1,14 @@ 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'; -const routes = [{ path: '/', element: }]; +const routes = [ + { path: '/', element: }, + { path: '/laptop', element: }, + // { path: '/tv', element: }, +]; const Index = () => { return ( diff --git a/src/pages/laptop/index.ts b/src/pages/laptop/index.ts new file mode 100644 index 0000000..09a8e61 --- /dev/null +++ b/src/pages/laptop/index.ts @@ -0,0 +1 @@ +export { default as LaptopPage } from './laptop.page'; diff --git a/src/pages/laptop/laptop.page.tsx b/src/pages/laptop/laptop.page.tsx new file mode 100644 index 0000000..989afed --- /dev/null +++ b/src/pages/laptop/laptop.page.tsx @@ -0,0 +1,84 @@ +import Form from '@/widgets/form/form.widget'; +import classes from './styles.module.scss'; +import Laptop from '@shared/assets/images/laptop.png'; +import { FormEvent, useCallback, useEffect, useState } from 'react'; +import { + LaptopCreatePredictType, + LaptopGetDataPredictType, + PredictResponseType, +} from '@/shared/types'; +import { apiLaptop } from '@/shared/api'; + +const LaptopPredictPage = () => { + const [requestSelectorsData, setRequestSelectorsData] = useState< + LaptopGetDataPredictType | undefined + >(); + + const [request, setRequest] = useState({ + processor: '', + ram: 0, + os: '', + ssd: 0, + display_size: 0, + resolution: '', + matrix_type: '', + gpu: '', + }); + + const [response, setResponse] = useState({ + predicted_price: undefined, + }); + + const handleGetPredict = async (event: FormEvent) => { + event.preventDefault(); + console.log(request); + const newResponse = await apiLaptop.predictPrice(request); + setResponse(newResponse); + }; + + const handleInputChange = useCallback( + (updatedRequest: LaptopCreatePredictType) => { + setRequest(updatedRequest); + }, + [], + ); + + const updateField = ( + field: keyof LaptopGetDataPredictType, + value: string | number, + ) => { + handleInputChange({ + ...request, + [field]: value, + }); + console.log(value); + }; + + useEffect(() => { + const fetchData = async () => { + const responseSelectorData = await apiLaptop.getDataForRequest(); + if (!responseSelectorData) { + return; + } + setRequestSelectorsData(responseSelectorData); + }; + + fetchData(); + }, []); + + return ( +
+ +
+ +
+
+ ); +}; + +export default LaptopPredictPage; diff --git a/src/pages/laptop/styles.module.scss b/src/pages/laptop/styles.module.scss new file mode 100644 index 0000000..46abeb4 --- /dev/null +++ b/src/pages/laptop/styles.module.scss @@ -0,0 +1,36 @@ +@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 + ), +); + +.laptop { + display: flex; + justify-content: center; + width: 100%; + @include adaptive.set-adaptive($adaptive, flex-direction, flex-direction); + + .icon { + @include adaptive.set-adaptive($adaptive, width, size); + @include adaptive.set-adaptive($adaptive, height, size); + } + + .container { + padding: 15px; + @include adaptive.set-adaptive($adaptive, width, container-width); + } +} \ No newline at end of file diff --git a/src/pages/tv/index.ts b/src/pages/tv/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/tv/styles.module.scss b/src/pages/tv/styles.module.scss new file mode 100644 index 0000000..488129d --- /dev/null +++ b/src/pages/tv/styles.module.scss @@ -0,0 +1,36 @@ +@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 + ), +); + +.tv { + display: flex; + justify-content: center; + width: 100%; + @include adaptive.set-adaptive($adaptive, flex-direction, flex-direction); + + .icon { + @include adaptive.set-adaptive($adaptive, width, size); + @include adaptive.set-adaptive($adaptive, height, size); + } + + .container { + padding: 15px; + @include adaptive.set-adaptive($adaptive, width, container-width); + } +} \ No newline at end of file diff --git a/src/pages/tv/tv.page.tsx b/src/pages/tv/tv.page.tsx new file mode 100644 index 0000000..e8532b5 --- /dev/null +++ b/src/pages/tv/tv.page.tsx @@ -0,0 +1,73 @@ +// 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 [request, setRequest] = useState({ +// display +// }); + +// const [response, setResponse] = useState({ +// predicted_price: undefined, +// }); + +// 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 updateField = (field: string, value: string) => { +// handleInputChange({ +// ...request, +// [field]: value, +// }); +// }; + +// useEffect(() => { +// const fetchData = async () => { +// const responseSelectorData = await apiTV.getDataForRequest(); +// if (!responseSelectorData) { +// return; +// } +// setRequestSelectorsData(responseSelectorData); +// }; + +// fetchData(); +// }, []); + +// return ( +//
+// +//
+// +//
+//
+// ); +// }; + +// export default TVPredictPage; diff --git a/src/shared/api/api.laptop.ts b/src/shared/api/api.laptop.ts new file mode 100644 index 0000000..e4acc4d --- /dev/null +++ b/src/shared/api/api.laptop.ts @@ -0,0 +1,40 @@ +import axios from 'axios'; +import { + LaptopGetDataPredictType, + LaptopCreatePredictType, + PredictResponseType, +} from '../types'; + +class ApiLaptop { + readonly baseURL = import.meta.env.VITE_SERVER_URL; + + getDataForRequest = async (): Promise => { + try { + const response = await axios.get( + `${this.baseURL}/get_unique_data_laptop`, + ); + return response.data; + } catch (error) { + console.error('Error predicting price:', error); + throw error; + } + }; + + predictPrice = async ( + data: LaptopCreatePredictType, + ): Promise => { + try { + const response = await axios.post( + `${this.baseURL}/predict_price/laptop/`, + data, + ); + return response.data; + } catch (error) { + console.error('Error predicting price:', error); + throw error; + } + }; +} + +const apiLaptop = new ApiLaptop(); +export default apiLaptop; diff --git a/src/shared/api/api.ts b/src/shared/api/api.ts deleted file mode 100644 index d193e6d..0000000 --- a/src/shared/api/api.ts +++ /dev/null @@ -1,24 +0,0 @@ -import axios from 'axios'; -import { PredictRequestType, PredictResponseType } from '../types/predict'; - -class Api { - readonly baseURL = import.meta.env.VITE_SERVER_URL; - - predictPrice = async ( - data: PredictRequestType, - ): Promise => { - try { - const response = await axios.post( - `${this.baseURL}/predict_price`, - data, - ); - return response.data; - } catch (error) { - console.error('Error predicting price:', error); - throw error; - } - }; -} - -const api = new Api(); -export default api; diff --git a/src/shared/api/api.tv.ts b/src/shared/api/api.tv.ts new file mode 100644 index 0000000..a1753cc --- /dev/null +++ b/src/shared/api/api.tv.ts @@ -0,0 +1,40 @@ +import axios from 'axios'; +import { + TVCreatePredictType, + TVGetDataPredictType, + PredictResponseType, +} from '../types'; + +class ApiTV { + readonly baseURL = import.meta.env.VITE_SERVER_URL; + + getDataForRequest = async (): Promise => { + try { + const response = await axios.get( + `${this.baseURL}/get_unique_data_tv`, + ); + return response.data; + } catch (error) { + console.error('Error predicting price:', error); + throw error; + } + }; + + predictPrice = async ( + data: TVCreatePredictType, + ): Promise => { + try { + const response = await axios.post( + `${this.baseURL}/predict_price/tv/`, + data, + ); + return response.data; + } catch (error) { + console.error('Error predicting price:', error); + throw error; + } + }; +} + +const apiTV = new ApiTV(); +export default apiTV; diff --git a/src/shared/api/index.ts b/src/shared/api/index.ts new file mode 100644 index 0000000..5fe707f --- /dev/null +++ b/src/shared/api/index.ts @@ -0,0 +1,2 @@ +export { default as apiLaptop } from './api.laptop'; +export { default as apiTV } from './api.tv'; diff --git a/src/shared/assets/images/laptop.png b/src/shared/assets/images/laptop.png new file mode 100644 index 0000000000000000000000000000000000000000..1d75f842f2e3cb2ff8c3e33efe69b595fcdf1976 GIT binary patch literal 22018 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 literal 0 HcmV?d00001 diff --git a/src/shared/assets/images/tv.png b/src/shared/assets/images/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..e827f3f88ed852f829102444fe88650b13c0f1c7 GIT binary patch literal 16011 zcmd73byQT*_cwg$E9o1`)7G8M;HdYXIp6r9=<~5v4n204YhSp+ia{77OOiIs5Fp&(6=;C-#YsItd{?Apig*ni?w4000yG7Zbq81^=A* zO-xnSd`Rb|YUuUc)z-_`!ovpe_4VaX=*Tlw~KiO3#MyXp34%HyPNpbh7ne<{raHqW_1R!lb-$-cJ zNyzhF3vpWR#nS4)Js?pCEF1*;!!g`zs;u5BnJA%TikV(PQ4RKZQeg!Ng@yGSfYZ<_DT z32g)|Gvd0M$bEZAdySuZ$q_YIwE}hKk&6+U^0t6Dd{tr;%klf){z#t0}@pm z4CITQpF7{@XtDYi1FV-`#ZYCT`A0w4{aWz`0ubz)W_x(AIP@jo7+Aqm3z- zbSp;rfFnqmcIgB=HfQYf+@MK)&$xlUWj}cNMn)V#N(lTOKA)p8A96MKBU^6a zS1(L{Nc)Pl8YN&y{e7#Mwx1IR*b)F&Aqu4$IIxf$@s@(@XSZ~O#1WwKXB;1ve@nf2 z0;C}Q;G`64EI-uR2{zckbqYt*X^#=Lt-7A&**?$&>wHYu$<*x`*T-RjuuHvK>h``= zI@`*#1J;Y@d&;bBg#c@tyV)@@1oeql4*Lx>^S&_57~ZaQ!RgF%3kUg>1;tT%&@ha9 zK(@92y?7*3BZ&G!_~{A3Fwf!+$R%m8qL%Q!OJ39w3b-IRX}Yt8Lv({DeuZsEec%pF zAeIY$swHzi^Sp8;6jv^Wd7W}A8o!bB2K99>mOV)o55`;3`q{qNRzT+P&r~d~2xk3Q z*Q`g!@?FC2zm6m4(ZQ>kVQ{|<8$`E~eW?S(2p{dLHm#K{;fuxlo0=CIsT6Bj5YB?_D6gu*cF&gH35B(r4-H;euaJ6i^7X+8UdWnfueb9_ zsMRIh=~mV#2QKi0A8~jazVl2)g{=h=aZ5Aehq@F&eBX?Yz9x!xnO^eUT5>)UGy{49 zj7^8%#OeK9&)E?M2g`H7O}tNO7He)tQOitMcm}3d4J=23b5B?EX(I}Z>7K3%Kp?mE zgu4cz`*8xdodu{B8(Bc!eQWXn^OZtP6Qv$E*;78p?}afjl9WbPp*OA-Z8ujDp@&L9 zVV>LzS1uDVx5 zF4D5!n+^hj2w0JX;+rpq_S@-_$Q~#naBQ@zUKBkWD-8u_vN-K>o38n1w(zsX6Dt1l zCIBZ?bhZp)@%up4HfSRb@XEh|F-MBeYLDF%n-d)76twE}H$Nt(aHc;mOsxD{AH9`n z75rmNj7CoB5%Az?rs%>=e2hl3p7%E%2qaB@`x`X{MgM&qfPx~G@fiRT>%aH^`-cL! zH%7c(hg+E0I(CIdH*G^571mV38?L*UGFT7HXQLj^k^`&$*dZMbi4e$`{Au6c7d2hJ z)H$M%o#tFsx)|V)qvD4vmAa8d5TXeF_1QV%-jp<#s*1|kYWTgzpxU2id+*nO+0J=O zslU0p2lM7wK7aIW{MSVV7jyj)4Fv@T?U9UJy-!vZ>*}T^^ZV`&m?9kkD|qsmp52E z7zuA$R#a80yCoJF-Z%nIPNTG8oS!W|?l%kjlU#}G)acnreign*L}?J{>rGz7uc=DG zB+8;z^&87oOd|q-F-JW*eJZE{#ZufI;4}k9@?M;`4ufVY zAEY_Wy}P~ddf*2u7i-roH-}rl5dP~Kqaj>9R+D{?5O8>Y1~o`YP*MvarO@oDjKUsQ z11YyA5Wl&kyOdI4qf-@=aQMWVCT>Ik7_aE6nEo{IOc!qkRR|&lMk3ItmBEbazy5)$ zkze8J3uT8F(S|g+TAM5)U8Leh#Hx89th^jvb-!)y)UB1YWz)QT;X41=Er=|NurdUH z>ck$eRv&+4uv6vJb)ZwAXP&_)r|jHT6D>_999XM;tLjZKetl>U1zz}bOTVF ztoUFBip7$@El$fHN%2^srCpr3gF&Ao@Fr6H#+;>=Q8Wf`%b4T70OHv*&8Grne3cFR z^+)nAq{H7|r?<_`v@Cz`keuicm@G70E+A+i=_&AfkjaT2t%bo#w!OD6zguhc2W~CW zv?`lfjl256&MsYgN~JAOc3chNvGv#E0ec-4@b?25# zDHGR|M9mpm>CsNyC7*#5Jnq)ZP({vy-<@1d0vo0pj+ifVqTES~oSJ^D7G6X@-Zp;p z70h;HV%AbHVW4*<{eS&%hDlE0PeO5MUEFnBMyl)caCZrbPgGX9nS8{+%5_0CAQu@P z&EiKpVjd7UTYglsUtx1d`~oxiZ8v5wX{MAzZD*A-d%~91dNnqBf1`iZXH-bMoHuqA zJ|C+)l5Uf&5Q=&v_Td@tvVR1^UX6NVj^cQaV`NC;^6Yqgf{@u2+7K@BNsUw6>%m{v zAuQPtrS419^9=5?_-~g4!Ks|yxu$)ib*;sd8%xymkJWFX6csPd=;-->v!9xN{t+Z? zc`cG2RAKI?{>R<%&F>NSBI6N7#UQmLvj3Qi+MNmrVKMGar`%za5 zPdw!am2VhD^eh2&1(;pD1KCbDW{y3Eq#}O zGReM~uS%=6kZiIl`|7pSP}>i$t2IQ1yb7zBVhDbfOAL~E5gm6+x1<~9>Youx1c?NC zpH1^<{3fof&ne$u4aX}k<@n{=TBm1drgaD-Ff`kldP}8z9?W~u&m>ZwU@{;eAlg(s ziQ4mb>cV-nP6Zv2^B;}BXs*zXHhHvC_WDHSR|JW&;3O;n?_pB4Z~ws}H?uTmH*?U| zdqKkc?9*aP3u6-xFQjD0_s-1ZiLKtQC7bcWvz=D5>9U*~=k}$P5r6aa-?=2(jwGQR zAKBzPmW`etf9{sJjq#pxi`&4KEC5nC!@|U5?NdlM|D+;wH{E)^E|?kV|6Td<6rp!w z%2IA4op5pfl6hxKinN!uYt*geU{m{D#pOLt6^zS7#eI8x1r-mMUP{Wxlh;e9W+k|O z4)htG)>H8J^n`9o7~q$@)fr652M5>wBv1O?5vYRidk#t;h(Ogzd#U@FPY|(v^iwXH zg6cNRWUbg>gG9!O3gb%K6Hr-u+w-%sp12Mx{dz-rdJYy$(%{X$i`=w(pWE=_=Ta%^ z{>+w963N}TD@|}2Q&HpBA_g6CU0%BF?zEqc-43kJQ6kIzvCZkn)N$KEvTp)_E8To0 zimllvVaEvO??>|XHWd7ZL_1d}qMFHj`M#9a)vdEj9@;#>$$Pm-$e7FM2(+!S`(x1f zZA({#d~DgGdree$6w0im;JomF3Q+m`s+8E(w5?X3ThMJbZgFyg(_-yU`SX{n-@`wx zmwISpD6ox05glfzE?%-YLUDL<204Vkpyz#E>zJGRF~{YYs9#M<_W~4!zctKLUs-G; zLP2W&hZ-9%deoo9`wN>ltAt{nFRh<|R=qa#6_T4Xiv4{CS@Dq*(*Fb??@td$1iu!D z)%>%Ee|8>91f|f7!h~t$H1D}~Dyj}U@DBPQ4-)Z$~>K9F_ zHCSb?h1r>}{#XPYTn>&Nu$Nm0o zR#T1d%9!M9O5v|Zk4fJD^&?&dOPp_lKDO`v0V&20_u=hz7e=p6H{Z4}3{#J3G8yr_ zU@E)Zx(q8b`OcregnQtFkK;G<-&t)&T+duCOImcwf2zxfyd)*^bTJ-Esbu00Fpji? z3tUiX$xRxEZ9jqiqVCE51hA&*^^z%)A8TEAIDF}yFS$+Zsw}8(MNqfyyTKQ;y2z58 zA8vB-w{KhPC%1Xf+MebRenY&FbQz~jrzELgx?m%d7tHJP-`t#ioP^k_&6J3SRFl^! z&6cHH&QL3M*iGgLPZnV3v87IolEXBp{c#t`kM~2r;^>ZaOZV7gUX!vNU0CM(=dH9I z$VcX1zpWviyI^tj(#y`j=zrd{2JNNXRGY)3T=hQN%QN#?4V8TF)3>;A3@#SC#Kh(R zR?%sy>Tg?;QQhvS7p(_Z@Cb>DBzZgwpuLE{<*#-9_v1$P_Wd#%#xB(ZnUI;y_ly-H zA~P+wbe}ojJx+2$MVHdTLyaLGD(-ej`4;lfPx;T)(`I~G_sLcAT^??Ju@OV!wYeM% z<=%Xr)CyU+F=;7IL@AD^lTdG1%8~Mvd;l2``yS>!!00Le=U2901q;8|CM%l-Y+v#g zzFN(zn-rYud-I3kF!K<Ayl zvdV9Z&=5ZbXPIlRsnW#uee~{fJ}96uxA?AHywHALGM;3ZWgr0mfL76*#s!qS?aM~}WU!gt_*9r1bYsAXRFk@*p` zmhWxYWydVzpXpUgxue57JIO{j*VB$?s9;CO?2RxGrAcG|)a|!`8X4}DM;S^j3IY4? zVX_hDyQsdO*a32+w9G~~Ut{0vpn6xO!K6j;-wgMCBu3u1-oW5HlqjEJ__$Dn25w<+ z()%eK#vrr>-m%*a4i#C{Z~wlfqmW<~O39qmbO2KxPwzi99vtEe;o@+sbVy_IeXHrN z16m9(aV3u$Fnt%)n_%|Ev98p}Kn~o1f+oAXq|1vnt=)iEN8bdg2X4(K7rLd`jnFFy zJxf3Uz0ixzKiGM4Sq!C`q0!B#ec4#1om9MYfvW?3r&}}rrj6y?G(H?4wUjo_U41In zyt(cM!SH)X{*TH66ooq@kG8@2-bFxp;m{9*ZNNeQ0$DCpR% zRda#L_PZ53!Kzg)o=YCGQcJ=6q43Cp^(!ae9=YKmGk;6XIV=X^Z&N=^Zrus=6ZL9k z-Ecww1)~lW9-&1`jH?G9aL=4iqy%v78`_J|!j-wW zZOe5(dz$M$WtJYV?{iuBQbM3&nV3@KQbJBM)|;E5T)@|8HYz11N2MVo-R2< zDLTEDpSs_7`9-k`zIh}!Spa!k0DLM66;=ngo+zm1rfB9NwXx7Xl@>F$kQ!xibz8|} zTI2oO#pC(wwoS8(nkw(QynKZD7m~XrB;B-msgK7QfmFU25iI%roPGBIW_pX8)vy;dItQE@)hf$#D?67 z2ko2sM-x%8;ud%I!a2ns6?z`Z-zR!t7{%w;{8565g&dDXUPU z(*&)vUfTF2a!+xj-~B~F06z2W!>aN zN)V%=i`L_QzXW%`KR#W(M;Cl5LK*D1hGt=jpN^95LDUN!8X!i(<5BvxH?K~tz8)@5 z{LQ>u9(_2E$@uc+1_r5Q2tM`0!#~cgtA#L}&ZMI8*vf)#wTxohVw23%92u;Tj$*^V zB~yeiqA?SmHawpCf(LTScNi3WSy6G}<~3*vQ@71zVKv>>=3Ui&>{U9RWIx#8FeUwZ zFNUi+wpFZ++Q_~^X~XX2ZeU2>W?r7vz2QgcX^+q{r1WJ(7N+`Dc&Gcw)ffMs*Eg+y=LzP`i_W5nQ~@(aXS2q5!dub%y^94@TWp7y@BRmTeQqg zc;k;UxqUuNCfGMv%2A{$ji+mKtd?JKm7t@V7_}dNk09{l0LNbKaMY{Sic!@38ry4j z#`%UUC(qellJ!1%pZ_#vbphYBj`H#SJop!zvGLyCT=f2-)H>gn-vKSx@LR!uoU-cm zyQ2);sQrsTa;uF7oc;NwV4izPjTHx5CEx9)d7O@OkO#^%i=73)J-x|X2upju!!Ikhn<8lHj?lg+@ ztV4{%-qz^wrmtGxB5cNp>vz0;v2%QoyERN;_%+%Vce|v9u@2?+kPwJKyZC{;oOqO^ zX?L`UL3hRa_x>VnogiDe>{IMQ&RYKEWpwPS*1>E8Mi;mbU$6M}N=kCO37yKw5&7!= zkj}@lO=;$}{JZ*?{OyZTQ}6}O|M0bz<4$Iw=5@_x7WO5E??+KLh7#r(!6>6GTrRs; zBK5HY84jm+6%w!8-_ZCqW#b$2eY>RfY7U1O(HLKJP_^1bZQ!vPkCSk(E0BDKGL_ zdd0~bCy8lmQS+?RkI84G!=&Y0eskr5nfR{xEqQ6l$p&K?d0uv8tlIf`JT&C&AHk70dl<$&enRNL0j2b`;L=Ro?Rnwfq>taSVexr= zKYn6%U%akmV|jnGfW|3SUJi%sAbRU_OTI`#^Jb`@yo}J>nH*{V^9kL{w0N>k+Zsl0>i)Ddf|@;3GfM-og^k`q0iNL0qbZ?1!hBY*EVSenFq5J zyYua}Jv$m_{9X**qBCN6*OvQ(=g+A9>>-P|QqLb;WcH>RS-5(0%OgDK!r@O!F5mFT zDR!94jPDU>Nv+ZmswNk#U^*cXl2?ru-q&_1Q6OlsnAA>hBEaWmUQO`rXFuaX(;IQx zk>O6m!7^{MoG-o=b|z%noqHo)mpi{%i2iy$$m}M^j$-vY3UP9V4q3=TpxYRI5w?RQ z76A_Y1vqAWl__K0RvUBuWp?=!*Enun&kv`CCAOsOLyxgk;b^*W z-BH_G6y+!p+GUG&S0V~UY54ltH&ui>!1@O2sQU3i-H`d_yX?xmEyq;-Vrga^N^huw zn+BTDqPFNt1SM4jOEviFyZrqY#KcpX$H@PmV3{?=oQmrFC+^=f_qBiCypGe_mTXJObmC5< zaCk+}#$7};a?1EWqZ$2sKqeX)@^8$5(19=`-dli>yLI9%YtzCiki`6G-%xW_Fn7L6 zU$6P#uZ&IQgV);cr#%JBwEqG0qa~$5X2iN{`0zbGgR!%B%D+H_D7>#7FS&BV<4XUPcYX=C?Q{KV_!t8t(3aTLeGVbS0JdOO? zcM9(T6sgSiV)t_rJDhIFipNQ3S_1R>j~*__k@RDN=L@N?>v9&PQKi{=&cafQUeG8u z6%b5dQ^aezt#J&f?&vg`^QKD!{*5$j_C*;<2$}XeT6{*Q^^mlb|K0C9P}-~w+{ZKG ztR?{fW@27-$NW&t$SUS z*4Qi>T+Lur-;;lzgo!RtG~Sgad=q|zSh{A42r$kyqUF}vk$&E16KdE}$ zC{Unt>B3(sxYVzm^bH8$o17d)V_0<>q1f^1*>kdgOz;vt7BzQe!o8ZYBpN5l z`l2k^Cm-EsNgG$R8(LOQ|II#dnfS?Tt(HrlbAtykV~j^~7mLf<9c2v#zoH&t{KTLN zIwbj{r6SxzCPS#I)$(=--eOt%SZ@K9{Q(f<+K^r_gQNv?r;(*Jkyl#Q4*tnW+Yx31 zQD_K6_6gsm-*@#EI?@}$FvSk5Nkdg%Bpq0FL&okan&V^U>-667fpi|i#p$@0c>mWN zSj25L$%E}56&q6QFd9z0q_S^PrRs&e*W-HNIn3H!F#fBkcxZr|uEG}m|J4Uf1Wrs$ zpHn=a=#EQHVv3IR$Avijt{ARb!?|1O9@r*B(9)+TyGWk9SaFlUNMo7V7#iYYi|o|- zF>mrNvPrxwAg25K#!>_I$G$NKbx{TZWK+izp6eIUgcE9U7vINVUSMt*Q>bB8&~@@6 zq9XQT#*{-`AuHe~utOm08BNap| zuFt1pKe9c%&McN&vPFzD>9gn+h`;dCk3Ip)A`cqQMRig5N6lSn+q1Y+__hXzH7J@PmlAg2-so!fR z-oik80OnY}TKa+=VavI8->^!N#(Qd{|LCjF4hg27-az9a13&y0Kz||lZ#2Gi#KLLl zm&+OPMCSeHthZ>FF@{y9?*lH$F-erdjn+#7BI&0b`30`xN~f4$tOH-9bCz!VN`B(R zdfb~JjT}u0+sFy;Z#Js?t3WM5-D5Y7!VnQwqC!h8!gp~z;1S?M7cJdl_vu|^N%lg5F7mK45moT;J@sn3u83Go3unW}AvKM{z>kQN zh@RAnbf*$B08wXGQd}U?ZJcG_Sgxe=N09rFYo88I@gkL7C14i zE72}s4YoJ=6DC}VHm$TYH-;U~3(=>`?9!WaTu;y?2t{fk+dKz##3PSh9yVV-V8j6U zSHD0AG_T4VpJ~2&fb!s;3C6fl80!5newT_uGbaB~!m+6~oRzCbPG^~>grimHNx_E= ztI;jOII!tTs~!(dYbez!cjm62RH_>kxUBT_zfV12N4+)XP8KwIS+k2EL-YhxKX9vh z6Yet0PK{>e^~HD10A|+FJsetQ`j>xq)S{*;J^Y}*Pid{VGVyHL{r&HP#RWuDXkq3k zRv_KUeEsm@qi&w(A}z^{@(ScsMpCWcIen2pQFXGWU!(FB+Bn%1Lptsg2iDwm1`WY~ z2>*0L^t6X>?+kM#>@G5>U7_Gf(KGtb&rDNKQc&P&PVJlnHJJa!uyNrNKT!TXfXQM_ z{9=Ij&cckV0}fkz{Kv)uDYVrJ_bhYX%9zK!aEg443iAK>jSG@i$tMqKu(X*0%{FB> zcoXBX&RNVNll}!|E1-xWIo=%u+_VMCQV*<{Ls^M5_4S0WKE7u}V z6%~$p)Lr~c`(V{;{Smy`D(bLy-gRp4JYj_bp=YgaFO42lD;!nF5JhWh^e;ywN}*=x;BJMKvPf*2IsW)Z ztDLC+qfhaAGd6{0)9jPfPst1x_Kh*$Y#W~Ox}EH(ec686o*P?!j`W@rkip)-KonVP zw=B3p!()hnC5ciagY_>~QCH2shC8Z|pTs8)u@+7@V>{+i4G7ck<5-nF$grL8>K-+U zy$mH-44+QZol0bu#T1i>N|F8tPADesSLH~W;ZJq9$Nk1~7y_3uw?B#umPm6qOFt3| z=k*?r@+8y@%ToA1sI!n*ShU)4RKJmaN-HEWXKPWeUGuAh|Mcb1tFQj*A>G=x- zd{EDmb(;9^T@x>TznVSI#q0S_jw+?OO^a=v3j@#dZQ>FkIf?#1ZQ6<;)uMR^Leny6rqHkVg6|LT4 z(h@~`2}9ktmRb?!<;uL+9ABT&eKZ`^F@`v#Z!p7To{=f&8dV;&UlC=R1s;-_PK}!R zjz^;wjOB1&2Mavt+D??3-TVBnzbXGAT-|K;qRV3cq@v|=6NLx%SjAatR#iU9FZh+^ z3ylRG%s>L3e8?#c|8;&eGP=v>G<0Pnzr9~=gOLyM;q4yfxbp)+d3jY@$07v^iY@N= zb+azk`I8v|le6`%+sOOF#7%$ShaOYMpT9J`<`-2I6zW!rRjN{2b~+-VFc8IKg@V5n zHMp-tDMHU?1WeD`5LfZ>dGuH9W*1F=ox|c2Xxf-0nFk!li~GZ;L>4c05P38>rW@j) z&mK(BQxuV6-(!45NAAS>SEkca;oGy1(EVQ`ooV!T-Ww*FDPID^y%wcg-Ir?9kHKKE z*wEQwmI){N)bn)YamYZ;iH(7zlgn!xM!zxoR~18e4L9A12c{E+H60FW`+GN3QK4?o zC=K}_o3juEJKOd`mt7H z6)pVAVDhOK6rqh2D~~rU?H~Yp4Dsb3ox9_L{ZFD>%aJU5^?DH&ZkPc4^B7rW(CmMD zwCqr6B9G3S$}PEZc>%x=$q5TCA3!%=nF~BUj0P!v?H~dehS;J|UH>Kkv>}-_gK*g{ zNk0r=nHc4`ER7zYnky2NEOIl_!fz#oD+16`T6{DML(153Lm(cs6i-i{CeZcO+Y4d= z@SfjL_@+tbJ+O_#=7P_Tx_zfPVV!;+0LZV}$sRYNU&F&LHv?s6LPODOjt8q5l3PYV z(c_zrg@(me%j09LDnUA*myh9@|L8Ow*@)wyemBQ7;>rWSYoq`c);T`dxkjApa2VR} zO`+MR21w5Bc4jSkqZ`_+bJr0w=+0BMJGh|--4Vlwas#(3cMbWyp>Z*Niq!bh89JPu zQPd1Zc{$p?(MA8u@tjaZjlVOQi(NX(w>)0skq;(JC?jxJ;CJLX*4BKGiHb)Nh*>r$ zeZ&ZSB=disxP|YGndJ0du+S9_g(R^tC?<>v36#W(YHG!M?VrXo#_g(pb+scmfiEsm@ z%NfWJ#YH{ zay!j2rv0w~KoB{CDGwI9F>A`x!^j1c;^{6KmW3rO3X;w~1 z35Dvv!ZmxZAPL_|{zr*z`;HQN5MXY#B3>E#8~t+M|ACNnq(Bdn!jAeCxKkB2;LbkA z&Ik5E`-sudxAud=55@?QeclweDakRC^Or1|1od6+q8ULu+gDI48Dn0wi&96>{ed6 zQsW0!*O-QKy*i~6!7eDy%t zz%6xH#CyN~po{DPd#aJ2lZ>aw!;)NRe)Fy905hYRs9#=h`RHhE#Bq1)EQ=3R=_7v$ z@o*qZGKj+2Pt@G59eu5Olu?hD2R~lyZL;m~zIU6^4ghZT{yEpPD2Az^yNA%sbUhoZ z%OT^4Z#)lv20Py*3YF58S64ryUlu5#G@(iP@(xOK$P-eA*L#AMtn_Q_mCdnG)7?)t zUuU+E$#A6gl+WeM(i;*C#@eb%l0i{Q^bWFCj#>~q-X1LI* zwdY*62Rq)~_SwJ0*bz2ty;)0k&sV;In#UfPKUy^X=T;tGS3c19G5@Q$zgEHc`Ehw^ zMhTUOr!NGn^#1@BIYf8?L*#prR(a4OwJsSkCHrUxu+BFBsJLPV=InS>uLavk1V$yl z_^C6@>mm6+)#T)*>u^+I<`J=?IoI2uuga?6nH2{wi9B#-LEkZA?H<2W)aMHTl0$>; z6~QbVH~f{I-cm;HCd(U3dcQ_|i!%ySrO2^OZ=C;C?VRVfN8#s3`svq^D<>`lZlC?J zFUV7djHF4an95>4yN9CNnli{dqWt^3?|}yfZlj-<11eF)=ulRuo^XjZO#FSfIidCm z;8&8^!SeAfCfJ+zCts@Ty4{2(m4grvut_M|3#FajXa<`iHDfIB!caB-`6s?yI56e+ zPO}rYyzu!0^mnoS(|828ESsX^9?(a#Tws~;a)>z9m+r6?-9v1hP294DeXzkNvflhg z^cmnMW|v(o_$wLXxLgbL?(8q&YVyM~8xDxb!nc@kry0Z6_?UC7TeC486_pI$ABT$K zciUH+Q$(Kwl4&*JD0r5cJK7WSrHQo<_bh9b4`@i2VK>q;+>S5?o|mWV#O7U!#TTDD zKTYz5!eWTCv}VtLNW(hzPm+)mB6cnp@zy*)#l>vnPr7QvZ_aL9m*P*aHi!NgOhMhQTpeXcyMK|xA#@RCdnHKX41vaS5G*0JDL11@YDZ-0 zI%=M)J_8IfJtyn#S$zw+bCI)S48}8@26FF3*ZTd@*L&g*e#fm}Q-%9xAG_vzLw~Y@v^hNc&u+7R zcbkVUH&auj-c*rUb+HI-2D@~6vqwC_V8yMu>JAn`)$$-w|6-bSDbcR#1 zA_gnR@!7kxu?@)bJwzRtqrg95FRI!eBYax;twEHG4Q^5$O!m}|JE|9o0Q(f78$u6# zzDc1rpyj+EDhPX>RVJOsPCU~47q(+Ora1R1UL%}OdP{{SC*IY6*qhr3?3!Y&@$NnL zYNVBAg0VDbzhO`#WQNe4kegQOC5Bd00e5WqXTC=(x!rRs-Z3`$%HQZOX<0Do<6%m% zl^qztz?86V0GI#1j88xa`xZig`y`ku*!2xr6}q!t64MC9Qjsc>mFQws%y(v!A)=bp+zBp)}J=%Ey=>Cm;sS zZA(1m+_av2)X13S0Zj%|nP^NnAV}kk5>7>lSIWDgjlwzt6Alx6=^Bv56(DlBiPq)R zj$%Mi0pyva#^$=h;=;jv7|oz?BNc#~GShm?a`eeF?AioWTu6i_hPeW0Gz*#*D`m9T z1|M!~R8_1Uz=2udwl&WL4G2WsQkXaF1b|-2jSH}b&3FuGV>-JLk(c!-;*1COx)}Z3OUd)O(>%T`YUAD*{-1yp&yCK#C04=_3^~%rE#>Nk z`8+rhE;@y0D8bz~JA{8hn6fz?y8+zfr+$PzH(2!4DY=FsyPt;$q>}=epAE@uG>5l7 z1yX3x4nX2vLvT!AAd#`Og2(bj-N-{J*W$8-U@oGDmhyY9RKVKZ!Krr#qA%-Rdu9h< zoF<6-W4v~)`|g~ZF5+`K!|!bK?Aq6wqtNsWZ1`K(aX%i43bvDhx~0zM&|49lwDJgr z=-sY`K(w*_2wIAtPv5v8^wvNyrP+u3#v!s0o5CjcUZOKF`N)X~Ze) zsx<(^)cj&xH)PD-QY9a}D)li-tNuXZW&JJl1t&&6h7v+7md)b0#8>3u1d6o$O6eWf z3jyHJxyCdk!z`#Fur&x)D+%ehD)Z^^lKr+M|C_K*n9u^`z9VezE>fOwx5)P z`FoWyqU5gxP4zv&6Va_{J-7H&daR7D8NC1~&3wQCj`97OVjiRTF& z&&CQ%V)wK>LHs*Z4F|I6ZNx}UBY60E;&t=KxAF{2p#!uVt)tsw-QV#`3qL1r+{{K^ z@>~)pzB#-Z3=u<(8XmiQUl%Le%G;!o`dq74a0<3#1krwJE?2j%nzewtkiG9Nlb6h# zQ7d!Z6vO42#C&UvF*5MepmxD(dE{Zy9|8Hx{<45KlI+!gx6j*M#KZ%tuJ$BHFm zHN5P~{5Xc=`=v!b_!&ww&AE!q#K?LHIUuwl0c!x+V#C?TICdaBMwt({C?|JmE`d;$ z$k`5!3vLL>;5zJ}nK@N%+x*gZc?7iGx}yxRy_a=(W^S>Gc@9b5b8{yHfi{Y0pNLDD z_kSt|yBlQoz*}Du;0-tuC;6?a)ps;2#}uW(EZcWeoMQy%m8|6>5|KmB3#kLqNcLbV zfbH$B1iwGl(~}x=IqX)nThg-iqrV6&MfuteXzQZy-#r1Zm^tDF;0$-w$dd$-(|SPD z`<(2}2T4?Z$yfTG8Vu?o9LM=IAK(CVv}bb%^aYcxgoC=4GYJ{h8D98dbMTw{A-Be! z$i13!qB};!;4qD|cL&o7v`~VxM}nILBh@EM5$5vA2dIdD0Xv?;h$qT>u7-9rgE(eYl(~&!LxTNi+iO^x8+iMvl%-d zRmQ-BOlykWG8*RS&2}a~k!jD4+*ppgpSxwE0xRcnf|8SNKa0;&NC|_d<~EfGlPwYP zV4jdolTs;~-E8w=K+Ob^;XZC23M|T+AF%yBuw06Zu3and8v{{9w!X!H6?bgpmf);M?je4U3~XJF_Kdq^Cx*VtpO`ATE?j@O-Eq4Ul^!F> z+_ls1Drs--PoKOc_kKsH3_)>O(R&!cSAo^S zy!-GlX&V``yumPt)grjtQH|&1yW&6M#c*@z@bJt5osX5rQ}v60?}K69?&FYHy#Py` zGXMDWP_4@L?lg#L;It50@fb>DQgtN2%0~B~h8P>{(wwt*p2)6I5t*A-UnC~N96n%t zCiTI!w-_Xz;)iAbnAMb#4iif!*S2iaOpws&+7&)%b@<+J0N%Lxum5O#y+y56D;H7I Td|m}Fk^`EmIx6K#=HdSh&hM=K literal 0 HcmV?d00001 diff --git a/src/shared/types/index.ts b/src/shared/types/index.ts new file mode 100644 index 0000000..e98fb2c --- /dev/null +++ b/src/shared/types/index.ts @@ -0,0 +1 @@ +export * from './predict'; diff --git a/src/shared/types/predict.ts b/src/shared/types/predict.ts index 17359bc..f5d0283 100644 --- a/src/shared/types/predict.ts +++ b/src/shared/types/predict.ts @@ -1,15 +1,43 @@ -export type PredictRequestType = { - brand: string; +export type LaptopCreatePredictType = { processor: string; ram: number; os: string; ssd: number; - display: number; + display_size: number; + resolution: string; + matrix_type: string; gpu: string; - weight: number; - battery_size: number; - release_year: number; - display_type: string; +}; + +export type LaptopGetDataPredictType = { + processor: string[]; + ram: number[]; + os: string[]; + ssd: number[]; + display_size: number[]; + resolution: string[]; + matrix_type: string[]; + gpu: string[]; +}; + +export type TVCreatePredictType = { + display: string; + tuners: string; + features: string; + os: string; + power_of_volume: string; + screen_size: number; + color: string; +}; + +export type TVGetDataPredictType = { + display: string[]; + tuners: string[]; + features: string[]; + os: string[]; + power_of_volume: string[]; + screen_size: number[]; + color: string[]; }; export type PredictResponseType = { diff --git a/src/widgets/form/form.widget.tsx b/src/widgets/form/form.widget.tsx index 944efe5..b52ed1a 100644 --- a/src/widgets/form/form.widget.tsx +++ b/src/widgets/form/form.widget.tsx @@ -1,71 +1,42 @@ -import api from '@/shared/api/api'; -import { - PredictRequestType, - PredictResponseType, -} from '@/shared/types/predict'; -import { FormEvent, useCallback, useState } from 'react'; +import { PredictResponseType } from '@/shared/types/predict'; +import { FormEvent } from 'react'; import classes from './styles.module.scss'; import { Button } from '@/shared/components/button'; import { Selector } from '@/shared/components/selector'; -import { mockUpOptions } from '@/shared/constants'; import { Expander } from '@/shared/components/expander'; -const Form = () => { - const [request, setRequest] = useState({ - brand: 'Apple', - processor: 'Core i5 10th Gen', - ram: 16, - os: 'Windows 11', - ssd: 1024, - display: 15.3, - gpu: 'NVIDIA GeForce RTX 3060', - weight: 2.0, - battery_size: 90, - release_year: 2023, - display_type: '4K', - }); - const [response, setResponse] = useState({ - predicted_price: undefined, - }); +type FormType = { + selectorsData: T | undefined; + updateField: (field: keyof T, value: string | number) => void; + handleGetPredict: (e: FormEvent) => Promise; + response: PredictResponseType; +}; - const fields = Object.keys(request); - - const handleInputChange = useCallback( - (updatedRequest: PredictRequestType) => { - setRequest(updatedRequest); - }, - [], - ); - - const updateField = (field: string, value: string) => { - handleInputChange({ - ...request, - [field]: value, - }); - }; - - const handleGetPredict = async (event: FormEvent) => { - event.preventDefault(); - console.log(request); - const newResponse = await api.predictPrice(request); - setResponse(newResponse); - }; +const Form = >({ + selectorsData, + updateField, + handleGetPredict, + response, +}: FormType) => { + const fields = selectorsData + ? (Object.keys(selectorsData) as Array) + : []; return (
{fields.map((field) => ( - + ))}
- {response.predicted_price && ( + {response.predicted_price !== undefined && ( Ответ: {response.predicted_price}