Track your online rabbitholes!

feat: add delete project functionality

authored by Govind Mohan and committed by Govind Mohan 6886710f 0531c2b7

Changed files
+67 -1
src
+14
src/background/index.ts
··· 224 224 sendResponse(err) 225 225 }); 226 226 break; 227 + case MessageRequest.DELETE_PROJECT: 228 + if (!("projectId" in request)) { 229 + sendResponse({ 230 + error: "projectId required" 231 + }); 232 + break; 233 + } 234 + db.deleteProject(request.projectId) 235 + .then(res => sendResponse(res)) 236 + .catch(err => { 237 + console.log(err) 238 + sendResponse(err) 239 + }); 240 + break; 227 241 default: 228 242 } 229 243
+10
src/lib/Rabbithole.svelte
··· 67 67 projects = await getOrderedProjects(); 68 68 } 69 69 70 + async function deleteActiveProject(event) { 71 + activeProject = await chrome.runtime.sendMessage({ 72 + type: MessageRequest.DELETE_PROJECT, 73 + projectId: activeProject.id 74 + }); 75 + projects = await getOrderedProjects(); 76 + updateWebsites(); 77 + } 78 + 70 79 async function updateWebsites() { 71 80 // FIXME: when rabbithole is installed, the first time a session is saved 72 81 // the website list is duplicated, so dedup here for now ··· 115 124 </Header> 116 125 <Timeline 117 126 on:projectRename={renameActiveProject} 127 + on:projectDelete={deleteActiveProject} 118 128 activeProject={activeProject} 119 129 websites={websites} /> 120 130 </AppShell>
+11
src/lib/Timeline.svelte
··· 12 12 export let activeProject = {}; 13 13 export let websites = []; 14 14 15 + async function deleteProject() { 16 + dispatch("projectDelete"); 17 + } 18 + 15 19 async function renameProject() { 16 20 if (activeProject.name === "") { 17 21 // TODO: error modal ··· 65 69 color='blue' 66 70 > 67 71 Rename 72 + </Button> 73 + <Button 74 + on:click={deleteProject} 75 + variant='filled' 76 + color='red' 77 + > 78 + Delete 68 79 </Button> 69 80 {/if} 70 81 </Group>
+30
src/storage/db.ts
··· 268 268 }); 269 269 } 270 270 271 + // returns new active project 272 + async deleteProject(projectId: string): Promise<Project> { 273 + return new Promise(async (resolve, reject) => { 274 + let db: IDBDatabase; 275 + try { 276 + db = await this.getDb(); 277 + } catch (err) { 278 + reject(err) 279 + } 280 + 281 + const projectRequest = db.transaction(["projects"], "readwrite") 282 + .objectStore("projects") 283 + .delete(projectId); 284 + 285 + projectRequest.onsuccess = async () => { 286 + console.log(`delete project success`); 287 + // replace active project 288 + const projects = await this.getAllProjects(); 289 + await this.changeActiveProject(projects[0].id) 290 + resolve(projects[0]); 291 + } 292 + 293 + projectRequest.onerror = (event) => { 294 + console.log(`rename project error`); 295 + console.log(event.target) 296 + reject(new Error(event.target.error)); 297 + }; 298 + }); 299 + } 300 + 271 301 async updateSettings(settings: Settings): Promise<Settings> { 272 302 return new Promise(async (resolve, reject) => { 273 303 let db: IDBDatabase;
+2 -1
src/utils.ts
··· 16 16 SAVE_WINDOW_TO_NEW_PROJECT, 17 17 SAVE_WINDOW_TO_ACTIVE_PROJECT, 18 18 PING, 19 - RENAME_PROJECT 19 + RENAME_PROJECT, 20 + DELETE_PROJECT, 20 21 } 21 22 22 23 export async function getOrderedProjects(): Promise<Project[]> {