@comapeo/core-react 6.1.1 → 6.2.1

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.
@@ -395,37 +395,54 @@ export declare function useUpdateProjectSettings({ projectId }: {
395
395
  projectId: string;
396
396
  }): {
397
397
  error: Error;
398
- mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, {
399
- name?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["name"];
400
- configMetadata?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["configMetadata"];
401
- defaultPresets?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["defaultPresets"];
402
- projectColor?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectColor"];
403
- projectDescription?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectDescription"];
404
- }, unknown>;
405
- mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, {
406
- name?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["name"];
407
- configMetadata?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["configMetadata"];
408
- defaultPresets?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["defaultPresets"];
409
- projectColor?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectColor"];
410
- projectDescription?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectDescription"];
398
+ mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, unknown>;
399
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, unknown>;
400
+ reset: () => void;
401
+ status: "error";
402
+ } | {
403
+ error: null;
404
+ mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, unknown>;
405
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, unknown>;
406
+ reset: () => void;
407
+ status: "pending" | "success" | "idle";
408
+ };
409
+ /**
410
+ * Change a project member's role.
411
+ *
412
+ * @param opts.projectId Project public ID
413
+ *
414
+ * @example
415
+ * ```tsx
416
+ * function BasicExample() {
417
+ * const { mutate } = useChangeMemberRole({ projectId: '...' })
418
+ * // Use one of: COORDINATOR_ROLE_ID, MEMBER_ROLE_ID, BLOCKED_ROLE_ID
419
+ * mutate({ deviceId: '...', roleId: COORDINATOR_ROLE_ID })
420
+ * }
421
+ * ```
422
+ */
423
+ export declare function useChangeMemberRole({ projectId }: {
424
+ projectId: string;
425
+ }): {
426
+ error: Error;
427
+ mutate: import("@tanstack/react-query").UseMutateFunction<void, Error, {
428
+ deviceId: string;
429
+ roleId: import("@comapeo/core", { with: { "resolution-mode": "import" } }).MemberApi.RoleIdAssignableToOthers;
430
+ }, unknown>;
431
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<void, Error, {
432
+ deviceId: string;
433
+ roleId: import("@comapeo/core", { with: { "resolution-mode": "import" } }).MemberApi.RoleIdAssignableToOthers;
411
434
  }, unknown>;
412
435
  reset: () => void;
413
436
  status: "error";
414
437
  } | {
415
438
  error: null;
416
- mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, {
417
- name?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["name"];
418
- configMetadata?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["configMetadata"];
419
- defaultPresets?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["defaultPresets"];
420
- projectColor?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectColor"];
421
- projectDescription?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectDescription"];
422
- }, unknown>;
423
- mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings, Error, {
424
- name?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["name"];
425
- configMetadata?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["configMetadata"];
426
- defaultPresets?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["defaultPresets"];
427
- projectColor?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectColor"];
428
- projectDescription?: import("@comapeo/schema", { with: { "resolution-mode": "import" } }).ProjectSettings["projectDescription"];
439
+ mutate: import("@tanstack/react-query").UseMutateFunction<void, Error, {
440
+ deviceId: string;
441
+ roleId: import("@comapeo/core", { with: { "resolution-mode": "import" } }).MemberApi.RoleIdAssignableToOthers;
442
+ }, unknown>;
443
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<void, Error, {
444
+ deviceId: string;
445
+ roleId: import("@comapeo/core", { with: { "resolution-mode": "import" } }).MemberApi.RoleIdAssignableToOthers;
429
446
  }, unknown>;
430
447
  reset: () => void;
431
448
  status: "pending" | "success" | "idle";
@@ -15,6 +15,7 @@ exports.useCreateProject = useCreateProject;
15
15
  exports.useLeaveProject = useLeaveProject;
16
16
  exports.useImportProjectConfig = useImportProjectConfig;
17
17
  exports.useUpdateProjectSettings = useUpdateProjectSettings;
18
+ exports.useChangeMemberRole = useChangeMemberRole;
18
19
  exports.useCreateBlob = useCreateBlob;
19
20
  exports.useSyncState = useSyncState;
20
21
  exports.useDataSyncProgress = useDataSyncProgress;
@@ -368,6 +369,28 @@ function useUpdateProjectSettings({ projectId }) {
368
369
  ? { error, mutate, mutateAsync, reset, status }
369
370
  : { error: null, mutate, mutateAsync, reset, status };
370
371
  }
372
+ /**
373
+ * Change a project member's role.
374
+ *
375
+ * @param opts.projectId Project public ID
376
+ *
377
+ * @example
378
+ * ```tsx
379
+ * function BasicExample() {
380
+ * const { mutate } = useChangeMemberRole({ projectId: '...' })
381
+ * // Use one of: COORDINATOR_ROLE_ID, MEMBER_ROLE_ID, BLOCKED_ROLE_ID
382
+ * mutate({ deviceId: '...', roleId: COORDINATOR_ROLE_ID })
383
+ * }
384
+ * ```
385
+ */
386
+ function useChangeMemberRole({ projectId }) {
387
+ const queryClient = (0, react_query_1.useQueryClient)();
388
+ const { data: projectApi } = useSingleProject({ projectId });
389
+ const { error, mutate, mutateAsync, reset, status } = (0, react_query_1.useMutation)((0, projects_js_1.changeMemberRoleMutationOptions)({ projectApi, projectId, queryClient }));
390
+ return status === 'error'
391
+ ? { error, mutate, mutateAsync, reset, status }
392
+ : { error: null, mutate, mutateAsync, reset, status };
393
+ }
371
394
  /**
372
395
  * Create a blob for a project.
373
396
  *
@@ -3,6 +3,6 @@ export { useClientApi, useIsArchiveDevice, useOwnDeviceInfo, useSetIsArchiveDevi
3
3
  export { useCreateDocument, useDeleteDocument, useManyDocs, useSingleDocByDocId, useSingleDocByVersionId, useUpdateDocument, } from './hooks/documents.js';
4
4
  export { useAcceptInvite, useManyInvites, useRejectInvite, useRequestCancelInvite, useSendInvite, useSetUpInvitesListeners, useSingleInvite, } from './hooks/invites.js';
5
5
  export { useMapStyleUrl } from './hooks/maps.js';
6
- export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
6
+ export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useChangeMemberRole, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
7
7
  export { type SyncState } from './lib/sync.js';
8
8
  export { type WriteableDocument, type WriteableDocumentType, type WriteableValue, } from './lib/types.js';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useExportZipFile = exports.useExportGeoJSON = exports.useUpdateProjectSettings = exports.useSyncState = exports.useStopSync = exports.useStartSync = exports.useSingleProject = exports.useSingleMember = exports.useSetAutostopDataSyncTimeout = exports.useRemoveServerPeer = exports.useProjectSettings = exports.useOwnRoleInProject = exports.useManyProjects = exports.useManyMembers = exports.useLeaveProject = exports.useImportProjectConfig = exports.useIconUrl = exports.useDocumentCreatedBy = exports.useDisconnectSyncServers = exports.useDataSyncProgress = exports.useCreateProject = exports.useCreateBlob = exports.useConnectSyncServers = exports.useAttachmentUrl = exports.useAddServerPeer = exports.useMapStyleUrl = exports.useSingleInvite = exports.useSetUpInvitesListeners = exports.useSendInvite = exports.useRequestCancelInvite = exports.useRejectInvite = exports.useManyInvites = exports.useAcceptInvite = exports.useUpdateDocument = exports.useSingleDocByVersionId = exports.useSingleDocByDocId = exports.useManyDocs = exports.useDeleteDocument = exports.useCreateDocument = exports.useSetOwnDeviceInfo = exports.useSetIsArchiveDevice = exports.useOwnDeviceInfo = exports.useIsArchiveDevice = exports.useClientApi = exports.ClientApiProvider = exports.ClientApiContext = void 0;
3
+ exports.useExportZipFile = exports.useExportGeoJSON = exports.useChangeMemberRole = exports.useUpdateProjectSettings = exports.useSyncState = exports.useStopSync = exports.useStartSync = exports.useSingleProject = exports.useSingleMember = exports.useSetAutostopDataSyncTimeout = exports.useRemoveServerPeer = exports.useProjectSettings = exports.useOwnRoleInProject = exports.useManyProjects = exports.useManyMembers = exports.useLeaveProject = exports.useImportProjectConfig = exports.useIconUrl = exports.useDocumentCreatedBy = exports.useDisconnectSyncServers = exports.useDataSyncProgress = exports.useCreateProject = exports.useCreateBlob = exports.useConnectSyncServers = exports.useAttachmentUrl = exports.useAddServerPeer = exports.useMapStyleUrl = exports.useSingleInvite = exports.useSetUpInvitesListeners = exports.useSendInvite = exports.useRequestCancelInvite = exports.useRejectInvite = exports.useManyInvites = exports.useAcceptInvite = exports.useUpdateDocument = exports.useSingleDocByVersionId = exports.useSingleDocByDocId = exports.useManyDocs = exports.useDeleteDocument = exports.useCreateDocument = exports.useSetOwnDeviceInfo = exports.useSetIsArchiveDevice = exports.useOwnDeviceInfo = exports.useIsArchiveDevice = exports.useClientApi = exports.ClientApiProvider = exports.ClientApiContext = void 0;
4
4
  var ClientApi_js_1 = require("./contexts/ClientApi.js");
5
5
  Object.defineProperty(exports, "ClientApiContext", { enumerable: true, get: function () { return ClientApi_js_1.ClientApiContext; } });
6
6
  Object.defineProperty(exports, "ClientApiProvider", { enumerable: true, get: function () { return ClientApi_js_1.ClientApiProvider; } });
@@ -51,5 +51,6 @@ Object.defineProperty(exports, "useStartSync", { enumerable: true, get: function
51
51
  Object.defineProperty(exports, "useStopSync", { enumerable: true, get: function () { return projects_js_1.useStopSync; } });
52
52
  Object.defineProperty(exports, "useSyncState", { enumerable: true, get: function () { return projects_js_1.useSyncState; } });
53
53
  Object.defineProperty(exports, "useUpdateProjectSettings", { enumerable: true, get: function () { return projects_js_1.useUpdateProjectSettings; } });
54
+ Object.defineProperty(exports, "useChangeMemberRole", { enumerable: true, get: function () { return projects_js_1.useChangeMemberRole; } });
54
55
  Object.defineProperty(exports, "useExportGeoJSON", { enumerable: true, get: function () { return projects_js_1.useExportGeoJSON; } });
55
56
  Object.defineProperty(exports, "useExportZipFile", { enumerable: true, get: function () { return projects_js_1.useExportZipFile; } });
@@ -1,6 +1,5 @@
1
- import type { BlobApi } from '@comapeo/core' with { 'resolution-mode': 'import' };
1
+ import type { BlobApi, MemberApi } from '@comapeo/core' with { 'resolution-mode': 'import' };
2
2
  import type { MapeoClientApi, MapeoProjectApi } from '@comapeo/ipc' with { 'resolution-mode': 'import' };
3
- import type { ProjectSettings } from '@comapeo/schema' with { 'resolution-mode': 'import' };
4
3
  import { type QueryClient, type UnusedSkipTokenOptions } from '@tanstack/react-query';
5
4
  export declare function getProjectsQueryKey(): readonly ["@comapeo/core-react", "projects"];
6
5
  export declare function getProjectByIdQueryKey({ projectId }: {
@@ -175,13 +174,20 @@ export declare function updateProjectSettingsMutationOptions({ projectApi, query
175
174
  projectApi: MapeoProjectApi;
176
175
  queryClient: QueryClient;
177
176
  }): {
178
- mutationFn: (value: {
179
- name?: ProjectSettings["name"];
180
- configMetadata?: ProjectSettings["configMetadata"];
181
- defaultPresets?: ProjectSettings["defaultPresets"];
182
- projectColor?: ProjectSettings["projectColor"];
183
- projectDescription?: ProjectSettings["projectDescription"];
184
- }) => Promise<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings>;
177
+ mutationFn: (value: import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings) => Promise<import("@comapeo/core/dist/mapeo-project.js", { with: { "resolution-mode": "import" } }).EditableProjectSettings>;
178
+ onSuccess: () => void;
179
+ networkMode: "always";
180
+ retry: false;
181
+ };
182
+ export declare function changeMemberRoleMutationOptions({ projectApi, projectId, queryClient, }: {
183
+ projectApi: MapeoProjectApi;
184
+ projectId: string;
185
+ queryClient: QueryClient;
186
+ }): {
187
+ mutationFn: ({ deviceId, roleId }: {
188
+ deviceId: string;
189
+ roleId: MemberApi.RoleIdAssignableToOthers;
190
+ }) => Promise<void>;
185
191
  onSuccess: () => void;
186
192
  networkMode: "always";
187
193
  retry: false;
@@ -22,6 +22,7 @@ exports.createProjectMutationOptions = createProjectMutationOptions;
22
22
  exports.leaveProjectMutationOptions = leaveProjectMutationOptions;
23
23
  exports.importProjectConfigMutationOptions = importProjectConfigMutationOptions;
24
24
  exports.updateProjectSettingsMutationOptions = updateProjectSettingsMutationOptions;
25
+ exports.changeMemberRoleMutationOptions = changeMemberRoleMutationOptions;
25
26
  exports.createBlobMutationOptions = createBlobMutationOptions;
26
27
  exports.startSyncMutationOptions = startSyncMutationOptions;
27
28
  exports.stopSyncMutationOptions = stopSyncMutationOptions;
@@ -247,6 +248,22 @@ function updateProjectSettingsMutationOptions({ projectApi, queryClient, }) {
247
248
  },
248
249
  };
249
250
  }
251
+ function changeMemberRoleMutationOptions({ projectApi, projectId, queryClient, }) {
252
+ return {
253
+ ...(0, shared_js_1.baseMutationOptions)(),
254
+ mutationFn: async ({ deviceId, roleId }) => {
255
+ return projectApi.$member.assignRole(deviceId, roleId);
256
+ },
257
+ onSuccess: () => {
258
+ queryClient.invalidateQueries({
259
+ queryKey: getMembersQueryKey({ projectId }),
260
+ });
261
+ queryClient.invalidateQueries({
262
+ queryKey: getProjectRoleQueryKey({ projectId }),
263
+ });
264
+ },
265
+ };
266
+ }
250
267
  function createBlobMutationOptions({ projectApi, }) {
251
268
  return {
252
269
  ...(0, shared_js_1.baseMutationOptions)(),
@@ -395,37 +395,54 @@ export declare function useUpdateProjectSettings({ projectId }: {
395
395
  projectId: string;
396
396
  }): {
397
397
  error: Error;
398
- mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, {
399
- name?: import("@comapeo/schema").ProjectSettings["name"];
400
- configMetadata?: import("@comapeo/schema").ProjectSettings["configMetadata"];
401
- defaultPresets?: import("@comapeo/schema").ProjectSettings["defaultPresets"];
402
- projectColor?: import("@comapeo/schema").ProjectSettings["projectColor"];
403
- projectDescription?: import("@comapeo/schema").ProjectSettings["projectDescription"];
404
- }, unknown>;
405
- mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, {
406
- name?: import("@comapeo/schema").ProjectSettings["name"];
407
- configMetadata?: import("@comapeo/schema").ProjectSettings["configMetadata"];
408
- defaultPresets?: import("@comapeo/schema").ProjectSettings["defaultPresets"];
409
- projectColor?: import("@comapeo/schema").ProjectSettings["projectColor"];
410
- projectDescription?: import("@comapeo/schema").ProjectSettings["projectDescription"];
398
+ mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, unknown>;
399
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, unknown>;
400
+ reset: () => void;
401
+ status: "error";
402
+ } | {
403
+ error: null;
404
+ mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, unknown>;
405
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, unknown>;
406
+ reset: () => void;
407
+ status: "pending" | "success" | "idle";
408
+ };
409
+ /**
410
+ * Change a project member's role.
411
+ *
412
+ * @param opts.projectId Project public ID
413
+ *
414
+ * @example
415
+ * ```tsx
416
+ * function BasicExample() {
417
+ * const { mutate } = useChangeMemberRole({ projectId: '...' })
418
+ * // Use one of: COORDINATOR_ROLE_ID, MEMBER_ROLE_ID, BLOCKED_ROLE_ID
419
+ * mutate({ deviceId: '...', roleId: COORDINATOR_ROLE_ID })
420
+ * }
421
+ * ```
422
+ */
423
+ export declare function useChangeMemberRole({ projectId }: {
424
+ projectId: string;
425
+ }): {
426
+ error: Error;
427
+ mutate: import("@tanstack/react-query").UseMutateFunction<void, Error, {
428
+ deviceId: string;
429
+ roleId: import("@comapeo/core").MemberApi.RoleIdAssignableToOthers;
430
+ }, unknown>;
431
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<void, Error, {
432
+ deviceId: string;
433
+ roleId: import("@comapeo/core").MemberApi.RoleIdAssignableToOthers;
411
434
  }, unknown>;
412
435
  reset: () => void;
413
436
  status: "error";
414
437
  } | {
415
438
  error: null;
416
- mutate: import("@tanstack/react-query").UseMutateFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, {
417
- name?: import("@comapeo/schema").ProjectSettings["name"];
418
- configMetadata?: import("@comapeo/schema").ProjectSettings["configMetadata"];
419
- defaultPresets?: import("@comapeo/schema").ProjectSettings["defaultPresets"];
420
- projectColor?: import("@comapeo/schema").ProjectSettings["projectColor"];
421
- projectDescription?: import("@comapeo/schema").ProjectSettings["projectDescription"];
422
- }, unknown>;
423
- mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings, Error, {
424
- name?: import("@comapeo/schema").ProjectSettings["name"];
425
- configMetadata?: import("@comapeo/schema").ProjectSettings["configMetadata"];
426
- defaultPresets?: import("@comapeo/schema").ProjectSettings["defaultPresets"];
427
- projectColor?: import("@comapeo/schema").ProjectSettings["projectColor"];
428
- projectDescription?: import("@comapeo/schema").ProjectSettings["projectDescription"];
439
+ mutate: import("@tanstack/react-query").UseMutateFunction<void, Error, {
440
+ deviceId: string;
441
+ roleId: import("@comapeo/core").MemberApi.RoleIdAssignableToOthers;
442
+ }, unknown>;
443
+ mutateAsync: import("@tanstack/react-query").UseMutateAsyncFunction<void, Error, {
444
+ deviceId: string;
445
+ roleId: import("@comapeo/core").MemberApi.RoleIdAssignableToOthers;
429
446
  }, unknown>;
430
447
  reset: () => void;
431
448
  status: "pending" | "success" | "idle";
@@ -1,6 +1,6 @@
1
1
  import { useMutation, useQueryClient, useSuspenseQuery, } from '@tanstack/react-query';
2
2
  import { useSyncExternalStore } from 'react';
3
- import { addServerPeerMutationOptions, connectSyncServersMutationOptions, createBlobMutationOptions, createProjectMutationOptions, disconnectSyncServersMutationOptions, documentCreatedByQueryOptions, exportGeoJSONMutationOptions, exportZipFileMutationOptions, importProjectConfigMutationOptions, leaveProjectMutationOptions, mediaServerOriginQueryOptions, projectByIdQueryOptions, projectMemberByIdQueryOptions, projectMembersQueryOptions, projectOwnRoleQueryOptions, projectSettingsQueryOptions, projectsQueryOptions, removeServerPeerMutationOptions, setAutostopDataSyncTimeoutMutationOptions, startSyncMutationOptions, stopSyncMutationOptions, updateProjectSettingsMutationOptions, } from '../lib/react-query/projects.js';
3
+ import { addServerPeerMutationOptions, changeMemberRoleMutationOptions, connectSyncServersMutationOptions, createBlobMutationOptions, createProjectMutationOptions, disconnectSyncServersMutationOptions, documentCreatedByQueryOptions, exportGeoJSONMutationOptions, exportZipFileMutationOptions, importProjectConfigMutationOptions, leaveProjectMutationOptions, mediaServerOriginQueryOptions, projectByIdQueryOptions, projectMemberByIdQueryOptions, projectMembersQueryOptions, projectOwnRoleQueryOptions, projectSettingsQueryOptions, projectsQueryOptions, removeServerPeerMutationOptions, setAutostopDataSyncTimeoutMutationOptions, startSyncMutationOptions, stopSyncMutationOptions, updateProjectSettingsMutationOptions, } from '../lib/react-query/projects.js';
4
4
  import { SyncStore } from '../lib/sync.js';
5
5
  import { getBlobUrl, getIconUrl } from '../lib/urls.js';
6
6
  import { useClientApi } from './client.js';
@@ -341,6 +341,28 @@ export function useUpdateProjectSettings({ projectId }) {
341
341
  ? { error, mutate, mutateAsync, reset, status }
342
342
  : { error: null, mutate, mutateAsync, reset, status };
343
343
  }
344
+ /**
345
+ * Change a project member's role.
346
+ *
347
+ * @param opts.projectId Project public ID
348
+ *
349
+ * @example
350
+ * ```tsx
351
+ * function BasicExample() {
352
+ * const { mutate } = useChangeMemberRole({ projectId: '...' })
353
+ * // Use one of: COORDINATOR_ROLE_ID, MEMBER_ROLE_ID, BLOCKED_ROLE_ID
354
+ * mutate({ deviceId: '...', roleId: COORDINATOR_ROLE_ID })
355
+ * }
356
+ * ```
357
+ */
358
+ export function useChangeMemberRole({ projectId }) {
359
+ const queryClient = useQueryClient();
360
+ const { data: projectApi } = useSingleProject({ projectId });
361
+ const { error, mutate, mutateAsync, reset, status } = useMutation(changeMemberRoleMutationOptions({ projectApi, projectId, queryClient }));
362
+ return status === 'error'
363
+ ? { error, mutate, mutateAsync, reset, status }
364
+ : { error: null, mutate, mutateAsync, reset, status };
365
+ }
344
366
  /**
345
367
  * Create a blob for a project.
346
368
  *
@@ -3,6 +3,6 @@ export { useClientApi, useIsArchiveDevice, useOwnDeviceInfo, useSetIsArchiveDevi
3
3
  export { useCreateDocument, useDeleteDocument, useManyDocs, useSingleDocByDocId, useSingleDocByVersionId, useUpdateDocument, } from './hooks/documents.js';
4
4
  export { useAcceptInvite, useManyInvites, useRejectInvite, useRequestCancelInvite, useSendInvite, useSetUpInvitesListeners, useSingleInvite, } from './hooks/invites.js';
5
5
  export { useMapStyleUrl } from './hooks/maps.js';
6
- export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
6
+ export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useChangeMemberRole, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
7
7
  export { type SyncState } from './lib/sync.js';
8
8
  export { type WriteableDocument, type WriteableDocumentType, type WriteableValue, } from './lib/types.js';
package/dist/esm/index.js CHANGED
@@ -3,4 +3,4 @@ export { useClientApi, useIsArchiveDevice, useOwnDeviceInfo, useSetIsArchiveDevi
3
3
  export { useCreateDocument, useDeleteDocument, useManyDocs, useSingleDocByDocId, useSingleDocByVersionId, useUpdateDocument, } from './hooks/documents.js';
4
4
  export { useAcceptInvite, useManyInvites, useRejectInvite, useRequestCancelInvite, useSendInvite, useSetUpInvitesListeners, useSingleInvite, } from './hooks/invites.js';
5
5
  export { useMapStyleUrl } from './hooks/maps.js';
6
- export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
6
+ export { useAddServerPeer, useAttachmentUrl, useConnectSyncServers, useCreateBlob, useCreateProject, useDataSyncProgress, useDisconnectSyncServers, useDocumentCreatedBy, useIconUrl, useImportProjectConfig, useLeaveProject, useManyMembers, useManyProjects, useOwnRoleInProject, useProjectSettings, useRemoveServerPeer, useSetAutostopDataSyncTimeout, useSingleMember, useSingleProject, useStartSync, useStopSync, useSyncState, useUpdateProjectSettings, useChangeMemberRole, useExportGeoJSON, useExportZipFile, } from './hooks/projects.js';
@@ -1,6 +1,5 @@
1
- import type { BlobApi } from '@comapeo/core' with { 'resolution-mode': 'import' };
1
+ import type { BlobApi, MemberApi } from '@comapeo/core' with { 'resolution-mode': 'import' };
2
2
  import type { MapeoClientApi, MapeoProjectApi } from '@comapeo/ipc' with { 'resolution-mode': 'import' };
3
- import type { ProjectSettings } from '@comapeo/schema' with { 'resolution-mode': 'import' };
4
3
  import { type QueryClient, type UnusedSkipTokenOptions } from '@tanstack/react-query';
5
4
  export declare function getProjectsQueryKey(): readonly ["@comapeo/core-react", "projects"];
6
5
  export declare function getProjectByIdQueryKey({ projectId }: {
@@ -175,13 +174,20 @@ export declare function updateProjectSettingsMutationOptions({ projectApi, query
175
174
  projectApi: MapeoProjectApi;
176
175
  queryClient: QueryClient;
177
176
  }): {
178
- mutationFn: (value: {
179
- name?: ProjectSettings["name"];
180
- configMetadata?: ProjectSettings["configMetadata"];
181
- defaultPresets?: ProjectSettings["defaultPresets"];
182
- projectColor?: ProjectSettings["projectColor"];
183
- projectDescription?: ProjectSettings["projectDescription"];
184
- }) => Promise<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings>;
177
+ mutationFn: (value: import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings) => Promise<import("@comapeo/core/dist/mapeo-project.js").EditableProjectSettings>;
178
+ onSuccess: () => void;
179
+ networkMode: "always";
180
+ retry: false;
181
+ };
182
+ export declare function changeMemberRoleMutationOptions({ projectApi, projectId, queryClient, }: {
183
+ projectApi: MapeoProjectApi;
184
+ projectId: string;
185
+ queryClient: QueryClient;
186
+ }): {
187
+ mutationFn: ({ deviceId, roleId }: {
188
+ deviceId: string;
189
+ roleId: MemberApi.RoleIdAssignableToOthers;
190
+ }) => Promise<void>;
185
191
  onSuccess: () => void;
186
192
  networkMode: "always";
187
193
  retry: false;
@@ -215,6 +215,22 @@ export function updateProjectSettingsMutationOptions({ projectApi, queryClient,
215
215
  },
216
216
  };
217
217
  }
218
+ export function changeMemberRoleMutationOptions({ projectApi, projectId, queryClient, }) {
219
+ return {
220
+ ...baseMutationOptions(),
221
+ mutationFn: async ({ deviceId, roleId }) => {
222
+ return projectApi.$member.assignRole(deviceId, roleId);
223
+ },
224
+ onSuccess: () => {
225
+ queryClient.invalidateQueries({
226
+ queryKey: getMembersQueryKey({ projectId }),
227
+ });
228
+ queryClient.invalidateQueries({
229
+ queryKey: getProjectRoleQueryKey({ projectId }),
230
+ });
231
+ },
232
+ };
233
+ }
218
234
  export function createBlobMutationOptions({ projectApi, }) {
219
235
  return {
220
236
  ...baseMutationOptions(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comapeo/core-react",
3
- "version": "6.1.1",
3
+ "version": "6.2.1",
4
4
  "description": "React wrapper for working with @comapeo/core",
5
5
  "repository": {
6
6
  "type": "git",
@@ -57,44 +57,45 @@
57
57
  "types": "tsc"
58
58
  },
59
59
  "peerDependencies": {
60
- "@comapeo/core": "^4.1.3",
60
+ "@comapeo/core": "^4.3.0",
61
61
  "@comapeo/ipc": "^5.0.0",
62
62
  "@comapeo/schema": "*",
63
63
  "@tanstack/react-query": "^5",
64
64
  "react": "^18 || ^19"
65
65
  },
66
66
  "devDependencies": {
67
- "@comapeo/core": "4.1.3",
67
+ "@comapeo/core": "4.3.0",
68
68
  "@comapeo/ipc": "5.0.0",
69
- "@comapeo/schema": "2.0.0",
70
- "@eslint/compat": "1.3.0",
71
- "@eslint/js": "9.29.0",
72
- "@ianvs/prettier-plugin-sort-imports": "4.4.2",
69
+ "@comapeo/schema": "2.1.1",
70
+ "@eslint/compat": "1.3.2",
71
+ "@eslint/js": "9.35.0",
72
+ "@ianvs/prettier-plugin-sort-imports": "4.7.0",
73
73
  "@mapeo/crypto": "1.0.0-alpha.10",
74
- "@tanstack/eslint-plugin-query": "5.78.0",
75
- "@tanstack/react-query": "5.80.7",
76
- "@testing-library/dom": "10.4.0",
74
+ "@tanstack/eslint-plugin-query": "5.89.0",
75
+ "@tanstack/react-query": "5.89.0",
76
+ "@testing-library/dom": "10.4.1",
77
77
  "@testing-library/react": "16.3.0",
78
- "@types/node": "22.15.19",
79
- "@types/react": "19.1.8",
80
- "@types/react-dom": "19.1.6",
81
- "@vitest/eslint-plugin": "1.2.7",
82
- "eslint": "9.29.0",
78
+ "@types/node": "22.18.6",
79
+ "@types/react": "19.1.13",
80
+ "@types/react-dom": "19.1.9",
81
+ "@vitest/eslint-plugin": "1.3.12",
82
+ "eslint": "9.35.0",
83
83
  "eslint-plugin-react-hooks": "5.2.0",
84
- "eslint-plugin-testing-library": "7.5.3",
84
+ "eslint-plugin-testing-library": "7.8.0",
85
85
  "fastify": "4.29.1",
86
- "globals": "16.2.0",
86
+ "globals": "16.4.0",
87
+ "happy-dom": "18.0.1",
87
88
  "husky": "9.1.7",
88
- "lint-staged": "15.5.1",
89
+ "lint-staged": "15.5.2",
89
90
  "npm-run-all2": "7.0.2",
90
- "prettier": "3.5.3",
91
+ "prettier": "3.6.2",
91
92
  "random-access-memory": "6.2.1",
92
- "react": "19.1.0",
93
- "react-dom": "19.1.0",
94
- "tsdoc-markdown": "1.2.0",
93
+ "react": "19.1.1",
94
+ "react-dom": "19.1.1",
95
+ "tsdoc-markdown": "1.4.1",
95
96
  "tshy": "3.0.2",
96
- "typescript": "5.8.3",
97
- "typescript-eslint": "8.34.1",
98
- "vitest": "3.2.3"
97
+ "typescript": "5.9.2",
98
+ "typescript-eslint": "8.44.0",
99
+ "vitest": "3.2.4"
99
100
  }
100
101
  }