aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/App.scss7
-rw-r--r--src/App.vue12
-rw-r--r--src/_variables.scss1
-rw-r--r--src/assets/nsfw.jpgbin18315 -> 0 bytes
-rw-r--r--src/assets/nsfw.pngbin0 -> 18166 bytes
-rw-r--r--src/components/attachment/attachment.js16
-rw-r--r--src/components/attachment/attachment.vue19
-rw-r--r--src/components/status/status.js10
-rw-r--r--src/components/status/status.vue16
-rw-r--r--src/components/timeline/timeline.vue7
-rw-r--r--src/components/user_profile/user_profile.vue7
-rw-r--r--src/modules/statuses.js11
-rw-r--r--src/services/api/api.service.js9
-rw-r--r--test/unit/specs/modules/statuses.spec.js5
14 files changed, 88 insertions, 32 deletions
diff --git a/src/App.scss b/src/App.scss
index fd5e6c16..ced2d069 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -63,7 +63,7 @@ nav {
}
-sidebar {
+.sidebar {
flex: 1;
flex-basis: 300px;
}
@@ -255,3 +255,8 @@ nav {
.fade-enter, .fade-leave-active {
opacity: 0
}
+
+.main {
+ flex: 2;
+ flex-basis: 500px;
+}
diff --git a/src/App.vue b/src/App.vue
index e46419e0..2cd6d079 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -6,14 +6,16 @@
</div>
</nav>
<div class="container" id="content">
- <sidebar>
+ <div class="sidebar">
<user-panel></user-panel>
<nav-panel></nav-panel>
<notifications v-if="currentUser"></notifications>
- </sidebar>
- <transition name="fade">
- <router-view></router-view>
- </transition>
+ </div>
+ <div class="main">
+ <transition name="fade">
+ <router-view></router-view>
+ </transition>
+ </div>
</div>
</div>
</template>
diff --git a/src/_variables.scss b/src/_variables.scss
index c317fd32..d2b7065d 100644
--- 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/assets/nsfw.jpg b/src/assets/nsfw.jpg
deleted file mode 100644
index 6ae4ffe9..00000000
--- a/src/assets/nsfw.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/nsfw.png b/src/assets/nsfw.png
new file mode 100644
index 00000000..bb6556b4
--- /dev/null
+++ b/src/assets/nsfw.png
Binary files differ
diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js
index 9f751863..c88497a2 100644
--- a/src/components/attachment/attachment.js
+++ b/src/components/attachment/attachment.js
@@ -1,4 +1,4 @@
-import nsfwImage from '../../assets/nsfw.jpg'
+import nsfwImage from '../../assets/nsfw.png'
import fileTypeService from '../../services/file_type/file_type.service.js'
const Attachment = {
@@ -7,17 +7,23 @@ const Attachment = {
'nsfw',
'statusId'
],
- data: () => ({ nsfwImage }),
+ data: () => ({
+ nsfwImage,
+ showHidden: false
+ }),
computed: {
type () {
return fileTypeService.fileType(this.attachment.mimetype)
+ },
+ hidden () {
+ return this.nsfw && !this.showHidden
}
},
methods: {
- showNsfw () {
- this.$store.commit('setNsfw', { id: this.statusId, nsfw: false })
+ toggleHidden () {
+ this.showHidden = !this.showHidden
}
}
}
-export default Attachment \ No newline at end of file
+export default Attachment
diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue
index 1e49cbeb..6bc0356a 100644
--- a/src/components/attachment/attachment.vue
+++ b/src/components/attachment/attachment.vue
@@ -1,15 +1,18 @@
<template>
<div class="attachment">
- <a class="image-attachment" v-if="nsfw" v-on:click.prevent="showNsfw()">
+ <a class="image-attachment" v-if="hidden" v-on:click.prevent="toggleHidden()">
<img :key="nsfwImage" :src="nsfwImage"></img>
</a>
+ <div class="hider" v-if="nsfw && !hidden">
+ <a href="#" @click.prevent="toggleHidden()">Hide</a>
+ </div>
- <a class="image-attachment" v-if="type === 'image' && !nsfw"
+ <a class="image-attachment" v-if="type === 'image' && !hidden"
:href="attachment.url" target="_blank">
<img :src="attachment.url"></img>
</a>
- <video v-if="type === 'video' && !nsfw" :src="attachment.url" controls></video>
+ <video v-if="type === 'video' && !hidden" :src="attachment.url" controls></video>
<audio v-if="type === 'audio'" :src="attachment.url" controls></audio>
@@ -34,12 +37,20 @@
display: flex;
flex-wrap: wrap;
.attachment {
-
flex: 1 0 30%;
display: flex;
margin: 0.2em;
align-self: flex-start;
+ .hider {
+ position: absolute;
+ margin: 10px;
+ padding: 5px;
+ background: rgba(230,230,230,0.6);
+ border-radius: 0.5em;
+ font-weight: bold;
+ }
+
video {
height: 100%;
border: 1px solid;
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 0bf2ecde..8b2561cf 100644
--- 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
index 86632876..6b9bca5b 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,8 +1,8 @@
<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'></i>
+ <i class='fa icon-retweet retweeted'></i>
</div>
<div class="media-body">
Retweeted by {{retweeter}}
@@ -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/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index fef96e4e..7de3ffca 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -18,10 +18,3 @@
</div>
</template>
<script src="./timeline.js"></script>
-
-<style>
- .timeline.panel {
- flex: 2;
- flex-basis: 500px;
- }
-</style>
diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue
index 767982c5..eaa5396d 100644
--- a/src/components/user_profile/user_profile.vue
+++ b/src/components/user_profile/user_profile.vue
@@ -5,10 +5,3 @@
</template>
<script src="./user_profile.js"></script>
-
-<style>
- .user-profile {
- flex: 2;
- flex-basis: 500px;
- }
-</style>
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index f4bffebf..aab198d8 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -54,6 +54,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 || []
@@ -261,6 +264,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
},
@@ -276,6 +283,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
index 47895d3b..a78ab5c9 100644
--- 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
index deeeb477..6c048372 100644
--- 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', () => {