aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortaehoon <th.dev91@gmail.com>2019-10-24 16:53:36 -0400
committertaehoon <th.dev91@gmail.com>2019-10-24 16:53:36 -0400
commit62b2648a3e124ac34d960219b925a6c3569e2229 (patch)
treeb74690cf5b8c255fdd29ed868865449e6d8d1d05
parent54a26be90c4e0f770d49fbaa35ae62afd85912bc (diff)
split status preview popover into a separate component
-rw-r--r--src/components/status/status.js25
-rw-r--r--src/components/status/status.vue82
-rw-r--r--src/components/status_popover/status_popover.js43
-rw-r--r--src/components/status_popover/status_popover.vue86
4 files changed, 136 insertions, 100 deletions
diff --git a/src/components/status/status.js b/src/components/status/status.js
index 36455f2a..d3b39175 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -10,11 +10,12 @@ import Gallery from '../gallery/gallery.vue'
import LinkPreview from '../link-preview/link-preview.vue'
import AvatarList from '../avatar_list/avatar_list.vue'
import Timeago from '../timeago/timeago.vue'
+import StatusPopover from '../status_popover/status_popover.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import fileType from 'src/services/file_type/file_type.service'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
-import { filter, find, unescape, uniqBy } from 'lodash'
+import { filter, unescape, uniqBy } from 'lodash'
const Status = {
name: 'Status',
@@ -37,7 +38,6 @@ const Status = {
replying: false,
unmuted: false,
userExpanded: false,
- preview: null,
showingTall: this.inConversation && this.focused,
showingLongSubject: false,
error: null,
@@ -300,7 +300,8 @@ const Status = {
Gallery,
LinkPreview,
AvatarList,
- Timeago
+ Timeago,
+ StatusPopover
},
methods: {
visibilityIcon (visibility) {
@@ -375,24 +376,6 @@ const Status = {
this.expandingSubject = true
}
},
- replyEnter (id, event) {
- const targetId = id
- const statuses = this.$store.state.statuses.allStatuses
-
- if (!this.preview) {
- // if we have the status somewhere already
- this.preview = find(statuses, { 'id': targetId })
- // or if we have to fetch it
- if (!this.preview) {
- this.$store.state.api.backendInteractor.fetchStatus({ id }).then((status) => {
- this.preview = status
- this.$nextTick(this.$refs.statusPreviewPopper.updatePopper)
- })
- }
- } else if (this.preview.id !== targetId) {
- this.preview = find(statuses, { 'id': targetId })
- }
- },
generateUserProfileLink (id, name) {
return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)
},
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index 3edee25a..e91dfd28 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -174,33 +174,10 @@
v-if="isReply"
class="reply-to-and-accountname"
>
- <v-popover
+ <StatusPopover
v-if="!isPreview"
- ref="statusPreviewPopper"
- popover-class="status-popover"
- placement="top-start"
- :popper-options="{
- modifiers: {
- preventOverflow: { padding: { top: 50 }, boundariesElement: 'viewport' },
- }
- }"
- @show="replyEnter(status.in_reply_to_status_id)"
+ :status-id="status.in_reply_to_status_id"
>
- <div slot="popover">
- <status
- v-if="preview"
- :is-preview="true"
- :statusoid="preview"
- :compact="true"
- />
- <div
- v-else
- class="status-preview-loading"
- >
- <i class="icon-spin4 animate-spin" />
- </div>
- </div>
-
<a
class="reply-to"
href="#"
@@ -210,7 +187,7 @@
<i class="button-icon icon-reply" />
<span class="faint-link reply-to-text">{{ $t('status.reply_to') }}</span>
</a>
- </v-popover>
+ </StatusPopover>
<span
v-else
class="reply-to"
@@ -863,59 +840,6 @@ a.unmute {
}
}
-.tooltip.popover.status-popover {
- font-size: 1rem;
- min-width: 15em;
- max-width: 95%;
- margin-left: 0.5em;
-
- .popover-inner {
- border-color: $fallback--border;
- border-color: var(--border, $fallback--border);
- border-style: solid;
- border-width: 1px;
- border-radius: $fallback--tooltipRadius;
- border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
- box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
- box-shadow: var(--popupShadow);
- }
-
- .popover-arrow::before {
- position: absolute;
- content: '';
- left: -7px;
- border: solid 7px transparent;
- z-index: -1;
- }
-
- &[x-placement^="bottom-start"] .popover-arrow::before {
- top: -2px;
- border-top-width: 0;
- border-bottom-color: $fallback--border;
- border-bottom-color: var(--border, $fallback--border);
- }
-
- &[x-placement^="top-start"] .popover-arrow::before {
- bottom: -2px;
- border-bottom-width: 0;
- border-top-color: $fallback--border;
- border-top-color: var(--border, $fallback--border);
- }
-
- .status-el.status-el {
- border: none;
- }
-
- .status-preview-loading {
- padding: 1em;
- text-align: center;
-
- i {
- font-size: 2em;
- }
- }
-}
-
.favs-repeated-users {
margin-top: $status-margin;
diff --git a/src/components/status_popover/status_popover.js b/src/components/status_popover/status_popover.js
new file mode 100644
index 00000000..91b64f72
--- /dev/null
+++ b/src/components/status_popover/status_popover.js
@@ -0,0 +1,43 @@
+import { find } from 'lodash'
+
+const StatusPopover = {
+ name: 'StatusPopover',
+ props: [
+ 'statusId'
+ ],
+ data () {
+ return {
+ preview: null,
+ popperOptions: {
+ modifiers: {
+ preventOverflow: { padding: { top: 50 }, boundariesElement: 'viewport' }
+ }
+ }
+ }
+ },
+ components: {
+ Status: () => import('../status/status.vue')
+ },
+ methods: {
+ enter () {
+ const id = this.statusId
+ const statuses = this.$store.state.statuses.allStatuses
+
+ if (!this.preview) {
+ // if we have the status somewhere already
+ this.preview = find(statuses, { id })
+ // or if we have to fetch it
+ if (!this.preview) {
+ this.$store.state.api.backendInteractor.fetchStatus({ id }).then((status) => {
+ this.preview = status
+ this.$nextTick(this.$refs.popper.updatePopper)
+ })
+ }
+ } else if (this.preview.id !== id) {
+ this.preview = find(statuses, 'id')
+ }
+ }
+ }
+}
+
+export default StatusPopover
diff --git a/src/components/status_popover/status_popover.vue b/src/components/status_popover/status_popover.vue
new file mode 100644
index 00000000..b0975afb
--- /dev/null
+++ b/src/components/status_popover/status_popover.vue
@@ -0,0 +1,86 @@
+<template>
+ <v-popover
+ ref="popper"
+ popover-class="status-popover"
+ placement="top-start"
+ :popper-options="popperOptions"
+ @show="enter()"
+ >
+ <div slot="popover">
+ <Status
+ v-if="preview"
+ :is-preview="true"
+ :statusoid="preview"
+ :compact="true"
+ />
+ <div
+ v-else
+ class="status-preview-loading"
+ >
+ <i class="icon-spin4 animate-spin" />
+ </div>
+ </div>
+
+ <slot />
+ </v-popover>
+</template>
+
+<script src="./status_popover.js" ></script>
+
+<style lang="scss">
+@import '../../_variables.scss';
+
+.tooltip.popover.status-popover {
+ font-size: 1rem;
+ min-width: 15em;
+ max-width: 95%;
+ margin-left: 0.5em;
+
+ .popover-inner {
+ border-color: $fallback--border;
+ border-color: var(--border, $fallback--border);
+ border-style: solid;
+ border-width: 1px;
+ border-radius: $fallback--tooltipRadius;
+ border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
+ box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
+ box-shadow: var(--popupShadow);
+ }
+
+ .popover-arrow::before {
+ position: absolute;
+ content: '';
+ left: -7px;
+ border: solid 7px transparent;
+ z-index: -1;
+ }
+
+ &[x-placement^="bottom-start"] .popover-arrow::before {
+ top: -2px;
+ border-top-width: 0;
+ border-bottom-color: $fallback--border;
+ border-bottom-color: var(--border, $fallback--border);
+ }
+
+ &[x-placement^="top-start"] .popover-arrow::before {
+ bottom: -2px;
+ border-bottom-width: 0;
+ border-top-color: $fallback--border;
+ border-top-color: var(--border, $fallback--border);
+ }
+
+ .status-el.status-el {
+ border: none;
+ }
+
+ .status-preview-loading {
+ padding: 1em;
+ text-align: center;
+
+ i {
+ font-size: 2em;
+ }
+ }
+}
+
+</style>