cashumit/lib/widgets/store_info_config_dialog.dart

192 lines
6.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
/// Widget untuk dialog konfigurasi informasi toko
class StoreInfoConfigDialog extends StatefulWidget {
const StoreInfoConfigDialog({super.key});
@override
State<StoreInfoConfigDialog> createState() => _StoreInfoConfigDialogState();
}
class _StoreInfoConfigDialogState extends State<StoreInfoConfigDialog> {
final _formKey = GlobalKey<FormState>();
// Inisialisasi controller dengan nilai default
final TextEditingController _storeNameController = TextEditingController();
final TextEditingController _storeAddressController = TextEditingController();
final TextEditingController _adminNameController = TextEditingController();
final TextEditingController _adminPhoneController = TextEditingController();
// Variabel untuk logo
String? _logoPath;
final ImagePicker _picker = ImagePicker();
@override
void initState() {
super.initState();
_loadStoreInfo();
}
/// Memuat informasi toko dari shared preferences
Future<void> _loadStoreInfo() async {
final prefs = await SharedPreferences.getInstance();
// Set nilai teks controller setelah mendapatkan data
setState(() {
_storeNameController.text = prefs.getString('store_name') ?? 'TOKO SEMBAKO MURAH';
_storeAddressController.text = prefs.getString('store_address') ?? 'Jl. Merdeka No. 123';
_adminNameController.text = prefs.getString('admin_name') ?? 'Budi Santoso';
_adminPhoneController.text = prefs.getString('admin_phone') ?? '08123456789';
_logoPath = prefs.getString('store_logo_path'); // Load logo path
});
}
/// Menyimpan informasi toko ke shared preferences
Future<void> _saveStoreInfo() async {
if (_formKey.currentState!.validate()) {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('store_name', _storeNameController.text);
await prefs.setString('store_address', _storeAddressController.text);
await prefs.setString('admin_name', _adminNameController.text);
await prefs.setString('admin_phone', _adminPhoneController.text);
// Save logo path
if (_logoPath != null) {
await prefs.setString('store_logo_path', _logoPath!);
} else {
await prefs.remove('store_logo_path');
}
if (mounted) {
Navigator.of(context).pop(true); // Kembali dengan nilai true jika berhasil disimpan
}
}
}
/// Memilih logo dari galeri
Future<void> _pickImage() async {
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
if (image != null && mounted) {
setState(() {
_logoPath = image.path;
});
}
}
@override
void dispose() {
_storeNameController.dispose();
_storeAddressController.dispose();
_adminNameController.dispose();
_adminPhoneController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Text('Konfigurasi Info Toko'),
content: Form(
key: _formKey,
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Display selected logo or a placeholder
GestureDetector(
onTap: _pickImage,
child: Container(
height: 100,
width: 100,
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(8),
),
child: _logoPath != null
? ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.file(File(_logoPath!), fit: BoxFit.cover),
)
: const Icon(Icons.add_a_photo, size: 40, color: Colors.grey),
),
),
const SizedBox(height: 8),
const Text('Ketuk untuk memilih logo toko', style: TextStyle(fontSize: 12)),
const SizedBox(height: 16),
TextFormField(
controller: _storeNameController,
decoration: const InputDecoration(
labelText: 'Nama Toko',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Mohon masukkan nama toko';
}
return null;
},
),
const SizedBox(height: 16),
TextFormField(
controller: _storeAddressController,
decoration: const InputDecoration(
labelText: 'Alamat Toko',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Mohon masukkan alamat toko';
}
return null;
},
),
const SizedBox(height: 16),
TextFormField(
controller: _adminNameController,
decoration: const InputDecoration(
labelText: 'Nama Admin',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Mohon masukkan nama admin';
}
return null;
},
),
const SizedBox(height: 16),
TextFormField(
controller: _adminPhoneController,
decoration: const InputDecoration(
labelText: 'No. Telp Admin',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Mohon masukkan no. telp admin';
}
return null;
},
),
],
),
),
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(false), // Kembali dengan nilai false jika dibatalkan
child: const Text('Batal'),
),
ElevatedButton(
onPressed: _saveStoreInfo,
child: const Text('Simpan'),
),
],
);
}
}