getDeviceKnownDataDetails.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import {DeviceName} from 'sentry/components/deviceName';
  2. import FileSize from 'sentry/components/fileSize';
  3. import {t} from 'sentry/locale';
  4. import {DeviceContext, DeviceContextKey, Event} from 'sentry/types/event';
  5. import {defined} from 'sentry/utils';
  6. import {getRelativeTimeFromEventDateCreated} from '../utils';
  7. import {formatMemory, formatStorage} from './utils';
  8. export const deviceKnownDataValues = [
  9. ...Object.values(DeviceContextKey),
  10. // Added two general keys here to namespace the values
  11. // tracks memory_size, free_memory, usable_memory
  12. 'memory',
  13. // tracks storage_size, free_storage, external_storage_size, external_free_storage
  14. 'storage',
  15. ];
  16. type Output = {
  17. subject: string;
  18. value?: React.ReactNode;
  19. };
  20. type Props = {
  21. data: DeviceContext;
  22. event: Event;
  23. type: (typeof deviceKnownDataValues)[number];
  24. };
  25. export function getDeviceKnownDataDetails({
  26. data,
  27. event,
  28. type,
  29. }: Props): Output | undefined {
  30. switch (type) {
  31. case DeviceContextKey.NAME:
  32. return {
  33. subject: t('Name'),
  34. value: data.name,
  35. };
  36. case DeviceContextKey.FAMILY:
  37. return {
  38. subject: t('Family'),
  39. value: data.family,
  40. };
  41. case DeviceContextKey.MODEL_ID:
  42. return {
  43. subject: t('Model Id'),
  44. value: data.model_id,
  45. };
  46. case DeviceContextKey.MODEL:
  47. return {
  48. subject: t('Model'),
  49. value:
  50. typeof data.model === 'string' ? (
  51. <DeviceName
  52. value={`${data.model} ${data?.model_id ? `(${data.model_id})` : ''}`}
  53. />
  54. ) : undefined,
  55. };
  56. case DeviceContextKey.CPU_DESCRIPTION:
  57. return {
  58. subject: t('CPU Description'),
  59. value: data.cpu_description,
  60. };
  61. case DeviceContextKey.ARCH:
  62. return {
  63. subject: t('Architecture'),
  64. value: data.arch,
  65. };
  66. case DeviceContextKey.BATTERY_LEVEL:
  67. return {
  68. subject: t('Battery Level'),
  69. value: defined(data.battery_level) ? `${data.battery_level}%` : undefined,
  70. };
  71. case DeviceContextKey.BATTERY_STATUS:
  72. return {
  73. subject: t('Battery Status'),
  74. value: data.battery_status,
  75. };
  76. case DeviceContextKey.ORIENTATION:
  77. return {
  78. subject: t('Orientation'),
  79. value: data.orientation,
  80. };
  81. case 'memory':
  82. const {memory_size, free_memory, usable_memory} = data;
  83. return {
  84. subject: t('Memory'),
  85. value:
  86. memory_size && free_memory && usable_memory
  87. ? formatMemory(memory_size, free_memory, usable_memory)
  88. : undefined,
  89. };
  90. case 'storage':
  91. const {storage_size, free_storage, external_storage_size, external_free_storage} =
  92. data;
  93. return {
  94. subject: t('Capacity'),
  95. value:
  96. storage_size && free_storage && external_storage_size && external_free_storage
  97. ? formatStorage(
  98. storage_size,
  99. free_storage,
  100. external_storage_size,
  101. external_free_storage
  102. )
  103. : undefined,
  104. };
  105. case DeviceContextKey.FREE_STORAGE: {
  106. return {
  107. subject: t('Free Storage'),
  108. value: data.free_storage ? <FileSize bytes={data.free_storage} /> : undefined,
  109. };
  110. }
  111. case DeviceContextKey.STORAGE_SIZE: {
  112. return {
  113. subject: t('Storage Size'),
  114. value: data.storage_size ? <FileSize bytes={data.storage_size} /> : undefined,
  115. };
  116. }
  117. case DeviceContextKey.EXTERNAL_STORAGE_SIZE: {
  118. return {
  119. subject: t('External Storage Size'),
  120. value: data.external_storage_size ? (
  121. <FileSize bytes={data.external_storage_size} />
  122. ) : undefined,
  123. };
  124. }
  125. case DeviceContextKey.EXTERNAL_FREE_STORAGE: {
  126. return {
  127. subject: t('External Free Storage'),
  128. value: data.external_free_storage ? (
  129. <FileSize bytes={data.external_free_storage} />
  130. ) : undefined,
  131. };
  132. }
  133. case DeviceContextKey.SIMULATOR:
  134. return {
  135. subject: t('Simulator'),
  136. value: data.simulator,
  137. };
  138. case DeviceContextKey.BOOT_TIME:
  139. return {
  140. subject: t('Boot Time'),
  141. value: getRelativeTimeFromEventDateCreated(
  142. event.dateCreated ? event.dateCreated : event.dateReceived,
  143. data.boot_time
  144. ),
  145. };
  146. case DeviceContextKey.DEVICE_TYPE:
  147. return {
  148. subject: t('Device Type'),
  149. value: data.device_type,
  150. };
  151. case DeviceContextKey.BRAND:
  152. return {
  153. subject: t('Brand'),
  154. value: data.brand,
  155. };
  156. case DeviceContextKey.CHARGING:
  157. return {
  158. subject: t('Charging'),
  159. value: data.charging,
  160. };
  161. case DeviceContextKey.LOW_MEMORY:
  162. return {
  163. subject: t('Low Memory'),
  164. value: data.low_memory,
  165. };
  166. case DeviceContextKey.FREE_MEMORY:
  167. return {
  168. subject: t('Free Memory'),
  169. value: data.free_memory ? <FileSize bytes={data.free_memory} /> : undefined,
  170. };
  171. case DeviceContextKey.MEMORY_SIZE:
  172. return {
  173. subject: t('Memory Size'),
  174. value: data.memory_size ? <FileSize bytes={data.memory_size} /> : undefined,
  175. };
  176. case DeviceContextKey.USABLE_MEMORY:
  177. return {
  178. subject: t('Usable Memory'),
  179. value: data.usable_memory ? <FileSize bytes={data.usable_memory} /> : undefined,
  180. };
  181. case DeviceContextKey.MANUFACTURER:
  182. return {
  183. subject: t('Manufacturer'),
  184. value: data.manufacturer,
  185. };
  186. case DeviceContextKey.ONLINE:
  187. return {
  188. subject: t('Online'),
  189. value: data.online,
  190. };
  191. case DeviceContextKey.SCREEN_DENSITY:
  192. return {
  193. subject: t('Screen Density'),
  194. value: data.screen_density,
  195. };
  196. case DeviceContextKey.SCREEN_DPI:
  197. return {
  198. subject: t('Screen DPI'),
  199. value: data.screen_dpi,
  200. };
  201. case DeviceContextKey.SCREEN_HEIGHT_PIXELS:
  202. return {
  203. subject: t('Screen Height Pixels'),
  204. value: data.screen_height_pixels,
  205. };
  206. case DeviceContextKey.SCREEN_RESOLUTION:
  207. return {
  208. subject: t('Screen Resolution'),
  209. value: data.screen_resolution,
  210. };
  211. case DeviceContextKey.SCREEN_WIDTH_PIXELS:
  212. return {
  213. subject: t('Screen Width Pixels'),
  214. value: data.screen_width_pixels,
  215. };
  216. default:
  217. return undefined;
  218. }
  219. }