{ const cha = chara const len = chara.chats.length let chats = chara.chats chats.unshift({ message:[], note:'', name:`New Chat ${len + 1}`, localLore:[], fmIndex: -1 }) if(cha.type === 'group'){ cha.characters.map((c) => { chats[len].message.push({ saying: c, role: 'char', data: findCharacterbyId(c).firstMessage }) }) } chara.chats = chats chara.chatPage = 0 $ReloadGUIPointer += 1 }}>{language.newChat}
{#key sorted}
{#each chara.chatFolders as folder, i}
{ if(!editMode) { chara.chatFolders[i].folded = !folder.folded $ReloadGUIPointer += 1 } }} class="flex items-center text-textcolor border-solid border-0 border-darkborderc p-2 cursor-pointer rounded-md" class:bg-red-900={folder.color === 'red'} class:bg-yellow-900={folder.color === 'yellow'} class:bg-green-900={folder.color === 'green'} class:bg-blue-900={folder.color === 'blue'} class:bg-indigo-900={folder.color === 'indigo'} class:bg-purple-900={folder.color === 'purple'} class:bg-pink-900={folder.color === 'pink'} > {#if editMode}
{:else}
{folder.name}
{/if}
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={async (e) => { e.stopPropagation() const sel = parseInt(await alertSelect([language.changeFolderColor, language.cancel])) switch (sel) { case 0: const colors = ["red","green","blue","yellow","indigo","purple","pink","default"] const sel = parseInt(await alertSelect(colors)) folder.color = colors[sel] break } }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={() => { editMode = !editMode }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 cursor-pointer" onclick={async (e) => { e.stopPropagation() const d = await alertConfirm(`${language.removeConfirm}${folder.name}`) if (d) { $ReloadGUIPointer += 1 const folders = chara.chatFolders folders.splice(i, 1) chara.chats.forEach(chat => { if (chat.folderId == folder.id) { chat.folderId = null } }) chara.chatFolders = folders } }}>
{#if chara.chats.filter(chat => chat.folderId == chara.chatFolders[i].id).length == 0}
Empty
{:else} {#each chara.chats.filter(chat => chat.folderId == chara.chatFolders[i].id) as chat}
{ if(!editMode){ chara.chatPage = chara.chats.indexOf(chat) $ReloadGUIPointer += 1 } }} class="risu-chats flex items-center text-textcolor border-solid border-0 border-darkborderc p-2 cursor-pointer rounded-md"class:bg-selected={chara.chats.indexOf(chat) === chara.chatPage}> {#if editMode}
{:else}
{chat.name}
{/if}
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={async () => { const option = await alertChatOptions() switch(option){ case 0:{ const newChat = safeStructuredClone($state.snapshot(chara.chats[chara.chats.indexOf(chat)])) newChat.name = `Copy of ${newChat.name}` chara.chats.unshift(newChat) chara.chatPage = 0 chara.chats = chara.chats break } case 1:{ if(chat.bindedPersona){ const confirm = await alertConfirm(language.doYouWantToUnbindCurrentPersona) if(confirm){ chat.bindedPersona = '' alertNormal(language.personaUnbindedSuccess) } } else{ const confirm = await alertConfirm(language.doYouWantToBindCurrentPersona) if(confirm){ if(!DBState.db.personas[DBState.db.selectedPersona].id){ DBState.db.personas[DBState.db.selectedPersona].id = v4() } chat.bindedPersona = DBState.db.personas[DBState.db.selectedPersona].id console.log(DBState.db.personas[DBState.db.selectedPersona]) alertNormal(language.personaBindedSuccess) } } break } case 2:{ chara.chatPage = chara.chats.indexOf(chat) createMultiuserRoom() } } }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={() => { editMode = !editMode }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={async (e) => { e.stopPropagation() exportChat(chara.chats.indexOf(chat)) }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 cursor-pointer" onclick={async (e) => { e.stopPropagation() if(chara.chats.length === 1){ alertError(language.errors.onlyOneChat) return } const d = await alertConfirm(`${language.removeConfirm}${chat.name}`) if(d){ chara.chatPage = 0 $ReloadGUIPointer += 1 let chats = chara.chats chats.splice(chara.chats.indexOf(chat), 1) chara.chats = chats } }}>
{/each} {/if}
{/each}
{#each chara.chats as chat, i} {#if chat.folderId == null}
{ if(!editMode){ chara.chatPage = i $ReloadGUIPointer += 1 } }} class="flex items-center text-textcolor border-solid border-0 border-darkborderc p-2 cursor-pointer rounded-md" class:bg-selected={i === chara.chatPage}> {#if editMode}
{:else}
{chat.name}
{/if}
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={async () => { const option = await alertChatOptions() switch(option){ case 0:{ const newChat = safeStructuredClone($state.snapshot(chara.chats[i])) newChat.name = `Copy of ${newChat.name}` chara.chats.unshift(newChat) chara.chatPage = 0 chara.chats = chara.chats break } case 1:{ const chat = chara.chats[i] if(chat.bindedPersona){ const confirm = await alertConfirm(language.doYouWantToUnbindCurrentPersona) if(confirm){ chat.bindedPersona = '' alertNormal(language.personaUnbindedSuccess) } } else{ const confirm = await alertConfirm(language.doYouWantToBindCurrentPersona) if(confirm){ if(!DBState.db.personas[DBState.db.selectedPersona].id){ DBState.db.personas[DBState.db.selectedPersona].id = v4() } chat.bindedPersona = DBState.db.personas[DBState.db.selectedPersona].id console.log(DBState.db.personas[DBState.db.selectedPersona]) alertNormal(language.personaBindedSuccess) } } break } case 2:{ chara.chatPage = i createMultiuserRoom() } } }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={() => { editMode = !editMode }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 mr-1 cursor-pointer" onclick={async (e) => { e.stopPropagation() exportChat(i) }}>
{ if(e.key === 'Enter'){ e.currentTarget.click() } }} class="text-textcolor2 hover:text-green-500 cursor-pointer" onclick={async (e) => { e.stopPropagation() if(chara.chats.length === 1){ alertError(language.errors.onlyOneChat) return } const d = await alertConfirm(`${language.removeConfirm}${chat.name}`) if(d){ chara.chatPage = 0 $ReloadGUIPointer += 1 let chats = chara.chats chats.splice(i, 1) chara.chats = chats } }}>
{/if} {/each}
{/key}
{ importChat() }}>
{ editMode = !editMode }}>
{ alertStore.set({ type: "branches", msg: "" }) }}>
{ const folders = chara.chatFolders const length = chara.chatFolders.length folders.unshift({ id: v4(), name: `New Folder ${length + 1}`, folded: false, }) chara.chatFolders = folders $ReloadGUIPointer += 1 }}>
{#if DBState.db.characters[$selectedCharID]?.chaId !== '§playground'} {#if parseKeyValue(DBState.db.customPromptTemplateToggle + getModuleToggles()).length > 4}
{#each parseKeyValue(DBState.db.customPromptTemplateToggle + getModuleToggles()) as toggle}
{ DBState.db.globalChatVariables[`toggle_${toggle[0]}`] = DBState.db.globalChatVariables[`toggle_${toggle[0]}`] === '1' ? '0' : '1' }} />
{/each} {#if DBState.db.supaModelType !== 'none' || DBState.db.hanuraiEnable}
{/if}
{:else if parseKeyValue(DBState.db.customPromptTemplateToggle + getModuleToggles()).length > 0}
{#each parseKeyValue(DBState.db.customPromptTemplateToggle + getModuleToggles()) as toggle}
{ DBState.db.globalChatVariables[`toggle_${toggle[0]}`] = DBState.db.globalChatVariables[`toggle_${toggle[0]}`] === '1' ? '0' : '1' }} />
{/each} {#if DBState.db.supaModelType !== 'none' || DBState.db.hanuraiEnable}
{/if} {:else}
{#if DBState.db.supaModelType !== 'none' || DBState.db.hanuraiEnable}
{/if} {/if} {/if}
{#if chara.type === 'group'}
{/if}