This commit is contained in:
syuilo 2025-04-03 14:56:54 +09:00
parent 969b21a8e8
commit aa9aa239a1
3 changed files with 18 additions and 16 deletions

View File

@ -25,8 +25,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.footer">
<button class="_textButton" style="color: currentColor;" @click="showMenu"><i class="ti ti-dots-circle-horizontal"></i></button>
<MkTime :class="$style.time" :time="message.createdAt"/>
<MkA v-if="isSearchResult && 'toRoom' in message && message.toRoom != null" :to="`/chat/room/${message.toRoomId}`">{{ message.toRoom?.name }}</MkA>
<MkA v-if="isSearchResult && 'toUser' in message && message.toUser != null && isMe" :to="`/chat/user/${message.toUserId}`">@{{ message.toUser?.username }}</MkA>
<MkA v-if="isSearchResult && 'toRoom' in message && message.toRoom != null" :to="`/chat/room/${message.toRoomId}`">{{ message.toRoom.name }}</MkA>
<MkA v-if="isSearchResult && 'toUser' in message && message.toUser != null && isMe" :to="`/chat/user/${message.toUserId}`">@{{ message.toUser.username }}</MkA>
</div>
<TransitionGroup
:enterActiveClass="prefer.s.animation ? $style.transition_reaction_enterActive : ''"
@ -36,7 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:moveClass="prefer.s.animation ? $style.transition_reaction_move : ''"
tag="div" :class="$style.reactions"
>
<div v-for="record in message.reactions" :key="record.reaction + record.user?.id" :class="[$style.reaction, record.user?.id === $i.id ? $style.reactionMy : null]" @click="onReactionClick(record)">
<div v-for="record in message.reactions" :key="record.reaction + record.user.id" :class="[$style.reaction, record.user.id === $i.id ? $style.reactionMy : null]" @click="onReactionClick(record)">
<MkAvatar :user="record.user!" :link="false" :class="$style.reactionAvatar"/>
<MkReactionIcon
:withTooltip="true"
@ -111,13 +111,13 @@ function react(ev: MouseEvent) {
function onReactionClick(record: Misskey.entities.ChatMessage['reactions'][0]) {
if (!$i.policies.canChat) return;
if (record.user?.id === $i.id) {
if (record.user.id === $i.id) {
misskeyApi('chat/messages/unreact', {
messageId: props.message.id,
reaction: record.reaction,
});
} else {
if (!props.message.reactions.some(r => r.user?.id === $i.id && r.reaction === record.reaction)) {
if (!props.message.reactions.some(r => r.user.id === $i.id && r.reaction === record.reaction)) {
sound.playMisskeySfx('reaction');
misskeyApi('chat/messages/react', {
messageId: props.message.id,

View File

@ -14,8 +14,8 @@ SPDX-License-Identifier: AGPL-3.0-only
<hr v-if="memberships.length > 0">
<div v-for="membership in memberships" :key="membership.id" :class="$style.membership">
<MkA v-if="membership.user != null" :class="$style.membershipBody" :to="`${userPage(membership.user)}`">
<MkUserCardMini :user="membership.user"/>
<MkA :class="$style.membershipBody" :to="`${userPage(membership.user!)}`">
<MkUserCardMini :user="membership.user!"/>
</MkA>
</div>

View File

@ -178,10 +178,10 @@ async function initialize() {
connection.value = useStream().useChannel('chatUser', {
otherId: user.value.id,
});
connection.value?.on('message', onMessage);
connection.value?.on('deleted', onDeleted);
connection.value?.on('react', onReact);
connection.value?.on('unreact', onUnreact);
connection.value.on('message', onMessage);
connection.value.on('deleted', onDeleted);
connection.value.on('react', onReact);
connection.value.on('unreact', onUnreact);
} else {
const [r, m] = await Promise.all([
misskeyApi('chat/rooms/show', { roomId: props.roomId }),
@ -272,10 +272,10 @@ function onReact(ctx: Parameters<Misskey.Channels['chatUser']['events']['react']
reaction: ctx.reaction,
user: message.fromUserId === $i.id ? user.value! : $i,
});
} else if (ctx.user != null) {
} else {
message.reactions.push({
reaction: ctx.reaction,
user: ctx.user,
user: ctx.user!,
});
}
}
@ -283,7 +283,7 @@ function onReact(ctx: Parameters<Misskey.Channels['chatUser']['events']['react']
function onUnreact(ctx: Parameters<Misskey.Channels['chatUser']['events']['unreact']>[0] | Parameters<Misskey.Channels['chatRoom']['events']['unreact']>[0]) {
const message = messages.value.find(m => m.id === ctx.messageId);
if (message && ctx.user != null) {
if (message) {
const index = message.reactions.findIndex(r => r.reaction === ctx.reaction && r.user.id === ctx.user!.id);
if (index !== -1) {
message.reactions.splice(index, 1);
@ -318,12 +318,14 @@ async function inviteUser() {
const invitee = await os.selectUser({ includeSelf: false, localOnly: true });
os.apiWithDialog('chat/rooms/invitations/create', {
roomId: room.value?.id,
roomId: room.value.id,
userId: invitee.id,
});
}
async function leaveRoom() {
if (room.value == null) return;
const { canceled } = await os.confirm({
type: 'warning',
text: i18n.ts.areYouSure,
@ -331,7 +333,7 @@ async function leaveRoom() {
if (canceled) return;
misskeyApi('chat/rooms/leave', {
roomId: room.value?.id,
roomId: room.value.id,
});
router.push('/chat');
}