-
- {{ i18n.ts._role._options.canChat }}
+
+ {{ i18n.ts._role._options.chatAvailability }}
- {{ i18n.ts._role.useBaseValue }}
- {{ role.policies.canChat.value ? i18n.ts.yes : i18n.ts.no }}
-
+ {{ i18n.ts._role.useBaseValue }}
+ {{ role.policies.chatAvailability.value === 'available' ? i18n.ts.yes : role.policies.chatAvailability.value === 'readonly' ? i18n.ts.readonly : i18n.ts.no }}
+
-
+
{{ i18n.ts._role.useBaseValue }}
-
+
{{ i18n.ts.enable }}
-
-
+
+
+
+
+
{{ i18n.ts._role.priority }}
diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue
index b8527a309d..63e89a47f2 100644
--- a/packages/frontend/src/pages/admin/roles.vue
+++ b/packages/frontend/src/pages/admin/roles.vue
@@ -78,12 +78,15 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- {{ i18n.ts._role._options.canChat }}
- {{ policies.canChat ? i18n.ts.yes : i18n.ts.no }}
-
+
+ {{ i18n.ts._role._options.chatAvailability }}
+ {{ policies.chatAvailability === 'available' ? i18n.ts.yes : policies.chatAvailability === 'readonly' ? i18n.ts.readonly : i18n.ts.no }}
+
{{ i18n.ts.enable }}
-
+
+
+
+
@@ -322,6 +325,7 @@ import MkInput from '@/components/MkInput.vue';
import MkFolder from '@/components/MkFolder.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkButton from '@/components/MkButton.vue';
+import MkSelect from '@/components/MkSelect.vue';
import MkRange from '@/components/MkRange.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkRolePreview from '@/components/MkRolePreview.vue';
diff --git a/packages/frontend/src/pages/chat/XMessage.vue b/packages/frontend/src/pages/chat/XMessage.vue
index 7524283641..78c1c66f52 100644
--- a/packages/frontend/src/pages/chat/XMessage.vue
+++ b/packages/frontend/src/pages/chat/XMessage.vue
@@ -85,7 +85,7 @@ const isMe = computed(() => props.message.fromUserId === $i.id);
const urls = computed(() => props.message.text ? extractUrlFromMfm(mfm.parse(props.message.text)) : []);
provide(DI.mfmEmojiReactCallback, (reaction) => {
- if (!$i.policies.canChat) return;
+ if ($i.policies.chatAvailability !== 'available') return;
sound.playMisskeySfx('reaction');
misskeyApi('chat/messages/react', {
@@ -95,7 +95,7 @@ provide(DI.mfmEmojiReactCallback, (reaction) => {
});
function react(ev: MouseEvent) {
- if (!$i.policies.canChat) return;
+ if ($i.policies.chatAvailability !== 'available') return;
const targetEl = getHTMLElementOrNull(ev.currentTarget ?? ev.target);
if (!targetEl) return;
@@ -110,7 +110,7 @@ function react(ev: MouseEvent) {
}
function onReactionClick(record: Misskey.entities.ChatMessage['reactions'][0]) {
- if (!$i.policies.canChat) return;
+ if ($i.policies.chatAvailability !== 'available') return;
if (record.user.id === $i.id) {
misskeyApi('chat/messages/unreact', {
@@ -138,7 +138,7 @@ function onContextmenu(ev: MouseEvent) {
function showMenu(ev: MouseEvent, contextmenu = false) {
const menu: MenuItem[] = [];
- if (!isMe.value && $i.policies.canChat) {
+ if (!isMe.value && $i.policies.chatAvailability === 'available') {
menu.push({
text: i18n.ts.reaction,
icon: 'ti ti-mood-plus',
@@ -164,7 +164,7 @@ function showMenu(ev: MouseEvent, contextmenu = false) {
type: 'divider',
});
- if (isMe.value && $i.policies.canChat) {
+ if (isMe.value && $i.policies.chatAvailability === 'available') {
menu.push({
text: i18n.ts.delete,
icon: 'ti ti-trash',
diff --git a/packages/frontend/src/pages/chat/home.home.vue b/packages/frontend/src/pages/chat/home.home.vue
index 17f0e0fbcd..a8ed891de0 100644
--- a/packages/frontend/src/pages/chat/home.home.vue
+++ b/packages/frontend/src/pages/chat/home.home.vue
@@ -5,9 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ i18n.ts.startChat }}
+
{{ i18n.ts.startChat }}
-
{{ i18n.ts._chat.chatNotAvailableForThisAccountOrServer }}
+
{{ $i.policies.chatAvailability === 'readonly' ? i18n.ts._chat.chatIsReadOnlyForThisAccountOrServer : i18n.ts._chat.chatNotAvailableForThisAccountOrServer }}
diff --git a/packages/frontend/src/pages/chat/room.vue b/packages/frontend/src/pages/chat/room.vue
index 9942dbeee9..8b351c1ec8 100644
--- a/packages/frontend/src/pages/chat/room.vue
+++ b/packages/frontend/src/pages/chat/room.vue
@@ -6,54 +6,56 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
-
-
-
{{ i18n.ts._chat.noMessagesYet }}
-
- {{ i18n.ts._chat.thisUserAllowsChatOnlyFromFollowers }}
- {{ i18n.ts._chat.thisUserAllowsChatOnlyFromFollowing }}
- {{ i18n.ts._chat.thisUserAllowsChatOnlyFromMutualFollowing }}
- {{ i18n.ts._chat.thisUserNotAllowedChatAnyone }}
-
-
- {{ i18n.ts._chat.inviteUserToChat }}
-
-
-
-
-
-
-
{{ i18n.ts.loadMore }}
+
+
+
-
-
-
-
- {{ item.nextText }}
-
- {{ item.prevText }}
-
-
-
-
+
+
+
{{ i18n.ts._chat.noMessagesYet }}
+
+ {{ i18n.ts._chat.thisUserAllowsChatOnlyFromFollowers }}
+ {{ i18n.ts._chat.thisUserAllowsChatOnlyFromFollowing }}
+ {{ i18n.ts._chat.thisUserAllowsChatOnlyFromMutualFollowing }}
+ {{ i18n.ts._chat.thisUserNotAllowedChatAnyone }}
+
+
+ {{ i18n.ts._chat.inviteUserToChat }}
+
+
+
-
- {{ i18n.ts._chat.chatNotAvailableInOtherAccount }}
-
+
+
+ {{ i18n.ts.loadMore }}
+
-
{{ i18n.ts._chat.chatNotAvailableForThisAccountOrServer }}
+
+
+
+
+ {{ item.nextText }}
+
+ {{ item.prevText }}
+
+
+
+
+
+
+ {{ i18n.ts._chat.chatNotAvailableInOtherAccount }}
+
+
+
{{ $i.policies.chatAvailability === 'readonly' ? i18n.ts._chat.chatIsReadOnlyForThisAccountOrServer : i18n.ts._chat.chatNotAvailableForThisAccountOrServer }}
+
diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue
index 6f5e35b586..257ed3edd8 100644
--- a/packages/frontend/src/pages/settings/mute-block.vue
+++ b/packages/frontend/src/pages/settings/mute-block.vue
@@ -62,12 +62,11 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})
+ {{ i18n.ts.mutedUsers }} ({{ i18n.ts.renote }})
diff --git a/packages/frontend/src/pages/settings/navbar.vue b/packages/frontend/src/pages/settings/navbar.vue
index 91968c5300..b322b03a21 100644
--- a/packages/frontend/src/pages/settings/navbar.vue
+++ b/packages/frontend/src/pages/settings/navbar.vue
@@ -103,7 +103,6 @@ function removeItem(index: number) {
async function save() {
prefer.commit('menu', items.value.map(x => x.type));
- await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
}
function reset() {
diff --git a/packages/frontend/src/pages/settings/notifications.vue b/packages/frontend/src/pages/settings/notifications.vue
index 3c1b6c8032..168bff681d 100644
--- a/packages/frontend/src/pages/settings/notifications.vue
+++ b/packages/frontend/src/pages/settings/notifications.vue
@@ -4,64 +4,66 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
-
-
- {{ i18n.ts._settings.notificationsBanner }}
-
+
+
+
+ {{ i18n.ts._settings.notificationsBanner }}
+
-
- {{ i18n.ts.notificationRecieveConfig }}
-
-
- {{ i18n.ts._notification._types[type] }}
-
- {{
- $i.notificationRecieveConfig[type]?.type === 'never' ? i18n.ts.none :
- $i.notificationRecieveConfig[type]?.type === 'following' ? i18n.ts.following :
- $i.notificationRecieveConfig[type]?.type === 'follower' ? i18n.ts.followers :
- $i.notificationRecieveConfig[type]?.type === 'mutualFollow' ? i18n.ts.mutualFollow :
- $i.notificationRecieveConfig[type]?.type === 'followingOrFollower' ? i18n.ts.followingOrFollower :
- $i.notificationRecieveConfig[type]?.type === 'list' ? i18n.ts.userList :
- i18n.ts.all
- }}
-
+
+ {{ i18n.ts.notificationRecieveConfig }}
+
+
+ {{ i18n.ts._notification._types[type] }}
+
+ {{
+ $i.notificationRecieveConfig[type]?.type === 'never' ? i18n.ts.none :
+ $i.notificationRecieveConfig[type]?.type === 'following' ? i18n.ts.following :
+ $i.notificationRecieveConfig[type]?.type === 'follower' ? i18n.ts.followers :
+ $i.notificationRecieveConfig[type]?.type === 'mutualFollow' ? i18n.ts.mutualFollow :
+ $i.notificationRecieveConfig[type]?.type === 'followingOrFollower' ? i18n.ts.followingOrFollower :
+ $i.notificationRecieveConfig[type]?.type === 'list' ? i18n.ts.userList :
+ i18n.ts.all
+ }}
+
- updateReceiveConfig(type, res)"
- />
-
-
-
-
-
- {{ i18n.ts.markAsReadAllNotifications }}
-
-
-
-
- {{ i18n.ts._notification.sendTestNotification }}
- {{ i18n.ts._notification.flushNotification }}
-
-
-
- {{ i18n.ts.pushNotification }}
+ updateReceiveConfig(type, res)"
+ />
+
+
+
+
+
+ {{ i18n.ts.markAsReadAllNotifications }}
+
+
+
+
+ {{ i18n.ts._notification.sendTestNotification }}
+ {{ i18n.ts._notification.flushNotification }}
+
+
+
+ {{ i18n.ts.pushNotification }}
-
-
-
- {{ i18n.ts.sendPushNotificationReadMessage }}
-
-
- {{ i18n.ts._notification.emptyPushNotificationMessage }}
-
-
-
-
-
-
+
+
+
+ {{ i18n.ts.sendPushNotificationReadMessage }}
+
+
+ {{ i18n.ts._notification.emptyPushNotificationMessage }}
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
index 138c04b5d4..94f333da41 100644
--- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.timeline }}
-
+
{{ navbarItemDef[item].title }}
@@ -49,7 +49,7 @@ SPDX-License-Identifier: AGPL-3.0-only
diff --git a/packages/frontend/src/ui/deck/column.vue b/packages/frontend/src/ui/deck/column.vue
index a865eef3b3..4c816f1544 100644
--- a/packages/frontend/src/ui/deck/column.vue
+++ b/packages/frontend/src/ui/deck/column.vue
@@ -49,10 +49,11 @@ import { updateColumn, swapLeftColumn, swapRightColumn, swapUpColumn, swapDownCo
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { prefer } from '@/preferences.js';
+import { DI } from '@/di.js';
provide('shouldHeaderThin', true);
provide('shouldOmitHeaderTitle', true);
-provide('forceSpacerMin', true);
+provide(DI.forceSpacerMin, true);
const withWallpaper = prefer.s['deck.wallpaper'] != null;
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 86bd7cf055..940cf72e28 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -15,90 +15,26 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/packages/frontend/src/ui/zen.vue b/packages/frontend/src/ui/zen.vue
index 66b4496827..ef39753326 100644
--- a/packages/frontend/src/ui/zen.vue
+++ b/packages/frontend/src/ui/zen.vue
@@ -6,16 +6,14 @@ SPDX-License-Identifier: AGPL-3.0-only