commit: be5fe03972879add14ce2ca6b37524b32adbf1b8
parent: 3c702feacae761d51c40417bdcc15fe13a26a85b
Author: lambadalambda <gitgud@rogerbraun.net>
Date: Mon, 5 Dec 2016 07:09:35 -0500
Merge branch 'feature/delete_status' into 'develop'
Implements feature status delete
Fixes issue #4
See merge request !6
Diffstat:
6 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/src/_variables.scss b/src/_variables.scss
@@ -3,4 +3,5 @@ $main-background: white;
$darkened-background: whitesmoke;
$green: #0fa00f;
$blue: #0095ff;
+$red: #ff0000;
diff --git a/src/components/status/status.js b/src/components/status/status.js
@@ -20,7 +20,9 @@ const Status = {
},
loggedIn () {
return !!this.$store.state.users.currentUser
- }
+ },
+ deleted () { return this.statusoid.deleted },
+ canDelete () { return this.statusoid.user.rights.delete_others_notice || this.statusoid.user.id == this.$store.state.users.currentUser.id }
},
components: {
Attachment,
@@ -31,6 +33,12 @@ const Status = {
methods: {
toggleReplying () {
this.replying = !this.replying
+ },
+ deleteStatus () {
+ const confirmed = confirm('Do you really want to delete this status?')
+ if (confirmed) {
+ this.$store.dispatch('deleteStatus', { id: this.status.id })
+ }
}
}
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
@@ -1,5 +1,5 @@
<template>
- <div class="status-el">
+ <div class="status-el" v-if="!status.deleted">
<div v-if="retweet" class="media container retweet-info">
<div class="media-left">
<i class='fa icon-retweet retweeted'></i>
@@ -52,6 +52,11 @@
</div>
<retweet-button :status=status></retweet-button>
<favorite-button :status=status></favorite-button>
+ <div v-if="canDelete">
+ <a href="#" v-on:click.prevent="deleteStatus">
+ <i class='fa icon-cancel delete-status'></i>
+ </a>
+ </div>
</div>
<post-status-form v-if="replying" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"></post-status-form>
@@ -125,4 +130,11 @@
.status-el:last-child .status {
border: none
}
+
+ .icon-cancel,.delete-status {
+ cursor: pointer;
+ &:hover {
+ color: $red;
+ }
+ }
</style>
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
@@ -45,6 +45,9 @@ export const prepareStatus = (status) => {
status.nsfw = !!status.text.match(nsfwRegex)
}
+ // Set deleted flag
+ status.deleted = false
+
// To make the array reactive
status.attachments = status.attachments || []
@@ -235,6 +238,10 @@ export const mutations = {
const newStatus = find(state.allStatuses, status)
newStatus.repeated = value
},
+ setDeleted (state, { status }) {
+ const newStatus = find(state.allStatuses, status)
+ newStatus.deleted = true
+ },
setLoading (state, { timeline, value }) {
state.timelines[timeline].loading = value
},
@@ -250,6 +257,10 @@ const statuses = {
addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline = false, noIdUpdate = false }) {
commit('addNewStatuses', { statuses, showImmediately, timeline, noIdUpdate, user: rootState.users.currentUser })
},
+ deleteStatus ({ rootState, commit }, status) {
+ commit('setDeleted', { status })
+ apiService.deleteStatus({ id: status.id, credentials: rootState.users.currentUser.credentials })
+ },
favorite ({ rootState, commit }, status) {
// Optimistic favoriting...
commit('setFavorited', { status, value: true })
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
@@ -7,6 +7,7 @@ const FAVORITE_URL = '/api/favorites/create'
const UNFAVORITE_URL = '/api/favorites/destroy'
const RETWEET_URL = '/api/statuses/retweet'
const STATUS_UPDATE_URL = '/api/statuses/update.json'
+const STATUS_DELETE_URL = '/api/statuses/destroy'
const STATUS_URL = '/api/statuses/show'
const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload'
const CONVERSATION_URL = '/api/statusnet/conversation'
@@ -118,6 +119,13 @@ const postStatus = ({credentials, status, mediaIds, inReplyToStatusId}) => {
})
}
+const deleteStatus = ({ id, credentials }) => {
+ return fetch(`${STATUS_DELETE_URL}/${id}.json`, {
+ headers: authHeaders(credentials),
+ method: 'POST'
+ })
+}
+
const uploadMedia = ({formData, credentials}) => {
return fetch(MEDIA_UPLOAD_URL, {
body: formData,
@@ -139,6 +147,7 @@ const apiService = {
unfavorite,
retweet,
postStatus,
+ deleteStatus,
uploadMedia
}
diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js
@@ -44,6 +44,11 @@ describe('Statuses.prepareStatus', () => {
expect(prepareStatus(nsfw).nsfw).to.eq(false)
})
+
+ it('sets deleted flag to false', () => {
+ const aStatus = makeMockStatus({id: 1, text: 'Hello oniichan'})
+ expect(prepareStatus(aStatus).deleted).to.eq(false)
+ })
})
describe('Statuses.findMaxId', () => {