Skip to content

Commit

Permalink
feat: add logic code in background for initialized node
Browse files Browse the repository at this point in the history
  • Loading branch information
esmaeil-ahmadipour authored and = committed Jan 30, 2025
1 parent 331c751 commit 7cd1b30
Show file tree
Hide file tree
Showing 10 changed files with 298 additions and 83 deletions.
11 changes: 10 additions & 1 deletion lib/src/core/router/registration_routes.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:gui/src/core/utils/daemon_manager/bloc/daemon_cubit.dart';
import 'package:gui/src/features/confirmation_seed/presentation/screen/confirmation_seed_page.dart';
import 'package:gui/src/features/dashboard/presentation/screen/dashboard_page.dart';
import 'package:gui/src/features/finish/presentation/screen/finish_page.dart';
Expand Down Expand Up @@ -52,7 +54,14 @@ final List<GoRoute> registrationRoutes = [
GoRoute(
path: AppRoute.finish.path,
name: AppRoute.finish.name,
builder: (context, state) => const FinishPage(),
builder: (context, state) => MultiBlocProvider(
providers: [
BlocProvider<DaemonCubit>(
create: (_) => DaemonCubit(),
),
],
child: const FinishPage(),
),
routes: [
GoRoute(
path: AppRoute.password.path,
Expand Down
38 changes: 38 additions & 0 deletions lib/src/core/utils/daemon_manager/bloc/daemon_cubit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'dart:io';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gui/src/core/utils/daemon_manager/bloc/daemon_state.dart';
import 'package:path/path.dart' show dirname;

class DaemonCubit extends Cubit<DaemonState> {
DaemonCubit() : super(DaemonInitial());

Future<void> runPactusDaemon({
// required String workingDirectory,
required String command,
required List<String> arguments,
}) async {
emit(DaemonLoading());

try {
// Get the directory of the script
final scriptDir = dirname(Platform.script.toFilePath());

final targetPath = '$scriptDir/lib/src/core/native_resources/linux/';

// print('scriptDir: $targetPath');

final result =
await Process.run(command, arguments, workingDirectory: targetPath);
if (result.exitCode == 0) {
// دستور با موفقیت اجرا شد
emit(DaemonSuccess('${result.stdout}'));
} else {
// دستور با خطا مواجه شد
emit(DaemonError('${result.stderr}'));
}
} on Exception catch (e) {
// برخورد با خطای استثنا
emit(DaemonError('Exception occurred: $e'));
}
}
}
15 changes: 15 additions & 0 deletions lib/src/core/utils/daemon_manager/bloc/daemon_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
abstract class DaemonState {}

class DaemonInitial extends DaemonState {}

class DaemonLoading extends DaemonState {}

class DaemonSuccess extends DaemonState {
DaemonSuccess(this.output);
final String output;
}

class DaemonError extends DaemonState {
DaemonError(this.error);
final String error;
}
35 changes: 35 additions & 0 deletions lib/src/core/utils/daemon_manager/node_config_data.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class NodeConfigData {
// Private constructor
NodeConfigData._internal();
// Singleton instance
static final NodeConfigData instance = NodeConfigData._internal();

// Private variables
String? _workingDirectory;
String? _restorationSeed;
String? _password;
String? _validatorQty;

// Getters
String get workingDirectory => _workingDirectory ?? '';
String get restorationSeed => _restorationSeed ?? '';
String get password => _password ?? '';
String get validatorQty => _validatorQty ?? '';

// Setters
set workingDirectory(String value) {
_workingDirectory = value;
}

set restorationSeed(String value) {
_restorationSeed = value;
}

set password(String value) {
_password = value;
}

set validatorQty(String value) {
_validatorQty = value;
}
}
File renamed without changes.
84 changes: 79 additions & 5 deletions lib/src/features/finish/presentation/screen/finish_page.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:gui/src/core/common/colors/app_colors.dart';
import 'package:gui/src/core/router/route_name.dart';
import 'package:gui/src/core/utils/daemon_manager/bloc/daemon_cubit.dart';
import 'package:gui/src/core/utils/daemon_manager/bloc/daemon_state.dart';
import 'package:gui/src/core/utils/daemon_manager/node_config_data.dart';
import 'package:pactus_gui_widgetbook/app_styles.dart';

class FinishPage extends StatelessWidget {
Expand All @@ -20,11 +25,80 @@ class FinishPage extends StatelessWidget {
),
),
content: Center(
child: Button(
onPressed: () {
context.goNamed(AppRoute.password.name);
},
child: Text('Navigate to ${AppRoute.password.name}'),
child: Column(
children: [
Text(
'password: ${NodeConfigData.instance.password}',
style: TextStyle(color: AppColors.primaryDark),
),
Text(
'validatorQty: ${NodeConfigData.instance.validatorQty}',
style: TextStyle(color: AppColors.primaryDark),
),
Text(
'workingDirectory:${NodeConfigData.instance.workingDirectory}',
style: TextStyle(color: AppColors.primaryDark),
),
Text(
'restorationSeed: ${NodeConfigData.instance.restorationSeed}',
style: TextStyle(color: AppColors.primaryDark),
),
Button(
onPressed: () async {
final daemonCubit = context.read<DaemonCubit>();

await daemonCubit.runPactusDaemon(
command: './pactus-daemon',
arguments: [
'init',
'--working-dir',
NodeConfigData.instance.workingDirectory,
'--restore',
NodeConfigData.instance.restorationSeed,
'--password',
NodeConfigData.instance.password,
'--val-num',
NodeConfigData.instance.validatorQty,
],
);
},
child: Text('Run Node'),
),
SizedBox(
height: 150,
child: BlocBuilder<DaemonCubit, DaemonState>(
builder: (context, state) {
if (state is DaemonLoading) {
return Center(child: ProgressRing());
} else if (state is DaemonSuccess) {
return SingleChildScrollView(
child: Text(
state.output,
style: TextStyle(fontSize: 16),
),
);
} else if (state is DaemonError) {
return SingleChildScrollView(
child: Text(
state.error,
style: TextStyle(fontSize: 16, color: Colors.red),
),
);
} else {
return Center(
child: Text('Press the button to run the daemon.'),
);
}
},
),
),
Button(
onPressed: () {
context.goNamed(AppRoute.password.name);
},
child: Text('Navigate to ${AppRoute.password.name}'),
),
],
),
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:go_router/go_router.dart';
import 'package:gui/src/core/router/route_name.dart';
import 'package:gui/src/core/utils/daemon_manager/node_config_data.dart';
import 'package:pactus_gui_widgetbook/app_styles.dart';

class MasterPasswordPage extends StatelessWidget {
class MasterPasswordPage extends StatefulWidget {
const MasterPasswordPage({super.key});

@override
State<MasterPasswordPage> createState() => _MasterPasswordPageState();
}

class _MasterPasswordPageState extends State<MasterPasswordPage> {
TextEditingController directoryController = TextEditingController();

@override
Widget build(BuildContext context) {
return NavigationView(
Expand All @@ -20,11 +28,34 @@ class MasterPasswordPage extends StatelessWidget {
),
),
content: Center(
child: Button(
onPressed: () {
context.goNamed(AppRoute.validatorConfig.name);
},
child: Text('Navigate to ${AppRoute.validatorConfig.name}'),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
spacing: 16,
children: [
SizedBox(
width: 220,
child: ExcludeSemantics(
child: TextBox(
controller: directoryController,
placeholder: 'Password',
autofocus: true,
decoration: WidgetStateProperty.all(
BoxDecoration(
border: Border.all(),
borderRadius: BorderRadius.circular(5),
),
),
),
),
),
Button(
onPressed: () {
NodeConfigData.instance.password = directoryController.text;
context.goNamed(AppRoute.validatorConfig.name);
},
child: Text('Navigate to ${AppRoute.validatorConfig.name}'),
),
],
),
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:go_router/go_router.dart';
import 'package:gui/src/core/router/route_name.dart';
import 'package:gui/src/core/utils/seed_generator.dart';
import 'package:gui/src/core/utils/daemon_manager/node_config_data.dart';
import 'package:gui/src/core/utils/daemon_manager/seed_generator.dart';
import 'package:pactus_gui_widgetbook/app_styles.dart';

class RestorationSeedPage extends StatelessWidget {
Expand All @@ -21,7 +22,8 @@ class RestorationSeedPage extends StatelessWidget {
),
),
content: Center(
child: SizedBox(width: 320,
child: SizedBox(
width: 320,
child: Column(
spacing: 16,
children: [
Expand All @@ -36,29 +38,31 @@ class RestorationSeedPage extends StatelessWidget {
Text(
'${SeedGenerator().generateSeed(12)?.sentence}',
style: FluentTheme.of(context).typography.body!.copyWith(
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
),
Text(
'24 seeds:',
style: FluentTheme.of(context).typography.body!.copyWith(
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
),
Text(
'${SeedGenerator().generateSeed(24)?.sentence}',
style: FluentTheme.of(context).typography.body!.copyWith(
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
color: AppTheme.of(context)
.extension<OnSurfacePallet>()!
.onSurface4,
),
),
Button(
onPressed: () {
NodeConfigData.instance.restorationSeed =
'${SeedGenerator().generateSeed(12)?.sentence}';
context.goNamed(AppRoute.confirmationSeed.name);
},
child: Text('Navigate to ${AppRoute.confirmationSeed.name}'),
Expand Down
Loading

0 comments on commit 7cd1b30

Please sign in to comment.