diff --git a/lib/connection/connection.dart b/lib/connection/connection.dart index d50558c..6ea8aa1 100644 --- a/lib/connection/connection.dart +++ b/lib/connection/connection.dart @@ -1,32 +1,36 @@ -import 'package:shared_preferences/shared_preferences.dart'; - -import 'package:shared_preferences/shared_preferences.dart'; -import '../pages/sign_in_page.dart'; - -import 'package:path_provider/path_provider.dart'; +import '../pages/login/controller/loginController.dart'; // Sesuaikan path dengan struktur proyek Anda Future getBaseUrl() async { try { - String savedValue = await getSavedValue(); + List ipDomainList = await ControllerLogin().fetchData(); + + if (ipDomainList.isNotEmpty) { + String savedValue = ipDomainList.first['ipOrDomain'] ?? ''; - // Check if savedValue is a domain, IP with or without port - String baseUrl; + // Check if savedValue is a domain, IP with or without port + String baseUrl; - if (savedValue.contains(':')) { - // If savedValue contains a colon, assume it's an IP with port - baseUrl = 'http://$savedValue/api/v1'; - } else if (RegExp(r'^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$').hasMatch(savedValue)) { - // If savedValue matches the domain pattern, assume it's a domain - baseUrl = 'https://$savedValue/api/v1'; + if (savedValue.contains(':')) { + // If savedValue contains a colon, assume it's an IP with port + baseUrl = 'http://$savedValue/api/v1'; + } else if (RegExp(r'^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$') + .hasMatch(savedValue)) { + // If savedValue matches the domain pattern, assume it's a domain + baseUrl = 'https://$savedValue/api/v1'; + } else { + // If it doesn't match both patterns, assume it's an IP without port + baseUrl = 'https://$savedValue/api/v1'; + } + + return baseUrl; } else { - // If it doesn't match both patterns, assume it's an IP without port - baseUrl = 'https://$savedValue/api/v1'; + // Handle jika tidak ada data di database (misalnya, berikan nilai default atau tampilkan pesan kesalahan) + print('No data found in database.'); + return ''; // Atau berikan nilai default lainnya sesuai kebutuhan } - - return baseUrl; } catch (e) { - // Error handling - print('Error reading SharedPreferences: $e'); - return ''; // Or any other default value in case of an error + // Handle kesalahan pembacaan dari database + print('Error reading data from database: $e'); + return ''; // Atau berikan nilai default lainnya sesuai kebutuhan } } diff --git a/lib/main.dart b/lib/main.dart index 9d9fcfa..fe30071 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,7 +12,7 @@ import 'pages/peminjaman_barang/create.dart'; import 'pages/peminjaman_barang/show.dart'; import 'pages/pengembalian_barang/edit.dart'; import 'pages/pengembalian_barang/index.dart'; -import 'pages/sign_in_page.dart'; +import 'pages/login/sign_in_page.dart'; import 'pages/splash_page.dart'; import 'pages/transfer_peti/index.dart'; import 'providers/asset_status_provider.dart'; diff --git a/lib/migrations/databasehelper.dart b/lib/migrations/databasehelper.dart index 666fbd6..4cc6360 100644 --- a/lib/migrations/databasehelper.dart +++ b/lib/migrations/databasehelper.dart @@ -24,7 +24,7 @@ class SqfliteDatabaseHelper { // static final assetLocalTable = 'asset_statuses_local'; static final peminjamanTable = 'peminjamans'; - static final temporaryPeminjamanTable = 'temporary_peminjamans'; + static final ipDomainTable = 'ipdomain'; static final pengembalianTable = 'pengembalians'; @@ -65,6 +65,13 @@ class SqfliteDatabaseHelper { print(dbPath); var openDb = await openDatabase(dbPath, version: _version, onCreate: (Database db, int version) async { + await db.execute(""" + CREATE TABLE $ipDomainTable ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + ipOrDomain TEXT + ); + """); + await db.execute(""" CREATE TABLE $peminjamanTable ( id INTEGER PRIMARY KEY AUTOINCREMENT, diff --git a/lib/models/ip_domain_model.dart b/lib/models/ip_domain_model.dart new file mode 100644 index 0000000..ddad481 --- /dev/null +++ b/lib/models/ip_domain_model.dart @@ -0,0 +1,18 @@ +class IpDomain { + int? id; + String? ipOrDomain; + + IpDomain({this.id, this.ipOrDomain}); + + factory IpDomain.fromJson(Map json) { + return IpDomain( + id: json['id'] ? json['id'] : 0, + ipOrDomain: json['ipOrDomain'] ? json['ipOrDomain'] : '', + ); + } + + Map toJson() => { + 'id': id, + 'ipOrDomain': ipOrDomain, + }; +} diff --git a/lib/pages/login/controller/loginController.dart b/lib/pages/login/controller/loginController.dart new file mode 100644 index 0000000..5ded4ab --- /dev/null +++ b/lib/pages/login/controller/loginController.dart @@ -0,0 +1,101 @@ +import 'package:sqflite/sqflite.dart'; + +import '../../../migrations/databasehelper.dart'; +import '../../../models/ip_domain_model.dart'; + +class ControllerLogin { + final conn = SqfliteDatabaseHelper.instance; + + Future addData(IpDomain ipDomain) async { + var dbclient = await conn.db; + int result = 0; // Provide an initial value + try { + result = await dbclient! + .insert(SqfliteDatabaseHelper.ipDomainTable, ipDomain.toJson()); + } catch (e) { + print(e.toString()); + } + return result; + } + + Future updateData(IpDomain ipDomain) async { + var dbclient = await conn.db; + late int result; + try { + result = await dbclient!.update( + SqfliteDatabaseHelper.ipDomainTable, + ipDomain.toJson(), + where: 'id=?', + whereArgs: [ipDomain.id], + ); + } catch (e) { + print(e.toString()); + } + return result; + } + + Future fetchData() async { + var dbclient = await conn.db; + List userList = []; + try { + List> maps = await dbclient! + .query(SqfliteDatabaseHelper.ipDomainTable, orderBy: 'id DESC'); + for (var item in maps) { + userList.add(item); + } + } catch (e) { + print(e.toString()); + } + return userList; + } + + Future> fetchDataId() async { + var dbclient = await conn.db; + List ipDomainList = []; + try { + List> maps = await dbclient! + .query(SqfliteDatabaseHelper.ipDomainTable, orderBy: 'id DESC'); + for (var item in maps) { + ipDomainList.add(IpDomain.fromJson(item)); + } + } catch (e) { + print(e.toString()); + } + return ipDomainList; + } + + // Future deleteAllData() async { + // var dbClient = await conn.db; + // await dbClient!.delete(SqfliteDatabaseHelper.ipDomainTable); + // } + + Future resetAutoIncrement() async { + var dbClient = await conn.db; + await dbClient!.execute( + 'DELETE FROM SQLITE_SEQUENCE WHERE NAME = "${SqfliteDatabaseHelper.ipDomainTable}"'); + } + + Future deleteAllData() async { + var dbClient = await conn.db; + + // Hapus semua data dari tabel + await dbClient!.delete(SqfliteDatabaseHelper.ipDomainTable); + + // Reset auto-increment to 1 + await resetAutoIncrement(); + } + + Future addAllData(List ipDomainList) async { + var dbclient = await conn.db; + Batch batch = dbclient!.batch(); + + for (var ipDomain in ipDomainList) { + batch.insert( + SqfliteDatabaseHelper.ipDomainTable, + ipDomain.toJson(), + ); + } + + await batch.commit(); + } +} diff --git a/lib/pages/sign_in_page.dart b/lib/pages/login/sign_in_page.dart similarity index 85% rename from lib/pages/sign_in_page.dart rename to lib/pages/login/sign_in_page.dart index 8212235..c1080bc 100644 --- a/lib/pages/sign_in_page.dart +++ b/lib/pages/login/sign_in_page.dart @@ -5,9 +5,11 @@ import 'package:flutter/services.dart'; import 'package:siopas/theme.dart'; -import '../models/user_model.dart'; -import '../providers/auth_provider.dart'; -import '../widget/loading_button.dart'; +import '../../models/ip_domain_model.dart'; +import '../../models/user_model.dart'; +import '../../providers/auth_provider.dart'; +import '../../widget/loading_button.dart'; +import 'controller/loginController.dart'; class SignInPage extends StatefulWidget { @override @@ -358,19 +360,28 @@ class SettingsModal extends StatefulWidget { } class _SettingsModalState extends State { - TextEditingController inputController = TextEditingController(); + TextEditingController ipDomainController = TextEditingController(); + List? getIpDomainList; + bool loading = true; @override void initState() { super.initState(); - // Load saved IP Address or Port when the modal is initialized - loadSettings(); + ipDomainList(); } - void loadSettings() async { - String savedValue = await getSavedValue(); - setState(() { - inputController.text = savedValue; + Future ipDomainList() async { + await ControllerLogin().fetchData().then((value) { + setState(() { + getIpDomainList = value; + loading = false; + + // Set nilai ipDomainController dengan ID terbaru jika ada data + if (getIpDomainList != null && getIpDomainList!.isNotEmpty) { + ipDomainController.text = + getIpDomainList![0]['ipOrDomain'].toString(); + } + }); }); } @@ -389,49 +400,59 @@ class _SettingsModalState extends State { ), ], ), + actions: [ + ElevatedButton( + onPressed: () async { + IpDomain ipDomainModel = IpDomain( + id: null, + ipOrDomain: ipDomainController.text, + ); + + // Panggil fungsi deleteAllData untuk menghapus data sebelumnya + await ControllerLogin().deleteAllData(); + + // Panggil fungsi addData untuk menyimpan data baru + int result = await ControllerLogin().addData(ipDomainModel); + + if (result > 0) { + print("Success"); + + // Gunakan setState untuk memicu pembaruan widget setelah data disimpan + setState(() { + loading = true; // Sinyal bahwa sedang memuat + }); + + // Panggil fungsi ipDomainList untuk mengambil ulang data + await ipDomainList(); + + // Setelah data diambil ulang, nonaktifkan loading + setState(() { + loading = false; + }); + + // Setelah data disimpan dan diambil ulang, lakukan Navigator.pop + Navigator.pop(context); // Kembali ke halaman sebelumnya + } else { + print("Failed"); + } + }, + child: Text("Save"), + ), + ], content: Column( mainAxisSize: MainAxisSize.min, children: [ TextFormField( - controller: inputController, + controller: ipDomainController, inputFormatters: [ FilteringTextInputFormatter.allow( - RegExp(r'[a-zA-Z0-9@#$%^&*()_+={}|\[\]\\:;"<>,.?/~`-]')) + RegExp(r'[a-zA-Z0-9@#$%^&*()_+={}|\[\]\\:;"<>,.?/~`-]'), + ), ], decoration: InputDecoration(labelText: 'Domain atau IP:Port'), ), ], ), - actions: [ - ElevatedButton( - onPressed: () { - // Save value to SharedPreferences - saveSettings(inputController.text); - Navigator.of(context).pop(); // Close the modal - }, - child: Text('Simpan'), - ), - ], ); } - - Future saveSettings(String value) async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('savedValue', value); - - // Print the saved data - print('Value saved: $value'); - } - - Future clearSettings() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.remove('savedValue'); - print('Value cleared'); - } -} - -Future getSavedValue() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - String savedValue = prefs.getString('savedValue') ?? ''; - return savedValue; }