Skip to content

Commit

Permalink
feat: add validation for Fitbit credentials in forms
Browse files Browse the repository at this point in the history
  • Loading branch information
ibrahimozkn committed Jan 16, 2025
1 parent f99765d commit e50a481
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:studyu_app/models/app_state.dart';
import 'package:studyu_app/util/fitbit_handler.dart';
import 'package:studyu_app/widgets/questionnaire/questions/question_widget.dart';
import 'package:studyu_core/core.dart';

import '../../../util/fitbit_handler.dart';

class FitbitQuestionWidget extends QuestionWidget {
final FitbitQuestion question;
final String taskId;
Expand Down
1 change: 1 addition & 0 deletions designer_v2/lib/domain/study.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ extension StudyDuplicateX on Study {
copy.registryPublished = false;
copy.results = [];
copy.collaboratorEmails = [];
copy.fitbitCredentials = null;
copy.createdAt = DateTime.now();

// Generate a new random UUIDs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,36 +45,49 @@ class FitbitCredentialsFormViewModel
@override
FormValidationConfigSet get sharedValidationConfig => {
StudyFormValidationSet.draft: [],
StudyFormValidationSet.publish: [],
StudyFormValidationSet.publish: [fitbitCredentialsValidation],
StudyFormValidationSet.test: [],
};

//TODO: Do a validator which checks if client_id is filled, client_secret is required and vice versa
/*static Map<String, dynamic>? clientCredentialsValidator(
FormControlValidation get fitbitCredentialsValidation =>
FormControlValidation(
control: form,
validators: [
Validators.delegate(_validateFitbitCredentials),
],
validationMessages: {
'fitbitCredentialsRequired': (_) => 'Fitbit credentials are required',
},
);

//TODO: translations
Map<String, dynamic>? _validateFitbitCredentials(
AbstractControl<dynamic> control) {
final hasFitbitQuestion = study.observations.any((observation) {
if (observation.type != 'questionnaire') return false;

final questionnaire = observation as QuestionnaireTask;
return questionnaire.questions.questions
.any((question) => question is FitbitQuestion);
});

if (!hasFitbitQuestion) return null;

if (control is FormGroup) {
final clientId = control.control('client_id').value as String?;
final clientSecret = control.control('client_secret').value as String?;

if ((clientId != null && clientId.isNotEmpty) &&
(clientSecret == null || clientSecret.isEmpty)) {
return {
'clientSecretRequired':
'Client secret is required when client ID is filled',
} as Map<String, dynamic>;
if (clientId == null || clientId.isEmpty) {
return {'fitbitCredentialsRequired': true};
}

if ((clientSecret != null && clientSecret.isNotEmpty) &&
(clientId == null || clientId.isEmpty)) {
return {
'clientIdRequired':
'Client ID is required when client secret is filled'
} as Map<String, dynamic>;
if (clientSecret == null || clientSecret.isEmpty) {
return {'fitbitCredentialsRequired': true};
}
}

return null;
}*/
}

@override
// TODO: implement titles
Expand Down
2 changes: 1 addition & 1 deletion designer_v2/lib/features/study/study_navbar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class StudyDesignNav {
);
static NavbarTab fitbitCredentials(StudyID studyId) => NavbarTab(
index: 5,
title: "Fitbit",
title: "Fitbit", //TODO: translations
intent: RoutingIntents.studyEditFitbitCredentials(studyId),
);
}

0 comments on commit e50a481

Please sign in to comment.