Skip to content
Closed

Hw6 #1320

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
6a19c06
создана ветка hm1
ProiZvoDiteLb Jun 30, 2025
961d297
реализовано ДЗ с добавлением комментария
ProiZvoDiteLb Jun 30, 2025
c787b92
HM1
ProiZvoDiteLb Jun 30, 2025
6945dfe
pull
ProiZvoDiteLb Jun 30, 2025
ffd5026
Merge pull request #2 from ProiZvoDiteLb/hm1
ProiZvoDiteLb Jul 1, 2025
ca95a14
создана ветка hw2
ProiZvoDiteLb Jul 9, 2025
b6c1869
в like-button добавлен background-position: center;
ProiZvoDiteLb Jul 9, 2025
eeeab1e
создал переменные для поиска кнопок и счетчика лайков
ProiZvoDiteLb Jul 9, 2025
9f4897b
доп комит
ProiZvoDiteLb Jul 10, 2025
6b224b2
изменен и добавлен код исходя из задания
ProiZvoDiteLb Jul 12, 2025
ed710eb
Merge pull request #3 from ProiZvoDiteLb/hw2
ProiZvoDiteLb Jul 13, 2025
ff1e5e6
проба пула
ProiZvoDiteLb Jul 13, 2025
1957f97
создана ветка hw3 выполнено дз
ProiZvoDiteLb Jul 14, 2025
dc08446
Merge pull request #4 from ProiZvoDiteLb/hw3
ProiZvoDiteLb Jul 16, 2025
6df9724
разбитие JS на модули
ProiZvoDiteLb Jul 26, 2025
e6a28ff
переустановка prettier
ProiZvoDiteLb Jul 26, 2025
ec5eb3e
Delete node_modules directory
ProiZvoDiteLb Jul 27, 2025
064ab23
Merge pull request #5 from ProiZvoDiteLb/hw3
ProiZvoDiteLb Aug 2, 2025
8a77071
HW проверка
ProiZvoDiteLb Aug 2, 2025
fbcde7b
Merge branch 'main' of https://github.com/ProiZvoDiteLb/JavaScript-ad…
ProiZvoDiteLb Aug 2, 2025
e6e7dbf
создал hw4 а перед этим пофиксил ошибки
ProiZvoDiteLb Aug 2, 2025
3d965a3
подключил API
ProiZvoDiteLb Aug 6, 2025
4929f64
добавление запроса API и сохранение изменений на сервере по API медот…
ProiZvoDiteLb Aug 8, 2025
fe40bd3
внесены изменения для правильной работы
ProiZvoDiteLb Aug 10, 2025
0b7b556
добавил файлы для отслеживания в git
ProiZvoDiteLb Aug 10, 2025
7a6ccc7
создание ветки hw5 и нового файла
ProiZvoDiteLb Aug 11, 2025
36744bb
ДЗ на проверку
ProiZvoDiteLb Aug 11, 2025
2a48c3f
Создана ветка hw6
ProiZvoDiteLb Aug 19, 2025
0928845
Вополнение задания,необходимо проверить
ProiZvoDiteLb Aug 19, 2025
ef365be
Доработка дз, что бы старые коменты не исчезали
ProiZvoDiteLb Aug 20, 2025
aefbe4a
создана ветка hw7
ProiZvoDiteLb Aug 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .prettierrc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
tabWidth: 4
semi: false
singleQuote: true
16 changes: 16 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import js from '@eslint/js'
import globals from 'globals'
import { defineConfig } from 'eslint/config'
import config from 'eslint-config-prettier'
import plugin from 'eslint-plugin-prettier/recommended'

export default defineConfig([
{
files: ['**/*.{js,mjs,cjs}'],
plugins: { js },
extends: ['js/recommended'],
languageOptions: { globals: globals.browser },
},
config,
plugin,
])
110 changes: 49 additions & 61 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,71 +1,59 @@
<!DOCTYPE html>
<html>
<head>
<title>Проект "Комменты"</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="styles.css" />
</head>
<head>
<title>Проект "Комменты"</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="styles.css" />
</head>

<body>
<div class="container">
<ul class="comments">
<li class="comment">
<div class="comment-header">
<div>Глеб Фокин</div>
<div>12.02.22 12:18</div>
</div>
<div class="comment-body">
<div class="comment-text">
Это будет первый комментарий на этой странице
</div>
</div>
<div class="comment-footer">
<div class="likes">
<span class="likes-counter">3</span>
<button class="like-button"></button>
</div>
<body>

<div class="container">
<ul class="comments" id="comments-list">
<li class="comment">
<div class="comment-header">
<div>Глеб Фокин</div>
<div>12.02.22 12:18</div>
</div>
<div class="comment-body">
<div class="comment-text">
Это будет первый комментарий на этой странице
</div>
</li>
<li class="comment">
<div class="comment-header">
<div>Варвара Н.</div>
<div>13.02.22 19:22</div>
</div>
<div class="comment-footer">
<div class="likes">
<span class="likes-counter">3</span>
<button class="like-button"></button>
</div>
<div class="comment-body">
<div class="comment-text">
Мне нравится как оформлена эта страница! ❤
</div>
</div>
</li>
<li class="comment">
<div class="comment-header">
<div>Варвара Н.</div>
<div>13.02.22 19:22</div>
</div>
<div class="comment-body">
<div class="comment-text">
Мне нравится как оформлена эта страница! ❤
</div>
<div class="comment-footer">
<div class="likes">
<span class="likes-counter">75</span>
<button class="like-button -active-like"></button>
</div>
</div>
<div class="comment-footer">
<div class="likes">
<span class="likes-counter">75</span>
<button class="like-button -active-like"></button>
</div>
</li>
</ul>
<div class="add-form">
<input
type="text"
class="add-form-name"
placeholder="Введите ваше имя"
/>
<textarea
type="textarea"
class="add-form-text"
placeholder="Введите ваш коментарий"
rows="4"
></textarea>
<div class="add-form-row">
<button class="add-form-button">Написать</button>
</div>
</li>
</ul>
<div class="add-form">
<input type="text" class="add-form-name" placeholder="Введите ваше имя" />
<textarea type="textarea" class="add-form-text" placeholder="Введите ваш коментарий" rows="4"></textarea>
<div class="add-form-row">
<button class="add-form-button">Написать</button>
</div>
</div>
</body>

<script>
"use strict";
// Код писать здесь
console.log("It works!");
</script>
</html>
</div>
</body>
<div id="app"></div>
<script type="module" src="./index.js" defer></script>
</html>
102 changes: 102 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { updateComments } from './modules/comments.js'
import { renderComments } from './modules/renderComments.js'
import { fetchAndRenderComments } from './modules/fetchAndRenderComments.js'

fetchAndRenderComments()

/*
// Функция загрузки комментариев
const loadComments = () => {
fetch('https://wedev-api.sky.pro/api/v1/ProiZvoDiteLb/comments')
.then((response) => response.json())
.then((data) => {
updateComments(data.comments)
renderComments()
})
}
// Загрузка комментариев при старте
loadComments()
*/
// Сохраняем введённые данные в переменные
let savedName = ''
let savedComment = ''

const nameInput = document.querySelector('.add-form-name') //Создаем переменную и ищем элемент с классом .add-form-name
const commentInput = document.querySelector('.add-form-text') //Создаем переменную и ищем элемент с классом .add-form-text
const submitButton = document.querySelector('.add-form-button') //Создаем переменную и ищем элемент с классом .add-form-button
const formContainer = document.querySelector('.add-form')

// Отслеживаем ввод
nameInput.addEventListener('input', () => (savedName = nameInput.value))
commentInput.addEventListener(
'input',
() => (savedComment = commentInput.value),
)

// Восстанавливаем значения после рендера
const restoreFormValues = () => {
nameInput.value = savedName
commentInput.value = savedComment
}
restoreFormValues()

// Обработчик события для кнопки "Написать"
submitButton.addEventListener('click', () => {
const name = nameInput.value
.trim()
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;') //используем replaceAll() для замены символов < и > на их HTML-сущности &lt; и &gt;
const comment = commentInput.value
.trim()
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;') //используем replaceAll() для замены символов < и > на их HTML-сущности &lt; и &gt;

// Проверка на наличие имени и комментария
if (name === '' || comment === '') {
alert('Пожалуйста, заполните все поля.')
return
}

// Создаем новый комментарий
const newComment = {
name: name,
// date: new Date().toLocaleString(),
date: new Date().toISOString(),
text: comment,
likes: 0,
isLiked: false,
}

/* очищение убираем, если очищать поля сразу, а запрос упадёт (400, 500, или пропадёт интернет), пользователь потеряет весь введённый текст.
//метод HTTP, который отправляет данные на сервер.
// Очищаем поля ПЕРЕД скрытием формы
nameInput.value = ''
commentInput.value = ''
*/

// Сохраняем значения перед скрытием формы
savedName = name
savedComment = comment

// Скрываем форму и блокируем кнопку
formContainer.style.display = 'none'
submitButton.disabled = true

fetchAndRenderComments
.postComment(newComment)
.then(() => {
savedName = ''
savedComment = ''
nameInput.value = ''
commentInput.value = ''
})
.catch(() => {
// В случае ошибки форма не очищается
restoreFormValues()
})
.finally(() => {
// Показываем форму и разблокируем кнопку
formContainer.style.display = ''
submitButton.disabled = false
})
})
61 changes: 61 additions & 0 deletions modules/api.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
const host = 'https://wedev-api.sky.pro/api/v2/ProiZvoDiteLb/comments'
const authToken =
'Bearer asb4c4boc86gasb4c4boc86g37w3cc3bo3b83k4g37k3bk3cg3c03ck4k'

let token = ''

export const updateToken = (newToken) => {
token = newToken
}

export function getComments() {
return fetch(host, {
method: 'GET',
headers: {
Authorization: token,
},
}).then((response) => {
return response.json()
})
}

export function postComment({ text }) {
return fetch(host, {
method: 'POST',
headers: {
Authorization: token,
},
body: JSON.stringify({
text,
}),
}).then((response) => {
return response.json()
})
}

export function login({ login, password }) {
return fetch(`${authToken}/login`, {
method: 'POST',

body: JSON.stringify({
login,
password,
}),
}).then((response) => {
return response.json()
})
}

export function registration({ login, name, password }) {
return fetch(authToken, {
method: 'POST',
body: JSON.stringify({ login, password, name }),
}).then((response) => {
return response.json().then((data) => {
if (!response.ok) {
throw new Error(data.error || 'Ошибка регистрации')
}
return data
})
})
}
5 changes: 5 additions & 0 deletions modules/comments.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export let comments = []

export const updateComments = (newComments) => {
comments = newComments
}
67 changes: 67 additions & 0 deletions modules/fetchAndRenderComments.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { updateComments } from './comments.js'
import { renderComments } from './renderComments.js'

const host = 'https://wedev-api.sky.pro/api/v2/ProiZvoDiteLb/comments'

export const fetchAndRenderComments = () => {
const commentsList = document.getElementById('comments-list')
commentsList.innerHTML = `<li>Пожалуйста, подождите, загружаю комментарии...</li>`

return fetch(host)
.then((response) => {
if (response.status === 500) {
throw new Error('500')
}
return response.json()
})
.then((data) => {
updateComments(data.comments)
renderComments()
})
.catch((error) => {
if (error.message === '500') {
alert('Не удалось загрузить комментарии, попробуйте позже')
} else {
alert('Проблемы с соединением, проверьте интернет')
}
})
}

// Метод для отправки комментария и повторной загрузки списка
fetchAndRenderComments.postComment = (newComment) => {
const commentsList = document.getElementById('comments-list')

// Сохраняем старое содержимое списка
const previousHtml = commentsList.innerHTML

commentsList.innerHTML = `<li>Комментарий добавляется...</li>`

return fetch(host, {
method: 'POST',
body: JSON.stringify(newComment),
})
.then((response) => {
if (response.status === 400) {
throw new Error('400')
}
if (response.status === 500) {
throw new Error('500')
}
return response.json()
})
.then(() => fetchAndRenderComments())
.catch((error) => {
// Восстанавливаем старые комментарии
commentsList.innerHTML = previousHtml
if (error.message === '400') {
alert(
'Поля заполнены некорректно,имя и комментарий должны быть не короче 3х символов',
)
} else if (error.message === '500') {
alert('Сервер сломался, попробуйте позже')
} else {
alert('Проблемы с соединением, проверьте интернет')
}
throw error // проброс, чтобы index.js знал, что был сбой
})
}
Loading