Apply settings without reloading the page (#682)
Browse files* Invalidate conversation list when settings update
* improve trimming on conv titles
* Update src/routes/+layout.server.ts
Co-authored-by: Mishig <mishig.davaadorj@coloradocollege.edu>
---------
Co-authored-by: Mishig <mishig.davaadorj@coloradocollege.edu>
- src/lib/stores/settings.ts +3 -0
 - src/routes/+layout.server.ts +15 -6
 
    	
        src/lib/stores/settings.ts
    CHANGED
    
    | 
         @@ -1,5 +1,7 @@ 
     | 
|
| 1 | 
         
             
            import { browser } from "$app/environment";
         
     | 
| 
         | 
|
| 2 | 
         
             
            import { base } from "$app/paths";
         
     | 
| 
         | 
|
| 3 | 
         
             
            import { getContext, setContext } from "svelte";
         
     | 
| 4 | 
         
             
            import { type Writable, writable, get } from "svelte/store";
         
     | 
| 5 | 
         | 
| 
         @@ -53,6 +55,7 @@ export function createSettingsStore(initialValue: Omit<SettingsStore, "recentlyS 
     | 
|
| 53 | 
         
             
            						recentlySaved: false,
         
     | 
| 54 | 
         
             
            					}));
         
     | 
| 55 | 
         
             
            				}, 3000);
         
     | 
| 
         | 
|
| 56 | 
         
             
            			}, 300);
         
     | 
| 57 | 
         
             
            			// debounce server calls by 300ms
         
     | 
| 58 | 
         
             
            		}
         
     | 
| 
         | 
|
| 1 | 
         
             
            import { browser } from "$app/environment";
         
     | 
| 2 | 
         
            +
            import { invalidate } from "$app/navigation";
         
     | 
| 3 | 
         
             
            import { base } from "$app/paths";
         
     | 
| 4 | 
         
            +
            import { UrlDependency } from "$lib/types/UrlDependency";
         
     | 
| 5 | 
         
             
            import { getContext, setContext } from "svelte";
         
     | 
| 6 | 
         
             
            import { type Writable, writable, get } from "svelte/store";
         
     | 
| 7 | 
         | 
| 
         | 
|
| 55 | 
         
             
            						recentlySaved: false,
         
     | 
| 56 | 
         
             
            					}));
         
     | 
| 57 | 
         
             
            				}, 3000);
         
     | 
| 58 | 
         
            +
            				invalidate(UrlDependency.ConversationList);
         
     | 
| 59 | 
         
             
            			}, 300);
         
     | 
| 60 | 
         
             
            			// debounce server calls by 300ms
         
     | 
| 61 | 
         
             
            		}
         
     | 
    	
        src/routes/+layout.server.ts
    CHANGED
    
    | 
         @@ -70,12 +70,21 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => { 
     | 
|
| 70 | 
         
             
            				updatedAt: 1,
         
     | 
| 71 | 
         
             
            				createdAt: 1,
         
     | 
| 72 | 
         
             
            			})
         
     | 
| 73 | 
         
            -
            			.map((conv) =>  
     | 
| 74 | 
         
            -
            				 
     | 
| 75 | 
         
            -
            				 
     | 
| 76 | 
         
            -
             
     | 
| 77 | 
         
            -
            				 
     | 
| 78 | 
         
            -
             
     | 
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 
         | 
|
| 79 | 
         
             
            			.toArray(),
         
     | 
| 80 | 
         
             
            		settings: {
         
     | 
| 81 | 
         
             
            			searchEnabled: !!(
         
     | 
| 
         | 
|
| 70 | 
         
             
            				updatedAt: 1,
         
     | 
| 71 | 
         
             
            				createdAt: 1,
         
     | 
| 72 | 
         
             
            			})
         
     | 
| 73 | 
         
            +
            			.map((conv) => {
         
     | 
| 74 | 
         
            +
            				// remove emojis if settings say so
         
     | 
| 75 | 
         
            +
            				if (settings?.hideEmojiOnSidebar) {
         
     | 
| 76 | 
         
            +
            					conv.title = conv.title.replace(/\p{Emoji}/gu, "");
         
     | 
| 77 | 
         
            +
            				}
         
     | 
| 78 | 
         
            +
             
     | 
| 79 | 
         
            +
            				// remove invalid unicode and trim whitespaces
         
     | 
| 80 | 
         
            +
            				conv.title = conv.title.replace(/\uFFFD/gu, "").trimStart();
         
     | 
| 81 | 
         
            +
            				return {
         
     | 
| 82 | 
         
            +
            					id: conv._id.toString(),
         
     | 
| 83 | 
         
            +
            					title: settings?.hideEmojiOnSidebar ? conv.title.replace(/\p{Emoji}/gu, "") : conv.title,
         
     | 
| 84 | 
         
            +
            					model: conv.model ?? defaultModel,
         
     | 
| 85 | 
         
            +
            					updatedAt: conv.updatedAt,
         
     | 
| 86 | 
         
            +
            				};
         
     | 
| 87 | 
         
            +
            			})
         
     | 
| 88 | 
         
             
            			.toArray(),
         
     | 
| 89 | 
         
             
            		settings: {
         
     | 
| 90 | 
         
             
            			searchEnabled: !!(
         
     |