|
@@ -0,0 +1,147 @@
|
|
|
+import React, {useState,useEffect} from 'react';
|
|
|
+import './App.css';
|
|
|
+
|
|
|
+const Spoiler = ({ header = '+', open, children }) => {
|
|
|
+ const [openSpoiler, setSpoiler] = useState(open)
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <h1 style={{cursor: 'pointer'}}
|
|
|
+ onClick={() => {setSpoiler(!openSpoiler)}}>{header}
|
|
|
+ </h1>
|
|
|
+ <div style={{display: openSpoiler ? 'block' : 'none'}}>{children}</div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const RangeInput = ({ min, max}) => {
|
|
|
+ const [ value, setValue ] = useState('')
|
|
|
+
|
|
|
+ return(
|
|
|
+ <input value={value}
|
|
|
+ onChange={(e) => setValue(e.target.value)}
|
|
|
+ style= {
|
|
|
+ +value.length < min || +value.length > max ? { background: '#e82c2c' } : { background: '#f4f728'}
|
|
|
+ }
|
|
|
+ />
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+const PasswordConfirm = ({min}) => {
|
|
|
+ const [password1,setPassword1] = useState("")
|
|
|
+ const [password2,setPassword2] = useState("")
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <h1>PasswordConfirm</h1>
|
|
|
+ <input type = "password" value = {password1} placeholder = "Введите пароль" onChange = {(e) => setPassword1(e.target.value)} style = {{marginRight:"20px"}}/>
|
|
|
+ <input type = "password" value = {password2} placeholder = "Введите пароль повторно" onChange = {(e) => setPassword2(e.target.value)} />
|
|
|
+ <button
|
|
|
+ disabled = {!(password1.length >= min && password2.length >= min)}
|
|
|
+ onClick = {() => {
|
|
|
+ (password1 === password2) ? alert("Вы успешно зарегистрированы!") : alert("Пароли не совпадают")
|
|
|
+ }}> Register </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ const Timer = ({timer,started}) => {
|
|
|
+ const [seconds,setSeconds] = useState(timer * 1000)
|
|
|
+ const [pause,setPause] = useState(true)
|
|
|
+ useEffect(() => {
|
|
|
+ if(pause && started){
|
|
|
+ let id = setInterval(() => setSeconds((seconds) => seconds - 1000),1000)
|
|
|
+ return () => {
|
|
|
+ clearInterval(id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },[pause,started])
|
|
|
+ let hou = Math.floor(seconds / 3600000)
|
|
|
+ let min = Math.floor(seconds % 3600000 / 60000)
|
|
|
+ let sec = Math.floor(seconds % 3600000 % 60000 / 1000)
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ {pause ? <button disabled = {!started} onClick = {() => setPause(!pause)}>Pause</button> : <button onClick = {() => setPause(!pause)}>Go</button>}
|
|
|
+ <p>{seconds > 0 && `${hou} hours ${min} minutes ${sec} seconds` || "Таймер прошел"}</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const TimerControl = ({}) => {
|
|
|
+ const [started, setStarted] = useState(false)
|
|
|
+ const [hours, setHours] = useState('1')
|
|
|
+ const [minutes, setMinutes] = useState('1')
|
|
|
+ const [sec, setSec] = useState('1')
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <h1>TimerControl </h1>
|
|
|
+ <input type = 'number' value = {hours} onChange = {e => setHours(e.target.value)} />
|
|
|
+ <input type = 'number' value = {minutes} onChange = {e => setMinutes(e.target.value)} />
|
|
|
+ <input type = 'number' value = {sec} onChange = {e => setSec(e.target.value)} />
|
|
|
+ <button disabled = {!hours || !minutes || !sec} onClick = {() => {setStarted(true)}}>Start2</button>
|
|
|
+ {started && <Timer timer = {((+hours * 60 * 60) + (+minutes * 60) + +sec)} started = {started}/>}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const TimerContainer = ({seconds, refresh, render}) => {
|
|
|
+ let Render = render
|
|
|
+ const [pause,setPause] = useState(false)
|
|
|
+ const [time,setTime] = useState(seconds)
|
|
|
+ useEffect(() => {
|
|
|
+ if(pause){
|
|
|
+ let id = setInterval(() => setTime((time) => time - refresh), refresh)
|
|
|
+ return () => {
|
|
|
+ clearInterval(id)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },[pause])
|
|
|
+ return(
|
|
|
+ <div>
|
|
|
+ {pause ? <button onClick = {() => setPause(!pause)}>Pause</button> : <button onClick = {() => setPause(!pause)}>Start</button>}
|
|
|
+ <Render seconds = {time} />
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const SecondsTimer = ({seconds}) => {
|
|
|
+ let sec = seconds % 3600000 % 60000 / 1000
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <p>{seconds > 0 && `${sec} seconds` || "Таймер завершен!"}</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function App() {
|
|
|
+ return (
|
|
|
+ <div className="App">
|
|
|
+ <Spoiler header='Заголовок' open = {false}>
|
|
|
+ Контент
|
|
|
+ <p>
|
|
|
+ лорем ипсум траливали и тп.
|
|
|
+ </p>
|
|
|
+ </Spoiler>
|
|
|
+
|
|
|
+ <Spoiler>
|
|
|
+ <h2>Контент 2</h2>
|
|
|
+ <p>
|
|
|
+ лорем ипсум траливали и тп.
|
|
|
+ </p>
|
|
|
+ </Spoiler>
|
|
|
+
|
|
|
+ <RangeInput min={2} max={10} />
|
|
|
+
|
|
|
+ <PasswordConfirm min={2} />
|
|
|
+
|
|
|
+ <Timer timer={3600} started={true}/>
|
|
|
+
|
|
|
+ <TimerControl/>
|
|
|
+
|
|
|
+ <TimerContainer seconds = {1800} refresh={100} render={SecondsTimer}/>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+export default App;
|