diff --git a/index.html b/index.html index 0c589ec..3be09e4 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,8 @@ - - Vite + React + УлЧУ
diff --git a/src/App.css b/src/App.css index b9d355d..e69de29 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.jsx b/src/App.jsx index f67355a..3466d0b 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,35 +1,12 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' +import News from "./components/News/News" import './App.css' function App() { - const [count, setCount] = useState(0) - return ( - <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.jsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

- +
+ +
) } -export default App +export default App \ No newline at end of file diff --git a/src/components/News/Hooks/NewsHook.jsx b/src/components/News/Hooks/NewsHook.jsx new file mode 100644 index 0000000..15ab639 --- /dev/null +++ b/src/components/News/Hooks/NewsHook.jsx @@ -0,0 +1,38 @@ +import { useState } from "react" + +export const useNews = () => { + const [News, setNews] = useState([]) + + const addNews = (id, name, teg, description) => { + const newNews = {} + newNews.id = id + newNews.name = name + newNews.teg = teg + newNews.description = description + setNews([...News, newNews]) + } + + const editNews = (id, name, teg, description) => { + setNews( + News.map((news) => { + if (news.id === id) { + return { news, id, name, teg, description } + } else { + return news + } + }) + ) + } + + const removeNews = (id) => { + setNews(News.filter((news) => news.id !== id)) + } + + const sortNews = () => { + const newNews = [...News] + newNews.reverse() + setNews(newNews) + } + + return { News, addNews, editNews, removeNews, sortNews } +} \ No newline at end of file diff --git a/src/components/News/News.jsx b/src/components/News/News.jsx new file mode 100644 index 0000000..0103405 --- /dev/null +++ b/src/components/News/News.jsx @@ -0,0 +1,9 @@ +import NewsInfo from "./NewsItem/NewsInfo" + +export default function News({className = null}) { + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/src/components/News/News.module.css b/src/components/News/News.module.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/News/NewsItem/NewsInfo.jsx b/src/components/News/NewsItem/NewsInfo.jsx new file mode 100644 index 0000000..e5f94d8 --- /dev/null +++ b/src/components/News/NewsItem/NewsInfo.jsx @@ -0,0 +1,75 @@ +import { useState } from "react" +import NewsItem from "./NewsItem" +import { useNews } from "../Hooks/NewsHook" + +let key = 1 + +export default function NewsInfo() { + const [inputs, setInputs] = useState({ id: "", name: "", teg: "", description: "" }) + const { news, addNews, editNews, removeNews, sortNews } = useNews() + + const handleClear = () => { + setInputs({ id: "", name: "", teg: "", description: "" }) + } + + const handleSubmit = (event) => { + event.preventDefault() + event.stopPropagation() + + if (!inputs.id) { + addNews(key++, inputs.name, inputs.teg, inputs.description) + } else { + editNews(inputs.id, inputs.name, inputs.teg, inputs.description) + } + + handleClear() + }; + + const handleEdit = (id) => { + const data = news.find((news) => news.id === id) + if (!data) { + return + } + setInputs({ ...inputs, ...data }) + }; + + const handleRemove = (id) => { + removeNews(id) + handleClear() + }; + + const handleChange = (event) => { + setInputs({ ...inputs, [event.target.name]: event.target.value }) + }; + + const newsItems = news.map((item) => { + return + }) + + return ( +
+
Новости
+
+ +

Название

+ +

Тег

+ +

Описание

+ +
+ + +
+
+ + {newsItems} +
+ ) +} \ No newline at end of file diff --git a/src/components/News/NewsItem/NewsItem.jsx b/src/components/News/NewsItem/NewsItem.jsx new file mode 100644 index 0000000..ea725eb --- /dev/null +++ b/src/components/News/NewsItem/NewsItem.jsx @@ -0,0 +1,13 @@ +export default function NewsItem({news, onEdit, onDelete}) { + return ( +
+

Название: {news.name}

+

Тег: {news.teg}

+

{news.description}

+
+ + +
+
+ ) +} \ No newline at end of file