summaryrefslogtreecommitdiff
path: root/src/client/components
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-04-16 00:21:56 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-04-16 00:21:56 +0900
commit5e1d17dff24fefd8e306ae597601f0593fa40b09 (patch)
tree97b78f715bfe5d8456a594b2f8924c1dea509742 /src/client/components
parentMerge branch 'develop' (diff)
parent12.76.1 (diff)
downloadmisskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.gz
misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.bz2
misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.zip
Merge branch 'develop'
Diffstat (limited to 'src/client/components')
-rw-r--r--src/client/components/date-separated-list.vue14
-rw-r--r--src/client/components/mfm.ts11
-rw-r--r--src/client/components/notifications.vue5
-rw-r--r--src/client/components/post-form.vue48
4 files changed, 64 insertions, 14 deletions
diff --git a/src/client/components/date-separated-list.vue b/src/client/components/date-separated-list.vue
index 433655d6ed..833cdfc898 100644
--- a/src/client/components/date-separated-list.vue
+++ b/src/client/components/date-separated-list.vue
@@ -24,11 +24,9 @@ export default defineComponent({
methods: {
focus() {
this.$slots.default[0].elm.focus();
- }
- },
+ },
- render() {
- const getDateText = (time: string) => {
+ getDateText(time: string) {
const date = new Date(time).getDate();
const month = new Date(time).getMonth() + 1;
return this.$t('monthAndDay', {
@@ -36,9 +34,13 @@ export default defineComponent({
day: date.toString()
});
}
+ },
+ render() {
const noGap = [...document.querySelectorAll('._noGap_')].some(el => el.contains(this.$parent.$el));
+ if (this.items.length === 0) return;
+
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
class: 'sqadhkmv' + (noGap ? ' _block' : ''),
name: 'list',
@@ -72,10 +74,10 @@ export default defineComponent({
class: 'icon',
icon: faAngleUp,
}),
- getDateText(item.createdAt)
+ this.getDateText(item.createdAt)
]),
h('span', [
- getDateText(this.items[i + 1].createdAt),
+ this.getDateText(this.items[i + 1].createdAt),
h(FontAwesomeIcon, {
class: 'icon',
icon: faAngleDown,
diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts
index b8e948a188..3b08c83c7f 100644
--- a/src/client/components/mfm.ts
+++ b/src/client/components/mfm.ts
@@ -58,10 +58,13 @@ export default defineComponent({
const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n');
if (!this.plain) {
- const x = text.split('\n')
- .map(t => t == '' ? [h('br')] : [t, h('br')]);
- x[x.length - 1].pop();
- return x;
+ const res = [];
+ for (const t of text.split('\n')) {
+ res.push(h('br'));
+ res.push(t);
+ }
+ res.shift();
+ return res;
} else {
return [text.replace(/\n/g, ' ')];
}
diff --git a/src/client/components/notifications.vue b/src/client/components/notifications.vue
index baafa86f4d..0891108d8b 100644
--- a/src/client/components/notifications.vue
+++ b/src/client/components/notifications.vue
@@ -1,7 +1,6 @@
<template>
-<div class="mfcuwfyp _noGap_">
- <div class="_magnet"></div>
- <XList class="notifications" :items="items" v-slot="{ item: notification }">
+<div class="mfcuwfyp _noGap_ _magnetParent">
+ <XList class="notifications _magnetChild" :items="items" v-slot="{ item: notification }">
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
</XList>
diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue
index ce79f34d62..4c6a9ebc95 100644
--- a/src/client/components/post-form.vue
+++ b/src/client/components/post-form.vue
@@ -34,6 +34,7 @@
<button @click="addVisibleUser" class="_buttonPrimary"><Fa :icon="faPlus" fixed-width/></button>
</div>
</div>
+ <MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
@@ -71,12 +72,14 @@ import { selectFile } from '@client/scripts/select-file';
import { notePostInterruptors, postFormActions } from '@client/store';
import { isMobile } from '@client/scripts/is-mobile';
import { throttle } from 'throttle-debounce';
+import MkInfo from '@client/components/ui/info.vue';
export default defineComponent({
components: {
XNotePreview,
XPostFormAttaches: defineAsyncComponent(() => import('./post-form-attaches.vue')),
- XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue'))
+ XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')),
+ MkInfo,
},
inject: ['modal'],
@@ -143,6 +146,7 @@ export default defineComponent({
autocomplete: null,
draghover: false,
quoteId: null,
+ hasNotSpecifiedMentions: false,
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
imeText: '',
typing: throttle(3000, () => {
@@ -214,6 +218,18 @@ export default defineComponent({
}
},
+ watch: {
+ text() {
+ this.checkMissingMention();
+ },
+ visibleUsers: {
+ handler() {
+ this.checkMissingMention();
+ },
+ deep: true
+ }
+ },
+
mounted() {
if (this.initialText) {
this.text = this.initialText;
@@ -338,6 +354,32 @@ export default defineComponent({
this.$watch('localOnly', () => this.saveDraft());
},
+ checkMissingMention() {
+ if (this.visibility === 'specified') {
+ const ast = mfm.parse(this.text);
+
+ for (const x of extractMentions(ast)) {
+ if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) {
+ this.hasNotSpecifiedMentions = true;
+ return;
+ }
+ }
+ this.hasNotSpecifiedMentions = false;
+ }
+ },
+
+ addMissingMention() {
+ const ast = mfm.parse(this.text);
+
+ for (const x of extractMentions(ast)) {
+ if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) {
+ os.api('users/show', { username: x.username, host: x.host }).then(user => {
+ this.visibleUsers.push(user);
+ });
+ }
+ }
+ },
+
togglePoll() {
if (this.poll) {
this.poll = null;
@@ -741,6 +783,10 @@ export default defineComponent({
}
}
+ > .hasNotSpecifiedMentions {
+ margin: 0 20px 16px 20px;
+ }
+
> .cw,
> .text {
display: block;