diff --git a/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepository.kt b/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepository.kt index 4b0b8d9fb2..5d897fd5e0 100644 --- a/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepository.kt +++ b/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepository.kt @@ -5,7 +5,7 @@ import ru.netology.nmedia.dto.Post interface PostRepository { fun getAll(): List - fun likeById(id: Long) + fun likeById(id: Long, isLike: Boolean) fun save(post: Post) fun removeById(id: Long) } diff --git a/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepositoryImpl.kt b/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepositoryImpl.kt index 353fad8d23..3d3263c62f 100644 --- a/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepositoryImpl.kt +++ b/02_threads/android/app/src/main/java/ru/netology/nmedia/repository/PostRepositoryImpl.kt @@ -2,6 +2,7 @@ package ru.netology.nmedia.repository import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import okhttp3.FormBody import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request @@ -35,8 +36,23 @@ class PostRepositoryImpl: PostRepository { } } - override fun likeById(id: Long) { - // TODO: do this in homework + override fun likeById(id: Long, isLike: Boolean) { + var request: Request + if (isLike) { + request = Request.Builder() + .delete(FormBody.Builder().build()) + .url("${BASE_URL}/api/slow/posts/${id}/likes") + .build() + } else { + request = Request.Builder() + .post(FormBody.Builder().build()) + .url("${BASE_URL}/api/slow/posts/${id}/likes") + .build() + } + + client.newCall(request) + .execute() + .close() } override fun save(post: Post) { diff --git a/02_threads/android/app/src/main/java/ru/netology/nmedia/viewmodel/PostViewModel.kt b/02_threads/android/app/src/main/java/ru/netology/nmedia/viewmodel/PostViewModel.kt index d93b22c1ba..ba12133f4c 100644 --- a/02_threads/android/app/src/main/java/ru/netology/nmedia/viewmodel/PostViewModel.kt +++ b/02_threads/android/app/src/main/java/ru/netology/nmedia/viewmodel/PostViewModel.kt @@ -71,7 +71,29 @@ class PostViewModel(application: Application) : AndroidViewModel(application) { } fun likeById(id: Long) { - thread { repository.likeById(id) } + + val currentState = _data.value + val currentPosts = currentState?.posts.orEmpty().toMutableList() + + val index = currentPosts.indexOfFirst { it.id == id } + + val oldPost = currentPosts[index] + val newPost = oldPost.copy( + likedByMe = !oldPost.likedByMe, + likes = if (oldPost.likedByMe) oldPost.likes - 1 else oldPost.likes + 1 + ) + + currentPosts[index] = newPost + _data.postValue(currentState?.copy(posts = currentPosts)) + + // Отправляем запрос на сервер (оптимистично считаем, что он пройдет успешно) + try { + thread { repository.likeById(id, oldPost.likedByMe) } + // Если запрос успешен, интерфейс уже обновлен, ничего делать не нужно. + } catch (e: IOException) { + currentPosts[index] = oldPost // Возвращаем старый пост + _data.postValue(currentState?.copy(posts = currentPosts)) + } } fun removeById(id: Long) { diff --git a/02_threads/android/gradle/gradle-daemon-jvm.properties b/02_threads/android/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000000..6c1139ec06 --- /dev/null +++ b/02_threads/android/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21 diff --git a/02_threads/server/gradle/gradle-daemon-jvm.properties b/02_threads/server/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000000..6c1139ec06 --- /dev/null +++ b/02_threads/server/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21