Merge branch 'develop' of https://gitgud.io/lambadalambda/pleroma-fe into wakarimasen/pleroma-fe-develop
This commit is contained in:
commit
896de016ad
|
@ -33,6 +33,7 @@ module.exports = {
|
||||||
fallback: [path.join(__dirname, '../node_modules')]
|
fallback: [path.join(__dirname, '../node_modules')]
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
|
noParse: /node_modules\/localforage\/dist\/localforage.js/,
|
||||||
preLoaders: [
|
preLoaders: [
|
||||||
{
|
{
|
||||||
test: /\.vue$/,
|
test: /\.vue$/,
|
||||||
|
|
|
@ -2,25 +2,12 @@ import Timeline from '../timeline/timeline.vue'
|
||||||
|
|
||||||
const Mentions = {
|
const Mentions = {
|
||||||
computed: {
|
computed: {
|
||||||
username () {
|
|
||||||
return this.$route.params.username
|
|
||||||
},
|
|
||||||
timeline () {
|
timeline () {
|
||||||
return this.$store.state.statuses.timelines.mentions
|
return this.$store.state.statuses.timelines.mentions
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Timeline
|
Timeline
|
||||||
},
|
|
||||||
created () {
|
|
||||||
this.$store.state.api.backendInteractor.fetchMentions({username: this.username})
|
|
||||||
.then((mentions) => {
|
|
||||||
this.$store.dispatch('addNewStatuses', {
|
|
||||||
statuses: mentions,
|
|
||||||
timeline: 'mentions',
|
|
||||||
showImmediately: true
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="nav-panel">
|
<div class="nav-panel">
|
||||||
<div class="panel panel-default base02-background">
|
<div class="panel panel-default base02-background">
|
||||||
<ul>
|
<ul class="base03-border">
|
||||||
<li v-if='currentUser'>
|
<li v-if='currentUser'>
|
||||||
<router-link class="base01-background" to='/main/friends'>
|
<router-link class="base01-background" to='/main/friends'>
|
||||||
Timeline
|
Timeline
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
|
|
||||||
.nav-panel li {
|
.nav-panel li {
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
|
border-color: inherit;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
&:first-child a {
|
&:first-child a {
|
||||||
border-top-right-radius: 10px;
|
border-top-right-radius: 10px;
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
// which does not happen with 10px vs 4px + 6px.
|
// which does not happen with 10px vs 4px + 6px.
|
||||||
padding: 0.4em 0 0 10px;
|
padding: 0.4em 0 0 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
border-bottom: 1px solid silver;
|
border-bottom: 1px solid;
|
||||||
|
border-bottom-color: inherit;
|
||||||
|
|
||||||
|
|
||||||
.text {
|
.text {
|
||||||
|
@ -72,7 +73,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border: none
|
border-bottom: none;
|
||||||
|
border-radius: 0 0 10px 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
Notifications
|
Notifications
|
||||||
<button @click.prevent="markAsSeen" class="base06 base02-background read-button">Read!</button>
|
<button @click.prevent="markAsSeen" class="base06 base02-background read-button">Read!</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body base03-border">
|
||||||
<div v-for="notification in visibleNotifications" class="notification" :class='{"unseen": !notification.seen}'>
|
<div v-for="notification in visibleNotifications" class="notification" :class='{"unseen": !notification.seen}'>
|
||||||
<a :href="notification.action.user.statusnet_profile_url">
|
<a :href="notification.action.user.statusnet_profile_url">
|
||||||
<img class='avatar' :src="notification.action.user.profile_image_url_original">
|
<img class='avatar' :src="notification.action.user.profile_image_url_original">
|
||||||
|
|
|
@ -36,7 +36,12 @@ const Status = {
|
||||||
return !!this.$store.state.users.currentUser
|
return !!this.$store.state.users.currentUser
|
||||||
},
|
},
|
||||||
muted () { return !this.unmuted && this.status.user.muted },
|
muted () { return !this.unmuted && this.status.user.muted },
|
||||||
isReply () { return !!this.status.in_reply_to_status_id }
|
isReply () { return !!this.status.in_reply_to_status_id },
|
||||||
|
borderColor () {
|
||||||
|
return {
|
||||||
|
borderBottomColor: this.$store.state.config.colors['base02']
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Attachment,
|
Attachment,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="status-el base00-background" v-if="!status.deleted" v-bind:class="[{ 'expanded-status': !expandable }, { 'base01-background': focused }, { 'status-conversation': inConversation }]">
|
<div class="status-el base00-background base03-border" v-if="!status.deleted" v-bind:class="[{ 'base01-background': focused }, { 'status-conversation': inConversation }]" >
|
||||||
<template v-if="muted">
|
<template v-if="muted">
|
||||||
<div class="media status container muted">
|
<div class="media status container muted">
|
||||||
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
|
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
|
||||||
|
@ -73,18 +73,20 @@
|
||||||
<div class='status-actions'>
|
<div class='status-actions'>
|
||||||
<div>
|
<div>
|
||||||
<a href="#" v-on:click.prevent="toggleReplying">
|
<a href="#" v-on:click.prevent="toggleReplying">
|
||||||
<i class='fa icon-reply'></i>
|
<i class="fa icon-reply" :class="{'icon-reply-active': replying}"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<retweet-button :status=status></retweet-button>
|
<retweet-button :status=status></retweet-button>
|
||||||
<favorite-button :status=status></favorite-button>
|
<favorite-button :status=status></favorite-button>
|
||||||
<delete-button :status=status></delete-button>
|
<delete-button :status=status></delete-button>
|
||||||
</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>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="status base00-background container" v-if="replying">
|
||||||
|
<div class="reply-left"/>
|
||||||
|
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -98,6 +100,7 @@
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
|
border-left-width: 0px;
|
||||||
|
|
||||||
.user-content {
|
.user-content {
|
||||||
min-height: 52px;
|
min-height: 52px;
|
||||||
|
@ -129,7 +132,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-conversation {
|
.status-conversation {
|
||||||
border-left: 4px solid rgba(255, 48, 16, 0.65);
|
border-left-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-actions {
|
.status-actions {
|
||||||
|
@ -140,6 +143,10 @@
|
||||||
color: $blue;
|
color: $blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-reply-active {
|
||||||
|
color: $blue;
|
||||||
|
}
|
||||||
|
|
||||||
.status .avatar {
|
.status .avatar {
|
||||||
width: 48px;
|
width: 48px;
|
||||||
}
|
}
|
||||||
|
@ -151,6 +158,9 @@
|
||||||
.status {
|
.status {
|
||||||
padding: 0.65em 0.7em 0.8em 0.8em;
|
padding: 0.65em 0.7em 0.8em 0.8em;
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
|
border-bottom-color: inherit;
|
||||||
|
border-left: 4px rgba(255, 48, 16, 0.65);
|
||||||
|
border-left-style: inherit;
|
||||||
}
|
}
|
||||||
.muted button {
|
.muted button {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
|
@ -168,4 +178,14 @@
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
margin-top: 0.2em;
|
margin-top: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.reply-left {
|
||||||
|
flex: 0;
|
||||||
|
min-width: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reply-body {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -8,6 +8,9 @@ const Timeline = {
|
||||||
'timelineName',
|
'timelineName',
|
||||||
'title'
|
'title'
|
||||||
],
|
],
|
||||||
|
computed: {
|
||||||
|
timelineError () { return this.$store.state.statuses.error }
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
Status,
|
Status,
|
||||||
StatusOrConversation
|
StatusOrConversation
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{title}}
|
{{title}}
|
||||||
</div>
|
</div>
|
||||||
<button @click.prevent="showNewStatuses" class="base06 base02-background loadmore-button" v-if="timeline.newStatusCount > 0 && !timeline.error">
|
<button @click.prevent="showNewStatuses" class="base06 base02-background loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
|
||||||
Show new ({{timeline.newStatusCount}})
|
Show new ({{timeline.newStatusCount}})
|
||||||
</button>
|
</button>
|
||||||
<button @click.prevent class="base06 error no-press loadmore-button" v-if="timeline.error">
|
<button @click.prevent class="base06 error no-press loadmore-button" v-if="timelineError">
|
||||||
Error fetching updates
|
Error fetching updates
|
||||||
</button>
|
</button>
|
||||||
<button @click.prevent class="base04 base01-background no-press loadmore-button" v-if="!timeline.newStatusCount > 0 && !timeline.error">
|
<button @click.prevent class="base04 base01-background no-press loadmore-button" v-if="!timeline.newStatusCount > 0 && !timelineError">
|
||||||
Up-to-date
|
Up-to-date
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,9 +18,9 @@
|
||||||
<div class="timeline">
|
<div class="timeline">
|
||||||
<status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
|
<status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
|
||||||
<a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
|
<a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
|
||||||
<div class="base01-background base05-border new-status-notification text-center">Load older statuses.</div>
|
<div class="base01-background base03-border new-status-notification text-center">Load older statuses.</div>
|
||||||
</a>
|
</a>
|
||||||
<div class="base01-background base05-border new-status-notification text-center" v-else>...</div>
|
<div class="base01-background base03-border new-status-notification text-center" v-else>...</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,6 +8,7 @@ export const defaultState = {
|
||||||
maxId: 0,
|
maxId: 0,
|
||||||
notifications: [],
|
notifications: [],
|
||||||
favorites: new Set(),
|
favorites: new Set(),
|
||||||
|
error: false,
|
||||||
timelines: {
|
timelines: {
|
||||||
mentions: {
|
mentions: {
|
||||||
statuses: [],
|
statuses: [],
|
||||||
|
@ -18,8 +19,7 @@ export const defaultState = {
|
||||||
newStatusCount: 0,
|
newStatusCount: 0,
|
||||||
maxId: 0,
|
maxId: 0,
|
||||||
minVisibleId: 0,
|
minVisibleId: 0,
|
||||||
loading: false,
|
loading: false
|
||||||
error: false
|
|
||||||
},
|
},
|
||||||
public: {
|
public: {
|
||||||
statuses: [],
|
statuses: [],
|
||||||
|
@ -30,8 +30,7 @@ export const defaultState = {
|
||||||
newStatusCount: 0,
|
newStatusCount: 0,
|
||||||
maxId: 0,
|
maxId: 0,
|
||||||
minVisibleId: 0,
|
minVisibleId: 0,
|
||||||
loading: false,
|
loading: false
|
||||||
error: false
|
|
||||||
},
|
},
|
||||||
publicAndExternal: {
|
publicAndExternal: {
|
||||||
statuses: [],
|
statuses: [],
|
||||||
|
@ -42,8 +41,7 @@ export const defaultState = {
|
||||||
newStatusCount: 0,
|
newStatusCount: 0,
|
||||||
maxId: 0,
|
maxId: 0,
|
||||||
minVisibleId: 0,
|
minVisibleId: 0,
|
||||||
loading: false,
|
loading: false
|
||||||
error: false
|
|
||||||
},
|
},
|
||||||
friends: {
|
friends: {
|
||||||
statuses: [],
|
statuses: [],
|
||||||
|
@ -54,8 +52,7 @@ export const defaultState = {
|
||||||
newStatusCount: 0,
|
newStatusCount: 0,
|
||||||
maxId: 0,
|
maxId: 0,
|
||||||
minVisibleId: 0,
|
minVisibleId: 0,
|
||||||
loading: false,
|
loading: false
|
||||||
error: false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,8 +295,8 @@ export const mutations = {
|
||||||
const newStatus = state.allStatusesObject[id]
|
const newStatus = state.allStatusesObject[id]
|
||||||
newStatus.nsfw = nsfw
|
newStatus.nsfw = nsfw
|
||||||
},
|
},
|
||||||
setError (state, { timeline, value }) {
|
setError (state, { value }) {
|
||||||
state.timelines[timeline].error = value
|
state.error = value
|
||||||
},
|
},
|
||||||
markNotificationsAsSeen (state, notifications) {
|
markNotificationsAsSeen (state, notifications) {
|
||||||
each(notifications, (notification) => {
|
each(notifications, (notification) => {
|
||||||
|
@ -314,8 +311,8 @@ const statuses = {
|
||||||
addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline = false, noIdUpdate = false }) {
|
addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline = false, noIdUpdate = false }) {
|
||||||
commit('addNewStatuses', { statuses, showImmediately, timeline, noIdUpdate, user: rootState.users.currentUser })
|
commit('addNewStatuses', { statuses, showImmediately, timeline, noIdUpdate, user: rootState.users.currentUser })
|
||||||
},
|
},
|
||||||
setError ({ rootState, commit }, { timeline, value }) {
|
setError ({ rootState, commit }, { value }) {
|
||||||
commit('setError', { timeline, value })
|
commit('setError', { value })
|
||||||
},
|
},
|
||||||
deleteStatus ({ rootState, commit }, status) {
|
deleteStatus ({ rootState, commit }, status) {
|
||||||
commit('setDeleted', { status })
|
commit('setDeleted', { status })
|
||||||
|
|
|
@ -62,12 +62,6 @@ const fetchAllFollowing = ({username, credentials}) => {
|
||||||
.then((data) => data.json())
|
.then((data) => data.json())
|
||||||
}
|
}
|
||||||
|
|
||||||
const fetchMentions = ({username, sinceId = 0, credentials}) => {
|
|
||||||
let url = `${MENTIONS_URL}?since_id=${sinceId}&screen_name=${username}`
|
|
||||||
return fetch(url, { headers: authHeaders(credentials) })
|
|
||||||
.then((data) => data.json())
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchConversation = ({id, credentials}) => {
|
const fetchConversation = ({id, credentials}) => {
|
||||||
let url = `${CONVERSATION_URL}/${id}.json?count=100`
|
let url = `${CONVERSATION_URL}/${id}.json?count=100`
|
||||||
return fetch(url, { headers: authHeaders(credentials) })
|
return fetch(url, { headers: authHeaders(credentials) })
|
||||||
|
@ -100,6 +94,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false}) =>
|
||||||
const timelineUrls = {
|
const timelineUrls = {
|
||||||
public: PUBLIC_TIMELINE_URL,
|
public: PUBLIC_TIMELINE_URL,
|
||||||
friends: FRIENDS_TIMELINE_URL,
|
friends: FRIENDS_TIMELINE_URL,
|
||||||
|
mentions: MENTIONS_URL,
|
||||||
'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL
|
'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,7 +187,6 @@ const apiService = {
|
||||||
fetchTimeline,
|
fetchTimeline,
|
||||||
fetchConversation,
|
fetchConversation,
|
||||||
fetchStatus,
|
fetchStatus,
|
||||||
fetchMentions,
|
|
||||||
fetchFriends,
|
fetchFriends,
|
||||||
followUser,
|
followUser,
|
||||||
unfollowUser,
|
unfollowUser,
|
||||||
|
|
|
@ -10,10 +10,6 @@ const backendInteractorService = (credentials) => {
|
||||||
return apiService.fetchConversation({id, credentials})
|
return apiService.fetchConversation({id, credentials})
|
||||||
}
|
}
|
||||||
|
|
||||||
const fetchMentions = ({sinceId, username}) => {
|
|
||||||
return apiService.fetchMentions({sinceId, username, credentials})
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchFriends = () => {
|
const fetchFriends = () => {
|
||||||
return apiService.fetchFriends({credentials})
|
return apiService.fetchFriends({credentials})
|
||||||
}
|
}
|
||||||
|
@ -43,7 +39,6 @@ const backendInteractorService = (credentials) => {
|
||||||
const backendInteractorServiceInstance = {
|
const backendInteractorServiceInstance = {
|
||||||
fetchStatus,
|
fetchStatus,
|
||||||
fetchConversation,
|
fetchConversation,
|
||||||
fetchMentions,
|
|
||||||
fetchFriends,
|
fetchFriends,
|
||||||
followUser,
|
followUser,
|
||||||
unfollowUser,
|
unfollowUser,
|
||||||
|
|
|
@ -45,6 +45,7 @@ const setStyle = (href, commit) => {
|
||||||
styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
|
styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
|
||||||
styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
|
styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
|
||||||
styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
|
styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
|
||||||
|
styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
|
||||||
body.style.display = 'initial'
|
body.style.display = 'initial'
|
||||||
}
|
}
|
||||||
cssEl.addEventListener('load', setDynamic)
|
cssEl.addEventListener('load', setDynamic)
|
||||||
|
|
|
@ -5,7 +5,7 @@ import apiService from '../api/api.service.js'
|
||||||
const update = ({store, statuses, timeline, showImmediately}) => {
|
const update = ({store, statuses, timeline, showImmediately}) => {
|
||||||
const ccTimeline = camelCase(timeline)
|
const ccTimeline = camelCase(timeline)
|
||||||
|
|
||||||
setError({store, timeline, value: false})
|
store.dispatch('setError', { value: false })
|
||||||
|
|
||||||
store.dispatch('addNewStatuses', {
|
store.dispatch('addNewStatuses', {
|
||||||
timeline: ccTimeline,
|
timeline: ccTimeline,
|
||||||
|
@ -14,15 +14,6 @@ const update = ({store, statuses, timeline, showImmediately}) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const setError = ({store, timeline, value}) => {
|
|
||||||
const ccTimeline = camelCase(timeline)
|
|
||||||
|
|
||||||
store.dispatch('setError', {
|
|
||||||
timeline: ccTimeline,
|
|
||||||
value
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false}) => {
|
const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false}) => {
|
||||||
const args = { timeline, credentials }
|
const args = { timeline, credentials }
|
||||||
const rootState = store.rootState || store.state
|
const rootState = store.rootState || store.state
|
||||||
|
@ -36,7 +27,7 @@ const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false
|
||||||
|
|
||||||
return apiService.fetchTimeline(args)
|
return apiService.fetchTimeline(args)
|
||||||
.then((statuses) => update({store, statuses, timeline, showImmediately}),
|
.then((statuses) => update({store, statuses, timeline, showImmediately}),
|
||||||
() => setError({store, timeline, value: true}))
|
() => store.dispatch('setError', { value: true }))
|
||||||
}
|
}
|
||||||
|
|
||||||
const startFetching = ({ timeline = 'friends', credentials, store }) => {
|
const startFetching = ({ timeline = 'friends', credentials, store }) => {
|
||||||
|
|
Loading…
Reference in New Issue