App.test.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. import logo from './logo.svg';
  2. import './App.css';
  3. import React, { useEffect, useState } from 'react';
  4. // import { ClockFace } from './img'
  5. // const MyDiv = () => {
  6. // return (
  7. // <div>
  8. // Привет-привет!
  9. // <input />
  10. // </div>
  11. // )
  12. // }
  13. const _ = React.createElement
  14. const MyDiv = () => {
  15. return _('div', {}, "Testets", _('input'))
  16. }
  17. const TwoDivs = () =>
  18. <div>
  19. <MyDiv />
  20. <MyDiv />
  21. </div>
  22. const Add = ({ a = 100, b = 1000 }) =>
  23. <div>
  24. a + b = {a} + {b} = {+a + +b}
  25. </div>
  26. const BlockOfTextWithHeader = ({ children, title = 'No Title' }) =>
  27. <>
  28. <h2>{title}</h2>
  29. <p>
  30. {children}
  31. </p>
  32. </>
  33. // const Timer = () => {
  34. // const [count, setCount] = useState(0)
  35. // useEffect(() => {
  36. // const int = setInterval(() => setCount(count => count + 1), 1000)
  37. // return () => clearInterval(int)
  38. // }, [])
  39. // return (
  40. // <div>
  41. // {count}
  42. // </div>
  43. // )
  44. // }
  45. const TextLength = ({ text }) => <h1>{text.length}</h1>
  46. const Input = () => {
  47. const [text, setText] = useState('testtest')
  48. return (
  49. <div>
  50. <input value={text}
  51. onChange={e => setText(e.target.value.toUpperCase())} />
  52. <TextLength text={text} />
  53. </div>
  54. )
  55. }
  56. // Spoiler
  57. const Spoiler = ({ header = "+", open, children }) => {
  58. const [isOpen, setIsOpen] = useState(open)
  59. // console.log(open)
  60. return (
  61. <div onClick={() => setIsOpen(!isOpen)}>
  62. {header}
  63. {isOpen && children}
  64. </div>
  65. )
  66. }
  67. // Timer
  68. // const Timer = ({ ms }) => {
  69. // const [count, setCount] = useState(ms)
  70. // const [isRunning, setIsRunning] = useState(false)
  71. // // функция -перевод секунд в нормальный вид
  72. // function timerFormat(timestamp) {
  73. // const hours = Math.floor(timestamp / 60 / 60)
  74. // const minutes = Math.floor(timestamp / 60) - (hours * 60)
  75. // const seconds = timestamp % 60
  76. // const plusZero = (param) => (param > 10) ? param : '0' + param
  77. // return `${plusZero(hours)} : ${plusZero(minutes)} : ${plusZero(seconds)}`
  78. // }
  79. // console.log(count)
  80. // // таймер
  81. // useEffect(() => {
  82. // if (isRunning) {
  83. // const int = setInterval(() => {
  84. // setCount(count => {
  85. // if (count <= 0) {
  86. // setIsRunning(false)
  87. // return 0
  88. // }
  89. // return count - 1
  90. // })
  91. // }, 1000)
  92. // return () => clearInterval(int)
  93. // }
  94. // }, [isRunning])
  95. // // console.log(timerFormat(count))
  96. // return (
  97. // <div>
  98. // {timerFormat(count)}
  99. // <br />
  100. // <button onClick={() => setIsRunning(!isRunning)}>{isRunning ? 'Pause' : 'Start'}</button>
  101. // </div >
  102. // )
  103. // }
  104. // TimerControl
  105. const TimerControl = () => {
  106. const [hours, setHours] = useState('')
  107. const [minutes, setMinutes] = useState('')
  108. const [seconds, setSeconds] = useState('')
  109. // переводим время в секунды
  110. const ms = +hours * 60 * 60 + +minutes * 60 + +seconds
  111. const [count, setCount] = useState()
  112. const [isRunning, setIsRunning] = useState(false)
  113. useEffect(() => setCount(ms), [ms])
  114. // функция-перевод секунд в нормальный вид
  115. function timerFormat(time) {
  116. const h = Math.floor(time / 60 / 60)
  117. const m = Math.floor(time / 60) - (h * 60)
  118. const s = time % 60
  119. const defaultZero = (param) => (param > 9) ? param : '0' + param
  120. return `${defaultZero(h)} : ${defaultZero(m)} : ${defaultZero(s)}`
  121. }
  122. // таймер
  123. useEffect(() => {
  124. if (isRunning) {
  125. const int = setInterval(() => {
  126. setCount(count => {
  127. if (count <= 0) {
  128. setIsRunning(false)
  129. return 0
  130. }
  131. return count - 1
  132. })
  133. }, 1000)
  134. return () => clearInterval(int)
  135. }
  136. }, [isRunning])
  137. return (
  138. <div>
  139. {timerFormat(count)}
  140. <br />
  141. <input type='number' min='0' max='23' placeholder='00' onChange={e => setHours(e.target.value)}></input>
  142. <input type='number' min='0' max='59' placeholder='00' onChange={e => setMinutes(e.target.value)}></input>
  143. <input type='number' min='0' max='59' placeholder='00' onChange={e => setSeconds(e.target.value)}></input>
  144. <br />
  145. <button onClick={() => { setIsRunning(!isRunning) }}>{isRunning ? 'Pause' : 'Start'}</button>
  146. </div >
  147. )
  148. }
  149. // TimerContainer
  150. const SecondsTimer = ({ seconds }) => <h1>{seconds}</h1>
  151. // const TimerContainer = ({ seconds, refresh, render }) => {
  152. // const [count, setCount] = useState(seconds) // отслеживаем состояние количества секунд
  153. // const [isRunning, setIsRunning] = useState(true) // отслеживаем состояние кнопки стоп/старт для таймера
  154. // const Render = render
  155. // console.log('count ', count)
  156. // // Таймер
  157. // useEffect(() => { // эффект, отвечающий за то, когда счетчик прошле в 0, он его переводит в состояние паузы
  158. // if (count <= 0) {
  159. // setIsRunning(false)
  160. // }
  161. // }, [count <= 0])
  162. // useEffect(() => { // сам счетчик
  163. // if (isRunning) {
  164. // const start = performance.now()
  165. // const int = setInterval(() => {
  166. // const diff = Math.floor((performance.now() - start) / refresh)
  167. // setCount(count => count - diff)
  168. // }, refresh)
  169. // return () => clearInterval(int)
  170. // }
  171. // })
  172. // return (
  173. // <div>
  174. // <Render seconds={count} />
  175. // {/* <button onClick={() => setIsRunning(!isRunning)}>{isRunning ? 'Pause' : 'Start'}</button> */}
  176. // </div >
  177. // )
  178. // }
  179. // LCD
  180. // TimerContainer для LCD
  181. const TimerContainer = ({ seconds, refresh, render }) => {
  182. const [count, setCount] = useState(seconds) // отслеживаем состояние количества секунд
  183. const [isRunning, setIsRunning] = useState(false) // отслеживаем состояние кнопки стоп/старт для таймера
  184. const Render = render
  185. console.log('count ', count)
  186. // Таймер
  187. useEffect(() => { // эффект, отвечающий за то, когда счетчик прошле в 0, он его переводит в состояние паузы
  188. if (count <= 0) {
  189. setIsRunning(false)
  190. }
  191. }, [count <= 0])
  192. useEffect(() => { // сам счетчик
  193. if (isRunning) {
  194. const start = performance.now()
  195. const int = setInterval(() => {
  196. const diff = Math.floor((performance.now() - start) / refresh)
  197. setCount(count => count - diff)
  198. }, refresh)
  199. return () => clearInterval(int)
  200. }
  201. })
  202. return (
  203. <div>
  204. <Render ms={count} />
  205. <button onClick={() => setIsRunning(!isRunning)}>{isRunning ? 'Pause' : 'Start'}</button>
  206. </div >
  207. )
  208. }
  209. // Timer для LCD
  210. const Timer = ({ ms }) => {
  211. // функция-перевод секунд в нормальный вид
  212. function timerFormat(time) {
  213. const h = Math.floor(time / 60 / 60)
  214. const m = Math.floor(time / 60) - (h * 60)
  215. const s = time % 60
  216. const defaultZero = (param) => (param > 9) ? param : '0' + param
  217. return `${defaultZero(h)} : ${defaultZero(m)} : ${defaultZero(s)}`
  218. }
  219. return (
  220. <div>
  221. {timerFormat(ms)}
  222. </div >
  223. )
  224. }
  225. // Watch
  226. const Watch = ({ ms }) => {
  227. const h = Math.floor(ms / 60 / 60) * 30 // умножаем на 30, чтоы перевести число часов в градусы циферблата
  228. const m = (Math.floor(ms / 60) - (h * 60 / 30)) * 6 // умножаем на 6, чтоы перевести число минут в градусы циферблата
  229. const s = ms % 60 * 6 // умножаем на 6, чтоы перевести число секунд в градусы циферблата
  230. return (
  231. <div style={{ cssText: 'width: 500px; height: 500px' }}>
  232. {/* <img src={ClockFace} /> */}
  233. <img style={{ cssText: 'position:absolute' }} src='http://draw.asmer.fe.a-level.com.ua/ClockFace/ClockFace.png'></img>
  234. <img style={{ cssText: `position: absolute; transform: rotate(${h}deg)` }} src='http://draw.asmer.fe.a-level.com.ua/ClockFace/ClockFace_H.png' />
  235. <img style={{ cssText: `position: absolute; transform: rotate(${m}deg)` }} src='http://draw.asmer.fe.a-level.com.ua/ClockFace/ClockFace_M.png' />
  236. <img style={{ cssText: `position: absolute; transform: rotate(${s}deg)` }} src='http://draw.asmer.fe.a-level.com.ua/ClockFace/ClockFace_S.png' />
  237. </div>
  238. )
  239. }
  240. // TimerControl + TimerContainer
  241. {
  242. // TimerControl
  243. const TimerControl = () => {
  244. const [hours, setHours] = useState('')
  245. const [minutes, setMinutes] = useState('')
  246. const [seconds, setSeconds] = useState('')
  247. // переводим время в секунды
  248. const ms = +hours * 60 * 60 + +minutes * 60 + +seconds
  249. const [count, setCount] = useState()
  250. const [isRunning, setIsRunning] = useState(false)
  251. useEffect(() => setCount(ms), [ms])
  252. // функция-перевод секунд в нормальный вид
  253. function timerFormat(time) {
  254. const h = Math.floor(time / 60 / 60)
  255. const m = Math.floor(time / 60) - (h * 60)
  256. const s = time % 60
  257. const defaultZero = (param) => (param > 9) ? param : '0' + param
  258. return `${defaultZero(h)} : ${defaultZero(m)} : ${defaultZero(s)}`
  259. }
  260. // таймер
  261. useEffect(() => {
  262. if (isRunning) {
  263. const int = setInterval(() => {
  264. setCount(count => {
  265. if (count <= 0) {
  266. setIsRunning(false)
  267. return 0
  268. }
  269. return count - 1
  270. })
  271. }, 1000)
  272. return () => clearInterval(int)
  273. }
  274. }, [isRunning])
  275. return (
  276. <div>
  277. {timerFormat(count)}
  278. <br />
  279. <input type='number' min='0' max='23' placeholder='00' onChange={e => setHours(e.target.value)}></input>
  280. <input type='number' min='0' max='59' placeholder='00' onChange={e => setMinutes(e.target.value)}></input>
  281. <input type='number' min='0' max='59' placeholder='00' onChange={e => setSeconds(e.target.value)}></input>
  282. <br />
  283. <button onClick={() => { setIsRunning(!isRunning) }}>{isRunning ? 'Pause' : 'Start'}</button>
  284. </div >
  285. )
  286. }
  287. }
  288. function App() {
  289. return (
  290. <div className="App">
  291. <header className="App-header" style={{ cssText: "border-radius: 50px; color: #FF0FF; font-size: 2em" }}>
  292. {/* <Watch /> */}
  293. {/*20852 милисекунд - это 5 часов, 47 минут,32 секунды */}
  294. <TimerContainer seconds={20852} refresh={100} render={Watch} />
  295. <div>===============================================</div>
  296. {/* LCD */}
  297. <div>LCD</div>
  298. <TimerContainer seconds={1800} refresh={100} render={Timer} />
  299. <div>==============================================</div>
  300. {/* <SecondsTimer seconds={1302} /> */}
  301. {/* <TimerContainer seconds={100} refresh={100} render={SecondsTimer} /> */}
  302. <div>==============================================</div>
  303. {/* TimerControl */}
  304. <TimerControl />
  305. {/* Timer */}
  306. {/* <Timer ms={7205} /> */}
  307. <Spoiler header={<h1>Заголовок</h1>} open>
  308. Контент 1
  309. <p>
  310. лорем ипсум траливали и тп.
  311. </p>
  312. </Spoiler>
  313. <Spoiler>
  314. <h2>Контент 2</h2>
  315. <p>
  316. лорем ипсум траливали и тп.
  317. </p>
  318. </Spoiler>
  319. {/* <PasswordConfirm min={5} /> */}
  320. {/* <Input /> */}
  321. {/*
  322. <RangeInput min={2} max={10} />
  323. <RangeInput /> */}
  324. <TwoDivs />
  325. <Add a="2" b="10" />
  326. <Add a="500" />
  327. <BlockOfTextWithHeader title="заголовок">
  328. lorem ipsum траливали
  329. </BlockOfTextWithHeader>
  330. <BlockOfTextWithHeader title="заголовок 2">
  331. lorem ipsum траливали 2
  332. </BlockOfTextWithHeader>
  333. </header>
  334. </div>
  335. );
  336. }
  337. export default App;