Prometheus.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import React, { createContext, useContext, useEffect, useState } from 'react';
  2. import { PrometheusContextType } from './Types';
  3. import { authContext } from '../context/Auth';
  4. import {
  5. LAST_TIME_WITH_PROMETHEUS,
  6. LAST_TIME_PROMETHEUS_ADDRESS,
  7. LAST_TIME_PROMETHEUS_INSTANCE,
  8. LAST_TIME_PROMETHEUS_NAMESPACE,
  9. } from '../consts/Localstorage';
  10. import { formatPrometheusAddress } from '../utils/Format';
  11. import { PrometheusHttp } from '../http/Prometheus';
  12. import {
  13. PROMETHEUS_ADDRESS,
  14. PROMETHEUS_INSTANCE_NAME,
  15. PROMETHEUS_NAMESPACE,
  16. WITH_PROMETHEUS,
  17. } from '../consts/Prometheus';
  18. import { rootContext } from './Root';
  19. import { useTranslation } from 'react-i18next';
  20. export const prometheusContext = createContext<PrometheusContextType>({
  21. withPrometheus: false,
  22. setWithPrometheus: () => {},
  23. isPrometheusReady: false,
  24. prometheusAddress: '',
  25. prometheusInstance: '',
  26. prometheusNamespace: '',
  27. setPrometheusAddress: () => {},
  28. setPrometheusInstance: () => {},
  29. setPrometheusNamespace: () => {},
  30. });
  31. const { Provider } = prometheusContext;
  32. export const PrometheusProvider = (props: { children: React.ReactNode }) => {
  33. const { isAuth } = useContext(authContext);
  34. const [withPrometheus, setWithPrometheus] = useState(
  35. !!(
  36. window.localStorage.getItem(LAST_TIME_WITH_PROMETHEUS) || WITH_PROMETHEUS
  37. )
  38. );
  39. const [prometheusAddress, setPrometheusAddress] = useState(
  40. window.localStorage.getItem(LAST_TIME_PROMETHEUS_ADDRESS) ||
  41. PROMETHEUS_ADDRESS
  42. );
  43. const [prometheusInstance, setPrometheusInstance] = useState(
  44. window.localStorage.getItem(LAST_TIME_PROMETHEUS_INSTANCE) ||
  45. PROMETHEUS_INSTANCE_NAME
  46. );
  47. const [prometheusNamespace, setPrometheusNamespace] = useState(
  48. window.localStorage.getItem(LAST_TIME_PROMETHEUS_NAMESPACE) ||
  49. PROMETHEUS_NAMESPACE
  50. );
  51. const [isPrometheusReady, setIsPrometheusReady] = useState(false);
  52. const { openSnackBar } = useContext(rootContext);
  53. const { t: prometheusTrans } = useTranslation('prometheus');
  54. useEffect(() => {
  55. if (!isAuth) return;
  56. if (withPrometheus) {
  57. const prometheusAddressformat =
  58. formatPrometheusAddress(prometheusAddress);
  59. PrometheusHttp.setPrometheus({
  60. prometheusAddress: prometheusAddressformat,
  61. prometheusInstance,
  62. prometheusNamespace,
  63. })
  64. .then(({ isReady }: { isReady: boolean }) => {
  65. if (isReady) {
  66. window.localStorage.setItem(LAST_TIME_WITH_PROMETHEUS, 'true');
  67. window.localStorage.setItem(
  68. LAST_TIME_PROMETHEUS_ADDRESS,
  69. prometheusAddress
  70. );
  71. window.localStorage.setItem(
  72. LAST_TIME_PROMETHEUS_INSTANCE,
  73. prometheusInstance
  74. );
  75. window.localStorage.setItem(
  76. LAST_TIME_PROMETHEUS_NAMESPACE,
  77. prometheusNamespace
  78. );
  79. } else {
  80. openSnackBar(prometheusTrans('invalid'), 'error');
  81. }
  82. setIsPrometheusReady(isReady);
  83. })
  84. .catch(err => {
  85. openSnackBar(prometheusTrans('invalid'), 'error');
  86. setIsPrometheusReady(false);
  87. });
  88. } else {
  89. setIsPrometheusReady(false);
  90. }
  91. }, [isAuth, setIsPrometheusReady]);
  92. return (
  93. <Provider
  94. value={{
  95. withPrometheus,
  96. setWithPrometheus,
  97. isPrometheusReady,
  98. prometheusAddress,
  99. prometheusInstance,
  100. prometheusNamespace,
  101. setPrometheusAddress,
  102. setPrometheusInstance,
  103. setPrometheusNamespace,
  104. }}
  105. >
  106. {props.children}
  107. </Provider>
  108. );
  109. };