gwchq-textjam 0.2.20 → 0.2.22

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 +191 -82
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -68344,8 +68344,8 @@ __webpack_require__.r(__webpack_exports__);
68344
68344
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
68345
68345
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
68346
68346
  /* harmony export */ });
68347
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
68348
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(53986);
68347
+ /* harmony import */ var C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
68348
+ /* harmony import */ var C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(53986);
68349
68349
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
68350
68350
  /* harmony import */ var _hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(98850);
68351
68351
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14062);
@@ -68369,7 +68369,7 @@ var DraggableTab = _ref => {
68369
68369
  panelIndex,
68370
68370
  fileIndex
68371
68371
  } = _ref,
68372
- otherProps = (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)(_ref, _excluded);
68372
+ otherProps = (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)(_ref, _excluded);
68373
68373
  var openFiles = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => state.editor.openedFiles);
68374
68374
  var openFilesCount = openFiles[panelIndex].length;
68375
68375
  var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();
@@ -68386,7 +68386,7 @@ var DraggableTab = _ref => {
68386
68386
  switchToFileTab(panelIndex, (fileIndex + openFilesCount - 1) % openFilesCount);
68387
68387
  }
68388
68388
  };
68389
- var InnerTab = () => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_2__.Tab, (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68389
+ var InnerTab = () => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_2__.Tab, (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68390
68390
  onClick: e => {
68391
68391
  e.stopPropagation();
68392
68392
  switchToFileTab(panelIndex, fileIndex);
@@ -68404,7 +68404,7 @@ var DraggableTab = _ref => {
68404
68404
  draggableProps,
68405
68405
  dragHandleProps
68406
68406
  } = _ref2;
68407
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68407
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("div", (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
68408
68408
  className: "draggable-tab",
68409
68409
  ref: innerRef
68410
68410
  }, draggableProps), dragHandleProps), {}, {
@@ -68426,8 +68426,8 @@ __webpack_require__.r(__webpack_exports__);
68426
68426
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
68427
68427
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
68428
68428
  /* harmony export */ });
68429
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(89379);
68430
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(53986);
68429
+ /* harmony import */ var C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(89379);
68430
+ /* harmony import */ var C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(53986);
68431
68431
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
68432
68432
  /* harmony import */ var _hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98850);
68433
68433
  /* harmony import */ var react_tabs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(39243);
@@ -68446,8 +68446,8 @@ var DroppableTabList = _ref => {
68446
68446
  children: _children,
68447
68447
  index
68448
68448
  } = _ref,
68449
- otherProps = (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A)(_ref, _excluded);
68450
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_1__.TabList, (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({}, otherProps), {}, {
68449
+ otherProps = (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectWithoutProperties_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A)(_ref, _excluded);
68450
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_1__.TabList, (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({}, otherProps), {}, {
68451
68451
  children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_hello_pangea_dnd__WEBPACK_IMPORTED_MODULE_6__.Droppable, {
68452
68452
  direction: "horizontal",
68453
68453
  droppableId: index.toString(),
@@ -68457,7 +68457,7 @@ var DroppableTabList = _ref => {
68457
68457
  droppableProps,
68458
68458
  placeholder
68459
68459
  } = _ref2;
68460
- return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({
68460
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)("div", (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)({
68461
68461
  className: "droppable-tab-list"
68462
68462
  }, droppableProps), {}, {
68463
68463
  ref: innerRef,
@@ -103011,7 +103011,7 @@ __webpack_require__.r(__webpack_exports__);
103011
103011
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
103012
103012
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
103013
103013
  /* harmony export */ });
103014
- /* harmony import */ var D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
103014
+ /* harmony import */ var C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
103015
103015
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51649);
103016
103016
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14062);
103017
103017
  /* harmony import */ var _redux_EditorSlice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(68512);
@@ -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)();
103045
+ var nameInput = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
103046
+ var nameBeforeEditingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(projectName);
103047
+ var [isEditing, setEditing] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
103048
+ var [name, setName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(projectName);
103042
103049
  var {
103043
103050
  hovered,
103044
103051
  hoverProps
103045
- } = (0,_hooks_useHover__WEBPACK_IMPORTED_MODULE_5__.useHover)();
103046
- var nameInput = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
103047
- 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
+ } = (0,_hooks_useHover__WEBPACK_IMPORTED_MODULE_5__.useHover)(_hooks_useHover__WEBPACK_IMPORTED_MODULE_5__.TOOLTIP_SHOW_DELAY_MS);
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", {
@@ -103091,7 +103125,7 @@ var ProjectName = _ref => {
103091
103125
  id: "project_name_label",
103092
103126
  className: _styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectLabel,
103093
103127
  children: "Project Name"
103094
- }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,D_gwc2_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
103128
+ }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,C_Project_source_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
103095
103129
  className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectName, className)
103096
103130
  }, hoverProps), {}, {
103097
103131
  children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)((components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8___default()), {
@@ -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,
@@ -370829,6 +370864,7 @@ const ContextMenu = (props) => {
370829
370864
  [styles_module_scss_1.default.withDivider]: showDivider && i !== menuOptions.length - 1,
370830
370865
  }), onClick: (e) => {
370831
370866
  e.stopPropagation = true;
370867
+ e.syntheticEvent.stopPropagation();
370832
370868
  option.action?.();
370833
370869
  onClose();
370834
370870
  }, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.optionContent, children: [option.icon ?? null, option.text] }), hoverElement && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.hoverElement, children: hoverElement }))] }, option.id ?? i)))] }));
@@ -370958,32 +370994,21 @@ const ItemEdit_1 = __webpack_require__(61576);
370958
370994
  const ItemIcon_1 = __webpack_require__(3427);
370959
370995
  const styles_module_scss_1 = __importDefault(__webpack_require__(68233));
370960
370996
  const Tooltip_1 = __importDefault(__webpack_require__(26982));
370997
+ const useHover_1 = __webpack_require__(78556);
370961
370998
  const button_dots_svg_1 = __importDefault(__webpack_require__(80054));
370962
370999
  const SvgIcon_1 = __webpack_require__(82917);
370963
- const react_1 = __webpack_require__(51649);
370964
371000
  const stores_1 = __webpack_require__(32132);
370965
371001
  const BasicItemContent = ({ item, onContextMenu, }) => {
370966
371002
  const itemData = item.getItemData();
370967
- const [showTooltip, setShowTooltip] = (0, react_1.useState)(false);
370968
- const timerRef = (0, react_1.useRef)(undefined);
370969
371003
  const isSharedProject = (0, stores_1.useAppSelector)((state) => state.editor.isSharedProject);
371004
+ const { hovered, hoverProps } = (0, useHover_1.useHover)(useHover_1.TOOLTIP_SHOW_DELAY_MS);
370970
371005
  if (item.isRenaming()) {
370971
371006
  return (0, jsx_runtime_1.jsx)(ItemEdit_1.ItemEdit, { item: item });
370972
371007
  }
370973
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.itemContent, onContextMenu: onContextMenu, children: [(0, jsx_runtime_1.jsx)(ItemIcon_1.ItemIcon, { itemData: itemData }), (0, jsx_runtime_1.jsx)(Text_1.Text, { className: styles_module_scss_1.default.itemTitle, size: 12, draggable: true, onMouseEnter: () => {
370974
- timerRef.current = setTimeout(() => {
370975
- setShowTooltip(true);
370976
- }, 1000);
370977
- }, onMouseLeave: () => {
370978
- clearTimeout(timerRef.current);
370979
- setShowTooltip(false);
370980
- }, onDragStart: () => {
370981
- clearTimeout(timerRef.current);
370982
- setShowTooltip(false);
370983
- }, children: item.getItemName() }), !isSharedProject && ((0, jsx_runtime_1.jsx)(SvgIcon_1.SvgIcon, { className: styles_module_scss_1.default.itemButton, size: 16, SvgElement: button_dots_svg_1.default, onClick: (e) => {
371008
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.itemContent, onContextMenu: onContextMenu, children: [(0, jsx_runtime_1.jsx)(ItemIcon_1.ItemIcon, { itemData: itemData }), (0, jsx_runtime_1.jsx)(Text_1.Text, { className: styles_module_scss_1.default.itemTitle, size: 12, draggable: true, ...hoverProps, children: item.getItemName() }), !isSharedProject && ((0, jsx_runtime_1.jsx)(SvgIcon_1.SvgIcon, { className: styles_module_scss_1.default.itemButton, size: 16, SvgElement: button_dots_svg_1.default, onClick: (e) => {
370984
371009
  onContextMenu(e);
370985
371010
  e.stopPropagation();
370986
- } }))] }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: item.getItemName(), visible: showTooltip, position: "bottom" })] }));
371011
+ } }))] }), (0, jsx_runtime_1.jsx)(Tooltip_1.default, { message: item.getItemName(), visible: hovered, position: "bottom" })] }));
370987
371012
  };
370988
371013
  exports.BasicItemContent = BasicItemContent;
370989
371014
 
@@ -373480,17 +373505,48 @@ exports.validateProjectFilesCount = validateProjectFilesCount;
373480
373505
 
373481
373506
 
373482
373507
  Object.defineProperty(exports, "__esModule", ({ value: true }));
373483
- exports.useHover = void 0;
373508
+ exports.useHover = exports.TOOLTIP_SHOW_DELAY_MS = void 0;
373484
373509
  const react_1 = __webpack_require__(51649);
373485
- const useHover = () => {
373510
+ exports.TOOLTIP_SHOW_DELAY_MS = 1000;
373511
+ const useHover = (delay = 0) => {
373486
373512
  const [hovered, setHovered] = (0, react_1.useState)(false);
373513
+ const timeoutRef = (0, react_1.useRef)(null);
373514
+ const clearHoverTimeout = () => {
373515
+ if (timeoutRef.current !== null) {
373516
+ clearTimeout(timeoutRef.current);
373517
+ timeoutRef.current = null;
373518
+ }
373519
+ };
373520
+ const activate = () => {
373521
+ clearHoverTimeout();
373522
+ if (delay > 0) {
373523
+ timeoutRef.current = setTimeout(() => {
373524
+ setHovered(true);
373525
+ timeoutRef.current = null;
373526
+ }, delay);
373527
+ }
373528
+ else {
373529
+ setHovered(true);
373530
+ }
373531
+ };
373532
+ const deactivate = () => {
373533
+ clearHoverTimeout();
373534
+ setHovered(false);
373535
+ };
373536
+ (0, react_1.useEffect)(() => {
373537
+ return () => {
373538
+ clearHoverTimeout();
373539
+ };
373540
+ }, []);
373487
373541
  return {
373488
373542
  hovered,
373489
373543
  hoverProps: {
373490
- onMouseEnter: () => setHovered(true),
373491
- onMouseLeave: () => setHovered(false),
373492
- onFocus: () => setHovered(true),
373493
- onBlur: () => setHovered(false),
373544
+ onMouseEnter: activate,
373545
+ onMouseLeave: deactivate,
373546
+ onFocus: activate,
373547
+ onBlur: deactivate,
373548
+ onDragStart: deactivate,
373549
+ onKeyDown: deactivate,
373494
373550
  },
373495
373551
  };
373496
373552
  };
@@ -373542,7 +373598,7 @@ const useProjectCache_1 = __webpack_require__(69557);
373542
373598
  const helpers_1 = __webpack_require__(59578);
373543
373599
  const sendToast_1 = __webpack_require__(50068);
373544
373600
  const useUnsavedDraftResolution_1 = __webpack_require__(61171);
373545
- const buildProjectSnapshot_1 = __webpack_require__(10533);
373601
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
373546
373602
  const isFinalLoadingState = (state) => state === types_1.LoadingState.SUCCESS || state === types_1.LoadingState.FAILED;
373547
373603
  const useProject = ({ projectData, projectContent = null, isContentLoaded = null, isLoading = false, loadProjectContent, loadTemplateProjectData, isTemplateDataLoaded, }) => {
373548
373604
  const project = (0, stores_1.useAppSelector)((state) => state.editor.project);
@@ -373588,7 +373644,10 @@ const useProject = ({ projectData, projectContent = null, isContentLoaded = null
373588
373644
  components: preparedComponents,
373589
373645
  commitId: null,
373590
373646
  };
373591
- dispatch((0, EditorSlice_1.setProject)(projectToSet));
373647
+ dispatch((0, EditorSlice_1.setProject)({
373648
+ ...projectToSet,
373649
+ lastSavedSnapshot: (0, projectSnapshotHelpers_1.buildProjectSnapshot)(projectToSet),
373650
+ }));
373592
373651
  }, [dispatch]);
373593
373652
  // set initial project data on first load
373594
373653
  (0, react_1.useEffect)(() => {
@@ -373746,7 +373805,7 @@ const useProject = ({ projectData, projectContent = null, isContentLoaded = null
373746
373805
  };
373747
373806
  dispatch((0, EditorSlice_1.setProject)({
373748
373807
  ...projectToSet,
373749
- lastSavedSnapshot: (0, buildProjectSnapshot_1.buildProjectSnapshot)(projectToSet),
373808
+ lastSavedSnapshot: (0, projectSnapshotHelpers_1.buildProjectSnapshot)(projectToSet),
373750
373809
  }));
373751
373810
  dispatch((0, EditorSlice_1.setCommits)({ commits: commits ?? [] }));
373752
373811
  })
@@ -373858,7 +373917,7 @@ const constants_1 = __webpack_require__(16287);
373858
373917
  const sendToast_1 = __webpack_require__(50068);
373859
373918
  const projectTabSync_1 = __webpack_require__(48235);
373860
373919
  const LeaveFlowSlice_1 = __webpack_require__(52990);
373861
- const buildProjectSnapshot_1 = __webpack_require__(10533);
373920
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
373862
373921
  const selectors_1 = __webpack_require__(43551);
373863
373922
  const AUTO_SAVE_INTERVAL = 2000;
373864
373923
  const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProject, isShared, }) => {
@@ -373999,7 +374058,7 @@ const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProj
373999
374058
  commitId: incomingCommitId ?? project.commitId,
374000
374059
  commits,
374001
374060
  };
374002
- const newLastSavedSnapshot = (0, buildProjectSnapshot_1.buildProjectSnapshot)(cleanedProject);
374061
+ const newLastSavedSnapshot = (0, projectSnapshotHelpers_1.buildProjectSnapshot)(cleanedProject);
374003
374062
  const updatedProjectSnapshot = {
374004
374063
  components: cleanedComponents,
374005
374064
  hasStructureChanges: false,
@@ -374207,6 +374266,7 @@ const react_1 = __webpack_require__(51649);
374207
374266
  const react_redux_1 = __webpack_require__(14062);
374208
374267
  const EditorSlice_1 = __webpack_require__(68512);
374209
374268
  const types_1 = __webpack_require__(92932);
374269
+ const projectSnapshotHelpers_1 = __webpack_require__(22390);
374210
374270
  // check if incoming and cached projects are the same draft
374211
374271
  const isSameDraftProjectType = (incomingProject, cachedProject) => {
374212
374272
  if (!incomingProject || !cachedProject)
@@ -374216,12 +374276,34 @@ const isSameDraftProjectType = (incomingProject, cachedProject) => {
374216
374276
  cachedProject.project_type === incomingProject.project_type &&
374217
374277
  cachedProject.extension === incomingProject.extension);
374218
374278
  };
374279
+ const buildTemplateSnapshotFromIncomingProject = (cachedProject, incomingProject) => {
374280
+ if (!incomingProject?.components?.length)
374281
+ return null;
374282
+ return (0, projectSnapshotHelpers_1.buildProjectSnapshot)({
374283
+ ...cachedProject,
374284
+ ...incomingProject,
374285
+ components: incomingProject.components,
374286
+ commitId: null,
374287
+ });
374288
+ };
374289
+ const hasCachedDraftChanges = (cachedProject, incomingProject) => {
374290
+ if (!cachedProject)
374291
+ return false;
374292
+ const cachedSnapshot = (0, projectSnapshotHelpers_1.buildProjectSnapshot)(cachedProject);
374293
+ const baselineSnapshot = cachedProject.lastSavedSnapshot ??
374294
+ buildTemplateSnapshotFromIncomingProject(cachedProject, incomingProject);
374295
+ if (!baselineSnapshot) {
374296
+ return true;
374297
+ }
374298
+ return !(0, projectSnapshotHelpers_1.areProjectSnapshotsEqual)(cachedSnapshot, baselineSnapshot);
374299
+ };
374219
374300
  // handles unsaved draft logic and modal decision
374220
374301
  const useUnsavedDraftResolution = ({ projectData, cachedProject, isCurrentOutdated, }) => {
374221
374302
  const dispatch = (0, react_redux_1.useDispatch)();
374222
374303
  // flag to ignore cached draft after Start New
374223
374304
  const [shouldBypassCachedDraft, setShouldBypassCachedDraft] = (0, react_1.useState)(false);
374224
374305
  const isSameDraftType = (0, react_1.useMemo)(() => isSameDraftProjectType(projectData, cachedProject), [projectData, cachedProject]);
374306
+ const hasDraftChanges = (0, react_1.useMemo)(() => hasCachedDraftChanges(cachedProject, projectData), [cachedProject, projectData]);
374225
374307
  (0, react_1.useEffect)(() => {
374226
374308
  if (projectData?.commitId && shouldBypassCachedDraft) {
374227
374309
  setShouldBypassCachedDraft(false);
@@ -374231,7 +374313,8 @@ const useUnsavedDraftResolution = ({ projectData, cachedProject, isCurrentOutdat
374231
374313
  const shouldShowUnsavedDraftModal = !!cachedProject &&
374232
374314
  !isCurrentOutdated &&
374233
374315
  !shouldBypassCachedDraft &&
374234
- isSameDraftType;
374316
+ isSameDraftType &&
374317
+ hasDraftChanges;
374235
374318
  const openUnsavedDraftModal = (0, react_1.useCallback)(() => {
374236
374319
  dispatch((0, EditorSlice_1.showModal)({
374237
374320
  modal: types_1.ModalType.DRAFT_UNSAVED_CHANGES,
@@ -374259,8 +374342,8 @@ exports.useUnsavedDraftResolution = useUnsavedDraftResolution;
374259
374342
 
374260
374343
  var _a;
374261
374344
  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;
374345
+ 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;
374346
+ exports.queueBinaryWrites = exports.revertProject = void 0;
374264
374347
  const toolkit_1 = __webpack_require__(12069);
374265
374348
  const ProjectTypes_1 = __webpack_require__(27130);
374266
374349
  const types_1 = __webpack_require__(92932);
@@ -374308,6 +374391,7 @@ exports.editorInitialState = {
374308
374391
  isSharedProject: false,
374309
374392
  shareLinks: null,
374310
374393
  remixTriggered: false,
374394
+ projectNameDraft: null,
374311
374395
  };
374312
374396
  exports.EditorSlice = (0, toolkit_1.createSlice)({
374313
374397
  name: "editor",
@@ -374414,6 +374498,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374414
374498
  },
374415
374499
  setProject: (state, action) => {
374416
374500
  state.project = action.payload;
374501
+ state.projectNameDraft = null;
374417
374502
  state.loading = types_1.LoadingState.SUCCESS;
374418
374503
  state.openedFiles = [[]];
374419
374504
  state.focussedFileIndices = [0];
@@ -374462,8 +374547,12 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374462
374547
  setSaving: (state, action) => {
374463
374548
  state.saving = action.payload;
374464
374549
  },
374550
+ setProjectNameDraft: (state, action) => {
374551
+ state.projectNameDraft = action.payload;
374552
+ },
374465
374553
  updateProjectName: (state, action) => {
374466
374554
  state.project.name = action.payload;
374555
+ state.projectNameDraft = null;
374467
374556
  state.saving = types_1.SavingState.IDLE;
374468
374557
  },
374469
374558
  updateProjectComponent: (state, action) => {
@@ -374504,6 +374593,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374504
374593
  state.project.components = action.payload.components;
374505
374594
  state.project.hasStructureChanges = action.payload.hasStructureChanges;
374506
374595
  state.project.lastSavedSnapshot = action.payload.lastSavedSnapshot;
374596
+ state.projectNameDraft = null;
374507
374597
  if (action.payload.identifier) {
374508
374598
  state.project.identifier = action.payload.identifier;
374509
374599
  }
@@ -374587,7 +374677,7 @@ exports.EditorSlice = (0, toolkit_1.createSlice)({
374587
374677
  },
374588
374678
  });
374589
374679
  // 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;
374680
+ _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
374681
  exports.queueBinaryWrites = (0, toolkit_1.createAction)("editor/queueBinaryWrites");
374592
374682
  exports["default"] = exports.EditorSlice.reducer;
374593
374683
 
@@ -374946,8 +375036,10 @@ exports.selectProjectHasContentChanges = (0, toolkit_1.createSelector)([
374946
375036
  exports.selectProjectHasNameChanges = (0, toolkit_1.createSelector)([
374947
375037
  (state) => state.editor.project?.name,
374948
375038
  (state) => state.editor.project?.lastSavedSnapshot?.name,
374949
- ], (projectName, snapshotName) => {
374950
- return Boolean(snapshotName) && projectName !== snapshotName;
375039
+ (state) => state.editor.projectNameDraft,
375040
+ ], (projectName, snapshotName, projectNameDraft) => {
375041
+ const effectiveProjectName = projectNameDraft || projectName;
375042
+ return Boolean(snapshotName) && effectiveProjectName !== snapshotName;
374951
375043
  });
374952
375044
  exports.selectProjectDirtyState = (0, toolkit_1.createSelector)([exports.selectProjectHasContentChanges, exports.selectProjectHasNameChanges], (hasContentChanges, hasNameChanges) => {
374953
375045
  return hasContentChanges || hasNameChanges;
@@ -375460,32 +375552,6 @@ class BinaryStore {
375460
375552
  exports.binaryStore = new BinaryStore();
375461
375553
 
375462
375554
 
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
375555
  /***/ }),
375490
375556
 
375491
375557
  /***/ 56469:
@@ -376054,6 +376120,49 @@ const getAuthorName = (author) => {
376054
376120
  exports.getAuthorName = getAuthorName;
376055
376121
 
376056
376122
 
376123
+ /***/ }),
376124
+
376125
+ /***/ 22390:
376126
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
376127
+
376128
+
376129
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
376130
+ exports.areProjectSnapshotsEqual = exports.buildProjectSnapshot = void 0;
376131
+ const ProjectTypes_1 = __webpack_require__(27130);
376132
+ const signatureHelpers_1 = __webpack_require__(41835);
376133
+ const buildProjectSnapshot = (project) => {
376134
+ return {
376135
+ name: project.name,
376136
+ identifier: project.identifier,
376137
+ components: Object.fromEntries(project.components.map((c) => [
376138
+ c.path,
376139
+ c.type === ProjectTypes_1.ProjectComponentType.FILE
376140
+ ? c.content
376141
+ : undefined,
376142
+ ])),
376143
+ structureSignature: (0, signatureHelpers_1.buildSignature)(project.components),
376144
+ };
376145
+ };
376146
+ exports.buildProjectSnapshot = buildProjectSnapshot;
376147
+ const areProjectSnapshotsEqual = (first, second) => {
376148
+ if (!first || !second)
376149
+ return false;
376150
+ if (first.name !== second.name)
376151
+ return false;
376152
+ if ((0, signatureHelpers_1.isSignatureDifferent)(first.structureSignature, second.structureSignature)) {
376153
+ return false;
376154
+ }
376155
+ const firstComponentPaths = Object.keys(first.components);
376156
+ const secondComponentPaths = Object.keys(second.components);
376157
+ if (firstComponentPaths.length !== secondComponentPaths.length) {
376158
+ return false;
376159
+ }
376160
+ return firstComponentPaths.every((path) => Object.prototype.hasOwnProperty.call(second.components, path) &&
376161
+ first.components[path] === second.components[path]);
376162
+ };
376163
+ exports.areProjectSnapshotsEqual = areProjectSnapshotsEqual;
376164
+
376165
+
376057
376166
  /***/ }),
376058
376167
 
376059
376168
  /***/ 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.22",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/GirlsFirst/gwchq-textjam",
7
7
  "author": "Girls Who Code HQ",