diff --git a/components/status/StatusActions.vue b/components/status/StatusActions.vue index 9f73aac4..9dd4074a 100644 --- a/components/status/StatusActions.vue +++ b/components/status/StatusActions.vue @@ -1,21 +1,31 @@ <script setup lang="ts"> import type { Status } from 'masto' -const { status } = defineProps<{ +const { status: _status } = defineProps<{ status: Status }>() +let status = $ref<Status>({ ..._status }) -const isAuthor = $computed(() => status.account.id === currentUser.value?.account?.id) +watch(() => _status, (val) => { + status = { ...val } +}, { deep: true, immediate: true }) const clipboard = useClipboard() const router = useRouter() const route = useRoute() +const isAuthor = $computed(() => status.account.id === currentUser.value?.account?.id) + // Use different states to let the user press different actions right after the other -const isLoading = $ref({ reblogged: false, favourited: false, bookmarked: false }) -async function toggleStatusAction(action: 'reblogged' | 'favourited' | 'bookmarked', newStatus: Promise<Status>) { +const isLoading = $ref({ + reblogged: false, + favourited: false, + bookmarked: false, + pinned: false, +}) +async function toggleStatusAction(action: 'reblogged' | 'favourited' | 'bookmarked' | 'pinned', newStatus: Promise<Status>) { // Optimistic update - Object.assign(status, { [action]: !status[action] }) + status[action] = !status[action] try { isLoading[action] = true Object.assign(status, await newStatus) @@ -27,7 +37,12 @@ async function toggleStatusAction(action: 'reblogged' | 'favourited' | 'bookmark const toggleReblog = () => toggleStatusAction( 'reblogged', - masto.statuses[status.reblogged ? 'unreblog' : 'reblog'](status.id), + masto.statuses[status.reblogged ? 'unreblog' : 'reblog'](status.id).then((res) => { + if (status.reblogged) + // returns the original status + return res.reblog! + return res + }), ) const toggleFavourite = () => toggleStatusAction( @@ -54,6 +69,10 @@ const deleteStatus = async () => { // TODO when timeline, remove this item } +const togglePin = async () => toggleStatusAction( + 'pinned', + masto.statuses[status.pinned ? 'unpin' : 'pin'](status.id), +) </script> <template> @@ -123,8 +142,16 @@ const deleteStatus = async () => { Open in original site </CommonDropdownItem> - <!-- TODO --> <template v-if="isAuthor"> + <!-- TODO --> + <CommonDropdownItem + v-if="isAuthor" icon="i-ri:pushpin-line" + @click="togglePin" + > + {{ status.pinned ? 'Unpin on profile' : 'Pin on profile' }} + </CommonDropdownItem> + + <!-- TODO --> <CommonDropdownItem v-if="isAuthor" icon="i-ri:edit-line"> Edit </CommonDropdownItem> @@ -135,6 +162,12 @@ const deleteStatus = async () => { > Delete </CommonDropdownItem> + + <CommonDropdownItem + v-if="isAuthor" icon="i-ri:eraser-line" text-red-600 + > + Delete & re-draft + </CommonDropdownItem> </template> </div> </template>