summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-03-22 09:55:38 +0900
committerGitHub <noreply@github.com>2023-03-22 09:55:38 +0900
commit1e67e9c6616c6e87ae85ece71e5401006df2dd34 (patch)
treea0d6df03a3d0ac2edf1fda7ed4bfb789b5a29720 /packages/frontend/src/scripts
parentMerge pull request #10218 from misskey-dev/develop (diff)
parentfix drive-cleaner (diff)
downloadmisskey-1e67e9c6616c6e87ae85ece71e5401006df2dd34.tar.gz
misskey-1e67e9c6616c6e87ae85ece71e5401006df2dd34.tar.bz2
misskey-1e67e9c6616c6e87ae85ece71e5401006df2dd34.zip
Merge pull request #10342 from misskey-dev/develop
Release: 13.10.0
Diffstat (limited to 'packages/frontend/src/scripts')
-rw-r--r--packages/frontend/src/scripts/api.ts3
-rw-r--r--packages/frontend/src/scripts/get-drive-file-menu.ts93
-rw-r--r--packages/frontend/src/scripts/get-user-menu.ts14
-rw-r--r--packages/frontend/src/scripts/lookup.ts41
-rw-r--r--packages/frontend/src/scripts/media-proxy.ts5
-rw-r--r--packages/frontend/src/scripts/sound.ts4
6 files changed, 155 insertions, 5 deletions
diff --git a/packages/frontend/src/scripts/api.ts b/packages/frontend/src/scripts/api.ts
index 5f34f5333e..97081d170f 100644
--- a/packages/frontend/src/scripts/api.ts
+++ b/packages/frontend/src/scripts/api.ts
@@ -5,7 +5,7 @@ import { $i } from '@/account';
export const pendingApiRequestsCount = ref(0);
// Implements Misskey.api.ApiClient.request
-export function api<E extends keyof Endpoints, P extends Endpoints[E]['req']>(endpoint: E, data: P = {} as any, token?: string | null | undefined): Promise<Endpoints[E]['res']> {
+export function api<E extends keyof Endpoints, P extends Endpoints[E]['req']>(endpoint: E, data: P = {} as any, token?: string | null | undefined, signal?: AbortSignal): Promise<Endpoints[E]['res']> {
pendingApiRequestsCount.value++;
const onFinally = () => {
@@ -26,6 +26,7 @@ export function api<E extends keyof Endpoints, P extends Endpoints[E]['req']>(en
headers: {
'Content-Type': 'application/json',
},
+ signal,
}).then(async (res) => {
const body = res.status === 204 ? null : await res.json();
diff --git a/packages/frontend/src/scripts/get-drive-file-menu.ts b/packages/frontend/src/scripts/get-drive-file-menu.ts
new file mode 100644
index 0000000000..56ab516038
--- /dev/null
+++ b/packages/frontend/src/scripts/get-drive-file-menu.ts
@@ -0,0 +1,93 @@
+import * as Misskey from 'misskey-js';
+import { defineAsyncComponent } from 'vue';
+import { i18n } from '@/i18n';
+import copyToClipboard from '@/scripts/copy-to-clipboard';
+import * as os from '@/os';
+
+function rename(file: Misskey.entities.DriveFile) {
+ os.inputText({
+ title: i18n.ts.renameFile,
+ placeholder: i18n.ts.inputNewFileName,
+ default: file.name,
+ }).then(({ canceled, result: name }) => {
+ if (canceled) return;
+ os.api('drive/files/update', {
+ fileId: file.id,
+ name: name,
+ });
+ });
+}
+
+function describe(file: Misskey.entities.DriveFile) {
+ os.popup(defineAsyncComponent(() => import('@/components/MkFileCaptionEditWindow.vue')), {
+ default: file.comment != null ? file.comment : '',
+ file: file,
+ }, {
+ done: caption => {
+ os.api('drive/files/update', {
+ fileId: file.id,
+ comment: caption.length === 0 ? null : caption,
+ });
+ },
+ }, 'closed');
+}
+
+function toggleSensitive(file: Misskey.entities.DriveFile) {
+ os.api('drive/files/update', {
+ fileId: file.id,
+ isSensitive: !file.isSensitive,
+ });
+}
+
+function copyUrl(file: Misskey.entities.DriveFile) {
+ copyToClipboard(file.url);
+ os.success();
+}
+/*
+function addApp() {
+ alert('not implemented yet');
+}
+*/
+async function deleteFile(file: Misskey.entities.DriveFile) {
+ const { canceled } = await os.confirm({
+ type: 'warning',
+ text: i18n.t('driveFileDeleteConfirm', { name: file.name }),
+ });
+
+ if (canceled) return;
+ os.api('drive/files/delete', {
+ fileId: file.id,
+ });
+}
+
+export function getDriveFileMenu(file: Misskey.entities.DriveFile) {
+ return [{
+ text: i18n.ts.rename,
+ icon: 'ti ti-forms',
+ action: rename,
+ }, {
+ text: file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
+ icon: file.isSensitive ? 'ti ti-eye' : 'ti ti-eye-off',
+ action: toggleSensitive,
+ }, {
+ text: i18n.ts.describeFile,
+ icon: 'ti ti-text-caption',
+ action: describe,
+ }, null, {
+ text: i18n.ts.copyUrl,
+ icon: 'ti ti-link',
+ action: copyUrl,
+ }, {
+ type: 'a',
+ href: file.url,
+ target: '_blank',
+ text: i18n.ts.download,
+ icon: 'ti ti-download',
+ download: file.name,
+ }, null, {
+ text: i18n.ts.delete,
+ icon: 'ti ti-trash',
+ danger: true,
+ action: deleteFile,
+ }];
+}
diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts
index 5170ca4c8c..d7eb331183 100644
--- a/packages/frontend/src/scripts/get-user-menu.ts
+++ b/packages/frontend/src/scripts/get-user-menu.ts
@@ -53,6 +53,14 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router
}
}
+ async function toggleRenoteMute() {
+ os.apiWithDialog(user.isRenoteMuted ? 'renote-mute/delete' : 'renote-mute/create', {
+ userId: user.id,
+ }).then(() => {
+ user.isRenoteMuted = !user.isRenoteMuted;
+ });
+ }
+
async function toggleBlock() {
if (!await getConfirmed(user.isBlocking ? i18n.ts.unblockConfirm : i18n.ts.blockConfirm)) return;
@@ -111,7 +119,7 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router
icon: 'ti ti-mail',
text: i18n.ts.sendMessage,
action: () => {
- os.post({ specified: user });
+ os.post({ specified: user, initialText: `@${user.username} ` });
},
}, null, {
type: 'parent',
@@ -180,6 +188,10 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router
text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute,
action: toggleMute,
}, {
+ icon: user.isRenoteMuted ? 'ti ti-repeat' : 'ti ti-repeat-off',
+ text: user.isRenoteMuted ? i18n.ts.renoteUnmute : i18n.ts.renoteMute,
+ action: toggleRenoteMute,
+ }, {
icon: 'ti ti-ban',
text: user.isBlocking ? i18n.ts.unblock : i18n.ts.block,
action: toggleBlock,
diff --git a/packages/frontend/src/scripts/lookup.ts b/packages/frontend/src/scripts/lookup.ts
new file mode 100644
index 0000000000..ce5b03fc38
--- /dev/null
+++ b/packages/frontend/src/scripts/lookup.ts
@@ -0,0 +1,41 @@
+import * as os from '@/os';
+import { i18n } from '@/i18n';
+import { mainRouter } from '@/router';
+import { Router } from '@/nirax';
+
+export async function lookup(router?: Router) {
+ const _router = router ?? mainRouter;
+
+ const { canceled, result: query } = await os.inputText({
+ title: i18n.ts.lookup,
+ });
+ if (canceled) return;
+
+ if (query.startsWith('@') && !query.includes(' ')) {
+ _router.push(`/${query}`);
+ return;
+ }
+
+ if (query.startsWith('#')) {
+ _router.push(`/tags/${encodeURIComponent(query.substr(1))}`);
+ return;
+ }
+
+ if (query.startsWith('https://')) {
+ const promise = os.api('ap/show', {
+ uri: query,
+ });
+
+ os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject);
+
+ const res = await promise;
+
+ if (res.type === 'User') {
+ _router.push(`/@${res.object.username}@${res.object.host}`);
+ } else if (res.type === 'Note') {
+ _router.push(`/notes/${res.object.id}`);
+ }
+
+ return;
+ }
+}
diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts
index 2fe5bdcf8f..91ac14c06d 100644
--- a/packages/frontend/src/scripts/media-proxy.ts
+++ b/packages/frontend/src/scripts/media-proxy.ts
@@ -10,7 +10,10 @@ export function getProxiedImageUrl(imageUrl: string, type?: 'preview', mustOrigi
imageUrl = (new URL(imageUrl)).searchParams.get('url') ?? imageUrl;
}
- return `${mustOrigin ? localProxy : instance.mediaProxy}/image.webp?${query({
+ return `${mustOrigin ? localProxy : instance.mediaProxy}/${
+ type === 'preview' ? 'preview.webp'
+ : 'image.webp'
+ }?${query({
url: imageUrl,
fallback: '1',
...(type ? { [type]: '1' } : {}),
diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts
index b08982facb..35fd007e64 100644
--- a/packages/frontend/src/scripts/sound.ts
+++ b/packages/frontend/src/scripts/sound.ts
@@ -72,8 +72,8 @@ export function setVolume(audio: HTMLAudioElement, volume: number): HTMLAudioEle
return audio;
}
-export function play(type: string) {
- const sound = ColdDeviceStorage.get('sound_' + type as any);
+export function play(type: 'noteMy' | 'note' | 'antenna' | 'channel' | 'notification') {
+ const sound = ColdDeviceStorage.get(`sound_${type}`);
if (sound.type == null) return;
playFile(sound.type, sound.volume);
}