gwchq-textjam 0.2.12 → 0.2.14
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.
- package/dist/index.js +99 -62
- 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
|
|
68348
|
-
/* harmony import */ var
|
|
68347
|
+
/* harmony import */ var _Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(89379);
|
|
68348
|
+
/* harmony import */ var _Users_valeriya_projects_gwc_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,
|
|
68372
|
+
otherProps = (0,_Users_valeriya_projects_gwc_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,
|
|
68389
|
+
var InnerTab = () => /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_2__.Tab, (0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_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,
|
|
68407
|
+
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)("div", (0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_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
|
|
68430
|
-
/* harmony import */ var
|
|
68429
|
+
/* harmony import */ var _Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(89379);
|
|
68430
|
+
/* harmony import */ var _Users_valeriya_projects_gwc_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,
|
|
68450
|
-
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(react_tabs__WEBPACK_IMPORTED_MODULE_1__.TabList, (0,
|
|
68449
|
+
otherProps = (0,_Users_valeriya_projects_gwc_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,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_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,
|
|
68460
|
+
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)("div", (0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_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
|
|
103014
|
+
/* harmony import */ var _Users_valeriya_projects_gwc_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);
|
|
@@ -103091,7 +103091,7 @@ var ProjectName = _ref => {
|
|
|
103091
103091
|
id: "project_name_label",
|
|
103092
103092
|
className: _styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectLabel,
|
|
103093
103093
|
children: "Project Name"
|
|
103094
|
-
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,
|
|
103094
|
+
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)("div", (0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)((0,_Users_valeriya_projects_gwc_gwchq_textjam_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A)({
|
|
103095
103095
|
className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_styles_module_scss__WEBPACK_IMPORTED_MODULE_3__["default"].projectName, className)
|
|
103096
103096
|
}, hoverProps), {}, {
|
|
103097
103097
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)((components_Tooltip_Tooltip__WEBPACK_IMPORTED_MODULE_8___default()), {
|
|
@@ -373846,6 +373846,7 @@ const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProj
|
|
|
373846
373846
|
}
|
|
373847
373847
|
catch (e) {
|
|
373848
373848
|
console.error(e);
|
|
373849
|
+
dispatch((0, EditorSlice_1.setSaveTriggered)(false));
|
|
373849
373850
|
dispatch((0, EditorSlice_1.setSaving)(types_1.SavingState.FAILED));
|
|
373850
373851
|
}
|
|
373851
373852
|
// do not include external fn saveProject in dependencies to avoid unwanted calls
|
|
@@ -373857,14 +373858,8 @@ const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProj
|
|
|
373857
373858
|
project.commitId,
|
|
373858
373859
|
project.identifier,
|
|
373859
373860
|
]);
|
|
373860
|
-
//
|
|
373861
|
+
// finish the process if save failed
|
|
373861
373862
|
(0, react_1.useEffect)(() => {
|
|
373862
|
-
if (!projectData?.commitId ||
|
|
373863
|
-
projectData.commitId === project.commitId ||
|
|
373864
|
-
!saveTriggered ||
|
|
373865
|
-
saving === types_1.SavingState.PROCESS)
|
|
373866
|
-
return;
|
|
373867
|
-
// finish the process if save failed
|
|
373868
373863
|
if (saving === types_1.SavingState.FAILED) {
|
|
373869
373864
|
dispatch((0, EditorSlice_1.setSaveTriggered)(false));
|
|
373870
373865
|
if (leaveFlow.requestId && leaveFlow.status === LeaveFlowSlice_1.LeaveFlowStatus.SAVING)
|
|
@@ -373874,6 +373869,14 @@ const useProjectPersistence = ({ user, projectData, hasShownSavePrompt, saveProj
|
|
|
373874
373869
|
}));
|
|
373875
373870
|
return;
|
|
373876
373871
|
}
|
|
373872
|
+
}, [dispatch, leaveFlow.requestId, leaveFlow.status, saving]);
|
|
373873
|
+
// handle successful saving update
|
|
373874
|
+
(0, react_1.useEffect)(() => {
|
|
373875
|
+
if (!projectData?.commitId ||
|
|
373876
|
+
projectData.commitId === project.commitId ||
|
|
373877
|
+
!saveTriggered ||
|
|
373878
|
+
saving !== types_1.SavingState.SUCCESS)
|
|
373879
|
+
return;
|
|
373877
373880
|
const incomingCommits = projectData.commits ?? [];
|
|
373878
373881
|
const commitsById = new Map();
|
|
373879
373882
|
[...existingCommits, ...incomingCommits].forEach((commit) => {
|
|
@@ -375045,6 +375048,10 @@ const STORE_PROJECTS = "projects";
|
|
|
375045
375048
|
const STORE_PROJECT_BIN_INDEX = "project_files";
|
|
375046
375049
|
const DB_VERSION = 1;
|
|
375047
375050
|
let dbPromise = null;
|
|
375051
|
+
// Helper to reset dbPromise (force reopen)
|
|
375052
|
+
function resetDBPromise() {
|
|
375053
|
+
dbPromise = null;
|
|
375054
|
+
}
|
|
375048
375055
|
const openDB = () => {
|
|
375049
375056
|
if (dbPromise)
|
|
375050
375057
|
return dbPromise;
|
|
@@ -375067,6 +375074,31 @@ const openDB = () => {
|
|
|
375067
375074
|
});
|
|
375068
375075
|
return dbPromise;
|
|
375069
375076
|
};
|
|
375077
|
+
// Silent reopening wrapper for IndexedDb operations
|
|
375078
|
+
async function withSilentReopen(fn) {
|
|
375079
|
+
try {
|
|
375080
|
+
return await fn();
|
|
375081
|
+
}
|
|
375082
|
+
catch (err) {
|
|
375083
|
+
if (err &&
|
|
375084
|
+
(err.name === "InvalidStateError" ||
|
|
375085
|
+
err.name === "TransactionInactiveError" ||
|
|
375086
|
+
err.message?.includes("The database connection is closing") ||
|
|
375087
|
+
err.message?.includes("The database connection is not open"))) {
|
|
375088
|
+
resetDBPromise();
|
|
375089
|
+
return await fn();
|
|
375090
|
+
}
|
|
375091
|
+
throw err;
|
|
375092
|
+
}
|
|
375093
|
+
}
|
|
375094
|
+
// Helper to run a transaction with minimal duplication and silent reopening
|
|
375095
|
+
async function runTx(store, mode, op) {
|
|
375096
|
+
return withSilentReopen(async () => {
|
|
375097
|
+
const db = await openDB();
|
|
375098
|
+
const tx = db.transaction(store, mode);
|
|
375099
|
+
return op(tx);
|
|
375100
|
+
});
|
|
375101
|
+
}
|
|
375070
375102
|
function txDone(tx) {
|
|
375071
375103
|
return new Promise((resolve, reject) => {
|
|
375072
375104
|
tx.oncomplete = () => resolve();
|
|
@@ -375087,69 +375119,74 @@ async function readWithTx(tx, req) {
|
|
|
375087
375119
|
}
|
|
375088
375120
|
exports.IndexedDb = {
|
|
375089
375121
|
async set(fileId, blob) {
|
|
375090
|
-
|
|
375091
|
-
|
|
375092
|
-
|
|
375093
|
-
|
|
375122
|
+
return runTx(STORE_BIN, "readwrite", async (tx) => {
|
|
375123
|
+
tx.objectStore(STORE_BIN).put(blob, fileId);
|
|
375124
|
+
await txDone(tx);
|
|
375125
|
+
});
|
|
375094
375126
|
},
|
|
375095
375127
|
async get(fileId) {
|
|
375096
|
-
|
|
375097
|
-
|
|
375098
|
-
|
|
375099
|
-
|
|
375128
|
+
return runTx(STORE_BIN, "readonly", async (tx) => {
|
|
375129
|
+
const req = tx.objectStore(STORE_BIN).get(fileId);
|
|
375130
|
+
return readWithTx(tx, req);
|
|
375131
|
+
});
|
|
375100
375132
|
},
|
|
375101
375133
|
async delete(fileId) {
|
|
375102
|
-
|
|
375103
|
-
|
|
375104
|
-
|
|
375105
|
-
|
|
375134
|
+
return runTx(STORE_BIN, "readwrite", async (tx) => {
|
|
375135
|
+
tx.objectStore(STORE_BIN).delete(fileId);
|
|
375136
|
+
await txDone(tx);
|
|
375137
|
+
});
|
|
375106
375138
|
},
|
|
375107
375139
|
async setProject(projectKey, project) {
|
|
375108
375140
|
if (!projectKey)
|
|
375109
375141
|
return;
|
|
375110
|
-
|
|
375111
|
-
|
|
375112
|
-
|
|
375113
|
-
|
|
375142
|
+
return runTx(STORE_PROJECTS, "readwrite", async (tx) => {
|
|
375143
|
+
tx.objectStore(STORE_PROJECTS).put({
|
|
375144
|
+
...project,
|
|
375145
|
+
savedAt: new Date().toISOString(),
|
|
375146
|
+
}, projectKey);
|
|
375147
|
+
await txDone(tx);
|
|
375148
|
+
});
|
|
375114
375149
|
},
|
|
375115
375150
|
async getProject(projectKey) {
|
|
375116
|
-
|
|
375117
|
-
|
|
375118
|
-
|
|
375119
|
-
|
|
375151
|
+
return runTx(STORE_PROJECTS, "readonly", async (tx) => {
|
|
375152
|
+
const req = tx.objectStore(STORE_PROJECTS).get(projectKey);
|
|
375153
|
+
return readWithTx(tx, req);
|
|
375154
|
+
});
|
|
375120
375155
|
},
|
|
375121
375156
|
async deleteProject(projectKey) {
|
|
375122
|
-
|
|
375123
|
-
|
|
375124
|
-
|
|
375125
|
-
|
|
375157
|
+
return runTx(STORE_PROJECTS, "readwrite", async (tx) => {
|
|
375158
|
+
tx.objectStore(STORE_PROJECTS).delete(projectKey);
|
|
375159
|
+
await txDone(tx);
|
|
375160
|
+
});
|
|
375126
375161
|
},
|
|
375127
375162
|
async setProjectFileIds(projectKey, fileIds) {
|
|
375128
|
-
|
|
375129
|
-
|
|
375130
|
-
|
|
375131
|
-
|
|
375163
|
+
return runTx(STORE_PROJECT_BIN_INDEX, "readwrite", async (tx) => {
|
|
375164
|
+
tx.objectStore(STORE_PROJECT_BIN_INDEX).put(fileIds, projectKey);
|
|
375165
|
+
await txDone(tx);
|
|
375166
|
+
});
|
|
375132
375167
|
},
|
|
375133
375168
|
async getProjectFileIds(projectKey) {
|
|
375134
|
-
|
|
375135
|
-
|
|
375136
|
-
|
|
375137
|
-
|
|
375138
|
-
|
|
375169
|
+
return runTx(STORE_PROJECT_BIN_INDEX, "readonly", async (tx) => {
|
|
375170
|
+
const req = tx
|
|
375171
|
+
.objectStore(STORE_PROJECT_BIN_INDEX)
|
|
375172
|
+
.get(projectKey);
|
|
375173
|
+
const res = await readWithTx(tx, req);
|
|
375174
|
+
return res ?? [];
|
|
375175
|
+
});
|
|
375139
375176
|
},
|
|
375140
375177
|
async deleteProjectFileIds(projectKey) {
|
|
375141
|
-
|
|
375142
|
-
|
|
375143
|
-
|
|
375144
|
-
|
|
375178
|
+
return runTx(STORE_PROJECT_BIN_INDEX, "readwrite", async (tx) => {
|
|
375179
|
+
tx.objectStore(STORE_PROJECT_BIN_INDEX).delete(projectKey);
|
|
375180
|
+
await txDone(tx);
|
|
375181
|
+
});
|
|
375145
375182
|
},
|
|
375146
375183
|
async clearAll() {
|
|
375147
|
-
|
|
375148
|
-
|
|
375149
|
-
|
|
375150
|
-
|
|
375151
|
-
|
|
375152
|
-
|
|
375184
|
+
return runTx([STORE_BIN, STORE_PROJECTS, STORE_PROJECT_BIN_INDEX], "readwrite", async (tx) => {
|
|
375185
|
+
tx.objectStore(STORE_BIN).clear();
|
|
375186
|
+
tx.objectStore(STORE_PROJECTS).clear();
|
|
375187
|
+
tx.objectStore(STORE_PROJECT_BIN_INDEX).clear();
|
|
375188
|
+
await txDone(tx);
|
|
375189
|
+
});
|
|
375153
375190
|
},
|
|
375154
375191
|
};
|
|
375155
375192
|
|
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.
|
|
4
|
+
"version": "0.2.14",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/GirlsFirst/gwchq-textjam",
|
|
7
7
|
"author": "Girls Who Code HQ",
|