import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:servermanager/packets/ClientPackets.dart'; import 'package:servermanager/pages/Constants.dart'; import 'package:servermanager/structs/credentials.dart'; import 'package:servermanager/structs/settings.dart'; import '../consts.dart'; class HomePage extends StatefulWidget { Settings settings; HomePage({super.key, required this.settings}); @override HomePageState createState() => HomePageState(settings: settings); } class HomePageState extends State { Settings settings = Settings(); bool requireRestart = false; HomePageState({required this.settings}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Conan Exiles Server Manager"), backgroundColor: Constants.TITLEBAR_COLOR), drawer: Drawer( child: SingleChildScrollView( child: Column(children: [ DrawerHeader( child: Column( children: [ Icon(Icons.computer), Text("Conan Exiles Mod Manager"), Text("Version ${Consts.VERSION}") ], )), Column( children: [ ListTile( title: Text("S E R V E R"), leading: Icon(Icons.cloud), subtitle: Text("The game server!"), onTap: () { Navigator.pushNamed(context, "/server"); }, ) ], ) ]), )), body: SingleChildScrollView( padding: EdgeInsets.all(16), child: Column( children: [ if (Platform.isLinux) SwitchListTile( value: true, onChanged: (V) {}, title: Text("Wine"), ), ListTile( title: Text("SteamCMD"), leading: Icon(Icons.comment_rounded), subtitle: settings.steamcmd_path.isEmpty ? Text("Path Not Set") : Text(settings.steamcmd_path), onTap: () { if (settings.steamcmd_path.isNotEmpty) { Navigator.pushNamed(context, "/steamcmd"); } }, ), ListTile( title: Text("Server Path"), leading: Icon(CupertinoIcons.folder), subtitle: settings.game_path.isEmpty ? Text("Not Set") : Text(settings.game_path), ), SwitchListTile( value: settings.FTS, onChanged: (B) { setState(() { settings.FTS = B; }); }, title: Text("First Time Setup Mode"), subtitle: Text( "Enabling this will disable server startup, leaving only the wrapper interface to interact with."), ), ListTile( title: Text("Manager Credentials"), subtitle: Text("Edit ServerManager credentials (SUPER USER ONLY)"), leading: Icon(Icons.key), onTap: () async { if (settings.loggedInUser!.permissions == UserLevel.Super_User) { var reply = await Navigator.pushNamed(context, "/acl/edit", arguments: settings.superuser); if (reply != null) { var creds = reply as User; settings.superuser = creds; } } }, ), ListTile( title: Text("Manage Access Control List"), subtitle: Text("Non-Super User access manager"), leading: Icon(Icons.list), onTap: () async { Navigator.pushNamed(context, "/acl"); }, ), ListTile( title: Text("Save Changes"), subtitle: Text( "This will upload the settings to the server and trigger a restart"), onTap: () async { Settings settings = Settings(); C2SUploadSettingsPacket upload = C2SUploadSettingsPacket(); upload.srvSettings = settings.serialize(); upload.performRestart = requireRestart; await settings.client!.send(upload, !requireRestart); Settings.Clear(); setState(() {}); if (requireRestart) { Navigator.pop(context); } }, ), SwitchListTile( value: requireRestart || settings.restartRequired, onChanged: (V) { setState(() { requireRestart = V; }); }, title: Text("Perform Restart"), subtitle: Text( "Whether a immediate server restart should be performed in combination with this wrapper settings update${settings.restartRequired ? "\n** A RESTART IS REQUIRED DUE TO MOD LIST CHANGES" : ""}"), ) ], )), ); } }