summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2023-11-03 17:34:23 +0900
committerGitHub <noreply@github.com>2023-11-03 17:34:23 +0900
commit39a3f4ae98ebe436ed023fab737a823717da5e0b (patch)
treecadb9e1bb9d24f16527fe6fb912d6a746cc59748 /packages/frontend/src/components
parentfix(frontend): In deck layout, replies option is not saved after refresh (diff)
downloadmisskey-39a3f4ae98ebe436ed023fab737a823717da5e0b.tar.gz
misskey-39a3f4ae98ebe436ed023fab737a823717da5e0b.tar.bz2
misskey-39a3f4ae98ebe436ed023fab737a823717da5e0b.zip
feat: チャンネル内→チャンネル外へのリノート制限機能追加 (#12230)
* チャンネル内→チャンネル外へのリノート制限機能追加 * fix CHANGELOG.md * コメント対応(canRenoteSwitch→allowRenoteToExternal) * コメント対応(別チャンネルへのリノート対策) * コメント対応(canRenote->allowRenoteToExternal) * fix comment * Update misskey-js.api.md * :v: --------- Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src/components')
-rw-r--r--packages/frontend/src/components/MkNote.vue97
-rw-r--r--packages/frontend/src/components/MkNoteDetailed.vue69
2 files changed, 8 insertions, 158 deletions
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index d71b07c51b..30a68f38f2 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -159,7 +159,7 @@ import { reactionPicker } from '@/scripts/reaction-picker.js';
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm.js';
import { $i } from '@/account.js';
import { i18n } from '@/i18n.js';
-import { getAbuseNoteMenu, getCopyNoteLinkMenu, getNoteClipMenu, getNoteMenu } from '@/scripts/get-note-menu.js';
+import { getAbuseNoteMenu, getCopyNoteLinkMenu, getNoteClipMenu, getNoteMenu, getRenoteMenu } from '@/scripts/get-note-menu.js';
import { useNoteCapture } from '@/scripts/use-note-capture.js';
import { deepClone } from '@/scripts/clone.js';
import { useTooltip } from '@/scripts/use-tooltip.js';
@@ -275,103 +275,14 @@ if (!props.mock) {
});
}
-type Visibility = 'public' | 'home' | 'followers' | 'specified';
-
-// defaultStore.state.visibilityがstringなためstringも受け付けている
-function smallerVisibility(a: Visibility | string, b: Visibility | string): Visibility {
- if (a === 'specified' || b === 'specified') return 'specified';
- if (a === 'followers' || b === 'followers') return 'followers';
- if (a === 'home' || b === 'home') return 'home';
- // if (a === 'public' || b === 'public')
- return 'public';
-}
-
function renote(viaKeyboard = false) {
pleaseLogin();
showMovedDialog();
- let items = [] as MenuItem[];
-
- if (appearNote.channel) {
- items = items.concat([{
- text: i18n.ts.inChannelRenote,
- icon: 'ti ti-repeat',
- action: () => {
- const el = renoteButton.value as HTMLElement | null | undefined;
- if (el) {
- const rect = el.getBoundingClientRect();
- const x = rect.left + (el.offsetWidth / 2);
- const y = rect.top + (el.offsetHeight / 2);
- os.popup(MkRippleEffect, { x, y }, {}, 'end');
- }
-
- if (!props.mock) {
- os.api('notes/create', {
- renoteId: appearNote.id,
- channelId: appearNote.channelId,
- }).then(() => {
- os.toast(i18n.ts.renoted);
- });
- }
- },
- }, {
- text: i18n.ts.inChannelQuote,
- icon: 'ti ti-quote',
- action: () => {
- if (!props.mock) {
- os.post({
- renote: appearNote,
- channel: appearNote.channel,
- });
- }
- },
- }, null]);
- }
-
- items = items.concat([{
- text: i18n.ts.renote,
- icon: 'ti ti-repeat',
- action: () => {
- const el = renoteButton.value as HTMLElement | null | undefined;
- if (el) {
- const rect = el.getBoundingClientRect();
- const x = rect.left + (el.offsetWidth / 2);
- const y = rect.top + (el.offsetHeight / 2);
- os.popup(MkRippleEffect, { x, y }, {}, 'end');
- }
-
- const configuredVisibility = defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility;
- const localOnly = defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly;
-
- let visibility = appearNote.visibility;
- visibility = smallerVisibility(visibility, configuredVisibility);
- if (appearNote.channel?.isSensitive) {
- visibility = smallerVisibility(visibility, 'home');
- }
-
- if (!props.mock) {
- os.api('notes/create', {
- localOnly,
- visibility,
- renoteId: appearNote.id,
- }).then(() => {
- os.toast(i18n.ts.renoted);
- });
- }
- },
- }, (props.mock) ? undefined : {
- text: i18n.ts.quote,
- icon: 'ti ti-quote',
- action: () => {
- os.post({
- renote: appearNote,
- });
- },
- }]);
-
- os.popupMenu(items, renoteButton.value, {
+ const { menu } = getRenoteMenu({ note: note, renoteButton, mock: props.mock });
+ os.popupMenu(menu, renoteButton.value, {
viaKeyboard,
- });
+ }).then(focus);
}
function reply(viaKeyboard = false): void {
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index d34d35a0c3..9e9b1035d7 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -206,7 +206,7 @@ import { reactionPicker } from '@/scripts/reaction-picker.js';
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm.js';
import { $i } from '@/account.js';
import { i18n } from '@/i18n.js';
-import { getNoteClipMenu, getNoteMenu } from '@/scripts/get-note-menu.js';
+import { getNoteClipMenu, getNoteMenu, getRenoteMenu } from '@/scripts/get-note-menu.js';
import { useNoteCapture } from '@/scripts/use-note-capture.js';
import { deepClone } from '@/scripts/clone.js';
import { useTooltip } from '@/scripts/use-tooltip.js';
@@ -325,71 +325,10 @@ function renote(viaKeyboard = false) {
pleaseLogin();
showMovedDialog();
- let items = [] as MenuItem[];
-
- if (appearNote.channel) {
- items = items.concat([{
- text: i18n.ts.inChannelRenote,
- icon: 'ti ti-repeat',
- action: () => {
- const el = renoteButton.value as HTMLElement | null | undefined;
- if (el) {
- const rect = el.getBoundingClientRect();
- const x = rect.left + (el.offsetWidth / 2);
- const y = rect.top + (el.offsetHeight / 2);
- os.popup(MkRippleEffect, { x, y }, {}, 'end');
- }
-
- os.api('notes/create', {
- renoteId: appearNote.id,
- channelId: appearNote.channelId,
- }).then(() => {
- os.toast(i18n.ts.renoted);
- });
- },
- }, {
- text: i18n.ts.inChannelQuote,
- icon: 'ti ti-quote',
- action: () => {
- os.post({
- renote: appearNote,
- channel: appearNote.channel,
- });
- },
- }, null]);
- }
-
- items = items.concat([{
- text: i18n.ts.renote,
- icon: 'ti ti-repeat',
- action: () => {
- const el = renoteButton.value as HTMLElement | null | undefined;
- if (el) {
- const rect = el.getBoundingClientRect();
- const x = rect.left + (el.offsetWidth / 2);
- const y = rect.top + (el.offsetHeight / 2);
- os.popup(MkRippleEffect, { x, y }, {}, 'end');
- }
-
- os.api('notes/create', {
- renoteId: appearNote.id,
- }).then(() => {
- os.toast(i18n.ts.renoted);
- });
- },
- }, {
- text: i18n.ts.quote,
- icon: 'ti ti-quote',
- action: () => {
- os.post({
- renote: appearNote,
- });
- },
- }]);
-
- os.popupMenu(items, renoteButton.value, {
+ const { menu } = getRenoteMenu({ note: note, renoteButton });
+ os.popupMenu(menu, renoteButton.value, {
viaKeyboard,
- });
+ }).then(focus);
}
function reply(viaKeyboard = false): void {