Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
67 changes: 37 additions & 30 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,33 +1,40 @@
<!DOCTYPE html>
<!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">
<!-- Комментарии будут загружаться через JavaScript -->
</ul>
<div id="comments-loading" class="loading">
Пожалуйста подождите, загружаю комментарии...
</div>
<div id="form-loading" class="loading" style="display: none">
Комментарий добавляется...
</div>
<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>
</div>
</body>

<body>
<div class="container">
<ul class="comments">
<!-- Комментарии будут загружаться через JavaScript -->
</ul>
<div id="comments-loading" class="loading">
Пожалуйста подождите, загружаю комментарии...
</div>
<div id="form-loading" class="loading" style="display: none;">
Комментарий добавляется...
</div>
<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>
</div>
</body>

<script type="module" src="./main.js"></script>

</html>
<script type="module" src="./main.js"></script>
</html>
38 changes: 19 additions & 19 deletions main.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
import { comments } from './modules/data.js';
import { getComments } from './modules/api.js';
import { renderComments } from './modules/render.js';
import { initAddCommentListener } from './modules/listeners.js';
import { showGlobalLoading, hideGlobalLoading } from './modules/loaders.js';
import { comments } from './modules/data.js'
import { getComments } from './modules/api.js'
import { renderComments } from './modules/render.js'
import { initAddCommentListener } from './modules/listeners.js'
import { showGlobalLoading, hideGlobalLoading } from './modules/loaders.js'

async function loadComments() {
try {
showGlobalLoading();

const freshComments = await getComments();
comments.length = 0;
comments.push(...freshComments);
renderComments();

showGlobalLoading()

const freshComments = await getComments()
comments.length = 0
comments.push(...freshComments)
renderComments()
} catch (error) {
console.error('Ошибка загрузки комментариев:', error);
const commentsList = document.querySelector('.comments');
commentsList.innerHTML = '<div class="error">Не удалось загрузить комментарии</div>';
console.error('Ошибка загрузки комментариев:', error)
const commentsList = document.querySelector('.comments')
commentsList.innerHTML =
'<div class="error">Не удалось загрузить комментарии</div>'
} finally {
hideGlobalLoading();
hideGlobalLoading()
}
}

// Запуск приложения
loadComments();
initAddCommentListener();
loadComments()
initAddCommentListener()

export { loadComments };
export { loadComments }
88 changes: 70 additions & 18 deletions modules/api.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,76 @@
const API_BASE_URL = "https://wedev-api.sky.pro/api/v1";
const PERSONAL_KEY = "eduard-zakharevskiy";
const API_URL = `${API_BASE_URL}/${PERSONAL_KEY}/comments`;
const API_BASE_URL = 'https://wedev-api.sky.pro/api/v1'
const PERSONAL_KEY = 'eduard-zakharevskiy'
const API_URL = `${API_BASE_URL}/${PERSONAL_KEY}/comments`

export async function getComments() {
const response = await fetch(API_URL);
if (!response.ok) throw new Error('Ошибка загрузки');
const data = await response.json();
return data.comments;
}
try {
const response = await fetch(API_URL)

// обработка статусов для GET запроса
if (response.status === 500) {
throw new Error('Сервер сломался, попробуй позже')
}

export async function addComment({ name, text }) {
const response = await fetch(API_URL, {
method: 'POST',
body: JSON.stringify({ name, text })
});
if (!response.ok) {
throw new Error(`Ошибка загрузки: ${response.status}`)
}

if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || 'Ошибка сервера');
const data = await response.json()
return data.comments
} catch (error) {
console.error('Ошибка при загрузке комментариев:', error)
throw error // прокидываем ошибку дальше
}
}

export async function addComment(
{ name, text, forceError = false },
retryCount = 0,
) {
const maxRetries = 2 // максимально 2 повторные попытки

try {
const response = await fetch(API_URL, {
method: 'POST',
body: JSON.stringify({ name, text, forceError }),
})

// обработка HTTP статусов
if (response.status === 500) {
// если есть еще попытки, повторяем
if (retryCount < maxRetries) {
console.log(
`Сервер вернул 500, повторяем попытку ${retryCount + 1}/${maxRetries}`,
)
// ждем 1 сек перед повторной попыткой
await new Promise((resolve) => setTimeout(resolve, 1000))
return addComment({ name, text, forceError }, retryCount + 1)
}
throw new Error('Сервер сломался, попробуй позже')
}

return await response.json();
}
if (response.status === 400) {
throw new Error(
'Имя и комментарий должны быть не короче 3 символов',
)
}

if (!response.ok) {
throw new Error(`Ошибка сервера: ${response.status}`)
}

return await response.json()
} catch (error) {
// если ошибка сети и есть еще попытки - повторяем
if (error.message === 'Failed to fetch' && retryCount < maxRetries) {
console.log(
`Сетевая ошибка, повторяем попытку ${retryCount + 1}/${maxRetries}`,
)
await new Promise((resolve) => setTimeout(resolve, 1000))
return addComment({ name, text, forceError }, retryCount + 1)
}

console.error('Ошибка при добавлении комментария:', error)
throw error
}
}
4 changes: 2 additions & 2 deletions modules/data.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export let comments = [];
export let replyingTo = null;
export let comments = []
export let replyingTo = null
Loading