216 lines
6.6 KiB
Dart
216 lines
6.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
import 'package:piring_baru/Signup/signup_screen.dart';
|
|
import 'package:piring_baru/components/already_have_an_account_acheck.dart';
|
|
import 'package:piring_baru/components/constants.dart';
|
|
import 'package:piring_baru/dashboard/dashboard.dart';
|
|
import 'package:piring_baru/lupaPassword/lupaPassword.dart';
|
|
import 'package:piring_baru/model/user.dart';
|
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
import 'dart:convert';
|
|
|
|
class LupaAutentikasi extends StatefulWidget {
|
|
const LupaAutentikasi({
|
|
Key? key,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
State<LupaAutentikasi> createState() => _LupaAutentikasiState();
|
|
}
|
|
|
|
class _LupaAutentikasiState extends State<LupaAutentikasi> {
|
|
final TextEditingController _usernameController = TextEditingController();
|
|
final TextEditingController _passwordController = TextEditingController();
|
|
|
|
String clientId = "PKL2023";
|
|
String clientSecret = "PKLSERU";
|
|
String tokenUrl = "https://isipiringku.esolusindo.com/api/Token/token";
|
|
|
|
String accessToken = "";
|
|
late UserData userData;
|
|
Future<void> getToken() async {
|
|
try {
|
|
var response = await http.post(
|
|
Uri.parse(tokenUrl),
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
},
|
|
body: {
|
|
'grant_type': 'client_credentials',
|
|
'client_id': clientId,
|
|
'client_secret': clientSecret,
|
|
},
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
Map<String, dynamic> tokenData = jsonDecode(response.body);
|
|
accessToken = tokenData['access_token'];
|
|
print('Token Akses: $accessToken');
|
|
} else {
|
|
print('Gagal mendapatkan token: ${response.statusCode}');
|
|
}
|
|
} catch (e) {
|
|
print('Gagal mendapatkan token: $e');
|
|
}
|
|
}
|
|
|
|
Future<void> _login() async {
|
|
final String username = _usernameController.text;
|
|
final String password = _passwordController.text;
|
|
|
|
await getToken(); // Memanggil fungsi getToken untuk mendapatkan token OAuth2
|
|
|
|
// Membuat request body
|
|
final Map<String, String> data = {
|
|
"username": username,
|
|
"password": password,
|
|
};
|
|
|
|
// Mengirim permintaan HTTP POST ke API dengan menyertakan token
|
|
final response = await http.post(
|
|
Uri.parse('https://isipiringku.esolusindo.com/api/Login/Login'),
|
|
headers: {
|
|
'Authorization':
|
|
'Bearer $accessToken', // Menyertakan token dalam header
|
|
},
|
|
body: data,
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
final responseData = json.decode(response.body);
|
|
|
|
// Simpan data pengguna ke SharedPreferences
|
|
|
|
print(responseData);
|
|
userData = UserData.fromJson(responseData['response']);
|
|
final prefs = await SharedPreferences.getInstance();
|
|
prefs.setString('access_token', accessToken);
|
|
// Simpan data pengguna lainnya jika diperlukan
|
|
prefs.setString('user_data', json.encode(userData.toJson()));
|
|
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => Dashboard(),
|
|
));
|
|
} else {
|
|
final responseData = json.decode(response.body);
|
|
|
|
if (responseData['response'] != null) {
|
|
final errorMessage = 'username atau password salah';
|
|
Fluttertoast.showToast(
|
|
msg: errorMessage,
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
gravity: ToastGravity.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
textColor: Colors.white,
|
|
);
|
|
} else {
|
|
print('Gagal masuk: ${response.statusCode}');
|
|
print('Pesan kesalahan: ${response.body}');
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Ambil token saat halaman login dimuat
|
|
getToken();
|
|
|
|
// Periksa apakah token akses sudah ada
|
|
checkUserSession();
|
|
}
|
|
|
|
Future<void> checkUserSession() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final savedAccessToken = prefs.getString('access_token');
|
|
|
|
if (savedAccessToken != null) {
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => Dashboard()),
|
|
);
|
|
// Token akses sudah ada, mungkin pengguna sudah masuk
|
|
// Anda dapat memeriksa validitas token di sini
|
|
// Misalnya, jika token kedaluwarsa, Anda dapat mengarahkan pengguna untuk logout
|
|
// atau memperbarui token.
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Form(
|
|
child: Column(
|
|
children: [
|
|
TextFormField(
|
|
controller: _usernameController,
|
|
keyboardType: TextInputType.emailAddress,
|
|
textInputAction: TextInputAction.next,
|
|
cursorColor: kPrimaryColor,
|
|
decoration: InputDecoration(
|
|
hintText: "Username",
|
|
prefixIcon: Padding(
|
|
padding: const EdgeInsets.all(defaultPadding),
|
|
child: Icon(Icons.person),
|
|
),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: defaultPadding),
|
|
child: TextFormField(
|
|
controller: _passwordController,
|
|
textInputAction: TextInputAction.done,
|
|
obscureText: true,
|
|
cursorColor: kPrimaryColor,
|
|
decoration: InputDecoration(
|
|
hintText: "Password",
|
|
prefixIcon: Padding(
|
|
padding: const EdgeInsets.all(defaultPadding),
|
|
child: Icon(Icons.lock),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(height: defaultPadding),
|
|
ElevatedButton(
|
|
onPressed: () {
|
|
// Navigator.pushReplacement(
|
|
// context,
|
|
// MaterialPageRoute(
|
|
// builder: (context) => (),
|
|
// ));
|
|
},
|
|
child: Text('Lupa Password')),
|
|
const SizedBox(height: defaultPadding),
|
|
Hero(
|
|
tag: "login_btn",
|
|
child: ElevatedButton(
|
|
onPressed: _login,
|
|
child: Text(
|
|
"Login".toUpperCase(),
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(height: defaultPadding),
|
|
AlreadyHaveAnAccountCheck(
|
|
press: () {
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) {
|
|
return SignUpScreen();
|
|
},
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|