index.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import styled from '@emotion/styled';
  2. import ExternalLink from 'sentry/components/links/externalLink';
  3. import {IconOpen} from 'sentry/icons';
  4. import space from 'sentry/styles/space';
  5. import effectiveDirectives from './effectiveDirectives';
  6. type EffectiveDirective = keyof typeof effectiveDirectives;
  7. const linkOverrides = {'script-src': 'script-src_2'};
  8. type Props = {
  9. data: {
  10. effective_directive: EffectiveDirective;
  11. };
  12. };
  13. const CSPHelp = ({data: {effective_directive: key}}: Props) => {
  14. const getHelp = () => ({
  15. __html: effectiveDirectives[key],
  16. });
  17. const getLinkHref = () => {
  18. const baseLink =
  19. 'https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives#';
  20. if (key in linkOverrides) {
  21. return `${baseLink}${linkOverrides[key]}`;
  22. }
  23. return `${baseLink}${key}`;
  24. };
  25. const getLink = () => {
  26. const href = getLinkHref();
  27. return (
  28. <StyledExternalLink href={href}>
  29. {'developer.mozilla.org'}
  30. <IconOpen size="xs" className="external-icon" />
  31. </StyledExternalLink>
  32. );
  33. };
  34. return (
  35. <div>
  36. <h4>
  37. <code>{key}</code>
  38. </h4>
  39. <blockquote dangerouslySetInnerHTML={getHelp()} />
  40. <StyledP>
  41. <span>{'\u2014 MDN ('}</span>
  42. <span>{getLink()}</span>
  43. <span>{')'}</span>
  44. </StyledP>
  45. </div>
  46. );
  47. };
  48. export default CSPHelp;
  49. const StyledP = styled('p')`
  50. text-align: right;
  51. display: grid;
  52. grid-template-columns: repeat(3, max-content);
  53. gap: ${space(0.25)};
  54. `;
  55. const StyledExternalLink = styled(ExternalLink)`
  56. display: inline-flex;
  57. align-items: center;
  58. `;