+14
src/background/index.ts
+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
+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
+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
+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;