Skip to content

Commit

Permalink
refactor: use lodash isEqual instead of writing custom comparators, r…
Browse files Browse the repository at this point in the history
…enaming of variables
  • Loading branch information
justynoh committed Mar 25, 2024
1 parent 3e882c6 commit 721fd0a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 80 deletions.
95 changes: 17 additions & 78 deletions shared/utils/response-v3.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import _ from 'lodash'
import { BasicField, FieldResponseV3 } from '../types'

const areArraysEqual = <T>(
array1: T[],
array2: T[],
eq: (value1: T, value2: T) => boolean,
): boolean =>
array1.length === array2.length &&
array1.every((value1, i) => eq(value1, array2[i]))

export const areFieldResponseV3sEqual = (
response1: FieldResponseV3,
response2: FieldResponseV3,
export const isFieldResponseV3Equal = (
l: FieldResponseV3,
r: FieldResponseV3,
): boolean => {
if (response1.fieldType !== response2.fieldType) return false
if (l.fieldType !== r.fieldType) return false

switch (response1.fieldType) {
switch (l.fieldType) {
case BasicField.Number:
case BasicField.Decimal:
case BasicField.ShortText:
Expand All @@ -27,79 +20,25 @@ export const areFieldResponseV3sEqual = (
case BasicField.Date:
case BasicField.CountryRegion:
case BasicField.YesNo:
return response1.answer === response2.answer

case BasicField.Attachment: {
const response2Answer = response2.answer as typeof response1.answer
return (
response1.answer.answer === response2Answer.answer &&
response1.answer.hasBeenScanned === response2Answer.hasBeenScanned
)
}
case BasicField.Email:
case BasicField.Mobile: {
const response2Answer = response2.answer as typeof response1.answer
return (
response1.answer.value === response2Answer.value &&
response1.answer.signature === response2Answer.signature
)
}
case BasicField.Table: {
const response2Answer = response2.answer as typeof response1.answer
return areArraysEqual(
response1.answer,
response2Answer,
(row1, row2) =>
Object.keys(row1).length === Object.keys(row2).length &&
Object.keys(row1).every(
(columnId) => row1[columnId] === row2[columnId],
),
)
}
case BasicField.Radio: {
if ('value' in response1.answer) {
const response2Answer = response2.answer as typeof response1.answer
return response1.answer.value === response2Answer.value
} else {
const response2Answer = response2.answer as typeof response1.answer
return response1.answer.othersInput === response2Answer.othersInput
}
}
case BasicField.Checkbox: {
const response2Answer = response2.answer as typeof response1.answer
return (
areArraysEqual(
response1.answer.value,
response2Answer.value,
(value1, value2) => value1 === value2,
) && response1.answer.othersInput === response2Answer.othersInput
)
}
case BasicField.Children: {
const response2Answer = response2.answer as typeof response1.answer
case BasicField.Mobile:
case BasicField.Table:
case BasicField.Radio:
case BasicField.Checkbox:
case BasicField.Children:
return _.isEqual(l.answer, r.answer)
case BasicField.Attachment: {
const rAnswer = r.answer as typeof l.answer
return (
areArraysEqual(
response1.answer.child,
response2Answer.child,
(child1, child2) =>
areArraysEqual(
child1,
child2,
(value1, value2) => value1 === value2,
),
) &&
areArraysEqual(
response1.answer.childFields,
response2Answer.childFields,
(attr1, attr2) => attr1 === attr2,
)
l.answer.answer === rAnswer.answer &&
l.answer.hasBeenScanned === rAnswer.hasBeenScanned
)
}
case BasicField.Section:
return true
default: {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _: never = response1
const _: never = l
return false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
FormResponseMode,
SubmissionType,
} from '../../../../../shared/types'
import { areFieldResponseV3sEqual } from '../../../../../shared/utils/response-v3'
import { isFieldResponseV3Equal } from '../../../../../shared/utils/response-v3'
import { isDev } from '../../../../app/config/config'
import { ParsedClearAttachmentResponseV3 } from '../../../../types/api'
import { MultirespondentFormLoadedDto } from '../../../../types/api/multirespondent_submission'
Expand Down Expand Up @@ -447,7 +447,7 @@ export const validateMultirespondentSubmission = async (

return Result.combine(
nonEditableFieldIdsWithResponses.map((fieldId) =>
areFieldResponseV3sEqual(
isFieldResponseV3Equal(
req.body.responses[fieldId],
previousResponses[fieldId],
)
Expand Down

0 comments on commit 721fd0a

Please sign in to comment.