Skip to content

Commit c671251

Browse files
Untested
1 parent f001f97 commit c671251

File tree

4 files changed

+69
-62
lines changed

4 files changed

+69
-62
lines changed

src/hooks/project-hooks.tsx

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
import { useIntl } from "react-intl";
2323
import { useNavigate } from "react-router";
2424
import { useLogging } from "../logging/logging-hooks";
25+
import { createUntitledProject } from "../makecode/utils";
2526
import {
2627
HexData,
2728
isDatasetUserFileFormat,
@@ -58,12 +59,13 @@ interface ProjectContext {
5859
openEditor(): Promise<void>;
5960
project: MakeCodeProject;
6061
projectEdited: boolean;
61-
resetProject: () => void;
62+
newProject(projectNameOverride?: string): void;
63+
resetProject(): void;
6264
importProject: (
6365
project: MakeCodeProject,
64-
projectNameOverride: string
66+
projectNameOverride?: string
6567
) => void;
66-
loadFile: (file: File, type: LoadType) => void;
68+
loadFile(file: File, type: LoadType): void;
6769
/**
6870
* Called to request a save.
6971
*
@@ -365,7 +367,7 @@ export const ProjectProvider = ({
365367
const importProject = useCallback(
366368
async (
367369
project: MakeCodeProject,
368-
projectNameOverride: string
370+
projectNameOverride?: string
369371
): Promise<void> => {
370372
const hasTimedOut = await checkIfEditorStartUpTimedOut(
371373
editorReadyPromise.promise
@@ -377,7 +379,9 @@ export const ProjectProvider = ({
377379
try {
378380
// This triggers the code in editorChanged to update actions etc.
379381
await driverRef.current!.importProject({
380-
project: renameProject(project, projectNameOverride),
382+
project: projectNameOverride
383+
? renameProject(project, projectNameOverride)
384+
: project,
381385
});
382386
} catch (e) {
383387
setPostImportDialogState(PostImportDialogState.Error);
@@ -392,6 +396,22 @@ export const ProjectProvider = ({
392396
]
393397
);
394398

399+
const newProject = useCallback(
400+
(projectName?: string) => {
401+
// BUG:
402+
// MakeCode will have initialized with whatever is already in state
403+
// at this point. We don't tell MakeCode about our new project here.
404+
//
405+
// MakeCode's visibility listener will cause it to reload the
406+
// project it already has open (after a workspacesync),
407+
// then we'll conisder that to be a new project and
408+
409+
const untitledProject = createUntitledProject();
410+
return importProject(untitledProject, projectName);
411+
},
412+
[importProject]
413+
);
414+
395415
const setSave = useStore((s) => s.setSave);
396416
const save = useStore((s) => s.save);
397417
const settings = useStore((s) => s.settings);
@@ -492,6 +512,7 @@ export const ProjectProvider = ({
492512

493513
const value = useMemo(
494514
() => ({
515+
newProject,
495516
loadFile,
496517
importProject,
497518
openEditor,
@@ -511,6 +532,7 @@ export const ProjectProvider = ({
511532
},
512533
}),
513534
[
535+
newProject,
514536
loadFile,
515537
importProject,
516538
openEditor,

src/makecode/utils.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { DatasetEditorJsonFormat } from "../model";
1212
import { getMainScript } from "./generate-main-scripts";
1313
import { getAutogeneratedTs, getDatasetJson } from "./generate-custom-scripts";
1414
import { MakeCodeProject } from "@microbit/makecode-embed/react";
15-
import { DataWindow } from "../store";
15+
import { currentDataWindow, DataWindow } from "../store";
1616
import { untitledProjectName } from "../project-name";
1717

1818
export const filenames = {
@@ -145,3 +145,35 @@ export const hasMakeCodeMlExtension = (project: MakeCodeProject) => {
145145
}
146146
return extensionName in (pxtJson["dependencies"] as object);
147147
};
148+
149+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
150+
export const createUntitledProject = (): MakeCodeProject => ({
151+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
152+
header: {
153+
target: "microbit",
154+
targetVersion: "7.1.2",
155+
name: untitledProjectName,
156+
meta: {},
157+
editor: "blocksprj",
158+
pubId: "",
159+
pubCurrent: false,
160+
_rev: null,
161+
id: "45a3216b-e997-456c-bd4b-6550ddb81c4e",
162+
recentUse: 1726493314,
163+
modificationTime: 1726493314,
164+
cloudUserId: null,
165+
cloudCurrent: false,
166+
cloudVersion: null,
167+
cloudLastSyncTime: 0,
168+
isDeleted: false,
169+
githubCurrent: false,
170+
saveId: null,
171+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
172+
} as any,
173+
...generateProject(
174+
untitledProjectName,
175+
{ data: [] },
176+
undefined,
177+
currentDataWindow
178+
),
179+
});

src/pages/NewPage.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ import NewPageChoice from "../components/NewPageChoice";
2929
import { useLogging } from "../logging/logging-hooks";
3030
import { useStore } from "../store";
3131
import { createDataSamplesPageUrl } from "../urls";
32-
import { useProjectName } from "../hooks/project-hooks";
32+
import { useProject, useProjectName } from "../hooks/project-hooks";
3333

3434
const NewPage = () => {
3535
const existingSessionTimestamp = useStore((s) => s.timestamp);
3636
const projectName = useProjectName();
37-
const newSession = useStore((s) => s.newSession);
3837
const navigate = useNavigate();
3938
const logging = useLogging();
39+
const { newProject } = useProject();
4040

4141
const handleOpenLastSession = useCallback(() => {
4242
logging.event({
@@ -54,9 +54,9 @@ const NewPage = () => {
5454
logging.event({
5555
type: "session-open-new",
5656
});
57-
newSession();
57+
newProject();
5858
navigate(createDataSamplesPageUrl());
59-
}, [logging, newSession, navigate]);
59+
}, [logging, newProject, navigate]);
6060

6161
const intl = useIntl();
6262
const lastSessionTitle = intl.formatMessage({

src/store.ts

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ import { deployment } from "./deployment";
1414
import { flags } from "./flags";
1515
import { createPromise, PromiseInfo } from "./hooks/use-promise-ref";
1616
import { Logging } from "./logging/logging";
17-
import { generateCustomFiles, generateProject } from "./makecode/utils";
17+
import {
18+
createUntitledProject,
19+
generateCustomFiles,
20+
generateProject,
21+
} from "./makecode/utils";
1822
import { Confidences, predict, trainModel } from "./ml";
1923
import { mlSettings } from "./mlConfig";
2024
import {
@@ -78,37 +82,6 @@ interface PredictionResult {
7882
detected: Action | undefined;
7983
}
8084

81-
const createUntitledProject = (): MakeCodeProject => ({
82-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
83-
header: {
84-
target: "microbit",
85-
targetVersion: "7.1.2",
86-
name: untitledProjectName,
87-
meta: {},
88-
editor: "blocksprj",
89-
pubId: "",
90-
pubCurrent: false,
91-
_rev: null,
92-
id: "45a3216b-e997-456c-bd4b-6550ddb81c4e",
93-
recentUse: 1726493314,
94-
modificationTime: 1726493314,
95-
cloudUserId: null,
96-
cloudCurrent: false,
97-
cloudVersion: null,
98-
cloudLastSyncTime: 0,
99-
isDeleted: false,
100-
githubCurrent: false,
101-
saveId: null,
102-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
103-
} as any,
104-
...generateProject(
105-
untitledProjectName,
106-
{ data: [] },
107-
undefined,
108-
currentDataWindow
109-
),
110-
});
111-
11285
const updateProject = (
11386
project: MakeCodeProject,
11487
projectEdited: boolean,
@@ -219,7 +192,6 @@ export interface Actions {
219192
setEditorOpen(open: boolean): void;
220193
recordingStarted(): void;
221194
recordingStopped(): void;
222-
newSession(projectName?: string): void;
223195
trainModelFlowStart: (callback?: () => void) => Promise<void>;
224196
closeTrainModelDialogs: () => void;
225197
trainModel(): Promise<boolean>;
@@ -380,25 +352,6 @@ const createMlStore = (logging: Logging) => {
380352
);
381353
},
382354

383-
newSession(projectName?: string) {
384-
const untitledProject = createUntitledProject();
385-
set(
386-
{
387-
actions: [],
388-
dataWindow: currentDataWindow,
389-
model: undefined,
390-
project: projectName
391-
? renameProject(untitledProject, projectName)
392-
: untitledProject,
393-
projectEdited: false,
394-
appEditNeedsFlushToEditor: true,
395-
timestamp: Date.now(),
396-
},
397-
false,
398-
"newSession"
399-
);
400-
},
401-
402355
setEditorOpen(open: boolean) {
403356
set(
404357
({ download }) => ({

0 commit comments

Comments
 (0)