newPage method

void newPage()

Implementation

void newPage() {
  final pathSeparator = Platform.pathSeparator;
  Directory dir = Directory(['lib', 'app', 'screens'].join(pathSeparator));
  String pageName = '';

  if (args.length >= 2 && args[1] != '') {
    pageName = args[1];
    final regex = RegExp(r'[!@#$%^&*(),.?":{}|<>]');
    if (regex.hasMatch(pageName)) {
      throw Exception(
        '$pageName name is invalid\nFile name must not contain special characters',
      );
    }
  } else {
    throw Exception('page name must be provided');
  }

  if (args.length >= 3 && args[2] != '') {
    dir = Directory(
      args[2].replaceAll('/', pathSeparator).replaceAll('\\', pathSeparator),
    );
  }

  String viewName = '${pageName.toLowerCase()}_page';
  String controllerName = '${pageName.toLowerCase()}_controller';

  File viewFile = File(
    [dir.path, 'views', 'pages', '$viewName.dart'].join(pathSeparator),
  );
  File controllerFile = File(
    [dir.path, 'controllers', '$controllerName.dart'].join(pathSeparator),
  );
  if (!viewFile.existsSync()) {
    viewFile.createSync(recursive: true);
  }
  if (!controllerFile.existsSync()) {
    controllerFile.createSync(recursive: true);
  }

  const green = '\x1B[32m';
  const reset = '\x1B[0m';

  List<String> result = [];
  final viewClassName = _snakeToPascal(viewName);
  final controllerClassName = _snakeToPascal(controllerName);

  //
  //
  //
  //
  //
  // Generate view file
  result.add("import 'package:flutter/material.dart';");
  result.add("import 'package:uloc/uloc.dart';");
  result.add('');
  result.add("import '../../controllers/$controllerName.dart';");
  result.add('');
  result.add('class $viewClassName extends StatefulWidget {');
  result.add('  const $viewClassName({super.key});');
  result.add('');
  result.add('  @override');
  result.add(
    '  State<$viewClassName> createState() => _${viewClassName}State();',
  );
  result.add('}');
  result.add('');
  result.add('class _${viewClassName}State extends State<$viewClassName> {');
  result.add(
    '  $controllerClassName get watch => context.watch<$controllerClassName>();',
  );
  result.add(
    '  $controllerClassName get controller => context.read<$controllerClassName>();',
  );
  result.add('');
  result.add('  @override');
  result.add('  Widget build(BuildContext context) {');
  result.add('    return Scaffold(');
  result.add('      appBar: AppBar(title: Text(watch.name)),');
  result.add('      body: Center(child: Text(watch.content)),');
  result.add('    );');
  result.add('  }');
  result.add('}');
  result.add('');

  viewFile.writeAsStringSync(result.join('\n'));
  print('$green File generated: ${viewFile.absolute.path} $reset');

  //
  //
  //
  //
  //
  //
  //
  //
  //
  //
  //
  //
  //
  // Generate controller file
  result.clear();
  result.add("import 'package:uloc/uloc.dart';");
  result.add('');
  result.add('class $controllerClassName extends ULoCProvider {');
  result.add('  $controllerClassName(super.context);');
  result.add('  String name = "Home";');
  result.add('  String content = "Home has not yet implemented";');
  result.add('');
  result.add('  @override');
  result.add('  void onInit() {');
  result.add('    super.onInit();');
  result.add('  }');
  result.add('');
  result.add('  @override');
  result.add('  void onReady() {');
  result.add('    super.onReady();');
  result.add('  }');
  result.add('');
  result.add('  @override');
  result.add('  void onDispose() {');
  result.add('    super.onDispose();');
  result.add('  }');
  result.add('');
  result.add('}');
  result.add('');

  controllerFile.writeAsStringSync(result.join('\n'));
  print('$green File generated: ${controllerFile.absolute.path} $reset');

  exit(0);
}