diff --git a/src/lib/ChatScreens/DefaultChatScreen.next.svelte b/src/lib/ChatScreens/DefaultChatScreen.next.svelte new file mode 100644 index 00000000..9299680d --- /dev/null +++ b/src/lib/ChatScreens/DefaultChatScreen.next.svelte @@ -0,0 +1,954 @@ + + + +
{ + openMenu = false +}}> + {#if $selectedCharID < 0} + {#if $PlaygroundStore === 0} + + {:else} + + {/if} + {:else} +
+
+ {#if DBState.db.useChatSticker && currentCharacter.type !== 'group'} +
{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')}> + +
+ {/if} + + {#if !DBState.db.useAdvancedEditor} + + {:else} + + {/if} + + + {#if $doingChat || doingChatInputTranslate} + + {:else} + + {/if} + {#if DBState.db.characters[$selectedCharID]?.chaId !== '§playground'} + + {:else} +
{ + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.push({ + role: 'char', + data: '' + }) + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = DBState.db.characters[$selectedCharID].chats[DBState.db.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} + > + +
+ {/if} +
+ {#if DBState.db.useAutoTranslateInput && !DBState.db.useAdvancedEditor && DBState.db.characters[$selectedCharID]?.chaId !== '§playground'} +
+ + +
+ {/if} + + {#if fileInput.length > 0} +
+ {#each fileInput as file, i} + {#await getInlayAsset(file) then inlayAsset} +
+ {#if inlayAsset.type === 'image'} + Inlay + {:else if inlayAsset.type === 'video'} + + {:else if inlayAsset.type === 'audio'} + + {:else} +
{file}
+ {/if} + +
+ {/await} + {/each} +
+ + {/if} + + {#if toggleStickers} +
+ { + let fileType = 'img' + if(additionalAsset.length > 2 && additionalAsset[2]) { + const fileExtension = additionalAsset[2] + if(fileExtension === 'mp4' || fileExtension === 'webm') + fileType = 'video' + else if(fileExtension === 'mp3' || fileExtension === 'wav') + fileType = 'audio' + } + messageInput += `{{${fileType}::${additionalAsset[0]}}} *${additionalAsset[0]} added*` + updateInputSizeAll() + }}/> +
+ {/if} + + {#if DBState.db.useAutoSuggestions} + messageInput=( + (DBState.db.subModel === "textgen_webui" || DBState.db.subModel === "mancer" || DBState.db.subModel.startsWith('local_')) && DBState.db.autoSuggestClean + ? msg.replace(/ +\(.+?\) *$| - [^"'*]*?$/, '') + : msg + )} {send}/> + {/if} + + {#each blocks as block, i} +
+ +
+ {/each} + + + + {#if DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message?.[0]?.data?.startsWith(coldStorageHeader) } + {#await preLoadChat($selectedCharID, DBState.db.characters[$selectedCharID].chatPage)} +
+ {language.loadingChatData} +
+ {:then a} +
+ {/await} + {:else} + + {#each DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message as chat, i} + + {#if chat.role === 'char'} + {#if DBState.db.characters[$selectedCharID].type !== 'group'} + + {:else} + + {/if} + {:else} + + {/if} + + {/each} + + + + {#if DBState.db.characters[$selectedCharID].type !== 'group' } + {#if !DBState.db.characters[$selectedCharID].removedQuotes && DBState.db.characters[$selectedCharID].creatorNotes.length >= 2} + { + const cha = DBState.db.characters[$selectedCharID] + if(cha.type !== 'group'){ + cha.removedQuotes = true + } + DBState.db.characters[$selectedCharID] = cha + }} /> + {/if} + 0} + largePortrait={DBState.db.characters[$selectedCharID].largePortrait} + firstMessage={true} + onReroll={() => { + const cha = DBState.db.characters[$selectedCharID] + const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] + if(cha.type !== 'group'){ + if (chat.fmIndex >= (cha.alternateGreetings.length - 1)){ + chat.fmIndex = -1 + } + else{ + chat.fmIndex += 1 + } + } + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat + }} + unReroll={() => { + const cha = DBState.db.characters[$selectedCharID] + const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] + if(cha.type !== 'group'){ + if (chat.fmIndex === -1){ + chat.fmIndex = (cha.alternateGreetings.length - 1) + } + else{ + chat.fmIndex -= 1 + } + } + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat + }} + isLastMemory={false} + + /> + {/if} + + + + {/if} + + {#if openMenu} +
{ + e.stopPropagation() + }}> + {#if DBState.db.characters[$selectedCharID].type === 'group'} +
+ + {language.autoMode} +
+ {/if} + + + + {#if DBState.db.characters[$selectedCharID].ttsMode === 'webspeech' || DBState.db.characters[$selectedCharID].ttsMode === 'elevenlab'} +
{ + stopTTS() + }}> + + {language.ttsStop} +
+ {/if} + +
{ + if((DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length < 2) || (DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message[DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length - 1].role !== 'char')){ + return + } + sendContinue(); + }} + > + + {language.continueResponse} +
+ + + {#if DBState.db.showMenuChatList} +
{ + openChatList = true + openMenu = false + }}> + + {language.chatList} +
+ {/if} + + {#if DBState.db.showMenuHypaMemoryModal} + {#if (DBState.db.supaModelType !== 'none' && DBState.db.hypav2) || DBState.db.hypaV3} +
{ + if (DBState.db.hypav2) { + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].hypaV2Data ??= { + lastMainChunkID: 0, + mainChunks: [], + chunks: [] + } + showHypaV2Alert() + } else if (DBState.db.hypaV3) { + $hypaV3ModalOpen = true + } + + openMenu = false + }}> + + + {DBState.db.hypav2 ? language.hypaMemoryV2Modal : language.hypaMemoryV3Modal} + +
+ {/if} + {/if} + + {#if DBState.db.translator !== ''} +
{ + DBState.db.useAutoTranslateInput = !DBState.db.useAutoTranslateInput + }}> + + {language.autoTranslateInput} +
+ + {/if} + +
{ + screenShot() + }}> + + {language.screenshot} +
+ +
{ + const res = await postChatFile(messageInput) + if(res?.type === 'asset'){ + fileInput.push(res.data) + updateInputSizeAll() + } + if(res?.type === 'text'){ + messageInput += `{{file::${res.name}::${res.data}}}` + updateInputSizeAll() + } + }}> + + + {language.postFile} +
+ + +
{ + DBState.db.useAutoSuggestions = !DBState.db.useAutoSuggestions + }}> + + {language.autoSuggest} +
+ + +
{ + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].modules ??= [] + openModuleList = true + openMenu = false + }}> + + {language.modules} +
+ + {#if DBState.db.sideMenuRerollButton} +
+ + {language.reroll} +
+ {/if} +
+ + {/if} +
+ + {/if} +
+ \ No newline at end of file diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte index 9299680d..f7696799 100644 --- a/src/lib/ChatScreens/DefaultChatScreen.svelte +++ b/src/lib/ChatScreens/DefaultChatScreen.svelte @@ -29,11 +29,11 @@ import PlaygroundMenu from '../Playground/PlaygroundMenu.svelte'; import { ConnectionOpenStore } from 'src/ts/sync/multiuser'; import { coldStorageHeader, preLoadChat } from 'src/ts/process/coldstorage.svelte'; - import LazyPortal from '../UI/GUI/LazyPortal.svelte'; 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 @@ -42,24 +42,6 @@ let currentCharacter:character|groupChat = $state(DBState.db.characters[$selectedCharID]) let toggleStickers:boolean = $state(false) let fileInput:string[] = $state([]) - let blocks = $state(new Uint8Array(500) )//hacky hacky - let blockEle:HTMLElement[] = [] - let root: HTMLElement = $state(null) - - for(let i=0;i<500;i++){ - blockEle.push(null) - } - - $effect.pre(() => { - if($selectedCharID < 0) return - while(blocks.length-10 < DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length){ - blocks = new Uint8Array(blocks.length + 500) - for(let i=0;i<500;i++){ - blockEle.push(null) - } - } - - }) async function send(){ return sendMain(false) @@ -383,6 +365,7 @@ async function screenShot(){ try { + loadPages = Infinity const html2canvas = await import('html-to-image'); const chats = document.querySelectorAll('.default-chat-screen .risu-chat') alertWait("Taking screenShot...") @@ -429,6 +412,7 @@ mergedCanvas.remove(); } alertNormal(language.screenshotSaved) + loadPages = 10 } catch (error) { console.error(error) alertError("Error while taking screenshot") @@ -451,7 +435,13 @@ {/if} {:else} -
+
{ + //@ts-ignore + const scrolled = (e.target.scrollHeight - e.target.clientHeight + e.target.scrollTop) + if(scrolled < 100 && DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length > loadPages){ + loadPages += 15 + } + }}>
{/if} - {#each blocks as block, i} -
- -
- {/each} - - - {#if DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message?.[0]?.data?.startsWith(coldStorageHeader) } {#await preLoadChat($selectedCharID, DBState.db.characters[$selectedCharID].chatPage)}
@@ -679,108 +658,103 @@
{/await} {:else} - - {#each DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message as chat, i} - - {#if chat.role === 'char'} - {#if DBState.db.characters[$selectedCharID].type !== 'group'} - - {:else} - - {/if} + {#each messageForm(DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message, loadPages) as chat, i} + {#if chat.role === 'char'} + {#if DBState.db.characters[$selectedCharID].type !== 'group'} + {:else} {/if} - + {:else} + + {/if} {/each} - + {#if DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length <= loadPages} + {#if DBState.db.characters[$selectedCharID].type !== 'group' } + 0} + largePortrait={DBState.db.characters[$selectedCharID].largePortrait} + firstMessage={true} + onReroll={() => { + const cha = DBState.db.characters[$selectedCharID] + const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] + if(cha.type !== 'group'){ + if (chat.fmIndex >= (cha.alternateGreetings.length - 1)){ + chat.fmIndex = -1 + } + else{ + chat.fmIndex += 1 + } + } + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat + }} + unReroll={() => { + const cha = DBState.db.characters[$selectedCharID] + const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] + if(cha.type !== 'group'){ + if (chat.fmIndex === -1){ + chat.fmIndex = (cha.alternateGreetings.length - 1) + } + else{ + chat.fmIndex -= 1 + } + } + DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat + }} + isLastMemory={false} - {#if DBState.db.characters[$selectedCharID].type !== 'group' } - {#if !DBState.db.characters[$selectedCharID].removedQuotes && DBState.db.characters[$selectedCharID].creatorNotes.length >= 2} - { - const cha = DBState.db.characters[$selectedCharID] - if(cha.type !== 'group'){ - cha.removedQuotes = true - } - DBState.db.characters[$selectedCharID] = cha - }} /> - {/if} - 0} - largePortrait={DBState.db.characters[$selectedCharID].largePortrait} - firstMessage={true} - onReroll={() => { - const cha = DBState.db.characters[$selectedCharID] - const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] - if(cha.type !== 'group'){ - if (chat.fmIndex >= (cha.alternateGreetings.length - 1)){ - chat.fmIndex = -1 - } - else{ - chat.fmIndex += 1 - } - } - DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat - }} - unReroll={() => { - const cha = DBState.db.characters[$selectedCharID] - const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] - if(cha.type !== 'group'){ - if (chat.fmIndex === -1){ - chat.fmIndex = (cha.alternateGreetings.length - 1) - } - else{ - chat.fmIndex -= 1 - } - } - DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat - }} - isLastMemory={false} - - /> + /> + {#if !DBState.db.characters[$selectedCharID].removedQuotes && DBState.db.characters[$selectedCharID].creatorNotes.length >= 2} + { + const cha = DBState.db.characters[$selectedCharID] + if(cha.type !== 'group'){ + cha.removedQuotes = true + } + DBState.db.characters[$selectedCharID] = cha + }} /> {/if} - - + {/if} + {/if} {/if} @@ -831,15 +805,15 @@ {/if} {#if DBState.db.showMenuHypaMemoryModal} - {#if (DBState.db.supaModelType !== 'none' && DBState.db.hypav2) || DBState.db.hypaV3} + {#if DBState.db.supaModelType !== 'none' && (DBState.db.hypav2 || DBState.db.hypaV3)}
{ if (DBState.db.hypav2) { DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].hypaV2Data ??= { lastMainChunkID: 0, mainChunks: [], - chunks: [] + chunks: [], } - showHypaV2Alert() + showHypaV2Alert(); } else if (DBState.db.hypaV3) { $hypaV3ModalOpen = true } @@ -950,5 +924,4 @@ 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } - \ No newline at end of file