@smvtech/x-flux 1.1.12 → 1.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -5499,16 +5499,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
5499
5499
  declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
5500
5500
  declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
5501
5501
  declare function getValidationErrors(validations?: TAnswer["validations"] | null): ValidationResult;
5502
- declare function getValidationResult(question: TEDCApplicant["questions"][0]): ValidationResult;
5503
- declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[]): Array<{
5502
+ declare function getValidationResult(question: TEDCApplicant["questions"][0], applicants?: Record<string, TEDCApplicant>): ValidationResult;
5503
+ declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
5504
5504
  name: string;
5505
5505
  validationResult: ValidationResult;
5506
5506
  }>;
5507
- declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
5507
+ declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
5508
5508
  name: string;
5509
5509
  validationResult: ValidationResult;
5510
5510
  }>;
5511
- declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
5511
+ declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): {
5512
5512
  isComplete: boolean;
5513
5513
  questionValidations: Array<{
5514
5514
  name: string;
package/dist/index.d.ts CHANGED
@@ -5499,16 +5499,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
5499
5499
  declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
5500
5500
  declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
5501
5501
  declare function getValidationErrors(validations?: TAnswer["validations"] | null): ValidationResult;
5502
- declare function getValidationResult(question: TEDCApplicant["questions"][0]): ValidationResult;
5503
- declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[]): Array<{
5502
+ declare function getValidationResult(question: TEDCApplicant["questions"][0], applicants?: Record<string, TEDCApplicant>): ValidationResult;
5503
+ declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
5504
5504
  name: string;
5505
5505
  validationResult: ValidationResult;
5506
5506
  }>;
5507
- declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
5507
+ declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
5508
5508
  name: string;
5509
5509
  validationResult: ValidationResult;
5510
5510
  }>;
5511
- declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
5511
+ declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): {
5512
5512
  isComplete: boolean;
5513
5513
  questionValidations: Array<{
5514
5514
  name: string;
package/dist/index.js CHANGED
@@ -558,6 +558,11 @@ var extractDefaultAnswer = (value) => {
558
558
  const match = value.match(/^\{\{.*\}\}$/);
559
559
  return match ? match[0] : null;
560
560
  };
561
+ var isDynamicApplicantAnswerEmpty = (answer, applicants) => {
562
+ const match = answer.match(/^app_id_(.+)$/);
563
+ if (!match) return false;
564
+ return !(match[1] in applicants);
565
+ };
561
566
  function getDisplayableQuestions(questions, questionAnswerSources) {
562
567
  return questions.filter((q) => {
563
568
  if (q.question.type === "DOCUMENT" /* DOCUMENT */) return false;
@@ -621,7 +626,7 @@ function getValidationErrors(validations) {
621
626
  totalTimeSaved
622
627
  };
623
628
  }
624
- function getValidationResult(question) {
629
+ function getValidationResult(question, applicants = {}) {
625
630
  const backendResult = getValidationErrors(question.answer_data?.validations);
626
631
  if (backendResult && backendResult.status !== "PERFECT" /* PERFECT */) {
627
632
  return backendResult;
@@ -630,7 +635,7 @@ function getValidationResult(question) {
630
635
  const isDocument = question.question.type === "DOCUMENT" /* DOCUMENT */;
631
636
  const hasApproved = question.answer_data?.assets_id?.find((asset) => asset.status === "APPROVED");
632
637
  const answer = question.answer_data?.answer?.[0];
633
- const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null;
638
+ const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null || isDynamicApplicantAnswerEmpty(answer, applicants);
634
639
  if (isDocument && !hasApproved || !isDocument && isAnswerEmpty) {
635
640
  const answerRequiredItem = {
636
641
  error_text: isDocument ? "Please upload the required document" : "Answer cannot be empty",
@@ -655,11 +660,11 @@ function getValidationResult(question) {
655
660
  totalTimeSaved: 0
656
661
  };
657
662
  }
658
- function validateApplicantQuestions(applicant, questionAnswerSources) {
663
+ function validateApplicantQuestions(applicant, questionAnswerSources, applicants = {}) {
659
664
  const displayableQuestions = getDisplayableQuestions(applicant.questions, questionAnswerSources);
660
665
  const questionValidations = [];
661
666
  displayableQuestions.forEach((question) => {
662
- const validationResult = getValidationResult(question);
667
+ const validationResult = getValidationResult(question, applicants);
663
668
  if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
664
669
  questionValidations.push({
665
670
  name: question.question.question,
@@ -669,11 +674,11 @@ function validateApplicantQuestions(applicant, questionAnswerSources) {
669
674
  });
670
675
  return questionValidations;
671
676
  }
672
- function validateApplicantDocuments(applicant, documentAnswerSources) {
677
+ function validateApplicantDocuments(applicant, documentAnswerSources, applicants = {}) {
673
678
  const displayableDocuments = getDisplayableDocuments(applicant.questions, documentAnswerSources);
674
679
  const documentValidations = [];
675
680
  displayableDocuments.forEach((document) => {
676
- const validationResult = getValidationResult(document);
681
+ const validationResult = getValidationResult(document, applicants);
677
682
  if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
678
683
  documentValidations.push({
679
684
  name: document.question.question,
@@ -683,9 +688,9 @@ function validateApplicantDocuments(applicant, documentAnswerSources) {
683
688
  });
684
689
  return documentValidations;
685
690
  }
686
- function validateApplicant(applicant, questionAnswerSources, documentAnswerSources) {
687
- const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources);
688
- const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources);
691
+ function validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicants = {}) {
692
+ const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicants);
693
+ const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicants);
689
694
  const applicantValidations = getValidationErrors(applicant.application?.validations);
690
695
  const hasBlockingIssues = questionValidations.some((q) => q.validationResult?.status === "MISSING" /* MISSING */ || q.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || documentValidations.some((d) => d.validationResult?.status === "MISSING" /* MISSING */ || d.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || applicantValidations?.status === "UNFIXABLE" /* UNFIXABLE */;
691
696
  return {
@@ -697,9 +702,10 @@ function validateApplicant(applicant, questionAnswerSources, documentAnswerSourc
697
702
  }
698
703
  function validateAllApplicants(applicants, questionAnswerSources, documentAnswerSources) {
699
704
  const applicantsArray = Array.isArray(applicants) ? applicants : Object.values(applicants);
705
+ const applicantsRecord = Array.isArray(applicants) ? Object.fromEntries(applicants.map((a) => [a.application_id, a])) : applicants;
700
706
  const applicantValidations = [];
701
707
  applicantsArray.forEach((applicant) => {
702
- const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
708
+ const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantsRecord);
703
709
  if (!validation.isComplete) {
704
710
  const applicantName = getFullName(
705
711
  applicant.traveller.first_name,
@@ -1011,10 +1017,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
1011
1017
  [updatedAnswerData.docId]: updatedAnswerData.signedUrl
1012
1018
  }));
1013
1019
  }
1014
- if (question_type === "DOCUMENT" /* DOCUMENT */) {
1020
+ const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
1021
+ if (shouldRefresh) {
1015
1022
  await refreshApplicant(application_id);
1016
1023
  } else {
1017
- const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
1018
1024
  setApplicants((prev) => {
1019
1025
  const currentApplicant = prev[application_id];
1020
1026
  if (!currentApplicant) return prev;
@@ -1024,13 +1030,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
1024
1030
  updatedAnswerData.answers,
1025
1031
  questionnaire
1026
1032
  );
1027
- const updatedApplicants = { ...prev, [application_id]: applicantWithUpdatedAnswer };
1028
- if (shouldRecalculateSideEffects) {
1029
- const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
1030
- setQuestionnaire(updatedQuestionnaire);
1031
- return applicantsWithSideEffects;
1032
- }
1033
- return updatedApplicants;
1033
+ return { ...prev, [application_id]: applicantWithUpdatedAnswer };
1034
1034
  });
1035
1035
  }
1036
1036
  } catch (err) {
@@ -1038,7 +1038,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
1038
1038
  setError("Failed to update answer");
1039
1039
  }
1040
1040
  },
1041
- [questionnaire, refreshApplicant, order, dynamicQuestionMap]
1041
+ [questionnaire, refreshApplicant, order]
1042
1042
  );
1043
1043
  const applyAutoFix = react.useCallback(
1044
1044
  async (applicationId, answerId) => {
package/dist/index.mjs CHANGED
@@ -532,6 +532,11 @@ var extractDefaultAnswer = (value) => {
532
532
  const match = value.match(/^\{\{.*\}\}$/);
533
533
  return match ? match[0] : null;
534
534
  };
535
+ var isDynamicApplicantAnswerEmpty = (answer, applicants) => {
536
+ const match = answer.match(/^app_id_(.+)$/);
537
+ if (!match) return false;
538
+ return !(match[1] in applicants);
539
+ };
535
540
  function getDisplayableQuestions(questions, questionAnswerSources) {
536
541
  return questions.filter((q) => {
537
542
  if (q.question.type === "DOCUMENT" /* DOCUMENT */) return false;
@@ -595,7 +600,7 @@ function getValidationErrors(validations) {
595
600
  totalTimeSaved
596
601
  };
597
602
  }
598
- function getValidationResult(question) {
603
+ function getValidationResult(question, applicants = {}) {
599
604
  const backendResult = getValidationErrors(question.answer_data?.validations);
600
605
  if (backendResult && backendResult.status !== "PERFECT" /* PERFECT */) {
601
606
  return backendResult;
@@ -604,7 +609,7 @@ function getValidationResult(question) {
604
609
  const isDocument = question.question.type === "DOCUMENT" /* DOCUMENT */;
605
610
  const hasApproved = question.answer_data?.assets_id?.find((asset) => asset.status === "APPROVED");
606
611
  const answer = question.answer_data?.answer?.[0];
607
- const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null;
612
+ const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null || isDynamicApplicantAnswerEmpty(answer, applicants);
608
613
  if (isDocument && !hasApproved || !isDocument && isAnswerEmpty) {
609
614
  const answerRequiredItem = {
610
615
  error_text: isDocument ? "Please upload the required document" : "Answer cannot be empty",
@@ -629,11 +634,11 @@ function getValidationResult(question) {
629
634
  totalTimeSaved: 0
630
635
  };
631
636
  }
632
- function validateApplicantQuestions(applicant, questionAnswerSources) {
637
+ function validateApplicantQuestions(applicant, questionAnswerSources, applicants = {}) {
633
638
  const displayableQuestions = getDisplayableQuestions(applicant.questions, questionAnswerSources);
634
639
  const questionValidations = [];
635
640
  displayableQuestions.forEach((question) => {
636
- const validationResult = getValidationResult(question);
641
+ const validationResult = getValidationResult(question, applicants);
637
642
  if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
638
643
  questionValidations.push({
639
644
  name: question.question.question,
@@ -643,11 +648,11 @@ function validateApplicantQuestions(applicant, questionAnswerSources) {
643
648
  });
644
649
  return questionValidations;
645
650
  }
646
- function validateApplicantDocuments(applicant, documentAnswerSources) {
651
+ function validateApplicantDocuments(applicant, documentAnswerSources, applicants = {}) {
647
652
  const displayableDocuments = getDisplayableDocuments(applicant.questions, documentAnswerSources);
648
653
  const documentValidations = [];
649
654
  displayableDocuments.forEach((document) => {
650
- const validationResult = getValidationResult(document);
655
+ const validationResult = getValidationResult(document, applicants);
651
656
  if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
652
657
  documentValidations.push({
653
658
  name: document.question.question,
@@ -657,9 +662,9 @@ function validateApplicantDocuments(applicant, documentAnswerSources) {
657
662
  });
658
663
  return documentValidations;
659
664
  }
660
- function validateApplicant(applicant, questionAnswerSources, documentAnswerSources) {
661
- const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources);
662
- const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources);
665
+ function validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicants = {}) {
666
+ const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicants);
667
+ const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicants);
663
668
  const applicantValidations = getValidationErrors(applicant.application?.validations);
664
669
  const hasBlockingIssues = questionValidations.some((q) => q.validationResult?.status === "MISSING" /* MISSING */ || q.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || documentValidations.some((d) => d.validationResult?.status === "MISSING" /* MISSING */ || d.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || applicantValidations?.status === "UNFIXABLE" /* UNFIXABLE */;
665
670
  return {
@@ -671,9 +676,10 @@ function validateApplicant(applicant, questionAnswerSources, documentAnswerSourc
671
676
  }
672
677
  function validateAllApplicants(applicants, questionAnswerSources, documentAnswerSources) {
673
678
  const applicantsArray = Array.isArray(applicants) ? applicants : Object.values(applicants);
679
+ const applicantsRecord = Array.isArray(applicants) ? Object.fromEntries(applicants.map((a) => [a.application_id, a])) : applicants;
674
680
  const applicantValidations = [];
675
681
  applicantsArray.forEach((applicant) => {
676
- const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
682
+ const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantsRecord);
677
683
  if (!validation.isComplete) {
678
684
  const applicantName = getFullName(
679
685
  applicant.traveller.first_name,
@@ -985,10 +991,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
985
991
  [updatedAnswerData.docId]: updatedAnswerData.signedUrl
986
992
  }));
987
993
  }
988
- if (question_type === "DOCUMENT" /* DOCUMENT */) {
994
+ const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
995
+ if (shouldRefresh) {
989
996
  await refreshApplicant(application_id);
990
997
  } else {
991
- const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
992
998
  setApplicants((prev) => {
993
999
  const currentApplicant = prev[application_id];
994
1000
  if (!currentApplicant) return prev;
@@ -998,13 +1004,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
998
1004
  updatedAnswerData.answers,
999
1005
  questionnaire
1000
1006
  );
1001
- const updatedApplicants = { ...prev, [application_id]: applicantWithUpdatedAnswer };
1002
- if (shouldRecalculateSideEffects) {
1003
- const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
1004
- setQuestionnaire(updatedQuestionnaire);
1005
- return applicantsWithSideEffects;
1006
- }
1007
- return updatedApplicants;
1007
+ return { ...prev, [application_id]: applicantWithUpdatedAnswer };
1008
1008
  });
1009
1009
  }
1010
1010
  } catch (err) {
@@ -1012,7 +1012,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
1012
1012
  setError("Failed to update answer");
1013
1013
  }
1014
1014
  },
1015
- [questionnaire, refreshApplicant, order, dynamicQuestionMap]
1015
+ [questionnaire, refreshApplicant, order]
1016
1016
  );
1017
1017
  const applyAutoFix = useCallback(
1018
1018
  async (applicationId, answerId) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smvtech/x-flux",
3
- "version": "1.1.12",
3
+ "version": "1.1.13",
4
4
  "description": "x-flux - A powerful React package for managing effective document collection flows, visa questionnaires, travellers, and applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",