sentryFunctionsEnvironmentVariables.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import styled from '@emotion/styled';
  2. import Button from 'sentry/components/button';
  3. import {InputField} from 'sentry/components/forms';
  4. import {PanelBody, PanelHeader} from 'sentry/components/panels';
  5. import {IconAdd, IconDelete} from 'sentry/icons';
  6. import {t, tct} from 'sentry/locale';
  7. import space from 'sentry/styles/space';
  8. type Props = {
  9. envVariables: {
  10. name: string;
  11. value: string;
  12. }[];
  13. setEnvVariables: (envVariables) => void;
  14. };
  15. function SentryFunctionEnvironmentVariables(props: Props) {
  16. const {envVariables, setEnvVariables} = props;
  17. const addEnvVar = () => {
  18. setEnvVariables([...envVariables, {name: '', value: ''}]);
  19. };
  20. const handleNameChange = (value: string, pos: number) => {
  21. const newEnvVariables = [...envVariables];
  22. while (newEnvVariables.length <= pos) {
  23. newEnvVariables.push({name: '', value: ''});
  24. }
  25. newEnvVariables[pos] = {...newEnvVariables[pos], name: value};
  26. setEnvVariables(newEnvVariables);
  27. };
  28. const handleValueChange = (value: string, pos: number) => {
  29. const newEnvVariables = [...envVariables];
  30. while (newEnvVariables.length <= pos) {
  31. newEnvVariables.push({name: '', value: ''});
  32. }
  33. newEnvVariables[pos] = {...newEnvVariables[pos], value};
  34. setEnvVariables(newEnvVariables);
  35. };
  36. const removeEnvVar = (pos: number) => {
  37. const newEnvVariables = [...envVariables];
  38. newEnvVariables.splice(pos, 1);
  39. setEnvVariables(newEnvVariables);
  40. };
  41. return (
  42. <div>
  43. <PanelHeader>
  44. {t('Environment Variables')}
  45. <StyledAddButton
  46. size="sm"
  47. type="button"
  48. icon={<IconAdd isCircled />}
  49. aria-label={t('Add Environment Variable')}
  50. onClick={addEnvVar}
  51. />
  52. </PanelHeader>
  53. <StyledPanelBody>
  54. <EnvironmentVariableWrapper>
  55. <EnvHeader>{t('Name')}</EnvHeader>
  56. <EnvHeaderRight>{t('Value')}</EnvHeaderRight>
  57. </EnvironmentVariableWrapper>
  58. {envVariables.map((envVariable, i) => {
  59. return (
  60. <EnvironmentVariableWrapper key={i}>
  61. <InputField
  62. name={`env-variable-name-${i}`}
  63. type="text"
  64. required={false}
  65. inline={false}
  66. defaultValue={envVariable.name}
  67. value={envVariable.name}
  68. stacked
  69. onChange={e => handleNameChange(e, i)}
  70. />
  71. <InputField
  72. name={`env-variable-value-${i}`}
  73. type="text"
  74. required={false}
  75. inline={false}
  76. defaultValue={envVariable.value}
  77. value={envVariable.value}
  78. stacked
  79. onChange={e => handleValueChange(e, i)}
  80. />
  81. <ButtonHolder>
  82. <StyledAddButton
  83. size="sm"
  84. icon={<IconDelete />}
  85. type="button"
  86. aria-label={tct('Remove Environment Variable [i]', {i})}
  87. onClick={() => removeEnvVar(i)}
  88. />
  89. </ButtonHolder>
  90. </EnvironmentVariableWrapper>
  91. );
  92. })}
  93. </StyledPanelBody>
  94. </div>
  95. );
  96. }
  97. export default SentryFunctionEnvironmentVariables;
  98. const EnvironmentVariableWrapper = styled('div')`
  99. display: grid;
  100. grid-template-columns: 1fr 1.5fr min-content;
  101. `;
  102. const StyledAddButton = styled(Button)`
  103. float: right;
  104. `;
  105. const EnvHeader = styled('div')`
  106. text-align: left;
  107. margin-top: ${space(2)};
  108. margin-bottom: ${space(1)};
  109. color: ${p => p.theme.gray400};
  110. `;
  111. const EnvHeaderRight = styled(EnvHeader)`
  112. margin-left: -${space(2)};
  113. `;
  114. const ButtonHolder = styled('div')`
  115. align-items: center;
  116. display: flex;
  117. margin-bottom: ${space(2)};
  118. `;
  119. const StyledPanelBody = styled(PanelBody)`
  120. padding: ${space(2)};
  121. `;