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

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,27 @@ 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_observable8 = require("@noya-app/observable");
7492
7509
 
7493
7510
  // ../state-manager/src/multiplayer.ts
7494
- var import_noya_utils5 = require("@noya-app/noya-utils");
7495
- var import_observable9 = require("@noya-app/observable");
7511
+ var import_noya_utils6 = require("@noya-app/noya-utils");
7512
+ var import_observable10 = require("@noya-app/observable");
7496
7513
 
7497
7514
  // ../state-manager/src/stateManager.ts
7498
- var import_observable8 = require("@noya-app/observable");
7515
+ var import_observable9 = require("@noya-app/observable");
7499
7516
 
7500
7517
  // ../state-manager/src/multiplayer.ts
7501
- var createHash = (value, options) => (0, import_noya_utils5.hash)(value, { ...options, ignoreUndefinedProperties: true });
7518
+ var createHash = (value, options) => (0, import_noya_utils6.hash)(value, { ...options, ignoreUndefinedProperties: true });
7502
7519
 
7503
7520
  // ../state-manager/src/NoyaManager.ts
7504
- var import_noya_utils9 = require("@noya-app/noya-utils");
7505
- var import_observable17 = require("@noya-app/observable");
7521
+ var import_noya_utils10 = require("@noya-app/noya-utils");
7522
+ var import_observable18 = require("@noya-app/observable");
7506
7523
 
7507
7524
  // ../noya-pipeline/src/graphToTasks.ts
7508
- var import_observable10 = require("@noya-app/observable");
7525
+ var import_observable11 = require("@noya-app/observable");
7509
7526
 
7510
7527
  // ../noya-pipeline/src/state.ts
7511
- var import_noya_utils6 = require("@noya-app/noya-utils");
7528
+ var import_noya_utils7 = require("@noya-app/noya-utils");
7512
7529
  var rectSchema = Type.Object({
7513
7530
  x: Type.Number(),
7514
7531
  y: Type.Number(),
@@ -7607,25 +7624,25 @@ var pipelineSchema = Type.Object(
7607
7624
  );
7608
7625
 
7609
7626
  // ../state-manager/src/PipelineManager.ts
7610
- var import_observable11 = require("@noya-app/observable");
7611
-
7612
- // ../state-manager/src/PublishingManager.ts
7613
7627
  var import_observable12 = require("@noya-app/observable");
7614
7628
 
7615
- // ../state-manager/src/ResourceManager.ts
7616
- var import_noya_utils7 = require("@noya-app/noya-utils");
7629
+ // ../state-manager/src/PublishingManager.ts
7617
7630
  var import_observable13 = require("@noya-app/observable");
7618
7631
 
7619
- // ../state-manager/src/rpcManager.ts
7632
+ // ../state-manager/src/ResourceManager.ts
7620
7633
  var import_noya_utils8 = require("@noya-app/noya-utils");
7621
7634
  var import_observable14 = require("@noya-app/observable");
7622
7635
 
7623
- // ../state-manager/src/SecretManager.ts
7636
+ // ../state-manager/src/rpcManager.ts
7637
+ var import_noya_utils9 = require("@noya-app/noya-utils");
7624
7638
  var import_observable15 = require("@noya-app/observable");
7625
7639
 
7626
- // ../state-manager/src/TaskManager.ts
7640
+ // ../state-manager/src/SecretManager.ts
7627
7641
  var import_observable16 = require("@noya-app/observable");
7628
7642
 
7643
+ // ../state-manager/src/TaskManager.ts
7644
+ var import_observable17 = require("@noya-app/observable");
7645
+
7629
7646
  // ../state-manager/src/NoyaManager.ts
7630
7647
  var createMutatorParametersSchema = Type.Object({
7631
7648
  sourceCode: Type.String({
@@ -7746,11 +7763,14 @@ var MenuItemTree = (0, import_tree_visit3.defineTree)((node) => {
7746
7763
  return node.type === "submenu" ? node.items : [];
7747
7764
  });
7748
7765
 
7766
+ // ../state-manager/src/sync/parentLocalRpcBridge.ts
7767
+ var import_noya_utils11 = require("@noya-app/noya-utils");
7768
+
7749
7769
  // ../noya-multiplayer-react/src/ai.ts
7750
- var import_react59 = require("react");
7770
+ var import_react60 = require("react");
7751
7771
 
7752
7772
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
7753
- var import_observable18 = require("@noya-app/observable");
7773
+ var import_observable19 = require("@noya-app/observable");
7754
7774
 
7755
7775
  // ../noya-react-utils/src/components/AutoSizer.tsx
7756
7776
  var React2 = __toESM(require("react"));
@@ -7932,7 +7952,7 @@ var FileDropTarget = memoGeneric(function FileDropTarget2({ children, onDropFile
7932
7952
  var import_react8 = require("react");
7933
7953
 
7934
7954
  // ../noya-react-utils/src/hooks/useDeepArray.ts
7935
- var import_noya_utils10 = require("@noya-app/noya-utils");
7955
+ var import_noya_utils12 = require("@noya-app/noya-utils");
7936
7956
  var import_react9 = require("react");
7937
7957
  function useJsonMemo(value) {
7938
7958
  const stringified = (0, import_react9.useMemo)(
@@ -7947,7 +7967,7 @@ function useJsonMemo(value) {
7947
7967
  }
7948
7968
 
7949
7969
  // ../noya-react-utils/src/hooks/useDeepState.ts
7950
- var import_noya_utils11 = require("@noya-app/noya-utils");
7970
+ var import_noya_utils13 = require("@noya-app/noya-utils");
7951
7971
  var import_react10 = require("react");
7952
7972
 
7953
7973
  // ../noya-react-utils/src/hooks/useFetch.ts
@@ -7978,7 +7998,7 @@ var import_react17 = require("react");
7978
7998
  var import_react18 = require("react");
7979
7999
 
7980
8000
  // ../noya-react-utils/src/hooks/useShallowArray.ts
7981
- var import_noya_utils12 = require("@noya-app/noya-utils");
8001
+ var import_noya_utils14 = require("@noya-app/noya-utils");
7982
8002
  var import_react19 = require("react");
7983
8003
 
7984
8004
  // ../noya-react-utils/src/hooks/useStableCallback.ts
@@ -7988,7 +8008,7 @@ var import_react20 = require("react");
7988
8008
  var import_react21 = require("react");
7989
8009
 
7990
8010
  // ../noya-react-utils/src/hooks/useUrlHashParameters.ts
7991
- var import_noya_utils13 = require("@noya-app/noya-utils");
8011
+ var import_noya_utils15 = require("@noya-app/noya-utils");
7992
8012
  var import_react22 = require("react");
7993
8013
 
7994
8014
  // ../noya-react-utils/src/hooks/useWindowSize.ts
@@ -8051,7 +8071,7 @@ function downloadBlob(...params) {
8051
8071
  }
8052
8072
 
8053
8073
  // ../noya-multiplayer-react/src/NoyaStateContext.tsx
8054
- var import_react58 = __toESM(require("react"));
8074
+ var import_react59 = __toESM(require("react"));
8055
8075
 
8056
8076
  // ../noya-multiplayer-react/src/noyaApp.ts
8057
8077
  var import_react57 = require("react");
@@ -8139,7 +8159,7 @@ var import_react55 = __toESM(require("react"));
8139
8159
  var import_client = require("react-dom/client");
8140
8160
 
8141
8161
  // ../noya-multiplayer-react/src/inspector/StateInspector.tsx
8142
- var import_noya_utils14 = require("@noya-app/noya-utils");
8162
+ var import_noya_utils16 = require("@noya-app/noya-utils");
8143
8163
  var import_react54 = __toESM(require("react"));
8144
8164
 
8145
8165
  // ../../node_modules/react-inspector/dist/index.mjs
@@ -10472,19 +10492,17 @@ async function importAll(buffer, noyaManager, {
10472
10492
  }
10473
10493
  if (assets.length) {
10474
10494
  await Promise.all(
10475
- noyaManager.assetManager.assets$.get().map((asset) => noyaManager.assetManager.delete(asset.id))
10495
+ noyaManager.assetManager.assets$.get().map((asset) => noyaManager.assetManager.delete(asset.stableId))
10476
10496
  );
10477
- const idPairs = await Promise.all(
10497
+ await Promise.all(
10478
10498
  assets.map(async (asset) => {
10479
- const newAsset = await noyaManager.assetManager.create({
10499
+ await noyaManager.assetManager.create({
10480
10500
  data: assetMap[asset.id],
10481
- contentType: asset.contentType
10501
+ contentType: asset.contentType,
10502
+ stableId: asset.stableId
10482
10503
  });
10483
- return [asset.id, newAsset.id];
10484
10504
  })
10485
10505
  );
10486
- const replacementMap = Object.fromEntries(idPairs);
10487
- state = replaceDeep(state, replacementMap);
10488
10506
  }
10489
10507
  noyaManager.initialState = state;
10490
10508
  noyaManager.forceInit();
@@ -10517,27 +10535,6 @@ function decodeAll(buffer) {
10517
10535
  }
10518
10536
  return { state, schema, assets, assetMap };
10519
10537
  }
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
10538
 
10542
10539
  // ../noya-multiplayer-react/src/inspector/StateInspectorTitleLabel.tsx
10543
10540
  var import_react51 = __toESM(require("react"));
@@ -11000,7 +10997,14 @@ var StateInspector = memoGeneric(function StateInspector2({
11000
10997
  "Upload"
11001
10998
  ))
11002
10999
  },
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(
11000
+ /* @__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(
11001
+ themedObjectInspector,
11002
+ {
11003
+ name: asset.id,
11004
+ data: truncateAsset(asset),
11005
+ theme: theme3
11006
+ }
11007
+ ), /* @__PURE__ */ import_react54.default.createElement(
11004
11008
  StateInspectorButton,
11005
11009
  {
11006
11010
  theme: theme3,
@@ -11025,10 +11029,8 @@ var StateInspector = memoGeneric(function StateInspector2({
11025
11029
  "Are you sure you want to delete all resources?"
11026
11030
  );
11027
11031
  if (!ok) return;
11028
- await Promise.all(
11029
- resources.map(
11030
- (resource) => resourceManager.deleteResource({ id: resource.id })
11031
- )
11032
+ await resourceManager.deleteResource(
11033
+ resources.map((resource) => ({ id: resource.id }))
11032
11034
  );
11033
11035
  }
11034
11036
  },
@@ -11038,7 +11040,7 @@ var StateInspector = memoGeneric(function StateInspector2({
11038
11040
  {
11039
11041
  theme: theme3,
11040
11042
  onClick: async () => {
11041
- const path2 = prompt("Enter directory path") || (0, import_noya_utils14.uuid)();
11043
+ const path2 = prompt("Enter directory path") || (0, import_noya_utils16.uuid)();
11042
11044
  await resourceManager.createResource({
11043
11045
  type: "directory",
11044
11046
  path: path2
@@ -11054,9 +11056,9 @@ var StateInspector = memoGeneric(function StateInspector2({
11054
11056
  const file = await uploadFile();
11055
11057
  resourceManager.createResource({
11056
11058
  type: "asset",
11057
- path: file.name || (0, import_noya_utils14.uuid)(),
11059
+ path: file.name || (0, import_noya_utils16.uuid)(),
11058
11060
  asset: {
11059
- content: import_noya_utils14.Base64.encode(await file.arrayBuffer()),
11061
+ content: import_noya_utils16.Base64.encode(await file.arrayBuffer()),
11060
11062
  contentType: file.type,
11061
11063
  encoding: "base64"
11062
11064
  }
@@ -11241,6 +11243,12 @@ var StateInspector = memoGeneric(function StateInspector2({
11241
11243
  )
11242
11244
  );
11243
11245
  });
11246
+ var truncateAsset = (0, import_noya_utils16.memoize)((asset) => {
11247
+ if (asset.url.startsWith("data:") || asset.url.startsWith("blob:")) {
11248
+ return { ...asset, url: ellipsis(asset.url, 40) };
11249
+ }
11250
+ return asset;
11251
+ });
11244
11252
 
11245
11253
  // ../noya-multiplayer-react/src/hooks.ts
11246
11254
  function useManagedHistory(stateManager) {
@@ -11251,15 +11259,16 @@ function useManagedHistory(stateManager) {
11251
11259
  );
11252
11260
  }
11253
11261
 
11262
+ // ../noya-multiplayer-react/src/singleton.tsx
11263
+ var import_react58 = __toESM(require("react"));
11264
+
11254
11265
  // ../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);
11266
+ var AnyNoyaStateContext = (0, import_react59.createContext)(void 0);
11258
11267
  var emptyArray = [];
11259
11268
  function useActivityEventsForManager(streamFilter, activityEventsManager) {
11260
- const [streamId, setStreamId] = (0, import_react58.useState)(void 0);
11269
+ const [streamId, setStreamId] = (0, import_react59.useState)(void 0);
11261
11270
  const stableStreamFilter = useJsonMemo(streamFilter);
11262
- (0, import_react58.useEffect)(() => {
11271
+ (0, import_react59.useEffect)(() => {
11263
11272
  if (!stableStreamFilter) return;
11264
11273
  const streamId2 = activityEventsManager.subscribe(stableStreamFilter);
11265
11274
  setStreamId(streamId2);
@@ -11273,8 +11282,8 @@ function useActivityEventsForManager(streamFilter, activityEventsManager) {
11273
11282
  }
11274
11283
 
11275
11284
  // ../noya-multiplayer-react/src/components/UserPointersOverlay.tsx
11276
- var import_observable19 = require("@noya-app/observable");
11277
- var import_react60 = __toESM(require("react"));
11285
+ var import_observable20 = require("@noya-app/observable");
11286
+ var import_react61 = __toESM(require("react"));
11278
11287
  function shouldShow(hideAfter, updatedAt) {
11279
11288
  return !!updatedAt && Date.now() - updatedAt < hideAfter;
11280
11289
  }
@@ -11284,18 +11293,18 @@ var UserPointerInternal = memoGeneric(function UserPointerInternal2({
11284
11293
  hideAfter = 5e3,
11285
11294
  renderUserPointer
11286
11295
  }) {
11287
- const observable = (0, import_react60.useMemo)(() => {
11296
+ const observable = (0, import_react61.useMemo)(() => {
11288
11297
  const metadata$ = ephemeralUserDataManager.metadata$.observePath([user.id]).throttle(50);
11289
11298
  const data$ = ephemeralUserDataManager.data$.observePath([user.id]).throttle(50);
11290
- return import_observable19.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
11299
+ return import_observable20.Observable.combine([metadata$, data$], ([metadata2, data2]) => {
11291
11300
  return { metadata: metadata2, data: data2 };
11292
11301
  });
11293
11302
  }, [ephemeralUserDataManager, user.id]);
11294
11303
  const { metadata, data } = useObservable2(observable);
11295
- const [, setForceUpdate] = (0, import_react60.useState)(0);
11304
+ const [, setForceUpdate] = (0, import_react61.useState)(0);
11296
11305
  const updatedAt = metadata?.updatedAt ?? 0;
11297
11306
  const show = shouldShow(hideAfter, updatedAt);
11298
- (0, import_react60.useEffect)(() => {
11307
+ (0, import_react61.useEffect)(() => {
11299
11308
  if (!show) return;
11300
11309
  const timeoutId = setTimeout(() => {
11301
11310
  setForceUpdate((prev) => prev + 1);
@@ -11317,9 +11326,9 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
11317
11326
  }) {
11318
11327
  const currentUserId = useObservable2(ephemeralUserDataManager.currentUserId$);
11319
11328
  const connectedUsers = useObservable2(connectedUsersManager.connectedUsers$);
11320
- return /* @__PURE__ */ import_react60.default.createElement(import_react60.default.Fragment, null, connectedUsers.map((user) => {
11329
+ return /* @__PURE__ */ import_react61.default.createElement(import_react61.default.Fragment, null, connectedUsers.map((user) => {
11321
11330
  if (user.id === currentUserId) return null;
11322
- return /* @__PURE__ */ import_react60.default.createElement(
11331
+ return /* @__PURE__ */ import_react61.default.createElement(
11323
11332
  UserPointerInternal,
11324
11333
  {
11325
11334
  key: user.id,
@@ -11333,15 +11342,15 @@ var UserPointersOverlay = memoGeneric(function UserPointers({
11333
11342
 
11334
11343
  // src/react/tableHooks.ts
11335
11344
  var import_observable_store = require("@noya-app/observable-store");
11336
- var import_react61 = require("react");
11345
+ var import_react62 = require("react");
11337
11346
  function useTable(table, {
11338
11347
  where,
11339
11348
  select
11340
11349
  }, options = {}) {
11341
- const stableSelect = (0, import_react61.useMemo)(() => {
11350
+ const stableSelect = (0, import_react62.useMemo)(() => {
11342
11351
  return JSON.stringify(select);
11343
11352
  }, [select]);
11344
- const stableWhere = (0, import_react61.useMemo)(() => {
11353
+ const stableWhere = (0, import_react62.useMemo)(() => {
11345
11354
  let cloneWithNoUndefined = {};
11346
11355
  for (const [key, value] of Object.entries(where ?? {})) {
11347
11356
  if (value !== void 0) {
@@ -11350,7 +11359,7 @@ function useTable(table, {
11350
11359
  }
11351
11360
  return JSON.stringify(cloneWithNoUndefined);
11352
11361
  }, [where]);
11353
- const observable = (0, import_react61.useMemo)(() => {
11362
+ const observable = (0, import_react62.useMemo)(() => {
11354
11363
  const parsedSelect = JSON.parse(stableSelect);
11355
11364
  const parsedWhere = JSON.parse(stableWhere);
11356
11365
  if (!table) {
@@ -11377,67 +11386,99 @@ function useTable(table, {
11377
11386
  }
11378
11387
  );
11379
11388
  }, [stableSelect, stableWhere, table, options.policy, options.debug]);
11380
- (0, import_react61.useEffect)(() => {
11389
+ (0, import_react62.useEffect)(() => {
11381
11390
  observable.start?.();
11382
11391
  }, [observable]);
11383
11392
  const { status, data } = useObservable2(observable);
11384
- return (0, import_react61.useMemo)(() => {
11393
+ const optimisticUpdate = (0, import_react62.useCallback)(
11394
+ (entity, config) => {
11395
+ if (!table) return;
11396
+ table.optimisticUpdate(entity, config);
11397
+ },
11398
+ [table]
11399
+ );
11400
+ return (0, import_react62.useMemo)(() => {
11385
11401
  return {
11386
11402
  status,
11387
11403
  data,
11388
- refetch: observable.refetch
11404
+ refetch: observable.refetch,
11405
+ optimisticUpdate
11389
11406
  };
11390
- }, [status, data, observable]);
11407
+ }, [status, data, observable, optimisticUpdate]);
11391
11408
  }
11392
11409
  function useFileList(select, options = {}) {
11393
11410
  const client = useNoyaClientOrFallback();
11394
- return useTable(client.fileList$, { select }, options);
11411
+ const { status, data, refetch, optimisticUpdate } = useTable(
11412
+ client.fileList$,
11413
+ { select },
11414
+ options
11415
+ );
11416
+ return {
11417
+ status,
11418
+ data,
11419
+ refetch,
11420
+ optimisticUpdate
11421
+ };
11395
11422
  }
11396
11423
  function useFileListItem(id, select, options = {}) {
11397
11424
  const client = useNoyaClientOrFallback();
11398
- const { status, data, refetch } = useTable(
11425
+ const { status, data, refetch, optimisticUpdate } = useTable(
11399
11426
  client.fileList$,
11400
11427
  { where: { id: id ?? null }, select },
11401
11428
  options
11402
11429
  );
11403
- return (0, import_react61.useMemo)(() => {
11430
+ return (0, import_react62.useMemo)(() => {
11404
11431
  return {
11405
11432
  data: data.at(0),
11406
11433
  status,
11407
- refetch
11434
+ refetch,
11435
+ optimisticUpdate
11408
11436
  };
11409
- }, [data, status, refetch]);
11437
+ }, [data, status, refetch, optimisticUpdate]);
11410
11438
  }
11411
11439
  function useResourcesList(fileId, select, options = {}) {
11412
11440
  const client = useNoyaClientOrFallback();
11413
- return useTable(
11441
+ const { status, data, refetch, optimisticUpdate } = useTable(
11414
11442
  client.resources$,
11415
11443
  { select, where: { accessibleByFileId: fileId } },
11416
11444
  options
11417
11445
  );
11446
+ return {
11447
+ status,
11448
+ data,
11449
+ refetch,
11450
+ optimisticUpdate
11451
+ };
11418
11452
  }
11419
11453
  function useUser(id, select, options = {}) {
11420
11454
  const client = useNoyaClientOrFallback();
11421
- const { status, data, refetch } = useTable(
11455
+ const { status, data, refetch, optimisticUpdate } = useTable(
11422
11456
  client.users$,
11423
11457
  { select, where: { id: id ?? null } },
11424
11458
  options
11425
11459
  );
11426
- return (0, import_react61.useMemo)(() => {
11460
+ return (0, import_react62.useMemo)(() => {
11427
11461
  return {
11428
11462
  status,
11429
11463
  data: data.at(0),
11430
- refetch
11464
+ refetch,
11465
+ optimisticUpdate
11431
11466
  };
11432
- }, [status, data, refetch]);
11467
+ }, [status, data, refetch, optimisticUpdate]);
11433
11468
  }
11434
11469
  function useActivityEventsList(fileId, select, options = {}) {
11435
11470
  const client = useNoyaClientOrFallback();
11436
- return useTable(
11471
+ const { status, data, refetch, optimisticUpdate } = useTable(
11437
11472
  client.activityEvents$,
11438
11473
  { select, where: { fileId } },
11439
11474
  options
11440
11475
  );
11476
+ return {
11477
+ status,
11478
+ data,
11479
+ refetch,
11480
+ optimisticUpdate
11481
+ };
11441
11482
  }
11442
11483
  // Annotate the CommonJS export names for ESM import in node:
11443
11484
  0 && (module.exports = {