Skip to content

Commit 8df5e6d

Browse files
authored
Added project load failed custom event (#1201)
1 parent 3231591 commit 8df5e6d

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66

77
## Unreleased
88

9+
### Added
10+
11+
- `editor-projectLoadFailed` custom event that fires when a project completely fails to load (#1201)
12+
913
### Fixed
1014

1115
- Bugs in append mode for writing to files in python (#1200)

src/containers/WebComponentLoader.jsx

+10-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import externalStyles from "../assets/stylesheets/ExternalStyles.scss";
2626
import editorStyles from "../assets/stylesheets/index.scss";
2727
import "../assets/stylesheets/Notifications.scss";
2828
import Style from "style-it";
29-
import { projectOwnerLoadedEvent } from "../events/WebComponentCustomEvents";
29+
import {
30+
projectLoadFailed,
31+
projectOwnerLoadedEvent,
32+
} from "../events/WebComponentCustomEvents";
3033

3134
const WebComponentLoader = (props) => {
3235
const {
@@ -112,6 +115,12 @@ const WebComponentLoader = (props) => {
112115
}
113116
}, [loading, project]);
114117

118+
useEffect(() => {
119+
if (loading === "failed" && !remixLoadFailed) {
120+
document.dispatchEvent(projectLoadFailed);
121+
}
122+
}, [loading, remixLoadFailed]);
123+
115124
useEffect(() => {
116125
if (justLoaded) {
117126
document.dispatchEvent(projectOwnerLoadedEvent(projectOwner));

src/containers/WebComponentLoader.test.js

+59-1
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ describe("When user is in state", () => {
535535
const mockStore = configureStore(middlewares);
536536
const initialState = {
537537
editor: {
538-
loading: "idle",
538+
loading: "failed",
539539
project: {
540540
components: [],
541541
},
@@ -581,11 +581,69 @@ describe("When user is in state", () => {
581581
reactAppApiEndpoint: "http://localhost:3009",
582582
});
583583
});
584+
585+
test("Does not trigger project load failed event", () => {
586+
expect(document.dispatchEvent).not.toHaveBeenCalledWith(
587+
new CustomEvent("editor-projectLoadFailed", {
588+
bubbles: true,
589+
cancelable: false,
590+
composed: true,
591+
}),
592+
);
593+
});
584594
});
585595

586596
afterEach(async () => {
587597
localStorage.clear();
588598
await act(async () => cookies.remove("theme"));
589599
});
590600
});
601+
602+
describe("when a project fails to load", () => {
603+
beforeEach(() => {
604+
localStorage.setItem(authKey, JSON.stringify(user));
605+
const middlewares = [];
606+
const mockStore = configureStore(middlewares);
607+
const initialState = {
608+
editor: {
609+
loading: "failed",
610+
project: {
611+
components: [],
612+
},
613+
openFiles: [],
614+
focussedFileIndices: [],
615+
hasShownSavePrompt: false,
616+
remixLoadFailed: false,
617+
justLoaded: false,
618+
saveTriggered: false,
619+
},
620+
instructions: {},
621+
auth: { user },
622+
};
623+
store = mockStore(initialState);
624+
cookies = new Cookies();
625+
render(
626+
<Provider store={store}>
627+
<CookiesProvider cookies={cookies}>
628+
<WebComponentLoader
629+
identifier={identifier}
630+
instructions={instructions}
631+
authKey={authKey}
632+
theme="light"
633+
/>
634+
</CookiesProvider>
635+
</Provider>,
636+
);
637+
});
638+
639+
test("triggers project load failed event", () => {
640+
expect(document.dispatchEvent).toHaveBeenCalledWith(
641+
new CustomEvent("editor-projectLoadFailed", {
642+
bubbles: true,
643+
cancelable: false,
644+
composed: true,
645+
}),
646+
);
647+
});
648+
});
591649
});

src/events/WebComponentCustomEvents.js

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ export const navigateToProjectsPageEvent = webComponentCustomEvent(
1515
export const projectIdentifierChangedEvent = (detail) =>
1616
webComponentCustomEvent("editor-projectIdentifierChanged", detail);
1717

18+
export const projectLoadFailed = webComponentCustomEvent(
19+
"editor-projectLoadFailed",
20+
);
21+
1822
export const projectOwnerLoadedEvent = (detail) =>
1923
webComponentCustomEvent("editor-projectOwnerLoaded", detail);
2024

0 commit comments

Comments
 (0)