forked from AkkomaGang/akkoma-fe
Add favorite-button.
This commit is contained in:
parent
b96b5eb327
commit
8630f91a13
7 changed files with 85 additions and 11 deletions
22
src/components/favorite_button/favorite_button.js
Normal file
22
src/components/favorite_button/favorite_button.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
const FavoriteButton = {
|
||||||
|
props: [ 'status' ],
|
||||||
|
methods: {
|
||||||
|
favorite () {
|
||||||
|
if (!this.status.favorited) {
|
||||||
|
this.$store.dispatch('favorite', { id: this.status.id})
|
||||||
|
} else {
|
||||||
|
this.$store.dispatch('unfavorite', { id: this.status.id})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
classes () {
|
||||||
|
return {
|
||||||
|
'icon-star-empty': !this.status.favorited,
|
||||||
|
'icon-star': this.status.favorited
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FavoriteButton
|
14
src/components/favorite_button/favorite_button.vue
Normal file
14
src/components/favorite_button/favorite_button.vue
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<i :class='classes' class='favorite-button fa' v-on:click.prevent='favorite()'></i>
|
||||||
|
<span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./favorite_button.js" ></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.favorite-button {
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,4 +1,5 @@
|
||||||
import Attachment from '../attachment/attachment.vue'
|
import Attachment from '../attachment/attachment.vue'
|
||||||
|
import FavoriteButton from '../favorite_button/favorite_button.vue'
|
||||||
|
|
||||||
const Status = {
|
const Status = {
|
||||||
props: [ 'statusoid' ],
|
props: [ 'statusoid' ],
|
||||||
|
@ -14,9 +15,9 @@ const Status = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Attachment
|
Attachment,
|
||||||
|
FavoriteButton
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Status
|
export default Status
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,9 @@
|
||||||
<small>{{status.created_at_parsed}}</small>
|
<small>{{status.created_at_parsed}}</small>
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
|
<p>
|
||||||
<div v-html="status.statusnet_html"></div>
|
<div v-html="status.statusnet_html"></div>
|
||||||
|
</p>
|
||||||
|
|
||||||
<div v-if='status.attachments' class='attachments'>
|
<div v-if='status.attachments' class='attachments'>
|
||||||
<attachment :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments">
|
<attachment :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments">
|
||||||
|
@ -33,12 +35,12 @@
|
||||||
<div>
|
<div>
|
||||||
<div class='status-actions'>
|
<div class='status-actions'>
|
||||||
<div ng-click="toggleReplying()">
|
<div ng-click="toggleReplying()">
|
||||||
<i class='fa fa-reply'></i>
|
<i class='fa icon-reply'></i>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<i class='fa fa-retweet'></i>
|
<i class='fa icon-retweet'></i>
|
||||||
</div>
|
</div>
|
||||||
<favorite-button status=status></favorite-button>
|
<favorite-button :status=status></favorite-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- <post-status-form ng-if="replying" toggle="toggleReplying" reply-to-status="status" reply-to="{{status.id}}"></post-status-form> -->
|
<!-- <post-status-form ng-if="replying" toggle="toggleReplying" reply-to-status="status" reply-to="{{status.id}}"></post-status-form> -->
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { map, slice, last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash'
|
import { map, slice, last, intersectionBy, sortBy, unionBy, toInteger, groupBy, differenceBy, each, find } from 'lodash'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
import apiService from '../services/api/api.service.js'
|
||||||
|
|
||||||
const defaultState = {
|
const defaultState = {
|
||||||
allStatuses: [],
|
allStatuses: [],
|
||||||
|
@ -104,6 +105,18 @@ const updateTimestampsInStatuses = (statuses) => {
|
||||||
|
|
||||||
const statuses = {
|
const statuses = {
|
||||||
state: defaultState,
|
state: defaultState,
|
||||||
|
actions: {
|
||||||
|
favorite ({ rootState, commit }, status) {
|
||||||
|
// Optimistic favoriting...
|
||||||
|
commit('setFavorited', { status, value: true })
|
||||||
|
apiService.favorite({ id: status.id, credentials: rootState.users.currentUser.credentials })
|
||||||
|
},
|
||||||
|
unfavorite ({ rootState, commit }, status) {
|
||||||
|
// Optimistic favoriting...
|
||||||
|
commit('setFavorited', { status, value: false })
|
||||||
|
apiService.unfavorite({ id: status.id, credentials: rootState.users.currentUser.credentials })
|
||||||
|
}
|
||||||
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
addNewStatuses (state, { statuses, showImmediately = false, timeline }) {
|
addNewStatuses (state, { statuses, showImmediately = false, timeline }) {
|
||||||
state.timelines[timeline] = addStatusesToTimeline(statuses, showImmediately, state.timelines[timeline])
|
state.timelines[timeline] = addStatusesToTimeline(statuses, showImmediately, state.timelines[timeline])
|
||||||
|
@ -118,6 +131,10 @@ const statuses = {
|
||||||
updateTimestamps (state) {
|
updateTimestamps (state) {
|
||||||
updateTimestampsInStatuses(state.allStatuses)
|
updateTimestampsInStatuses(state.allStatuses)
|
||||||
},
|
},
|
||||||
|
setFavorited (state, { status, value }) {
|
||||||
|
const newStatus = find(state.allStatuses, status)
|
||||||
|
newStatus.favorited = value
|
||||||
|
},
|
||||||
setNsfw (state, { id, nsfw }) {
|
setNsfw (state, { id, nsfw }) {
|
||||||
// For now, walk through all the statuses because the stuff might be in the replied_to_status
|
// For now, walk through all the statuses because the stuff might be in the replied_to_status
|
||||||
// TODO: Save the replied_tos as references.
|
// TODO: Save the replied_tos as references.
|
||||||
|
|
|
@ -25,7 +25,10 @@ const users = {
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
response.json()
|
response.json()
|
||||||
.then((user) => commit('setCurrentUser', user))
|
.then((user) => {
|
||||||
|
user.credentials = userCredentials
|
||||||
|
commit('setCurrentUser', user)
|
||||||
|
})
|
||||||
.then(() => timelineFetcher.startFetching({store, credentials: userCredentials}))
|
.then(() => timelineFetcher.startFetching({store, credentials: userCredentials}))
|
||||||
}
|
}
|
||||||
commit('endLogin')
|
commit('endLogin')
|
||||||
|
|
|
@ -3,11 +3,11 @@ const LOGIN_URL = '/api/account/verify_credentials.json'
|
||||||
const FRIENDS_TIMELINE_URL = '/api/statuses/friends_timeline.json'
|
const FRIENDS_TIMELINE_URL = '/api/statuses/friends_timeline.json'
|
||||||
const PUBLIC_TIMELINE_URL = '/api/statuses/public_timeline.json'
|
const PUBLIC_TIMELINE_URL = '/api/statuses/public_timeline.json'
|
||||||
const PUBLIC_AND_EXTERNAL_TIMELINE_URL = '/api/statuses/public_and_external_timeline.json'
|
const PUBLIC_AND_EXTERNAL_TIMELINE_URL = '/api/statuses/public_and_external_timeline.json'
|
||||||
|
const FAVORITE_URL = '/api/favorites/create'
|
||||||
|
const UNFAVORITE_URL = '/api/favorites/destroy'
|
||||||
// const CONVERSATION_URL = '/api/statusnet/conversation/';
|
// const CONVERSATION_URL = '/api/statusnet/conversation/';
|
||||||
// const STATUS_UPDATE_URL = '/api/statuses/update.json';
|
// const STATUS_UPDATE_URL = '/api/statuses/update.json';
|
||||||
// const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload';
|
// const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload';
|
||||||
// const FAVORITE_URL = '/api/favorites/create';
|
|
||||||
// const UNFAVORITE_URL = '/api/favorites/destroy';
|
|
||||||
|
|
||||||
// const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'};
|
// const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'};
|
||||||
|
|
||||||
|
@ -43,9 +43,25 @@ const verifyCredentials = (user) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const favorite = ({ id, credentials }) => {
|
||||||
|
return fetch(`${FAVORITE_URL}/${id}.json`, {
|
||||||
|
headers: authHeaders(credentials),
|
||||||
|
method: 'POST'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const unfavorite = ({ id, credentials }) => {
|
||||||
|
return fetch(`${UNFAVORITE_URL}/${id}.json`, {
|
||||||
|
headers: authHeaders(credentials),
|
||||||
|
method: 'POST'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const apiService = {
|
const apiService = {
|
||||||
verifyCredentials,
|
verifyCredentials,
|
||||||
fetchTimeline
|
fetchTimeline,
|
||||||
|
favorite,
|
||||||
|
unfavorite
|
||||||
}
|
}
|
||||||
|
|
||||||
export default apiService
|
export default apiService
|
||||||
|
@ -104,7 +120,6 @@ export default apiService
|
||||||
// });
|
// });
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// const favorite = (id) => $http.post(`${FAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
|
|
||||||
// const unfavorite = (id) => $http.post(`${UNFAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
|
// const unfavorite = (id) => $http.post(`${UNFAVORITE_URL}/${id}.json`, null, {headers: authHeaders});
|
||||||
|
|
||||||
// // This was impossible to get to work with $http. You're supposed to set Content-Type
|
// // This was impossible to get to work with $http. You're supposed to set Content-Type
|
||||||
|
|
Loading…
Reference in a new issue