fix: fix isFavorited reactivity bug and disable button while process is going

This commit is contained in:
Sándor Levcsák 2020-10-23 06:45:11 +03:00
parent 916291bf9d
commit 5536219365
2 changed files with 27 additions and 7 deletions

View File

@ -21,7 +21,8 @@
<button
class="btn btn-sm pull-xs-right"
:class="[article.favorited ? 'btn-primary':'btn-outline-primary']"
@click="onFavoriteArticle"
:disabled="favoriteProcessGoing"
@click="favoriteArticle"
>
<i class="ion-heart" /> {{ article.favoritesCount }}
</button>
@ -51,6 +52,7 @@
<script lang="ts">
import { computed, defineComponent, PropType } from 'vue'
import { useFavoriteArticle } from '../services/article/favoriteArticle'
import createAsyncProcess from '../utils/create-async-process'
export default defineComponent({
name: 'ArticlePreview',
@ -63,9 +65,20 @@ export default defineComponent({
setup (props, { emit }) {
const isFavorited = computed<boolean>(() => props.article.favorited)
const { onFavoriteArticle } = useFavoriteArticle(props.article, newArticle => emit('update', newArticle))
const updateArticle = (newArticle: Article): void => emit('update', newArticle)
return { onFavoriteArticle, isFavorited }
const { onFavoriteArticle } = useFavoriteArticle({
isFavorited,
articleSlug: props.article.slug,
updateArticle,
})
const { active, run } = createAsyncProcess(onFavoriteArticle)
return {
favoriteProcessGoing: active,
favoriteArticle: run,
}
},
})
</script>

View File

@ -1,3 +1,4 @@
import { ComputedRef } from 'vue'
import { request } from '../index'
async function postFavoriteArticle (slug: string) {
@ -8,13 +9,19 @@ async function deleteFavoriteArticle (slug: string) {
return request.delete<ArticleResponse>(`/articles/${slug}/favorite`).then(res => res.article)
}
export const useFavoriteArticle = (article: Article, updateArticle: (newArticle: Article) => void) => {
interface useFavoriteArticleProps {
isFavorited : ComputedRef<boolean>
articleSlug: string
updateArticle: (newArticle: Article) => void
}
export const useFavoriteArticle = ({ isFavorited, articleSlug, updateArticle }: useFavoriteArticleProps) => {
const onFavoriteArticle = async () => {
let newArticle: Article
if (article.favorited) {
newArticle = await deleteFavoriteArticle(article.slug)
if (isFavorited.value) {
newArticle = await deleteFavoriteArticle(articleSlug)
} else {
newArticle = await postFavoriteArticle(article.slug)
newArticle = await postFavoriteArticle(articleSlug)
}
updateArticle(newArticle)
}