generateCloneConfigFile function
Generates the clone_configs.dart file based on the provided configModel.
This function creates or updates lib/generated/clone_configs.dart,
which contains static constants for various configuration parameters
such as colors, gradients, base URL, client ID, version, primary color,
and custom fields. This file allows Flutter applications to access
clone-specific configurations at compile time.
configModel The CloneConfigModel containing the configuration data
to be written to the generated file.
Throws a FileSystemException if the 'generated' directory cannot be created or the 'clone_configs.dart' file cannot be written.
Implementation
Future<void> generateCloneConfigFile(CloneConfigModel configModel) async {
// 1. Check if the 'generated' directory exists
final generatedDir = Directory('./lib/generated');
if (!generatedDir.existsSync()) {
generatedDir.createSync(recursive: true);
logger.i('Created "lib/generated" directory.');
}
// 2. Create 'clone_configs.dart' file
final file = File('${generatedDir.path}/clone_configs.dart');
final sink = file.openWrite();
// 3. Write 'CloneConfigs' class
sink.writeln(
'// Auto-generated file. any changes will be overwritten. edit clone config instead.',
);
// sink.writeln("import 'package:flutter/material.dart';\n");
sink.writeln('abstract class CloneConfigs {');
// 3.1. Write colors
for (var i = 0; i < (configModel.colors?.length ?? 0); i++) {
final color = configModel.colors![i];
sink.writeln(' static const ${color.name} = Color(0xFF${color.color});');
}
sink.writeln(' static const String baseUrl = "${configModel.baseUrl}";');
sink.writeln(
' static const String packageName = "${configModel.packageName}";',
);
sink.writeln(' static const String appName = "${configModel.appName}";');
sink.writeln(
' static const String logo = "assets/images/${configModel.logo}";',
);
sink.writeln(
' static const String launcherIcon = "assets/images/${configModel.launcherIcon}";',
);
sink.writeln(
' static const String splashScreen = "assets/images/${configModel.splashScreen}";',
);
sink.writeln(
' static const String firebaseProjectId = "${configModel.firebaseProjectId}";',
);
sink.writeln(' static const String clientId = "${configModel.clientId}";');
sink.writeln(' static const String version = "${configModel.version}";');
sink.writeln(
' static const String primaryColor = "${configModel.primaryColor}";',
);
// 3.8 Write Custom Fields (if any exist in clonifySettings)
if (clonifySettings.customFields.isNotEmpty) {
// Read the config file to get custom field values
final configPath = './clonify/clones/${configModel.clientId}/config.json';
final configFile = File(configPath);
if (configFile.existsSync()) {
final configJson =
jsonDecode(configFile.readAsStringSync()) as Map<String, dynamic>;
for (final field in clonifySettings.customFields) {
final value = configJson[field.name];
if (value != null) {
// Generate the constant based on type
switch (field.type) {
case 'int':
sink.writeln(' static const int ${field.name} = $value;');
break;
case 'double':
sink.writeln(' static const double ${field.name} = $value;');
break;
case 'bool':
sink.writeln(' static const bool ${field.name} = $value;');
break;
case 'string':
default:
sink.writeln(' static const String ${field.name} = "$value";');
break;
}
}
}
}
}
// 4. Access the _assetTargetDirectory and for each file in that directory add its path
// final assetsDirectory =
// Directory('./clonify/clones/${configModel.clientId}/assets');
// if (assetsDirectory.existsSync()) {
// final assetFiles = assetsDirectory.listSync();
// for (final asset in assetFiles) {
// if (asset is File) {
// final assetFileName = asset.path.split(Platform.pathSeparator).last;
// // final variableName = path.withoutExtension(assetFileName).replaceAll(
// // RegExp(r'\W+'), '_'); // Sanitize file names to valid variable names
// final variableName = assetFileName
// .replaceAll(RegExp(r'\W+'), '_')
// .replaceAll(RegExp(r'^\d+'),
// ''); // Sanitize file names to valid variable names
// sink.writeln(
// ' static const String $variableName = "${asset.path}$assetFileName";');
// }
// }
// }
sink.writeln('}');
// Close the file stream
sink.close();
logger.i(
'Generated clone_configs.dart file. You can find it in lib/generated/clone_configs.dart',
);
}