gwchq-textjam 0.2.20 → 0.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +134 -46
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -103031,6 +103031,8 @@ __webpack_require__.r(__webpack_exports__);
103031
103031
 
103032
103032
 
103033
103033
 
103034
+ var defaultProjectName = "New project";
103035
+ var getProjectName = project => (project === null || project === void 0 ? void 0 : project.name) || defaultProjectName;
103034
103036
  var ProjectName = _ref => {
103035
103037
  var {
103036
103038
  className = null,
@@ -103038,17 +103040,23 @@ var ProjectName = _ref => {
103038
103040
  editable = true
103039
103041
  } = _ref;
103040
103042
  var project = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => state.editor.project, react_redux__WEBPACK_IMPORTED_MODULE_1__.shallowEqual);
103043
+ var projectName = getProjectName(project);
103041
103044
  var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();
103042
103045
  var {
103043
103046
  hovered,
103044
103047
  hoverProps
103045
103048
  } = (0,_hooks_useHover__WEBPACK_IMPORTED_MODULE_5__.useHover)();
103046
103049
  var nameInput = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
103050
+ var nameBeforeEditingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(projectName);
103047
103051
  var [isEditing, setEditing] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
103048
- var [name, setName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(project.name || "New project");
103052
+ var [name, setName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(projectName);
103049
103053
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
103050
- setName(project.name);
103051
- }, [project.name]);
103054
+ if (!isEditing) {
103055
+ setName(projectName);
103056
+ nameBeforeEditingRef.current = projectName;
103057
+ dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.setProjectNameDraft)(null));
103058
+ }
103059
+ }, [projectName, isEditing, dispatch]);
103052
103060
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
103053
103061
  if (isEditing) {
103054
103062
  var _nameInput$current, _nameInput$current2;
@@ -103057,33 +103065,59 @@ var ProjectName = _ref => {
103057
103065
  }
103058
103066
  }, [isEditing]);
103059
103067
  var startEditing = () => {
103060
- if (!editable) return;
103068
+ if (!editable || isEditing) return;
103069
+ nameBeforeEditingRef.current = projectName;
103061
103070
  setEditing(true);
103062
103071
  };
103063
103072
  var saveName = () => {
103064
103073
  var newName = nameInput.current.value.trim();
103065
- if (newName && newName !== project.name) {
103074
+ dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.setProjectNameDraft)(null));
103075
+ if (!newName) {
103076
+ setName(projectName);
103077
+ } else if (newName !== projectName) {
103066
103078
  dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.updateProjectName)(newName));
103079
+ setName(newName);
103067
103080
  }
103068
103081
  setEditing(false);
103069
103082
  };
103070
103083
  var cancelEditing = () => {
103071
- setName(project.name);
103084
+ var previousName = nameBeforeEditingRef.current;
103085
+ dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.setProjectNameDraft)(null));
103086
+ setName(previousName);
103087
+ if (previousName !== projectName) {
103088
+ dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.updateProjectName)(previousName));
103089
+ }
103072
103090
  setEditing(false);
103073
103091
  };
103074
103092
  var handleOnChange = () => {
103075
- setName(nameInput.current.value);
103093
+ var nextName = nameInput.current.value;
103094
+ var trimmedName = nextName.trim();
103095
+ setName(nextName);
103096
+ dispatch((0,_redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__.setProjectNameDraft)(trimmedName && trimmedName !== projectName ? trimmedName : null));
103097
+ };
103098
+ var handleOnBlur = () => {
103099
+ saveName();
103100
+ };
103101
+ var stopKeyboardEventPropagation = event => {
103102
+ var _event$nativeEvent;
103103
+ if (!isEditing) return;
103104
+ event.stopPropagation();
103105
+ if ((_event$nativeEvent = event.nativeEvent) !== null && _event$nativeEvent !== void 0 && _event$nativeEvent.stopImmediatePropagation) {
103106
+ event.nativeEvent.stopImmediatePropagation();
103107
+ }
103076
103108
  };
103077
103109
  var handleKeyDown = event => {
103110
+ stopKeyboardEventPropagation(event);
103078
103111
  if (event.key === "Enter") {
103079
103112
  event.preventDefault();
103080
103113
  saveName();
103081
103114
  } else if (event.key === "Escape") {
103115
+ event.preventDefault();
103082
103116
  cancelEditing();
103083
103117
  }
103084
103118
  };
103085
- var handleOnBlur = () => {
103086
- saveName();
103119
+ var handleKeyUp = event => {
103120
+ stopKeyboardEventPropagation(event);
103087
103121
  };
103088
103122
  return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.Fragment, {
103089
103123
  children: [showLabel && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("label", {
@@ -103106,6 +103140,7 @@ var ProjectName = _ref => {
103106
103140
  onFocus: startEditing,
103107
103141
  onClick: startEditing,
103108
103142
  onKeyDown: handleKeyDown,
103143
+ onKeyUp: handleKeyUp,
103109
103144
  value: name,
103110
103145
  readOnly: !isEditing,
103111
103146
  onChange: handleOnChange,
@@ -373542,7 +373577,7 @@ const useProjectCache_1 = __webpack_require__(69557);
373542
373577
  const helpers_1 = __webpack_require__(59578);
373543
373578
  const sendToast_1 = __webpack_require__(50068);
373544
373579
  const useUnsavedDraftResolution_1 = __webpack_require__(61171);
373545
- const buildProjectSnapshot_1 = __webpack_require__(10533);
373580
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
373546
373581
  const isFinalLoadingState = (state) => state === types_1.LoadingState.SUCCESS || state === types_1.LoadingState.FAILED;
373547
373582
  const useProject = ({ projectData, projectContent = null, isContentLoaded = null, isLoading = false, loadProjectContent, loadTemplateProjectData, isTemplateDataLoaded, }) => {
373548
373583
  const project = (0, stores_1.useAppSelector)((state) => state.editor.project);
@@ -373588,7 +373623,10 @@ const useProject = ({ projectData, projectContent = null, isContentLoaded = null
373588
373623
  components: preparedComponents,
373589
373624
  commitId: null,
373590
373625
  };
373591
- dispatch((0, EditorSlice_1.setProject)(projectToSet));
373626
+ dispatch((0, EditorSlice_1.setProject)({
373627
+ ...projectToSet,
373628
+ lastSavedSnapshot: (0, projectSnapshotHelpers_1.buildProjectSnapshot)(projectToSet),
373629
+ }));
373592
373630
  }, [dispatch]);
373593
373631
  // set initial project data on first load
373594
373632
  (0, react_1.useEffect)(() => {
@@ -373746,7 +373784,7 @@ const useProject = ({ projectData, projectContent = null, isContentLoaded = null
373746
373784
  };
373747
373785
  dispatch((0, EditorSlice_1.setProject)({
373748
373786
  ...projectToSet,
373749
- lastSavedSnapshot: (0, buildProjectSnapshot_1.buildProjectSnapshot)(projectToSet),
373787
+ lastSavedSnapshot: (0, projectSnapshotHelpers_1.buildProjectSnapshot)(projectToSet),
373750
373788
  }));
373751
373789
  dispatch((0, EditorSlice_1.setCommits)({ commits: commits ?? [] }));
373752
373790
  })
@@ -373858,7 +373896,7 @@ const constants_1 = __webpack_require__(16287);
373858
373896
  const sendToast_1 = __webpack_require__(50068);
373859
373897
  const projectTabSync_1 = __webpack_require__(48235);
373860
373898
  const LeaveFlowSlice_1 = __webpack_require__(52990);
373861
- const buildProjectSnapshot_1 = __webpack_require__(10533);
373899
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
373862
373900
  const selectors_1 = __webpack_require__(43551);
373863
373901
  const AUTO_SAVE_INTERVAL = 2000;
373864
373902
  const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProject, isShared, }) => {
@@ -373999,7 +374037,7 @@ const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProj
373999
374037
  commitId: incomingCommitId ?? project.commitId,
374000
374038
  commits,
374001
374039
  };
374002
- const newLastSavedSnapshot = (0, buildProjectSnapshot_1.buildProjectSnapshot)(cleanedProject);
374040
+ const newLastSavedSnapshot = (0, projectSnapshotHelpers_1.buildProjectSnapshot)(cleanedProject);
374003
374041
  const updatedProjectSnapshot = {
374004
374042
  components: cleanedComponents,
374005
374043
  hasStructureChanges: false,
@@ -374207,6 +374245,7 @@ const react_1 = __webpack_require__(51649);
374207
374245
  const react_redux_1 = __webpack_require__(14062);
374208
374246
  const EditorSlice_1 = __webpack_require__(68512);
374209
374247
  const types_1 = __webpack_require__(92932);
374248
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
374210
374249
  // check if incoming and cached projects are the same draft
374211
374250
  const isSameDraftProjectType = (incomingProject, cachedProject) => {
374212
374251
  if (!incomingProject || !cachedProject)
@@ -374216,12 +374255,34 @@ const isSameDraftProjectType = (incomingProject, cachedProject) => {
374216
374255
  cachedProject.project_type === incomingProject.project_type &&
374217
374256
  cachedProject.extension === incomingProject.extension);
374218
374257
  };
374258
+ const buildTemplateSnapshotFromIncomingProject = (cachedProject, incomingProject) => {
374259
+ if (!incomingProject?.components?.length)
374260
+ return null;
374261
+ return (0, projectSnapshotHelpers_1.buildProjectSnapshot)({
374262
+ ...cachedProject,
374263
+ ...incomingProject,
374264
+ components: incomingProject.components,
374265
+ commitId: null,
374266
+ });
374267
+ };
374268
+ const hasCachedDraftChanges = (cachedProject, incomingProject) => {
374269
+ if (!cachedProject)
374270
+ return false;
374271
+ const cachedSnapshot = (0, projectSnapshotHelpers_1.buildProjectSnapshot)(cachedProject);
374272
+ const baselineSnapshot = cachedProject.lastSavedSnapshot ??
374273
+ buildTemplateSnapshotFromIncomingProject(cachedProject, incomingProject);
374274
+ if (!baselineSnapshot) {
374275
+ return true;
374276
+ }
374277
+ return !(0, projectSnapshotHelpers_1.areProjectSnapshotsEqual)(cachedSnapshot, baselineSnapshot);
374278
+ };
374219
374279
  // handles unsaved draft logic and modal decision
374220
374280
  const useUnsavedDraftResolution = ({ projectData, cachedProject, isCurrentOutdated, }) => {
374221
374281
  const dispatch = (0, react_redux_1.useDispatch)();
374222
374282
  // flag to ignore cached draft after Start New
374223
374283
  const [shouldBypassCachedDraft, setShouldBypassCachedDraft] = (0, react_1.useState)(false);
374224
374284
  const isSameDraftType = (0, react_1.useMemo)(() => isSameDraftProjectType(projectData, cachedProject), [projectData, cachedProject]);
374285
+ const hasDraftChanges = (0, react_1.useMemo)(() => hasCachedDraftChanges(cachedProject, projectData), [cachedProject, projectData]);
374225
374286
  (0, react_1.useEffect)(() => {
374226
374287
  if (projectData?.commitId && shouldBypassCachedDraft) {
374227
374288
  setShouldBypassCachedDraft(false);
@@ -374231,7 +374292,8 @@ const useUnsavedDraftResolution = ({ projectData, cachedProject, isCurrentOutdat
374231
374292
  const shouldShowUnsavedDraftModal = !!cachedProject &&
374232
374293
  !isCurrentOutdated &&
374233
374294
  !shouldBypassCachedDraft &&
374234
- isSameDraftType;
374295
+ isSameDraftType &&
374296
+ hasDraftChanges;
374235
374297
  const openUnsavedDraftModal = (0, react_1.useCallback)(() => {
374236
374298
  dispatch((0, EditorSlice_1.showModal)({
374237
374299
  modal: types_1.ModalType.DRAFT_UNSAVED_CHANGES,
@@ -374259,8 +374321,8 @@ exports.useUnsavedDraftResolution = useUnsavedDraftResolution;
374259
374321
 
374260
374322
  var _a;
374261
374323
  Object.defineProperty(exports, "__esModule", ({ value: true }));
374262
- exports.revertProject = exports.setRemixTriggered = exports.setIsLoadingCommit = exports.setCommitIdLoadTriggered = exports.setShareLinks = exports.setCommits = exports.setSharedStatus = exports.setCodeVisibility = exports.applyComponentsPatch = exports.setSaving = exports.disableTheming = exports.hideSidebar = exports.showSidebar = exports.closeModal = exports.showModal = exports.closeErrorModal = exports.showErrorModal = exports.updateProjectName = exports.setSaveTriggered = exports.triggerDraw = exports.triggerCodeRun = exports.stopDraw = exports.stopCodeRun = exports.setLoading = exports.setReadOnly = exports.updateProjectIdentifier = exports.updateProjectCommits = exports.updateProjectSnapshot = exports.setProject = exports.setHasShownSavePrompt = exports.setError = exports.setCascadeUpdate = exports.setIsOutputOnly = exports.setAutorunEnabled = exports.setPage = exports.setFocussedFileIndex = exports.addFilePanel = exports.setOpenedFiles = exports.openFile = exports.closeFile = exports.expireJustLoaded = exports.codeRunHandled = exports.resetRunner = exports.setLoadedRunner = exports.loadingRunner = exports.updateProjectComponent = exports.addProjectComponent = exports.resetState = exports.EditorSlice = exports.editorInitialState = void 0;
374263
- exports.queueBinaryWrites = void 0;
374324
+ exports.setRemixTriggered = exports.setIsLoadingCommit = exports.setCommitIdLoadTriggered = exports.setShareLinks = exports.setCommits = exports.setSharedStatus = exports.setCodeVisibility = exports.applyComponentsPatch = exports.setSaving = exports.disableTheming = exports.hideSidebar = exports.showSidebar = exports.closeModal = exports.showModal = exports.closeErrorModal = exports.showErrorModal = exports.updateProjectName = exports.setProjectNameDraft = exports.setSaveTriggered = exports.triggerDraw = exports.triggerCodeRun = exports.stopDraw = exports.stopCodeRun = exports.setLoading = exports.setReadOnly = exports.updateProjectIdentifier = exports.updateProjectCommits = exports.updateProjectSnapshot = exports.setProject = exports.setHasShownSavePrompt = exports.setError = exports.setCascadeUpdate = exports.setIsOutputOnly = exports.setAutorunEnabled = exports.setPage = exports.setFocussedFileIndex = exports.addFilePanel = exports.setOpenedFiles = exports.openFile = exports.closeFile = exports.expireJustLoaded = exports.codeRunHandled = exports.resetRunner = exports.setLoadedRunner = exports.loadingRunner = exports.updateProjectComponent = exports.addProjectComponent = exports.resetState = exports.EditorSlice = exports.editorInitialState = void 0;
374325
+ exports.queueBinaryWrites = exports.revertProject = void 0;
374264
374326
  const toolkit_1 = __webpack_require__(12069);
374265
374327
  const ProjectTypes_1 = __webpack_require__(27130);
374266
374328
  const types_1 = __webpack_require__(92932);
@@ -374308,6 +374370,7 @@ exports.editorInitialState = {
374308
374370
  isSharedProject: false,
374309
374371
  shareLinks: null,
374310
374372
  remixTriggered: false,
374373
+ projectNameDraft: null,
374311
374374
  };
374312
374375
  exports.EditorSlice = (0, toolkit_1.createSlice)({
374313
374376
  name: "editor",
@@ -374414,6 +374477,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374414
374477
  },
374415
374478
  setProject: (state, action) => {
374416
374479
  state.project = action.payload;
374480
+ state.projectNameDraft = null;
374417
374481
  state.loading = types_1.LoadingState.SUCCESS;
374418
374482
  state.openedFiles = [[]];
374419
374483
  state.focussedFileIndices = [0];
@@ -374462,8 +374526,12 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374462
374526
  setSaving: (state, action) => {
374463
374527
  state.saving = action.payload;
374464
374528
  },
374529
+ setProjectNameDraft: (state, action) => {
374530
+ state.projectNameDraft = action.payload;
374531
+ },
374465
374532
  updateProjectName: (state, action) => {
374466
374533
  state.project.name = action.payload;
374534
+ state.projectNameDraft = null;
374467
374535
  state.saving = types_1.SavingState.IDLE;
374468
374536
  },
374469
374537
  updateProjectComponent: (state, action) => {
@@ -374504,6 +374572,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374504
374572
  state.project.components = action.payload.components;
374505
374573
  state.project.hasStructureChanges = action.payload.hasStructureChanges;
374506
374574
  state.project.lastSavedSnapshot = action.payload.lastSavedSnapshot;
374575
+ state.projectNameDraft = null;
374507
374576
  if (action.payload.identifier) {
374508
374577
  state.project.identifier = action.payload.identifier;
374509
374578
  }
@@ -374587,7 +374656,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374587
374656
  },
374588
374657
  });
374589
374658
  // Action creators are generated for each case reducer function
374590
- _a = exports.EditorSlice.actions, exports.resetState = _a.resetState, exports.addProjectComponent = _a.addProjectComponent, exports.updateProjectComponent = _a.updateProjectComponent, exports.loadingRunner = _a.loadingRunner, exports.setLoadedRunner = _a.setLoadedRunner, exports.resetRunner = _a.resetRunner, exports.codeRunHandled = _a.codeRunHandled, exports.expireJustLoaded = _a.expireJustLoaded, exports.closeFile = _a.closeFile, exports.openFile = _a.openFile, exports.setOpenedFiles = _a.setOpenedFiles, exports.addFilePanel = _a.addFilePanel, exports.setFocussedFileIndex = _a.setFocussedFileIndex, exports.setPage = _a.setPage, exports.setAutorunEnabled = _a.setAutorunEnabled, exports.setIsOutputOnly = _a.setIsOutputOnly, exports.setCascadeUpdate = _a.setCascadeUpdate, exports.setError = _a.setError, exports.setHasShownSavePrompt = _a.setHasShownSavePrompt, exports.setProject = _a.setProject, exports.updateProjectSnapshot = _a.updateProjectSnapshot, exports.updateProjectCommits = _a.updateProjectCommits, exports.updateProjectIdentifier = _a.updateProjectIdentifier, exports.setReadOnly = _a.setReadOnly, exports.setLoading = _a.setLoading, exports.stopCodeRun = _a.stopCodeRun, exports.stopDraw = _a.stopDraw, exports.triggerCodeRun = _a.triggerCodeRun, exports.triggerDraw = _a.triggerDraw, exports.setSaveTriggered = _a.setSaveTriggered, exports.updateProjectName = _a.updateProjectName, exports.showErrorModal = _a.showErrorModal, exports.closeErrorModal = _a.closeErrorModal, exports.showModal = _a.showModal, exports.closeModal = _a.closeModal, exports.showSidebar = _a.showSidebar, exports.hideSidebar = _a.hideSidebar, exports.disableTheming = _a.disableTheming, exports.setSaving = _a.setSaving, exports.applyComponentsPatch = _a.applyComponentsPatch, exports.setCodeVisibility = _a.setCodeVisibility, exports.setSharedStatus = _a.setSharedStatus, exports.setCommits = _a.setCommits, exports.setShareLinks = _a.setShareLinks, exports.setCommitIdLoadTriggered = _a.setCommitIdLoadTriggered, exports.setIsLoadingCommit = _a.setIsLoadingCommit, exports.setRemixTriggered = _a.setRemixTriggered, exports.revertProject = _a.revertProject;
374659
+ _a = exports.EditorSlice.actions, exports.resetState = _a.resetState, exports.addProjectComponent = _a.addProjectComponent, exports.updateProjectComponent = _a.updateProjectComponent, exports.loadingRunner = _a.loadingRunner, exports.setLoadedRunner = _a.setLoadedRunner, exports.resetRunner = _a.resetRunner, exports.codeRunHandled = _a.codeRunHandled, exports.expireJustLoaded = _a.expireJustLoaded, exports.closeFile = _a.closeFile, exports.openFile = _a.openFile, exports.setOpenedFiles = _a.setOpenedFiles, exports.addFilePanel = _a.addFilePanel, exports.setFocussedFileIndex = _a.setFocussedFileIndex, exports.setPage = _a.setPage, exports.setAutorunEnabled = _a.setAutorunEnabled, exports.setIsOutputOnly = _a.setIsOutputOnly, exports.setCascadeUpdate = _a.setCascadeUpdate, exports.setError = _a.setError, exports.setHasShownSavePrompt = _a.setHasShownSavePrompt, exports.setProject = _a.setProject, exports.updateProjectSnapshot = _a.updateProjectSnapshot, exports.updateProjectCommits = _a.updateProjectCommits, exports.updateProjectIdentifier = _a.updateProjectIdentifier, exports.setReadOnly = _a.setReadOnly, exports.setLoading = _a.setLoading, exports.stopCodeRun = _a.stopCodeRun, exports.stopDraw = _a.stopDraw, exports.triggerCodeRun = _a.triggerCodeRun, exports.triggerDraw = _a.triggerDraw, exports.setSaveTriggered = _a.setSaveTriggered, exports.setProjectNameDraft = _a.setProjectNameDraft, exports.updateProjectName = _a.updateProjectName, exports.showErrorModal = _a.showErrorModal, exports.closeErrorModal = _a.closeErrorModal, exports.showModal = _a.showModal, exports.closeModal = _a.closeModal, exports.showSidebar = _a.showSidebar, exports.hideSidebar = _a.hideSidebar, exports.disableTheming = _a.disableTheming, exports.setSaving = _a.setSaving, exports.applyComponentsPatch = _a.applyComponentsPatch, exports.setCodeVisibility = _a.setCodeVisibility, exports.setSharedStatus = _a.setSharedStatus, exports.setCommits = _a.setCommits, exports.setShareLinks = _a.setShareLinks, exports.setCommitIdLoadTriggered = _a.setCommitIdLoadTriggered, exports.setIsLoadingCommit = _a.setIsLoadingCommit, exports.setRemixTriggered = _a.setRemixTriggered, exports.revertProject = _a.revertProject;
374591
374660
  exports.queueBinaryWrites = (0, toolkit_1.createAction)("editor/queueBinaryWrites");
374592
374661
  exports["default"] = exports.EditorSlice.reducer;
374593
374662
 
@@ -374946,8 +375015,10 @@ exports.selectProjectHasContentChanges = (0, toolkit_1.createSelector)([
374946
375015
  exports.selectProjectHasNameChanges = (0, toolkit_1.createSelector)([
374947
375016
  (state) => state.editor.project?.name,
374948
375017
  (state) => state.editor.project?.lastSavedSnapshot?.name,
374949
- ], (projectName, snapshotName) => {
374950
- return Boolean(snapshotName) && projectName !== snapshotName;
375018
+ (state) => state.editor.projectNameDraft,
375019
+ ], (projectName, snapshotName, projectNameDraft) => {
375020
+ const effectiveProjectName = projectNameDraft || projectName;
375021
+ return Boolean(snapshotName) && effectiveProjectName !== snapshotName;
374951
375022
  });
374952
375023
  exports.selectProjectDirtyState = (0, toolkit_1.createSelector)([exports.selectProjectHasContentChanges, exports.selectProjectHasNameChanges], (hasContentChanges, hasNameChanges) => {
374953
375024
  return hasContentChanges || hasNameChanges;
@@ -375460,32 +375531,6 @@ class BinaryStore {
375460
375531
  exports.binaryStore = new BinaryStore();
375461
375532
 
375462
375533
 
375463
- /***/ }),
375464
-
375465
- /***/ 10533:
375466
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
375467
-
375468
-
375469
- Object.defineProperty(exports, "__esModule", ({ value: true }));
375470
- exports.buildProjectSnapshot = void 0;
375471
- const ProjectTypes_1 = __webpack_require__(27130);
375472
- const signatureHelpers_1 = __webpack_require__(41835);
375473
- const buildProjectSnapshot = (project) => {
375474
- return {
375475
- name: project.name,
375476
- identifier: project.identifier,
375477
- components: Object.fromEntries(project.components.map((c) => [
375478
- c.path,
375479
- c.type === ProjectTypes_1.ProjectComponentType.FILE
375480
- ? c.content
375481
- : undefined,
375482
- ])),
375483
- structureSignature: (0, signatureHelpers_1.buildSignature)(project.components),
375484
- };
375485
- };
375486
- exports.buildProjectSnapshot = buildProjectSnapshot;
375487
-
375488
-
375489
375534
  /***/ }),
375490
375535
 
375491
375536
  /***/ 56469:
@@ -376054,6 +376099,49 @@ const getAuthorName = (author) => {
376054
376099
  exports.getAuthorName = getAuthorName;
376055
376100
 
376056
376101
 
376102
+ /***/ }),
376103
+
376104
+ /***/ 22390:
376105
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
376106
+
376107
+
376108
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
376109
+ exports.areProjectSnapshotsEqual = exports.buildProjectSnapshot = void 0;
376110
+ const ProjectTypes_1 = __webpack_require__(27130);
376111
+ const signatureHelpers_1 = __webpack_require__(41835);
376112
+ const buildProjectSnapshot = (project) => {
376113
+ return {
376114
+ name: project.name,
376115
+ identifier: project.identifier,
376116
+ components: Object.fromEntries(project.components.map((c) => [
376117
+ c.path,
376118
+ c.type === ProjectTypes_1.ProjectComponentType.FILE
376119
+ ? c.content
376120
+ : undefined,
376121
+ ])),
376122
+ structureSignature: (0, signatureHelpers_1.buildSignature)(project.components),
376123
+ };
376124
+ };
376125
+ exports.buildProjectSnapshot = buildProjectSnapshot;
376126
+ const areProjectSnapshotsEqual = (first, second) => {
376127
+ if (!first || !second)
376128
+ return false;
376129
+ if (first.name !== second.name)
376130
+ return false;
376131
+ if ((0, signatureHelpers_1.isSignatureDifferent)(first.structureSignature, second.structureSignature)) {
376132
+ return false;
376133
+ }
376134
+ const firstComponentPaths = Object.keys(first.components);
376135
+ const secondComponentPaths = Object.keys(second.components);
376136
+ if (firstComponentPaths.length !== secondComponentPaths.length) {
376137
+ return false;
376138
+ }
376139
+ return firstComponentPaths.every((path) => Object.prototype.hasOwnProperty.call(second.components, path) &&
376140
+ first.components[path] === second.components[path]);
376141
+ };
376142
+ exports.areProjectSnapshotsEqual = areProjectSnapshotsEqual;
376143
+
376144
+
376057
376145
  /***/ }),
376058
376146
 
376059
376147
  /***/ 48235:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gwchq-textjam",
3
3
  "description": "Embeddable React editor used in Raspberry Pi text-based projects.",
4
- "version": "0.2.20",
4
+ "version": "0.2.21",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/GirlsFirst/gwchq-textjam",
7
7
  "author": "Girls Who Code HQ",