@noya-app/noya-api-client-react 0.1.38 → 0.1.40

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 CHANGED
@@ -5309,6 +5309,18 @@ var import_observable2 = require("@noya-app/observable");
5309
5309
  // ../state-manager/src/AssetManager.ts
5310
5310
  var import_noya_utils3 = require("@noya-app/noya-utils");
5311
5311
  var import_observable3 = require("@noya-app/observable");
5312
+ var _toNoyaAsset = (0, import_noya_utils3.memoize)(
5313
+ (asset) => ({
5314
+ id: asset.stableId,
5315
+ url: asset.url,
5316
+ createdAt: asset.createdAt,
5317
+ size: asset.size,
5318
+ contentType: asset.contentType,
5319
+ width: asset.width ?? null,
5320
+ height: asset.height ?? null,
5321
+ userId: asset.userId ?? null
5322
+ })
5323
+ );
5312
5324
 
5313
5325
  // ../noya-schemas/src/nullable.ts
5314
5326
  var Nullable = (schema) => Type.Union([Type.Null(), schema]);
@@ -5373,6 +5385,7 @@ var activityEventSchema = Type.Object({
5373
5385
  // ../noya-schemas/src/asset.ts
5374
5386
  var assetSchema = Type.Object({
5375
5387
  id: Type.String(),
5388
+ stableId: Type.String(),
5376
5389
  url: Type.String(),
5377
5390
  createdAt: Type.String(),
5378
5391
  size: Type.Number(),
@@ -6067,11 +6080,11 @@ function handleValue(target, handledSet, options) {
6067
6080
  }
6068
6081
  });
6069
6082
  if (setMap) {
6070
- const set3 = target;
6071
- const values = Array.from(set3);
6072
- set3.clear();
6083
+ const set4 = target;
6084
+ const values = Array.from(set4);
6085
+ set4.clear();
6073
6086
  values.forEach((value) => {
6074
- set3.add(setMap.has(value) ? setMap.get(value) : value);
6087
+ set4.add(setMap.has(value) ? setMap.get(value) : value);
6075
6088
  });
6076
6089
  }
6077
6090
  }
@@ -6904,7 +6917,7 @@ var makeCreator = (arg) => {
6904
6917
  };
6905
6918
  }
6906
6919
  const base2 = arg0;
6907
- const mutate2 = arg1;
6920
+ const mutate = arg1;
6908
6921
  let options = arg2;
6909
6922
  if (typeof arg1 !== "function") {
6910
6923
  options = arg1;
@@ -6948,7 +6961,7 @@ var makeCreator = (arg) => {
6948
6961
  }
6949
6962
  let result;
6950
6963
  try {
6951
- result = mutate2(draft);
6964
+ result = mutate(draft);
6952
6965
  } catch (error) {
6953
6966
  revokeProxy(getProxyDraft(draft));
6954
6967
  throw error;
@@ -7056,7 +7069,7 @@ function apply(state, patches, applyOptions) {
7056
7069
  if (i > -1) {
7057
7070
  patches = patches.slice(i + 1);
7058
7071
  }
7059
- const mutate2 = (draft) => {
7072
+ const mutate = (draft) => {
7060
7073
  patches.forEach((patch) => {
7061
7074
  const { path: _path, from: _fromPath, op } = patch;
7062
7075
  const path2 = unescapePath(_path);
@@ -7176,17 +7189,17 @@ function apply(state, patches, applyOptions) {
7176
7189
  console.warn('The "mutable" option is not allowed to be used with other options.');
7177
7190
  }
7178
7191
  }
7179
- mutate2(state);
7192
+ mutate(state);
7180
7193
  return void 0;
7181
7194
  }
7182
7195
  if (isDraft(state)) {
7183
7196
  if (applyOptions !== void 0) {
7184
7197
  throw new Error(`Cannot apply patches with options to a draft.`);
7185
7198
  }
7186
- mutate2(state);
7199
+ mutate(state);
7187
7200
  return state;
7188
7201
  }
7189
- return create(state, mutate2, Object.assign(Object.assign({}, applyOptions), { enablePatches: false }));
7202
+ return create(state, mutate, Object.assign(Object.assign({}, applyOptions), { enablePatches: false }));
7190
7203
  }
7191
7204
  var constructorString = Object.prototype.constructor.toString();
7192
7205
 
@@ -7299,6 +7312,10 @@ var import_fast_diff = __toESM(require_diff());
7299
7312
  // ../state-manager/src/EvalManager.ts
7300
7313
  var import_noya_utils4 = require("@noya-app/noya-utils");
7301
7314
 
7315
+ // ../state-manager/src/FilePropertyManager.ts
7316
+ var import_noya_utils5 = require("@noya-app/noya-utils");
7317
+ var import_observable6 = require("@noya-app/observable");
7318
+
7302
7319
  // ../state-manager/src/historyEntries.ts
7303
7320
  var HistoryEntries;
7304
7321
  ((HistoryEntries2) => {
@@ -7386,7 +7403,7 @@ var HistoryEntries;
7386
7403
  })(HistoryEntries || (HistoryEntries = {}));
7387
7404
 
7388
7405
  // ../state-manager/src/IOManager.ts
7389
- var import_observable6 = require("@noya-app/observable");
7406
+ var import_observable7 = require("@noya-app/observable");
7390
7407
 
7391
7408
  // ../state-manager/src/jwt.ts
7392
7409
  function base64UrlEncode(str) {
@@ -7488,27 +7505,28 @@ var jwt;
7488
7505
  })(jwt || (jwt = {}));
7489
7506
 
7490
7507
  // ../state-manager/src/MenuManager.ts
7491
- var import_observable7 = require("@noya-app/observable");
7508
+ var import_noya_utils6 = require("@noya-app/noya-utils");
7509
+ var import_observable8 = require("@noya-app/observable");
7492
7510
 
7493
7511
  // ../state-manager/src/multiplayer.ts
7494
- var import_noya_utils5 = require("@noya-app/noya-utils");
7495
- var import_observable9 = require("@noya-app/observable");
7512
+ var import_noya_utils7 = require("@noya-app/noya-utils");
7513
+ var import_observable10 = require("@noya-app/observable");
7496
7514
 
7497
7515
  // ../state-manager/src/stateManager.ts
7498
- var import_observable8 = require("@noya-app/observable");
7516
+ var import_observable9 = require("@noya-app/observable");
7499
7517
 
7500
7518
  // ../state-manager/src/multiplayer.ts
7501
- var createHash = (value, options) => (0, import_noya_utils5.hash)(value, { ...options, ignoreUndefinedProperties: true });
7519
+ var createHash = (value, options) => (0, import_noya_utils7.hash)(value, { ...options, ignoreUndefinedProperties: true });
7502
7520
 
7503
7521
  // ../state-manager/src/NoyaManager.ts
7504
- var import_noya_utils9 = require("@noya-app/noya-utils");
7505
- var import_observable17 = require("@noya-app/observable");
7522
+ var import_noya_utils11 = require("@noya-app/noya-utils");
7523
+ var import_observable18 = require("@noya-app/observable");
7506
7524
 
7507
7525
  // ../noya-pipeline/src/graphToTasks.ts
7508
- var import_observable10 = require("@noya-app/observable");
7526
+ var import_observable11 = require("@noya-app/observable");
7509
7527
 
7510
7528
  // ../noya-pipeline/src/state.ts
7511
- var import_noya_utils6 = require("@noya-app/noya-utils");
7529
+ var import_noya_utils8 = require("@noya-app/noya-utils");
7512
7530
  var rectSchema = Type.Object({
7513
7531
  x: Type.Number(),
7514
7532
  y: Type.Number(),
@@ -7607,24 +7625,24 @@ var pipelineSchema = Type.Object(
7607
7625
  );
7608
7626
 
7609
7627
  // ../state-manager/src/PipelineManager.ts
7610
- var import_observable11 = require("@noya-app/observable");
7628
+ var import_observable12 = require("@noya-app/observable");
7611
7629
 
7612
7630
  // ../state-manager/src/PublishingManager.ts
7613
- var import_observable12 = require("@noya-app/observable");
7631
+ var import_observable13 = require("@noya-app/observable");
7614
7632
 
7615
7633
  // ../state-manager/src/ResourceManager.ts
7616
- var import_noya_utils7 = require("@noya-app/noya-utils");
7617
- var import_observable13 = require("@noya-app/observable");
7634
+ var import_noya_utils9 = require("@noya-app/noya-utils");
7635
+ var import_observable14 = require("@noya-app/observable");
7618
7636
 
7619
7637
  // ../state-manager/src/rpcManager.ts
7620
- var import_noya_utils8 = require("@noya-app/noya-utils");
7621
- var import_observable14 = require("@noya-app/observable");
7638
+ var import_noya_utils10 = require("@noya-app/noya-utils");
7639
+ var import_observable15 = require("@noya-app/observable");
7622
7640
 
7623
7641
  // ../state-manager/src/SecretManager.ts
7624
- var import_observable15 = require("@noya-app/observable");
7642
+ var import_observable16 = require("@noya-app/observable");
7625
7643
 
7626
7644
  // ../state-manager/src/TaskManager.ts
7627
- var import_observable16 = require("@noya-app/observable");
7645
+ var import_observable17 = require("@noya-app/observable");
7628
7646
 
7629
7647
  // ../state-manager/src/NoyaManager.ts
7630
7648
  var createMutatorParametersSchema = Type.Object({
@@ -7636,6 +7654,9 @@ var createMutatorParametersSchema = Type.Object({
7636
7654
  })
7637
7655
  });
7638
7656
 
7657
+ // ../state-manager/src/sync/localRpcHelpers.ts
7658
+ var import_noya_utils12 = require("@noya-app/noya-utils");
7659
+
7639
7660
  // ../noya-keymap/src/hooks.ts
7640
7661
  var import_react4 = require("react");
7641
7662
 
@@ -7747,10 +7768,10 @@ var MenuItemTree = (0, import_tree_visit3.defineTree)((node) => {
7747
7768
  });
7748
7769
 
7749
7770
  // ../noya-multiplayer-react/src/ai.ts
7750
- var import_react59 = require("react");
7771
+ var import_react60 = require("react");
7751
7772
 
7752
7773
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
7753
- var import_observable18 = require("@noya-app/observable");
7774
+ var import_observable19 = require("@noya-app/observable");
7754
7775
 
7755
7776
  // ../noya-react-utils/src/components/AutoSizer.tsx
7756
7777
  var React2 = __toESM(require("react"));
@@ -7932,7 +7953,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
7932
7953
  var import_react8 = require("react");
7933
7954
 
7934
7955
  // ../noya-react-utils/src/hooks/useDeepArray.ts
7935
- var import_noya_utils10 = require("@noya-app/noya-utils");
7956
+ var import_noya_utils13 = require("@noya-app/noya-utils");
7936
7957
  var import_react9 = require("react");
7937
7958
  function useJsonMemo(value) {
7938
7959
  const stringified = (0, import_react9.useMemo)(
@@ -7947,7 +7968,7 @@ function useJsonMemo(value) {
7947
7968
  }
7948
7969
 
7949
7970
  // ../noya-react-utils/src/hooks/useDeepState.ts
7950
- var import_noya_utils11 = require("@noya-app/noya-utils");
7971
+ var import_noya_utils14 = require("@noya-app/noya-utils");
7951
7972
  var import_react10 = require("react");
7952
7973
 
7953
7974
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -7978,7 +7999,7 @@ var import_react17 = require("react");
7978
7999
  var import_react18 = require("react");
7979
8000
 
7980
8001
  // ../noya-react-utils/src/hooks/useShallowArray.ts
7981
- var import_noya_utils12 = require("@noya-app/noya-utils");
8002
+ var import_noya_utils15 = require("@noya-app/noya-utils");
7982
8003
  var import_react19 = require("react");
7983
8004
 
7984
8005
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -7988,7 +8009,7 @@ var import_react20 = require("react");
7988
8009
  var import_react21 = require("react");
7989
8010
 
7990
8011
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
7991
- var import_noya_utils13 = require("@noya-app/noya-utils");
8012
+ var import_noya_utils16 = require("@noya-app/noya-utils");
7992
8013
  var import_react22 = require("react");
7993
8014
 
7994
8015
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -8051,7 +8072,7 @@ function downloadBlob(...params) {
8051
8072
  }
8052
8073
 
8053
8074
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
8054
- var import_react58 = __toESM(require("react"));
8075
+ var import_react59 = __toESM(require("react"));
8055
8076
 
8056
8077
  // ../noya-multiplayer-react/src/noyaApp.ts
8057
8078
  var import_react57 = require("react");
@@ -8139,7 +8160,7 @@ var import_react55 = __toESM(require("react"));
8139
8160
  var import_client = require("react-dom/client");
8140
8161
 
8141
8162
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
8142
- var import_noya_utils14 = require("@noya-app/noya-utils");
8163
+ var import_noya_utils17 = require("@noya-app/noya-utils");
8143
8164
  var import_react54 = __toESM(require("react"));
8144
8165
 
8145
8166
  // ../../node_modules/react-inspector/dist/index.mjs
@@ -10472,19 +10493,17 @@ async function importAll(buffer, noyaManager, {
10472
10493
  }
10473
10494
  if (assets.length) {
10474
10495
  await Promise.all(
10475
- noyaManager.assetManager.assets$.get().map((asset) => noyaManager.assetManager.delete(asset.id))
10496
+ noyaManager.assetManager.assets$.get().map((asset) => noyaManager.assetManager.delete(asset.stableId))
10476
10497
  );
10477
- const idPairs = await Promise.all(
10498
+ await Promise.all(
10478
10499
  assets.map(async (asset) => {
10479
- const newAsset = await noyaManager.assetManager.create({
10500
+ await noyaManager.assetManager.create({
10480
10501
  data: assetMap[asset.id],
10481
- contentType: asset.contentType
10502
+ contentType: asset.contentType,
10503
+ stableId: asset.stableId
10482
10504
  });
10483
- return [asset.id, newAsset.id];
10484
10505
  })
10485
10506
  );
10486
- const replacementMap = Object.fromEntries(idPairs);
10487
- state = replaceDeep(state, replacementMap);
10488
10507
  }
10489
10508
  noyaManager.initialState = state;
10490
10509
  noyaManager.forceInit();
@@ -10517,27 +10536,6 @@ function decodeAll(buffer) {
10517
10536
  }
10518
10537
  return { state, schema, assets, assetMap };
10519
10538
  }
10520
- function replaceDeep(obj, replacementMap) {
10521
- switch (typeof obj) {
10522
- case "object":
10523
- if (obj === null) {
10524
- return obj;
10525
- }
10526
- if (Array.isArray(obj)) {
10527
- return obj.map((item) => replaceDeep(item, replacementMap));
10528
- }
10529
- return Object.fromEntries(
10530
- Object.entries(obj).map(([key, value]) => [
10531
- key,
10532
- replaceDeep(value, replacementMap)
10533
- ])
10534
- );
10535
- case "string":
10536
- return replacementMap[obj] ?? obj;
10537
- default:
10538
- return obj;
10539
- }
10540
- }
10541
10539
 
10542
10540
  // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
10543
10541
  var import_react51 = __toESM(require("react"));
@@ -11000,7 +10998,14 @@ var StateInspector = memoGeneric(function StateInspector2({
11000
10998
  "Upload"
11001
10999
  ))
11002
11000
  },
11003
- /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(themedObjectInspector, { name: asset.id, data: asset, theme: theme3 }), /* @__PURE__ */ import_react54.default.createElement(
11001
+ /* @__PURE__ */ import_react54.default.createElement(StateInspectorDisclosureRowInner, null, assets.map((asset) => /* @__PURE__ */ import_react54.default.createElement(StateInspectorRow, { key: asset.id, colorScheme }, /* @__PURE__ */ import_react54.default.createElement(
11002
+ themedObjectInspector,
11003
+ {
11004
+ name: asset.id,
11005
+ data: truncateAsset(asset),
11006
+ theme: theme3
11007
+ }
11008
+ ), /* @__PURE__ */ import_react54.default.createElement(
11004
11009
  StateInspectorButton,
11005
11010
  {
11006
11011
  theme: theme3,
@@ -11025,10 +11030,8 @@ var StateInspector = memoGeneric(function StateInspector2({
11025
11030
  "Are you sure you want to delete all resources?"
11026
11031
  );
11027
11032
  if (!ok) return;
11028
- await Promise.all(
11029
- resources.map(
11030
- (resource) => resourceManager.deleteResource({ id: resource.id })
11031
- )
11033
+ await resourceManager.deleteResource(
11034
+ resources.map((resource) => ({ id: resource.id }))
11032
11035
  );
11033
11036
  }
11034
11037
  },
@@ -11038,7 +11041,7 @@ var StateInspector = memoGeneric(function StateInspector2({
11038
11041
  {
11039
11042
  theme: theme3,
11040
11043
  onClick: async () => {
11041
- const path2 = prompt("Enter directory path") || (0, import_noya_utils14.uuid)();
11044
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils17.uuid)();
11042
11045
  await resourceManager.createResource({
11043
11046
  type: "directory",
11044
11047
  path: path2
@@ -11054,9 +11057,9 @@ var StateInspector = memoGeneric(function StateInspector2({
11054
11057
  const file = await uploadFile();
11055
11058
  resourceManager.createResource({
11056
11059
  type: "asset",
11057
- path: file.name || (0, import_noya_utils14.uuid)(),
11060
+ path: file.name || (0, import_noya_utils17.uuid)(),
11058
11061
  asset: {
11059
- content: import_noya_utils14.Base64.encode(await file.arrayBuffer()),
11062
+ content: import_noya_utils17.Base64.encode(await file.arrayBuffer()),
11060
11063
  contentType: file.type,
11061
11064
  encoding: "base64"
11062
11065
  }
@@ -11241,6 +11244,12 @@ var StateInspector = memoGeneric(function StateInspector2({
11241
11244
  )
11242
11245
  );
11243
11246
  });
11247
+ var truncateAsset = (0, import_noya_utils17.memoize)((asset) => {
11248
+ if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
11249
+ return { ...asset, url: ellipsis(asset.url, 40) };
11250
+ }
11251
+ return asset;
11252
+ });
11244
11253
 
11245
11254
  // ../noya-multiplayer-react/src/hooks.ts
11246
11255
  function useManagedHistory(stateManager) {
@@ -11251,15 +11260,16 @@ function useManagedHistory(stateManager) {
11251
11260
  );
11252
11261
  }
11253
11262
 
11263
+ // ../noya-multiplayer-react/src/singleton.tsx
11264
+ var import_react58 = __toESM(require("react"));
11265
+
11254
11266
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
11255
- var AnyNoyaStateContext = (0, import_react58.createContext)(void 0);
11256
- var ConnectedUsersContext = (0, import_react58.createContext)(void 0);
11257
- var AnyEphemeralUserDataManagerContext = (0, import_react58.createContext)(void 0);
11267
+ var AnyNoyaStateContext = (0, import_react59.createContext)(void 0);
11258
11268
  var emptyArray = [];
11259
11269
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
11260
- const [streamId, setStreamId] = (0, import_react58.useState)(void 0);
11270
+ const [streamId, setStreamId] = (0, import_react59.useState)(void 0);
11261
11271
  const stableStreamFilter = useJsonMemo(streamFilter);
11262
- (0, import_react58.useEffect)(() => {
11272
+ (0, import_react59.useEffect)(() => {
11263
11273
  if (!stableStreamFilter) return;
11264
11274
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
11265
11275
  setStreamId(streamId2);
@@ -11273,8 +11283,8 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
11273
11283
  }
11274
11284
 
11275
11285
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
11276
- var import_observable19 = require("@noya-app/observable");
11277
- var import_react60 = __toESM(require("react"));
11286
+ var import_observable20 = require("@noya-app/observable");
11287
+ var import_react61 = __toESM(require("react"));
11278
11288
  function shouldShow(hideAfter, updatedAt) {
11279
11289
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
11280
11290
  }
@@ -11284,18 +11294,18 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
11284
11294
  hideAfter = 5e3,
11285
11295
  renderUserPointer
11286
11296
  }) {
11287
- const observable = (0, import_react60.useMemo)(() => {
11297
+ const observable = (0, import_react61.useMemo)(() => {
11288
11298
  const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
11289
11299
  const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
11290
- return import_observable19.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
11300
+ return import_observable20.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
11291
11301
  return { metadata: metadata2, data: data2 };
11292
11302
  });
11293
11303
  }, [ephemeralUserDataManager, user.id]);
11294
11304
  const { metadata, data } = useObservable2(observable);
11295
- const [, setForceUpdate] = (0, import_react60.useState)(0);
11305
+ const [, setForceUpdate] = (0, import_react61.useState)(0);
11296
11306
  const updatedAt = metadata?.updatedAt ?? 0;
11297
11307
  const show = shouldShow(hideAfter, updatedAt);
11298
- (0, import_react60.useEffect)(() => {
11308
+ (0, import_react61.useEffect)(() => {
11299
11309
  if (!show) return;
11300
11310
  const timeoutId = setTimeout(() => {
11301
11311
  setForceUpdate((prev) => prev + 1);
@@ -11317,9 +11327,9 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
11317
11327
  }) {
11318
11328
  const currentUserId = useObservable2(ephemeralUserDataManager.currentUserId$);
11319
11329
  const connectedUsers = useObservable2(connectedUsersManager.connectedUsers$);
11320
- return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, connectedUsers.map((user) => {
11330
+ return /* @__PURE__ */ import_react61.default.createElement(import_react61.default.Fragment, null, connectedUsers.map((user) => {
11321
11331
  if (user.id === currentUserId) return null;
11322
- return /* @__PURE__ */ import_react60.default.createElement(
11332
+ return /* @__PURE__ */ import_react61.default.createElement(
11323
11333
  UserPointerInternal,
11324
11334
  {
11325
11335
  key: user.id,
@@ -11333,15 +11343,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
11333
11343
 
11334
11344
  // src/react/tableHooks.ts
11335
11345
  var import_observable_store = require("@noya-app/observable-store");
11336
- var import_react61 = require("react");
11346
+ var import_react62 = require("react");
11337
11347
  function useTable(table, {
11338
11348
  where,
11339
11349
  select
11340
11350
  }, options = {}) {
11341
- const stableSelect = (0, import_react61.useMemo)(() => {
11351
+ const stableSelect = (0, import_react62.useMemo)(() => {
11342
11352
  return JSON.stringify(select);
11343
11353
  }, [select]);
11344
- const stableWhere = (0, import_react61.useMemo)(() => {
11354
+ const stableWhere = (0, import_react62.useMemo)(() => {
11345
11355
  let cloneWithNoUndefined = {};
11346
11356
  for (const [key, value] of Object.entries(where ?? {})) {
11347
11357
  if (value !== void 0) {
@@ -11350,7 +11360,7 @@ function useTable(table, {
11350
11360
  }
11351
11361
  return JSON.stringify(cloneWithNoUndefined);
11352
11362
  }, [where]);
11353
- const observable = (0, import_react61.useMemo)(() => {
11363
+ const observable = (0, import_react62.useMemo)(() => {
11354
11364
  const parsedSelect = JSON.parse(stableSelect);
11355
11365
  const parsedWhere = JSON.parse(stableWhere);
11356
11366
  if (!table) {
@@ -11377,67 +11387,99 @@ function useTable(table, {
11377
11387
  }
11378
11388
  );
11379
11389
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
11380
- (0, import_react61.useEffect)(() => {
11390
+ (0, import_react62.useEffect)(() => {
11381
11391
  observable.start?.();
11382
11392
  }, [observable]);
11383
11393
  const { status, data } = useObservable2(observable);
11384
- return (0, import_react61.useMemo)(() => {
11394
+ const optimisticUpdate = (0, import_react62.useCallback)(
11395
+ (entity, config) => {
11396
+ if (!table) return;
11397
+ table.optimisticUpdate(entity, config);
11398
+ },
11399
+ [table]
11400
+ );
11401
+ return (0, import_react62.useMemo)(() => {
11385
11402
  return {
11386
11403
  status,
11387
11404
  data,
11388
- refetch: observable.refetch
11405
+ refetch: observable.refetch,
11406
+ optimisticUpdate
11389
11407
  };
11390
- }, [status, data, observable]);
11408
+ }, [status, data, observable, optimisticUpdate]);
11391
11409
  }
11392
11410
  function useFileList(select, options = {}) {
11393
11411
  const client = useNoyaClientOrFallback();
11394
- return useTable(client.fileList$, { select }, options);
11412
+ const { status, data, refetch, optimisticUpdate } = useTable(
11413
+ client.fileList$,
11414
+ { select },
11415
+ options
11416
+ );
11417
+ return {
11418
+ status,
11419
+ data,
11420
+ refetch,
11421
+ optimisticUpdate
11422
+ };
11395
11423
  }
11396
11424
  function useFileListItem(id, select, options = {}) {
11397
11425
  const client = useNoyaClientOrFallback();
11398
- const { status, data, refetch } = useTable(
11426
+ const { status, data, refetch, optimisticUpdate } = useTable(
11399
11427
  client.fileList$,
11400
11428
  { where: { id: id ?? null }, select },
11401
11429
  options
11402
11430
  );
11403
- return (0, import_react61.useMemo)(() => {
11431
+ return (0, import_react62.useMemo)(() => {
11404
11432
  return {
11405
11433
  data: data.at(0),
11406
11434
  status,
11407
- refetch
11435
+ refetch,
11436
+ optimisticUpdate
11408
11437
  };
11409
- }, [data, status, refetch]);
11438
+ }, [data, status, refetch, optimisticUpdate]);
11410
11439
  }
11411
11440
  function useResourcesList(fileId, select, options = {}) {
11412
11441
  const client = useNoyaClientOrFallback();
11413
- return useTable(
11442
+ const { status, data, refetch, optimisticUpdate } = useTable(
11414
11443
  client.resources$,
11415
11444
  { select, where: { accessibleByFileId: fileId } },
11416
11445
  options
11417
11446
  );
11447
+ return {
11448
+ status,
11449
+ data,
11450
+ refetch,
11451
+ optimisticUpdate
11452
+ };
11418
11453
  }
11419
11454
  function useUser(id, select, options = {}) {
11420
11455
  const client = useNoyaClientOrFallback();
11421
- const { status, data, refetch } = useTable(
11456
+ const { status, data, refetch, optimisticUpdate } = useTable(
11422
11457
  client.users$,
11423
11458
  { select, where: { id: id ?? null } },
11424
11459
  options
11425
11460
  );
11426
- return (0, import_react61.useMemo)(() => {
11461
+ return (0, import_react62.useMemo)(() => {
11427
11462
  return {
11428
11463
  status,
11429
11464
  data: data.at(0),
11430
- refetch
11465
+ refetch,
11466
+ optimisticUpdate
11431
11467
  };
11432
- }, [status, data, refetch]);
11468
+ }, [status, data, refetch, optimisticUpdate]);
11433
11469
  }
11434
11470
  function useActivityEventsList(fileId, select, options = {}) {
11435
11471
  const client = useNoyaClientOrFallback();
11436
- return useTable(
11472
+ const { status, data, refetch, optimisticUpdate } = useTable(
11437
11473
  client.activityEvents$,
11438
11474
  { select, where: { fileId } },
11439
11475
  options
11440
11476
  );
11477
+ return {
11478
+ status,
11479
+ data,
11480
+ refetch,
11481
+ optimisticUpdate
11482
+ };
11441
11483
  }
11442
11484
  // Annotate the CommonJS export names for ESM import in node:
11443
11485
  0 && (module.exports = {