From 759eb35bc6d53d4cf3c3ad0cbb8aceeb15059ea1 Mon Sep 17 00:00:00 2001 From: Webifi Date: Sat, 3 Jun 2023 16:50:08 -0500 Subject: [PATCH] Add UI for default profile --- src/app.scss | 4 +++ src/lib/ChatSettingField.svelte | 50 +++++++++++++++++++++++++-------- src/lib/Settings.svelte | 28 ++++++++++++++++-- src/lib/Storage.svelte | 6 ++++ src/lib/Types.svelte | 15 +++++++++- 5 files changed, 88 insertions(+), 15 deletions(-) diff --git a/src/app.scss b/src/app.scss index 2d41614..5658593 100644 --- a/src/app.scss +++ b/src/app.scss @@ -117,6 +117,10 @@ html { min-height: 100vh; } +select option.is-default { + background-color: #0842e058; +} + .is-disabled { pointer-events: none; cursor: default; diff --git a/src/lib/ChatSettingField.svelte b/src/lib/ChatSettingField.svelte index 615308a..36a651d 100644 --- a/src/lib/ChatSettingField.svelte +++ b/src/lib/ChatSettingField.svelte @@ -2,9 +2,10 @@ import { createEventDispatcher } from 'svelte' import { getProfile } from './Profiles.svelte' import { addChat, cleanSettingValue, setChatSettingValue } from './Storage.svelte' - import type { Chat, ChatSetting, ChatSettings, SettingPrompt } from './Types.svelte' + import type { Chat, ChatSetting, ChatSettings, ControlAction, FieldControl, SettingPrompt } from './Types.svelte' import { autoGrowInputOnEvent } from './Util.svelte' import { replace } from 'svelte-spa-router' + import Fa from 'svelte-fa/src/fa.svelte' export let setting:ChatSetting export let chatSettings:ChatSettings @@ -14,6 +15,10 @@ const chatId = chat.id + const fieldControls:ControlAction[] = (setting.fieldControls || [] as FieldControl[]).map(fc => { + return fc.getAction(chatId, setting, chatSettings[setting.key]) + }) + if (originalProfile) { // eventually... } @@ -36,7 +41,8 @@ { prompt: 'Would you like to start a new chat session with this profile?', checkPrompt: (setting, newVal, oldVal) => { - return newVal !== oldVal + return chat.sessionStarted && newVal !== originalProfile && + (getProfile(newVal).characterName !== chatSettings.characterName) }, onYes: (setting, newVal, oldVal) => { // start new char session, apply this profile, amd start it @@ -46,6 +52,7 @@ replace(`/chat/${newChatId}`) return true }, + onNo: (setting, newVal, oldVal) => true, // Continue on no passed: false }, { @@ -54,6 +61,7 @@ return chat.sessionStarted && newVal !== originalProfile && (getProfile(newVal).characterName !== chatSettings.characterName) }, + onYes: (setting, newVal, oldVal) => true, passed: false } ] @@ -116,12 +124,14 @@ } } else { // roll-back - setChatSettingValue(chatId, setting, val) - // refresh setting modal, if open - c.onNo && c.onNo(setting, newVal, val) - refreshSettings() - resetSettingCheck(setting.key) - return + if (!c.onNo || !c.onNo(setting, newVal, val)) { + setChatSettingValue(chatId, setting, val) + // refresh setting modal, if open + c.onNo && c.onNo(setting, newVal, val) + refreshSettings() + resetSettingCheck(setting.key) + return + } } } else { c.passed = true @@ -172,7 +182,7 @@ {/if}
-
+
{#if setting.type === 'number'} queueSettingValueChange(e, setting)} /> {:else if setting.type === 'select'} -
+ +
-
+
+ {#each fieldControls as cont} +
+ +
+ {/each} + {:else if setting.type === 'text'}
import { applyProfile } from './Profiles.svelte' - import { getChatSettings } from './Storage.svelte' + import { getChatSettings, getGlobalSettings, setGlobalSettingValueByKey } from './Storage.svelte' import { encode } from 'gpt-tokenizer' + import { faCheck, faThumbTack } from '@fortawesome/free-solid-svg-icons/index' // Setting definitions import { @@ -11,7 +12,10 @@ import { type GlobalSetting, type GlobalSettings, type Request, - type Model + type Model, + + type ControlAction + } from './Types.svelte' export const defaultModel:Model = 'gpt-3.5-turbo-0301' @@ -103,7 +107,25 @@ const profileSetting: ChatSetting & SettingSelect = { applyProfile(chatId) return true // Signal we should refresh the setting modal }, - setDefault: (chatId, setting, value) => {} + fieldControls: [{ + getAction: (chatId, setting, value) => { + if (value === getGlobalSettings().defaultProfile) { + return { + title: 'This profile is currently your default', + icon: faCheck + } as ControlAction + } else { + return { + title: 'Set this profile as your default', + icon: faThumbTack, + class: 'is-info', + action: (chatId, setting, value) => { + setGlobalSettingValueByKey('defaultProfile', value) + } + } as ControlAction + } + } + }] } // Settings that will not be part of the API request diff --git a/src/lib/Storage.svelte b/src/lib/Storage.svelte index 2a9ce8d..8ba7f3b 100644 --- a/src/lib/Storage.svelte +++ b/src/lib/Storage.svelte @@ -333,6 +333,12 @@ globalStorage.set(store) } + + export const getGlobalSettingValue = (key:keyof GlobalSetting, value):any => { + const store = get(globalStorage) + return store[key] + } + export const getGlobalSettings = ():GlobalSettings => { return get(globalStorage) } diff --git a/src/lib/Types.svelte b/src/lib/Types.svelte index d68affd..7202a5b 100644 --- a/src/lib/Types.svelte +++ b/src/lib/Types.svelte @@ -144,6 +144,19 @@ type SettingBoolean = { type: 'other'; }; + export type ControlAction = { + title:string; + icon?:any, + text?:string; + class?:string; + disabled?:boolean; + action?: (chatId:number, setting:any, value:any) => any; + }; + + export type FieldControl = { + getAction: (chatId:number, setting:any, value:any) => ControlAction; + }; + export type ChatSetting = { key: keyof ChatSettings; name: string; @@ -155,7 +168,7 @@ type SettingBoolean = { placeholder?: string; hide?: (chatId:number) => boolean; apiTransform?: (chatId:number, setting:ChatSetting, value:any) => any; - setDefault?: (chatId:number, setting:ChatSetting, value:any) => any; + fieldControls?: FieldControl[]; beforeChange?: (chatId:number, setting:ChatSetting, value:any) => boolean; afterChange?: (chatId:number, setting:ChatSetting, value:any) => boolean; } & (SettingNumber | SettingSelect | SettingBoolean | SettingText | SettingTextArea | SettingOther);