label.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. export const isPseudoLabel = (
  10. label: LoadedLabel
  11. ): label is PseudoCurrentStateLabel => {
  12. return (label as PseudoCurrentStateLabel).isPseudoCurrentStateLabel === true
  13. }
  14. export const isLabel = (label: LoadedLabel): label is Label => {
  15. return !isPseudoLabel(label)
  16. }
  17. const sortLabelsByVersionAndDate = (labels: LoadedLabel[]) => {
  18. return orderBy(
  19. labels,
  20. ['isPseudoCurrentStateLabel', 'version', 'created_at'],
  21. ['asc', 'desc', 'desc']
  22. )
  23. }
  24. const deletePseudoCurrentStateLabelIfExistent = (labels: LoadedLabel[]) => {
  25. if (labels.length && isPseudoLabel(labels[0])) {
  26. const [, ...rest] = labels
  27. return rest
  28. }
  29. return labels
  30. }
  31. const addPseudoCurrentStateLabelIfNeeded = (
  32. labels: LoadedLabel[],
  33. mostRecentVersion: Nullable<number>
  34. ) => {
  35. if (!labels.length || labels[0].version !== mostRecentVersion) {
  36. const pseudoCurrentStateLabel: PseudoCurrentStateLabel = {
  37. id: '1',
  38. isPseudoCurrentStateLabel: true,
  39. version: mostRecentVersion,
  40. created_at: new Date().toISOString(),
  41. }
  42. return [pseudoCurrentStateLabel, ...labels]
  43. }
  44. return labels
  45. }
  46. export const loadLabels = (
  47. labels: Label[],
  48. lastUpdateToV: Nullable<number>
  49. ) => {
  50. const sortedLabels = sortLabelsByVersionAndDate(labels)
  51. const labelsWithoutPseudoLabel =
  52. deletePseudoCurrentStateLabelIfExistent(sortedLabels)
  53. const labelsWithPseudoLabelIfNeeded = addPseudoCurrentStateLabelIfNeeded(
  54. labelsWithoutPseudoLabel,
  55. lastUpdateToV
  56. )
  57. return labelsWithPseudoLabelIfNeeded
  58. }
  59. export const getVersionWithLabels = (labels: Nullable<LoadedLabel[]>) => {
  60. let versionWithLabels: { version: number; labels: LoadedLabel[] }[] = []
  61. if (labels) {
  62. const groupedLabelsHash = groupBy(labels, 'version')
  63. versionWithLabels = Object.keys(groupedLabelsHash).map(key => ({
  64. version: parseInt(key, 10),
  65. labels: groupedLabelsHash[key],
  66. }))
  67. versionWithLabels = orderBy(versionWithLabels, ['version'], ['desc'])
  68. }
  69. return versionWithLabels
  70. }
  71. export const isAnyVersionMatchingSelection = (
  72. labels: Nullable<LoadedLabel[]>,
  73. selection: Selection
  74. ) => {
  75. // build an Array<number> of available versions
  76. const versions = getVersionWithLabels(labels).map(v => v.version)
  77. const selectedVersion = selection.updateRange?.toV
  78. return selectedVersion && !versions.includes(selectedVersion)
  79. }