11import React from 'react' ;
22import { nanoid } from 'nanoid' ;
33import { useTranslation } from 'react-i18next' ;
4+ import { useForm } from 'react-hook-form' ;
5+ import { createPortal } from 'react-dom' ;
46import { goods } from '../../assets/goods' ;
5- import { AsideFlter , AsideLayout , Container , ShortCard } from '../../entities' ;
7+ import { AsideFlter , AsideLayout , Container , Modal , ShortCard } from '../../entities' ;
68import { IGoodsItem } from '../../entities/interfaces' ;
79import { Btn , RangeSlider } from '../../shared' ;
810import { generateRandomCardList } from '../../features/generators' ;
9- import { IRangeSliderChange } from 'src/shared/interfaces' ;
11+ import { AddGoodForm } from '../../features/forms' ;
12+ import { IRangeSliderChange } from '../../shared/interfaces' ;
1013
1114export const StoreList : React . FC = ( ) => {
1215 const [ myGoods , setMyGoods ] = React . useState < IGoodsItem [ ] > ( [ ] ) ;
1316 const [ lastId , setLastId ] = React . useState < number > ( goods [ goods . length - 1 ] . id ) ;
17+ const [ isModalVisible , setIsModalVisible ] = React . useState < boolean > ( false ) ;
1418
1519 React . useLayoutEffect ( ( ) => {
1620 const onlyAwailible : IGoodsItem [ ] = goods . filter ( ( el ) => el . isInStock ) ;
@@ -28,32 +32,56 @@ export const StoreList: React.FC = () => {
2832 } ;
2933
3034 const { t } = useTranslation ( ) ;
35+ const { reset } = useForm < IGoodsItem > ( ) ;
3136
3237 const changePriceFilter = ( { min, max } : IRangeSliderChange ) => {
3338 console . log ( `min = ${ min } , max = ${ max } ` ) ;
3439 } ;
3540
41+ const changeModalVisibility = ( ) : void => {
42+ setIsModalVisible ( ! isModalVisible ) ;
43+ } ;
44+
45+ const onSubmit = ( data : Partial < IGoodsItem > ) : void => {
46+ setLastId ( lastId + 1 ) ;
47+ console . log ( 'Form :' , data ) ;
48+ reset ( ) ;
49+ setIsModalVisible ( ! isModalVisible ) ;
50+ } ;
51+
3652 return (
37- < Container >
38- < div className = "flex items-start gap-[21px]" >
39- < AsideLayout >
40- < AsideFlter title = "Price" >
41- < RangeSlider min = { 0 } max = { 100 } onChange = { changePriceFilter } />
42- </ AsideFlter >
43- </ AsideLayout >
44- < section >
45- < ul className = "grid grid-cols-3 mb-4" >
46- { myGoods . map ( ( item ) => (
47- < li key = { nanoid ( ) } >
48- < ShortCard { ...item } />
49- </ li >
50- ) ) }
51- </ ul >
52- < div className = "flex gap-3" >
53- < Btn onClick = { cardGenerator } > { t ( 'listPage.addMore' ) } </ Btn >
54- </ div >
55- </ section >
56- </ div >
57- </ Container >
53+ < >
54+ < Container >
55+ < div className = "flex items-start gap-[21px]" >
56+ < AsideLayout >
57+ < AsideFlter title = "Price" >
58+ < div className = "mb-2" >
59+ < RangeSlider min = { 0 } max = { 100 } onChange = { changePriceFilter } />
60+ </ div >
61+ < Btn onClick = { changeModalVisibility } > { t ( 'listPage.addGoodToStore' ) } </ Btn >
62+ </ AsideFlter >
63+ </ AsideLayout >
64+ < section >
65+ < ul className = "grid grid-cols-3 mb-4" >
66+ { myGoods . map ( ( item ) => (
67+ < li key = { nanoid ( ) } >
68+ < ShortCard { ...item } />
69+ </ li >
70+ ) ) }
71+ </ ul >
72+ < div className = "flex gap-3" >
73+ < Btn onClick = { cardGenerator } > { t ( 'listPage.addMore' ) } </ Btn >
74+ </ div >
75+ </ section >
76+ </ div >
77+ </ Container >
78+ { isModalVisible &&
79+ createPortal (
80+ < Modal changeVisibility = { changeModalVisibility } >
81+ < AddGoodForm newId = { lastId } onSubmit = { onSubmit } />
82+ </ Modal > ,
83+ document . body
84+ ) }
85+ </ >
5886 ) ;
5987} ;
0 commit comments