summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/use-note-capture.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/scripts/use-note-capture.ts')
-rw-r--r--packages/frontend/src/scripts/use-note-capture.ts124
1 files changed, 0 insertions, 124 deletions
diff --git a/packages/frontend/src/scripts/use-note-capture.ts b/packages/frontend/src/scripts/use-note-capture.ts
deleted file mode 100644
index 0bc10e90e4..0000000000
--- a/packages/frontend/src/scripts/use-note-capture.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and misskey-project
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import { onUnmounted } from 'vue';
-import type { Ref, ShallowRef } from 'vue';
-import * as Misskey from 'misskey-js';
-import { useStream } from '@/stream.js';
-import { $i } from '@/account.js';
-
-export function useNoteCapture(props: {
- rootEl: ShallowRef<HTMLElement | undefined>;
- note: Ref<Misskey.entities.Note>;
- pureNote: Ref<Misskey.entities.Note>;
- isDeletedRef: Ref<boolean>;
-}) {
- const note = props.note;
- const pureNote = props.pureNote;
- const connection = $i ? useStream() : null;
-
- function onStreamNoteUpdated(noteData): void {
- const { type, id, body } = noteData;
-
- if ((id !== note.value.id) && (id !== pureNote.value.id)) return;
-
- switch (type) {
- case 'reacted': {
- const reaction = body.reaction;
-
- if (body.emoji && !(body.emoji.name in note.value.reactionEmojis)) {
- note.value.reactionEmojis[body.emoji.name] = body.emoji.url;
- }
-
- // TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる
- const currentCount = (note.value.reactions || {})[reaction] || 0;
-
- note.value.reactions[reaction] = currentCount + 1;
- note.value.reactionCount += 1;
-
- if ($i && (body.userId === $i.id)) {
- note.value.myReaction = reaction;
- }
- break;
- }
-
- case 'unreacted': {
- const reaction = body.reaction;
-
- // TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる
- const currentCount = (note.value.reactions || {})[reaction] || 0;
-
- note.value.reactions[reaction] = Math.max(0, currentCount - 1);
- note.value.reactionCount = Math.max(0, note.value.reactionCount - 1);
- if (note.value.reactions[reaction] === 0) delete note.value.reactions[reaction];
-
- if ($i && (body.userId === $i.id)) {
- note.value.myReaction = null;
- }
- break;
- }
-
- case 'pollVoted': {
- const choice = body.choice;
-
- const choices = [...note.value.poll.choices];
- choices[choice] = {
- ...choices[choice],
- votes: choices[choice].votes + 1,
- ...($i && (body.userId === $i.id) ? {
- isVoted: true,
- } : {}),
- };
-
- note.value.poll.choices = choices;
- break;
- }
-
- case 'deleted': {
- props.isDeletedRef.value = true;
- break;
- }
- }
- }
-
- function capture(withHandler = false): void {
- if (connection) {
- // TODO: このノートがストリーミング経由で流れてきた場合のみ sr する
- connection.send(document.body.contains(props.rootEl.value ?? null as Node | null) ? 'sr' : 's', { id: note.value.id });
- if (pureNote.value.id !== note.value.id) connection.send('s', { id: pureNote.value.id });
- if (withHandler) connection.on('noteUpdated', onStreamNoteUpdated);
- }
- }
-
- function decapture(withHandler = false): void {
- if (connection) {
- connection.send('un', {
- id: note.value.id,
- });
- if (pureNote.value.id !== note.value.id) {
- connection.send('un', {
- id: pureNote.value.id,
- });
- }
- if (withHandler) connection.off('noteUpdated', onStreamNoteUpdated);
- }
- }
-
- function onStreamConnected() {
- capture(false);
- }
-
- capture(true);
- if (connection) {
- connection.on('_connected_', onStreamConnected);
- }
-
- onUnmounted(() => {
- decapture(true);
- if (connection) {
- connection.off('_connected_', onStreamConnected);
- }
- });
-}