2e55c292bf
this should be enough "merging" of lookup&search: * partial usernames are searched as part of notes from the widget, and as part of known usernames in "search users" * tags are searched as part of notes from the widget and the "search notes" page * full usernames always navigate to the profile page of that user (which will fetch the profile if possible) as an extra nicety, if "search notes" is disabled, the search widget handles hashtags like the lookup function does
84 lines
2.2 KiB
Vue
84 lines
2.2 KiB
Vue
<!--
|
|
SPDX-FileCopyrightText: syuilo and other misskey contributors
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
-->
|
|
|
|
<template>
|
|
<div class="_gaps">
|
|
<div class="_gaps">
|
|
<MkInput v-model="searchQuery" :large="true" :autofocus="true" type="search" @enter="search">
|
|
<template #prefix><i class="ph-magnifying-glass ph-bold ph-lg"></i></template>
|
|
</MkInput>
|
|
<MkRadios v-model="searchOrigin" @update:modelValue="search()">
|
|
<option value="combined">{{ i18n.ts.all }}</option>
|
|
<option value="local">{{ i18n.ts.local }}</option>
|
|
<option value="remote">{{ i18n.ts.remote }}</option>
|
|
</MkRadios>
|
|
<MkButton large primary gradate rounded @click="search">{{ i18n.ts.search }}</MkButton>
|
|
</div>
|
|
|
|
<MkFoldableSection v-if="userPagination">
|
|
<template #header>{{ i18n.ts.searchResult }}</template>
|
|
<MkUserList :key="key" :pagination="userPagination"/>
|
|
</MkFoldableSection>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ref } from 'vue';
|
|
import MkUserList from '@/components/MkUserList.vue';
|
|
import MkInput from '@/components/MkInput.vue';
|
|
import MkRadios from '@/components/MkRadios.vue';
|
|
import MkButton from '@/components/MkButton.vue';
|
|
import { i18n } from '@/i18n.js';
|
|
import * as os from '@/os.js';
|
|
import MkFoldableSection from '@/components/MkFoldableSection.vue';
|
|
import { useRouter } from '@/router.js';
|
|
|
|
const router = useRouter();
|
|
|
|
const key = ref('');
|
|
const searchQuery = ref('');
|
|
const searchOrigin = ref('combined');
|
|
const userPagination = ref();
|
|
|
|
async function search() {
|
|
const query = searchQuery.value.toString().trim();
|
|
|
|
if (query == null || query === '') return;
|
|
|
|
if (query.startsWith('https://')) {
|
|
const promise = os.api('ap/show', {
|
|
uri: query,
|
|
});
|
|
|
|
os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject);
|
|
|
|
const res = await promise;
|
|
|
|
if (res.type === 'User') {
|
|
router.push(`/@${res.object.username}@${res.object.host}`);
|
|
} else if (res.type === 'Note') {
|
|
router.push(`/notes/${res.object.id}`);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (query.match(/^@[a-z0-9_.-]+@[a-z0-9_.-]+$/i)) {
|
|
router.push(`/${query}`);
|
|
return;
|
|
}
|
|
|
|
userPagination.value = {
|
|
endpoint: 'users/search',
|
|
limit: 10,
|
|
params: {
|
|
query: query,
|
|
origin: searchOrigin.value,
|
|
},
|
|
};
|
|
|
|
key.value = query;
|
|
}
|
|
</script>
|