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

View File

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

View File

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