metricsSwitch.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import {createContext, ReactNode, useContext, useState} from 'react';
  2. import styled from '@emotion/styled';
  3. import Feature from 'app/components/acl/feature';
  4. import Switch from 'app/components/switchButton';
  5. import {t} from 'app/locale';
  6. import space from 'app/styles/space';
  7. import localStorage from 'app/utils/localStorage';
  8. import useOrganization from 'app/utils/useOrganization';
  9. const FEATURE_FLAG = 'metrics-performance-ui';
  10. /**
  11. * This is a temporary component used for debugging metrics data on performance pages.
  12. * Visible only to small amount of internal users.
  13. */
  14. function MetricsSwitch() {
  15. const organization = useOrganization();
  16. const {isMetricsData, setIsMetricsData} = useMetricsSwitch();
  17. return (
  18. <Feature features={[FEATURE_FLAG]} organization={organization}>
  19. <Label>
  20. {t('Metrics Data')}
  21. <Switch
  22. isActive={isMetricsData}
  23. toggle={() => setIsMetricsData(!isMetricsData)}
  24. size="lg"
  25. />
  26. </Label>
  27. </Feature>
  28. );
  29. }
  30. const Label = styled('label')`
  31. display: flex;
  32. align-items: center;
  33. justify-content: center;
  34. margin-bottom: 0;
  35. gap: ${space(1)};
  36. font-weight: normal;
  37. `;
  38. const MetricsSwitchContext = createContext({
  39. isMetricsData: false,
  40. setIsMetricsData: (_isMetricsData: boolean) => {},
  41. });
  42. function MetricsSwitchContextContainer({children}: {children: ReactNode}) {
  43. const organization = useOrganization();
  44. const localStorageKey = `metrics-performance:${organization.slug}`;
  45. const [isMetricsData, setIsMetricsData] = useState(
  46. localStorage.getItem(localStorageKey) === 'true'
  47. );
  48. function handleSetIsMetricsData(value: boolean) {
  49. localStorage.setItem(localStorageKey, value.toString());
  50. setIsMetricsData(value);
  51. }
  52. return (
  53. <MetricsSwitchContext.Provider
  54. value={{
  55. isMetricsData: isMetricsData && organization.features.includes(FEATURE_FLAG),
  56. setIsMetricsData: handleSetIsMetricsData,
  57. }}
  58. >
  59. {children}
  60. </MetricsSwitchContext.Provider>
  61. );
  62. }
  63. function useMetricsSwitch() {
  64. const contextValue = useContext(MetricsSwitchContext);
  65. return contextValue;
  66. }
  67. export {MetricsSwitch, MetricsSwitchContextContainer, useMetricsSwitch};