@rowsncolumns/y-spreadsheet 14.0.32
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/LICENSE.md +100 -0
- package/Readme.md +77 -0
- package/dist/cjs/helpers.d.ts +179 -0
- package/dist/cjs/helpers.d.ts.map +1 -0
- package/dist/cjs/helpers.js +1635 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/observables.d.ts +10 -0
- package/dist/cjs/observables.d.ts.map +1 -0
- package/dist/cjs/observables.js +90 -0
- package/dist/cjs/profiling/batch-profile.spec.d.ts +2 -0
- package/dist/cjs/profiling/batch-profile.spec.d.ts.map +1 -0
- package/dist/cjs/profiling/batch-profile.spec.js +175 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +62 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/use-yspreadsheet-v2.d.ts +152 -0
- package/dist/cjs/use-yspreadsheet-v2.d.ts.map +1 -0
- package/dist/cjs/use-yspreadsheet-v2.js +980 -0
- package/dist/cjs/use-yspreadsheet.d.ts +39 -0
- package/dist/cjs/use-yspreadsheet.d.ts.map +1 -0
- package/dist/cjs/use-yspreadsheet.js +430 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +23 -0
- package/dist/esm/helpers.d.ts +179 -0
- package/dist/esm/helpers.d.ts.map +1 -0
- package/dist/esm/helpers.js +1346 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/observables.d.ts +10 -0
- package/dist/esm/observables.d.ts.map +1 -0
- package/dist/esm/observables.js +51 -0
- package/dist/esm/profiling/batch-profile.spec.d.ts +2 -0
- package/dist/esm/profiling/batch-profile.spec.d.ts.map +1 -0
- package/dist/esm/profiling/batch-profile.spec.js +131 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +62 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/use-yspreadsheet-v2.d.ts +152 -0
- package/dist/esm/use-yspreadsheet-v2.d.ts.map +1 -0
- package/dist/esm/use-yspreadsheet-v2.js +814 -0
- package/dist/esm/use-yspreadsheet.d.ts +39 -0
- package/dist/esm/use-yspreadsheet.d.ts.map +1 -0
- package/dist/esm/use-yspreadsheet.js +304 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +21 -0
- package/package.json +54 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { HocuspocusProvider } from "@hocuspocus/provider";
|
|
2
|
+
import type { CellInterface } from "@rowsncolumns/grid";
|
|
3
|
+
import type { CellData, Collaborator, ConditionalFormatRule, DataValidationRuleRecord, EmbeddedChart, EmbeddedObject, NamedRange, ProtectedRange, Sheet, TableView } from "@rowsncolumns/spreadsheet";
|
|
4
|
+
import type { CalculateNowOptions, CalculationOperation, HistoryType, SheetData, SpreadsheetPatch } from "@rowsncolumns/spreadsheet-state";
|
|
5
|
+
import type { Patch } from "immer";
|
|
6
|
+
import type { WebsocketProvider } from "y-websocket";
|
|
7
|
+
import type * as Y from "yjs";
|
|
8
|
+
export type useYSpreadsheetProps<T extends CellData, S extends Sheet, C extends EmbeddedChart, O extends EmbeddedObject> = {
|
|
9
|
+
userId: string | number;
|
|
10
|
+
title: string;
|
|
11
|
+
sheetId: number;
|
|
12
|
+
activeCell?: CellInterface;
|
|
13
|
+
provider?: HocuspocusProvider | WebsocketProvider | any;
|
|
14
|
+
doc: Y.Doc;
|
|
15
|
+
calculateNow(options?: CalculateNowOptions): void;
|
|
16
|
+
onChangeSheetData: React.Dispatch<React.SetStateAction<SheetData<T>>>;
|
|
17
|
+
onChangeTables: React.Dispatch<React.SetStateAction<TableView[]>>;
|
|
18
|
+
onChangeSheets: React.Dispatch<React.SetStateAction<S[]>>;
|
|
19
|
+
onChangeCharts?: React.Dispatch<React.SetStateAction<C[]>>;
|
|
20
|
+
onChangeEmbeds?: React.Dispatch<React.SetStateAction<O[]>>;
|
|
21
|
+
onChangeNamedRanges?: React.Dispatch<React.SetStateAction<NamedRange[]>>;
|
|
22
|
+
onChangeProtectedRanges?: React.Dispatch<React.SetStateAction<ProtectedRange[]>>;
|
|
23
|
+
onChangeConditionalFormats?: React.Dispatch<React.SetStateAction<ConditionalFormatRule[]>>;
|
|
24
|
+
onChangeDataValidations?: React.Dispatch<React.SetStateAction<DataValidationRuleRecord[]>>;
|
|
25
|
+
enqueueCalculation: (operation: CalculationOperation) => void;
|
|
26
|
+
onError?(err: unknown): void;
|
|
27
|
+
onInitialDataLoaded?(): void;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Connects to a Y server and picks up the most recent change
|
|
31
|
+
* Does not load initial data
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
export declare const useYSpreadsheet: <T extends CellData, S extends Sheet, C extends EmbeddedChart, O extends EmbeddedObject>({ onChangeSheetData, onChangeSheets, onChangeTables, onChangeCharts, onChangeEmbeds, onChangeConditionalFormats, onChangeDataValidations, onChangeNamedRanges, onChangeProtectedRanges, onError, enqueueCalculation, calculateNow, userId, title, sheetId, activeCell, doc, provider, }: useYSpreadsheetProps<T, S, C, O>) => {
|
|
35
|
+
onBroadcastPatch: (patches: [patch: SpreadsheetPatch<Patch>, type?: HistoryType | undefined][]) => void;
|
|
36
|
+
users: Collaborator[];
|
|
37
|
+
synced: boolean;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=use-yspreadsheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-yspreadsheet.d.ts","sourceRoot":"","sources":["../../use-yspreadsheet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useYSpreadsheet = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var spreadsheet_1 = require("@rowsncolumns/spreadsheet");
|
|
6
|
+
var immer_1 = require("immer");
|
|
7
|
+
var uniqBy_1 = tslib_1.__importDefault(require("lodash/uniqBy"));
|
|
8
|
+
var react_1 = require("react");
|
|
9
|
+
var yjs_1 = require("yjs");
|
|
10
|
+
var getStateVector = function (doc) { return (0, yjs_1.encodeStateVector)(doc); };
|
|
11
|
+
// Function to get updates between two state vectors
|
|
12
|
+
var getUpdatesBetween = function (doc, stateVector1, stateVector2) {
|
|
13
|
+
var diff = (0, yjs_1.encodeStateAsUpdate)(doc, stateVector1);
|
|
14
|
+
var newDiff = (0, yjs_1.encodeStateAsUpdate)(doc, stateVector2);
|
|
15
|
+
return (0, yjs_1.diffUpdate)(diff, newDiff);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Connects to a Y server and picks up the most recent change
|
|
19
|
+
* Does not load initial data
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
var useYSpreadsheet = function (_a) {
|
|
23
|
+
var onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeCharts = _a.onChangeCharts, onChangeEmbeds = _a.onChangeEmbeds, onChangeConditionalFormats = _a.onChangeConditionalFormats, onChangeDataValidations = _a.onChangeDataValidations, onChangeNamedRanges = _a.onChangeNamedRanges, onChangeProtectedRanges = _a.onChangeProtectedRanges, onError = _a.onError, enqueueCalculation = _a.enqueueCalculation, calculateNow = _a.calculateNow, userId = _a.userId, title = _a.title, sheetId = _a.sheetId, activeCell = _a.activeCell, doc = _a.doc, provider = _a.provider;
|
|
24
|
+
var _b = tslib_1.__read((0, react_1.useState)([]), 2), users = _b[0], setUsers = _b[1];
|
|
25
|
+
var _c = tslib_1.__read((0, react_1.useState)(false), 2), synced = _c[0], setSynced = _c[1];
|
|
26
|
+
var previousStateVectorRef = (0, react_1.useRef)(undefined);
|
|
27
|
+
var currentStateVectorRef = (0, react_1.useRef)(undefined);
|
|
28
|
+
// Recalc cells
|
|
29
|
+
var yRecalcCells = (0, react_1.useMemo)(function () { return doc.getArray("recalcCells"); }, [doc]);
|
|
30
|
+
var yDisableRecalc = doc.getMap("disableRecalc");
|
|
31
|
+
// Counter
|
|
32
|
+
// Create a counter to keep track of when the last sync was done
|
|
33
|
+
var docSyncCounterRef = (0, react_1.useRef)(new Map());
|
|
34
|
+
// Create a doc map
|
|
35
|
+
var docMap = (0, react_1.useMemo)(function () {
|
|
36
|
+
var docMap = new Map([
|
|
37
|
+
[
|
|
38
|
+
"sheets",
|
|
39
|
+
[doc.getArray("sheets"), onChangeSheets, "sheetId"],
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
"sheetData",
|
|
43
|
+
[doc.getArray("sheetData"), onChangeSheetData],
|
|
44
|
+
],
|
|
45
|
+
["tables", [doc.getArray("tables"), onChangeTables, "id"]],
|
|
46
|
+
["embeds", [doc.getArray("embeds"), onChangeEmbeds, "id"]],
|
|
47
|
+
["charts", [doc.getArray("charts"), onChangeCharts, "id"]],
|
|
48
|
+
[
|
|
49
|
+
"conditionalFormats",
|
|
50
|
+
[
|
|
51
|
+
doc.getArray("conditionalFormats"),
|
|
52
|
+
onChangeConditionalFormats,
|
|
53
|
+
"id",
|
|
54
|
+
],
|
|
55
|
+
],
|
|
56
|
+
[
|
|
57
|
+
"dataValidations",
|
|
58
|
+
[
|
|
59
|
+
doc.getArray("dataValidations"),
|
|
60
|
+
onChangeDataValidations,
|
|
61
|
+
"id",
|
|
62
|
+
],
|
|
63
|
+
],
|
|
64
|
+
[
|
|
65
|
+
"namedRanges",
|
|
66
|
+
[doc.getArray("namedRanges"), onChangeNamedRanges, "id"],
|
|
67
|
+
],
|
|
68
|
+
[
|
|
69
|
+
"protectedRanges",
|
|
70
|
+
[
|
|
71
|
+
doc.getArray("protectedRanges"),
|
|
72
|
+
onChangeProtectedRanges,
|
|
73
|
+
"id",
|
|
74
|
+
],
|
|
75
|
+
],
|
|
76
|
+
]);
|
|
77
|
+
return docMap;
|
|
78
|
+
}, [
|
|
79
|
+
onChangeSheets,
|
|
80
|
+
onChangeSheetData,
|
|
81
|
+
onChangeTables,
|
|
82
|
+
onChangeCharts,
|
|
83
|
+
onChangeConditionalFormats,
|
|
84
|
+
onChangeDataValidations,
|
|
85
|
+
onChangeNamedRanges,
|
|
86
|
+
onChangeProtectedRanges,
|
|
87
|
+
onChangeEmbeds,
|
|
88
|
+
doc,
|
|
89
|
+
]);
|
|
90
|
+
// Listen to awareness
|
|
91
|
+
var awareness = provider === null || provider === void 0 ? void 0 : provider.awareness;
|
|
92
|
+
// Callback when the content is first synced
|
|
93
|
+
var onSynced = (0, react_1.useCallback)(function () {
|
|
94
|
+
var e_1, _a;
|
|
95
|
+
var _b;
|
|
96
|
+
var syncedDoc = doc;
|
|
97
|
+
if (previousStateVectorRef.current) {
|
|
98
|
+
// Capture the current state vector on subsequent syncs
|
|
99
|
+
currentStateVectorRef.current = getStateVector(doc);
|
|
100
|
+
var updates = getUpdatesBetween(doc, previousStateVectorRef.current, currentStateVectorRef.current);
|
|
101
|
+
var newDoc = new yjs_1.Doc({ gc: true });
|
|
102
|
+
(0, yjs_1.applyUpdate)(newDoc, updates);
|
|
103
|
+
syncedDoc = newDoc;
|
|
104
|
+
previousStateVectorRef.current = currentStateVectorRef.current;
|
|
105
|
+
}
|
|
106
|
+
var getInitialPatches = function (ydoc, counterStart) {
|
|
107
|
+
var e_2, _a;
|
|
108
|
+
if (counterStart === void 0) { counterStart = 0; }
|
|
109
|
+
var patches = [];
|
|
110
|
+
var endCounter = counterStart;
|
|
111
|
+
for (var i = counterStart; i < ydoc.length; i++) {
|
|
112
|
+
var userPatches = ydoc.get(i).patches;
|
|
113
|
+
try {
|
|
114
|
+
for (var userPatches_1 = (e_2 = void 0, tslib_1.__values(userPatches)), userPatches_1_1 = userPatches_1.next(); !userPatches_1_1.done; userPatches_1_1 = userPatches_1.next()) {
|
|
115
|
+
var patch = userPatches_1_1.value;
|
|
116
|
+
patches.push(patch);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
120
|
+
finally {
|
|
121
|
+
try {
|
|
122
|
+
if (userPatches_1_1 && !userPatches_1_1.done && (_a = userPatches_1.return)) _a.call(userPatches_1);
|
|
123
|
+
}
|
|
124
|
+
finally { if (e_2) throw e_2.error; }
|
|
125
|
+
}
|
|
126
|
+
endCounter++;
|
|
127
|
+
}
|
|
128
|
+
return [patches, endCounter];
|
|
129
|
+
};
|
|
130
|
+
var _loop_1 = function (mappingKey, _1, setStateFn, idKey) {
|
|
131
|
+
var startCounter = (_b = docSyncCounterRef.current.get(mappingKey)) !== null && _b !== void 0 ? _b : 0;
|
|
132
|
+
var _e = tslib_1.__read(getInitialPatches(syncedDoc.getArray(mappingKey), startCounter), 2), patches = _e[0], endCounter = _e[1];
|
|
133
|
+
if (patches.length) {
|
|
134
|
+
docSyncCounterRef.current.set(mappingKey, endCounter);
|
|
135
|
+
setStateFn === null || setStateFn === void 0 ? void 0 : setStateFn(function (prev) {
|
|
136
|
+
try {
|
|
137
|
+
var nextState = idKey
|
|
138
|
+
? (0, uniqBy_1.default)((0, immer_1.applyPatches)(prev, patches), idKey)
|
|
139
|
+
: (0, immer_1.applyPatches)(prev, patches);
|
|
140
|
+
return nextState;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
console.error(err);
|
|
144
|
+
onError === null || onError === void 0 ? void 0 : onError(err);
|
|
145
|
+
}
|
|
146
|
+
return prev;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
for (var docMap_1 = tslib_1.__values(docMap), docMap_1_1 = docMap_1.next(); !docMap_1_1.done; docMap_1_1 = docMap_1.next()) {
|
|
152
|
+
var _c = tslib_1.__read(docMap_1_1.value, 2), mappingKey = _c[0], _d = tslib_1.__read(_c[1], 3), _1 = _d[0], setStateFn = _d[1], idKey = _d[2];
|
|
153
|
+
_loop_1(mappingKey, _1, setStateFn, idKey);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
157
|
+
finally {
|
|
158
|
+
try {
|
|
159
|
+
if (docMap_1_1 && !docMap_1_1.done && (_a = docMap_1.return)) _a.call(docMap_1);
|
|
160
|
+
}
|
|
161
|
+
finally { if (e_1) throw e_1.error; }
|
|
162
|
+
}
|
|
163
|
+
// Update recalc cells
|
|
164
|
+
(0, spreadsheet_1.scheduleNormalPriorityCallback)(function () {
|
|
165
|
+
calculateNow({
|
|
166
|
+
disableEvaluation: true,
|
|
167
|
+
shouldResetCellDependencyGraph: true,
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
// Set synced
|
|
171
|
+
setSynced(true);
|
|
172
|
+
}, [calculateNow, docMap, onError, doc]);
|
|
173
|
+
// Sync state
|
|
174
|
+
if ((provider === null || provider === void 0 ? void 0 : provider.synced) && !synced) {
|
|
175
|
+
onSynced();
|
|
176
|
+
}
|
|
177
|
+
// Listen to first sync event
|
|
178
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
179
|
+
provider === null || provider === void 0 ? void 0 : provider.on("synced", onSynced);
|
|
180
|
+
var onConnectionStatusChange = function (_a) {
|
|
181
|
+
var status = _a.status;
|
|
182
|
+
if (status === "disconnected") {
|
|
183
|
+
previousStateVectorRef.current = getStateVector(doc);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
provider === null || provider === void 0 ? void 0 : provider.on("status", onConnectionStatusChange);
|
|
187
|
+
return function () {
|
|
188
|
+
provider === null || provider === void 0 ? void 0 : provider.off("synced", onSynced);
|
|
189
|
+
provider === null || provider === void 0 ? void 0 : provider.off("status", onConnectionStatusChange);
|
|
190
|
+
};
|
|
191
|
+
}, [provider, onSynced, doc]);
|
|
192
|
+
// Awareness
|
|
193
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
194
|
+
var onChangeAwareness = function () {
|
|
195
|
+
var e_3, _a;
|
|
196
|
+
if (awareness) {
|
|
197
|
+
var collaborators = [];
|
|
198
|
+
try {
|
|
199
|
+
for (var _b = tslib_1.__values(awareness.getStates().entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
200
|
+
var _d = tslib_1.__read(_c.value, 2), _2 = _d[0], value = _d[1];
|
|
201
|
+
if (value && value.activeCell && value.userId) {
|
|
202
|
+
collaborators.push({
|
|
203
|
+
activeCell: value.activeCell,
|
|
204
|
+
title: value.title,
|
|
205
|
+
userId: value.userId,
|
|
206
|
+
sheetId: value.sheetId,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
212
|
+
finally {
|
|
213
|
+
try {
|
|
214
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
215
|
+
}
|
|
216
|
+
finally { if (e_3) throw e_3.error; }
|
|
217
|
+
}
|
|
218
|
+
setUsers(collaborators);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
// Listen to awareness
|
|
222
|
+
awareness === null || awareness === void 0 ? void 0 : awareness.on("change", onChangeAwareness);
|
|
223
|
+
return function () {
|
|
224
|
+
awareness === null || awareness === void 0 ? void 0 : awareness.off("change", onChangeAwareness);
|
|
225
|
+
};
|
|
226
|
+
}, [awareness]);
|
|
227
|
+
// Set local awareness state
|
|
228
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
229
|
+
awareness === null || awareness === void 0 ? void 0 : awareness.setLocalState({
|
|
230
|
+
userId: userId,
|
|
231
|
+
title: title,
|
|
232
|
+
sheetId: sheetId,
|
|
233
|
+
});
|
|
234
|
+
}, [awareness, userId, title, sheetId]);
|
|
235
|
+
// Sheet data changes
|
|
236
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
237
|
+
var e_4, _a;
|
|
238
|
+
var getPatchDeltasFromEvent = function (event) {
|
|
239
|
+
var e_5, _a, e_6, _b, e_7, _c;
|
|
240
|
+
var patches = [];
|
|
241
|
+
if (event.transaction.origin !== "locale") {
|
|
242
|
+
try {
|
|
243
|
+
for (var _d = tslib_1.__values(event.changes.delta), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
244
|
+
var changes = _e.value;
|
|
245
|
+
for (var type in changes) {
|
|
246
|
+
if (type === "insert" && changes[type] !== undefined) {
|
|
247
|
+
try {
|
|
248
|
+
for (var _f = (e_6 = void 0, tslib_1.__values(changes[type])), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
249
|
+
var userPatches = _g.value.patches;
|
|
250
|
+
try {
|
|
251
|
+
for (var userPatches_2 = (e_7 = void 0, tslib_1.__values(userPatches)), userPatches_2_1 = userPatches_2.next(); !userPatches_2_1.done; userPatches_2_1 = userPatches_2.next()) {
|
|
252
|
+
var patch = userPatches_2_1.value;
|
|
253
|
+
patches.push(patch);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
257
|
+
finally {
|
|
258
|
+
try {
|
|
259
|
+
if (userPatches_2_1 && !userPatches_2_1.done && (_c = userPatches_2.return)) _c.call(userPatches_2);
|
|
260
|
+
}
|
|
261
|
+
finally { if (e_7) throw e_7.error; }
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
266
|
+
finally {
|
|
267
|
+
try {
|
|
268
|
+
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
269
|
+
}
|
|
270
|
+
finally { if (e_6) throw e_6.error; }
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
277
|
+
finally {
|
|
278
|
+
try {
|
|
279
|
+
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
280
|
+
}
|
|
281
|
+
finally { if (e_5) throw e_5.error; }
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return patches;
|
|
285
|
+
};
|
|
286
|
+
var syncRecalcCells = function (recalcCells) {
|
|
287
|
+
var e_8, _a;
|
|
288
|
+
try {
|
|
289
|
+
for (var recalcCells_1 = tslib_1.__values(recalcCells), recalcCells_1_1 = recalcCells_1.next(); !recalcCells_1_1.done; recalcCells_1_1 = recalcCells_1.next()) {
|
|
290
|
+
var _b = tslib_1.__read(recalcCells_1_1.value, 2), _3 = _b[0], position = _b[1];
|
|
291
|
+
enqueueCalculation({
|
|
292
|
+
type: "add",
|
|
293
|
+
position: position,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
298
|
+
finally {
|
|
299
|
+
try {
|
|
300
|
+
if (recalcCells_1_1 && !recalcCells_1_1.done && (_a = recalcCells_1.return)) _a.call(recalcCells_1);
|
|
301
|
+
}
|
|
302
|
+
finally { if (e_8) throw e_8.error; }
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
// Trigger cell recalcs
|
|
306
|
+
var onRecalcCellsChange = function (event) {
|
|
307
|
+
var patches = getPatchDeltasFromEvent(event);
|
|
308
|
+
if (event.transaction.origin !== "local") {
|
|
309
|
+
syncRecalcCells(patches);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
// Listen to changes after sync
|
|
313
|
+
if (synced) {
|
|
314
|
+
var subs_1 = [];
|
|
315
|
+
var _loop_2 = function (_4, doc_1, setStateFn) {
|
|
316
|
+
var callback = function (event) {
|
|
317
|
+
var patches = getPatchDeltasFromEvent(event);
|
|
318
|
+
var disableRecalc = yDisableRecalc.get("disableRecalc");
|
|
319
|
+
if (event.transaction.origin !== "local" && disableRecalc !== true) {
|
|
320
|
+
if (patches.length) {
|
|
321
|
+
setStateFn === null || setStateFn === void 0 ? void 0 : setStateFn(function (prev) {
|
|
322
|
+
try {
|
|
323
|
+
return (0, immer_1.applyPatches)(prev, patches);
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
console.error(err);
|
|
327
|
+
onError === null || onError === void 0 ? void 0 : onError(err);
|
|
328
|
+
}
|
|
329
|
+
return prev;
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
doc_1.observe(callback);
|
|
335
|
+
subs_1.push([doc_1, callback]);
|
|
336
|
+
};
|
|
337
|
+
try {
|
|
338
|
+
for (var docMap_2 = tslib_1.__values(docMap), docMap_2_1 = docMap_2.next(); !docMap_2_1.done; docMap_2_1 = docMap_2.next()) {
|
|
339
|
+
var _b = tslib_1.__read(docMap_2_1.value, 2), _4 = _b[0], _c = tslib_1.__read(_b[1], 2), doc_1 = _c[0], setStateFn = _c[1];
|
|
340
|
+
_loop_2(_4, doc_1, setStateFn);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
344
|
+
finally {
|
|
345
|
+
try {
|
|
346
|
+
if (docMap_2_1 && !docMap_2_1.done && (_a = docMap_2.return)) _a.call(docMap_2);
|
|
347
|
+
}
|
|
348
|
+
finally { if (e_4) throw e_4.error; }
|
|
349
|
+
}
|
|
350
|
+
// Observe recalc cells separat
|
|
351
|
+
yRecalcCells.observe(onRecalcCellsChange);
|
|
352
|
+
return function () {
|
|
353
|
+
subs_1.forEach(function (_a) {
|
|
354
|
+
var _b = tslib_1.__read(_a, 2), doc = _b[0], callback = _b[1];
|
|
355
|
+
return doc.unobserve(callback);
|
|
356
|
+
});
|
|
357
|
+
yRecalcCells.unobserve(onRecalcCellsChange);
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
}, [userId, provider, synced, doc, yDisableRecalc]);
|
|
361
|
+
// Broadcast patch
|
|
362
|
+
var onBroadcastPatch = (0, react_1.useCallback)(function (patches) {
|
|
363
|
+
doc.transact(function () {
|
|
364
|
+
var e_9, _a, e_10, _b;
|
|
365
|
+
var _c, _d;
|
|
366
|
+
try {
|
|
367
|
+
for (var patches_1 = tslib_1.__values(patches), patches_1_1 = patches_1.next(); !patches_1_1.done; patches_1_1 = patches_1.next()) {
|
|
368
|
+
var _e = tslib_1.__read(patches_1_1.value, 2), patch = _e[0], _f = _e[1], type = _f === void 0 ? "redo" : _f;
|
|
369
|
+
var patchKey = type === "redo" ? "patches" : "inversePatches";
|
|
370
|
+
try {
|
|
371
|
+
for (var docMap_3 = (e_10 = void 0, tslib_1.__values(docMap)), docMap_3_1 = docMap_3.next(); !docMap_3_1.done; docMap_3_1 = docMap_3.next()) {
|
|
372
|
+
var _g = tslib_1.__read(docMap_3_1.value, 2), mappingKey = _g[0], _h = tslib_1.__read(_g[1], 1), doc_2 = _h[0];
|
|
373
|
+
var currentPatch = patch[mappingKey];
|
|
374
|
+
var patches_2 = currentPatch === null || currentPatch === void 0 ? void 0 : currentPatch[patchKey];
|
|
375
|
+
if (patches_2) {
|
|
376
|
+
var startCounter = (_c = docSyncCounterRef.current.get(mappingKey)) !== null && _c !== void 0 ? _c : 0;
|
|
377
|
+
doc_2.push([
|
|
378
|
+
{
|
|
379
|
+
userId: userId,
|
|
380
|
+
patches: patches_2,
|
|
381
|
+
},
|
|
382
|
+
]);
|
|
383
|
+
// Update last counter
|
|
384
|
+
docSyncCounterRef.current.set(mappingKey, startCounter + patches_2.length);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
389
|
+
finally {
|
|
390
|
+
try {
|
|
391
|
+
if (docMap_3_1 && !docMap_3_1.done && (_b = docMap_3.return)) _b.call(docMap_3);
|
|
392
|
+
}
|
|
393
|
+
finally { if (e_10) throw e_10.error; }
|
|
394
|
+
}
|
|
395
|
+
if ((_d = patch.recalcCells) === null || _d === void 0 ? void 0 : _d[type]) {
|
|
396
|
+
yRecalcCells.push([
|
|
397
|
+
{
|
|
398
|
+
userId: userId,
|
|
399
|
+
patches: Array.from(patch.recalcCells[type]),
|
|
400
|
+
},
|
|
401
|
+
]);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
406
|
+
finally {
|
|
407
|
+
try {
|
|
408
|
+
if (patches_1_1 && !patches_1_1.done && (_a = patches_1.return)) _a.call(patches_1);
|
|
409
|
+
}
|
|
410
|
+
finally { if (e_9) throw e_9.error; }
|
|
411
|
+
}
|
|
412
|
+
}, "local");
|
|
413
|
+
}, [userId, docMap, doc, yRecalcCells, yDisableRecalc]);
|
|
414
|
+
// Listen to active cell change
|
|
415
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
416
|
+
if (activeCell) {
|
|
417
|
+
awareness === null || awareness === void 0 ? void 0 : awareness.setLocalStateField("activeCell", activeCell);
|
|
418
|
+
}
|
|
419
|
+
}, [awareness, activeCell]);
|
|
420
|
+
// Listen to sheet change
|
|
421
|
+
(0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
|
|
422
|
+
awareness === null || awareness === void 0 ? void 0 : awareness.setLocalStateField("sheetId", sheetId);
|
|
423
|
+
}, [awareness, sheetId]);
|
|
424
|
+
return {
|
|
425
|
+
onBroadcastPatch: onBroadcastPatch,
|
|
426
|
+
users: users,
|
|
427
|
+
synced: synced,
|
|
428
|
+
};
|
|
429
|
+
};
|
|
430
|
+
exports.useYSpreadsheet = useYSpreadsheet;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAsBG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var config_1 = require("vitest/config");
|
|
4
|
+
exports.default = (0, config_1.defineConfig)({
|
|
5
|
+
test: {
|
|
6
|
+
globals: true,
|
|
7
|
+
environment: "jsdom",
|
|
8
|
+
// ✅ correct location for deps.inline
|
|
9
|
+
deps: {
|
|
10
|
+
inline: ["konva", "react-konva"],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
// Ensure Vite bundles these for SSR-style test runs
|
|
14
|
+
ssr: {
|
|
15
|
+
noExternal: ["konva", "react-konva"],
|
|
16
|
+
},
|
|
17
|
+
// Prefer the ESM build of react-konva (avoid its CJS wrapper that requires konva)
|
|
18
|
+
resolve: {
|
|
19
|
+
alias: {
|
|
20
|
+
"react-konva": "react-konva/es/ReactKonvaCore.js",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|