Keycloak

Форк
0
/
RealmsContext.tsx 
74 строки · 2.2 Кб
1
import { NetworkError } from "@keycloak/keycloak-admin-client";
2
import { PropsWithChildren, useCallback, useMemo, useState } from "react";
3
import { createNamedContext, useRequiredContext, label } from "ui-shared";
4

5
import { keycloak } from "../keycloak";
6
import { useFetch } from "../utils/useFetch";
7
import { fetchAdminUI } from "./auth/admin-ui-endpoint";
8
import useLocaleSort from "../utils/useLocaleSort";
9
import { useTranslation } from "react-i18next";
10

11
type RealmsContextProps = {
12
  /** A list of all the realms. */
13
  realms: RealmNameRepresentation[];
14
  /** Refreshes the realms with the latest information. */
15
  refresh: () => Promise<void>;
16
};
17

18
export interface RealmNameRepresentation {
19
  name: string;
20
  displayName?: string;
21
}
22

23
export const RealmsContext = createNamedContext<RealmsContextProps | undefined>(
24
  "RealmsContext",
25
  undefined,
26
);
27

28
export const RealmsProvider = ({ children }: PropsWithChildren) => {
29
  const [realms, setRealms] = useState<RealmNameRepresentation[]>([]);
30
  const [refreshCount, setRefreshCount] = useState(0);
31
  const localeSort = useLocaleSort();
32
  const { t } = useTranslation();
33

34
  function updateRealms(realms: RealmNameRepresentation[]) {
35
    setRealms(localeSort(realms, (r) => label(t, r.displayName, r.name)));
36
  }
37

38
  useFetch(
39
    async () => {
40
      try {
41
        return await fetchAdminUI<RealmNameRepresentation[]>(
42
          "ui-ext/realms/names",
43
          {},
44
        );
45
      } catch (error) {
46
        if (error instanceof NetworkError && error.response.status < 500) {
47
          return [];
48
        }
49

50
        throw error;
51
      }
52
    },
53
    (realms) => updateRealms(realms),
54
    [refreshCount],
55
  );
56

57
  const refresh = useCallback(async () => {
58
    //this is needed otherwise the realm find function will not return
59
    //new or renamed realms because of the cached realms in the token (perhaps?)
60
    await keycloak.updateToken(Number.MAX_VALUE);
61
    setRefreshCount((count) => count + 1);
62
  }, []);
63

64
  const value = useMemo<RealmsContextProps>(
65
    () => ({ realms, refresh }),
66
    [realms, refresh],
67
  );
68

69
  return (
70
    <RealmsContext.Provider value={value}>{children}</RealmsContext.Provider>
71
  );
72
};
73

74
export const useRealms = () => useRequiredContext(RealmsContext);
75

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.