You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
450 lines
14 KiB
450 lines
14 KiB
1 year ago
|
import 'dart:async';
|
||
|
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:provider/provider.dart';
|
||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||
|
import '../../models/user_model.dart';
|
||
|
import '../../providers/auth_provider.dart';
|
||
|
import 'package:intl/intl.dart';
|
||
|
import 'package:intl/date_symbol_data_local.dart';
|
||
|
|
||
|
import '../../theme.dart';
|
||
|
|
||
|
class HomePage extends StatefulWidget {
|
||
|
@override
|
||
|
State<HomePage> createState() => _HomePageState();
|
||
|
}
|
||
|
|
||
|
class _HomePageState extends State<HomePage> {
|
||
|
String? token;
|
||
|
// final items = ["Android", "iOS", "Desktop", "Web"];
|
||
|
// final items = ['assets/gps_samara.jpeg'];
|
||
|
final items = [
|
||
|
'https://mypertamina.id/uploads/posts/Survey-Bright-Cafe-2021-1024x576.jpg',
|
||
|
'https://grhaproperti.com/wp-content/uploads/2022/05/banner-survey-on-520.jpg',
|
||
|
'https://grhaproperti.com/wp-content/uploads/2022/05/banner-properti-agent-1-1.jpg'
|
||
|
];
|
||
|
|
||
|
// bool isLoading = true;
|
||
|
@override
|
||
|
void initState() {
|
||
|
super.initState();
|
||
|
initializeDateFormatting("id_ID", null); // Inisialisasi pustaka intl
|
||
|
_getUserToken();
|
||
|
}
|
||
|
|
||
|
void _getUserToken() async {
|
||
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||
|
if (mounted) {
|
||
|
setState(() {
|
||
|
token = prefs.getString('token');
|
||
|
// getInit(); // Panggil getInit jika token sudah didapatkan
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
void dispose() {
|
||
|
// Memastikan untuk membatalkan timer saat widget di-dispose
|
||
|
super.dispose();
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
AuthProvider authProvider = Provider.of<AuthProvider>(context);
|
||
|
UserModel user = authProvider.user;
|
||
|
// String? token = authProvider.token;
|
||
|
|
||
|
Widget header() {
|
||
|
return Container(
|
||
|
margin: EdgeInsets.only(
|
||
|
top: defaultMargin,
|
||
|
left: 10,
|
||
|
right: 10,
|
||
|
bottom: 15.5,
|
||
|
),
|
||
|
child: Row(
|
||
|
children: [
|
||
|
Expanded(
|
||
|
child: Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||
|
children: [
|
||
|
Text(
|
||
|
'Hallo, ${user.email}',
|
||
|
style: primaryTextStyle.copyWith(
|
||
|
fontSize: 16,
|
||
|
fontWeight: semiBold,
|
||
|
),
|
||
|
),
|
||
|
Text(
|
||
|
'${user.email}',
|
||
|
style: subtitleTextStyle.copyWith(
|
||
|
fontSize: 14,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
Stack(
|
||
|
children: [
|
||
|
GestureDetector(
|
||
|
onTap: () {
|
||
|
// Tambahkan aksi yang ingin Anda lakukan ketika ikon notifikasi diklik di sini
|
||
|
},
|
||
|
child: Icon(
|
||
|
Icons
|
||
|
.notifications, // Ubah ikon notifikasi sesuai kebutuhan
|
||
|
size: 30,
|
||
|
color: Colors.blue[700], // Ubah warna sesuai kebutuhan
|
||
|
),
|
||
|
),
|
||
|
Positioned(
|
||
|
right: 0,
|
||
|
top: 0,
|
||
|
child: Container(
|
||
|
padding: EdgeInsets.all(4),
|
||
|
decoration: BoxDecoration(
|
||
|
shape: BoxShape.circle,
|
||
|
color: Colors.red, // Warna latar belakang notifikasi
|
||
|
),
|
||
|
child: Text(
|
||
|
'1', // Jumlah notifikasi (Anda dapat mengubahnya sesuai kebutuhan)
|
||
|
style: TextStyle(
|
||
|
color: Colors.white, // Warna teks notifikasi
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget subHeader() {
|
||
|
return Card(
|
||
|
margin: EdgeInsets.only(
|
||
|
top: 10,
|
||
|
left: 10,
|
||
|
right: 10,
|
||
|
),
|
||
|
child: Container(
|
||
|
padding: EdgeInsets.all(15),
|
||
|
child: Column(
|
||
|
children: [
|
||
|
Row(
|
||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
|
children: [
|
||
|
Text(
|
||
|
'Pengumuman',
|
||
|
style: TextStyle(
|
||
|
fontSize: 14,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
),
|
||
|
),
|
||
|
Text(
|
||
|
DateFormat('dd MMMM yyyy', 'id_ID').format(DateTime.now()),
|
||
|
style: TextStyle(
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
SizedBox(height: 10),
|
||
|
Text(
|
||
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl eget aliquet ultricies, nunc nisl aliquam nisl, vitae aliquam nisl nisl eget nisl. Donec euismod, nisl eget aliquet ultricies, nunc nisl aliquam nisl, vitae aliquam nisl nisl eget nisl.',
|
||
|
style: TextStyle(
|
||
|
fontSize: 11.5,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget titleMenu() {
|
||
|
return Container(
|
||
|
margin: EdgeInsets.only(
|
||
|
top: 5,
|
||
|
left: 10,
|
||
|
right: 10,
|
||
|
bottom: 5,
|
||
|
),
|
||
|
child: Row(
|
||
|
children: [
|
||
|
Expanded(
|
||
|
child: Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||
|
children: [
|
||
|
Row(
|
||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
|
children: [
|
||
|
Text(
|
||
|
'Menu Apps',
|
||
|
style: primaryTextStyle.copyWith(
|
||
|
fontSize: 16,
|
||
|
fontWeight: semiBold,
|
||
|
),
|
||
|
),
|
||
|
Text(
|
||
|
'See All',
|
||
|
style: TextStyle(fontSize: 12, color: Colors.blue[700]),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget cardMenu(String title, IconData icon, Function() onTap) {
|
||
|
return Card(
|
||
|
margin: EdgeInsets.all(10),
|
||
|
child: InkWell(
|
||
|
onTap: onTap,
|
||
|
child: Container(
|
||
|
padding: EdgeInsets.all(10), // Mengurangi padding
|
||
|
child: Column(
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
children: <Widget>[
|
||
|
Icon(icon, size: 20), // Mengurangi ukuran ikon
|
||
|
SizedBox(height: 5), // Mengurangi jarak
|
||
|
Center(
|
||
|
child: Text(
|
||
|
title,
|
||
|
style: TextStyle(fontSize: 12), // Mengurangi ukuran teks
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget cardTotal(String title, int total, IconData icon) {
|
||
|
return Expanded(
|
||
|
child: Card(
|
||
|
margin: EdgeInsets.all(5),
|
||
|
child: Container(
|
||
|
padding: EdgeInsets.all(5),
|
||
|
child: Column(
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
children: <Widget>[
|
||
|
Icon(
|
||
|
icon,
|
||
|
size: 20,
|
||
|
color: Colors.blue[700],
|
||
|
),
|
||
|
SizedBox(height: 2),
|
||
|
Text(
|
||
|
title,
|
||
|
style: TextStyle(
|
||
|
fontSize: 8,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
),
|
||
|
textAlign: TextAlign.center,
|
||
|
),
|
||
|
SizedBox(height: 2),
|
||
|
Text(
|
||
|
total.toString(),
|
||
|
style: TextStyle(
|
||
|
fontSize: 14,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
color: Colors.blue[700],
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget cardRow() {
|
||
|
return Column(
|
||
|
children: [
|
||
|
Row(
|
||
|
children: [
|
||
|
cardTotal('PENGADAAN', 0, Icons.shopping_cart),
|
||
|
cardTotal('PEMINJAMAN', 0, Icons.shopping_basket),
|
||
|
],
|
||
|
),
|
||
|
SizedBox(height: 5),
|
||
|
Row(
|
||
|
children: [
|
||
|
cardTotal('PENGEMBALIAN', 0, Icons.reply),
|
||
|
cardTotal('REMINDER PENGEMBALIAN', 0, Icons.access_alarm),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget _buildDrawer() {
|
||
|
return SizedBox(
|
||
|
//membuat menu drawer
|
||
|
child: Drawer(
|
||
|
//membuat list,
|
||
|
//list digunakan untuk melakukan scrolling jika datanya terlalu panjang
|
||
|
child: ListView(
|
||
|
padding: EdgeInsets.zero,
|
||
|
//di dalam listview ini terdapat beberapa widget drawable
|
||
|
children: [
|
||
|
UserAccountsDrawerHeader(
|
||
|
//membuat gambar profil
|
||
|
currentAccountPicture: Image(
|
||
|
image: NetworkImage(
|
||
|
"https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png")),
|
||
|
//membuat nama akun
|
||
|
accountName: Text("Sahretech"),
|
||
|
//membuat nama email
|
||
|
accountEmail: Text("ig: @sahretech"),
|
||
|
//memberikan background
|
||
|
decoration: BoxDecoration(
|
||
|
image: DecorationImage(
|
||
|
image: NetworkImage(
|
||
|
"https://cdn.pixabay.com/photo/2016/04/24/20/52/laundry-1350593_960_720.jpg"),
|
||
|
fit: BoxFit.cover)),
|
||
|
),
|
||
|
//membuat list menu
|
||
|
ListTile(
|
||
|
leading: Icon(Icons.home),
|
||
|
title: Text("Beranda"),
|
||
|
onTap: () {},
|
||
|
),
|
||
|
ListTile(
|
||
|
leading: Icon(Icons.people),
|
||
|
title: Text("Pegawai"),
|
||
|
onTap: () {},
|
||
|
),
|
||
|
ListTile(
|
||
|
leading: Icon(Icons.money),
|
||
|
title: Text("Transaksi"),
|
||
|
onTap: () {},
|
||
|
),
|
||
|
Divider(),
|
||
|
ListTile(
|
||
|
leading: Icon(Icons.emoji_emotions),
|
||
|
title: Text("Profil"),
|
||
|
onTap: () {},
|
||
|
),
|
||
|
ListTile(
|
||
|
leading: Icon(Icons.info),
|
||
|
title: Text("Tentang"),
|
||
|
onTap: () {},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return Scaffold(
|
||
|
backgroundColor: Colors.grey[100],
|
||
|
appBar: AppBar(
|
||
|
elevation: 0,
|
||
|
// automaticallyImplyLeading: true,
|
||
|
backgroundColor: Colors.indigo[700],
|
||
|
title: Row(
|
||
|
children: [
|
||
|
SizedBox(width: 10),
|
||
|
Expanded(
|
||
|
child: Center(
|
||
|
child: Column(
|
||
|
children: [
|
||
|
Text(
|
||
|
'Beranda',
|
||
|
textAlign: TextAlign.center,
|
||
|
),
|
||
|
Text(
|
||
|
'User Fullname',
|
||
|
style: TextStyle(
|
||
|
fontSize: 10,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
actions: [
|
||
|
Align(
|
||
|
alignment: Alignment.center,
|
||
|
child: Stack(
|
||
|
children: [
|
||
|
GestureDetector(
|
||
|
onTap: () {
|
||
|
// Tambahkan aksi yang diinginkan saat ikon ditekan
|
||
|
},
|
||
|
child: Icon(
|
||
|
Icons.notifications,
|
||
|
color: Colors.white,
|
||
|
size: 30,
|
||
|
),
|
||
|
),
|
||
|
Positioned(
|
||
|
right: 0,
|
||
|
top: 0,
|
||
|
child: Container(
|
||
|
padding: EdgeInsets.all(4),
|
||
|
decoration: BoxDecoration(
|
||
|
shape: BoxShape.circle,
|
||
|
color: Colors.red, // Warna latar belakang notifikasi
|
||
|
),
|
||
|
child: Text(
|
||
|
'5',
|
||
|
style: TextStyle(
|
||
|
color: Colors.white, // Warna teks notifikasi
|
||
|
fontSize: 12,
|
||
|
fontWeight: FontWeight.bold,
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
),
|
||
|
SizedBox(width: 10),
|
||
|
],
|
||
|
),
|
||
|
drawer: _buildDrawer(),
|
||
|
body: ListView(
|
||
|
children: [
|
||
|
// header(),
|
||
|
subHeader(),
|
||
|
SizedBox(height: 10),
|
||
|
cardRow(),
|
||
|
titleMenu(),
|
||
|
GridView.count(
|
||
|
crossAxisCount: 2,
|
||
|
shrinkWrap: true,
|
||
|
physics: NeverScrollableScrollPhysics(),
|
||
|
children: [
|
||
|
cardMenu("Return Stock", Icons.access_alarm, () {
|
||
|
// Aksi yang ingin Anda tambahkan untuk Menu 1
|
||
|
Navigator.pushNamed(context, '/peminjaman-barang');
|
||
|
}),
|
||
|
cardMenu("Receive Stock", Icons.accessibility, () {
|
||
|
// Aksi yang ingin Anda tambahkan untuk Menu 2
|
||
|
}),
|
||
|
cardMenu("Menu 3", Icons.account_balance, () {
|
||
|
// Aksi yang ingin Anda tambahkan untuk Menu 3
|
||
|
}),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|