mirror of
https://codeberg.org/yeentown/barkey.git
synced 2025-07-21 11:24:35 +00:00
Add boost menu to note context menu (#63)
This commit is contained in:
parent
38c4be869d
commit
7f64a27268
1 changed files with 94 additions and 9 deletions
|
@ -3,7 +3,7 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { defineAsyncComponent, Ref, ShallowRef } from 'vue';
|
import { defineAsyncComponent, Ref, ShallowRef, shallowRef, ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import { url } from '@@/js/config.js';
|
import { url } from '@@/js/config.js';
|
||||||
import { claimAchievement } from './achievements.js';
|
import { claimAchievement } from './achievements.js';
|
||||||
|
@ -22,6 +22,7 @@ import MkRippleEffect from '@/components/MkRippleEffect.vue';
|
||||||
import { isSupportShare } from '@/scripts/navigator.js';
|
import { isSupportShare } from '@/scripts/navigator.js';
|
||||||
import { getAppearNote } from '@/scripts/get-appear-note.js';
|
import { getAppearNote } from '@/scripts/get-appear-note.js';
|
||||||
import { genEmbedCode } from '@/scripts/get-embed-code.js';
|
import { genEmbedCode } from '@/scripts/get-embed-code.js';
|
||||||
|
import { Visibility, boostMenuItems } from '@/scripts/boost-quote.js';
|
||||||
|
|
||||||
export async function getNoteClipMenu(props: {
|
export async function getNoteClipMenu(props: {
|
||||||
note: Misskey.entities.Note;
|
note: Misskey.entities.Note;
|
||||||
|
@ -159,7 +160,7 @@ export function getCopyNoteLinkMenu(note: Misskey.entities.Note, text: string):
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCopyNoteOriginLinkMenu(note: misskey.entities.Note, text: string): MenuItem {
|
export function getCopyNoteOriginLinkMenu(note: Misskey.entities.Note, text: string): MenuItem {
|
||||||
return {
|
return {
|
||||||
icon: 'ph-link ph-bold ph-lg',
|
icon: 'ph-link ph-bold ph-lg',
|
||||||
text,
|
text,
|
||||||
|
@ -377,6 +378,20 @@ export function getNoteMenu(props: {
|
||||||
|
|
||||||
menuItems.push({ type: 'divider' });
|
menuItems.push({ type: 'divider' });
|
||||||
|
|
||||||
|
menuItems.push({
|
||||||
|
type: 'parent',
|
||||||
|
icon: 'ti ti-repeat',
|
||||||
|
text: i18n.ts.renote,
|
||||||
|
children: () => getNewRenoteMenu(appearNote),
|
||||||
|
})
|
||||||
|
|
||||||
|
menuItems.push({
|
||||||
|
type: 'parent',
|
||||||
|
icon: 'ti ti-paperclip',
|
||||||
|
text: i18n.ts.clip,
|
||||||
|
children: () => getNoteClipMenu(props),
|
||||||
|
});
|
||||||
|
|
||||||
menuItems.push(statePromise.then(state => state.isFavorited ? {
|
menuItems.push(statePromise.then(state => state.isFavorited ? {
|
||||||
icon: 'ti ti-star-off',
|
icon: 'ti ti-star-off',
|
||||||
text: i18n.ts.unfavorite,
|
text: i18n.ts.unfavorite,
|
||||||
|
@ -387,13 +402,6 @@ export function getNoteMenu(props: {
|
||||||
action: () => toggleFavorite(true),
|
action: () => toggleFavorite(true),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
menuItems.push({
|
|
||||||
type: 'parent',
|
|
||||||
icon: 'ti ti-paperclip',
|
|
||||||
text: i18n.ts.clip,
|
|
||||||
children: () => getNoteClipMenu(props),
|
|
||||||
});
|
|
||||||
|
|
||||||
menuItems.push(statePromise.then(state => state.isMutedThread ? {
|
menuItems.push(statePromise.then(state => state.isMutedThread ? {
|
||||||
icon: 'ti ti-message-off',
|
icon: 'ti ti-message-off',
|
||||||
text: i18n.ts.unmuteThread,
|
text: i18n.ts.unmuteThread,
|
||||||
|
@ -574,6 +582,83 @@ function smallerVisibility(a: Visibility, b: Visibility): Visibility {
|
||||||
return 'public';
|
return 'public';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getNewRenoteMenu(appearNote: Misskey.entities.Note): Promise<MenuItem[]> {
|
||||||
|
const renoteItems: MenuItem[] = [];
|
||||||
|
|
||||||
|
const renoteFunc = (visibility?: Visibility, localOnly?: boolean, channel?) => {
|
||||||
|
misskeyApi('notes/create', {
|
||||||
|
localOnly,
|
||||||
|
visibility,
|
||||||
|
channelId: channel?.id,
|
||||||
|
renoteId: appearNote.id,
|
||||||
|
}).then(() => {
|
||||||
|
os.toast(channel ? i18n.tsx.renotedToX({name: channel.name}) : i18n.ts.renoted);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// If the note is from a channel, it can be renoted within that channel.
|
||||||
|
if (appearNote.channel) {
|
||||||
|
renoteItems.push({
|
||||||
|
type: 'button',
|
||||||
|
icon: 'ti ti-device-tv',
|
||||||
|
text: appearNote.channel.name,
|
||||||
|
action: () => {renoteFunc(undefined, undefined, appearNote.channel);},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notes from channels might not allow renoting outside the channel.
|
||||||
|
if (!appearNote.channel || appearNote.channel.allowRenoteToExternal) {
|
||||||
|
if (renoteItems.length > 0) renoteItems.push({type: 'divider'});
|
||||||
|
renoteItems.push(...boostMenuItems(ref(appearNote), (v, l) => renoteFunc(v, l, undefined)));
|
||||||
|
// Local-only notes should have the switch visibly forced on.
|
||||||
|
if (appearNote.localOnly) {
|
||||||
|
for (const item of renoteItems) {
|
||||||
|
if (item && item['type'] == "switch" && item['text'] == i18n.ts._timelines.local) {
|
||||||
|
item['ref'] = ref(true);
|
||||||
|
item['disabled'] = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const channels = await favoritedChannelsCache.fetch();
|
||||||
|
const otherChannelItems: MenuItem[] = channels.filter((channel) => {
|
||||||
|
if (!appearNote.channelId) return true;
|
||||||
|
return channel.id !== appearNote.channelId;
|
||||||
|
}).map((channel) => ({
|
||||||
|
type: 'button',
|
||||||
|
icon: 'ti ti-device-tv',
|
||||||
|
text: channel.name,
|
||||||
|
action: () => {renoteFunc(undefined, undefined, channel);},
|
||||||
|
}));
|
||||||
|
if (otherChannelItems.length > 0) {
|
||||||
|
renoteItems.push(
|
||||||
|
{type: 'divider'},
|
||||||
|
{type: 'label', text: appearNote.channel ? i18n.ts.renoteToOtherChannel : i18n.ts.renoteToChannel},
|
||||||
|
...otherChannelItems
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const channelQuoteItems: MenuItem[] = channels.map((channel) => ({
|
||||||
|
type: 'button',
|
||||||
|
text: channel.name,
|
||||||
|
action: () => {os.post({renote: appearNote, channel: channel});},
|
||||||
|
}));
|
||||||
|
if (channelQuoteItems.length > 0) {
|
||||||
|
renoteItems.push(
|
||||||
|
{type: 'divider'},
|
||||||
|
{
|
||||||
|
type: 'parent',
|
||||||
|
text: i18n.ts.inChannelQuote,
|
||||||
|
icon: 'ti ti-quote',
|
||||||
|
children: () => channelQuoteItems,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return renoteItems;
|
||||||
|
}
|
||||||
|
|
||||||
export function getRenoteMenu(props: {
|
export function getRenoteMenu(props: {
|
||||||
note: Misskey.entities.Note;
|
note: Misskey.entities.Note;
|
||||||
renoteButton: ShallowRef<HTMLElement | undefined>;
|
renoteButton: ShallowRef<HTMLElement | undefined>;
|
||||||
|
|
Loading…
Add table
Reference in a new issue