Skip to content

Commit

Permalink
Merge pull request #191 from invertase/project-id-prompt
Browse files Browse the repository at this point in the history
  • Loading branch information
russellwheatley committed Aug 21, 2023
2 parents 0bf6541 + 7e75c24 commit 073ec67
Showing 1 changed file with 65 additions and 34 deletions.
99 changes: 65 additions & 34 deletions packages/flutterfire_cli/lib/src/commands/config.dart
Expand Up @@ -344,6 +344,7 @@ class ConfigCommand extends FlutterFireCommand {

Future<FirebaseProject> _selectFirebaseProject() async {
var selectedProjectId = projectId;
var projectListFail = false;
selectedProjectId ??= await firebase.getDefaultFirebaseProjectId();

if ((isCI || yes) && selectedProjectId == null) {
Expand All @@ -359,51 +360,81 @@ class ConfigCommand extends FlutterFireCommand {
}
final baseMessage =
'Found ${AnsiStyles.cyan('${firebaseProjects?.length ?? 0}')} Firebase projects.';
if (selectedProjectId != null) {
if (selectedProjectId != null && !projectListFail) {
return '$baseMessage Selecting project ${AnsiStyles.cyan(selectedProjectId)}.';
}
return baseMessage;
},
);
firebaseProjects = await firebase.getProjects(
account: accountEmail,
token: token,
);

fetchingProjectsSpinner.done();
if (selectedProjectId != null) {
return firebaseProjects.firstWhere(
(project) => project.projectId == selectedProjectId,
orElse: () {
throw FirebaseProjectNotFoundException(selectedProjectId!);
},
);
}
try {
firebaseProjects = await firebase
.getProjects(
account: accountEmail,
token: token,
)
.timeout(const Duration(seconds: 15));

fetchingProjectsSpinner.done();

if (selectedProjectId != null) {
return firebaseProjects.firstWhere(
(project) => project.projectId == selectedProjectId,
orElse: () {
throw FirebaseProjectNotFoundException(selectedProjectId!);
},
);
}

// No projects to choose from so lets
// prompt to create straight away.
if (firebaseProjects.isEmpty) {
return _promptCreateFirebaseProject();
}
// No projects to choose from so lets
// prompt to create straight away.
if (firebaseProjects.isEmpty) {
return _promptCreateFirebaseProject();
}

final choices = <String>[
...firebaseProjects.map(
(p) => '${p.projectId} (${p.displayName})',
),
AnsiStyles.green('<create a new project>'),
];
final choices = <String>[
...firebaseProjects.map(
(p) => '${p.projectId} (${p.displayName})',
),
AnsiStyles.green('<create a new project>'),
];

final selectedChoiceIndex = promptSelect(
'Select a Firebase project to configure your Flutter application with',
choices,
);
final selectedChoiceIndex = promptSelect(
'Select a Firebase project to configure your Flutter application with',
choices,
);

// Last choice is to create a new project.
if (selectedChoiceIndex == choices.length - 1) {
return _promptCreateFirebaseProject();
}
// Last choice is to create a new project.
if (selectedChoiceIndex == choices.length - 1) {
return _promptCreateFirebaseProject();
}

return firebaseProjects[selectedChoiceIndex];
} catch (e) {
if (firebaseProjects == null) {
projectListFail = true;
// This won't have been called if `firebaseProjects` is null
fetchingProjectsSpinner.done();

// Warn user that we couldn't fetch projects
// Prompt user if they would like to create a new project.
// Cannot choose nor input project because we cannot validate if we cannot fetch projects.
logger.stderr(
'Failed to fetch your Firebase projects. Fetch failed with this: $e',
);
final createProject =
promptBool('Would you like to create a new Firebase project?');

return firebaseProjects[selectedChoiceIndex];
if (createProject) {
return _promptCreateFirebaseProject();
} else {
throw FirebaseProjectRequiredException();
}
} else {
// It wasn't Firebase projects list API call, rethrow
rethrow;
}
}
}

Map<String, bool> _selectPlatforms() {
Expand Down

0 comments on commit 073ec67

Please sign in to comment.