import {useState, useEffect, useRef} from 'react'; import './App.scss'; /////////////Spoiler const Spoiler = ({ header = "+", open, children }) => { const [opening, setOpening] = useState(''); if (opening !== '') { open = opening; } return <>
setOpening(!open)}>{header}
{open && children}
} /////////////RangeInput const RangeInput = ({min,max}) => { const [text, setText] = useState('') return
max ?'red':'white'}} value={text} onChange={e => setText(e.target.value)} type="text"/>
} ////////////LoginForm const LoginForm = ({onLogin}) => { const [login, setTextLogin] = useState('') const [password, setTextPass] = useState('') let buttonDisabled= login.length<6 || password.length<6 ? true : false return (
setTextLogin(e.target.value)} type="text" />
setTextPass(e.target.value)} type="password" />
) } ///////////PasswordConfirm const PasswordConfirm = ({min}) => { const [pass1, setPass1] = useState('') const [pass2, setPass2] = useState('') let inpunStyle let errorText let errorText2 if(pass1===pass2 && pass1.length>=min && pass2.length>=min){ inpunStyle = 'green' errorText ='' errorText2 ='' }else{ pass1!==pass2? errorText = 'Пароли не совпадают':errorText ='' pass1.lengthВведите пароль
setPass1(e.target.value)} placeholder='Password' type="password" />
Повторите пароль
setPass2(e.target.value)} placeholder='Password' type="password" />
{errorText}
{errorText2}
} const oneCat = { "_id": "62c9472cb74e1f5f2ec1a0d4", "name": "iPhone", "goods": [ { "_id": "62c9472cb74e1f5f2ec1a0d1", "name": "iPhone 4", "images": [ { "url": "images/e48e7ee1bcc4ab5432d1e7a3a89b8466" }, { "url": "images/58c6157d51d8c2430c4dd41b6d0132f4" } ] }, { "_id": "62c9472cb74e1f5f2ec1a0d2", "name": "iPhone X", "images": [ { "url": "images/c67956dff69d1160a6e70b71838d7282" }, { "url": "images/0153956fc7bf99567e620ee446319b00" } ] }, { "_id": "62c9472cb74e1f5f2ec1a0d3", "name": "iPhone 13", "images": [ { "url": "images/56c5d476685355221b1a3ba2c554ad91" }, { "url": "images/29393a087c933d7caea010c98f4d2876" } ] }, { "_id": "634190ccb74e1f5f2ec1a37b", "name": "Iphone14", "images": [ { "url": "images/2b2b08dfca28972c19f3f901c68966af" } ] } ] } const origUrl = 'http://shop-roles.node.ed.asmer.org.ua/' const GoodCard = ({good}) => { const [indexArr, setindexArr] = useState(0) return
{good.name}
indexArr=== good.images.length-1?setindexArr(0) :setindexArr(indexArr+1)}///////////// src={origUrl+good.images[indexArr].url}/>
} const OneCat = ({cat=oneCat}) =>

{cat.name}

{cat.goods.map(el=>)}
///////////////Timer const Timer = ({countSeconds}) => { const [time, setTime] = useState(countSeconds) const [startTimer, setStartTimer] = useState(false) const [timerId, setTimerId] = useState(0) useEffect(() => { let intervalId = null if(startTimer){ intervalId = setInterval(() => setTime(count => count -1), 1000) setTimerId(intervalId) }else{ clearInterval(timerId) } },[startTimer]) useEffect(() => { if(time===0){ clearInterval(timerId) } },[time===0]) let hours = Math.floor(time/60/60) let minutes = Math.floor(time/60)-(hours*60) let sec = time % 60 return ( <>
{hours}:{minutes}:{sec}
) } const TimerControl = ()=>{ const [hours, setHours] = useState('') const [minutes, setMinutes] = useState('') const [seconds, setSeconds] = useState('') const [start, setStart] = useState(false) return ( <> setHours(e.target.value)} type="number" placeholder='hours'> setMinutes(e.target.value)} type="number" placeholder='minutes'> setSeconds(e.target.value)} type="number" placeholder='seconds'>
{start && } ) } const TimerContainer = ({seconds, refresh, render}) => { const [sec, setSec] = useState(seconds); useEffect(() => { if(sec > 0){ const intervalId = setInterval(()=>{setSec(sec=> sec-1)},refresh) return () => { clearInterval(intervalId); } } },[sec]); const Render = render; return () } const SecondsTimer = ({seconds}) =>

{seconds}

function App() { return (
Заголовок} open> Контент 1

лорем ипсум траливали и тп.

Контент 2

лорем ипсум траливали и тп.

Задание RangeInput
Задание LoginForm
console.log('ЛОГИН И ПАРОЛЬ', login, password)}/>
Задание PasswordConfirm
); } export default App;