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 @@
+
+
+ {{ data.split('\n')[0] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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();