Track your online rabbitholes!

fix: remove side effects from project selector

authored by Govind Mohan and committed by Govind Mohan 0916d43f edfbbdbc

+4 -2
src/lib/Overlay.svelte
··· 3 3 import { Button, Group, Tooltip } from '@svelteuidev/core'; 4 4 import Options from "./Options.svelte"; 5 5 import ProjectSelector from "src/lib/ProjectSelector.svelte" 6 - import { MessageRequest } from "../utils.ts" 6 + import { MessageRequest, getOrderedProjects } from "../utils.ts" 7 7 8 8 let settings: Settings = { 9 9 show: false, 10 10 alignment: "right" 11 11 }; 12 + let projects = []; 12 13 let isHovering = false; 13 14 14 15 onMount(async () => { 15 16 settings = await chrome.runtime.sendMessage({type: MessageRequest.GET_SETTINGS}); 17 + projects = await getOrderedProjects() 16 18 }); 17 19 18 20 function changeAlignment(event) { ··· 65 67 </Group> 66 68 </div> 67 69 <div class="selector"> 68 - <ProjectSelector handleProjectChange={handleProjectChange} /> 70 + <ProjectSelector projects={projects} handleProjectChange={handleProjectChange} /> 69 71 </div> 70 72 <div> 71 73 <Options/>
+2 -27
src/lib/ProjectSelector.svelte
··· 4 4 import { MessageRequest } from "../utils.ts" 5 5 6 6 export let handleProjectChange; 7 - let projects = []; 8 - let unsortedProjects = []; 9 - 10 - onMount(async () => { 11 - await makeActiveProjectFirst(); 12 - }); 13 - 14 - async function makeActiveProjectFirst() { 15 - unsortedProjects = await chrome.runtime.sendMessage({type: MessageRequest.GET_ALL_PROJECTS}); 16 - const activeProject = await chrome.runtime.sendMessage({ type: MessageRequest.GET_ACTIVE_PROJECT }); 17 - 18 - // FIXME: what even.... 19 - projects = unsortedProjects; 20 - 21 - for (let i = 0; i < projects.length; i++) { 22 - if (projects[i].name === activeProject.name) { 23 - projects.splice(i, 1); 24 - } 25 - } 26 - projects.unshift(activeProject); 27 - } 28 - 29 - async function handleProjectChangeWrapper(event) { 30 - await handleProjectChange(event); 31 - await makeActiveProjectFirst(); 32 - } 7 + export let projects = []; 33 8 </script> 34 9 35 10 <div> 36 11 <NativeSelect data={projects.map(p => { return { label: p.name, value: p.id }; })} 37 - on:change={handleProjectChangeWrapper} 12 + on:change={handleProjectChange} 38 13 /> 39 14 </div>
+5 -1
src/lib/Rabbithole.svelte
··· 2 2 import { onMount } from "svelte"; 3 3 import Timeline from "src/lib/Timeline.svelte" 4 4 import Sidebar from "src/lib/Sidebar.svelte" 5 - import { MessageRequest } from "../utils" 5 + import { MessageRequest, getOrderedProjects } from "../utils" 6 6 import { SvelteUIProvider, fns, AppShell, Aside, Navbar, Header, Title, Divider } from "@svelteuidev/core"; 7 7 8 8 let activeProject = {}; 9 9 let websites = []; 10 + let projects = []; 10 11 let isDark = true; 11 12 let opened = false; 12 13 13 14 onMount(async () => { 15 + projects = await getOrderedProjects() 14 16 activeProject = await chrome.runtime.sendMessage({ type: MessageRequest.GET_ACTIVE_PROJECT }) 15 17 updateWebsites(); 16 18 }); ··· 57 59 newName: event.detail.newActiveProjectName, 58 60 projectId: activeProject.id 59 61 }); 62 + projects = await getOrderedProjects(); 60 63 } 61 64 62 65 async function updateWebsites() { ··· 91 94 }} 92 95 hidden={!opened}> 93 96 <Sidebar 97 + projects={projects} 94 98 on:projectChange={updateActiveProject} 95 99 on:newProject={createNewProject} 96 100 on:newProjectSync={createNewProjectFromWindow}
+3 -2
src/lib/Sidebar.svelte
··· 7 7 8 8 // FIXME: why aren't types working here? 9 9 const dispatch = createEventDispatcher(); 10 + 11 + export let projects; 12 + 10 13 let newRabbitholeName = ""; 11 14 let isHovering = false; 12 - 13 - let projects = []; 14 15 15 16 async function handleProjectChange(event) { 16 17 dispatch('projectChange', {
+16
src/utils.ts
··· 1 + import type { Project } from "./storage/db"; 2 + 1 3 // Can these be reordered without breaking older versions? 2 4 // seems like no because they are bound to ints 3 5 export enum MessageRequest { ··· 16 18 PING, 17 19 RENAME_PROJECT 18 20 } 21 + 22 + export async function getOrderedProjects(): Promise<Project[]> { 23 + let projects = await chrome.runtime.sendMessage({ type: MessageRequest.GET_ALL_PROJECTS }); 24 + const activeProject = await chrome.runtime.sendMessage({ type: MessageRequest.GET_ACTIVE_PROJECT }); 25 + 26 + 27 + for (let i = 0; i < projects.length; i++) { 28 + if (projects[i].name === activeProject.name) { 29 + projects.splice(i, 1); 30 + } 31 + } 32 + projects.unshift(activeProject); 33 + return projects 34 + }