123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import {Fragment} from 'react';
- import styled from '@emotion/styled';
- import ExternalLink from 'sentry/components/links/externalLink';
- import List from 'sentry/components/list';
- import ListItem from 'sentry/components/list/listItem';
- import {t, tct} from 'sentry/locale';
- import space from 'sentry/styles/space';
- import {UpdateSdkSuggestion} from 'sentry/types';
- import {Event} from 'sentry/types/event';
- type Props = {
- sdk: Event['sdk'];
- suggestion: NonNullable<Event['sdkUpdates']>[0];
- capitalized?: boolean;
- shortStyle?: boolean;
- };
- function getSdkUpdateSuggestion({
- sdk,
- suggestion,
- shortStyle = false,
- capitalized = false,
- }: Props) {
- function getUpdateSdkContent({newSdkVersion, sdkName}: UpdateSdkSuggestion) {
- if (capitalized) {
- return sdk
- ? shortStyle
- ? tct('Update to [sdk-name]@v[new-sdk-version]', {
- 'sdk-name': sdkName,
- 'new-sdk-version': newSdkVersion,
- })
- : tct(
- 'Update your SDK from [sdk-name]@v[sdk-version] to [sdk-name]@v[new-sdk-version]',
- {
- 'sdk-name': sdkName,
- 'sdk-version': sdk.version,
- 'new-sdk-version': newSdkVersion,
- }
- )
- : t('Update your SDK version');
- }
- return sdk
- ? shortStyle
- ? tct('update to [sdk-name]@v[new-sdk-version]', {
- 'sdk-name': sdkName,
- 'new-sdk-version': newSdkVersion,
- })
- : tct(
- 'update your SDK from [sdk-name]@v[sdk-version] to [sdk-name]@v[new-sdk-version]',
- {
- 'sdk-name': sdkName,
- 'sdk-version': sdk.version,
- 'new-sdk-version': newSdkVersion,
- }
- )
- : t('update your SDK version');
- }
- const getTitleData = () => {
- switch (suggestion.type) {
- case 'updateSdk':
- return {
- href: suggestion?.sdkUrl,
- content: getUpdateSdkContent(suggestion),
- };
- case 'changeSdk':
- return {
- href: suggestion?.sdkUrl,
- content: capitalized
- ? tct('Migrate to [recommended-sdk-version]', {
- 'recommended-sdk-version': suggestion.newSdkName,
- })
- : tct('migrate to [recommended-sdk-version]', {
- 'recommended-sdk-version': suggestion.newSdkName,
- }),
- };
- case 'enableIntegration':
- return {
- href: suggestion?.integrationUrl,
- content: capitalized
- ? tct('Enable the [recommended-integration-name]', {
- 'recommended-integration-name': suggestion.integrationName,
- })
- : tct('enable the [recommended-integration-name] integration', {
- 'recommended-integration-name': suggestion.integrationName,
- }),
- };
- default:
- return null;
- }
- };
- const getTitle = () => {
- const titleData = getTitleData();
- if (!titleData) {
- return null;
- }
- const {href, content} = titleData;
- if (!href) {
- return content;
- }
- return <ExternalLink href={href}>{content}</ExternalLink>;
- };
- const title = <Fragment>{getTitle()}</Fragment>;
- if (!suggestion.enables.length) {
- return title;
- }
- const alertContent = suggestion.enables
- .map((subSuggestion, index) => {
- const subSuggestionContent = getSdkUpdateSuggestion({
- suggestion: subSuggestion,
- sdk,
- capitalized,
- });
- if (!subSuggestionContent) {
- return null;
- }
- return <ListItem key={index}>{subSuggestionContent}</ListItem>;
- })
- .filter(content => !!content);
- if (!alertContent.length) {
- return title;
- }
- return (
- <span>
- {tct('[title] so you can:', {title})}
- <StyledList symbol="bullet">{alertContent}</StyledList>
- </span>
- );
- }
- export default getSdkUpdateSuggestion;
- const StyledList = styled(List)`
- margin-top: ${space(1)};
- `;
|