summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-05-18 20:17:32 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-05-18 20:17:32 +0900
commit231506772a47cdab965c686d9fb670a0dbd1a73e (patch)
treef7b0d1e226ea2b8aa67030406fc166f522f6e573 /packages
parentfeat(backend): カスタム絵文字ごとに連合するかどうか設定... (diff)
downloadmisskey-231506772a47cdab965c686d9fb670a0dbd1a73e.tar.gz
misskey-231506772a47cdab965c686d9fb670a0dbd1a73e.tar.bz2
misskey-231506772a47cdab965c686d9fb670a0dbd1a73e.zip
tweak of 7ce569424
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/src/core/entities/EmojiEntityService.ts3
-rw-r--r--packages/backend/src/models/json-schema/emoji.ts11
-rw-r--r--packages/frontend/src/account.ts82
-rw-r--r--packages/frontend/src/components/MkEmojiPicker.vue11
-rw-r--r--packages/frontend/src/pages/emoji-edit-dialog.vue13
5 files changed, 71 insertions, 49 deletions
diff --git a/packages/backend/src/core/entities/EmojiEntityService.ts b/packages/backend/src/core/entities/EmojiEntityService.ts
index 0c7bd9ed9a..4a18cd1b3b 100644
--- a/packages/backend/src/core/entities/EmojiEntityService.ts
+++ b/packages/backend/src/core/entities/EmojiEntityService.ts
@@ -26,7 +26,8 @@ export class EmojiEntityService {
category: emoji.category,
// || emoji.originalUrl してるのは後方互換性のため(publicUrlはstringなので??はだめ)
url: emoji.publicUrl || emoji.originalUrl,
- isSensitive: emoji.isSensitive,
+ isSensitive: emoji.isSensitive ? true : undefined,
+ roleIdsThatCanBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length > 0 ? emoji.roleIdsThatCanBeUsedThisEmojiAsReaction : undefined,
};
}
diff --git a/packages/backend/src/models/json-schema/emoji.ts b/packages/backend/src/models/json-schema/emoji.ts
index c59b5d1ef4..63f56e77cb 100644
--- a/packages/backend/src/models/json-schema/emoji.ts
+++ b/packages/backend/src/models/json-schema/emoji.ts
@@ -24,7 +24,16 @@ export const packedEmojiSimpleSchema = {
},
isSensitive: {
type: 'boolean',
- optional: false, nullable: false,
+ optional: true, nullable: false,
+ },
+ roleIdsThatCanBeUsedThisEmojiAsReaction: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
},
},
} as const;
diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts
index 9b104391d7..4770f616ac 100644
--- a/packages/frontend/src/account.ts
+++ b/packages/frontend/src/account.ts
@@ -3,11 +3,11 @@ import * as misskey from 'misskey-js';
import { showSuspendedDialog } from './scripts/show-suspended-dialog';
import { i18n } from './i18n';
import { miLocalStorage } from './local-storage';
+import { MenuButton } from './types/menu';
import { del, get, set } from '@/scripts/idb-proxy';
import { apiUrl } from '@/config';
import { waiting, api, popup, popupMenu, success, alert } from '@/os';
import { unisonReload, reloadChannel } from '@/scripts/unison-reload';
-import { MenuButton } from './types/menu';
// TODO: 他のタブと永続化されたstateを同期
@@ -101,57 +101,57 @@ function fetchAccount(token: string, id?: string, forceShowDialog?: boolean): Pr
'Content-Type': 'application/json',
},
})
- .then(res => new Promise<Account | { error: Record<string, any> }>((done2, fail2) => {
- if (res.status >= 500 && res.status < 600) {
+ .then(res => new Promise<Account | { error: Record<string, any> }>((done2, fail2) => {
+ if (res.status >= 500 && res.status < 600) {
// サーバーエラー(5xx)の場合をrejectとする
// (認証エラーなど4xxはresolve)
- return fail2(res);
- }
- res.json().then(done2, fail2);
- }))
- .then(async res => {
- if (res.error) {
- if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') {
+ return fail2(res);
+ }
+ res.json().then(done2, fail2);
+ }))
+ .then(async res => {
+ if (res.error) {
+ if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') {
// SUSPENDED
- if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
- await showSuspendedDialog();
- }
- } else if (res.error.id === 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a') {
+ if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
+ await showSuspendedDialog();
+ }
+ } else if (res.error.id === 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a') {
// USER_IS_DELETED
// アカウントが削除されている
- if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
- await alert({
- type: 'error',
- title: i18n.ts.accountDeleted,
- text: i18n.ts.accountDeletedDescription,
- });
- }
- } else if (res.error.id === 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14') {
+ if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
+ await alert({
+ type: 'error',
+ title: i18n.ts.accountDeleted,
+ text: i18n.ts.accountDeletedDescription,
+ });
+ }
+ } else if (res.error.id === 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14') {
// AUTHENTICATION_FAILED
// トークンが無効化されていたりアカウントが削除されたりしている
- if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
+ if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
+ await alert({
+ type: 'error',
+ title: i18n.ts.tokenRevoked,
+ text: i18n.ts.tokenRevokedDescription,
+ });
+ }
+ } else {
await alert({
type: 'error',
- title: i18n.ts.tokenRevoked,
- text: i18n.ts.tokenRevokedDescription,
+ title: i18n.ts.failedToFetchAccountInformation,
+ text: JSON.stringify(res.error),
});
}
+
+ // rejectかつ理由がtrueの場合、削除対象であることを示す
+ fail(true);
} else {
- await alert({
- type: 'error',
- title: i18n.ts.failedToFetchAccountInformation,
- text: JSON.stringify(res.error),
- });
+ (res as Account).token = token;
+ done(res as Account);
}
-
- // rejectかつ理由がtrueの場合、削除対象であることを示す
- fail(true);
- } else {
- (res as Account).token = token;
- done(res as Account);
- }
- })
- .catch(fail);
+ })
+ .catch(fail);
});
}
@@ -305,3 +305,7 @@ export async function openAccountMenu(opts: {
});
}
}
+
+if (_DEV_) {
+ (window as any).$i = $i;
+}
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 9eaf16374b..093a1ec6d4 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -69,8 +69,8 @@
<XSection
v-for="category in customEmojiCategories"
:key="`custom:${category}`"
- :initial-shown="false"
- :emojis="computed(() => customEmojis.filter(e => category === null ? (e.category === 'null' || !e.category) : e.category === category).map(e => `:${e.name}:`))"
+ :initialShown="false"
+ :emojis="computed(() => customEmojis.filter(e => category === null ? (e.category === 'null' || !e.category) : e.category === category).filter(filterAvailable).map(e => `:${e.name}:`))"
@chosen="chosen"
>
{{ category || i18n.ts.other }}
@@ -102,6 +102,7 @@ import { deviceKind } from '@/scripts/device-kind';
import { i18n } from '@/i18n';
import { defaultStore } from '@/store';
import { customEmojiCategories, customEmojis } from '@/custom-emojis';
+import { $i } from '@/account';
const props = withDefaults(defineProps<{
showPinned?: boolean;
@@ -274,10 +275,14 @@ watch(q, () => {
return matches;
};
- searchResultCustom.value = Array.from(searchCustom());
+ searchResultCustom.value = Array.from(searchCustom()).filter(filterAvailable);
searchResultUnicode.value = Array.from(searchUnicode());
});
+function filterAvailable(emoji: Misskey.entities.CustomEmoji): boolean {
+ return (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction == null || emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0) || ($i && $i.roles.some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id)));
+}
+
function focus() {
if (!['smartphone', 'tablet'].includes(deviceKind) && !isTouchUsing) {
searchEl.value?.focus({
diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue
index 24b72b6f7f..e36a26638f 100644
--- a/packages/frontend/src/pages/emoji-edit-dialog.vue
+++ b/packages/frontend/src/pages/emoji-edit-dialog.vue
@@ -41,16 +41,19 @@
</MkInput>
<MkFolder>
<template #label>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReaction }}</template>
- <div class="_gaps">
- <MkInfo>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription }}</MkInfo>
+ <template #suffix>{{ rolesThatCanBeUsedThisEmojiAsReaction.length === 0 ? i18n.ts.all : rolesThatCanBeUsedThisEmojiAsReaction.length }}</template>
+ <div class="_gaps">
<MkButton rounded @click="addRole"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton>
<div v-for="role in rolesThatCanBeUsedThisEmojiAsReaction" :key="role.id" :class="$style.roleItem">
- <MkRolePreview :class="$style.role" :role="role" :forModeration="true" :detailed="false"/>
+ <MkRolePreview :class="$style.role" :role="role" :forModeration="true" :detailed="false" style="pointer-events: none;"/>
<button v-if="role.target === 'manual'" class="_button" :class="$style.roleUnassign" @click="removeRole(role, $event)"><i class="ti ti-x"></i></button>
<button v-else class="_button" :class="$style.roleUnassign" disabled><i class="ti ti-ban"></i></button>
</div>
+
+ <MkInfo>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription }}</MkInfo>
+ <MkInfo warn>{{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn }}</MkInfo>
</div>
</MkFolder>
<MkSwitch v-model="isSensitive">isSensitive</MkSwitch>
@@ -128,8 +131,8 @@ async function removeRole(role, ev) {
async function done() {
const params = {
name,
- category,
- aliases: aliases.split(' '),
+ category: category === '' ? null : category,
+ aliases: aliases.split(' ').filter(x => x !== ''),
license: license === '' ? null : license,
isSensitive,
localOnly,