@@ -83,6 +83,20 @@
+
+
+
+
+
+
+
+
@@ -120,7 +134,44 @@
status-text-container {
display: block;
-}
+ }
+
+ .status-preview {
+ position: absolute;
+ max-width: 34em;
+ padding: 0.5em;
+ display: flex;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 1px;
+ border-radius: 4px;
+ box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
+ margin-top: 0.5em;
+ margin-left: 1em;
+
+ .avatar {
+ flex-shrink: 0;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ }
+ .text {
+ h4 {
+ margin-bottom: 0.4em;
+ small {
+ font-weight: lighter;
+ }
+ }
+ padding: 0 0.5em 0.5em 0.5em;
+ }
+ }
+
+ .status-preview-loading {
+ display: block;
+ font-size: 2em;
+ min-width: 8em;
+ text-align: center;
+ }
.status-el {
hyphens: auto;
diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js
index 613b8a34..be0aefc1 100644
--- a/src/components/timeline/timeline.js
+++ b/src/components/timeline/timeline.js
@@ -60,6 +60,7 @@ const Timeline = {
},
destroyed () {
window.removeEventListener('scroll', this.scrollLoad)
+ this.$store.commit('setLoading', { timeline: this.timelineName, value: false })
},
methods: {
showNewStatuses () {
diff --git a/src/components/user_finder/user_finder.js b/src/components/user_finder/user_finder.js
index abd40d51..a743b5f6 100644
--- a/src/components/user_finder/user_finder.js
+++ b/src/components/user_finder/user_finder.js
@@ -7,6 +7,7 @@ const UserFinder = {
}),
methods: {
findUser (username) {
+ username = username[0] === '@' ? username.slice(1) : username
this.loading = true
this.$store.state.api.backendInteractor.externalProfile(username)
.then((user) => {
diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js
index 48a8a073..26be1801 100644
--- a/src/components/user_profile/user_profile.js
+++ b/src/components/user_profile/user_profile.js
@@ -5,6 +5,9 @@ const UserProfile = {
created () {
this.$store.commit('clearTimeline', { timeline: 'user' })
this.$store.dispatch('startFetching', ['user', this.userId])
+ if (!this.$store.state.users.usersObject[this.userId]) {
+ this.$store.dispatch('fetchUser', this.userId)
+ }
},
destroyed () {
this.$store.dispatch('stopFetching', 'user')
@@ -18,7 +21,7 @@ const UserProfile = {
if (this.timeline.statuses[0]) {
return this.timeline.statuses[0].user
} else {
- return false
+ return this.$store.state.users.usersObject[this.userId] || false
}
}
},
diff --git a/src/i18n/messages.js b/src/i18n/messages.js
index 8671346d..2b828f18 100644
--- a/src/i18n/messages.js
+++ b/src/i18n/messages.js
@@ -9,6 +9,8 @@ const de = {
follows_you: 'Folgt dir!',
following: 'Folgst du!',
follow: 'Folgen',
+ blocked: 'Blockiert!',
+ block: 'Blockieren',
statuses: 'Beiträge',
mute: 'Stummschalten',
muted: 'Stummgeschaltet',
@@ -20,7 +22,8 @@ const de = {
show_new: 'Zeige Neuere',
error_fetching: 'Error beim Laden',
up_to_date: 'Aktuell',
- load_older: 'Lade ältere Beiträge'
+ load_older: 'Lade ältere Beiträge',
+ conversation: 'Unterhaltung'
},
settings: {
user_settings: 'Benutzereinstellungen',
@@ -36,14 +39,15 @@ const de = {
profile_background: 'Profil Hintergrund',
set_new_profile_background: 'Setze neuen Profil Hintergrund',
settings: 'Einstellungen',
- theme: 'Theme',
+ theme: 'Farbschema',
filtering: 'Filter',
filtering_explanation: 'Alle Beiträge die diese Wörter enthalten werden ausgeblendet. Ein Wort pro Zeile.',
attachments: 'Anhänge',
hide_attachments_in_tl: 'Anhänge in der Timeline ausblenden',
hide_attachments_in_convo: 'Anhänge in Unterhaltungen ausblenden',
nsfw_clickthrough: 'Aktiviere ausblendbares Overlay für als NSFW markierte Anhänge',
- autoload: 'Aktiviere automatisches Laden von Beiträgen beim scrollen',
+ autoload: 'Aktiviere automatisches Laden von älteren Beiträgen beim scrollen',
+ streaming: 'Aktiviere automatisches Laden (Streaming) von neuen Beiträgen',
reply_link_preview: 'Aktiviere reply-link Vorschau bei Maus-Hover'
},
notifications: {
@@ -51,6 +55,28 @@ const de = {
read: 'Gelesen!',
followed_you: 'folgt dir'
},
+ login: {
+ login: 'Anmelden',
+ username: 'Benutzername',
+ password: 'Passwort',
+ register: 'Registrieren',
+ logout: 'Abmelden'
+ },
+ registration: {
+ registration: 'Registrierung',
+ fullname: 'Angezeigter Name',
+ email: 'Email',
+ bio: 'Bio',
+ password_confirm: 'Passwort bestätigen'
+ },
+ post_status: {
+ posting: 'Veröffentlichen',
+ default: 'Sitze gerade im Hofbräuhaus.'
+ },
+ finder: {
+ find_user: 'Finde Benutzer',
+ error_fetching_user: 'Fehler beim Suchen des Benutzers'
+ },
general: {
submit: 'Absenden'
}
diff --git a/src/modules/users.js b/src/modules/users.js
index c8b6f0de..30f8dc27 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -57,6 +57,10 @@ const users = {
state: defaultState,
mutations,
actions: {
+ fetchUser (store, id) {
+ store.rootState.api.backendInteractor.fetchUser({id})
+ .then((user) => store.commit('addNewUsers', user))
+ },
addNewStatuses (store, { statuses }) {
const users = map(statuses, 'user')
const retweetedUsers = compact(map(statuses, 'retweeted_status.user'))
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 5abaea7e..5de0a457 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -28,7 +28,7 @@ const EXTERNAL_PROFILE_URL = '/api/externalprofile/show.json'
const QVITTER_USER_TIMELINE_URL = '/api/qvitter/statuses/user_timeline.json'
const BLOCKING_URL = '/api/blocks/create.json'
const UNBLOCKING_URL = '/api/blocks/destroy.json'
-// const USER_URL = '/api/users/show.json'
+const USER_URL = '/api/users/show.json'
import { each, map } from 'lodash'
import 'whatwg-fetch'
@@ -202,6 +202,12 @@ const unblockUser = ({id, credentials}) => {
}).then((data) => data.json())
}
+const fetchUser = ({id, credentials}) => {
+ let url = `${USER_URL}?user_id=${id}`
+ return fetch(url, { headers: authHeaders(credentials) })
+ .then((data) => data.json())
+}
+
const fetchFriends = ({id, credentials}) => {
let url = `${FRIENDS_URL}?user_id=${id}`
return fetch(url, { headers: authHeaders(credentials) })
@@ -363,6 +369,7 @@ const apiService = {
unfollowUser,
blockUser,
unblockUser,
+ fetchUser,
favorite,
unfavorite,
retweet,
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index 51a46e45..ddaae3b2 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -22,6 +22,10 @@ const backendInteractorService = (credentials) => {
return apiService.fetchAllFollowing({username, credentials})
}
+ const fetchUser = ({id}) => {
+ return apiService.fetchUser({id, credentials})
+ }
+
const followUser = (id) => {
return apiService.followUser({credentials, id})
}
@@ -65,6 +69,7 @@ const backendInteractorService = (credentials) => {
unfollowUser,
blockUser,
unblockUser,
+ fetchUser,
fetchAllFollowing,
verifyCredentials: apiService.verifyCredentials,
startFetching,