fdrah
initial-commit
9e93b10
Raw
History Blame Contribute Delete
2.5 kB
<script lang="ts">
import Fuse from "fuse.js";
import { createEventDispatcher, onDestroy, onMount } from "svelte";
import { tick, getContext } from "svelte";
import { models } from "$lib/stores";
import { REXPRO_API_BASE_URL, REXPRO_BASE_URL } from "$lib/constants";
import Tooltip from "$lib/components/common/Tooltip.svelte";
const i18n = getContext("i18n");
export let query = "";
export let onSelect = (e) => {};
let selectedIdx = 0;
export let filteredItems = [];
let fuse = new Fuse(
$models
.filter((model) => !model?.info?.meta?.hidden)
.map((model) => {
const _item = {
...model,
modelName: model?.name,
tags: model?.info?.meta?.tags
?.map((tag) => tag.name)
.join(" "),
desc: model?.info?.meta?.description,
};
return _item;
}),
{
keys: ["value", "tags", "modelName"],
threshold: 0.5,
},
);
$: filteredItems = query
? fuse.search(query).map((e) => {
return e.item;
})
: $models.filter((model) => !model?.info?.meta?.hidden);
$: if (query) {
selectedIdx = 0;
}
export const selectUp = () => {
selectedIdx = Math.max(0, selectedIdx - 1);
};
export const selectDown = () => {
selectedIdx = Math.min(selectedIdx + 1, filteredItems.length - 1);
};
export const select = async () => {
const model = filteredItems[selectedIdx];
if (model) {
onSelect({ type: "model", data: model });
}
};
</script>
<div class="px-2 text-xs text-gray-500 py-1">
{$i18n.t("Models")}
</div>
{#if filteredItems.length > 0}
{#each filteredItems as model, modelIdx}
<Tooltip content={model.id} placement="top-start">
<button
class="px-2.5 py-1.5 rounded-xl w-full text-left {modelIdx ===
selectedIdx
? 'bg-gray-50 dark:bg-gray-800 selected-command-option-button'
: ''}"
type="button"
on:click={() => {
onSelect({ type: "model", data: model });
}}
on:mousemove={() => {
selectedIdx = modelIdx;
}}
on:focus={() => {}}
data-selected={modelIdx === selectedIdx}
>
<div class="flex text-black dark:text-gray-100 line-clamp-1">
<img
src={`${REXPRO_API_BASE_URL}/models/model/profile/image?id=${model.id}&lang=${$i18n.language}`}
alt={model?.name ?? model.id}
class="rounded-full size-5 items-center mr-2"
on:error={(e) => {
e.currentTarget.src = "/favicon.png";
}}
/>
<div class="truncate">
{model.name}
</div>
</div>
</button>
</Tooltip>
{/each}
{/if}