forked from AkkomaGang/akkoma-fe
Merge branch '639-2' into 'develop'
Add "Mention user" button to user card Closes #639 See merge request pleroma/pleroma-fe!955
This commit is contained in:
commit
ccba92a27c
13 changed files with 132 additions and 63 deletions
|
@ -8,9 +8,10 @@ import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_pan
|
||||||
import ChatPanel from './components/chat_panel/chat_panel.vue'
|
import ChatPanel from './components/chat_panel/chat_panel.vue'
|
||||||
import MediaModal from './components/media_modal/media_modal.vue'
|
import MediaModal from './components/media_modal/media_modal.vue'
|
||||||
import SideDrawer from './components/side_drawer/side_drawer.vue'
|
import SideDrawer from './components/side_drawer/side_drawer.vue'
|
||||||
import MobilePostStatusModal from './components/mobile_post_status_modal/mobile_post_status_modal.vue'
|
import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue'
|
||||||
import MobileNav from './components/mobile_nav/mobile_nav.vue'
|
import MobileNav from './components/mobile_nav/mobile_nav.vue'
|
||||||
import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue'
|
import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue'
|
||||||
|
import PostStatusModal from './components/post_status_modal/post_status_modal.vue'
|
||||||
import { windowWidth } from './services/window_utils/window_utils'
|
import { windowWidth } from './services/window_utils/window_utils'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
@ -26,9 +27,10 @@ export default {
|
||||||
ChatPanel,
|
ChatPanel,
|
||||||
MediaModal,
|
MediaModal,
|
||||||
SideDrawer,
|
SideDrawer,
|
||||||
MobilePostStatusModal,
|
MobilePostStatusButton,
|
||||||
MobileNav,
|
MobileNav,
|
||||||
UserReportingModal
|
UserReportingModal,
|
||||||
|
PostStatusModal
|
||||||
},
|
},
|
||||||
data: () => ({
|
data: () => ({
|
||||||
mobileActivePanel: 'timeline',
|
mobileActivePanel: 'timeline',
|
||||||
|
|
|
@ -107,8 +107,9 @@
|
||||||
:floating="true"
|
:floating="true"
|
||||||
class="floating-chat mobile-hidden"
|
class="floating-chat mobile-hidden"
|
||||||
/>
|
/>
|
||||||
<MobilePostStatusModal />
|
<MobilePostStatusButton />
|
||||||
<UserReportingModal />
|
<UserReportingModal />
|
||||||
|
<PostStatusModal />
|
||||||
<portal-target name="modal" />
|
<portal-target name="modal" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,14 +1,9 @@
|
||||||
import PostStatusForm from '../post_status_form/post_status_form.vue'
|
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
|
|
||||||
const MobilePostStatusModal = {
|
const MobilePostStatusButton = {
|
||||||
components: {
|
|
||||||
PostStatusForm
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
hidden: false,
|
hidden: false,
|
||||||
postFormOpen: false,
|
|
||||||
scrollingDown: false,
|
scrollingDown: false,
|
||||||
inputActive: false,
|
inputActive: false,
|
||||||
oldScrollPos: 0,
|
oldScrollPos: 0,
|
||||||
|
@ -28,8 +23,8 @@ const MobilePostStatusModal = {
|
||||||
window.removeEventListener('resize', this.handleOSK)
|
window.removeEventListener('resize', this.handleOSK)
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
currentUser () {
|
isLoggedIn () {
|
||||||
return this.$store.state.users.currentUser
|
return !!this.$store.state.users.currentUser
|
||||||
},
|
},
|
||||||
isHidden () {
|
isHidden () {
|
||||||
return this.autohideFloatingPostButton && (this.hidden || this.inputActive)
|
return this.autohideFloatingPostButton && (this.hidden || this.inputActive)
|
||||||
|
@ -57,17 +52,7 @@ const MobilePostStatusModal = {
|
||||||
window.removeEventListener('scroll', this.handleScrollEnd)
|
window.removeEventListener('scroll', this.handleScrollEnd)
|
||||||
},
|
},
|
||||||
openPostForm () {
|
openPostForm () {
|
||||||
this.postFormOpen = true
|
this.$store.dispatch('openPostStatusModal')
|
||||||
this.hidden = true
|
|
||||||
|
|
||||||
const el = this.$el.querySelector('textarea')
|
|
||||||
this.$nextTick(function () {
|
|
||||||
el.focus()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
closePostForm () {
|
|
||||||
this.postFormOpen = false
|
|
||||||
this.hidden = false
|
|
||||||
},
|
},
|
||||||
handleOSK () {
|
handleOSK () {
|
||||||
// This is a big hack: we're guessing from changed window sizes if the
|
// This is a big hack: we're guessing from changed window sizes if the
|
||||||
|
@ -105,4 +90,4 @@ const MobilePostStatusModal = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default MobilePostStatusModal
|
export default MobilePostStatusButton
|
|
@ -1,23 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="currentUser">
|
<div v-if="isLoggedIn">
|
||||||
<div
|
|
||||||
v-show="postFormOpen"
|
|
||||||
class="post-form-modal-view modal-view"
|
|
||||||
@click="closePostForm"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="post-form-modal-panel panel"
|
|
||||||
@click.stop=""
|
|
||||||
>
|
|
||||||
<div class="panel-heading">
|
|
||||||
{{ $t('post_status.new_status') }}
|
|
||||||
</div>
|
|
||||||
<PostStatusForm
|
|
||||||
class="panel-body"
|
|
||||||
@posted="closePostForm"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button
|
<button
|
||||||
class="new-status-button"
|
class="new-status-button"
|
||||||
:class="{ 'hidden': isHidden }"
|
:class="{ 'hidden': isHidden }"
|
||||||
|
@ -28,27 +10,11 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script src="./mobile_post_status_modal.js"></script>
|
<script src="./mobile_post_status_button.js"></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@import '../../_variables.scss';
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
.post-form-modal-view {
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-form-modal-panel {
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin-top: 25%;
|
|
||||||
margin-bottom: 2em;
|
|
||||||
width: 100%;
|
|
||||||
max-width: 700px;
|
|
||||||
|
|
||||||
@media (orientation: landscape) {
|
|
||||||
margin-top: 8%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-status-button {
|
.new-status-button {
|
||||||
width: 5em;
|
width: 5em;
|
||||||
height: 5em;
|
height: 5em;
|
|
@ -8,7 +8,7 @@ import fileTypeService from '../../services/file_type/file_type.service.js'
|
||||||
import { reject, map, uniqBy } from 'lodash'
|
import { reject, map, uniqBy } from 'lodash'
|
||||||
import suggestor from '../emoji-input/suggestor.js'
|
import suggestor from '../emoji-input/suggestor.js'
|
||||||
|
|
||||||
const buildMentionsString = ({ user, attentions }, currentUser) => {
|
const buildMentionsString = ({ user, attentions = [] }, currentUser) => {
|
||||||
let allAttentions = [...attentions]
|
let allAttentions = [...attentions]
|
||||||
|
|
||||||
allAttentions.unshift(user)
|
allAttentions.unshift(user)
|
||||||
|
|
32
src/components/post_status_modal/post_status_modal.js
Normal file
32
src/components/post_status_modal/post_status_modal.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import PostStatusForm from '../post_status_form/post_status_form.vue'
|
||||||
|
|
||||||
|
const PostStatusModal = {
|
||||||
|
components: {
|
||||||
|
PostStatusForm
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
isLoggedIn () {
|
||||||
|
return !!this.$store.state.users.currentUser
|
||||||
|
},
|
||||||
|
isOpen () {
|
||||||
|
return this.isLoggedIn && this.$store.state.postStatus.modalActivated
|
||||||
|
},
|
||||||
|
params () {
|
||||||
|
return this.$store.state.postStatus.params || {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
isOpen (val) {
|
||||||
|
if (val) {
|
||||||
|
this.$nextTick(() => this.$el.querySelector('textarea').focus())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
closeModal () {
|
||||||
|
this.$store.dispatch('closePostStatusModal')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PostStatusModal
|
43
src/components/post_status_modal/post_status_modal.vue
Normal file
43
src/components/post_status_modal/post_status_modal.vue
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
v-if="isOpen"
|
||||||
|
class="post-form-modal-view modal-view"
|
||||||
|
@click="closeModal"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="post-form-modal-panel panel"
|
||||||
|
@click.stop=""
|
||||||
|
>
|
||||||
|
<div class="panel-heading">
|
||||||
|
{{ $t('post_status.new_status') }}
|
||||||
|
</div>
|
||||||
|
<PostStatusForm
|
||||||
|
class="panel-body"
|
||||||
|
v-bind="params"
|
||||||
|
@posted="closeModal"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./post_status_modal.js"></script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
|
.post-form-modal-view {
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-form-modal-panel {
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-top: 25%;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 700px;
|
||||||
|
|
||||||
|
@media (orientation: landscape) {
|
||||||
|
margin-top: 8%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -168,6 +168,9 @@ export default {
|
||||||
}
|
}
|
||||||
this.$store.dispatch('setMedia', [attachment])
|
this.$store.dispatch('setMedia', [attachment])
|
||||||
this.$store.dispatch('setCurrent', attachment)
|
this.$store.dispatch('setCurrent', attachment)
|
||||||
|
},
|
||||||
|
mentionUser () {
|
||||||
|
this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,6 +188,15 @@
|
||||||
</ProgressButton>
|
</ProgressButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
class="btn btn-default btn-block"
|
||||||
|
@click="mentionUser"
|
||||||
|
>
|
||||||
|
{{ $t('user_card.mention') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
v-if="user.muted"
|
v-if="user.muted"
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
rounded="top"
|
rounded="top"
|
||||||
/>
|
/>
|
||||||
<div class="panel-footer">
|
<div class="panel-footer">
|
||||||
<post-status-form v-if="user" />
|
<post-status-form />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<auth-form
|
<auth-form
|
||||||
|
|
|
@ -529,6 +529,7 @@
|
||||||
"follows_you": "Follows you!",
|
"follows_you": "Follows you!",
|
||||||
"its_you": "It's you!",
|
"its_you": "It's you!",
|
||||||
"media": "Media",
|
"media": "Media",
|
||||||
|
"mention": "Mention",
|
||||||
"mute": "Mute",
|
"mute": "Mute",
|
||||||
"muted": "Muted",
|
"muted": "Muted",
|
||||||
"per_day": "per day",
|
"per_day": "per day",
|
||||||
|
|
|
@ -15,6 +15,7 @@ import mediaViewerModule from './modules/media_viewer.js'
|
||||||
import oauthTokensModule from './modules/oauth_tokens.js'
|
import oauthTokensModule from './modules/oauth_tokens.js'
|
||||||
import reportsModule from './modules/reports.js'
|
import reportsModule from './modules/reports.js'
|
||||||
import pollsModule from './modules/polls.js'
|
import pollsModule from './modules/polls.js'
|
||||||
|
import postStatusModule from './modules/postStatus.js'
|
||||||
|
|
||||||
import VueI18n from 'vue-i18n'
|
import VueI18n from 'vue-i18n'
|
||||||
|
|
||||||
|
@ -76,7 +77,8 @@ const persistedStateOptions = {
|
||||||
mediaViewer: mediaViewerModule,
|
mediaViewer: mediaViewerModule,
|
||||||
oauthTokens: oauthTokensModule,
|
oauthTokens: oauthTokensModule,
|
||||||
reports: reportsModule,
|
reports: reportsModule,
|
||||||
polls: pollsModule
|
polls: pollsModule,
|
||||||
|
postStatus: postStatusModule
|
||||||
},
|
},
|
||||||
plugins: [persistedState, pushNotifications],
|
plugins: [persistedState, pushNotifications],
|
||||||
strict: false // Socket modifies itself, let's ignore this for now.
|
strict: false // Socket modifies itself, let's ignore this for now.
|
||||||
|
|
25
src/modules/postStatus.js
Normal file
25
src/modules/postStatus.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
const postStatus = {
|
||||||
|
state: {
|
||||||
|
params: null,
|
||||||
|
modalActivated: false
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
openPostStatusModal (state, params) {
|
||||||
|
state.params = params
|
||||||
|
state.modalActivated = true
|
||||||
|
},
|
||||||
|
closePostStatusModal (state) {
|
||||||
|
state.modalActivated = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
openPostStatusModal ({ commit }, params) {
|
||||||
|
commit('openPostStatusModal', params)
|
||||||
|
},
|
||||||
|
closePostStatusModal ({ commit }) {
|
||||||
|
commit('closePostStatusModal')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default postStatus
|
Loading…
Reference in a new issue