stepOne.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {Fragment} from 'react';
  2. import Alert from 'sentry/components/alert';
  3. import Textarea from 'sentry/components/forms/controls/textarea';
  4. import Field from 'sentry/components/forms/field';
  5. import Input from 'sentry/components/input';
  6. import ExternalLink from 'sentry/components/links/externalLink';
  7. import {t, tct} from 'sentry/locale';
  8. import {StepOneData} from './types';
  9. type Props = {
  10. onSetStepOneData: (stepOneData: StepOneData) => void;
  11. stepOneData: StepOneData;
  12. };
  13. function StepOne({stepOneData, onSetStepOneData}: Props) {
  14. return (
  15. <Fragment>
  16. <Alert type="info">
  17. {tct(
  18. 'Please enter the [docLink:App Store Connect API Key] details. The key needs to have the "Developer" role for Sentry to discover the app builds.',
  19. {
  20. docLink: (
  21. <ExternalLink href="https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api" />
  22. ),
  23. }
  24. )}
  25. </Alert>
  26. <Field
  27. label={t('Issuer')}
  28. inline={false}
  29. error={stepOneData.errors?.issuer}
  30. flexibleControlStateSize
  31. stacked
  32. required
  33. >
  34. <Input
  35. type="text"
  36. name="issuer"
  37. placeholder={t('Issuer')}
  38. value={stepOneData.issuer}
  39. onChange={e =>
  40. onSetStepOneData({
  41. ...stepOneData,
  42. issuer: e.target.value,
  43. errors: !!stepOneData.errors
  44. ? {...stepOneData.errors, issuer: undefined}
  45. : undefined,
  46. })
  47. }
  48. />
  49. </Field>
  50. <Field
  51. label={t('Key ID')}
  52. inline={false}
  53. error={stepOneData.errors?.keyId}
  54. flexibleControlStateSize
  55. stacked
  56. required
  57. >
  58. <Input
  59. type="text"
  60. name="keyId"
  61. placeholder={t('Key Id')}
  62. value={stepOneData.keyId}
  63. onChange={e =>
  64. onSetStepOneData({
  65. ...stepOneData,
  66. keyId: e.target.value,
  67. errors: !!stepOneData.errors
  68. ? {...stepOneData.errors, keyId: undefined}
  69. : undefined,
  70. })
  71. }
  72. />
  73. </Field>
  74. <Field
  75. label={t('Private Key')}
  76. inline={false}
  77. flexibleControlStateSize
  78. stacked
  79. required
  80. >
  81. <Textarea
  82. name="privateKey"
  83. value={stepOneData.privateKey}
  84. rows={5}
  85. autosize
  86. placeholder={
  87. stepOneData.privateKey === undefined
  88. ? t('(Private Key unchanged)')
  89. : '-----BEGIN PRIVATE KEY-----\n[PRIVATE-KEY]\n-----END PRIVATE KEY-----'
  90. }
  91. onChange={e =>
  92. onSetStepOneData({
  93. ...stepOneData,
  94. privateKey: e.target.value,
  95. })
  96. }
  97. />
  98. </Field>
  99. </Fragment>
  100. );
  101. }
  102. export default StepOne;