summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages/chat
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-04-24 14:23:45 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-04-24 14:23:45 -0400
commita4dd19fdd427a5adc8fa80871d1c742aa9708730 (patch)
tree3983a0e772922042043026b4af168e8dd3525fb2 /packages/frontend/src/pages/chat
parentMerge branch 'develop' into merge/2025-03-24 (diff)
parentenhance(backend): DB note (userId) インデクス -> (userId, id) 複合イ... (diff)
downloadsharkey-a4dd19fdd427a5adc8fa80871d1c742aa9708730.tar.gz
sharkey-a4dd19fdd427a5adc8fa80871d1c742aa9708730.tar.bz2
sharkey-a4dd19fdd427a5adc8fa80871d1c742aa9708730.zip
merge upstream again
Diffstat (limited to 'packages/frontend/src/pages/chat')
-rw-r--r--packages/frontend/src/pages/chat/home.home.vue161
-rw-r--r--packages/frontend/src/pages/chat/home.vue6
2 files changed, 6 insertions, 161 deletions
diff --git a/packages/frontend/src/pages/chat/home.home.vue b/packages/frontend/src/pages/chat/home.home.vue
index a8ed891de0..a0853fb0c9 100644
--- a/packages/frontend/src/pages/chat/home.home.vue
+++ b/packages/frontend/src/pages/chat/home.home.vue
@@ -34,34 +34,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkFoldableSection>
<template #header>{{ i18n.ts._chat.history }}</template>
- <div v-if="history.length > 0" class="_gaps_s">
- <MkA
- v-for="item in history"
- :key="item.id"
- :class="[$style.message, { [$style.isMe]: item.isMe, [$style.isRead]: item.message.isRead }]"
- class="_panel"
- :to="item.message.toRoomId ? `/chat/room/${item.message.toRoomId}` : `/chat/user/${item.other!.id}`"
- >
- <MkAvatar v-if="item.message.toRoomId" :class="$style.messageAvatar" :user="item.message.fromUser" indicator :preview="false"/>
- <MkAvatar v-else-if="item.other" :class="$style.messageAvatar" :user="item.other" indicator :preview="false"/>
- <div :class="$style.messageBody">
- <header v-if="item.message.toRoom" :class="$style.messageHeader">
- <span :class="$style.messageHeaderName"><i class="ti ti-users"></i> {{ item.message.toRoom.name }}</span>
- <MkTime :time="item.message.createdAt" :class="$style.messageHeaderTime"/>
- </header>
- <header v-else :class="$style.messageHeader">
- <MkUserName :class="$style.messageHeaderName" :user="item.other!"/>
- <MkAcct :class="$style.messageHeaderUsername" :user="item.other!"/>
- <MkTime :time="item.message.createdAt" :class="$style.messageHeaderTime"/>
- </header>
- <div :class="$style.messageBodyText"><span v-if="item.isMe" :class="$style.youSaid">{{ i18n.ts.you }}:</span>{{ item.message.text }}</div>
- </div>
- </MkA>
- </div>
- <div v-if="!initializing && history.length == 0" class="_fullinfo">
- <div>{{ i18n.ts._chat.noHistory }}</div>
- </div>
- <MkLoading v-if="initializing"/>
+ <MkChatHistories/>
</MkFoldableSection>
</div>
</template>
@@ -81,20 +54,12 @@ import { updateCurrentAccountPartial } from '@/accounts.js';
import MkInput from '@/components/MkInput.vue';
import MkFoldableSection from '@/components/MkFoldableSection.vue';
import MkInfo from '@/components/MkInfo.vue';
+import MkChatHistories from '@/components/MkChatHistories.vue';
const $i = ensureSignin();
const router = useRouter();
-const initializing = ref(true);
-const fetching = ref(false);
-const history = ref<{
- id: string;
- message: Misskey.entities.ChatMessage;
- other: Misskey.entities.ChatMessage['fromUser'] | Misskey.entities.ChatMessage['toUser'] | null;
- isMe: boolean;
-}[]>([]);
-
const searchQuery = ref('');
const searched = ref(false);
const searchResults = ref<Misskey.entities.ChatMessage[]>([]);
@@ -148,57 +113,8 @@ async function search() {
searched.value = true;
}
-async function fetchHistory() {
- if (fetching.value) return;
-
- fetching.value = true;
-
- const [userMessages, roomMessages] = await Promise.all([
- misskeyApi('chat/history', { room: false }),
- misskeyApi('chat/history', { room: true }),
- ]);
-
- history.value = [...userMessages, ...roomMessages]
- .toSorted((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
- .map(m => ({
- id: m.id,
- message: m,
- other: (!('room' in m) || m.room == null) ? (m.fromUserId === $i.id ? m.toUser : m.fromUser) : null,
- isMe: m.fromUserId === $i.id,
- }));
-
- fetching.value = false;
- initializing.value = false;
-
- updateCurrentAccountPartial({ hasUnreadChatMessages: false });
-}
-
-let isActivated = true;
-
-onActivated(() => {
- isActivated = true;
-});
-
-onDeactivated(() => {
- isActivated = false;
-});
-
-useInterval(() => {
- // TODO: DOM的にバックグラウンドになっていないかどうかも考慮する
- if (!window.document.hidden && isActivated) {
- fetchHistory();
- }
-}, 1000 * 10, {
- immediate: false,
- afterMounted: true,
-});
-
-onActivated(() => {
- fetchHistory();
-});
-
onMounted(() => {
- fetchHistory();
+ updateCurrentAccountPartial({ hasUnreadChatMessages: false });
});
</script>
@@ -207,77 +123,6 @@ onMounted(() => {
margin: 0 auto;
}
-.message {
- position: relative;
- display: flex;
- padding: 16px 24px;
-
- &.isRead,
- &.isMe {
- opacity: 0.8;
- }
-
- &:not(.isMe):not(.isRead) {
- &::before {
- content: '';
- position: absolute;
- top: 8px;
- right: 8px;
- width: 8px;
- height: 8px;
- border-radius: 100%;
- background-color: var(--MI_THEME-accent);
- }
- }
-}
-
-.messageAvatar {
- width: 50px;
- height: 50px;
- margin: 0 16px 0 0;
-}
-
-.messageBody {
- flex: 1;
- min-width: 0;
-}
-
-.messageHeader {
- display: flex;
- align-items: center;
- margin-bottom: 2px;
- white-space: nowrap;
- overflow: clip;
-}
-
-.messageHeaderName {
- margin: 0;
- padding: 0;
- overflow: hidden;
- text-overflow: ellipsis;
- font-size: 1em;
- font-weight: bold;
-}
-
-.messageHeaderUsername {
- margin: 0 8px;
-}
-
-.messageHeaderTime {
- margin-left: auto;
-}
-
-.messageBodyText {
- overflow: hidden;
- overflow-wrap: break-word;
- font-size: 1.1em;
-}
-
-.youSaid {
- font-weight: bold;
- margin-right: 0.5em;
-}
-
.searchResultItem {
padding: 12px;
border: solid 1px var(--MI_THEME-divider);
diff --git a/packages/frontend/src/pages/chat/home.vue b/packages/frontend/src/pages/chat/home.vue
index e29ab28f2d..1edd18ddf0 100644
--- a/packages/frontend/src/pages/chat/home.vue
+++ b/packages/frontend/src/pages/chat/home.vue
@@ -7,12 +7,12 @@ SPDX-License-Identifier: AGPL-3.0-only
<PageWithHeader v-model:tab="tab" :actions="headerActions" :tabs="headerTabs">
<MkPolkadots v-if="tab === 'home'" accented/>
<MkSpacer :contentMax="700">
- <MkHorizontalSwipe v-model:tab="tab" :tabs="headerTabs">
+ <MkSwiper v-model:tab="tab" :tabs="headerTabs">
<XHome v-if="tab === 'home'"/>
<XInvitations v-else-if="tab === 'invitations'"/>
<XJoiningRooms v-else-if="tab === 'joiningRooms'"/>
<XOwnedRooms v-else-if="tab === 'ownedRooms'"/>
- </MkHorizontalSwipe>
+ </MkSwiper>
</MkSpacer>
</PageWithHeader>
</template>
@@ -25,7 +25,7 @@ import XJoiningRooms from './home.joiningRooms.vue';
import XOwnedRooms from './home.ownedRooms.vue';
import { i18n } from '@/i18n.js';
import { definePage } from '@/page.js';
-import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue';
+import MkSwiper from '@/components/MkSwiper.vue';
import MkPolkadots from '@/components/MkPolkadots.vue';
const tab = ref('home');