aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Braun <roger@rogerbraun.net>2017-02-16 17:49:11 +0100
committerRoger Braun <roger@rogerbraun.net>2017-02-16 17:49:11 +0100
commitf25ae61c5daf7e925fb38d1636a61b70a4dd2d1c (patch)
tree883faa9a3bf7999c1e290d140951e35c13ae45a2
parent319af91a4762c7edab567048f1f44b5a26005d5b (diff)
parentce5b3d4c924d6e94b6fbde3c50fdb209e4ec1fab (diff)
Merge branch 'develop' into feature/hash-routed
-rw-r--r--.gitlab-ci.yml13
-rw-r--r--.node-version1
-rw-r--r--index.html2
-rw-r--r--package.json3
-rw-r--r--src/App.js7
-rw-r--r--src/App.scss4
-rw-r--r--src/App.vue4
-rw-r--r--src/components/public_and_external_timeline/public_and_external_timeline.js6
-rw-r--r--src/components/public_timeline/public_timeline.js7
-rw-r--r--src/components/status/status.js17
-rw-r--r--src/components/status/status.vue133
-rw-r--r--src/components/style_switcher/style_switcher.js5
-rw-r--r--src/components/user_card_content/user_card_content.vue8
-rw-r--r--src/main.js23
-rw-r--r--src/modules/api.js23
-rw-r--r--src/modules/config.js30
-rw-r--r--src/modules/statuses.js6
-rw-r--r--src/modules/users.js24
-rw-r--r--src/services/api/api.service.js10
-rw-r--r--src/services/backend_interactor_service/backend_interactor_service.js13
-rw-r--r--src/services/style_setter/style_setter.js2
-rw-r--r--src/services/timeline_fetcher/timeline_fetcher.service.js3
-rw-r--r--static/bg.jpgbin0 -> 229574 bytes
-rw-r--r--static/bgalt.jpgbin0 -> 330583 bytes
-rw-r--r--static/config.json6
-rw-r--r--static/font/LICENSE.txt9
-rw-r--r--static/font/config.json18
-rw-r--r--static/font/css/fontello-codes.css5
-rw-r--r--static/font/css/fontello-embedded.css17
-rw-r--r--static/font/css/fontello-ie7-codes.css5
-rw-r--r--static/font/css/fontello-ie7.css5
-rw-r--r--static/font/css/fontello.css19
-rw-r--r--static/font/demo.html15
-rw-r--r--static/font/font/fontello.eotbin7052 -> 8016 bytes
-rw-r--r--static/font/font/fontello.svg8
-rw-r--r--static/font/font/fontello.ttfbin6884 -> 7848 bytes
-rw-r--r--static/font/font/fontello.woffbin4144 -> 4840 bytes
-rw-r--r--static/font/font/fontello.woff2bin3452 -> 4072 bytes
-rw-r--r--static/logo.pngbin0 -> 2411 bytes
-rw-r--r--test/unit/specs/modules/statuses.spec.js18
-rw-r--r--test/unit/specs/modules/users.spec.js14
-rw-r--r--yarn.lock15
42 files changed, 389 insertions, 109 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d5d370c9..c05e34f4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,7 +1,7 @@
# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/
-image: node:6
+image: node:7
before_script:
# Install ssh-agent if not already installed, it is required by Docker.
@@ -29,12 +29,14 @@ cache:
test:
script:
- - npm install
+ - npm install -g yarn
+ - yarn
- npm run unit
build:
script:
- - npm install
+ - npm install -g yarn
+ - yarn
- npm run build
artifacts:
paths:
@@ -45,6 +47,7 @@ deploy:
only:
- develop
script:
- - npm install
+ - npm install -g yarn
+ - yarn
- npm run build
- - scp -r dist/* pleromaci@heldscal.la:~/pleroma
+ - scp -r dist/* pleroma@tenshi.heldscal.la:~/pleroma
diff --git a/.node-version b/.node-version
new file mode 100644
index 00000000..b26a34e4
--- /dev/null
+++ b/.node-version
@@ -0,0 +1 @@
+7.2.1
diff --git a/index.html b/index.html
index 52216b15..668b21bb 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
<link rel="stylesheet" href="/static/font/css/fontello.css">
<link rel="stylesheet" href="/static/font/css/animation.css">
</head>
- <body>
+ <body style="display: none">
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
diff --git a/package.json b/package.json
index 38321134..437ad57f 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,8 @@
"vue": "^2.0.1",
"vue-router": "^2.0.1",
"vue-timeago": "^3.1.2",
- "vuex": "^2.0.0"
+ "vuex": "^2.0.0",
+ "vuex-persistedstate": "^1.1.0"
},
"devDependencies": {
"autoprefixer": "^6.4.0",
diff --git a/src/App.js b/src/App.js
index 14a41af0..06634adb 100644
--- a/src/App.js
+++ b/src/App.js
@@ -16,7 +16,12 @@ export default {
}),
computed: {
currentUser () { return this.$store.state.users.currentUser },
- style () { return { 'background-image': `url(${this.currentUser.background_image})` } }
+ background () {
+ return this.currentUser.background_image || this.$store.state.config.background
+ },
+ logoStyle () { return { 'background-image': `url(${this.$store.state.config.logo})` } },
+ style () { return { 'background-image': `url(${this.background})` } },
+ sitename () { return this.$store.state.config.name }
},
methods: {
activatePanel (panelName) {
diff --git a/src/App.scss b/src/App.scss
index c820779a..d39fc749 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -63,6 +63,10 @@ nav {
align-items: center;
flex-basis: 920px;
margin: auto;
+ height: 50px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
}
}
diff --git a/src/App.vue b/src/App.vue
index 5d5463fb..a22307a6 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,9 +1,9 @@
<template>
<div id="app" v-bind:style="style" class="base02-background">
<nav class='container base01-background base04'>
- <div class='inner-nav'>
+ <div class='inner-nav' :style="logoStyle">
<div class='item'>
- <a route-to='friends-timeline' href="#">Pleroma FE</a>
+ <a route-to='friends-timeline' href="#">{{sitename}}</a>
</div>
<style-switcher></style-switcher>
</div>
diff --git a/src/components/public_and_external_timeline/public_and_external_timeline.js b/src/components/public_and_external_timeline/public_and_external_timeline.js
index 138118ad..0db6efae 100644
--- a/src/components/public_and_external_timeline/public_and_external_timeline.js
+++ b/src/components/public_and_external_timeline/public_and_external_timeline.js
@@ -5,6 +5,12 @@ const PublicAndExternalTimeline = {
},
computed: {
timeline () { return this.$store.state.statuses.timelines.publicAndExternal }
+ },
+ created () {
+ this.$store.dispatch('startFetching', 'publicAndExternal')
+ },
+ destroyed () {
+ this.$store.dispatch('stopFetching', 'publicAndExternal')
}
}
diff --git a/src/components/public_timeline/public_timeline.js b/src/components/public_timeline/public_timeline.js
index cac422ec..9b866be8 100644
--- a/src/components/public_timeline/public_timeline.js
+++ b/src/components/public_timeline/public_timeline.js
@@ -5,7 +5,14 @@ const PublicTimeline = {
},
computed: {
timeline () { return this.$store.state.statuses.timelines.public }
+ },
+ created () {
+ this.$store.dispatch('startFetching', 'public')
+ },
+ destroyed () {
+ this.$store.dispatch('stopFetching', 'public')
}
+
}
export default PublicTimeline
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 40589ea5..030e22b5 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -3,6 +3,7 @@ import FavoriteButton from '../favorite_button/favorite_button.vue'
import RetweetButton from '../retweet_button/retweet_button.vue'
import DeleteButton from '../delete_button/delete_button.vue'
import PostStatusForm from '../post_status_form/post_status_form.vue'
+import UserCardContent from '../user_card_content/user_card_content.vue'
const Status = {
props: [
@@ -11,7 +12,9 @@ const Status = {
],
data: () => ({
replying: false,
- expanded: false
+ expanded: false,
+ unmuted: false,
+ userExpanded: false
}),
computed: {
retweet () { return !!this.statusoid.retweeted_status },
@@ -25,14 +28,16 @@ const Status = {
},
loggedIn () {
return !!this.$store.state.users.currentUser
- }
+ },
+ muted () { return !this.unmuted && this.status.user.muted }
},
components: {
Attachment,
FavoriteButton,
RetweetButton,
DeleteButton,
- PostStatusForm
+ PostStatusForm,
+ UserCardContent
},
methods: {
toggleReplying () {
@@ -40,6 +45,12 @@ const Status = {
},
toggleExpanded () {
this.$emit('toggleExpanded')
+ },
+ toggleMute () {
+ this.unmuted = !this.unmuted
+ },
+ toggleUserExpanded () {
+ this.userExpanded = !this.userExpanded
}
}
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index f113fb7e..0c004936 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -1,70 +1,84 @@
<template>
<div class="status-el base00-background" v-if="!status.deleted">
- <div v-if="retweet" class="media container retweet-info">
- <div class="media-left">
- <i class='fa icon-retweet retweeted'></i>
+ <template v-if="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>
+ <a href="#" class="unmute" @click.prevent="toggleMute"><i class="icon-eye-off"></i></a>
</div>
- <div class="media-body">
- Retweeted by {{retweeter}}
- </div>
- </div>
- <div class="media status container">
- <div class="media-left">
- <a :href="status.user.statusnet_profile_url">
- <img class='avatar' :src="status.user.profile_image_url_original">
- </a>
+ </template>
+ <template v-if="!muted">
+ <div v-if="retweet" class="media container retweet-info">
+ <div class="media-left">
+ <i class='fa icon-retweet retweeted'></i>
+ </div>
+ <div class="media-body">
+ Retweeted by {{retweeter}}
+ </div>
</div>
- <div class="media-body">
- <div class="user-content">
- <h4 class="media-heading">
- {{status.user.name}}
- <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
- <small v-if="status.in_reply_to_screen_name"> &gt;
- <router-link :to="{ name: 'user-profile', params: { id: status.in_reply_to_user_id } }">
- {{status.in_reply_to_screen_name}}
- </router-link>
- </small>
- -
- <small>
- <router-link :to="{ name: 'conversation', params: { id: status.id } }">
- <timeago :since="status.created_at" :auto-update="60"></timeago>
- </router-link>
- </small>
- <template v-if="expandable">
+ <div class="media status container">
+ <div class="media-left">
+ <a :href="status.user.statusnet_profile_url">
+ <img @click.prevent="toggleUserExpanded" class='avatar' :src="status.user.profile_image_url_original">
+ </a>
+ </div>
+ <div class="media-body">
+ <div class="base05 base05=border usercard" v-if="userExpanded">
+ <user-card-content :user="status.user"></user-card-content>
+ </div>
+ <div class="user-content">
+ <h4 class="media-heading">
+ {{status.user.name}}
+ <small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
+ <small v-if="status.in_reply_to_screen_name"> &gt;
+ <router-link :to="{ name: 'user-profile', params: { id: status.in_reply_to_user_id } }">
+ {{status.in_reply_to_screen_name}}
+ </router-link>
+ </small>
-
<small>
- <a href="#" @click.prevent="toggleExpanded" >Expand</a>
+ <router-link :to="{ name: 'conversation', params: { id: status.id } }">
+ <timeago :since="status.created_at" :auto-update="60"></timeago>
+ </router-link>
</small>
- </template>
- <small v-if="!status.is_local" class="source_url">
- <a :href="status.external_url" target="_blank" >Source</a>
- </small>
- </h4>
+ <template v-if="expandable">
+ -
+ <small>
+ <a href="#" @click.prevent="toggleExpanded" ><i class="icon-plus-squared"></i></a>
+ </small>
+ <small v-if="status.user.muted">
+ <a href="#" @click.prevent="toggleMute" ><i class="icon-eye-off"></i></a>
+ </small>
+ </template>
+ <small v-if="!status.is_local" class="source_url">
+ <a :href="status.external_url" target="_blank" ><i class="icon-binoculars"></i></a>
+ </small>
+ </h4>
- <div class="status-content" v-html="status.statusnet_html"></div>
+ <div class="status-content" v-html="status.statusnet_html"></div>
- <div v-if='status.attachments' class='attachments'>
- <attachment :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments">
- </attachment>
+ <div v-if='status.attachments' class='attachments'>
+ <attachment :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments">
+ </attachment>
+ </div>
</div>
- </div>
- <div v-if="loggedIn">
- <div class='status-actions'>
- <div>
- <a href="#" v-on:click.prevent="toggleReplying">
- <i class='fa icon-reply'></i>
- </a>
+ <div v-if="loggedIn">
+ <div class='status-actions'>
+ <div>
+ <a href="#" v-on:click.prevent="toggleReplying">
+ <i class='fa icon-reply'></i>
+ </a>
+ </div>
+ <retweet-button :status=status></retweet-button>
+ <favorite-button :status=status></favorite-button>
+ <delete-button :status=status></delete-button>
</div>
- <retweet-button :status=status></retweet-button>
- <favorite-button :status=status></favorite-button>
- <delete-button :status=status></delete-button>
- </div>
- <post-status-form v-if="replying" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"></post-status-form>
+ <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>
+ </template>
</div>
</template>
@@ -128,4 +142,19 @@
padding-right: 1em;
border-bottom: 1px solid;
}
+ .muted button {
+ margin-left: auto;
+ }
+
+ a.unmute {
+ display: block;
+ margin-left: auto;
+ }
+
+ .usercard {
+ border-style: solid;
+ border-width: 1px;
+ border-radius: 1em;
+ margin-bottom: 1em;
+ }
</style>
diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js
index 8a8cc2a0..954e2ff0 100644
--- a/src/components/style_switcher/style_switcher.js
+++ b/src/components/style_switcher/style_switcher.js
@@ -1,5 +1,3 @@
-import StyleSetter from '../../services/style_setter/style_setter.js'
-
export default {
data: () => ({
availableStyles: [],
@@ -13,8 +11,7 @@ export default {
},
watch: {
selected () {
- const fullPath = `/static/css/${this.selected}`
- StyleSetter.setStyle(fullPath)
+ this.$store.dispatch('setOption', { name: 'theme', value: this.selected })
}
}
}
diff --git a/src/components/user_card_content/user_card_content.vue b/src/components/user_card_content/user_card_content.vue
index 9a21f404..2c32406b 100644
--- a/src/components/user_card_content/user_card_content.vue
+++ b/src/components/user_card_content/user_card_content.vue
@@ -3,6 +3,10 @@
<div class="base00-background panel-heading text-center" v-bind:style="style">
<div class='user-info'>
<img :src="user.profile_image_url">
+ <div v-if='user.muted' class='muteinfo'>Muted</div>
+ <div class='muteinfo' v-if='isOtherUser'>
+ <button @click="toggleMute">Mute/Unmute</button>
+ </div>
<span class="glyphicon glyphicon-user"></span>
<div class='user-name'>{{user.name}}</div>
<div class='user-screen-name'>@{{user.screen_name}}</div>
@@ -70,6 +74,10 @@
const store = this.$store
store.state.api.backendInteractor.unfollowUser(this.user.id)
.then((unfollowedUser) => store.commit('addNewUsers', [unfollowedUser]))
+ },
+ toggleMute () {
+ const store = this.$store
+ store.commit('setMuted', {user: this.user, muted: !this.user.muted})
}
}
}
diff --git a/src/main.js b/src/main.js
index 830aa02c..17aeb863 100644
--- a/src/main.js
+++ b/src/main.js
@@ -12,10 +12,11 @@ import UserProfile from './components/user_profile/user_profile.vue'
import statusesModule from './modules/statuses.js'
import usersModule from './modules/users.js'
import apiModule from './modules/api.js'
+import configModule from './modules/config.js'
import VueTimeago from 'vue-timeago'
-import StyleSetter from './services/style_setter/style_setter.js'
+import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex)
Vue.use(VueRouter)
@@ -26,12 +27,19 @@ Vue.use(VueTimeago, {
}
})
+const persistedStateOptions = {
+ paths: ['users.users']
+}
+
const store = new Vuex.Store({
modules: {
statuses: statusesModule,
users: usersModule,
- api: apiModule
- }
+ api: apiModule,
+ config: configModule
+ },
+ plugins: [createPersistedState(persistedStateOptions)],
+ strict: process.env.NODE_ENV !== 'production'
})
const routes = [
@@ -60,4 +68,11 @@ new Vue({
components: { App }
})
-StyleSetter.setStyle('/static/css/base16-solarized-light.css')
+window.fetch('/static/config.json')
+ .then((res) => res.json())
+ .then(({name, theme, background, logo}) => {
+ store.dispatch('setOption', { name: 'name', value: name })
+ store.dispatch('setOption', { name: 'theme', value: theme })
+ store.dispatch('setOption', { name: 'background', value: background })
+ store.dispatch('setOption', { name: 'logo', value: logo })
+ })
diff --git a/src/modules/api.js b/src/modules/api.js
index 4000dc60..a32adfde 100644
--- a/src/modules/api.js
+++ b/src/modules/api.js
@@ -2,11 +2,32 @@ import backendInteractorService from '../services/backend_interactor_service/bac
const api = {
state: {
- backendInteractor: backendInteractorService()
+ backendInteractor: backendInteractorService(),
+ fetchers: {}
},
mutations: {
setBackendInteractor (state, backendInteractor) {
state.backendInteractor = backendInteractor
+ },
+ addFetcher (state, {timeline, fetcher}) {
+ state.fetchers[timeline] = fetcher
+ },
+ removeFetcher (state, {timeline}) {
+ delete state.fetchers[timeline]
+ }
+ },
+ actions: {
+ startFetching (store, timeline) {
+ // Don't start fetching if we already are.
+ if (!store.state.fetchers[timeline]) {
+ const fetcher = store.state.backendInteractor.startFetching({timeline, store})
+ store.commit('addFetcher', {timeline, fetcher})
+ }
+ },
+ stopFetching (store, timeline) {
+ const fetcher = store.state.fetchers[timeline]
+ window.clearInterval(fetcher)
+ store.commit('removeFetcher', {timeline})
}
}
}
diff --git a/src/modules/config.js b/src/modules/config.js
new file mode 100644
index 00000000..4365d554
--- /dev/null
+++ b/src/modules/config.js
@@ -0,0 +1,30 @@
+import { set } from 'vue'
+import StyleSetter from '../services/style_setter/style_setter.js'
+
+const defaultState = {
+ name: 'Pleroma FE'
+}
+
+const config = {
+ state: defaultState,
+ mutations: {
+ setOption (state, { name, value }) {
+ set(state, name, value)
+ }
+ },
+ actions: {
+ setOption ({ commit }, { name, value }) {
+ commit('setOption', {name, value})
+ switch (name) {
+ case 'name':
+ document.title = value
+ break
+ case 'theme':
+ const fullPath = `/static/css/${value}`
+ StyleSetter.setStyle(fullPath)
+ }
+ }
+ }
+}
+
+export default config
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index b1aa404a..871172b5 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -153,16 +153,18 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
}
}
+ // Decide if we should treat the status as new for this timeline.
+ let resultForCurrentTimeline
// Some statuses should only be added to the global status repository.
if (timeline && addToTimeline) {
- mergeOrAdd(timelineObject.statuses, status)
+ resultForCurrentTimeline = mergeOrAdd(timelineObject.statuses, status)
}
if (timeline && showImmediately) {
// Add it directly to the visibleStatuses, don't change
// newStatusCount
mergeOrAdd(timelineObject.visibleStatuses, status)
- } else if (timeline && addToTimeline && result.new) {
+ } else if (timeline && addToTimeline && resultForCurrentTimeline.new) {
// Just change newStatuscount
timelineObject.newStatusCount += 1
}
diff --git a/src/modules/users.js b/src/modules/users.js
index 8ba365f3..ae90abbd 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -1,6 +1,6 @@
-import timelineFetcher from '../services/timeline_fetcher/timeline_fetcher.service.js'
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import { compact, map, each, find, merge } from 'lodash'
+import { set } from 'vue'
// TODO: Unify with mergeOrAdd in statuses.js
export const mergeOrAdd = (arr, item) => {
@@ -18,6 +18,10 @@ export const mergeOrAdd = (arr, item) => {
}
export const mutations = {
+ setMuted (state, { user: {id}, muted }) {
+ const user = find(state.users, {id})
+ set(user, 'muted', muted)
+ },
setCurrentUser (state, user) {
state.currentUser = user
},
@@ -29,6 +33,9 @@ export const mutations = {
},
addNewUsers (state, users) {
each(users, (user) => mergeOrAdd(state.users, user))
+ },
+ setUserForStatus (state, status) {
+ status.user = find(state.users, status.user)
}
}
@@ -47,6 +54,15 @@ const users = {
const retweetedUsers = compact(map(statuses, 'retweeted_status.user'))
store.commit('addNewUsers', users)
store.commit('addNewUsers', retweetedUsers)
+
+ // Reconnect users to statuses
+ each(statuses, (status) => {
+ store.commit('setUserForStatus', status)
+ })
+ // Reconnect users to retweets
+ each(compact(map(statuses, 'retweeted_status')), (status) => {
+ store.commit('setUserForStatus', status)
+ })
},
loginUser (store, userCredentials) {
const commit = store.commit
@@ -60,12 +76,12 @@ const users = {
commit('setCurrentUser', user)
commit('addNewUsers', [user])
- // Start getting fresh tweets.
- timelineFetcher.startFetching({store, credentials: userCredentials})
-
// Set our new backend interactor
commit('setBackendInteractor', backendInteractorService(userCredentials))
+ // Start getting fresh tweets.
+ store.dispatch('startFetching', 'friends')
+
// Fetch our friends
store.rootState.api.backendInteractor.fetchFriends()
.then((friends) => commit('addNewUsers', friends))
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 87a7e2e5..de89f503 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -1,6 +1,7 @@
/* eslint-env browser */
const LOGIN_URL = '/api/account/verify_credentials.json'
const FRIENDS_TIMELINE_URL = '/api/statuses/friends_timeline.json'
+const ALL_FOLLOWING_URL = '/api/qvitter/allfollowing'
const PUBLIC_TIMELINE_URL = '/api/statuses/public_timeline.json'
const PUBLIC_AND_EXTERNAL_TIMELINE_URL = '/api/statuses/public_and_external_timeline.json'
const FAVORITE_URL = '/api/favorites/create'
@@ -54,6 +55,12 @@ const fetchFriends = ({credentials}) => {
.then((data) => data.json())
}
+const fetchAllFollowing = ({username, credentials}) => {
+ const url = `${ALL_FOLLOWING_URL}/${username}.json`
+ return fetch(url, { headers: authHeaders(credentials) })
+ .then((data) => data.json().users)
+}
+
const fetchMentions = ({username, sinceId = 0, credentials}) => {
let url = `${MENTIONS_URL}?since_id=${sinceId}&screen_name=${username}`
return fetch(url, { headers: authHeaders(credentials) })
@@ -169,7 +176,8 @@ const apiService = {
retweet,
postStatus,
deleteStatus,
- uploadMedia
+ uploadMedia,
+ fetchAllFollowing
}
export default apiService
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index 746776bf..d335bfb7 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -1,4 +1,5 @@
import apiService from '../api/api.service.js'
+import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js'
const backendInteractorService = (credentials) => {
const fetchStatus = ({id}) => {
@@ -17,6 +18,10 @@ const backendInteractorService = (credentials) => {
return apiService.fetchFriends({credentials})
}
+ const fetchAllFollowing = ({username}) => {
+ return apiService.fetchAllFollowing({username, credentials})
+ }
+
const followUser = (id) => {
return apiService.followUser({credentials, id})
}
@@ -25,6 +30,10 @@ const backendInteractorService = (credentials) => {
return apiService.unfollowUser({credentials, id})
}
+ const startFetching = ({timeline, store}) => {
+ return timelineFetcherService.startFetching({timeline, store, credentials})
+ }
+
const backendInteractorServiceInstance = {
fetchStatus,
fetchConversation,
@@ -32,7 +41,9 @@ const backendInteractorService = (credentials) => {
fetchFriends,
followUser,
unfollowUser,
- verifyCredentials: apiService.verifyCredentials
+ fetchAllFollowing,
+ verifyCredentials: apiService.verifyCredentials,
+ startFetching
}
return backendInteractorServiceInstance
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 79b68b38..0a5be77d 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -34,7 +34,7 @@ const setStyle = (href) => {
styleSheet.insertRule(`a { color: ${base08Color}`, 'index-max')
styleSheet.insertRule(`body { color: ${base05Color}`, 'index-max')
- styleSheet.insertRule(`.base05-border { color: ${base05Color}`, 'index-max')
+ styleSheet.insertRule(`.base05-border { border-color: ${base05Color}`, 'index-max')
body.style.display = 'initial'
}
cssEl.addEventListener('load', setDynamic)
diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js
index 0d4ffcad..37bbcd82 100644
--- a/src/services/timeline_fetcher/timeline_fetcher.service.js
+++ b/src/services/timeline_fetcher/timeline_fetcher.service.js
@@ -30,8 +30,7 @@ const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false
const startFetching = ({ timeline = 'friends', credentials, store }) => {
fetchAndUpdate({timeline, credentials, store, showImmediately: true})
const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store })
-
- setInterval(boundFetchAndUpdate, 10000)
+ return setInterval(boundFetchAndUpdate, 10000)
}
const timelineFetcher = {
fetchAndUpdate,
diff --git a/static/bg.jpg b/static/bg.jpg
new file mode 100644
index 00000000..60e2311a
--- /dev/null
+++ b/static/bg.jpg
Binary files differ
diff --git a/static/bgalt.jpg b/static/bgalt.jpg
new file mode 100644
index 00000000..fdb666ff
--- /dev/null
+++ b/static/bgalt.jpg
Binary files differ
diff --git a/static/config.json b/static/config.json
new file mode 100644
index 00000000..fb8d4015
--- /dev/null
+++ b/static/config.json
@@ -0,0 +1,6 @@
+{
+ "name": "Pleroma FE",
+ "theme": "base16-ashes.css",
+ "background": "/static/bg.jpg",
+ "logo": "/static/logo.png"
+}
diff --git a/static/font/LICENSE.txt b/static/font/LICENSE.txt
index d244c952..c26be384 100644
--- a/static/font/LICENSE.txt
+++ b/static/font/LICENSE.txt
@@ -10,6 +10,15 @@ Font license info
Homepage: http://fortawesome.github.com/Font-Awesome/
+## Entypo
+
+ Copyright (C) 2012 by Daniel Bruce
+
+ Author: Daniel Bruce
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://www.entypo.com
+
+
## Fontelico
Copyright (C) 2012 by Fontello project
diff --git a/static/font/config.json b/static/font/config.json
index c0af5490..df060d8c 100644
--- a/static/font/config.json
+++ b/static/font/config.json
@@ -53,6 +53,24 @@
"css": "retweet",
"code": 59396,
"src": "fontawesome"
+ },
+ {
+ "uid": "7fd683b2c518ceb9e5fa6757f2276faa",
+ "css": "eye-off",
+ "code": 59397,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "73ffeb70554099177620847206c12457",
+ "css": "binoculars",
+ "code": 61925,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "9e1c33b6849ceb08db8acfaf02188b7d",
+ "css": "plus-squared",
+ "code": 59398,
+ "src": "entypo"
}
]
} \ No newline at end of file
diff --git a/static/font/css/fontello-codes.css b/static/font/css/fontello-codes.css
index 016a5d31..a26d6318 100644
--- a/static/font/css/fontello-codes.css
+++ b/static/font/css/fontello-codes.css
@@ -4,6 +4,9 @@
.icon-star:before { content: '\e802'; } /* '' */
.icon-star-empty:before { content: '\e803'; } /* '' */
.icon-retweet:before { content: '\e804'; } /* '' */
+.icon-eye-off:before { content: '\e805'; } /* '' */
+.icon-plus-squared:before { content: '\e806'; } /* '' */
.icon-spin3:before { content: '\e832'; } /* '' */
.icon-spin4:before { content: '\e834'; } /* '' */
-.icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file
+.icon-reply:before { content: '\f112'; } /* '' */
+.icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file
diff --git a/static/font/css/fontello-embedded.css b/static/font/css/fontello-embedded.css
index 080e894c..35586bef 100644
--- a/static/font/css/fontello-embedded.css
+++ b/static/font/css/fontello-embedded.css
@@ -1,15 +1,15 @@
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.eot?14562179');
- src: url('../font/fontello.eot?14562179#iefix') format('embedded-opentype'),
- url('../font/fontello.svg?14562179#fontello') format('svg');
+ src: url('../font/fontello.eot?37005290');
+ src: url('../font/fontello.eot?37005290#iefix') format('embedded-opentype'),
+ url('../font/fontello.svg?37005290#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'fontello';
- src: url('data:application/octet-stream;base64,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') format('woff'),
- url('data:application/octet-stream;base64,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RSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype');
+ src: url('data:application/octet-stream;base64,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') format('woff'),
+ url('data:application/octet-stream;base64,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') format('truetype');
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
@@ -17,7 +17,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.svg?14562179#fontello') format('svg');
+ src: url('../font/fontello.svg?37005290#fontello') format('svg');
}
}
*/
@@ -57,6 +57,9 @@
.icon-star:before { content: '\e802'; } /* '' */
.icon-star-empty:before { content: '\e803'; } /* '' */
.icon-retweet:before { content: '\e804'; } /* '' */
+.icon-eye-off:before { content: '\e805'; } /* '' */
+.icon-plus-squared:before { content: '\e806'; } /* '' */
.icon-spin3:before { content: '\e832'; } /* '' */
.icon-spin4:before { content: '\e834'; } /* '' */
-.icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file
+.icon-reply:before { content: '\f112'; } /* '' */
+.icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file
diff --git a/static/font/css/fontello-ie7-codes.css b/static/font/css/fontello-ie7-codes.css
index 0e5617f2..286a3094 100644
--- a/static/font/css/fontello-ie7-codes.css
+++ b/static/font/css/fontello-ie7-codes.css
@@ -4,6 +4,9 @@
.icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-retweet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
+.icon-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
+.icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
-.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;&nbsp;'); } \ No newline at end of file
+.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;&nbsp;'); }
+.icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1e5;&nbsp;'); } \ No newline at end of file
diff --git a/static/font/css/fontello-ie7.css b/static/font/css/fontello-ie7.css
index 5f3d908d..be171321 100644
--- a/static/font/css/fontello-ie7.css
+++ b/static/font/css/fontello-ie7.css
@@ -15,6 +15,9 @@
.icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-retweet { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
+.icon-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
+.icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
-.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;&nbsp;'); } \ No newline at end of file
+.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;&nbsp;'); }
+.icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf1e5;&nbsp;'); } \ No newline at end of file
diff --git a/static/font/css/fontello.css b/static/font/css/fontello.css
index 93de5d4b..40b06cda 100644
--- a/static/font/css/fontello.css
+++ b/static/font/css/fontello.css
@@ -1,11 +1,11 @@
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.eot?49728550');
- src: url('../font/fontello.eot?49728550#iefix') format('embedded-opentype'),
- url('../font/fontello.woff2?49728550') format('woff2'),
- url('../font/fontello.woff?49728550') format('woff'),
- url('../font/fontello.ttf?49728550') format('truetype'),
- url('../font/fontello.svg?49728550#fontello') format('svg');
+ src: url('../font/fontello.eot?69621097');
+ src: url('../font/fontello.eot?69621097#iefix') format('embedded-opentype'),
+ url('../font/fontello.woff2?69621097') format('woff2'),
+ url('../font/fontello.woff?69621097') format('woff'),
+ url('../font/fontello.ttf?69621097') format('truetype'),
+ url('../font/fontello.svg?69621097#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -15,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.svg?49728550#fontello') format('svg');
+ src: url('../font/fontello.svg?69621097#fontello') format('svg');
}
}
*/
@@ -60,6 +60,9 @@
.icon-star:before { content: '\e802'; } /* '' */
.icon-star-empty:before { content: '\e803'; } /* '' */
.icon-retweet:before { content: '\e804'; } /* '' */
+.icon-eye-off:before { content: '\e805'; } /* '' */
+.icon-plus-squared:before { content: '\e806'; } /* '' */
.icon-spin3:before { content: '\e832'; } /* '' */
.icon-spin4:before { content: '\e834'; } /* '' */
-.icon-reply:before { content: '\f112'; } /* '' */ \ No newline at end of file
+.icon-reply:before { content: '\f112'; } /* '' */
+.icon-binoculars:before { content: '\f1e5'; } /* '' */ \ No newline at end of file
diff --git a/static/font/demo.html b/static/font/demo.html
index 76eefed4..9aee0345 100644
--- a/static/font/demo.html
+++ b/static/font/demo.html
@@ -229,11 +229,11 @@ body {
}
@font-face {
font-family: 'fontello';
- src: url('./font/fontello.eot?17074388');
- src: url('./font/fontello.eot?17074388#iefix') format('embedded-opentype'),
- url('./font/fontello.woff?17074388') format('woff'),
- url('./font/fontello.ttf?17074388') format('truetype'),
- url('./font/fontello.svg?17074388#fontello') format('svg');
+ src: url('./font/fontello.eot?5004941');
+ src: url('./font/fontello.eot?5004941#iefix') format('embedded-opentype'),
+ url('./font/fontello.woff?5004941') format('woff'),
+ url('./font/fontello.ttf?5004941') format('truetype'),
+ url('./font/fontello.svg?5004941#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -308,9 +308,14 @@ body {
</div>
<div class="row">
<div title="Code: 0xe804" class="the-icons span3"><i class="demo-icon icon-retweet">&#xe804;</i> <span class="i-name">icon-retweet</span><span class="i-code">0xe804</span></div>
+ <div title="Code: 0xe805" class="the-icons span3"><i class="demo-icon icon-eye-off">&#xe805;</i> <span class="i-name">icon-eye-off</span><span class="i-code">0xe805</span></div>
+ <div title="Code: 0xe806" class="the-icons span3"><i class="demo-icon icon-plus-squared">&#xe806;</i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xe806</span></div>
<div title="Code: 0xe832" class="the-icons span3"><i class="demo-icon icon-spin3 animate-spin">&#xe832;</i> <span class="i-name">icon-spin3</span><span class="i-code">0xe832</span></div>
+ </div>
+ <div class="row">
<div title="Code: 0xe834" class="the-icons span3"><i class="demo-icon icon-spin4 animate-spin">&#xe834;</i> <span class="i-name">icon-spin4</span><span class="i-code">0xe834</span></div>
<div title="Code: 0xf112" class="the-icons span3"><i class="demo-icon icon-reply">&#xf112;</i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div>
+ <div title="Code: 0xf1e5" class="the-icons span3"><i class="demo-icon icon-binoculars">&#xf1e5;</i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div>
</div>
</div>
<div class="container footer">Generated by <a href="http://fontello.com">fontello.com</a></div>
diff --git a/static/font/font/fontello.eot b/static/font/font/fontello.eot
index b24209ca..71a098c7 100644
--- a/static/font/font/fontello.eot
+++ b/static/font/font/fontello.eot
Binary files differ
diff --git a/static/font/font/fontello.svg b/static/font/font/fontello.svg
index 3c99a9a9..7b996b58 100644
--- a/static/font/font/fontello.svg
+++ b/static/font/font/fontello.svg
@@ -1,7 +1,7 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
-<metadata>Copyright (C) 2016 by original authors @ fontello.com</metadata>
+<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
<defs>
<font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
@@ -16,11 +16,17 @@
<glyph glyph-name="retweet" unicode="&#xe804;" d="M714 11q0-7-5-13t-13-5h-535q-5 0-8 1t-5 4-3 4-2 7 0 6v335h-107q-15 0-25 11t-11 25q0 13 8 23l179 214q11 12 27 12t28-12l178-214q9-10 9-23 0-15-11-25t-25-11h-107v-214h321q9 0 14-6l89-108q4-5 4-11z m357 232q0-13-8-23l-178-214q-12-13-28-13t-27 13l-179 214q-8 10-8 23 0 14 11 25t25 11h107v214h-322q-9 0-14 7l-89 107q-4 5-4 11 0 7 5 12t13 6h536q4 0 7-1t5-4 3-5 2-6 1-7v-334h107q14 0 25-11t10-25z" horiz-adv-x="1071.4" />
+<glyph glyph-name="eye-off" unicode="&#xe805;" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" />
+
+<glyph glyph-name="plus-squared" unicode="&#xe806;" d="M700 750q42 0 71-29t29-71l0-600q0-40-29-70t-71-30l-600 0q-40 0-70 30t-30 70l0 600q0 42 30 71t70 29l600 0z m-50-450l0 100-200 0 0 200-100 0 0-200-200 0 0-100 200 0 0-200 100 0 0 200 200 0z" horiz-adv-x="800" />
+
<glyph glyph-name="spin3" unicode="&#xe832;" d="M494 850c-266 0-483-210-494-472-1-19 13-20 13-20l84 0c16 0 19 10 19 18 10 199 176 358 378 358 107 0 205-45 273-118l-58-57c-11-12-11-27 5-31l247-50c21-5 46 11 37 44l-58 227c-2 9-16 22-29 13l-65-60c-89 91-214 148-352 148z m409-508c-16 0-19-10-19-18-10-199-176-358-377-358-108 0-205 45-274 118l59 57c10 12 10 27-5 31l-248 50c-21 5-46-11-37-44l58-227c2-9 16-22 30-13l64 60c89-91 214-148 353-148 265 0 482 210 493 473 1 18-13 19-13 19l-84 0z" horiz-adv-x="1000" />
<glyph glyph-name="spin4" unicode="&#xe834;" d="M498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" />
<glyph glyph-name="reply" unicode="&#xf112;" d="M1000 225q0-93-71-252-1-4-6-13t-7-17-7-12q-7-10-16-10-8 0-13 6t-5 14q0 5 1 15t2 13q3 38 3 69 0 56-10 101t-27 77-45 56-59 39-74 24-86 12-98 3h-125v-143q0-14-10-25t-26-11-25 11l-285 286q-11 10-11 25t11 25l285 286q11 10 25 10t26-10 10-25v-143h125q398 0 488-225 30-75 30-186z" horiz-adv-x="1000" />
+
+<glyph glyph-name="binoculars" unicode="&#xf1e5;" d="M393 671v-428q0-15-11-25t-25-11v-321q0-15-10-25t-26-11h-285q-15 0-25 11t-11 25v285l139 488q4 12 17 12h237z m178 0v-392h-142v392h142z m429-500v-285q0-15-11-25t-25-11h-285q-15 0-25 11t-11 25v321q-15 0-25 11t-11 25v428h237q13 0 17-12z m-589 661v-125h-197v125q0 8 5 13t13 5h161q8 0 13-5t5-13z m375 0v-125h-197v125q0 8 5 13t13 5h161q8 0 13-5t5-13z" horiz-adv-x="1000" />
</font>
</defs>
</svg> \ No newline at end of file
diff --git a/static/font/font/fontello.ttf b/static/font/font/fontello.ttf
index eac7ee62..eec33d0b 100644
--- a/static/font/font/fontello.ttf
+++ b/static/font/font/fontello.ttf
Binary files differ
diff --git a/static/font/font/fontello.woff b/static/font/font/fontello.woff
index 3909c67a..ce55f889 100644
--- a/static/font/font/fontello.woff
+++ b/static/font/font/fontello.woff
Binary files differ
diff --git a/static/font/font/fontello.woff2 b/static/font/font/fontello.woff2
index 6ef3a715..fd484016 100644
--- a/static/font/font/fontello.woff2
+++ b/static/font/font/fontello.woff2
Binary files differ
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 00000000..f83d923b
--- /dev/null
+++ b/static/logo.png
Binary files differ
diff --git a/test/unit/specs/modules/statuses.spec.js b/test/unit/specs/modules/statuses.spec.js
index c130cbf3..b1581e03 100644
--- a/test/unit/specs/modules/statuses.spec.js
+++ b/test/unit/specs/modules/statuses.spec.js
@@ -79,6 +79,24 @@ describe('The Statuses module', () => {
expect(state.timelines.public.newStatusCount).to.equal(1)
})
+ it('counts the status as new if it has not been seen on this timeline', () => {
+ const state = cloneDeep(defaultState)
+ const status = makeMockStatus({id: 1})
+
+ mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
+ mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' })
+
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.public.statuses).to.eql([status])
+ expect(state.timelines.public.visibleStatuses).to.eql([])
+ expect(state.timelines.public.newStatusCount).to.equal(1)
+
+ expect(state.allStatuses).to.eql([status])
+ expect(state.timelines.friends.statuses).to.eql([status])
+ expect(state.timelines.friends.visibleStatuses).to.eql([])
+ expect(state.timelines.friends.newStatusCount).to.equal(1)
+ })
+
it('add the statuses to allStatuses if no timeline is given', () => {
const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1})
diff --git a/test/unit/specs/modules/users.spec.js b/test/unit/specs/modules/users.spec.js
index 07c71e32..812ba632 100644
--- a/test/unit/specs/modules/users.spec.js
+++ b/test/unit/specs/modules/users.spec.js
@@ -17,4 +17,18 @@ describe('The users module', () => {
expect(state.users).to.eql([user])
expect(state.users[0].name).to.eql('Dude')
})
+
+ it('sets a mute bit on users', () => {
+ const state = cloneDeep(defaultState)
+ const user = { id: 1, name: 'Guy' }
+
+ mutations.addNewUsers(state, [user])
+ mutations.setMuted(state, {user, muted: true})
+
+ expect(user.muted).to.eql(true)
+
+ mutations.setMuted(state, {user, muted: false})
+
+ expect(user.muted).to.eql(false)
+ })
})
diff --git a/yarn.lock b/yarn.lock
index 16150613..a1ce6b64 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3495,6 +3495,10 @@ lodash.merge@^3.3.2:
lodash.keysin "^3.0.0"
lodash.toplainobject "^3.0.0"
+lodash.merge@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
+
lodash.pairs@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9"
@@ -4011,6 +4015,10 @@ object-component@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+object-path@^0.11.2:
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.3.tgz#3e21a42ad07234d815429ae9e15c1c5f38050554"
+
object.omit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94"
@@ -5734,6 +5742,13 @@ vuex:
version "2.0.0"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-2.0.0.tgz#26befa44de220f009e432d1027487bff29571cee"
+vuex-persistedstate:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-1.1.0.tgz#94f2e94a873f39fc716dea3129af45df8d4d6f78"
+ dependencies:
+ lodash.merge "^4.6.0"
+ object-path "^0.11.2"
+
watchpack@^0.2.1:
version "0.2.9"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b"