Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
23b4356
Update api.js
Alina-skypro2025 Jul 31, 2025
8fbca97
Update index.js
Alina-skypro2025 Jul 31, 2025
9f465d7
Update api.js
Alina-skypro2025 Jul 31, 2025
4a92adf
Update index.js
Alina-skypro2025 Jul 31, 2025
942a651
Update index.js
Alina-skypro2025 Jul 31, 2025
480a59e
Update posts-page-component.js
Alina-skypro2025 Jul 31, 2025
d57a7c9
Update posts-page-component.js
Alina-skypro2025 Jul 31, 2025
f9d4c45
Update posts-page-component.js
Alina-skypro2025 Jul 31, 2025
ad11cd4
Update add-post-page-component.js
Alina-skypro2025 Jul 31, 2025
271aa77
Update styles.css
Alina-skypro2025 Jul 31, 2025
eea767d
Update index.js
Alina-skypro2025 Jul 31, 2025
f4cea14
Update loading-page-component.js
Alina-skypro2025 Jul 31, 2025
f054e95
Update styles.css
Alina-skypro2025 Jul 31, 2025
0c074cf
Update posts-page-component.js
Alina-skypro2025 Jul 31, 2025
772b602
Update index.js
Alina-skypro2025 Jul 31, 2025
6e59ac7
Update README.md
Alina-skypro2025 Jul 31, 2025
6b830a6
Update index.js
Alina-skypro2025 Jul 31, 2025
5344bfb
Add files via upload
Alina-skypro2025 Aug 3, 2025
42850ba
Update posts-page-component.js
Alina-skypro2025 Aug 3, 2025
1126d66
Update styles.css
Alina-skypro2025 Aug 3, 2025
3e192f3
Update index.js
Alina-skypro2025 Aug 3, 2025
75a15c5
Update posts-page-component.js
Alina-skypro2025 Aug 3, 2025
dbf8610
Update styles.css
Alina-skypro2025 Aug 3, 2025
f403824
Update posts-page-component.js
Alina-skypro2025 Aug 3, 2025
4e370d9
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
072b8ed
Update api.js
Alina-skypro2025 Aug 6, 2025
bfc6f03
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
b18e8a0
Update api.js
Alina-skypro2025 Aug 6, 2025
e0290bc
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
fc6873e
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
f1cc48c
Update index.js
Alina-skypro2025 Aug 6, 2025
7ff094d
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
945e320
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
60371c1
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
468680e
Update add-post-page-component.js
Alina-skypro2025 Aug 6, 2025
76da12b
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
0b0817d
Update api.js
Alina-skypro2025 Aug 6, 2025
1a40ef3
Update add-post-page-component.js
Alina-skypro2025 Aug 6, 2025
2b6910a
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
a8e8aba
Update api.js
Alina-skypro2025 Aug 6, 2025
f8ba68f
Update add-post-page-component.js
Alina-skypro2025 Aug 6, 2025
de7778c
Update upload-image-component.js
Alina-skypro2025 Aug 6, 2025
01af62a
Update api.js
Alina-skypro2025 Aug 6, 2025
8ee0881
Update api.js
Alina-skypro2025 Aug 6, 2025
cd142eb
Update api.js
Alina-skypro2025 Aug 6, 2025
7d70771
Update add-post-page-component.js
Alina-skypro2025 Aug 6, 2025
a2cfa0a
Update index.js
Alina-skypro2025 Aug 6, 2025
fba34fd
Update api.js
Alina-skypro2025 Aug 6, 2025
f91dddd
Update api.js
Alina-skypro2025 Aug 6, 2025
1b1a320
Update index.js
Alina-skypro2025 Aug 6, 2025
832ee8b
Update api.js
Alina-skypro2025 Aug 6, 2025
71530d3
Update index.js
Alina-skypro2025 Aug 6, 2025
0310df5
Update api.js
Alina-skypro2025 Aug 10, 2025
a3151f7
Update index.js
Alina-skypro2025 Aug 10, 2025
21cd65c
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
8d42e2f
Update posts-page-component.js
Alina-skypro2025 Aug 10, 2025
74b27a3
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
ec3b20e
Update api.js
Alina-skypro2025 Aug 10, 2025
3c49f5f
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
1103bce
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
b0f69d0
Update api.js
Alina-skypro2025 Aug 10, 2025
01bed3f
Update index.js
Alina-skypro2025 Aug 10, 2025
8ab95fa
Update api.js
Alina-skypro2025 Aug 10, 2025
e3a96c6
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
dfa037c
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
c4a82e5
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
bca96d6
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
e9fd475
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
07777ca
Update api.js
Alina-skypro2025 Aug 10, 2025
4b327e0
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
abab9c3
Update api.js
Alina-skypro2025 Aug 10, 2025
c2ec063
Update index.js
Alina-skypro2025 Aug 10, 2025
c5a521d
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
c228891
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
0cecce9
Update helpers.js
Alina-skypro2025 Aug 10, 2025
8671520
Update api.js
Alina-skypro2025 Aug 10, 2025
38309a1
Update index.js
Alina-skypro2025 Aug 10, 2025
628b27c
Update index.js
Alina-skypro2025 Aug 10, 2025
2f9f32a
Update api.js
Alina-skypro2025 Aug 10, 2025
b77d9c1
Update api.js
Alina-skypro2025 Aug 10, 2025
ed0a89f
Update index.js
Alina-skypro2025 Aug 10, 2025
94b8957
Update add-post-page-component.js
Alina-skypro2025 Aug 10, 2025
8527831
Update upload-image-component.js
Alina-skypro2025 Aug 10, 2025
e4feefd
Update helpers.js
Alina-skypro2025 Aug 10, 2025
0b166be
Update api.js
Alina-skypro2025 Aug 10, 2025
d76daab
Update api.js
Alina-skypro2025 Aug 10, 2025
f6e7573
Update api.js
Alina-skypro2025 Aug 10, 2025
f34984f
Update helpers.js
Alina-skypro2025 Aug 10, 2025
5efba1a
Update api.js
Alina-skypro2025 Aug 20, 2025
fd1018a
Update api.js
Alina-skypro2025 Aug 20, 2025
ca8b89f
Update api.js
Alina-skypro2025 Aug 20, 2025
260b0be
Update api.js
Alina-skypro2025 Aug 20, 2025
0d0ed87
Update api.js
Alina-skypro2025 Aug 20, 2025
a95681a
Update auth-page-component.js
Alina-skypro2025 Aug 20, 2025
30356de
Update add-post-page-component.js
Alina-skypro2025 Aug 20, 2025
bb06223
Update add-post-page-component.js
Alina-skypro2025 Aug 20, 2025
d35ee1c
Update api.js
Alina-skypro2025 Aug 20, 2025
ee5158f
Update index.js
Alina-skypro2025 Aug 20, 2025
514c80d
Update add-post-page-component.js
Alina-skypro2025 Aug 20, 2025
598fc37
Update auth-page-component.js
Alina-skypro2025 Aug 20, 2025
4d35817
Update header-component.js
Alina-skypro2025 Aug 20, 2025
a7a5356
Update loading-page-component.js
Alina-skypro2025 Aug 20, 2025
0e31291
Update posts-page-component.js
Alina-skypro2025 Aug 20, 2025
dc90283
Update upload-image-component.js
Alina-skypro2025 Aug 20, 2025
0893a98
Update upload-image-component.js
Alina-skypro2025 Aug 20, 2025
57d3a2d
Update api.js
Alina-skypro2025 Aug 20, 2025
b4a0c31
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
be66acd
Update auth-page-component.js
Alina-skypro2025 Aug 31, 2025
2acc6f5
Update header-component.js
Alina-skypro2025 Aug 31, 2025
70a6f24
Update loading-page-component.js
Alina-skypro2025 Aug 31, 2025
fd6b889
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
ef3dac2
Update upload-image-component.js
Alina-skypro2025 Aug 31, 2025
af2523b
Create user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
8f89c40
Update api.js
Alina-skypro2025 Aug 31, 2025
9b37fb9
Update helpers.js
Alina-skypro2025 Aug 31, 2025
1d31c5e
Update index.js
Alina-skypro2025 Aug 31, 2025
7c9fbee
Update api.js
Alina-skypro2025 Aug 31, 2025
9894672
Update routes.js
Alina-skypro2025 Aug 31, 2025
45d1d1a
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
08fc8ec
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
76a5ade
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
f140ec1
Update index.js
Alina-skypro2025 Aug 31, 2025
8b6c1fd
Update index.html
Alina-skypro2025 Aug 31, 2025
b990234
Update api.js
Alina-skypro2025 Aug 31, 2025
f6e3085
Update routes.js
Alina-skypro2025 Aug 31, 2025
cfb33c2
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
d04f8de
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
caf9419
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
8cc0c45
Update index.js
Alina-skypro2025 Aug 31, 2025
0d0ad0d
Update index.html
Alina-skypro2025 Aug 31, 2025
0e5cf1c
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
52a3abe
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
48bad0e
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
28e1bd1
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
e06d369
Update index.html
Alina-skypro2025 Aug 31, 2025
2d81781
Update api.js
Alina-skypro2025 Aug 31, 2025
57a6f82
Update api.js
Alina-skypro2025 Aug 31, 2025
29c0f95
Update api.js
Alina-skypro2025 Aug 31, 2025
7ad4eb2
Update api.js
Alina-skypro2025 Aug 31, 2025
bd375cd
Update api.js
Alina-skypro2025 Aug 31, 2025
188e836
Update api.js
Alina-skypro2025 Aug 31, 2025
97403b3
Update api.js
Alina-skypro2025 Aug 31, 2025
702071a
Update api.js
Alina-skypro2025 Aug 31, 2025
153e936
Update api.js
Alina-skypro2025 Aug 31, 2025
6439788
Update api.js
Alina-skypro2025 Aug 31, 2025
755c142
Update index.js
Alina-skypro2025 Aug 31, 2025
c77d445
Update helpers.js
Alina-skypro2025 Aug 31, 2025
fc9d84c
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
818d089
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
cf3a4c0
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
e3220be
Update api.js
Alina-skypro2025 Aug 31, 2025
aac5968
Update index.js
Alina-skypro2025 Aug 31, 2025
ad0e9d7
Update helpers.js
Alina-skypro2025 Aug 31, 2025
248703c
Update header-component.js
Alina-skypro2025 Aug 31, 2025
4cdf680
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
53904c1
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
e339710
Update user-posts-page-component.js
Alina-skypro2025 Aug 31, 2025
c6716b0
Update api.js
Alina-skypro2025 Aug 31, 2025
3d10926
Update api.js
Alina-skypro2025 Aug 31, 2025
c6ddc0c
Update api.js
Alina-skypro2025 Aug 31, 2025
20f0bf0
Update api.js
Alina-skypro2025 Aug 31, 2025
7b74dc5
Update api.js
Alina-skypro2025 Aug 31, 2025
5cfcf5c
Update api.js
Alina-skypro2025 Aug 31, 2025
cd5f107
Update api.js
Alina-skypro2025 Aug 31, 2025
a4fb4bb
Update api.js
Alina-skypro2025 Aug 31, 2025
ffb757e
Update index.js
Alina-skypro2025 Aug 31, 2025
d96ceae
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
7431e1d
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
fa5abbd
Update upload-image-component.js
Alina-skypro2025 Aug 31, 2025
a78d590
Update auth-page-component.js
Alina-skypro2025 Aug 31, 2025
2f0087d
Update api.js
Alina-skypro2025 Aug 31, 2025
db1e27e
Update index.js
Alina-skypro2025 Aug 31, 2025
defa0aa
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
ce836f3
Update auth-page-component.js
Alina-skypro2025 Aug 31, 2025
b606ff9
Update header-component.js
Alina-skypro2025 Aug 31, 2025
af865bb
Update posts-page-component.js
Alina-skypro2025 Aug 31, 2025
f2c1ae5
Update upload-image-component.js
Alina-skypro2025 Aug 31, 2025
72e8a5b
Update header-component.js
Alina-skypro2025 Aug 31, 2025
529a636
Update index.js
Alina-skypro2025 Aug 31, 2025
63ae539
Update api.js
Alina-skypro2025 Aug 31, 2025
d15892d
Update index.js
Alina-skypro2025 Aug 31, 2025
dbe5c20
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
75e5213
Update upload-image-component.js
Alina-skypro2025 Aug 31, 2025
81eb083
Update helpers.js
Alina-skypro2025 Aug 31, 2025
0790f73
Update api.js
Alina-skypro2025 Aug 31, 2025
5f05cd5
Update index.js
Alina-skypro2025 Aug 31, 2025
c5b3705
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
213630b
Update upload-image-component.js
Alina-skypro2025 Aug 31, 2025
dbca6c2
Update helpers.js
Alina-skypro2025 Aug 31, 2025
87ce95c
Update helpers.js
Alina-skypro2025 Aug 31, 2025
39b5363
Update helpers.js
Alina-skypro2025 Aug 31, 2025
9fab2f1
Update add-post-page-component.js
Alina-skypro2025 Aug 31, 2025
09c3bd2
Update helpers.js
Alina-skypro2025 Aug 31, 2025
37d4ecf
Update helpers.js
Alina-skypro2025 Sep 1, 2025
bc0c28c
Update add-post-page-component.js
Alina-skypro2025 Sep 1, 2025
5f50cc3
Update upload-image-component.js
Alina-skypro2025 Sep 1, 2025
8a80da1
Update add-post-page-component.js
Alina-skypro2025 Sep 1, 2025
1339aad
Update api.js
Alina-skypro2025 Sep 1, 2025
516a250
Update api.js
Alina-skypro2025 Sep 1, 2025
6434cb7
Update auth-page-component.js
Alina-skypro2025 Sep 1, 2025
4535a17
Update auth-page-component.js
Alina-skypro2025 Sep 1, 2025
f064015
Update api.js
Alina-skypro2025 Sep 1, 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
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
# Instapro

MVP социальной сети для обмена фотографиями

Удалось реализовать :
Анимации интерфейса
Плавные переходы между страницами
Анимация лайков при нажатии
Анимация ошибок формы
Индикаторы загрузки
Спиннер загрузки с анимацией
Визуальная обратная связь при действиях пользователя
## Первоначальная оценка

ХХХХ часов
18 часов

## Фактически затраченное время

YYYY часов
10 часов
238 changes: 227 additions & 11 deletions api.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,94 @@
// Замени на свой, чтобы получить независимый от других набор данных.
// "боевая" версия инстапро лежит в ключе prod
// api.js
// Базовый URL API из документации
const personalKey = "prod";
const baseHost = "https://webdev-hw-api.vercel.app";
const baseHost = "https://wedev-api.sky.pro";
// Адрес для работы с постами
const postsHost = `${baseHost}/api/v1/${personalKey}/instapro`;

/**
* Получить список всех постов.
* @param {Object} params
* @param {string} [params.token] - Токен авторизации (для получения состояния isLiked).
* @returns {Promise<Array>} - Массив постов.
*/
export function getPosts({ token }) {
// Заголовки запроса. Для GET не нужно указывать Content-Type.
const headers = {};

// Если токен предоставлен, добавляем его в заголовки
if (token) {
headers.Authorization = token;
}

return fetch(postsHost, {
method: "GET",
headers: {
Authorization: token,
},
headers,
})
.then((response) => {
if (response.status === 401) {
throw new Error("Нет авторизации");
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then((data) => {
// API возвращает объект { posts: [...] }
return data.posts;
});
}

/**
* Получить посты конкретного пользователя.
* @param {Object} params
* @param {string} [params.token] - Токен авторизации (для получения состояния isLiked).
* @param {string} params.userId - ID пользователя.
* @returns {Promise<Array>} - Массив постов пользователя.
*/
export function getUserPosts({ token, userId }) {
// Заголовки запроса. Для GET не нужно указывать Content-Type.
const headers = {};

// Если токен предоставлен, добавляем его в заголовки
if (token) {
headers.Authorization = token;
}

// Формируем URL для получения постов конкретного пользователя
const url = `${postsHost}/user-posts/${userId}`;

return fetch(url, {
method: "GET",
headers,
})
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then((data) => {
// API возвращает объект { posts: [...] }
return data.posts;
});
}

/**
* Регистрация нового пользователя.
* @param {Object} params
* @param {string} params.login
* @param {string} params.password
* @param {string} params.name
* @param {string} params.imageUrl
* @returns {Promise<Object>} - Данные нового пользователя.
*/
export function registerUser({ login, password, name, imageUrl }) {
// ВАЖНО: Для этого конкретного эндпоинта НЕ НУЖНО указывать Content-Type: application/json
// Согласно ошибке сервера: "В заголовке передан content-type: application/json, но эта API не умеет работать с этим заголовком, уберите его"
return fetch(baseHost + "/api/user", {
method: "POST",
// Убираем "Content-Type": "application/json",
headers: {
// Никаких заголовков, кроме стандартных для JSON, не нужно
},
body: JSON.stringify({
login,
password,
Expand All @@ -34,36 +97,189 @@ export function registerUser({ login, password, name, imageUrl }) {
}),
}).then((response) => {
if (response.status === 400) {
throw new Error("Такой пользователь уже существует");
// Обрабатываем ошибку 400 (например, пользователь уже существует)
// Получаем сообщение об ошибке от сервера
return response.json().then((errorData) => {
// Используем сообщение от сервера, если оно есть, иначе дефолтное
throw new Error(errorData?.error || "Такой пользователь уже существует");
});
}
if (!response.ok) {
// Обрабатываем другие HTTP ошибки
throw new Error("Ошибка при регистрации");
}
// Если всё ОК, возвращаем данные пользователя
return response.json();
});
}

/**
* Авторизация пользователя.
* @param {Object} params
* @param {string} params.login
* @param {string} params.password
* @returns {Promise<Object>} - Данные авторизованного пользователя.
*/
export function loginUser({ login, password }) {
// ВАЖНО: Для этого конкретного эндпоинта НЕ НУЖНО указывать Content-Type: application/json
// Согласно ошибке сервера: "В заголовке передан content-type: application/json, но эта API не умеет работать с этим заголовком, уберите его"
return fetch(baseHost + "/api/user/login", {
method: "POST",
// Убираем "Content-Type": "application/json",
headers: {
// Никаких заголовков, кроме стандартных для JSON, не нужно
},
body: JSON.stringify({
login,
password,
}),
}).then((response) => {
if (response.status === 400) {
throw new Error("Неверный логин или пароль");
// Обрабатываем ошибку 400 (например, неверный логин или пароль)
// Получаем сообщение об ошибке от сервера
return response.json().then((errorData) => {
// Используем сообщение от сервера, если оно есть, иначе дефолтное
throw new Error(errorData?.error || "Неверный логин или пароль");
});
}
if (!response.ok) {
// Обрабатываем другие HTTP ошибки
throw new Error("Ошибка при входе");
}
// Если всё ОК, возвращаем данные пользователя
return response.json();
});
}

/**
* Добавление нового поста.
* @param {Object} params
* @param {string} params.token - Токен авторизации (обязательно).
* @param {string} params.description - Описание поста.
* @param {string} params.imageUrl - URL изображения.
* @returns {Promise<Object>} - Результат операции.
*/
export function addPost({ token, description, imageUrl }) {
console.log("API: Отправляем данные на сервер:", { description, imageUrl });

// ВАЖНО: Для этого конкретного эндпоинта НЕ НУЖНО указывать Content-Type: application/json
// Согласно ошибке сервера: "В заголовке передан content-type: application/json, но эта API не умеет работать с этим заголовком, уберите его"
return fetch(postsHost, {
method: "POST",
headers: {
// Убираем "Content-Type": "application/json",
// Токен авторизации обязателен
Authorization: token,
},
body: JSON.stringify({
description: description || "",
imageUrl: imageUrl || "",
}),
}).then((response) => {
if (response.status === 401) {
// Обрабатываем ошибку 401 (нет авторизации)
throw new Error("Нет авторизации");
}
if (response.status === 400) {
// Обрабатываем ошибку 400 (например, не переданы обязательные данные)
// Получаем детальное сообщение об ошибке от сервера
return response.json().then((errorData) => {
console.error("API: Ошибка 400 от сервера:", errorData);
// Используем сообщение от сервера, если оно есть, иначе дефолтное
throw new Error(errorData?.error || "Не переданы обязательные данные");
});
}
if (!response.ok) {
// Обрабатываем другие HTTP ошибки
throw new Error("Ошибка при добавлении поста");
}
// Если всё ОК, возвращаем результат
return response.json();
});
}

// Загружает картинку в облако, возвращает url загруженной картинки
/**
* Загрузка изображения.
* @param {Object} params
* @param {File} params.file - Файл изображения.
* @returns {Promise<Object>} - Данные загрузки (включая URL).
*/
export function uploadImage({ file }) {
// Для загрузки файлов используется FormData, Content-Type НЕ нужен
// (браузер сам установит правильный Content-Type с boundary)
const data = new FormData();
data.append("file", file);

return fetch(baseHost + "/api/upload/image", {
method: "POST",
body: data,
})
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then((uploadResult) => {
console.log("API: Полный ответ от uploadImage:", uploadResult);
return uploadResult;
});
}

/**
* Поставить лайк посту.
* @param {Object} params
* @param {string} params.token - Токен авторизации (обязательно).
* @param {string} params.postId - ID поста.
* @returns {Promise<Object>} - Обновленный пост.
*/
export function likePost({ token, postId }) {
// Для POST без тела заголовок Content-Type НЕ нужен
return fetch(`${postsHost}/${postId}/like`, {
method: "POST",
headers: {
// Токен авторизации обязателен
Authorization: token,
},
}).then((response) => {
if (response.status === 401) {
// Обрабатываем ошибку 401 (нет авторизации)
throw new Error("Нет авторизации");
}
if (!response.ok) {
// Обрабатываем другие HTTP ошибки
throw new Error("Ошибка при лайке");
}
// Если всё ОК, возвращаем обновленный пост
return response.json();
});
}

/**
* Убрать лайк с поста.
* @param {Object} params
* @param {string} params.token - Токен авторизации (обязательно).
* @param {string} params.postId - ID поста.
* @returns {Promise<Object>} - Обновленный пост.
*/
export function dislikePost({ token, postId }) {
// Для POST без тела заголовок Content-Type НЕ нужен
return fetch(`${postsHost}/${postId}/dislike`, {
method: "POST",
headers: {
// Токен авторизации обязателен
Authorization: token,
},
}).then((response) => {
if (response.status === 401) {
// Обрабатываем ошибку 401 (нет авторизации)
throw new Error("Нет авторизации");
}
if (!response.ok) {
// Обрабатываем другие HTTP ошибки
throw new Error("Ошибка при дизлайке");
}
// Если всё ОК, возвращаем обновленный пост
return response.json();
});
}
Binary file added assets/images/default-image.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading