label.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { orderBy } from 'lodash'
  2. import {
  3. LoadedLabel,
  4. Label,
  5. PseudoCurrentStateLabel,
  6. } from '../services/types/label'
  7. import { Nullable } from '../../../../../types/utils'
  8. export const isPseudoLabel = (
  9. label: LoadedLabel
  10. ): label is PseudoCurrentStateLabel => {
  11. return (label as PseudoCurrentStateLabel).isPseudoCurrentStateLabel === true
  12. }
  13. const sortLabelsByVersionAndDate = (labels: LoadedLabel[]) => {
  14. return orderBy(
  15. labels,
  16. ['isPseudoCurrentStateLabel', 'version', 'created_at'],
  17. ['asc', 'desc', 'desc']
  18. )
  19. }
  20. const deletePseudoCurrentStateLabelIfExistent = (labels: LoadedLabel[]) => {
  21. if (labels.length && isPseudoLabel(labels[0])) {
  22. const [, ...rest] = labels
  23. return rest
  24. }
  25. return labels
  26. }
  27. const addPseudoCurrentStateLabelIfNeeded = (
  28. labels: LoadedLabel[],
  29. mostRecentVersion: Nullable<number>
  30. ) => {
  31. if (!labels.length || labels[0].version !== mostRecentVersion) {
  32. const pseudoCurrentStateLabel: PseudoCurrentStateLabel = {
  33. id: '1',
  34. isPseudoCurrentStateLabel: true,
  35. version: mostRecentVersion,
  36. created_at: new Date().toISOString(),
  37. }
  38. return [pseudoCurrentStateLabel, ...labels]
  39. }
  40. return labels
  41. }
  42. export const loadLabels = (
  43. labels: Label[],
  44. lastUpdateToV: Nullable<number>
  45. ) => {
  46. const sortedLabels = sortLabelsByVersionAndDate(labels)
  47. const labelsWithoutPseudoLabel =
  48. deletePseudoCurrentStateLabelIfExistent(sortedLabels)
  49. const labelsWithPseudoLabelIfNeeded = addPseudoCurrentStateLabelIfNeeded(
  50. labelsWithoutPseudoLabel,
  51. lastUpdateToV
  52. )
  53. return labelsWithPseudoLabelIfNeeded
  54. }