Migrate to svelte 5
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
<script lang="ts">
|
||||
import { run } from 'svelte/legacy';
|
||||
|
||||
import Suggestion from './Suggestion.svelte';
|
||||
import AdvancedChatEditor from './AdvancedChatEditor.svelte';
|
||||
import { CameraIcon, DatabaseIcon, DicesIcon, GlobeIcon, ImagePlusIcon, LanguagesIcon, Laugh, MenuIcon, MicOffIcon, PackageIcon, Plus, RefreshCcwIcon, ReplyIcon, Send, StepForwardIcon } from "lucide-svelte";
|
||||
import { CurrentCharacter, CurrentChat, CurrentUsername, selectedCharID, CurrentUserIcon, CurrentShowMemoryLimit,CurrentSimpleCharacter, PlaygroundStore, UserIconProtrait } from "../../ts/stores";
|
||||
import { selectedCharID, CurrentShowMemoryLimit, PlaygroundStore, UserIconProtrait, createSimpleCharacter } from "../../ts/stores";
|
||||
import Chat from "./Chat.svelte";
|
||||
import { DataBase, type Message, type character, type groupChat } from "../../ts/storage/database";
|
||||
import { getCharImage } from "../../ts/characters";
|
||||
@@ -27,20 +29,18 @@
|
||||
import PlaygroundMenu from '../Playground/PlaygroundMenu.svelte';
|
||||
import { ConnectionOpenStore } from 'src/ts/sync/multiuser';
|
||||
|
||||
let messageInput:string = ''
|
||||
let messageInputTranslate:string = ''
|
||||
let openMenu = false
|
||||
let loadPages = 30
|
||||
let autoMode = false
|
||||
let messageInput:string = $state('')
|
||||
let messageInputTranslate:string = $state('')
|
||||
let openMenu = $state(false)
|
||||
let loadPages = $state(30)
|
||||
let autoMode = $state(false)
|
||||
let rerolls:Message[][] = []
|
||||
let rerollid = -1
|
||||
let lastCharId = -1
|
||||
let doingChatInputTranslate = false
|
||||
let currentCharacter:character|groupChat = $CurrentCharacter
|
||||
let toggleStickers:boolean = false
|
||||
let fileInput:string[] = []
|
||||
export let openModuleList = false
|
||||
export let openChatList:boolean = false
|
||||
let currentCharacter:character|groupChat = $state($DataBase.characters[$selectedCharID])
|
||||
let toggleStickers:boolean = $state(false)
|
||||
let fileInput:string[] = $state([])
|
||||
|
||||
async function send(){
|
||||
return sendMain(false)
|
||||
@@ -83,7 +83,7 @@
|
||||
cha.push({
|
||||
role: 'user',
|
||||
data: '*says nothing*',
|
||||
name: $ConnectionOpenStore ? $CurrentUsername : null
|
||||
name: $ConnectionOpenStore ? $DataBase.username : null
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -101,7 +101,7 @@
|
||||
role: 'user',
|
||||
data: await processScript(char,messageInput,'editinput'),
|
||||
time: Date.now(),
|
||||
name: $ConnectionOpenStore ? $CurrentUsername : null
|
||||
name: $ConnectionOpenStore ? $DataBase.username : null
|
||||
})
|
||||
}
|
||||
else{
|
||||
@@ -109,7 +109,7 @@
|
||||
role: 'user',
|
||||
data: messageInput,
|
||||
time: Date.now(),
|
||||
name: $ConnectionOpenStore ? $CurrentUsername : null
|
||||
name: $ConnectionOpenStore ? $DataBase.username : null
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -131,11 +131,11 @@
|
||||
rerolls = []
|
||||
rerollid = -1
|
||||
}
|
||||
const genId = $CurrentChat.message.at(-1)?.generationInfo?.generationId
|
||||
const genId = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.at(-1)?.generationInfo?.generationId
|
||||
if(genId){
|
||||
const r = Prereroll(genId)
|
||||
if(r){
|
||||
$CurrentChat.message[$CurrentChat.message.length - 1].data = r
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message[$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length - 1].data = r
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -144,20 +144,20 @@
|
||||
let db = $DataBase
|
||||
rerollid += 1
|
||||
let rerollData = structuredClone(rerolls[rerollid])
|
||||
let msgs = db.characters[$selectedCharID].chats[$CurrentCharacter.chatPage].message
|
||||
let msgs = db.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message
|
||||
for(let i = 0; i < rerollData.length; i++){
|
||||
msgs[msgs.length - rerollData.length + i] = rerollData[i]
|
||||
}
|
||||
db.characters[$selectedCharID].chats[$CurrentCharacter.chatPage].message = msgs
|
||||
db.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message = msgs
|
||||
$DataBase = db
|
||||
}
|
||||
return
|
||||
}
|
||||
if(rerolls.length === 0){
|
||||
rerolls.push(structuredClone([$CurrentChat.message.at(-1)]))
|
||||
rerolls.push(structuredClone([$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.at(-1)]))
|
||||
rerollid = rerolls.length - 1
|
||||
}
|
||||
let cha = structuredClone($CurrentChat.message)
|
||||
let cha = structuredClone($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message)
|
||||
if(cha.length === 0 ){
|
||||
return
|
||||
}
|
||||
@@ -176,7 +176,7 @@
|
||||
return
|
||||
}
|
||||
}
|
||||
$CurrentChat.message = cha
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message = cha
|
||||
await sendChatMain()
|
||||
}
|
||||
|
||||
@@ -188,11 +188,11 @@
|
||||
rerolls = []
|
||||
rerollid = -1
|
||||
}
|
||||
const genId = $CurrentChat.message.at(-1)?.generationInfo?.generationId
|
||||
const genId = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.at(-1)?.generationInfo?.generationId
|
||||
if(genId){
|
||||
const r = PreUnreroll(genId)
|
||||
if(r){
|
||||
$CurrentChat.message[$CurrentChat.message.length - 1].data = r
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message[$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length - 1].data = r
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -203,11 +203,11 @@
|
||||
let db = $DataBase
|
||||
rerollid -= 1
|
||||
let rerollData = structuredClone(rerolls[rerollid])
|
||||
let msgs = db.characters[$selectedCharID].chats[$CurrentCharacter.chatPage].message
|
||||
let msgs = db.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message
|
||||
for(let i = 0; i < rerollData.length; i++){
|
||||
msgs[msgs.length - rerollData.length + i] = rerollData[i]
|
||||
}
|
||||
db.characters[$selectedCharID].chats[$CurrentCharacter.chatPage].message = msgs
|
||||
db.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message = msgs
|
||||
$DataBase = db
|
||||
}
|
||||
}
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
async function sendChatMain(continued:boolean = false) {
|
||||
|
||||
let previousLength = $CurrentChat.message.length
|
||||
let previousLength = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length
|
||||
messageInput = ''
|
||||
abortController = new AbortController()
|
||||
try {
|
||||
@@ -224,8 +224,8 @@
|
||||
signal:abortController.signal,
|
||||
continue:continued
|
||||
})
|
||||
if(previousLength < $CurrentChat.message.length){
|
||||
rerolls.push(structuredClone($CurrentChat.message).slice(previousLength))
|
||||
if(previousLength < $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length){
|
||||
rerolls.push(structuredClone($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message).slice(previousLength))
|
||||
rerollid = rerolls.length - 1
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -261,11 +261,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
export let customStyle = ''
|
||||
let inputHeight = "44px"
|
||||
let inputEle:HTMLTextAreaElement
|
||||
let inputTranslateHeight = "44px"
|
||||
let inputTranslateEle:HTMLTextAreaElement
|
||||
interface Props {
|
||||
openModuleList?: boolean;
|
||||
openChatList?: boolean;
|
||||
customStyle?: string;
|
||||
}
|
||||
|
||||
let { openModuleList = $bindable(false), openChatList = $bindable(false), customStyle = '' }: Props = $props();
|
||||
let inputHeight = $state("44px")
|
||||
let inputEle:HTMLTextAreaElement = $state()
|
||||
let inputTranslateHeight = $state("44px")
|
||||
let inputTranslateEle:HTMLTextAreaElement = $state()
|
||||
|
||||
function updateInputSizeAll() {
|
||||
updateInputSize()
|
||||
@@ -287,7 +293,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
$: updateInputSizeAll()
|
||||
run(() => {
|
||||
updateInputSizeAll()
|
||||
});
|
||||
|
||||
async function updateInputTransateMessage(reverse: boolean) {
|
||||
if(isExpTranslator()){
|
||||
@@ -388,13 +396,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
$: {
|
||||
currentCharacter = $CurrentCharacter
|
||||
}
|
||||
run(() => {
|
||||
currentCharacter = $DataBase.characters[$selectedCharID]
|
||||
});
|
||||
</script>
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<div class="w-full h-full" style={customStyle} on:click={() => {
|
||||
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
||||
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
||||
<div class="w-full h-full" style={customStyle} onclick={() => {
|
||||
openMenu = false
|
||||
}}>
|
||||
{#if $selectedCharID < 0}
|
||||
@@ -404,16 +412,16 @@
|
||||
<PlaygroundMenu />
|
||||
{/if}
|
||||
{:else}
|
||||
<div class="h-full w-full flex flex-col-reverse overflow-y-auto relative default-chat-screen" on:scroll={(e) => {
|
||||
<div class="h-full w-full flex flex-col-reverse overflow-y-auto relative default-chat-screen" onscroll={(e) => {
|
||||
//@ts-ignore
|
||||
const scrolled = (e.target.scrollHeight - e.target.clientHeight + e.target.scrollTop)
|
||||
if(scrolled < 100 && $CurrentChat.message.length > loadPages){
|
||||
if(scrolled < 100 && $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length > loadPages){
|
||||
loadPages += 15
|
||||
}
|
||||
}}>
|
||||
<div class="flex items-stretch mt-2 mb-2 w-full">
|
||||
{#if $DataBase.useChatSticker && currentCharacter.type !== 'group'}
|
||||
<div on:click={()=>{toggleStickers = !toggleStickers}}
|
||||
<div onclick={()=>{toggleStickers = !toggleStickers}}
|
||||
class={"ml-4 bg-textcolor2 flex justify-center items-center w-12 h-12 rounded-md hover:bg-green-500 transition-colors "+(toggleStickers ? 'text-green-500':'text-textcolor')}>
|
||||
<Laugh/>
|
||||
</div>
|
||||
@@ -423,7 +431,7 @@
|
||||
<textarea class="peer focus:border-textcolor transition-colors outline-none text-textcolor p-2 min-w-0 border border-r-0 bg-transparent rounded-md rounded-r-none input-text text-xl flex-grow ml-4 border-darkborderc resize-none overflow-y-hidden overflow-x-hidden max-w-full"
|
||||
bind:value={messageInput}
|
||||
bind:this={inputEle}
|
||||
on:keydown={(e) => {
|
||||
onkeydown={(e) => {
|
||||
if(e.key.toLocaleLowerCase() === "enter" && (!e.shiftKey) && !e.isComposing){
|
||||
if($DataBase.sendWithEnter){
|
||||
send()
|
||||
@@ -435,37 +443,36 @@
|
||||
e.preventDefault()
|
||||
}
|
||||
}}
|
||||
on:input={()=>{updateInputSizeAll();updateInputTransateMessage(false)}}
|
||||
oninput={()=>{updateInputSizeAll();updateInputTransateMessage(false)}}
|
||||
style:height={inputHeight}
|
||||
/>
|
||||
></textarea>
|
||||
{:else}
|
||||
<AdvancedChatEditor
|
||||
bind:value={messageInput}
|
||||
bind:translate={messageInputTranslate}
|
||||
on:change={(e) => { updateInputTransateMessage(e.detail.translate);}}
|
||||
/>
|
||||
{/if}
|
||||
|
||||
|
||||
{#if $doingChat || doingChatInputTranslate}
|
||||
<button
|
||||
class="peer-focus:border-textcolor flex justify-center border-y border-darkborderc items-center text-gray-100 p-3 hover:bg-blue-500 transition-colors" on:click={abortChat}
|
||||
class="peer-focus:border-textcolor flex justify-center border-y border-darkborderc items-center text-gray-100 p-3 hover:bg-blue-500 transition-colors" onclick={abortChat}
|
||||
style:height={inputHeight}
|
||||
>
|
||||
<div class="loadmove chat-process-stage-{$chatProcessStage}" class:autoload={autoMode} />
|
||||
<div class="loadmove chat-process-stage-{$chatProcessStage}" class:autoload={autoMode}></div>
|
||||
</button>
|
||||
{:else}
|
||||
<button
|
||||
on:click={send}
|
||||
onclick={send}
|
||||
class="flex justify-center border-y border-darkborderc items-center text-gray-100 p-3 peer-focus:border-textcolor hover:bg-blue-500 transition-colors"
|
||||
style:height={inputHeight}
|
||||
>
|
||||
<Send />
|
||||
</button>
|
||||
{/if}
|
||||
{#if $CurrentCharacter?.chaId !== '§playground'}
|
||||
{#if $DataBase.characters[$selectedCharID]?.chaId !== '§playground'}
|
||||
<button
|
||||
on:click={(e) => {
|
||||
onclick={(e) => {
|
||||
openMenu = !openMenu
|
||||
e.stopPropagation()
|
||||
}}
|
||||
@@ -475,12 +482,12 @@
|
||||
<MenuIcon />
|
||||
</button>
|
||||
{:else}
|
||||
<div on:click={(e) => {
|
||||
$CurrentChat.message.push({
|
||||
<div onclick={(e) => {
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.push({
|
||||
role: 'char',
|
||||
data: ''
|
||||
})
|
||||
$CurrentChat = $CurrentChat
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage] = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage]
|
||||
}}
|
||||
class="peer-focus:border-textcolor mr-2 flex border-y border-r border-darkborderc justify-center items-center text-gray-100 p-3 rounded-r-md hover:bg-blue-500 transition-colors"
|
||||
style:height={inputHeight}
|
||||
@@ -489,7 +496,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{#if $DataBase.useAutoTranslateInput && !$DataBase.useAdvancedEditor && $CurrentCharacter?.chaId !== '§playground'}
|
||||
{#if $DataBase.useAutoTranslateInput && !$DataBase.useAdvancedEditor && $DataBase.characters[$selectedCharID]?.chaId !== '§playground'}
|
||||
<div class="flex items-center mt-2 mb-2">
|
||||
<label for='messageInputTranslate' class="text-textcolor ml-4">
|
||||
<LanguagesIcon />
|
||||
@@ -497,7 +504,7 @@
|
||||
<textarea id = 'messageInputTranslate' class="text-textcolor rounded-md p-2 min-w-0 bg-transparent input-text text-xl flex-grow ml-4 mr-2 border-darkbutton resize-none focus:bg-selected overflow-y-hidden overflow-x-hidden max-w-full"
|
||||
bind:value={messageInputTranslate}
|
||||
bind:this={inputTranslateEle}
|
||||
on:keydown={(e) => {
|
||||
onkeydown={(e) => {
|
||||
if(e.key.toLocaleLowerCase() === "enter" && (!e.shiftKey)){
|
||||
if($DataBase.sendWithEnter){
|
||||
send()
|
||||
@@ -509,10 +516,10 @@
|
||||
e.preventDefault()
|
||||
}
|
||||
}}
|
||||
on:input={()=>{updateInputSizeAll();updateInputTransateMessage(true)}}
|
||||
oninput={()=>{updateInputSizeAll();updateInputTransateMessage(true)}}
|
||||
placeholder={language.enterMessageForTranslateToEnglish}
|
||||
style:height={inputTranslateHeight}
|
||||
/>
|
||||
></textarea>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -552,20 +559,20 @@
|
||||
)} {send}/>
|
||||
{/if}
|
||||
|
||||
{#each messageForm($CurrentChat.message, loadPages) as chat, i}
|
||||
{#each messageForm($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message, loadPages) as chat, i}
|
||||
{#if chat.role === 'char'}
|
||||
{#if $CurrentCharacter.type !== 'group'}
|
||||
{#if $DataBase.characters[$selectedCharID].type !== 'group'}
|
||||
<Chat
|
||||
idx={chat.index}
|
||||
name={$CurrentCharacter.name}
|
||||
name={$DataBase.characters[$selectedCharID].name}
|
||||
message={chat.data}
|
||||
img={getCharImage($CurrentCharacter.image, 'css')}
|
||||
img={getCharImage($DataBase.characters[$selectedCharID].image, 'css')}
|
||||
rerollIcon={i === 0}
|
||||
onReroll={reroll}
|
||||
unReroll={unReroll}
|
||||
isLastMemory={$CurrentChat.lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
character={$CurrentSimpleCharacter}
|
||||
largePortrait={$CurrentCharacter.largePortrait}
|
||||
isLastMemory={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
character={createSimpleCharacter($DataBase.characters[$selectedCharID])}
|
||||
largePortrait={$DataBase.characters[$selectedCharID].largePortrait}
|
||||
messageGenerationInfo={chat.generationInfo}
|
||||
/>
|
||||
{:else}
|
||||
@@ -577,7 +584,7 @@
|
||||
onReroll={reroll}
|
||||
unReroll={unReroll}
|
||||
img={getCharImage(findCharacterbyId(chat.saying).image, 'css')}
|
||||
isLastMemory={$CurrentChat.lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
isLastMemory={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
character={chat.saying}
|
||||
largePortrait={findCharacterbyId(chat.saying).largePortrait}
|
||||
messageGenerationInfo={chat.generationInfo}
|
||||
@@ -585,32 +592,32 @@
|
||||
{/if}
|
||||
{:else}
|
||||
<Chat
|
||||
character={$CurrentSimpleCharacter}
|
||||
character={createSimpleCharacter($DataBase.characters[$selectedCharID])}
|
||||
idx={chat.index}
|
||||
name={chat.name ?? $CurrentUsername}
|
||||
name={chat.name ?? $DataBase.username}
|
||||
message={chat.data}
|
||||
img={$ConnectionOpenStore ? '' : getCharImage($CurrentUserIcon, 'css')}
|
||||
isLastMemory={$CurrentChat.lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
img={$ConnectionOpenStore ? '' : getCharImage($DataBase.userIcon, 'css')}
|
||||
isLastMemory={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].lastMemory === (chat.chatId ?? 'none') && $CurrentShowMemoryLimit}
|
||||
largePortrait={$UserIconProtrait}
|
||||
messageGenerationInfo={chat.generationInfo}
|
||||
/>
|
||||
{/if}
|
||||
{/each}
|
||||
{#if $CurrentChat.message.length <= loadPages}
|
||||
{#if $CurrentCharacter.type !== 'group' }
|
||||
{#if $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length <= loadPages}
|
||||
{#if $DataBase.characters[$selectedCharID].type !== 'group' }
|
||||
<Chat
|
||||
character={$CurrentSimpleCharacter}
|
||||
name={$CurrentCharacter.name}
|
||||
message={$CurrentChat.fmIndex === -1 ? $CurrentCharacter.firstMessage :
|
||||
$CurrentCharacter.alternateGreetings[$CurrentChat.fmIndex]}
|
||||
img={getCharImage($CurrentCharacter.image, 'css')}
|
||||
character={createSimpleCharacter($DataBase.characters[$selectedCharID])}
|
||||
name={$DataBase.characters[$selectedCharID].name}
|
||||
message={$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].fmIndex === -1 ? $DataBase.characters[$selectedCharID].firstMessage :
|
||||
$DataBase.characters[$selectedCharID].alternateGreetings[$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].fmIndex]}
|
||||
img={getCharImage($DataBase.characters[$selectedCharID].image, 'css')}
|
||||
idx={-1}
|
||||
altGreeting={$CurrentCharacter.alternateGreetings.length > 0}
|
||||
largePortrait={$CurrentCharacter.largePortrait}
|
||||
altGreeting={$DataBase.characters[$selectedCharID].alternateGreetings.length > 0}
|
||||
largePortrait={$DataBase.characters[$selectedCharID].largePortrait}
|
||||
firstMessage={true}
|
||||
onReroll={() => {
|
||||
const cha = $CurrentCharacter
|
||||
const chat = $CurrentChat
|
||||
const cha = $DataBase.characters[$selectedCharID]
|
||||
const chat = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage]
|
||||
if(cha.type !== 'group'){
|
||||
if (chat.fmIndex >= (cha.alternateGreetings.length - 1)){
|
||||
chat.fmIndex = -1
|
||||
@@ -619,11 +626,11 @@
|
||||
chat.fmIndex += 1
|
||||
}
|
||||
}
|
||||
$CurrentChat = chat
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage] = chat
|
||||
}}
|
||||
unReroll={() => {
|
||||
const cha = $CurrentCharacter
|
||||
const chat = $CurrentChat
|
||||
const cha = $DataBase.characters[$selectedCharID]
|
||||
const chat = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage]
|
||||
if(cha.type !== 'group'){
|
||||
if (chat.fmIndex === -1){
|
||||
chat.fmIndex = (cha.alternateGreetings.length - 1)
|
||||
@@ -632,38 +639,38 @@
|
||||
chat.fmIndex -= 1
|
||||
}
|
||||
}
|
||||
$CurrentChat = chat
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage] = chat
|
||||
}}
|
||||
isLastMemory={false}
|
||||
|
||||
/>
|
||||
{#if !$CurrentCharacter.removedQuotes && $CurrentCharacter.creatorNotes.length >= 2}
|
||||
<CreatorQuote quote={$CurrentCharacter.creatorNotes} onRemove={() => {
|
||||
const cha = $CurrentCharacter
|
||||
{#if !$DataBase.characters[$selectedCharID].removedQuotes && $DataBase.characters[$selectedCharID].creatorNotes.length >= 2}
|
||||
<CreatorQuote quote={$DataBase.characters[$selectedCharID].creatorNotes} onRemove={() => {
|
||||
const cha = $DataBase.characters[$selectedCharID]
|
||||
if(cha.type !== 'group'){
|
||||
cha.removedQuotes = true
|
||||
}
|
||||
$CurrentCharacter = cha
|
||||
$DataBase.characters[$selectedCharID] = cha
|
||||
}} />
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{#if openMenu}
|
||||
<div class="absolute right-2 bottom-16 p-5 bg-darkbg flex flex-col gap-3 text-textcolor rounded-md" on:click={(e) => {
|
||||
<div class="absolute right-2 bottom-16 p-5 bg-darkbg flex flex-col gap-3 text-textcolor rounded-md" onclick={(e) => {
|
||||
e.stopPropagation()
|
||||
}}>
|
||||
{#if $CurrentCharacter.type === 'group'}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={runAutoMode}>
|
||||
{#if $DataBase.characters[$selectedCharID].type === 'group'}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={runAutoMode}>
|
||||
<DicesIcon />
|
||||
<span class="ml-2">{language.autoMode}</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
<!-- svelte-ignore empty-block -->
|
||||
{#if $CurrentCharacter.ttsMode === 'webspeech' || $CurrentCharacter.ttsMode === 'elevenlab'}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => {
|
||||
<!-- svelte-ignore block_empty -->
|
||||
{#if $DataBase.characters[$selectedCharID].ttsMode === 'webspeech' || $DataBase.characters[$selectedCharID].ttsMode === 'elevenlab'}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={() => {
|
||||
stopTTS()
|
||||
}}>
|
||||
<MicOffIcon />
|
||||
@@ -672,9 +679,9 @@
|
||||
{/if}
|
||||
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors"
|
||||
class:text-textcolor2={($CurrentChat.message.length < 2) || ($CurrentChat.message[$CurrentChat.message.length - 1].role !== 'char')}
|
||||
on:click={() => {
|
||||
if(($CurrentChat.message.length < 2) || ($CurrentChat.message[$CurrentChat.message.length - 1].role !== 'char')){
|
||||
class:text-textcolor2={($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length < 2) || ($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message[$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length - 1].role !== 'char')}
|
||||
onclick={() => {
|
||||
if(($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length < 2) || ($DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message[$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length - 1].role !== 'char')){
|
||||
return
|
||||
}
|
||||
sendContinue();
|
||||
@@ -686,7 +693,7 @@
|
||||
|
||||
|
||||
{#if $DataBase.showMenuChatList}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => {
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={() => {
|
||||
openChatList = true
|
||||
openMenu = false
|
||||
}}>
|
||||
@@ -696,7 +703,7 @@
|
||||
{/if}
|
||||
|
||||
{#if $DataBase.translator !== ''}
|
||||
<div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoTranslateInput ? 'text-green-500':'lg:hover:text-green-500')} on:click={() => {
|
||||
<div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoTranslateInput ? 'text-green-500':'lg:hover:text-green-500')} onclick={() => {
|
||||
$DataBase.useAutoTranslateInput = !$DataBase.useAutoTranslateInput
|
||||
}}>
|
||||
<GlobeIcon />
|
||||
@@ -705,14 +712,14 @@
|
||||
|
||||
{/if}
|
||||
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => {
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={() => {
|
||||
screenShot()
|
||||
}}>
|
||||
<CameraIcon />
|
||||
<span class="ml-2">{language.screenshot}</span>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={async () => {
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={async () => {
|
||||
const res = await postChatFile(messageInput)
|
||||
if(res?.type === 'image'){
|
||||
fileInput.push(res.data)
|
||||
@@ -728,7 +735,7 @@
|
||||
</div>
|
||||
|
||||
|
||||
<div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoSuggestions ? 'text-green-500':'lg:hover:text-green-500')} on:click={async () => {
|
||||
<div class={"flex items-center cursor-pointer "+ ($DataBase.useAutoSuggestions ? 'text-green-500':'lg:hover:text-green-500')} onclick={async () => {
|
||||
$DataBase.useAutoSuggestions = !$DataBase.useAutoSuggestions
|
||||
}}>
|
||||
<ReplyIcon />
|
||||
@@ -736,8 +743,8 @@
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={() => {
|
||||
$CurrentChat.modules ??= []
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={() => {
|
||||
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].modules ??= []
|
||||
openModuleList = true
|
||||
openMenu = false
|
||||
}}>
|
||||
@@ -746,7 +753,7 @@
|
||||
</div>
|
||||
|
||||
{#if $DataBase.sideMenuRerollButton}
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" on:click={reroll}>
|
||||
<div class="flex items-center cursor-pointer hover:text-green-500 transition-colors" onclick={reroll}>
|
||||
<RefreshCcwIcon />
|
||||
<span class="ml-2">{language.reroll}</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user