From 0a0d42bb4865320c728ff892ffe41a9bc060e3c2 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Sat, 10 May 2025 11:25:00 +0900
Subject: enhance:
招待されているが参加していないルームを開いたときに、招待を承認するかどうか尋ねるように
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/frontend/src/pages/chat/room.vue | 54 +++++++++++++++++++++++++++----
1 file changed, 48 insertions(+), 6 deletions(-)
(limited to 'packages/frontend/src')
diff --git a/packages/frontend/src/pages/chat/room.vue b/packages/frontend/src/pages/chat/room.vue
index 64d3420166..ac13c5fac6 100644
--- a/packages/frontend/src/pages/chat/room.vue
+++ b/packages/frontend/src/pages/chat/room.vue
@@ -80,7 +80,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
@@ -127,7 +127,8 @@ export type NormalizedChatMessage = Omit([]);
const canFetchMore = ref(false);
@@ -171,7 +172,10 @@ function normalizeMessage(message: Misskey.entities.ChatMessageLite | Misskey.en
async function initialize() {
const LIMIT = 20;
+ if (initializing.value) return;
+
initializing.value = true;
+ initialized.value = false;
if (props.userId) {
const [u, m] = await Promise.all([
@@ -194,13 +198,44 @@ async function initialize() {
connection.value.on('react', onReact);
connection.value.on('unreact', onUnreact);
} else {
- const [r, m] = await Promise.all([
+ const [rResult, mResult] = await Promise.allSettled([
misskeyApi('chat/rooms/show', { roomId: props.roomId }),
misskeyApi('chat/messages/room-timeline', { roomId: props.roomId, limit: LIMIT }),
]);
- room.value = r as Misskey.entities.ChatRoomsShowResponse;
- messages.value = (m as Misskey.entities.ChatMessagesRoomTimelineResponse).map(x => normalizeMessage(x));
+ if (rResult.status === 'rejected') {
+ os.alert({
+ type: 'error',
+ text: i18n.ts.somethingHappened,
+ });
+ initializing.value = false;
+ return;
+ }
+
+ const r = rResult.value as Misskey.entities.ChatRoomsShowResponse;
+
+ if (r.invitationExists) {
+ const confirm = await os.confirm({
+ type: 'question',
+ title: r.name,
+ text: i18n.ts._chat.youAreNotAMemberOfThisRoomButInvited + '\n' + i18n.ts._chat.doYouAcceptInvitation,
+ });
+ if (confirm.canceled) {
+ initializing.value = false;
+ router.push('/chat');
+ return;
+ } else {
+ await os.apiWithDialog('chat/rooms/join', { roomId: r.id });
+ initializing.value = false;
+ initialize();
+ return;
+ }
+ }
+
+ const m = mResult.status === 'fulfilled' ? mResult.value as Misskey.entities.ChatMessagesRoomTimelineResponse : [];
+
+ room.value = r;
+ messages.value = m.map(x => normalizeMessage(x));
if (messages.value.length === LIMIT) {
canFetchMore.value = true;
@@ -217,6 +252,7 @@ async function initialize() {
window.document.addEventListener('visibilitychange', onVisibilitychange);
+ initialized.value = true;
initializing.value = false;
}
@@ -319,6 +355,12 @@ onMounted(() => {
initialize();
});
+onActivated(() => {
+ if (!initialized.value) {
+ initialize();
+ }
+});
+
onBeforeUnmount(() => {
connection.value?.dispose();
window.document.removeEventListener('visibilitychange', onVisibilitychange);
@@ -410,7 +452,7 @@ const headerActions = computed(() => [{
}]);
definePage(computed(() => {
- if (!initializing.value) {
+ if (initialized.value) {
if (user.value) {
return {
userName: user.value,
--
cgit v1.2.3-freya