index.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import upperFirst from 'lodash/upperFirst';
  2. import ClippedBox from 'sentry/components/clippedBox';
  3. import ContextBlock from 'sentry/components/events/contexts/contextBlock';
  4. import {getContextMeta} from 'sentry/components/events/contexts/utils';
  5. import {t} from 'sentry/locale';
  6. import type {Event, KeyValueListData, KeyValueListDataItem} from 'sentry/types';
  7. type StateDescription = {
  8. value: Record<string, any> | null | string;
  9. type?: string;
  10. };
  11. type Props = {
  12. data: {
  13. [state: string]: StateDescription;
  14. state: StateDescription;
  15. };
  16. event: Event;
  17. meta?: Record<string, any>;
  18. };
  19. function getStateTitle(name: string, type?: string) {
  20. return `${name}${type ? ` (${upperFirst(type)})` : ''}`;
  21. }
  22. export function getKnownStateContextData({
  23. data,
  24. meta,
  25. }: Pick<Props, 'data' | 'meta'>): KeyValueListData {
  26. if (!data.state) {
  27. return [];
  28. }
  29. return [
  30. {
  31. key: 'state',
  32. subject: getStateTitle(t('State'), data.state.type),
  33. // TODO(TS): Objects cannot be rendered to dom
  34. value: data.state.value as string,
  35. meta: meta?.state?.value?.[''],
  36. },
  37. ];
  38. }
  39. export function getUnknownStateContextData({
  40. data,
  41. meta = {},
  42. }: Pick<Props, 'data' | 'meta'>): KeyValueListData {
  43. return Object.entries(data)
  44. .filter(([key]) => !['type', 'title', 'state'].includes(key))
  45. .map<KeyValueListDataItem>(([name, state]) => ({
  46. key: name,
  47. // TODO(TS): Objects cannot be rendered to dom
  48. value: state.value as string,
  49. subject: getStateTitle(name, state.type),
  50. meta: meta[name]?.value?.[''],
  51. }));
  52. }
  53. export function StateEventContext({data, event, meta: propsMeta}: Props) {
  54. const meta = propsMeta ?? getContextMeta(event, 'state');
  55. const knownData = getKnownStateContextData({data, meta});
  56. const unknownData = getUnknownStateContextData({data, meta});
  57. return (
  58. <ClippedBox clipHeight={250}>
  59. <ContextBlock data={knownData} />
  60. <ContextBlock data={unknownData} />
  61. </ClippedBox>
  62. );
  63. }