aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/App.js7
-rw-r--r--src/App.scss8
-rw-r--r--src/App.vue2
-rw-r--r--src/components/settings/settings.vue2
-rw-r--r--src/components/user_card_content/user_card_content.js57
-rw-r--r--src/components/user_card_content/user_card_content.vue21
-rw-r--r--src/components/user_finder/user_finder.js1
-rw-r--r--src/components/user_finder/user_finder.vue29
-rw-r--r--src/i18n/en.json4
-rw-r--r--src/i18n/ru.json4
10 files changed, 121 insertions, 14 deletions
diff --git a/src/App.js b/src/App.js
index 89aed01d..4f3fd798 100644
--- a/src/App.js
+++ b/src/App.js
@@ -21,6 +21,7 @@ export default {
},
data: () => ({
mobileActivePanel: 'timeline',
+ finderHidden: true,
supportsMask: window.CSS && window.CSS.supports && (
window.CSS.supports('mask-size', 'contain') ||
window.CSS.supports('-webkit-mask-size', 'contain') ||
@@ -53,7 +54,8 @@ export default {
},
logoBgStyle () {
return Object.assign({
- 'margin': `${this.$store.state.instance.logoMargin} 0`
+ 'margin': `${this.$store.state.instance.logoMargin} 0`,
+ opacity: this.finderHidden ? 1 : 0
}, this.enableMask ? {} : {
'background-color': this.enableMask ? '' : 'transparent'
})
@@ -80,6 +82,9 @@ export default {
logout () {
this.$router.replace('/main/public')
this.$store.dispatch('logout')
+ },
+ onFinderToggled (hidden) {
+ this.finderHidden = hidden
}
}
}
diff --git a/src/App.scss b/src/App.scss
index 0a303b15..7f33cd51 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -269,6 +269,9 @@ nav {
justify-content: center;
flex: 0 0 auto;
z-index: -1;
+ transition: opacity;
+ transition-timing-function: ease-out;
+ transition-duration: 100ms;
.mask {
mask-repeat: no-repeat;
@@ -597,6 +600,11 @@ nav {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
+@media all and (min-width: 959px) {
+ .logo {
+ opacity: 1 !important;
+ }
+}
@media all and (max-width: 959px) {
.mobile-hidden {
diff --git a/src/App.vue b/src/App.vue
index 048c1e77..a3a7ecf6 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -13,7 +13,7 @@
<router-link class="site-name" :to="{ name: 'root' }" active-class="home">{{sitename}}</router-link>
</div>
<div class='item right'>
- <user-finder class="nav-icon"></user-finder>
+ <user-finder class="nav-icon" @toggled="onFinderToggled"></user-finder>
<router-link @click.native="activatePanel('timeline')" :to="{ name: 'settings'}"><i class="icon-cog nav-icon" :title="$t('nav.preferences')"></i></router-link>
<a href="#" v-if="currentUser" @click.prevent="logout"><i class="icon-logout nav-icon" :title="$t('login.logout')"></i></a>
</div>
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 3f920de5..39125009 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -120,7 +120,7 @@
</li>
<ul class="setting-list suboptions" >
<li>
- <input :disabled="!hideAttachmentsInConvLocal" type="checkbox" id="preloadImage" v-model="preloadImage">
+ <input :disabled="!hideNsfwLocal" type="checkbox" id="preloadImage" v-model="preloadImage">
<label for="preloadImage">{{$t('settings.preload_images')}}</label>
</li>
</ul>
diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js
index be7a2349..206dba88 100644
--- a/src/components/user_card_content/user_card_content.js
+++ b/src/components/user_card_content/user_card_content.js
@@ -5,6 +5,8 @@ export default {
props: [ 'user', 'switcher', 'selected', 'hideBio', 'activatePanel' ],
data () {
return {
+ followRequestInProgress: false,
+ followRequestSent: false,
hideUserStatsLocal: typeof this.$store.state.config.hideUserStats === 'undefined'
? this.$store.state.instance.hideUserStats
: this.$store.state.config.hideUserStats,
@@ -84,13 +86,68 @@ export default {
methods: {
followUser () {
const store = this.$store
+ this.followRequestInProgress = true
store.state.api.backendInteractor.followUser(this.user.id)
.then((followedUser) => store.commit('addNewUsers', [followedUser]))
+ .then(() => {
+ // For locked users we just mark it that we sent the follow request
+ if (this.user.locked) {
+ this.followRequestInProgress = false
+ this.followRequestSent = true
+ return
+ }
+
+ if (this.user.following) {
+ // If we get result immediately, just stop.
+ this.followRequestInProgress = false
+ return
+ }
+
+ // But usually we don't get result immediately, so we ask server
+ // for updated user profile to confirm if we are following them
+ // Sometimes it takes several tries. Sometimes we end up not following
+ // user anyway, probably because they locked themselves and we
+ // don't know that yet.
+ // Recursive Promise, it will call itself up to 3 times.
+ const fetchUser = (attempt) => new Promise((resolve, reject) => {
+ setTimeout(() => {
+ store.state.api.backendInteractor.fetchUser({ id: this.user.id })
+ .then((user) => store.commit('addNewUsers', [user]))
+ .then(() => resolve([this.user.following, attempt]))
+ .catch((e) => reject(e))
+ }, 500)
+ }).then(([following, attempt]) => {
+ if (!following && attempt <= 3) {
+ // If we BE reports that we still not following that user - retry,
+ // increment attempts by one
+ return fetchUser(++attempt)
+ } else {
+ // If we run out of attempts, just return whatever status is.
+ return following
+ }
+ })
+
+ return fetchUser(1)
+ .then((following) => {
+ if (following) {
+ // We confirmed and everything its good.
+ this.followRequestInProgress = false
+ } else {
+ // If after all the tries, just treat it as if user is locked
+ this.followRequestInProgress = false
+ this.followRequestSent = true
+ }
+ })
+ })
},
unfollowUser () {
const store = this.$store
+ this.followRequestInProgress = true
store.state.api.backendInteractor.unfollowUser(this.user.id)
.then((unfollowedUser) => store.commit('addNewUsers', [unfollowedUser]))
+ .then(() => {
+ this.followRequestInProgress = false
+ })
},
blockUser () {
const store = this.$store
diff --git a/src/components/user_card_content/user_card_content.vue b/src/components/user_card_content/user_card_content.vue
index 08b25595..a40aff35 100644
--- a/src/components/user_card_content/user_card_content.vue
+++ b/src/components/user_card_content/user_card_content.vue
@@ -44,13 +44,26 @@
<div class="follow" v-if="loggedIn">
<span v-if="user.following">
<!--Following them!-->
- <button @click="unfollowUser" class="pressed">
- {{ $t('user_card.following') }}
+ <button @click="unfollowUser" class="pressed" :disabled="followRequestInProgress" :title="$t('user_card.follow_unfollow')">
+ <template v-if="followRequestInProgress">
+ {{ $t('user_card.follow_progress') }}
+ </template>
+ <template v-else>
+ {{ $t('user_card.following') }}
+ </template>
</button>
</span>
<span v-if="!user.following">
- <button @click="followUser">
- {{ $t('user_card.follow') }}
+ <button @click="followUser" :disabled="followRequestInProgress" :title="followRequestSent ? $t('user_card.follow_again') : ''">
+ <template v-if="followRequestInProgress">
+ {{ $t('user_card.follow_progress') }}
+ </template>
+ <template v-else-if="followRequestSent">
+ {{ $t('user_card.follow_sent') }}
+ </template>
+ <template v-else>
+ {{ $t('user_card.follow') }}
+ </template>
</button>
</span>
</div>
diff --git a/src/components/user_finder/user_finder.js b/src/components/user_finder/user_finder.js
index 74f79d1b..55c6c402 100644
--- a/src/components/user_finder/user_finder.js
+++ b/src/components/user_finder/user_finder.js
@@ -11,6 +11,7 @@ const UserFinder = {
},
toggleHidden () {
this.hidden = !this.hidden
+ this.$emit('toggled', this.hidden)
}
}
}
diff --git a/src/components/user_finder/user_finder.vue b/src/components/user_finder/user_finder.vue
index 4d9f6842..9efdfab7 100644
--- a/src/components/user_finder/user_finder.vue
+++ b/src/components/user_finder/user_finder.vue
@@ -1,11 +1,14 @@
<template>
<div class="user-finder-container">
<i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" />
- <a href="#" v-if="hidden" :title="$t('finder.find_user')" ><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden" /></a>
- <span v-else>
+ <a href="#" v-if="hidden" :title="$t('finder.find_user')"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden" /></a>
+ <template v-else>
<input class="user-finder-input" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/>
+ <button class="btn search-button" @click="findUser(username)">
+ <i class="icon-search"/>
+ </button>
<i class="icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/>
- </span>
+ </template>
</div>
</template>
@@ -16,11 +19,23 @@
.user-finder-container {
max-width: 100%;
-}
+ display: inline-flex;
+ align-items: baseline;
+ vertical-align: baseline;
+
+
+ .user-finder-input,
+ .search-button {
+ height: 29px;
+ }
+ .user-finder-input {
+ max-width: 80%;
+ }
-.user-finder-input {
- max-width: 80%;
- vertical-align: middle;
+ .search-button {
+ margin-left: .5em;
+ margin-right: .5em;
+ }
}
</style>
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 1ce53796..f445bfc2 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -320,6 +320,10 @@
"blocked": "Blocked!",
"deny": "Deny",
"follow": "Follow",
+ "follow_sent": "Request sent!",
+ "follow_progress": "Requesting…",
+ "follow_again": "Send request again?",
+ "follow_unfollow": "Stop following",
"followees": "Following",
"followers": "Followers",
"following": "Following!",
diff --git a/src/i18n/ru.json b/src/i18n/ru.json
index 80598b0c..249eab69 100644
--- a/src/i18n/ru.json
+++ b/src/i18n/ru.json
@@ -280,6 +280,10 @@
"block": "Заблокировать",
"blocked": "Заблокирован",
"follow": "Читать",
+ "follow_sent": "Запрос отправлен!",
+ "follow_progress": "Запрашиваем…",
+ "follow_again": "Запросить еще заново?",
+ "follow_unfollow": "Перестать читать",
"followees": "Читаемые",
"followers": "Читатели",
"following": "Читаю",