@liveblocks/react 3.20.0-exp5 → 3.20.0-perm1

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.
@@ -292,6 +292,7 @@ import {
292
292
  nanoid as nanoid2,
293
293
  nn,
294
294
  patchNotificationSettings,
295
+ permissionCapabilitiesFromScopes,
295
296
  shallow,
296
297
  shallow2,
297
298
  Signal,
@@ -860,17 +861,21 @@ function createStore_forUrlsMetadata() {
860
861
  }
861
862
  function createStore_forPermissionHints() {
862
863
  const permissionsByRoomId = new DefaultMap(
863
- () => new Signal(/* @__PURE__ */ new Set())
864
+ () => new Signal(void 0)
864
865
  );
865
- function update(newHints) {
866
+ function update(newHints, requestedAt, roomIds) {
866
867
  batch2(() => {
867
- for (const [roomId, permissions] of Object.entries(newHints)) {
868
+ const updatedRoomIds = roomIds === void 0 ? Object.keys(newHints) : /* @__PURE__ */ new Set([...roomIds, ...Object.keys(newHints)]);
869
+ for (const roomId of updatedRoomIds) {
868
870
  const signal = permissionsByRoomId.getOrCreate(roomId);
869
- const existingPermissions = new Set(signal.get());
870
- for (const permission of permissions) {
871
- existingPermissions.add(permission);
871
+ const existingHint = signal.get();
872
+ if (existingHint !== void 0 && existingHint.requestedAt > requestedAt) {
873
+ continue;
872
874
  }
873
- signal.set(existingPermissions);
875
+ signal.set({
876
+ requestedAt,
877
+ permissions: permissionCapabilitiesFromScopes(newHints[roomId] ?? [])
878
+ });
874
879
  }
875
880
  });
876
881
  }
@@ -1133,7 +1138,10 @@ var UmbrellaStore = class {
1133
1138
  result.inboxNotifications,
1134
1139
  result.subscriptions
1135
1140
  );
1136
- this.permissionHints.update(result.permissionHints);
1141
+ this.permissionHints.update(
1142
+ result.permissionHints,
1143
+ result.requestedAt
1144
+ );
1137
1145
  if (this.#userThreadsLastRequestedAt === null) {
1138
1146
  this.#userThreadsLastRequestedAt = result.requestedAt;
1139
1147
  }
@@ -1179,7 +1187,11 @@ var UmbrellaStore = class {
1179
1187
  result.inboxNotifications,
1180
1188
  result.subscriptions
1181
1189
  );
1182
- this.permissionHints.update(result.permissionHints);
1190
+ this.permissionHints.update(
1191
+ result.permissionHints,
1192
+ result.requestedAt,
1193
+ [roomId]
1194
+ );
1183
1195
  const lastRequestedAt = this.#roomThreadsLastRequestedAtByRoom.get(roomId);
1184
1196
  if (lastRequestedAt === void 0 || lastRequestedAt > result.requestedAt) {
1185
1197
  this.#roomThreadsLastRequestedAtByRoom.set(
@@ -1821,7 +1833,9 @@ var UmbrellaStore = class {
1821
1833
  updates.inboxNotifications.deleted,
1822
1834
  updates.subscriptions.deleted
1823
1835
  );
1824
- this.permissionHints.update(updates.permissionHints);
1836
+ this.permissionHints.update(updates.permissionHints, updates.requestedAt, [
1837
+ roomId
1838
+ ]);
1825
1839
  if (lastRequestedAt < updates.requestedAt) {
1826
1840
  this.#roomThreadsLastRequestedAtByRoom.set(roomId, updates.requestedAt);
1827
1841
  }
@@ -1846,7 +1860,7 @@ var UmbrellaStore = class {
1846
1860
  result.inboxNotifications.deleted,
1847
1861
  result.subscriptions.deleted
1848
1862
  );
1849
- this.permissionHints.update(result.permissionHints);
1863
+ this.permissionHints.update(result.permissionHints, result.requestedAt);
1850
1864
  }
1851
1865
  async fetchRoomVersionsDeltaUpdate(roomId, signal) {
1852
1866
  const lastRequestedAt = this.#roomVersionsLastRequestedAtByRoom.get(roomId);
@@ -3560,6 +3574,7 @@ import {
3560
3574
  DefaultMap as DefaultMap3,
3561
3575
  errorIf,
3562
3576
  getSubscriptionKey as getSubscriptionKey3,
3577
+ hasPermissionCapabilityAccess,
3563
3578
  HttpError as HttpError2,
3564
3579
  kInternal as kInternal4,
3565
3580
  makePoller as makePoller2,
@@ -5572,7 +5587,42 @@ function useAttachmentUrlSuspense(attachmentId) {
5572
5587
  function useRoomPermissions(roomId) {
5573
5588
  const client = useClient();
5574
5589
  const store = getRoomExtrasForClient(client).store;
5575
- return useSignal(store.permissionHints.getPermissionForRoom\u03A3(roomId));
5590
+ return useSignal(store.permissionHints.getPermissionForRoom\u03A3(roomId))?.permissions;
5591
+ }
5592
+ function useHasPermissionCapability(roomId, resource, requiredAccess) {
5593
+ const permissions = useRoomPermissions(roomId);
5594
+ const fallback = useSelfPermissionCapabilityFallback(
5595
+ roomId,
5596
+ resource,
5597
+ requiredAccess
5598
+ );
5599
+ return permissions !== void 0 ? hasPermissionCapabilityAccess(permissions, resource, requiredAccess) : fallback;
5600
+ }
5601
+ function useSelfPermissionCapabilityFallback(roomId, resource, requiredAccess) {
5602
+ const room = useRoom_withRoomContext(GlobalRoomContext, {
5603
+ allowOutsideRoom: true
5604
+ });
5605
+ const subscribe = useCallback3(
5606
+ (callback) => {
5607
+ if (room === null || room.id !== roomId) {
5608
+ return () => {
5609
+ };
5610
+ }
5611
+ return room.events.self.subscribe(callback);
5612
+ },
5613
+ [room, roomId]
5614
+ );
5615
+ const getSnapshot = useCallback3(() => {
5616
+ const self = room?.id === roomId ? room.getSelf() : null;
5617
+ if (resource === "comments" && requiredAccess === "write") {
5618
+ return self?.canComment ?? true;
5619
+ }
5620
+ if (resource === "storage" && requiredAccess === "write") {
5621
+ return self?.canWrite ?? true;
5622
+ }
5623
+ return false;
5624
+ }, [resource, requiredAccess, room, roomId]);
5625
+ return useSyncExternalStore3(subscribe, getSnapshot, getSnapshot);
5576
5626
  }
5577
5627
  function createRoomContext(client) {
5578
5628
  const BoundRoomContext = createContext2(null);
@@ -6146,6 +6196,7 @@ export {
6146
6196
  useRoomAttachmentUrl,
6147
6197
  useAttachmentUrlSuspense,
6148
6198
  useRoomPermissions,
6199
+ useHasPermissionCapability,
6149
6200
  createRoomContext,
6150
6201
  _RoomProvider,
6151
6202
  _useBroadcastEvent,
@@ -6186,4 +6237,4 @@ export {
6186
6237
  _useStorageRoot,
6187
6238
  _useUpdateMyPresence
6188
6239
  };
6189
- //# sourceMappingURL=chunk-DJOWOQLG.js.map
6240
+ //# sourceMappingURL=chunk-RSAVNVBA.js.map