label.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { orderBy, groupBy } from 'lodash'
  2. import {
  3. LoadedLabel,
  4. Label,
  5. PseudoCurrentStateLabel,
  6. } from '../services/types/label'
  7. import { Nullable } from '../../../../../types/utils'
  8. import { Selection } from '../services/types/selection'
  9. import { Update } from '../services/types/update'
  10. export const isPseudoLabel = (
  11. label: LoadedLabel
  12. ): label is PseudoCurrentStateLabel => {
  13. return (label as PseudoCurrentStateLabel).isPseudoCurrentStateLabel === true
  14. }
  15. export const isLabel = (label: LoadedLabel): label is Label => {
  16. return !isPseudoLabel(label)
  17. }
  18. const sortLabelsByVersionAndDate = (labels: LoadedLabel[]) => {
  19. return orderBy(
  20. labels,
  21. ['isPseudoCurrentStateLabel', 'version', 'created_at'],
  22. ['asc', 'desc', 'desc']
  23. )
  24. }
  25. const deletePseudoCurrentStateLabelIfExistent = (labels: LoadedLabel[]) => {
  26. if (labels.length && isPseudoLabel(labels[0])) {
  27. const [, ...rest] = labels
  28. return rest
  29. }
  30. return labels
  31. }
  32. const addPseudoCurrentStateLabelIfNeeded = (
  33. labels: LoadedLabel[],
  34. mostRecentVersion: Nullable<number>
  35. ) => {
  36. if (!labels.length || labels[0].version !== mostRecentVersion) {
  37. const pseudoCurrentStateLabel: PseudoCurrentStateLabel = {
  38. id: '1',
  39. isPseudoCurrentStateLabel: true,
  40. version: mostRecentVersion,
  41. created_at: new Date().toISOString(),
  42. lastUpdatedTimestamp: null,
  43. }
  44. return [pseudoCurrentStateLabel, ...labels]
  45. }
  46. return labels
  47. }
  48. const addLastUpdatedTimestamp = (labels: LoadedLabel[], updates: Update[]) => {
  49. return labels.map(label => {
  50. const lastUpdatedTimestamp = updates.find(update =>
  51. update.labels.find(l => l.id === label.id)
  52. )?.meta.end_ts
  53. return {
  54. ...label,
  55. lastUpdatedTimestamp: lastUpdatedTimestamp || null,
  56. }
  57. })
  58. }
  59. export const loadLabels = (labels: Label[], updates: Update[]) => {
  60. const lastUpdateToV = updates.length ? updates[0].toV : null
  61. const sortedLabels = sortLabelsByVersionAndDate(labels)
  62. const labelsWithoutPseudoLabel =
  63. deletePseudoCurrentStateLabelIfExistent(sortedLabels)
  64. const labelsWithPseudoLabelIfNeeded = addPseudoCurrentStateLabelIfNeeded(
  65. labelsWithoutPseudoLabel,
  66. lastUpdateToV
  67. )
  68. const labelsWithLastUpdatedTimestamp = addLastUpdatedTimestamp(
  69. labelsWithPseudoLabelIfNeeded,
  70. updates
  71. )
  72. return labelsWithLastUpdatedTimestamp
  73. }
  74. export const getVersionWithLabels = (labels: Nullable<LoadedLabel[]>) => {
  75. let versionWithLabels: { version: number; labels: LoadedLabel[] }[] = []
  76. if (labels) {
  77. const groupedLabelsHash = groupBy(labels, 'version')
  78. versionWithLabels = Object.keys(groupedLabelsHash).map(key => ({
  79. version: parseInt(key, 10),
  80. labels: groupedLabelsHash[key],
  81. }))
  82. versionWithLabels = orderBy(versionWithLabels, ['version'], ['desc'])
  83. }
  84. return versionWithLabels
  85. }
  86. export const isAnyVersionMatchingSelection = (
  87. labels: Nullable<LoadedLabel[]>,
  88. selection: Selection
  89. ) => {
  90. // build an Array<number> of available versions
  91. const versions = getVersionWithLabels(labels).map(v => v.version)
  92. const selectedVersion = selection.updateRange?.toV
  93. return selectedVersion && !versions.includes(selectedVersion)
  94. }