Skip to content

Commit 7079885

Browse files
committed
refactor
1 parent 79a7a57 commit 7079885

File tree

2 files changed

+80
-55
lines changed

2 files changed

+80
-55
lines changed

src/notebooks/deepnote/deepnoteActivationService.ts

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,28 @@ import { workspace, commands, window, WorkspaceEdit, NotebookEdit, NotebookRange
33
import { IExtensionSyncActivationService } from '../../platform/activation/types';
44
import { IExtensionContext } from '../../platform/common/types';
55
import { DeepnoteNotebookSerializer } from './deepnoteSerializer';
6-
import type { DeepnoteProject } from './deepnoteTypes';
6+
import type { DeepnoteProject, DeepnoteNotebook } from './deepnoteTypes';
77
import { DeepnoteNotebookSelector } from './deepnoteNotebookSelector';
88
import { Commands } from '../../platform/common/constants';
99

1010
@injectable()
1111
export class DeepnoteActivationService implements IExtensionSyncActivationService {
12+
private serializer: DeepnoteNotebookSerializer;
13+
private selector: DeepnoteNotebookSelector;
14+
1215
constructor(@inject(IExtensionContext) private extensionContext: IExtensionContext) {}
1316

1417
public activate() {
15-
const serializer = new DeepnoteNotebookSerializer();
16-
const selector = new DeepnoteNotebookSelector();
18+
this.serializer = new DeepnoteNotebookSerializer();
19+
this.selector = new DeepnoteNotebookSelector();
20+
21+
// Set up the custom notebook selection callback
22+
this.serializer.setNotebookSelectionCallback(this.handleNotebookSelection.bind(this));
1723

18-
this.extensionContext.subscriptions.push(workspace.registerNotebookSerializer('deepnote', serializer));
24+
this.extensionContext.subscriptions.push(workspace.registerNotebookSerializer('deepnote', this.serializer));
1925

2026
this.extensionContext.subscriptions.push(
21-
commands.registerCommand(Commands.SelectDeepnoteNotebook, () => this.selectNotebook(selector))
27+
commands.registerCommand(Commands.SelectDeepnoteNotebook, () => this.selectNotebook(this.selector))
2228
);
2329
}
2430

@@ -64,7 +70,7 @@ export class DeepnoteActivationService implements IExtensionSyncActivationServic
6470

6571
if (selectedNotebook && selectedNotebook.id !== currentNotebookId) {
6672
// Create new cells from the selected notebook
67-
const converter = DeepnoteNotebookSerializer.getConverter();
73+
const converter = this.serializer.getConverter();
6874
const cells = converter.convertBlocksToCells(selectedNotebook.blocks);
6975

7076
// Create a workspace edit to replace all cells
@@ -90,7 +96,7 @@ export class DeepnoteActivationService implements IExtensionSyncActivationServic
9096
// Store the selected notebook ID for future reference
9197
const fileUri = notebookUri.toString();
9298
const projectId = deepnoteProject.project.id;
93-
const manager = DeepnoteNotebookSerializer.getManager();
99+
const manager = this.serializer.getManager();
94100
manager.setSelectedNotebookForUri(fileUri, selectedNotebook.id);
95101

96102
// Update the current notebook ID for serialization
@@ -114,4 +120,43 @@ export class DeepnoteActivationService implements IExtensionSyncActivationServic
114120
);
115121
}
116122
}
123+
124+
private async handleNotebookSelection(
125+
projectId: string,
126+
notebooks: DeepnoteNotebook[]
127+
): Promise<DeepnoteNotebook | undefined> {
128+
const manager = this.serializer.getManager();
129+
const fileId = projectId;
130+
const skipPrompt = manager.shouldSkipPrompt(fileId);
131+
const storedNotebookId = manager.getSelectedNotebookForUri(fileId);
132+
133+
if (notebooks.length === 1) {
134+
return notebooks[0];
135+
}
136+
137+
if (skipPrompt && storedNotebookId) {
138+
// Use the stored selection when triggered by command
139+
const preSelected = notebooks.find((nb) => nb.id === storedNotebookId);
140+
return preSelected || notebooks[0];
141+
}
142+
143+
if (storedNotebookId && !skipPrompt) {
144+
// Normal file open - check if we have a previously selected notebook
145+
const preSelected = notebooks.find((nb) => nb.id === storedNotebookId);
146+
if (preSelected) {
147+
return preSelected;
148+
}
149+
// Previously selected notebook not found, prompt for selection
150+
}
151+
152+
// Prompt user to select a notebook
153+
const selected = await this.selector.selectNotebook(notebooks);
154+
if (selected) {
155+
manager.setSelectedNotebookForUri(fileId, selected.id);
156+
return selected;
157+
}
158+
159+
// If user cancelled selection, default to the first notebook
160+
return notebooks[0];
161+
}
117162
}

src/notebooks/deepnote/deepnoteSerializer.ts

Lines changed: 28 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,27 @@ import { DeepnoteDataConverter } from './deepnoteDataConverter';
77

88
export { DeepnoteProject, DeepnoteNotebook, DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes';
99

10-
export class DeepnoteNotebookSerializer implements NotebookSerializer {
11-
private static manager = new DeepnoteNotebookManager();
12-
private static selector = new DeepnoteNotebookSelector();
13-
private static converter = new DeepnoteDataConverter();
14-
15-
static setSelectedNotebookForUri(uri: string, notebookId: string) {
16-
DeepnoteNotebookSerializer.manager.setSelectedNotebookForUri(uri, notebookId);
17-
}
18-
19-
static getSelectedNotebookForUri(uri: string): string | undefined {
20-
return DeepnoteNotebookSerializer.manager.getSelectedNotebookForUri(uri);
21-
}
22-
23-
static shouldSkipPrompt(uri: string): boolean {
24-
return DeepnoteNotebookSerializer.manager.shouldSkipPrompt(uri);
25-
}
10+
export type NotebookSelectionCallback = (
11+
projectId: string,
12+
notebooks: DeepnoteNotebook[]
13+
) => Promise<DeepnoteNotebook | undefined>;
2614

27-
static storeOriginalProject(projectId: string, project: DeepnoteProject, notebookId: string) {
28-
DeepnoteNotebookSerializer.manager.storeOriginalProject(projectId, project, notebookId);
29-
}
30-
31-
static getOriginalProject(projectId: string): DeepnoteProject | undefined {
32-
return DeepnoteNotebookSerializer.manager.getOriginalProject(projectId);
33-
}
15+
export class DeepnoteNotebookSerializer implements NotebookSerializer {
16+
private manager = new DeepnoteNotebookManager();
17+
private selector = new DeepnoteNotebookSelector();
18+
private converter = new DeepnoteDataConverter();
19+
private notebookSelectionCallback?: NotebookSelectionCallback;
3420

35-
static getCurrentNotebookId(projectId: string): string | undefined {
36-
return DeepnoteNotebookSerializer.manager.getCurrentNotebookId(projectId);
21+
getManager(): DeepnoteNotebookManager {
22+
return this.manager;
3723
}
3824

39-
static getManager(): DeepnoteNotebookManager {
40-
return DeepnoteNotebookSerializer.manager;
25+
getConverter(): DeepnoteDataConverter {
26+
return this.converter;
4127
}
4228

43-
static getConverter(): DeepnoteDataConverter {
44-
return DeepnoteNotebookSerializer.converter;
29+
setNotebookSelectionCallback(callback: NotebookSelectionCallback) {
30+
this.notebookSelectionCallback = callback;
4531
}
4632

4733
async deserializeNotebook(content: Uint8Array, _token: CancellationToken): Promise<NotebookData> {
@@ -53,23 +39,18 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
5339
throw new Error('Invalid Deepnote file: no notebooks found');
5440
}
5541

56-
const selectedNotebook = await this.selectNotebookForOpen(
57-
deepnoteProject.project.id,
58-
deepnoteProject.project.notebooks
59-
);
42+
const selectedNotebook = this.notebookSelectionCallback
43+
? await this.notebookSelectionCallback(deepnoteProject.project.id, deepnoteProject.project.notebooks)
44+
: await this.selectNotebookForOpen(deepnoteProject.project.id, deepnoteProject.project.notebooks);
6045

6146
if (!selectedNotebook) {
6247
throw new Error('No notebook selected');
6348
}
6449

65-
const cells = DeepnoteNotebookSerializer.converter.convertBlocksToCells(selectedNotebook.blocks);
50+
const cells = this.converter.convertBlocksToCells(selectedNotebook.blocks);
6651

6752
// Store the original project for later serialization
68-
DeepnoteNotebookSerializer.manager.storeOriginalProject(
69-
deepnoteProject.project.id,
70-
deepnoteProject,
71-
selectedNotebook.id
72-
);
53+
this.manager.storeOriginalProject(deepnoteProject.project.id, deepnoteProject, selectedNotebook.id);
7354

7455
return {
7556
cells,
@@ -97,14 +78,13 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
9778
throw new Error('Missing Deepnote project ID in notebook metadata');
9879
}
9980

100-
const originalProject = DeepnoteNotebookSerializer.manager.getOriginalProject(projectId);
81+
const originalProject = this.manager.getOriginalProject(projectId);
10182
if (!originalProject) {
10283
throw new Error('Original Deepnote project not found. Cannot save changes.');
10384
}
10485

10586
// Get the current notebook ID (may have changed due to switching)
106-
const notebookId =
107-
data.metadata?.deepnoteNotebookId || DeepnoteNotebookSerializer.manager.getCurrentNotebookId(projectId);
87+
const notebookId = data.metadata?.deepnoteNotebookId || this.manager.getCurrentNotebookId(projectId);
10888
if (!notebookId) {
10989
throw new Error('Cannot determine which notebook to save');
11090
}
@@ -119,7 +99,7 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
11999
const updatedProject = JSON.parse(JSON.stringify(originalProject)) as DeepnoteProject;
120100

121101
// Convert cells back to blocks
122-
const updatedBlocks = DeepnoteNotebookSerializer.converter.convertCellsToBlocks(data.cells);
102+
const updatedBlocks = this.converter.convertCellsToBlocks(data.cells);
123103

124104
// Update the notebook's blocks
125105
updatedProject.project.notebooks[notebookIndex].blocks = updatedBlocks;
@@ -136,7 +116,7 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
136116
});
137117

138118
// Store the updated project for future saves
139-
DeepnoteNotebookSerializer.manager.storeOriginalProject(projectId, updatedProject, notebookId);
119+
this.manager.storeOriginalProject(projectId, updatedProject, notebookId);
140120

141121
return new TextEncoder().encode(yamlString);
142122
} catch (error) {
@@ -152,8 +132,8 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
152132
notebooks: DeepnoteNotebook[]
153133
): Promise<DeepnoteNotebook | undefined> {
154134
const fileId = projectId;
155-
const skipPrompt = DeepnoteNotebookSerializer.manager.shouldSkipPrompt(fileId);
156-
const storedNotebookId = DeepnoteNotebookSerializer.manager.getSelectedNotebookForUri(fileId);
135+
const skipPrompt = this.manager.shouldSkipPrompt(fileId);
136+
const storedNotebookId = this.manager.getSelectedNotebookForUri(fileId);
157137

158138
if (notebooks.length === 1) {
159139
return notebooks[0];
@@ -175,9 +155,9 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
175155
}
176156

177157
// Prompt user to select a notebook
178-
const selected = await DeepnoteNotebookSerializer.selector.selectNotebook(notebooks);
158+
const selected = await this.selector.selectNotebook(notebooks);
179159
if (selected) {
180-
DeepnoteNotebookSerializer.manager.setSelectedNotebookForUri(fileId, selected.id);
160+
this.manager.setSelectedNotebookForUri(fileId, selected.id);
181161
return selected;
182162
}
183163

0 commit comments

Comments
 (0)