createScreens method

Future<void> createScreens()

Implementation

Future<void> createScreens() async {
  bool modulesDirectoryExist = await checkDirectoryExist(Constants.modulesDirectoryPath);

  DirectoryStructor directoryStructor = modulesDirectoryExist ? DirectoryStructor.modular : DirectoryStructor.global;

  if (directoryStructor == DirectoryStructor.global) {
    await checkNonModularPatternScreenExist();
  }

  Logger.instance.message("""\nNote:
- Press Space to select or unselect an option.
- Use the Up (↑) and Down (↓) arrow keys to navigate.
- Press Enter to confirm your selection.\n""");

  Logger.instance.message("Choose the type of screen you want to create:");
  int selectedScreen = SelectMenu(options: ["Blank Screen", "Listing Screen", "Grid Screen"], console: Logger.instance).ask();

  String? selectedModuleName;
  bool moduleCreated = false;

  if (directoryStructor == DirectoryStructor.modular) {
    String moduleDirPath = [Directory.current.path, ...Constants.modulesDirectoryPath.split("/")..remove("")].join(Platform.pathSeparator);
    Directory dir = Directory(moduleDirPath);
    if (!await dir.exists()) {
      throw CliException(message: "$moduleDirPath ${Constants.modulesDirectoryPath} Directory not found");
    }
    List<String> modules = dir.listSync().whereType<Directory>().map((e) => e.path.split(Platform.pathSeparator).last).toList();
    modules.remove("shared");
    modules.add("+ Create New Module");
    Logger.instance.message("Select a Module to Create a Screen:");
    int selectedModule = SelectMenu(options: modules, console: Logger.instance).ask();
    if (selectedModule == modules.length - 1) {
      Logger.instance.message("");
      selectedModuleName = getModuleNameFromUser();
      if (selectedModuleName.isNotEmpty) {
        moduleCreated = true;
        await createDirectory("${Constants.modulesDirectoryPath}/$selectedModuleName");
        await Future.wait([
          createDirectory("${Constants.modulesDirectoryPath}/$selectedModuleName/models"),
          createDirectory("${Constants.modulesDirectoryPath}/$selectedModuleName/widgets"),
          createDirectory("${Constants.modulesDirectoryPath}/$selectedModuleName/shared/controllers"),
          createDirectory("${Constants.modulesDirectoryPath}/$selectedModuleName/shared/repositories"),
        ]);
      }
    } else {
      selectedModuleName = modules[selectedModule];
    }
  }

  if (directoryStructor == DirectoryStructor.modular && (selectedModuleName ?? "").isEmpty) {
    throw CliException(message: "Something went wrong!");
  }

  if (directoryStructor == DirectoryStructor.modular) {
    await checkModularPatternScreenExist(selectedModuleName!);
  }

  CreateCommand createCommand = switch (selectedScreen) {
    0 => BlankScreenCreateCommand(directoryStructor, selectedModuleName, moduleCreated),
    1 => ListingScreenCreateCommand(directoryStructor, selectedModuleName, moduleCreated),
    2 => GridScreenCreateCommand(directoryStructor, selectedModuleName, moduleCreated),
    _ => BlankScreenCreateCommand(directoryStructor, selectedModuleName, moduleCreated),
  };

  await createCommand.execute();
}