@scm-manager/ui-api 2.47.0 → 2.48.0

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
@@ -711,6 +711,19 @@ declare const useSearchSyntaxContent: (language: string) => {
711
711
 
712
712
  declare const useLoginInfo: (disabled?: boolean) => ApiResult<LoginInfo>;
713
713
 
714
+ declare const useInvalidateAllCaches: () => {
715
+ invalidate: () => void;
716
+ isLoading: boolean;
717
+ isSuccess: boolean;
718
+ error: Error | null;
719
+ };
720
+ declare const useInvalidateSearchIndices: () => {
721
+ invalidate: () => void;
722
+ isLoading: boolean;
723
+ isSuccess: boolean;
724
+ error: Error | null;
725
+ };
726
+
714
727
  declare const usePluginCenterAuthInfo: () => ApiResult<PluginCenterAuthenticationInfo>;
715
728
  declare const usePluginCenterLogout: (authenticationInfo: PluginCenterAuthenticationInfo) => {
716
729
  logout: () => void;
@@ -736,6 +749,20 @@ declare function useCancellablePromise(): <T>(p: Promise<T>) => CancelablePromis
736
749
  declare const requiredLink: (object: HalRepresentation, name: string, subName?: string) => string;
737
750
  declare const objectLink: (object: HalRepresentation, name: string) => string | null;
738
751
 
752
+ /**
753
+ * Cache provider for local storage which enables listening to changes and triggering re-renders when writing.
754
+ *
755
+ * Only required once as a wrapper for the whole application.
756
+ *
757
+ * @see useLocalStorage
758
+ */
759
+ declare const LocalStorageProvider: FC;
760
+ /**
761
+ * Provides an api to access the browser's local storage for a given key.
762
+ *
763
+ * @param key The local storage key
764
+ * @param initialValue Value to be used if the local storage does not yet have the given key defined
765
+ */
739
766
  declare function useLocalStorage<T>(key: string, initialValue: T): [value: T, setValue: (value: T | ((previousConfig: T) => T)) => void];
740
767
 
741
768
  declare const useGroupOptions: (query?: string) => react_query.UseQueryResult<Option<AutocompleteObject>[], Error>;
@@ -780,4 +807,4 @@ declare const RepositoryRevisionContextProvider: FC<{
780
807
  revision?: string;
781
808
  }>;
782
809
 
783
- 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, useGroupOptions, useGroupPermissions, useGroupSuggestions, useGroups, useHistory, useImportFullRepository, useImportLog, useImportRepositoryFromBundle, useImportRepositoryFromUrl, useIncomingChangesets, useIndex, useIndexJsonResource, useIndexLink, useIndexLinks, useInstallPlugin, useInstalledPlugins, useJsonResource, useLegacyContext, useLocalStorage, useLogin, useLoginInfo, useLogout, useMe, useNamespace, useNamespaceAndNameContext, useNamespaceOptions, 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, useUserOptions, useUserPermissionOverview, useUserPermissions, useUserSuggestions, useUsers, useVersion, waitForRestartAfter };
810
+ export { AdditionalMessage, ApiProvider, Props as ApiProviderProps, ApiResult, ApiResultWithFetching, BackendError, BackendErrorContent, BadGatewayError, BaseContext, CONTENT_TYPE_PUBLIC_KEY, CancelablePromise, ConflictError, ConvertToInternalRequest, DeleteFunction, ForbiddenError, LegacyContext, LegacyContextProvider, LocalStorageProvider, 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, useGroupOptions, useGroupPermissions, useGroupSuggestions, useGroups, useHistory, useImportFullRepository, useImportLog, useImportRepositoryFromBundle, useImportRepositoryFromUrl, useIncomingChangesets, useIndex, useIndexJsonResource, useIndexLink, useIndexLinks, useInstallPlugin, useInstalledPlugins, useInvalidateAllCaches, useInvalidateSearchIndices, useJsonResource, useLegacyContext, useLocalStorage, useLogin, useLoginInfo, useLogout, useMe, useNamespace, useNamespaceAndNameContext, useNamespaceOptions, 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, useUserOptions, useUserPermissionOverview, useUserPermissions, useUserSuggestions, useUsers, useVersion, waitForRestartAfter };
package/build/index.js CHANGED
@@ -33,6 +33,7 @@ __export(src_exports, {
33
33
  ConflictError: () => ConflictError,
34
34
  ForbiddenError: () => ForbiddenError,
35
35
  LegacyContextProvider: () => LegacyContextProvider,
36
+ LocalStorageProvider: () => LocalStorageProvider,
36
37
  MissingLinkError: () => MissingLinkError,
37
38
  NamespaceAndNameContextProvider: () => NamespaceAndNameContextProvider,
38
39
  NotFoundError: () => NotFoundError,
@@ -122,6 +123,8 @@ __export(src_exports, {
122
123
  useIndexLinks: () => useIndexLinks,
123
124
  useInstallPlugin: () => useInstallPlugin,
124
125
  useInstalledPlugins: () => useInstalledPlugins,
126
+ useInvalidateAllCaches: () => useInvalidateAllCaches,
127
+ useInvalidateSearchIndices: () => useInvalidateSearchIndices,
125
128
  useJsonResource: () => useJsonResource,
126
129
  useLegacyContext: () => useLegacyContext,
127
130
  useLocalStorage: () => useLocalStorage,
@@ -3259,8 +3262,30 @@ var useLoginInfo = (disabled = false) => {
3259
3262
  };
3260
3263
  };
3261
3264
 
3262
- // src/usePluginCenterAuthInfo.ts
3265
+ // src/useInvalidation.tsx
3263
3266
  var import_react_query31 = require("react-query");
3267
+ var useInvalidation = (link) => {
3268
+ const { mutate, isLoading, error, isSuccess } = (0, import_react_query31.useMutation)(
3269
+ (link2) => apiClient.post(link2, {})
3270
+ );
3271
+ return {
3272
+ invalidate: () => mutate(link),
3273
+ isLoading,
3274
+ isSuccess,
3275
+ error
3276
+ };
3277
+ };
3278
+ var useInvalidateAllCaches = () => {
3279
+ const invalidateCacheLink = useRequiredIndexLink("invalidateCaches");
3280
+ return useInvalidation(invalidateCacheLink);
3281
+ };
3282
+ var useInvalidateSearchIndices = () => {
3283
+ const invalidateSearchIndexLink = useRequiredIndexLink("invalidateSearchIndex");
3284
+ return useInvalidation(invalidateSearchIndexLink);
3285
+ };
3286
+
3287
+ // src/usePluginCenterAuthInfo.ts
3288
+ var import_react_query32 = require("react-query");
3264
3289
  var import_react_router_dom = require("react-router-dom");
3265
3290
  var appendQueryParam = (link, name, value) => {
3266
3291
  let href = link.href;
@@ -3274,7 +3299,7 @@ var appendQueryParam = (link, name, value) => {
3274
3299
  var usePluginCenterAuthInfo = () => {
3275
3300
  const link = useIndexLink("pluginCenterAuth");
3276
3301
  const location = (0, import_react_router_dom.useLocation)();
3277
- return (0, import_react_query31.useQuery)(
3302
+ return (0, import_react_query32.useQuery)(
3278
3303
  ["pluginCenterAuth"],
3279
3304
  () => {
3280
3305
  if (!link) {
@@ -3297,8 +3322,8 @@ var usePluginCenterAuthInfo = () => {
3297
3322
  );
3298
3323
  };
3299
3324
  var usePluginCenterLogout = (authenticationInfo) => {
3300
- const queryClient2 = (0, import_react_query31.useQueryClient)();
3301
- const { mutate, isLoading, error } = (0, import_react_query31.useMutation)(
3325
+ const queryClient2 = (0, import_react_query32.useQueryClient)();
3326
+ const { mutate, isLoading, error } = (0, import_react_query32.useMutation)(
3302
3327
  () => {
3303
3328
  if (!authenticationInfo._links.logout) {
3304
3329
  throw new Error("authenticationInfo has no logout link");
@@ -3320,7 +3345,7 @@ var usePluginCenterLogout = (authenticationInfo) => {
3320
3345
  };
3321
3346
 
3322
3347
  // src/compare.ts
3323
- var import_react_query32 = require("react-query");
3348
+ var import_react_query33 = require("react-query");
3324
3349
  function createIncomingUrl(repository, linkName, source, target) {
3325
3350
  const link = repository._links[linkName];
3326
3351
  if (link == null ? void 0 : link.templated) {
@@ -3340,7 +3365,7 @@ function createDiffUrl(repository, source, target) {
3340
3365
  }
3341
3366
  }
3342
3367
  var useIncomingChangesets = (repository, source, target, request) => {
3343
- const queryClient2 = (0, import_react_query32.useQueryClient)();
3368
+ const queryClient2 = (0, import_react_query33.useQueryClient)();
3344
3369
  let link = createChangesetUrl(repository, source, target);
3345
3370
  if ((request == null ? void 0 : request.page) || (request == null ? void 0 : request.limit)) {
3346
3371
  if ((request == null ? void 0 : request.page) && (request == null ? void 0 : request.limit)) {
@@ -3351,7 +3376,7 @@ var useIncomingChangesets = (repository, source, target, request) => {
3351
3376
  link = `${link}?pageSize=${request.limit}`;
3352
3377
  }
3353
3378
  }
3354
- return (0, import_react_query32.useQuery)(
3379
+ return (0, import_react_query33.useQuery)(
3355
3380
  ["repository", repository.namespace, repository.name, "compare", source, target, "changesets", (request == null ? void 0 : request.page) || 0],
3356
3381
  () => apiClient.get(link).then((response) => response.json()),
3357
3382
  {
@@ -3365,29 +3390,56 @@ var useIncomingChangesets = (repository, source, target, request) => {
3365
3390
  );
3366
3391
  };
3367
3392
 
3368
- // src/localStorage.ts
3369
- var import_react10 = require("react");
3393
+ // src/localStorage.tsx
3394
+ var import_react10 = __toESM(require("react"));
3395
+ var LocalStorageContext = (0, import_react10.createContext)(null);
3396
+ var LocalStorageProvider = ({ children }) => {
3397
+ const [localStorageCache, setLocalStorageCache] = (0, import_react10.useState)({});
3398
+ const setItem = (0, import_react10.useCallback)((key, value) => {
3399
+ localStorage.setItem(key, JSON.stringify(value));
3400
+ setLocalStorageCache((prevState) => ({
3401
+ ...prevState,
3402
+ [key]: value
3403
+ }));
3404
+ }, []);
3405
+ const getItem = (0, import_react10.useCallback)(
3406
+ (key, initialValue) => {
3407
+ let initialLoadResult;
3408
+ if (!(key in localStorageCache)) {
3409
+ try {
3410
+ const item = localStorage.getItem(key);
3411
+ initialLoadResult = item ? JSON.parse(item) : initialValue;
3412
+ } catch (error) {
3413
+ console.error(error);
3414
+ initialLoadResult = initialValue;
3415
+ }
3416
+ setItem(key, initialLoadResult);
3417
+ }
3418
+ return initialLoadResult != null ? initialLoadResult : localStorageCache[key];
3419
+ },
3420
+ [localStorageCache, setItem]
3421
+ );
3422
+ return /* @__PURE__ */ import_react10.default.createElement(LocalStorageContext.Provider, {
3423
+ value: (0, import_react10.useMemo)(() => ({ getItem, setItem }), [getItem, setItem])
3424
+ }, children);
3425
+ };
3370
3426
  function useLocalStorage(key, initialValue) {
3371
- const [value, setValue] = (0, import_react10.useState)(() => {
3372
- try {
3373
- const item = localStorage.getItem(key);
3374
- return item ? JSON.parse(item) : initialValue;
3375
- } catch (error) {
3376
- console.error(error);
3377
- return initialValue;
3378
- }
3379
- });
3380
- (0, import_react10.useEffect)(() => localStorage.setItem(key, JSON.stringify(value)), [key, value]);
3381
- return [value, setValue];
3427
+ const { getItem, setItem } = (0, import_react10.useContext)(LocalStorageContext);
3428
+ const value = (0, import_react10.useMemo)(() => getItem(key, initialValue), [getItem, initialValue, key]);
3429
+ const setValue = (0, import_react10.useCallback)(
3430
+ (newValue) => setItem(key, typeof newValue === "function" ? newValue(value) : newValue),
3431
+ [key, setItem, value]
3432
+ );
3433
+ return (0, import_react10.useMemo)(() => [value, setValue], [setValue, value]);
3382
3434
  }
3383
3435
 
3384
3436
  // src/useAutocompleteOptions.ts
3385
- var import_react_query33 = require("react-query");
3437
+ var import_react_query34 = require("react-query");
3386
3438
  var import_react_i18next = require("react-i18next");
3387
3439
  var defaultLabelFactory = (element) => element.displayName ? `${element.displayName} (${element.id})` : element.id;
3388
3440
  function useAutocompleteOptions(query = "", link, options = {}) {
3389
3441
  const [t] = (0, import_react_i18next.useTranslation)("commons");
3390
- return (0, import_react_query33.useQuery)(
3442
+ return (0, import_react_query34.useQuery)(
3391
3443
  ["options", link, query],
3392
3444
  () => apiClient.get(link + "?q=" + query).then((r) => r.json()).then((json) => {
3393
3445
  const result = json.map((element) => ({
@@ -3437,9 +3489,9 @@ var useUserOptions = (query) => {
3437
3489
 
3438
3490
  // src/ApiProvider.tsx
3439
3491
  var import_react11 = __toESM(require("react"));
3440
- var import_react_query34 = require("react-query");
3492
+ var import_react_query35 = require("react-query");
3441
3493
  var import_devtools = require("react-query/devtools");
3442
- var queryClient = new import_react_query34.QueryClient({
3494
+ var queryClient = new import_react_query35.QueryClient({
3443
3495
  defaultOptions: {
3444
3496
  queries: {
3445
3497
  retry: false
@@ -3463,7 +3515,7 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3463
3515
  }
3464
3516
  }
3465
3517
  }, [me, onMeFetched]);
3466
- return /* @__PURE__ */ import_react11.default.createElement(import_react_query34.QueryClientProvider, {
3518
+ return /* @__PURE__ */ import_react11.default.createElement(import_react_query35.QueryClientProvider, {
3467
3519
  client: queryClient
3468
3520
  }, /* @__PURE__ */ import_react11.default.createElement(LegacyContextProvider, {
3469
3521
  onIndexFetched,
@@ -3519,6 +3571,7 @@ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__
3519
3571
  ConflictError,
3520
3572
  ForbiddenError,
3521
3573
  LegacyContextProvider,
3574
+ LocalStorageProvider,
3522
3575
  MissingLinkError,
3523
3576
  NamespaceAndNameContextProvider,
3524
3577
  NotFoundError,
@@ -3608,6 +3661,8 @@ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__
3608
3661
  useIndexLinks,
3609
3662
  useInstallPlugin,
3610
3663
  useInstalledPlugins,
3664
+ useInvalidateAllCaches,
3665
+ useInvalidateSearchIndices,
3611
3666
  useJsonResource,
3612
3667
  useLegacyContext,
3613
3668
  useLocalStorage,
package/build/index.mjs CHANGED
@@ -3071,8 +3071,30 @@ var useLoginInfo = (disabled = false) => {
3071
3071
  };
3072
3072
  };
3073
3073
 
3074
+ // src/useInvalidation.tsx
3075
+ import { useMutation as useMutation16 } from "react-query";
3076
+ var useInvalidation = (link) => {
3077
+ const { mutate, isLoading, error, isSuccess } = useMutation16(
3078
+ (link2) => apiClient.post(link2, {})
3079
+ );
3080
+ return {
3081
+ invalidate: () => mutate(link),
3082
+ isLoading,
3083
+ isSuccess,
3084
+ error
3085
+ };
3086
+ };
3087
+ var useInvalidateAllCaches = () => {
3088
+ const invalidateCacheLink = useRequiredIndexLink("invalidateCaches");
3089
+ return useInvalidation(invalidateCacheLink);
3090
+ };
3091
+ var useInvalidateSearchIndices = () => {
3092
+ const invalidateSearchIndexLink = useRequiredIndexLink("invalidateSearchIndex");
3093
+ return useInvalidation(invalidateSearchIndexLink);
3094
+ };
3095
+
3074
3096
  // src/usePluginCenterAuthInfo.ts
3075
- import { useMutation as useMutation16, useQuery as useQuery27, useQueryClient as useQueryClient18 } from "react-query";
3097
+ import { useMutation as useMutation17, useQuery as useQuery27, useQueryClient as useQueryClient18 } from "react-query";
3076
3098
  import { useLocation } from "react-router-dom";
3077
3099
  var appendQueryParam = (link, name, value) => {
3078
3100
  let href = link.href;
@@ -3110,7 +3132,7 @@ var usePluginCenterAuthInfo = () => {
3110
3132
  };
3111
3133
  var usePluginCenterLogout = (authenticationInfo) => {
3112
3134
  const queryClient2 = useQueryClient18();
3113
- const { mutate, isLoading, error } = useMutation16(
3135
+ const { mutate, isLoading, error } = useMutation17(
3114
3136
  () => {
3115
3137
  if (!authenticationInfo._links.logout) {
3116
3138
  throw new Error("authenticationInfo has no logout link");
@@ -3177,20 +3199,47 @@ var useIncomingChangesets = (repository, source, target, request) => {
3177
3199
  );
3178
3200
  };
3179
3201
 
3180
- // src/localStorage.ts
3181
- import { useEffect as useEffect7, useState as useState4 } from "react";
3202
+ // src/localStorage.tsx
3203
+ import React2, { createContext as createContext2, useCallback as useCallback5, useContext as useContext2, useMemo, useState as useState4 } from "react";
3204
+ var LocalStorageContext = createContext2(null);
3205
+ var LocalStorageProvider = ({ children }) => {
3206
+ const [localStorageCache, setLocalStorageCache] = useState4({});
3207
+ const setItem = useCallback5((key, value) => {
3208
+ localStorage.setItem(key, JSON.stringify(value));
3209
+ setLocalStorageCache((prevState) => ({
3210
+ ...prevState,
3211
+ [key]: value
3212
+ }));
3213
+ }, []);
3214
+ const getItem = useCallback5(
3215
+ (key, initialValue) => {
3216
+ let initialLoadResult;
3217
+ if (!(key in localStorageCache)) {
3218
+ try {
3219
+ const item = localStorage.getItem(key);
3220
+ initialLoadResult = item ? JSON.parse(item) : initialValue;
3221
+ } catch (error) {
3222
+ console.error(error);
3223
+ initialLoadResult = initialValue;
3224
+ }
3225
+ setItem(key, initialLoadResult);
3226
+ }
3227
+ return initialLoadResult != null ? initialLoadResult : localStorageCache[key];
3228
+ },
3229
+ [localStorageCache, setItem]
3230
+ );
3231
+ return /* @__PURE__ */ React2.createElement(LocalStorageContext.Provider, {
3232
+ value: useMemo(() => ({ getItem, setItem }), [getItem, setItem])
3233
+ }, children);
3234
+ };
3182
3235
  function useLocalStorage(key, initialValue) {
3183
- const [value, setValue] = useState4(() => {
3184
- try {
3185
- const item = localStorage.getItem(key);
3186
- return item ? JSON.parse(item) : initialValue;
3187
- } catch (error) {
3188
- console.error(error);
3189
- return initialValue;
3190
- }
3191
- });
3192
- useEffect7(() => localStorage.setItem(key, JSON.stringify(value)), [key, value]);
3193
- return [value, setValue];
3236
+ const { getItem, setItem } = useContext2(LocalStorageContext);
3237
+ const value = useMemo(() => getItem(key, initialValue), [getItem, initialValue, key]);
3238
+ const setValue = useCallback5(
3239
+ (newValue) => setItem(key, typeof newValue === "function" ? newValue(value) : newValue),
3240
+ [key, setItem, value]
3241
+ );
3242
+ return useMemo(() => [value, setValue], [setValue, value]);
3194
3243
  }
3195
3244
 
3196
3245
  // src/useAutocompleteOptions.ts
@@ -3248,7 +3297,7 @@ var useUserOptions = (query) => {
3248
3297
  };
3249
3298
 
3250
3299
  // src/ApiProvider.tsx
3251
- import React2, { useEffect as useEffect8 } from "react";
3300
+ import React3, { useEffect as useEffect7 } from "react";
3252
3301
  import { QueryClient as QueryClient4, QueryClientProvider } from "react-query";
3253
3302
  import { ReactQueryDevtools } from "react-query/devtools";
3254
3303
  var queryClient = new QueryClient4({
@@ -3259,7 +3308,7 @@ var queryClient = new QueryClient4({
3259
3308
  }
3260
3309
  });
3261
3310
  var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools = true }) => {
3262
- useEffect8(() => {
3311
+ useEffect7(() => {
3263
3312
  if (index) {
3264
3313
  queryClient.setQueryData("index", index);
3265
3314
  if (onIndexFetched) {
@@ -3267,7 +3316,7 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3267
3316
  }
3268
3317
  }
3269
3318
  }, [index, onIndexFetched]);
3270
- useEffect8(() => {
3319
+ useEffect7(() => {
3271
3320
  if (me) {
3272
3321
  queryClient.setQueryData("me", me);
3273
3322
  if (onMeFetched) {
@@ -3275,12 +3324,12 @@ var ApiProvider = ({ children, index, me, onMeFetched, onIndexFetched, devtools
3275
3324
  }
3276
3325
  }
3277
3326
  }, [me, onMeFetched]);
3278
- return /* @__PURE__ */ React2.createElement(QueryClientProvider, {
3327
+ return /* @__PURE__ */ React3.createElement(QueryClientProvider, {
3279
3328
  client: queryClient
3280
- }, /* @__PURE__ */ React2.createElement(LegacyContextProvider, {
3329
+ }, /* @__PURE__ */ React3.createElement(LegacyContextProvider, {
3281
3330
  onIndexFetched,
3282
3331
  onMeFetched
3283
- }, children), devtools ? /* @__PURE__ */ React2.createElement(ReactQueryDevtools, {
3332
+ }, children), devtools ? /* @__PURE__ */ React3.createElement(ReactQueryDevtools, {
3284
3333
  initialIsOpen: false
3285
3334
  }) : null);
3286
3335
  };
@@ -3290,10 +3339,10 @@ var clearCache = () => {
3290
3339
  var ApiProvider_default = ApiProvider;
3291
3340
 
3292
3341
  // src/NamespaceAndNameContext.tsx
3293
- import React3, { createContext as createContext2, useContext as useContext2, useState as useState5 } from "react";
3294
- var Context2 = createContext2(void 0);
3342
+ import React4, { createContext as createContext3, useContext as useContext3, useState as useState5 } from "react";
3343
+ var Context2 = createContext3(void 0);
3295
3344
  var useNamespaceAndNameContext = () => {
3296
- const context = useContext2(Context2);
3345
+ const context = useContext3(Context2);
3297
3346
  if (!context) {
3298
3347
  throw new Error("useNamespaceAndNameContext can't be used outside of ApiProvider");
3299
3348
  }
@@ -3302,24 +3351,24 @@ var useNamespaceAndNameContext = () => {
3302
3351
  var NamespaceAndNameContextProvider = ({ children }) => {
3303
3352
  const [namespace, setNamespace] = useState5("");
3304
3353
  const [name, setName] = useState5("");
3305
- return /* @__PURE__ */ React3.createElement(Context2.Provider, {
3354
+ return /* @__PURE__ */ React4.createElement(Context2.Provider, {
3306
3355
  value: { namespace, setNamespace, name, setName }
3307
3356
  }, children);
3308
3357
  };
3309
3358
 
3310
3359
  // src/RepositoryContext.tsx
3311
- import React4, { createContext as createContext3, useContext as useContext3 } from "react";
3312
- var Context3 = createContext3(void 0);
3313
- var useRepositoryContext = () => useContext3(Context3);
3314
- var RepositoryContextProvider = ({ repository, children }) => /* @__PURE__ */ React4.createElement(Context3.Provider, {
3360
+ import React5, { createContext as createContext4, useContext as useContext4 } from "react";
3361
+ var Context3 = createContext4(void 0);
3362
+ var useRepositoryContext = () => useContext4(Context3);
3363
+ var RepositoryContextProvider = ({ repository, children }) => /* @__PURE__ */ React5.createElement(Context3.Provider, {
3315
3364
  value: repository
3316
3365
  }, children);
3317
3366
 
3318
3367
  // src/RepositoryRevisionContext.tsx
3319
- import React5, { createContext as createContext4, useContext as useContext4 } from "react";
3320
- var Context4 = createContext4(void 0);
3321
- var useRepositoryRevisionContext = () => useContext4(Context4);
3322
- var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__ */ React5.createElement(Context4.Provider, {
3368
+ import React6, { createContext as createContext5, useContext as useContext5 } from "react";
3369
+ var Context4 = createContext5(void 0);
3370
+ var useRepositoryRevisionContext = () => useContext5(Context4);
3371
+ var RepositoryRevisionContextProvider = ({ revision, children }) => /* @__PURE__ */ React6.createElement(Context4.Provider, {
3323
3372
  value: revision
3324
3373
  }, children);
3325
3374
  export {
@@ -3330,6 +3379,7 @@ export {
3330
3379
  ConflictError,
3331
3380
  ForbiddenError,
3332
3381
  LegacyContextProvider,
3382
+ LocalStorageProvider,
3333
3383
  MissingLinkError,
3334
3384
  NamespaceAndNameContextProvider,
3335
3385
  NotFoundError,
@@ -3419,6 +3469,8 @@ export {
3419
3469
  useIndexLinks,
3420
3470
  useInstallPlugin,
3421
3471
  useInstalledPlugins,
3472
+ useInvalidateAllCaches,
3473
+ useInvalidateSearchIndices,
3422
3474
  useJsonResource,
3423
3475
  useLegacyContext,
3424
3476
  useLocalStorage,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scm-manager/ui-api",
3
- "version": "2.47.0",
3
+ "version": "2.48.0",
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.47.0",
32
+ "@scm-manager/ui-types": "2.48.0",
33
33
  "fetch-mock-jest": "^1.5.1",
34
34
  "gitdiff-parser": "^0.2.2",
35
35
  "query-string": "6.14.1",