@scm-manager/ui-api 2.43.1 → 2.43.2-20230419-125637

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/build/index.d.ts CHANGED
@@ -727,6 +727,11 @@ declare type UseIncomingChangesetsRequest = {
727
727
  declare const useIncomingChangesets: (repository: Repository, source: string, target: string, request?: UseIncomingChangesetsRequest) => ApiResultWithFetching<ChangesetCollection>;
728
728
 
729
729
  declare const createQueryString: (params: Record<string, string>) => string;
730
+ declare type CancelablePromise<T> = Promise<T> & {
731
+ cancel: () => void;
732
+ };
733
+ declare function makeCancelable<T>(promise: Promise<T>): CancelablePromise<T>;
734
+ declare function useCancellablePromise(): <T>(p: Promise<T>) => CancelablePromise<T>;
730
735
 
731
736
  declare const requiredLink: (object: HalRepresentation, name: string, subName?: string) => string;
732
737
  declare const objectLink: (object: HalRepresentation, name: string) => string | null;
@@ -769,4 +774,4 @@ declare const RepositoryRevisionContextProvider: FC<{
769
774
  revision?: string;
770
775
  }>;
771
776
 
772
- export { AdditionalMessage, ApiProvider, Props as ApiProviderProps, ApiResult, ApiResultWithFetching, BackendError, BackendErrorContent, BadGatewayError, BaseContext, CONTENT_TYPE_PUBLIC_KEY, ConflictError, ConvertToInternalRequest, DeleteFunction, ForbiddenError, LegacyContext, LegacyContextProvider, MissingLinkError, NamespaceAndNameContext, NamespaceAndNameContextProvider, NotFoundError, RepositoryContextProvider, RepositoryRevisionContextProvider, SearchOptions, TOKEN_EXPIRED_ERROR_CODE, TokenExpiredError, UnauthorizedError, UseAvailablePluginsOptions, UseDeleteRepositoryOptions, UseGroupsRequest, UseHistoryRequest, UseInstalledPluginsOptions, UseRepositoriesRequest, UseRepositoryRolesRequest, UseSourcesOptions, UseUsersRequest, Violation, apiClient, changesetQueryKey, clearCache, createBackendError, createChangesetUrl, createDiffUrl, createQueryString, createUrl, createUrlWithIdentifiers, extractXsrfTokenFromCookie, fetchResourceFromLocationHeader, getResponseJson, isBackendError, objectLink, requiredLink, urls, useAlerts, useAnnotations, useApiKeys, useArchiveRepository, useAvailableGlobalPermissions, useAvailablePermissions, useAvailablePlugins, useBranch, useBranchDetails, useBranchDetailsCollection, useBranches, useCancelPendingPlugins, useChangeUserPassword, useChangeset, useChangesets, useClearNotifications, useConfig, useConfigLink, useContentType, useConvertToExternal, useConvertToInternal, useCreateApiKey, useCreateBranch, useCreateGroup, useCreatePermission, useCreatePublicKey, useCreateRepository, useCreateRepositoryRole, useCreateTag, useCreateUser, useDefaultBranch, useDeleteApiKey, useDeleteBranch, useDeleteGroup, useDeletePermission, useDeletePublicKey, useDeleteRepository, useDeleteRepositoryRole, useDeleteTag, useDeleteUser, useDiff, useDismissNotification, useExecutePendingPlugins, useExportInfo, useExportRepository, useFileContent, useGroup, useGroupPermissions, useGroupSuggestions, useGroups, useHistory, useImportFullRepository, useImportLog, useImportRepositoryFromBundle, useImportRepositoryFromUrl, useIncomingChangesets, useIndex, useIndexJsonResource, useIndexLink, useIndexLinks, useInstallPlugin, useInstalledPlugins, useJsonResource, useLegacyContext, useLogin, useLoginInfo, useLogout, useMe, useNamespace, useNamespaceAndNameContext, useNamespaceStrategies, useNamespaceSuggestions, useNamespaces, useNotificationSubscription, useNotifications, useOmniSearch, usePaths, usePendingPlugins, usePermissions, usePluginCenterAuthInfo, usePluginCenterLogout, usePublicKeys, useReindexRepository, useRenameRepository, useRepositories, useRepository, useRepositoryContext, useRepositoryRevisionContext, useRepositoryRole, useRepositoryRoles, useRepositoryTypes, useRepositoryVerbs, useRequiredIndexLink, useRequiredMe, useRunHealthCheck, useSearch, useSearchCounts, useSearchHelpContent, useSearchSyntaxContent, useSearchTypes, useSearchableTypes, useSetGroupPermissions, useSetUserPassword, useSetUserPermissions, useSources, useSubject, useSuggestions, useTag, useTags, useUnarchiveRepository, useUninstallPlugin, useUpdateConfig, useUpdateGroup, useUpdateInfo, useUpdatePermission, useUpdatePlugins, useUpdateRepository, useUpdateRepositoryRole, useUpdateUser, useUser, useUserPermissionOverview, useUserPermissions, useUserSuggestions, useUsers, useVersion, waitForRestartAfter };
777
+ export { AdditionalMessage, ApiProvider, Props as ApiProviderProps, ApiResult, ApiResultWithFetching, BackendError, BackendErrorContent, BadGatewayError, BaseContext, CONTENT_TYPE_PUBLIC_KEY, CancelablePromise, ConflictError, ConvertToInternalRequest, DeleteFunction, ForbiddenError, LegacyContext, LegacyContextProvider, MissingLinkError, NamespaceAndNameContext, NamespaceAndNameContextProvider, NotFoundError, RepositoryContextProvider, RepositoryRevisionContextProvider, SearchOptions, TOKEN_EXPIRED_ERROR_CODE, TokenExpiredError, UnauthorizedError, UseAvailablePluginsOptions, UseDeleteRepositoryOptions, UseGroupsRequest, UseHistoryRequest, UseInstalledPluginsOptions, UseRepositoriesRequest, UseRepositoryRolesRequest, UseSourcesOptions, UseUsersRequest, Violation, apiClient, changesetQueryKey, clearCache, createBackendError, createChangesetUrl, createDiffUrl, createQueryString, createUrl, createUrlWithIdentifiers, extractXsrfTokenFromCookie, fetchResourceFromLocationHeader, getResponseJson, isBackendError, makeCancelable, objectLink, requiredLink, urls, useAlerts, useAnnotations, useApiKeys, useArchiveRepository, useAvailableGlobalPermissions, useAvailablePermissions, useAvailablePlugins, useBranch, useBranchDetails, useBranchDetailsCollection, useBranches, useCancelPendingPlugins, useCancellablePromise, useChangeUserPassword, useChangeset, useChangesets, useClearNotifications, useConfig, useConfigLink, useContentType, useConvertToExternal, useConvertToInternal, useCreateApiKey, useCreateBranch, useCreateGroup, useCreatePermission, useCreatePublicKey, useCreateRepository, useCreateRepositoryRole, useCreateTag, useCreateUser, useDefaultBranch, useDeleteApiKey, useDeleteBranch, useDeleteGroup, useDeletePermission, useDeletePublicKey, useDeleteRepository, useDeleteRepositoryRole, useDeleteTag, useDeleteUser, useDiff, useDismissNotification, useExecutePendingPlugins, useExportInfo, useExportRepository, useFileContent, useGroup, useGroupPermissions, useGroupSuggestions, useGroups, useHistory, useImportFullRepository, useImportLog, useImportRepositoryFromBundle, useImportRepositoryFromUrl, useIncomingChangesets, useIndex, useIndexJsonResource, useIndexLink, useIndexLinks, useInstallPlugin, useInstalledPlugins, useJsonResource, useLegacyContext, useLogin, useLoginInfo, useLogout, useMe, useNamespace, useNamespaceAndNameContext, useNamespaceStrategies, useNamespaceSuggestions, useNamespaces, useNotificationSubscription, useNotifications, useOmniSearch, usePaths, usePendingPlugins, usePermissions, usePluginCenterAuthInfo, usePluginCenterLogout, usePublicKeys, useReindexRepository, useRenameRepository, useRepositories, useRepository, useRepositoryContext, useRepositoryRevisionContext, useRepositoryRole, useRepositoryRoles, useRepositoryTypes, useRepositoryVerbs, useRequiredIndexLink, useRequiredMe, useRunHealthCheck, useSearch, useSearchCounts, useSearchHelpContent, useSearchSyntaxContent, useSearchTypes, useSearchableTypes, useSetGroupPermissions, useSetUserPassword, useSetUserPermissions, useSources, useSubject, useSuggestions, useTag, useTags, useUnarchiveRepository, useUninstallPlugin, useUpdateConfig, useUpdateGroup, useUpdateInfo, useUpdatePermission, useUpdatePlugins, useUpdateRepository, useUpdateRepositoryRole, useUpdateUser, useUser, useUserPermissionOverview, useUserPermissions, useUserSuggestions, useUsers, useVersion, waitForRestartAfter };
package/build/index.js CHANGED
@@ -54,6 +54,7 @@ __export(src_exports, {
54
54
  fetchResourceFromLocationHeader: () => fetchResourceFromLocationHeader,
55
55
  getResponseJson: () => getResponseJson,
56
56
  isBackendError: () => isBackendError,
57
+ makeCancelable: () => makeCancelable,
57
58
  objectLink: () => objectLink,
58
59
  requiredLink: () => requiredLink,
59
60
  urls: () => urls_exports,
@@ -69,6 +70,7 @@ __export(src_exports, {
69
70
  useBranchDetailsCollection: () => useBranchDetailsCollection,
70
71
  useBranches: () => useBranches,
71
72
  useCancelPendingPlugins: () => useCancelPendingPlugins,
73
+ useCancellablePromise: () => useCancellablePromise,
72
74
  useChangeUserPassword: () => useChangeUserPassword,
73
75
  useChangeset: () => useChangeset,
74
76
  useChangesets: () => useChangesets,
@@ -787,9 +789,38 @@ var useLogout = () => {
787
789
  var import_react_query5 = require("react-query");
788
790
 
789
791
  // src/utils.ts
792
+ var import_react3 = require("react");
790
793
  var createQueryString = (params) => {
791
794
  return Object.keys(params).map((k) => encodeURIComponent(k) + "=" + encodeURIComponent(params[k])).join("&");
792
795
  };
796
+ function makeCancelable(promise) {
797
+ let isCanceled = false;
798
+ const wrappedPromise = new Promise((resolve, reject) => {
799
+ promise.then((val) => isCanceled ? reject({ isCanceled }) : resolve(val)).catch((error) => isCanceled ? reject({ isCanceled }) : reject(error));
800
+ });
801
+ return Object.assign(wrappedPromise, {
802
+ cancel() {
803
+ isCanceled = true;
804
+ }
805
+ });
806
+ }
807
+ function useCancellablePromise() {
808
+ const promises = (0, import_react3.useRef)();
809
+ (0, import_react3.useEffect)(() => {
810
+ promises.current = promises.current || [];
811
+ return function cancel() {
812
+ var _a;
813
+ (_a = promises.current) == null ? void 0 : _a.forEach((p) => p.cancel());
814
+ promises.current = [];
815
+ };
816
+ }, []);
817
+ return (0, import_react3.useCallback)((p) => {
818
+ var _a;
819
+ const cPromise = makeCancelable(p);
820
+ (_a = promises.current) == null ? void 0 : _a.push(cPromise);
821
+ return cPromise;
822
+ }, []);
823
+ }
793
824
 
794
825
  // src/groups.ts
795
826
  var useGroups = (request) => {
@@ -1139,7 +1170,7 @@ var branchQueryKey = (repository, branch, ...values) => {
1139
1170
  };
1140
1171
 
1141
1172
  // src/repositories.ts
1142
- var import_react3 = require("react");
1173
+ var import_react4 = require("react");
1143
1174
  var useRepositories = (request) => {
1144
1175
  var _a, _b, _c;
1145
1176
  const queryClient2 = (0, import_react_query7.useQueryClient)();
@@ -1341,8 +1372,8 @@ var useExportInfo = (repository) => {
1341
1372
  var EXPORT_MEDIA_TYPE = "application/vnd.scmm-repositoryExport+json;v=2";
1342
1373
  var useExportRepository = () => {
1343
1374
  const queryClient2 = (0, import_react_query7.useQueryClient)();
1344
- const [intervalId, setIntervalId] = (0, import_react3.useState)();
1345
- (0, import_react3.useEffect)(() => {
1375
+ const [intervalId, setIntervalId] = (0, import_react4.useState)();
1376
+ (0, import_react4.useEffect)(() => {
1346
1377
  return () => {
1347
1378
  if (intervalId) {
1348
1379
  clearInterval(intervalId);
@@ -1452,7 +1483,7 @@ var useNamespaceStrategies = () => {
1452
1483
 
1453
1484
  // src/branches.ts
1454
1485
  var import_react_query9 = require("react-query");
1455
- var import_react4 = require("react");
1486
+ var import_react5 = require("react");
1456
1487
  var useBranches = (repository) => {
1457
1488
  const queryClient2 = (0, import_react_query9.useQueryClient)();
1458
1489
  const link = requiredLink(repository, "branches");
@@ -1524,7 +1555,7 @@ var useBranchDetailsCollection = (repository, branches) => {
1524
1555
  }
1525
1556
  }
1526
1557
  );
1527
- (0, import_react4.useEffect)(() => {
1558
+ (0, import_react5.useEffect)(() => {
1528
1559
  fetchNextPage();
1529
1560
  }, [data, fetchNextPage]);
1530
1561
  return {
@@ -2183,7 +2214,7 @@ var useSetGroupPermissions = (group, permissions) => useSetEntityPermissions(per
2183
2214
 
2184
2215
  // src/sources.ts
2185
2216
  var import_react_query17 = require("react-query");
2186
- var import_react5 = require("react");
2217
+ var import_react6 = require("react");
2187
2218
  var UseSourcesDefaultOptions = {
2188
2219
  enabled: true,
2189
2220
  refetchPartialInterval: 3e3,
@@ -2209,7 +2240,7 @@ var useSources = (repository, opts = UseSourcesDefaultOptions) => {
2209
2240
  }
2210
2241
  );
2211
2242
  const file = merge(data == null ? void 0 : data.pages);
2212
- (0, import_react5.useEffect)(() => {
2243
+ (0, import_react6.useEffect)(() => {
2213
2244
  const intervalId = setInterval(() => {
2214
2245
  if (isPartial(file)) {
2215
2246
  refetch({
@@ -2393,7 +2424,7 @@ var merge2 = (diffs) => {
2393
2424
 
2394
2425
  // src/notifications.ts
2395
2426
  var import_react_query20 = require("react-query");
2396
- var import_react6 = require("react");
2427
+ var import_react7 = require("react");
2397
2428
  var useNotifications = () => {
2398
2429
  var _a;
2399
2430
  const { data: me } = useMe();
@@ -2405,7 +2436,7 @@ var useNotifications = () => {
2405
2436
  enabled: !!link
2406
2437
  }
2407
2438
  );
2408
- const memoizedRefetch = (0, import_react6.useCallback)(() => {
2439
+ const memoizedRefetch = (0, import_react7.useCallback)(() => {
2409
2440
  return refetch().then((r) => r.data);
2410
2441
  }, [refetch]);
2411
2442
  return {
@@ -2450,34 +2481,42 @@ var isEqual = (left, right) => {
2450
2481
  };
2451
2482
  var useNotificationSubscription = (refetch, notificationCollection) => {
2452
2483
  var _a;
2453
- const [notifications, setNotifications] = (0, import_react6.useState)([]);
2454
- const [disconnectedAt, setDisconnectedAt] = (0, import_react6.useState)();
2484
+ const [notifications, setNotifications] = (0, import_react7.useState)([]);
2485
+ const [disconnectedAt, setDisconnectedAt] = (0, import_react7.useState)();
2455
2486
  const link = (_a = notificationCollection == null ? void 0 : notificationCollection._links.subscribe) == null ? void 0 : _a.href;
2456
- const onVisible = (0, import_react6.useCallback)(() => {
2457
- refetch().then((collection) => {
2458
- var _a2;
2459
- if (collection) {
2460
- const newNotifications = (_a2 = collection._embedded) == null ? void 0 : _a2.notifications.filter((n) => {
2461
- return disconnectedAt && disconnectedAt < new Date(n.createdAt);
2462
- });
2463
- if (newNotifications && newNotifications.length > 0) {
2464
- setNotifications((previous) => [...previous, ...newNotifications]);
2487
+ const cancelOnUnmount = useCancellablePromise();
2488
+ const onVisible = (0, import_react7.useCallback)(() => {
2489
+ cancelOnUnmount(refetch()).then(
2490
+ (collection) => {
2491
+ var _a2;
2492
+ if (collection) {
2493
+ const newNotifications = (_a2 = collection._embedded) == null ? void 0 : _a2.notifications.filter((n) => {
2494
+ return disconnectedAt && disconnectedAt < new Date(n.createdAt);
2495
+ });
2496
+ if (newNotifications && newNotifications.length > 0) {
2497
+ setNotifications((previous) => [...previous, ...newNotifications]);
2498
+ }
2499
+ setDisconnectedAt(void 0);
2500
+ }
2501
+ },
2502
+ (reason) => {
2503
+ if (!reason.isCanceled) {
2504
+ throw reason;
2465
2505
  }
2466
- setDisconnectedAt(void 0);
2467
2506
  }
2468
- });
2469
- }, [disconnectedAt, refetch]);
2470
- const onHide = (0, import_react6.useCallback)(() => {
2507
+ );
2508
+ }, [cancelOnUnmount, disconnectedAt, refetch]);
2509
+ const onHide = (0, import_react7.useCallback)(() => {
2471
2510
  setDisconnectedAt(new Date());
2472
2511
  }, []);
2473
- const received = (0, import_react6.useCallback)(
2512
+ const received = (0, import_react7.useCallback)(
2474
2513
  (notification) => {
2475
2514
  setNotifications((previous) => [...previous, notification]);
2476
2515
  refetch();
2477
2516
  },
2478
2517
  [refetch]
2479
2518
  );
2480
- (0, import_react6.useEffect)(() => {
2519
+ (0, import_react7.useEffect)(() => {
2481
2520
  if (link) {
2482
2521
  let cancel;
2483
2522
  const disconnect = () => {
@@ -2510,13 +2549,13 @@ var useNotificationSubscription = (refetch, notificationCollection) => {
2510
2549
  };
2511
2550
  }
2512
2551
  }, [link, onVisible, onHide, received]);
2513
- const remove = (0, import_react6.useCallback)(
2552
+ const remove = (0, import_react7.useCallback)(
2514
2553
  (notification) => {
2515
2554
  setNotifications((oldNotifications) => [...oldNotifications.filter((n) => !isEqual(n, notification))]);
2516
2555
  },
2517
2556
  [setNotifications]
2518
2557
  );
2519
- const clear = (0, import_react6.useCallback)(() => {
2558
+ const clear = (0, import_react7.useCallback)(() => {
2520
2559
  setNotifications([]);
2521
2560
  }, [setNotifications]);
2522
2561
  return {
@@ -2591,7 +2630,7 @@ var useAlerts = () => {
2591
2630
 
2592
2631
  // src/configLink.ts
2593
2632
  var import_react_query22 = require("react-query");
2594
- var import_react7 = require("react");
2633
+ var import_react8 = require("react");
2595
2634
  var useConfigLink = (link) => {
2596
2635
  const queryClient2 = (0, import_react_query22.useQueryClient)();
2597
2636
  const queryKey = ["configLink", link];
@@ -2616,7 +2655,7 @@ var useConfigLink = (link) => {
2616
2655
  }
2617
2656
  );
2618
2657
  const isReadOnly = !(data == null ? void 0 : data.configuration._links.update);
2619
- const update = (0, import_react7.useCallback)(
2658
+ const update = (0, import_react8.useCallback)(
2620
2659
  (configuration) => {
2621
2660
  if (data && !isReadOnly) {
2622
2661
  return mutateAsync({
@@ -2814,7 +2853,7 @@ var useAnnotations = (repository, revision, file) => {
2814
2853
 
2815
2854
  // src/search.ts
2816
2855
  var import_react_query29 = require("react-query");
2817
- var import_react8 = require("react");
2856
+ var import_react9 = require("react");
2818
2857
 
2819
2858
  // src/help/search/syntax.en.ts
2820
2859
  var syntax_en_default = `### Modifiers
@@ -3170,10 +3209,10 @@ var useInternalSearch = (query, options, link) => {
3170
3209
  );
3171
3210
  };
3172
3211
  var useObserveAsync = (fn, deps) => {
3173
- const [data, setData] = (0, import_react8.useState)();
3174
- const [isLoading, setLoading] = (0, import_react8.useState)(false);
3175
- const [error, setError] = (0, import_react8.useState)();
3176
- (0, import_react8.useEffect)(
3212
+ const [data, setData] = (0, import_react9.useState)();
3213
+ const [isLoading, setLoading] = (0, import_react9.useState)(false);
3214
+ const [error, setError] = (0, import_react9.useState)();
3215
+ (0, import_react9.useEffect)(
3177
3216
  () => {
3178
3217
  setLoading(true);
3179
3218
  fn(...deps).then(setData).catch(setError).finally(() => setLoading(false));
@@ -3323,7 +3362,7 @@ var useIncomingChangesets = (repository, source, target, request) => {
3323
3362
  };
3324
3363
 
3325
3364
  // src/ApiProvider.tsx
3326
- var import_react9 = __toESM(require("react"));
3365
+ var import_react10 = __toESM(require("react"));
3327
3366
  var import_react_query33 = require("react-query");
3328
3367
  var import_devtools = require("react-query/devtools");
3329
3368
  var queryClient = new import_react_query33.QueryClient({
@@ -3334,7 +3373,7 @@ var queryClient = new import_react_query33.QueryClient({
3334
3373
  }
3335
3374
  });
3336
3375
  var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools = true }) => {
3337
- (0, import_react9.useEffect)(() => {
3376
+ (0, import_react10.useEffect)(() => {
3338
3377
  if (index) {
3339
3378
  queryClient.setQueryData("index", index);
3340
3379
  if (onIndexFetched) {
@@ -3342,7 +3381,7 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3342
3381
  }
3343
3382
  }
3344
3383
  }, [index, onIndexFetched]);
3345
- (0, import_react9.useEffect)(() => {
3384
+ (0, import_react10.useEffect)(() => {
3346
3385
  if (me) {
3347
3386
  queryClient.setQueryData("me", me);
3348
3387
  if (onMeFetched) {
@@ -3350,12 +3389,12 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3350
3389
  }
3351
3390
  }
3352
3391
  }, [me, onMeFetched]);
3353
- return /* @__PURE__ */ import_react9.default.createElement(import_react_query33.QueryClientProvider, {
3392
+ return /* @__PURE__ */ import_react10.default.createElement(import_react_query33.QueryClientProvider, {
3354
3393
  client: queryClient
3355
- }, /* @__PURE__ */ import_react9.default.createElement(LegacyContextProvider, {
3394
+ }, /* @__PURE__ */ import_react10.default.createElement(LegacyContextProvider, {
3356
3395
  onIndexFetched,
3357
3396
  onMeFetched
3358
- }, children), devtools ? /* @__PURE__ */ import_react9.default.createElement(import_devtools.ReactQueryDevtools, {
3397
+ }, children), devtools ? /* @__PURE__ */ import_react10.default.createElement(import_devtools.ReactQueryDevtools, {
3359
3398
  initialIsOpen: false
3360
3399
  }) : null);
3361
3400
  };
@@ -3365,36 +3404,36 @@ var clearCache = () => {
3365
3404
  var ApiProvider_default = ApiProvider;
3366
3405
 
3367
3406
  // src/NamespaceAndNameContext.tsx
3368
- var import_react10 = __toESM(require("react"));
3369
- var Context2 = (0, import_react10.createContext)(void 0);
3407
+ var import_react11 = __toESM(require("react"));
3408
+ var Context2 = (0, import_react11.createContext)(void 0);
3370
3409
  var useNamespaceAndNameContext = () => {
3371
- const context = (0, import_react10.useContext)(Context2);
3410
+ const context = (0, import_react11.useContext)(Context2);
3372
3411
  if (!context) {
3373
3412
  throw new Error("useNamespaceAndNameContext can't be used outside of ApiProvider");
3374
3413
  }
3375
3414
  return context;
3376
3415
  };
3377
3416
  var NamespaceAndNameContextProvider = ({ children }) => {
3378
- const [namespace, setNamespace] = (0, import_react10.useState)("");
3379
- const [name, setName] = (0, import_react10.useState)("");
3380
- return /* @__PURE__ */ import_react10.default.createElement(Context2.Provider, {
3417
+ const [namespace, setNamespace] = (0, import_react11.useState)("");
3418
+ const [name, setName] = (0, import_react11.useState)("");
3419
+ return /* @__PURE__ */ import_react11.default.createElement(Context2.Provider, {
3381
3420
  value: { namespace, setNamespace, name, setName }
3382
3421
  }, children);
3383
3422
  };
3384
3423
 
3385
3424
  // src/RepositoryContext.tsx
3386
- var import_react11 = __toESM(require("react"));
3387
- var Context3 = (0, import_react11.createContext)(void 0);
3388
- var useRepositoryContext = () => (0, import_react11.useContext)(Context3);
3389
- var RepositoryContextProvider = ({ repository, children }) => /* @__PURE__ */ import_react11.default.createElement(Context3.Provider, {
3425
+ var import_react12 = __toESM(require("react"));
3426
+ var Context3 = (0, import_react12.createContext)(void 0);
3427
+ var useRepositoryContext = () => (0, import_react12.useContext)(Context3);
3428
+ var RepositoryContextProvider = ({ repository, children }) => /* @__PURE__ */ import_react12.default.createElement(Context3.Provider, {
3390
3429
  value: repository
3391
3430
  }, children);
3392
3431
 
3393
3432
  // src/RepositoryRevisionContext.tsx
3394
- var import_react12 = __toESM(require("react"));
3395
- var Context4 = (0, import_react12.createContext)(void 0);
3396
- var useRepositoryRevisionContext = () => (0, import_react12.useContext)(Context4);
3397
- var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__ */ import_react12.default.createElement(Context4.Provider, {
3433
+ var import_react13 = __toESM(require("react"));
3434
+ var Context4 = (0, import_react13.createContext)(void 0);
3435
+ var useRepositoryRevisionContext = () => (0, import_react13.useContext)(Context4);
3436
+ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__ */ import_react13.default.createElement(Context4.Provider, {
3398
3437
  value: revision
3399
3438
  }, children);
3400
3439
  // Annotate the CommonJS export names for ESM import in node:
@@ -3427,6 +3466,7 @@ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__
3427
3466
  fetchResourceFromLocationHeader,
3428
3467
  getResponseJson,
3429
3468
  isBackendError,
3469
+ makeCancelable,
3430
3470
  objectLink,
3431
3471
  requiredLink,
3432
3472
  urls,
@@ -3442,6 +3482,7 @@ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__
3442
3482
  useBranchDetailsCollection,
3443
3483
  useBranches,
3444
3484
  useCancelPendingPlugins,
3485
+ useCancellablePromise,
3445
3486
  useChangeUserPassword,
3446
3487
  useChangeset,
3447
3488
  useChangesets,
package/build/index.mjs CHANGED
@@ -605,9 +605,38 @@ var useLogout = () => {
605
605
  import { useMutation as useMutation2, useQuery as useQuery3, useQueryClient as useQueryClient3 } from "react-query";
606
606
 
607
607
  // src/utils.ts
608
+ import { useCallback as useCallback2, useEffect, useRef } from "react";
608
609
  var createQueryString = (params) => {
609
610
  return Object.keys(params).map((k) => encodeURIComponent(k) + "=" + encodeURIComponent(params[k])).join("&");
610
611
  };
612
+ function makeCancelable(promise) {
613
+ let isCanceled = false;
614
+ const wrappedPromise = new Promise((resolve, reject) => {
615
+ promise.then((val) => isCanceled ? reject({ isCanceled }) : resolve(val)).catch((error) => isCanceled ? reject({ isCanceled }) : reject(error));
616
+ });
617
+ return Object.assign(wrappedPromise, {
618
+ cancel() {
619
+ isCanceled = true;
620
+ }
621
+ });
622
+ }
623
+ function useCancellablePromise() {
624
+ const promises = useRef();
625
+ useEffect(() => {
626
+ promises.current = promises.current || [];
627
+ return function cancel() {
628
+ var _a;
629
+ (_a = promises.current) == null ? void 0 : _a.forEach((p) => p.cancel());
630
+ promises.current = [];
631
+ };
632
+ }, []);
633
+ return useCallback2((p) => {
634
+ var _a;
635
+ const cPromise = makeCancelable(p);
636
+ (_a = promises.current) == null ? void 0 : _a.push(cPromise);
637
+ return cPromise;
638
+ }, []);
639
+ }
611
640
 
612
641
  // src/groups.ts
613
642
  var useGroups = (request) => {
@@ -957,7 +986,7 @@ var branchQueryKey = (repository, branch, ...values) => {
957
986
  };
958
987
 
959
988
  // src/repositories.ts
960
- import { useEffect, useState } from "react";
989
+ import { useEffect as useEffect2, useState } from "react";
961
990
  var useRepositories = (request) => {
962
991
  var _a, _b, _c;
963
992
  const queryClient2 = useQueryClient5();
@@ -1160,7 +1189,7 @@ var EXPORT_MEDIA_TYPE = "application/vnd.scmm-repositoryExport+json;v=2";
1160
1189
  var useExportRepository = () => {
1161
1190
  const queryClient2 = useQueryClient5();
1162
1191
  const [intervalId, setIntervalId] = useState();
1163
- useEffect(() => {
1192
+ useEffect2(() => {
1164
1193
  return () => {
1165
1194
  if (intervalId) {
1166
1195
  clearInterval(intervalId);
@@ -1270,7 +1299,7 @@ var useNamespaceStrategies = () => {
1270
1299
 
1271
1300
  // src/branches.ts
1272
1301
  import { useInfiniteQuery, useMutation as useMutation5, useQuery as useQuery7, useQueryClient as useQueryClient6 } from "react-query";
1273
- import { useEffect as useEffect2 } from "react";
1302
+ import { useEffect as useEffect3 } from "react";
1274
1303
  var useBranches = (repository) => {
1275
1304
  const queryClient2 = useQueryClient6();
1276
1305
  const link = requiredLink(repository, "branches");
@@ -1342,7 +1371,7 @@ var useBranchDetailsCollection = (repository, branches) => {
1342
1371
  }
1343
1372
  }
1344
1373
  );
1345
- useEffect2(() => {
1374
+ useEffect3(() => {
1346
1375
  fetchNextPage();
1347
1376
  }, [data, fetchNextPage]);
1348
1377
  return {
@@ -2001,7 +2030,7 @@ var useSetGroupPermissions = (group, permissions) => useSetEntityPermissions(per
2001
2030
 
2002
2031
  // src/sources.ts
2003
2032
  import { useInfiniteQuery as useInfiniteQuery2 } from "react-query";
2004
- import { useEffect as useEffect3 } from "react";
2033
+ import { useEffect as useEffect4 } from "react";
2005
2034
  var UseSourcesDefaultOptions = {
2006
2035
  enabled: true,
2007
2036
  refetchPartialInterval: 3e3,
@@ -2027,7 +2056,7 @@ var useSources = (repository, opts = UseSourcesDefaultOptions) => {
2027
2056
  }
2028
2057
  );
2029
2058
  const file = merge(data == null ? void 0 : data.pages);
2030
- useEffect3(() => {
2059
+ useEffect4(() => {
2031
2060
  const intervalId = setInterval(() => {
2032
2061
  if (isPartial(file)) {
2033
2062
  refetch({
@@ -2211,7 +2240,7 @@ var merge2 = (diffs) => {
2211
2240
 
2212
2241
  // src/notifications.ts
2213
2242
  import { useMutation as useMutation12, useQuery as useQuery16, useQueryClient as useQueryClient13 } from "react-query";
2214
- import { useCallback as useCallback2, useEffect as useEffect4, useState as useState2 } from "react";
2243
+ import { useCallback as useCallback3, useEffect as useEffect5, useState as useState2 } from "react";
2215
2244
  var useNotifications = () => {
2216
2245
  var _a;
2217
2246
  const { data: me } = useMe();
@@ -2223,7 +2252,7 @@ var useNotifications = () => {
2223
2252
  enabled: !!link
2224
2253
  }
2225
2254
  );
2226
- const memoizedRefetch = useCallback2(() => {
2255
+ const memoizedRefetch = useCallback3(() => {
2227
2256
  return refetch().then((r) => r.data);
2228
2257
  }, [refetch]);
2229
2258
  return {
@@ -2271,31 +2300,39 @@ var useNotificationSubscription = (refetch, notificationCollection) => {
2271
2300
  const [notifications, setNotifications] = useState2([]);
2272
2301
  const [disconnectedAt, setDisconnectedAt] = useState2();
2273
2302
  const link = (_a = notificationCollection == null ? void 0 : notificationCollection._links.subscribe) == null ? void 0 : _a.href;
2274
- const onVisible = useCallback2(() => {
2275
- refetch().then((collection) => {
2276
- var _a2;
2277
- if (collection) {
2278
- const newNotifications = (_a2 = collection._embedded) == null ? void 0 : _a2.notifications.filter((n) => {
2279
- return disconnectedAt && disconnectedAt < new Date(n.createdAt);
2280
- });
2281
- if (newNotifications && newNotifications.length > 0) {
2282
- setNotifications((previous) => [...previous, ...newNotifications]);
2303
+ const cancelOnUnmount = useCancellablePromise();
2304
+ const onVisible = useCallback3(() => {
2305
+ cancelOnUnmount(refetch()).then(
2306
+ (collection) => {
2307
+ var _a2;
2308
+ if (collection) {
2309
+ const newNotifications = (_a2 = collection._embedded) == null ? void 0 : _a2.notifications.filter((n) => {
2310
+ return disconnectedAt && disconnectedAt < new Date(n.createdAt);
2311
+ });
2312
+ if (newNotifications && newNotifications.length > 0) {
2313
+ setNotifications((previous) => [...previous, ...newNotifications]);
2314
+ }
2315
+ setDisconnectedAt(void 0);
2316
+ }
2317
+ },
2318
+ (reason) => {
2319
+ if (!reason.isCanceled) {
2320
+ throw reason;
2283
2321
  }
2284
- setDisconnectedAt(void 0);
2285
2322
  }
2286
- });
2287
- }, [disconnectedAt, refetch]);
2288
- const onHide = useCallback2(() => {
2323
+ );
2324
+ }, [cancelOnUnmount, disconnectedAt, refetch]);
2325
+ const onHide = useCallback3(() => {
2289
2326
  setDisconnectedAt(new Date());
2290
2327
  }, []);
2291
- const received = useCallback2(
2328
+ const received = useCallback3(
2292
2329
  (notification) => {
2293
2330
  setNotifications((previous) => [...previous, notification]);
2294
2331
  refetch();
2295
2332
  },
2296
2333
  [refetch]
2297
2334
  );
2298
- useEffect4(() => {
2335
+ useEffect5(() => {
2299
2336
  if (link) {
2300
2337
  let cancel;
2301
2338
  const disconnect = () => {
@@ -2328,13 +2365,13 @@ var useNotificationSubscription = (refetch, notificationCollection) => {
2328
2365
  };
2329
2366
  }
2330
2367
  }, [link, onVisible, onHide, received]);
2331
- const remove = useCallback2(
2368
+ const remove = useCallback3(
2332
2369
  (notification) => {
2333
2370
  setNotifications((oldNotifications) => [...oldNotifications.filter((n) => !isEqual(n, notification))]);
2334
2371
  },
2335
2372
  [setNotifications]
2336
2373
  );
2337
- const clear = useCallback2(() => {
2374
+ const clear = useCallback3(() => {
2338
2375
  setNotifications([]);
2339
2376
  }, [setNotifications]);
2340
2377
  return {
@@ -2409,7 +2446,7 @@ var useAlerts = () => {
2409
2446
 
2410
2447
  // src/configLink.ts
2411
2448
  import { useMutation as useMutation13, useQuery as useQuery18, useQueryClient as useQueryClient14 } from "react-query";
2412
- import { useCallback as useCallback3 } from "react";
2449
+ import { useCallback as useCallback4 } from "react";
2413
2450
  var useConfigLink = (link) => {
2414
2451
  const queryClient2 = useQueryClient14();
2415
2452
  const queryKey = ["configLink", link];
@@ -2434,7 +2471,7 @@ var useConfigLink = (link) => {
2434
2471
  }
2435
2472
  );
2436
2473
  const isReadOnly = !(data == null ? void 0 : data.configuration._links.update);
2437
- const update = useCallback3(
2474
+ const update = useCallback4(
2438
2475
  (configuration) => {
2439
2476
  if (data && !isReadOnly) {
2440
2477
  return mutateAsync({
@@ -2632,7 +2669,7 @@ var useAnnotations = (repository, revision, file) => {
2632
2669
 
2633
2670
  // src/search.ts
2634
2671
  import { useQueries, useQuery as useQuery25 } from "react-query";
2635
- import { useEffect as useEffect5, useState as useState3 } from "react";
2672
+ import { useEffect as useEffect6, useState as useState3 } from "react";
2636
2673
 
2637
2674
  // src/help/search/syntax.en.ts
2638
2675
  var syntax_en_default = `### Modifiers
@@ -2991,7 +3028,7 @@ var useObserveAsync = (fn, deps) => {
2991
3028
  const [data, setData] = useState3();
2992
3029
  const [isLoading, setLoading] = useState3(false);
2993
3030
  const [error, setError] = useState3();
2994
- useEffect5(
3031
+ useEffect6(
2995
3032
  () => {
2996
3033
  setLoading(true);
2997
3034
  fn(...deps).then(setData).catch(setError).finally(() => setLoading(false));
@@ -3141,7 +3178,7 @@ var useIncomingChangesets = (repository, source, target, request) => {
3141
3178
  };
3142
3179
 
3143
3180
  // src/ApiProvider.tsx
3144
- import React2, { useEffect as useEffect6 } from "react";
3181
+ import React2, { useEffect as useEffect7 } from "react";
3145
3182
  import { QueryClient as QueryClient4, QueryClientProvider } from "react-query";
3146
3183
  import { ReactQueryDevtools } from "react-query/devtools";
3147
3184
  var queryClient = new QueryClient4({
@@ -3152,7 +3189,7 @@ var queryClient = new QueryClient4({
3152
3189
  }
3153
3190
  });
3154
3191
  var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools = true }) => {
3155
- useEffect6(() => {
3192
+ useEffect7(() => {
3156
3193
  if (index) {
3157
3194
  queryClient.setQueryData("index", index);
3158
3195
  if (onIndexFetched) {
@@ -3160,7 +3197,7 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3160
3197
  }
3161
3198
  }
3162
3199
  }, [index, onIndexFetched]);
3163
- useEffect6(() => {
3200
+ useEffect7(() => {
3164
3201
  if (me) {
3165
3202
  queryClient.setQueryData("me", me);
3166
3203
  if (onMeFetched) {
@@ -3244,6 +3281,7 @@ export {
3244
3281
  fetchResourceFromLocationHeader,
3245
3282
  getResponseJson,
3246
3283
  isBackendError,
3284
+ makeCancelable,
3247
3285
  objectLink,
3248
3286
  requiredLink,
3249
3287
  urls_exports as urls,
@@ -3259,6 +3297,7 @@ export {
3259
3297
  useBranchDetailsCollection,
3260
3298
  useBranches,
3261
3299
  useCancelPendingPlugins,
3300
+ useCancellablePromise,
3262
3301
  useChangeUserPassword,
3263
3302
  useChangeset,
3264
3303
  useChangesets,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scm-manager/ui-api",
3
- "version": "2.43.1",
3
+ "version": "2.43.2-20230419-125637",
4
4
  "description": "React hook api for the SCM-Manager backend",
5
5
  "main": "build/index.js",
6
6
  "module": "build/index.mjs",
@@ -29,7 +29,7 @@
29
29
  "tsup": "^5.12.6"
30
30
  },
31
31
  "dependencies": {
32
- "@scm-manager/ui-types": "2.43.1",
32
+ "@scm-manager/ui-types": "2.43.2-20230419-125637",
33
33
  "fetch-mock-jest": "^1.5.1",
34
34
  "gitdiff-parser": "^0.2.2",
35
35
  "query-string": "6.14.1",