summaryrefslogtreecommitdiff
path: root/src/client/components/note-detailed.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/components/note-detailed.vue')
-rw-r--r--src/client/components/note-detailed.vue44
1 files changed, 22 insertions, 22 deletions
diff --git a/src/client/components/note-detailed.vue b/src/client/components/note-detailed.vue
index fb4f9502b3..b25c97543b 100644
--- a/src/client/components/note-detailed.vue
+++ b/src/client/components/note-detailed.vue
@@ -1,6 +1,6 @@
<template>
<div
- class="note _panel"
+ class="note _block"
v-if="!muted"
v-show="!isDeleted"
:tabindex="!isDeleted ? '-1' : null"
@@ -120,11 +120,11 @@
</template>
<script lang="ts">
-import { computed, defineAsyncComponent, defineComponent, markRaw, ref } from 'vue';
-import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip } from '@fortawesome/free-solid-svg-icons';
+import { defineAsyncComponent, defineComponent, markRaw } from 'vue';
+import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip, faShareAlt } from '@fortawesome/free-solid-svg-icons';
import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
-import { parse } from '../../mfm/parse';
-import { sum, unique } from '../../prelude/array';
+import * as mfm from 'mfm-js';
+import { sum } from '../../prelude/array';
import XSub from './note.sub.vue';
import XNoteHeader from './note-header.vue';
import XNotePreview from './note-preview.vue';
@@ -141,6 +141,7 @@ import { userPage } from '@client/filters/user';
import * as os from '@client/os';
import { noteActions, noteViewInterruptors } from '@client/store';
import { reactionPicker } from '@client/scripts/reaction-picker';
+import { extractUrlFromMfm } from '@/misc/extract-url-from-mfm';
function markRawAll(...xs) {
for (const x of xs) {
@@ -252,21 +253,7 @@ export default defineComponent({
urls(): string[] {
if (this.appearNote.text) {
- const ast = parse(this.appearNote.text);
- // TODO: 再帰的にURL要素がないか調べる
- const urls = unique(ast
- .filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
- .map(t => t.node.props.url));
-
- // unique without hash
- // [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
- const removeHash = x => x.replace(/#[^#]*$/, '');
-
- return urls.reduce((array, url) => {
- const removed = removeHash(url);
- if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
- return array;
- }, []);
+ return extractUrlFromMfm(mfm.parse(this.appearNote.text));
} else {
return null;
}
@@ -638,6 +625,11 @@ export default defineComponent({
window.open(this.appearNote.url || this.appearNote.uri, '_blank');
}
} : undefined,
+ {
+ icon: faShareAlt,
+ text: this.$ts.share,
+ action: this.share
+ },
null,
statePromise.then(state => state.isFavorited ? {
icon: faStar,
@@ -863,6 +855,14 @@ export default defineComponent({
});
},
+ share() {
+ navigator.share({
+ title: this.$t('noteOf', { user: this.appearNote.user.name }),
+ text: this.appearNote.text,
+ url: `${url}/notes/${this.appearNote.id}`
+ });
+ },
+
focus() {
this.$el.focus();
},
@@ -1020,7 +1020,7 @@ export default defineComponent({
margin: 0 0.5em;
padding: 4px 6px;
font-size: 80%;
- border: solid 1px var(--divider);
+ border: solid 0.5px var(--divider);
border-radius: 4px;
}
@@ -1123,7 +1123,7 @@ export default defineComponent({
}
> .reply {
- border-top: solid 1px var(--divider);
+ border-top: solid 0.5px var(--divider);
}
&.max-width_500px {