Skip to content

Commit

Permalink
fix: invite code validation logic
Browse files Browse the repository at this point in the history
  • Loading branch information
johannesvedder committed Jul 9, 2024
1 parent b263c4d commit 0695841
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 22 deletions.
67 changes: 47 additions & 20 deletions designer_v2/lib/features/recruit/invite_code_form_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import 'package:studyu_core/core.dart';
import 'package:studyu_designer_v2/domain/study.dart';
import 'package:studyu_designer_v2/domain/study_invite.dart';
import 'package:studyu_designer_v2/domain/study_schedule.dart';
import 'package:studyu_designer_v2/features/design/study_form_validation.dart';
import 'package:studyu_designer_v2/features/forms/form_validation.dart';
import 'package:studyu_designer_v2/features/forms/form_view_model.dart';
import 'package:studyu_designer_v2/features/study/study_controller.dart';
import 'package:studyu_designer_v2/localization/app_translation.dart';
Expand All @@ -16,7 +18,10 @@ class InviteCodeFormViewModel extends FormViewModel<StudyInvite> {
InviteCodeFormViewModel({
required this.study,
required this.inviteCodeRepository,
}) : super();
super.formData,
super.delegate,
super.validationSet = StudyFormValidationSet.draft,
});

final Study study;
final IInviteCodeRepository inviteCodeRepository;
Expand All @@ -29,33 +34,56 @@ class InviteCodeFormViewModel extends FormViewModel<StudyInvite> {

// - Form Fields

late final codeControl = FormControl<String>(
validators: [
Validators.required,
Validators.minLength(8),
Validators.maxLength(24),
],
asyncValidators: [
Validators.delegateAsync((control) => _uniqueInviteCode(control)),
],
final codeControl = FormControl<String>(
asyncValidatorsDebounceTime: 200,
touched: true,
);
final codeControlValidationMessages = {
ValidationMessage.required: (_) => tr.form_field_code_required,
ValidationMessage.minLength: (error) =>
tr.form_field_code_minlength((error as Map)['requiredLength'] as int),
ValidationMessage.maxLength: (error) =>
tr.form_field_code_maxlength((error as Map)['requiredLength'] as int),
'inviteCodeAlreadyUsed': (_) => tr.form_field_code_alreadyused,
};

final isPreconfiguredScheduleControl = FormControl<bool>(value: false);
final preconfiguredScheduleTypeControl =
FormControl<PhaseSequence>(value: PhaseSequence.alternating);
final interventionAControl = FormControl<String>();
final interventionBControl = FormControl<String>();

// todo add validation for preconfigured schedule if enabled
@override
FormValidationConfigSet get sharedValidationConfig => {
StudyFormValidationSet.draft: [codeValidation],
StudyFormValidationSet.test: [codeValidation],
StudyFormValidationSet.publish: [codeValidation],
};

FormControlValidation get codeRequired => FormControlValidation(
control: codeControl,
validators: [
Validators.required,
],
validationMessages: {
ValidationMessage.required: (error) => tr.form_field_code_required,
},
);

FormControlValidation get codeValidation => FormControlValidation(
control: codeControl,
validators: [
Validators.required,
Validators.minLength(8),
Validators.maxLength(24),
],
asyncValidators: [
Validators.delegateAsync((control) => _uniqueInviteCode(control)),
],
validationMessages: {
ValidationMessage.required: (error) => tr.form_field_code_required,
ValidationMessage.minLength: (error) => tr.form_field_code_minlength(
(error as Map)['requiredLength'] as int,
),
ValidationMessage.maxLength: (error) => tr.form_field_code_maxlength(
(error as Map)['requiredLength'] as int,
),
'inviteCodeAlreadyUsed': (_) => tr.form_field_code_alreadyused,
},
);

List<FormControlOption<String>> get interventionControlOptions =>
study.interventions
.map(
Expand Down Expand Up @@ -157,7 +185,6 @@ InviteCodeFormViewModel inviteCodeFormViewModel(
InviteCodeFormViewModelRef ref,
StudyID studyId,
) {
print("inviteCodeFormViewModelProvider($studyId");
// Reactively bind to and obtain [StudyController]'s current study
final study = ref
.watch(studyControllerProvider(studyId).select((state) => state.study));
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion designer_v2/lib/features/recruit/invite_code_form_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:studyu_core/core.dart';
import 'package:studyu_designer_v2/common_views/form_consumer_widget.dart';
import 'package:studyu_designer_v2/common_views/form_table_layout.dart';
import 'package:studyu_designer_v2/common_views/text_paragraph.dart';
import 'package:studyu_designer_v2/features/forms/form_validation.dart';
import 'package:studyu_designer_v2/features/recruit/invite_code_form_controller.dart';
import 'package:studyu_designer_v2/localization/app_translation.dart';

Expand All @@ -25,7 +26,8 @@ class InviteCodeFormView extends FormConsumerWidget {
control: formViewModel.codeControl,
input: ReactiveTextField(
formControl: formViewModel.codeControl,
validationMessages: formViewModel.codeControlValidationMessages,
validationMessages:
formViewModel.codeControl.validationMessages,
decoration: (formViewModel.codeControl.enabled)
? InputDecoration(
helperText: "",
Expand Down

0 comments on commit 0695841

Please sign in to comment.