<script lang="ts"> import { models, showSettings, settings, user, mobile, config } from '$lib/stores'; import { onMount, tick, getContext } from 'svelte'; import { toast } from 'svelte-sonner'; import Selector from './ModelSelector/Selector.svelte'; import Tooltip from '../common/Tooltip.svelte'; import { setDefaultModels } from '$lib/apis/configs'; import { updateUserSettings } from '$lib/apis/users'; const i18n = getContext('i18n'); export let selectedModels = ['']; export let disabled = false; export let showSetDefault = true; const saveDefaultModel = async () => { const hasEmptyModel = selectedModels.filter((it) => it === ''); if (hasEmptyModel.length) { toast.error($i18n.t('Choose a model before saving...')); return; } settings.set({ ...$settings, models: selectedModels }); await updateUserSettings(localStorage.token, { ui: $settings }); toast.success($i18n.t('Default model updated')); }; $: if (selectedModels.length > 0 && $models.length > 0) { selectedModels = selectedModels.map((model) => $models.map((m) => m.id).includes(model) ? model : '' ); } </script> <div class="flex flex-col w-full items-start"> {#each selectedModels as selectedModel, selectedModelIdx} <div class="flex w-full max-w-fit"> <div class="overflow-hidden w-full"> <div class="mr-1 max-w-full"> <Selector placeholder={$i18n.t('Select a model')} items={$models.map((model) => ({ value: model.id, label: model.name, model: model }))} showTemporaryChatControl={$user.role === 'user' ? ($config?.permissions?.chat?.temporary ?? true) : true} bind:value={selectedModel} /> </div> </div> {#if selectedModelIdx === 0} <div class=" self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]" > <Tooltip content={$i18n.t('Add Model')}> <button class=" " {disabled} on:click={() => { selectedModels = [...selectedModels, '']; }} aria-label="Add Model" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-3.5" > <path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" /> </svg> </button> </Tooltip> </div> {:else} <div class=" self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]" > <Tooltip content={$i18n.t('Remove Model')}> <button {disabled} on:click={() => { selectedModels.splice(selectedModelIdx, 1); selectedModels = selectedModels; }} aria-label="Remove Model" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-3" > <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" /> </svg> </button> </Tooltip> </div> {/if} </div> {/each} </div> {#if showSetDefault} <div class=" absolute text-left mt-[1px] ml-1 text-[0.7rem] text-gray-500 font-primary"> <button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button> </div> {/if}