@smvtech/x-flux 1.1.12 → 1.1.14
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 +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +38 -27
- package/dist/index.mjs +38 -27
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -5465,6 +5465,7 @@ type TEDCFlowContext = {
|
|
|
5465
5465
|
order: TVisaOrder | null;
|
|
5466
5466
|
questionnaire: TQuestionnaire | null;
|
|
5467
5467
|
applicants: Record<string, TEDCApplicant>;
|
|
5468
|
+
applicantIds: Set<string>;
|
|
5468
5469
|
activeApplicant: string | null;
|
|
5469
5470
|
setActiveApplicant: (application_id: string | null) => void;
|
|
5470
5471
|
loading: boolean;
|
|
@@ -5499,16 +5500,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
|
|
|
5499
5500
|
declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5500
5501
|
declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5501
5502
|
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<{
|
|
5503
|
+
declare function getValidationResult(question: TEDCApplicant["questions"][0], applicantIds: Set<string>): ValidationResult;
|
|
5504
|
+
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): Array<{
|
|
5504
5505
|
name: string;
|
|
5505
5506
|
validationResult: ValidationResult;
|
|
5506
5507
|
}>;
|
|
5507
|
-
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5508
|
+
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): Array<{
|
|
5508
5509
|
name: string;
|
|
5509
5510
|
validationResult: ValidationResult;
|
|
5510
5511
|
}>;
|
|
5511
|
-
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
|
|
5512
|
+
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): {
|
|
5512
5513
|
isComplete: boolean;
|
|
5513
5514
|
questionValidations: Array<{
|
|
5514
5515
|
name: string;
|
|
@@ -5567,6 +5568,7 @@ declare const EDCFlow: {
|
|
|
5567
5568
|
order: TVisaOrder | null;
|
|
5568
5569
|
questionnaire: TQuestionnaire | null;
|
|
5569
5570
|
applicants: Record<string, TEDCApplicant>;
|
|
5571
|
+
applicantIds: Set<string>;
|
|
5570
5572
|
activeApplicant: string | null;
|
|
5571
5573
|
setActiveApplicant: (application_id: string | null) => void;
|
|
5572
5574
|
loading: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -5465,6 +5465,7 @@ type TEDCFlowContext = {
|
|
|
5465
5465
|
order: TVisaOrder | null;
|
|
5466
5466
|
questionnaire: TQuestionnaire | null;
|
|
5467
5467
|
applicants: Record<string, TEDCApplicant>;
|
|
5468
|
+
applicantIds: Set<string>;
|
|
5468
5469
|
activeApplicant: string | null;
|
|
5469
5470
|
setActiveApplicant: (application_id: string | null) => void;
|
|
5470
5471
|
loading: boolean;
|
|
@@ -5499,16 +5500,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
|
|
|
5499
5500
|
declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5500
5501
|
declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5501
5502
|
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<{
|
|
5503
|
+
declare function getValidationResult(question: TEDCApplicant["questions"][0], applicantIds: Set<string>): ValidationResult;
|
|
5504
|
+
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): Array<{
|
|
5504
5505
|
name: string;
|
|
5505
5506
|
validationResult: ValidationResult;
|
|
5506
5507
|
}>;
|
|
5507
|
-
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5508
|
+
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): Array<{
|
|
5508
5509
|
name: string;
|
|
5509
5510
|
validationResult: ValidationResult;
|
|
5510
5511
|
}>;
|
|
5511
|
-
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
|
|
5512
|
+
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicantIds: Set<string>): {
|
|
5512
5513
|
isComplete: boolean;
|
|
5513
5514
|
questionValidations: Array<{
|
|
5514
5515
|
name: string;
|
|
@@ -5567,6 +5568,7 @@ declare const EDCFlow: {
|
|
|
5567
5568
|
order: TVisaOrder | null;
|
|
5568
5569
|
questionnaire: TQuestionnaire | null;
|
|
5569
5570
|
applicants: Record<string, TEDCApplicant>;
|
|
5571
|
+
applicantIds: Set<string>;
|
|
5570
5572
|
activeApplicant: string | null;
|
|
5571
5573
|
setActiveApplicant: (application_id: string | null) => void;
|
|
5572
5574
|
loading: boolean;
|
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, applicantIds) => {
|
|
562
|
+
const match = answer.match(/^app_id_(.+)$/);
|
|
563
|
+
if (!match) return false;
|
|
564
|
+
return !applicantIds.has(match[1]);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
692
|
+
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicantIds);
|
|
693
|
+
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicantIds);
|
|
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,12 @@ 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 applicantIds = new Set(
|
|
706
|
+
Array.isArray(applicants) ? applicants.map((a) => a.application_id) : Object.keys(applicants)
|
|
707
|
+
);
|
|
700
708
|
const applicantValidations = [];
|
|
701
709
|
applicantsArray.forEach((applicant) => {
|
|
702
|
-
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
|
|
710
|
+
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantIds);
|
|
703
711
|
if (!validation.isComplete) {
|
|
704
712
|
const applicantName = getFullName(
|
|
705
713
|
applicant.traveller.first_name,
|
|
@@ -886,6 +894,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
886
894
|
const [questionnaire, setQuestionnaire] = react.useState(null);
|
|
887
895
|
const [dynamicQuestionMap, setDynamicQuestionMap] = react.useState({});
|
|
888
896
|
const [applicants, setApplicants] = react.useState({});
|
|
897
|
+
const [applicantIds, setApplicantIds] = react.useState(/* @__PURE__ */ new Set());
|
|
889
898
|
const [activeApplicant, setActiveApplicant] = react.useState(null);
|
|
890
899
|
const [loading, setLoading] = react.useState(true);
|
|
891
900
|
const [error, setError] = react.useState(null);
|
|
@@ -958,6 +967,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
958
967
|
setQuestionnaire(updatedQuestionnaire);
|
|
959
968
|
return applicantsWithSideEffects;
|
|
960
969
|
});
|
|
970
|
+
setApplicantIds((prev) => /* @__PURE__ */ new Set([...prev, applicant.application_id]));
|
|
961
971
|
setActiveApplicant(applicant.application_id);
|
|
962
972
|
setSuccess("Traveller added and Applicant created");
|
|
963
973
|
return applicant;
|
|
@@ -1011,10 +1021,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1011
1021
|
[updatedAnswerData.docId]: updatedAnswerData.signedUrl
|
|
1012
1022
|
}));
|
|
1013
1023
|
}
|
|
1014
|
-
|
|
1024
|
+
const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
|
|
1025
|
+
if (shouldRefresh) {
|
|
1015
1026
|
await refreshApplicant(application_id);
|
|
1016
1027
|
} else {
|
|
1017
|
-
const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
|
|
1018
1028
|
setApplicants((prev) => {
|
|
1019
1029
|
const currentApplicant = prev[application_id];
|
|
1020
1030
|
if (!currentApplicant) return prev;
|
|
@@ -1024,13 +1034,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1024
1034
|
updatedAnswerData.answers,
|
|
1025
1035
|
questionnaire
|
|
1026
1036
|
);
|
|
1027
|
-
|
|
1028
|
-
if (shouldRecalculateSideEffects) {
|
|
1029
|
-
const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
|
|
1030
|
-
setQuestionnaire(updatedQuestionnaire);
|
|
1031
|
-
return applicantsWithSideEffects;
|
|
1032
|
-
}
|
|
1033
|
-
return updatedApplicants;
|
|
1037
|
+
return { ...prev, [application_id]: applicantWithUpdatedAnswer };
|
|
1034
1038
|
});
|
|
1035
1039
|
}
|
|
1036
1040
|
} catch (err) {
|
|
@@ -1038,7 +1042,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1038
1042
|
setError("Failed to update answer");
|
|
1039
1043
|
}
|
|
1040
1044
|
},
|
|
1041
|
-
[questionnaire, refreshApplicant, order
|
|
1045
|
+
[questionnaire, refreshApplicant, order]
|
|
1042
1046
|
);
|
|
1043
1047
|
const applyAutoFix = react.useCallback(
|
|
1044
1048
|
async (applicationId, answerId) => {
|
|
@@ -1079,6 +1083,11 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1079
1083
|
});
|
|
1080
1084
|
return applicantsWithSideEffects;
|
|
1081
1085
|
});
|
|
1086
|
+
setApplicantIds((prev) => {
|
|
1087
|
+
const next = new Set(prev);
|
|
1088
|
+
next.delete(application_id);
|
|
1089
|
+
return next;
|
|
1090
|
+
});
|
|
1082
1091
|
setSuccess("Applicant deleted successfully");
|
|
1083
1092
|
} catch (err) {
|
|
1084
1093
|
console.error("Failed to delete applicant:", err);
|
|
@@ -1144,12 +1153,12 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1144
1153
|
const { updatedQuestionnaire, updatedApplicants } = runApplicantSideEffects(applicants2, questionnaire, dynamicQuestionMap);
|
|
1145
1154
|
setQuestionnaire(updatedQuestionnaire);
|
|
1146
1155
|
setApplicants(updatedApplicants);
|
|
1147
|
-
const
|
|
1148
|
-
if (
|
|
1149
|
-
if (activeApplicant &&
|
|
1156
|
+
const applicantIds2 = Object.keys(updatedApplicants);
|
|
1157
|
+
if (applicantIds2.length > 0) {
|
|
1158
|
+
if (activeApplicant && applicantIds2.includes(activeApplicant)) {
|
|
1150
1159
|
setActiveApplicant(activeApplicant);
|
|
1151
1160
|
} else {
|
|
1152
|
-
setActiveApplicant(
|
|
1161
|
+
setActiveApplicant(applicantIds2[0]);
|
|
1153
1162
|
}
|
|
1154
1163
|
}
|
|
1155
1164
|
}
|
|
@@ -1209,9 +1218,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1209
1218
|
const { updatedQuestionnaire, updatedApplicants } = runApplicantSideEffects(applicants2, questionnaireData, dynamicMap);
|
|
1210
1219
|
setQuestionnaire(updatedQuestionnaire);
|
|
1211
1220
|
setApplicants(updatedApplicants);
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1221
|
+
setApplicantIds(new Set(Object.keys(updatedApplicants)));
|
|
1222
|
+
const ids = Object.keys(updatedApplicants);
|
|
1223
|
+
if (ids.length > 0) {
|
|
1224
|
+
setActiveApplicant(ids[0]);
|
|
1215
1225
|
}
|
|
1216
1226
|
}
|
|
1217
1227
|
} catch (err) {
|
|
@@ -1228,6 +1238,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1228
1238
|
order,
|
|
1229
1239
|
questionnaire,
|
|
1230
1240
|
applicants,
|
|
1241
|
+
applicantIds,
|
|
1231
1242
|
activeApplicant,
|
|
1232
1243
|
setActiveApplicant,
|
|
1233
1244
|
loading,
|
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, applicantIds) => {
|
|
536
|
+
const match = answer.match(/^app_id_(.+)$/);
|
|
537
|
+
if (!match) return false;
|
|
538
|
+
return !applicantIds.has(match[1]);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
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, applicantIds);
|
|
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, applicantIds) {
|
|
666
|
+
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicantIds);
|
|
667
|
+
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicantIds);
|
|
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,12 @@ 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 applicantIds = new Set(
|
|
680
|
+
Array.isArray(applicants) ? applicants.map((a) => a.application_id) : Object.keys(applicants)
|
|
681
|
+
);
|
|
674
682
|
const applicantValidations = [];
|
|
675
683
|
applicantsArray.forEach((applicant) => {
|
|
676
|
-
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
|
|
684
|
+
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantIds);
|
|
677
685
|
if (!validation.isComplete) {
|
|
678
686
|
const applicantName = getFullName(
|
|
679
687
|
applicant.traveller.first_name,
|
|
@@ -860,6 +868,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
860
868
|
const [questionnaire, setQuestionnaire] = useState(null);
|
|
861
869
|
const [dynamicQuestionMap, setDynamicQuestionMap] = useState({});
|
|
862
870
|
const [applicants, setApplicants] = useState({});
|
|
871
|
+
const [applicantIds, setApplicantIds] = useState(/* @__PURE__ */ new Set());
|
|
863
872
|
const [activeApplicant, setActiveApplicant] = useState(null);
|
|
864
873
|
const [loading, setLoading] = useState(true);
|
|
865
874
|
const [error, setError] = useState(null);
|
|
@@ -932,6 +941,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
932
941
|
setQuestionnaire(updatedQuestionnaire);
|
|
933
942
|
return applicantsWithSideEffects;
|
|
934
943
|
});
|
|
944
|
+
setApplicantIds((prev) => /* @__PURE__ */ new Set([...prev, applicant.application_id]));
|
|
935
945
|
setActiveApplicant(applicant.application_id);
|
|
936
946
|
setSuccess("Traveller added and Applicant created");
|
|
937
947
|
return applicant;
|
|
@@ -985,10 +995,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
985
995
|
[updatedAnswerData.docId]: updatedAnswerData.signedUrl
|
|
986
996
|
}));
|
|
987
997
|
}
|
|
988
|
-
|
|
998
|
+
const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
|
|
999
|
+
if (shouldRefresh) {
|
|
989
1000
|
await refreshApplicant(application_id);
|
|
990
1001
|
} else {
|
|
991
|
-
const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
|
|
992
1002
|
setApplicants((prev) => {
|
|
993
1003
|
const currentApplicant = prev[application_id];
|
|
994
1004
|
if (!currentApplicant) return prev;
|
|
@@ -998,13 +1008,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
998
1008
|
updatedAnswerData.answers,
|
|
999
1009
|
questionnaire
|
|
1000
1010
|
);
|
|
1001
|
-
|
|
1002
|
-
if (shouldRecalculateSideEffects) {
|
|
1003
|
-
const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
|
|
1004
|
-
setQuestionnaire(updatedQuestionnaire);
|
|
1005
|
-
return applicantsWithSideEffects;
|
|
1006
|
-
}
|
|
1007
|
-
return updatedApplicants;
|
|
1011
|
+
return { ...prev, [application_id]: applicantWithUpdatedAnswer };
|
|
1008
1012
|
});
|
|
1009
1013
|
}
|
|
1010
1014
|
} catch (err) {
|
|
@@ -1012,7 +1016,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1012
1016
|
setError("Failed to update answer");
|
|
1013
1017
|
}
|
|
1014
1018
|
},
|
|
1015
|
-
[questionnaire, refreshApplicant, order
|
|
1019
|
+
[questionnaire, refreshApplicant, order]
|
|
1016
1020
|
);
|
|
1017
1021
|
const applyAutoFix = useCallback(
|
|
1018
1022
|
async (applicationId, answerId) => {
|
|
@@ -1053,6 +1057,11 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1053
1057
|
});
|
|
1054
1058
|
return applicantsWithSideEffects;
|
|
1055
1059
|
});
|
|
1060
|
+
setApplicantIds((prev) => {
|
|
1061
|
+
const next = new Set(prev);
|
|
1062
|
+
next.delete(application_id);
|
|
1063
|
+
return next;
|
|
1064
|
+
});
|
|
1056
1065
|
setSuccess("Applicant deleted successfully");
|
|
1057
1066
|
} catch (err) {
|
|
1058
1067
|
console.error("Failed to delete applicant:", err);
|
|
@@ -1118,12 +1127,12 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1118
1127
|
const { updatedQuestionnaire, updatedApplicants } = runApplicantSideEffects(applicants2, questionnaire, dynamicQuestionMap);
|
|
1119
1128
|
setQuestionnaire(updatedQuestionnaire);
|
|
1120
1129
|
setApplicants(updatedApplicants);
|
|
1121
|
-
const
|
|
1122
|
-
if (
|
|
1123
|
-
if (activeApplicant &&
|
|
1130
|
+
const applicantIds2 = Object.keys(updatedApplicants);
|
|
1131
|
+
if (applicantIds2.length > 0) {
|
|
1132
|
+
if (activeApplicant && applicantIds2.includes(activeApplicant)) {
|
|
1124
1133
|
setActiveApplicant(activeApplicant);
|
|
1125
1134
|
} else {
|
|
1126
|
-
setActiveApplicant(
|
|
1135
|
+
setActiveApplicant(applicantIds2[0]);
|
|
1127
1136
|
}
|
|
1128
1137
|
}
|
|
1129
1138
|
}
|
|
@@ -1183,9 +1192,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1183
1192
|
const { updatedQuestionnaire, updatedApplicants } = runApplicantSideEffects(applicants2, questionnaireData, dynamicMap);
|
|
1184
1193
|
setQuestionnaire(updatedQuestionnaire);
|
|
1185
1194
|
setApplicants(updatedApplicants);
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1195
|
+
setApplicantIds(new Set(Object.keys(updatedApplicants)));
|
|
1196
|
+
const ids = Object.keys(updatedApplicants);
|
|
1197
|
+
if (ids.length > 0) {
|
|
1198
|
+
setActiveApplicant(ids[0]);
|
|
1189
1199
|
}
|
|
1190
1200
|
}
|
|
1191
1201
|
} catch (err) {
|
|
@@ -1202,6 +1212,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1202
1212
|
order,
|
|
1203
1213
|
questionnaire,
|
|
1204
1214
|
applicants,
|
|
1215
|
+
applicantIds,
|
|
1205
1216
|
activeApplicant,
|
|
1206
1217
|
setActiveApplicant,
|
|
1207
1218
|
loading,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smvtech/x-flux",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.14",
|
|
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",
|