|
@@ -1,25 +1,147 @@
|
|
|
import logo from './logo.svg';
|
|
|
import './App.css';
|
|
|
+import { useState, useEffect } from "react";
|
|
|
+
|
|
|
+const Spoiler = ({ header = "+", open, children }) => {
|
|
|
+
|
|
|
+ const [openMode, setOpenMode] = useState(open)
|
|
|
+ return (
|
|
|
+ <div onClick={() => setOpenMode(!openMode)}>
|
|
|
+ {header}
|
|
|
+ {openMode && children}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const RangeInput = ({ min, max }) => {
|
|
|
+
|
|
|
+ const [state, setState] = useState('')
|
|
|
+ const colorBorder = state.length <= min || state.length >= max ? 'red' : ''
|
|
|
+
|
|
|
+ return <input style={{ backgroundColor: colorBorder }}
|
|
|
+ onChange={(e) => { setState(e.target.value) }} />
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const PasswordConfirm = ({ min }) => {
|
|
|
+
|
|
|
+ const [checked, setChecked] = useState(false)
|
|
|
+ const [stateInputOne, setStateInputOne] = useState('')
|
|
|
+ const [stateInputTwo, setStateInputTwo] = useState('')
|
|
|
+ const reg = /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/
|
|
|
+ const disabledBtn = stateInputOne === stateInputTwo && reg.test(stateInputOne) ? false : true
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <input style={{ borderColor: stateInputOne.length <= min ? 'red' : 'black' }}
|
|
|
+ type={checked ? 'password' : 'text'}
|
|
|
+ onChange={(e) => { setStateInputOne(e.target.value) }} />
|
|
|
+
|
|
|
+ <input style={{ borderColor: stateInputTwo.length <= min ? 'red' : 'black' }}
|
|
|
+ type={checked ? 'password' : 'text'}
|
|
|
+ onChange={(e) => { setStateInputTwo(e.target.value) }} />
|
|
|
+ <input type='checkbox'
|
|
|
+ checked={checked}
|
|
|
+ onChange={(e) => setChecked(e.target.checked)}
|
|
|
+ />
|
|
|
+ <button disabled={disabledBtn} >Я кнопка</button>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const Timer = ({ ms = 5 }) => {
|
|
|
+
|
|
|
+ const [counter, setCounter] = useState(ms)
|
|
|
+ let [pause, setPause] = useState(false)
|
|
|
+ let timeCounter
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (counter <= 0) setPause(true)
|
|
|
+ if (!pause) {
|
|
|
+ timeCounter = setInterval(() => {
|
|
|
+ setCounter(counter => counter - 1)
|
|
|
+ }, 1000);
|
|
|
+ }
|
|
|
+ return () => {
|
|
|
+ clearInterval(timeCounter)
|
|
|
+ }
|
|
|
+ }, [pause, counter])
|
|
|
+
|
|
|
+ let hours = Math.floor(counter / 3600)
|
|
|
+ let minuts = Math.floor(counter % 3600 / 60)
|
|
|
+ let second = counter % 60
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <span>{hours}</span> : <span>{minuts}</span> : <span>{second} </span>
|
|
|
+ <button onClick={() => { setPause(!pause) }}>{pause ? 'start' : 'stop'}</button>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+const TimerControl = () => {
|
|
|
+ const [hourse, setHours] = useState(0)
|
|
|
+ const [minuts, setMinuts] = useState(0)
|
|
|
+ const [seconds, setSeconds] = useState(0)
|
|
|
+ const [open, setOpen] = useState(false)
|
|
|
+
|
|
|
+ let ms = hourse * 3600 + minuts * 60 + seconds
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <label>Hours :
|
|
|
+ <input
|
|
|
+ min='0'
|
|
|
+ type='number'
|
|
|
+ onChange={e => setHours(+e.currentTarget.value)} />
|
|
|
+ </label><br />
|
|
|
+
|
|
|
+ <label>Minuts :
|
|
|
+ <input
|
|
|
+ min='0'
|
|
|
+ type='number'
|
|
|
+ onChange={e => setMinuts(+e.currentTarget.value)} />
|
|
|
+ </label><br />
|
|
|
+
|
|
|
+ <label>Seconds:
|
|
|
+ <input
|
|
|
+ min='0'
|
|
|
+ type='number'
|
|
|
+ onChange={e => setSeconds(+e.currentTarget.value)} />
|
|
|
+ </label>
|
|
|
+
|
|
|
+ <button onClick={() => setOpen(!open)}>{!open ? 'start' : 'stop'}</button>
|
|
|
+ {open && <Timer ms={ms} />}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ )
|
|
|
+}
|
|
|
|
|
|
function App() {
|
|
|
- return (
|
|
|
- <div className="App">
|
|
|
- <header className="App-header">
|
|
|
- <img src={logo} className="App-logo" alt="logo" />
|
|
|
- <p>
|
|
|
- Edit <code>src/App.js</code> and save to reload.
|
|
|
- </p>
|
|
|
- <a
|
|
|
- className="App-link"
|
|
|
- href="https://reactjs.org"
|
|
|
- target="_blank"
|
|
|
- rel="noopener noreferrer"
|
|
|
- >
|
|
|
- Learn React
|
|
|
- </a>
|
|
|
- </header>
|
|
|
- </div>
|
|
|
- );
|
|
|
+ return (
|
|
|
+ <div className="App">
|
|
|
+ <Spoiler header={<h1>Заголовок</h1>} open>
|
|
|
+ Контент 1
|
|
|
+ <p>
|
|
|
+ лорем ипсум траливали и тп.
|
|
|
+ </p>
|
|
|
+ </Spoiler>
|
|
|
+
|
|
|
+ <Spoiler>
|
|
|
+ <h2>Контент 2</h2>
|
|
|
+ <p>
|
|
|
+ лорем ипсум траливали и тп.
|
|
|
+ </p>
|
|
|
+ </Spoiler>
|
|
|
+ <RangeInput min={2} max={10} />
|
|
|
+ <hr />
|
|
|
+ <PasswordConfirm min={2} />
|
|
|
+ <hr />
|
|
|
+ <Timer ms={4000} />
|
|
|
+ <hr />
|
|
|
+ <TimerControl />
|
|
|
+ <hr />
|
|
|
+ </div >
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
export default App;
|