From f72e3f61e913c07593565a6a3d6a1101be2098ab Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 31 Aug 2025 20:00:48 +0900 Subject: [PATCH] display raw content read from qr --- .../frontend/src/pages/qr.read.raw-viewer.vue | 43 +++++++++++++++++++ packages/frontend/src/pages/qr.read.vue | 43 +++++++++++++------ 2 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 packages/frontend/src/pages/qr.read.raw-viewer.vue diff --git a/packages/frontend/src/pages/qr.read.raw-viewer.vue b/packages/frontend/src/pages/qr.read.raw-viewer.vue new file mode 100644 index 0000000000..5e8a32c17a --- /dev/null +++ b/packages/frontend/src/pages/qr.read.raw-viewer.vue @@ -0,0 +1,43 @@ + + + diff --git a/packages/frontend/src/pages/qr.read.vue b/packages/frontend/src/pages/qr.read.vue index 3ff63016a2..a9130f01d1 100644 --- a/packages/frontend/src/pages/qr.read.vue +++ b/packages/frontend/src/pages/qr.read.vue @@ -41,6 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only +
@@ -49,6 +50,9 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ +
@@ -68,6 +72,7 @@ import { misskeyApi } from '@/utility/misskey-api.js'; import MkNote from '@/components/MkNote.vue'; import MkTab from '@/components/MkTab.vue'; import MkButton from '@/components/MkButton.vue'; +import MkQrReadRawViewer from '@/pages/qr.read.raw-viewer.vue'; const LIST_RERENDER_INTERVAL = 1500; @@ -80,8 +85,11 @@ const scrollHeight = ref(window.innerHeight); const scannerInstance = shallowRef(null); -const tab = ref<'users' | 'notes'>('users'); +const tab = ref<'users' | 'notes' | 'all'>('users'); +// higher is recent +const results = ref(new Set()); +// lower is recent const uris = ref([]); const sources = new Map(); const users = ref<(misskey.entities.UserDetailed)[]>([]); @@ -92,10 +100,10 @@ const notesCount = ref(0); const timer = ref(null); function updateLists() { - const results = uris.value.map(uri => sources.get(uri)).filter((r): r is ApShowResponse => !!r); - users.value = results.filter(r => r.type === 'User').map(r => r.object).filter((u): u is misskey.entities.UserDetailed => !!u); + const responses = uris.value.map(uri => sources.get(uri)).filter((r): r is ApShowResponse => !!r); + users.value = responses.filter(r => r.type === 'User').map(r => r.object).filter((u): u is misskey.entities.UserDetailed => !!u); usersCount.value = users.value.length; - notes.value = results.filter(r => r.type === 'Note').map(r => r.object).filter((n): n is misskey.entities.Note => !!n); + notes.value = responses.filter(r => r.type === 'Note').map(r => r.object).filter((n): n is misskey.entities.Note => !!n); notesCount.value = notes.value.length; updateRequired.value = false; } @@ -128,29 +136,38 @@ watch(tab, () => { async function processResult(result: QrScanner.ScanResult) { if (!result) return; - const uri = result.data.trim(); + const trimmed = result.data.trim(); + + if (!trimmed) return; + + const haveExisted = results.value.has(trimmed); + results.value.add(trimmed); + try { - new URL(uri); + new URL(trimmed); } catch { + if (!haveExisted) { + tab.value = 'all'; + } return; } - if (uris.value[0] !== uri) { + if (uris.value[0] !== trimmed) { // 並べ替え - uris.value = [uri, ...uris.value.slice(0, 29).filter(u => u !== uri)]; + uris.value = [trimmed, ...uris.value.slice(0, 29).filter(u => u !== trimmed)]; } - if (sources.has(uri)) return; + if (sources.has(trimmed)) return; // Start fetching user info - sources.set(uri, null); + sources.set(trimmed, null); - await misskeyApi('ap/show', { uri }) + await misskeyApi('ap/show', { uri: trimmed }) .then(data => { if (data.type === 'User') { - sources.set(uri, data); + sources.set(trimmed, data); tab.value = 'users'; } else if (data.type === 'Note') { - sources.set(uri, data); + sources.set(trimmed, data); tab.value = 'notes'; } updateLists();