Skip to content

Commit

Permalink
Merge pull request #19 from HaiAu2501/trial
Browse files Browse the repository at this point in the history
Trial
  • Loading branch information
HaiAu2501 authored Oct 13, 2024
2 parents da6a928 + 21d0c92 commit 2c76162
Show file tree
Hide file tree
Showing 8 changed files with 1,219 additions and 426 deletions.
66 changes: 41 additions & 25 deletions lib/features/admin/data/admin_repository.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// lib/features/admin/data/admin_repository.dart
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:uuid/uuid.dart';
import '../../.authentication/data/auth_service.dart';

class AdminRepository {
Expand All @@ -10,26 +9,43 @@ class AdminRepository {

AdminRepository({required this.apiKey, required this.projectId});

// Hàm lấy danh sách chờ duyệt
Future<List<dynamic>> fetchQueue(String idToken) async {
final url = 'https://firestore.googleapis.com/v1/projects/$projectId/databases/(default)/documents/queue?key=$apiKey';

final response = await http.get(
Uri.parse(url),
headers: {
'Authorization': 'Bearer $idToken',
'Content-Type': 'application/json',
},
);

if (response.statusCode == 200) {
final data = jsonDecode(response.body);
return data['documents'] ?? [];
} else {
throw Exception('Lỗi khi tải queue: ${response.statusCode} ${response.body}');
}
// Hàm lấy tất cả danh sách chờ duyệt với phân trang
Future<List<dynamic>> fetchAllQueue(String idToken) async {
List<dynamic> allDocuments = [];
String? nextPageToken;
const int pageSize = 100; // Firestore REST API có giới hạn tối đa pageSize là 100

do {
// Tạo URL với các tham số phân trang và sắp xếp
String url = 'https://firestore.googleapis.com/v1/projects/$projectId/databases/(default)/documents/queue?key=$apiKey&pageSize=$pageSize&orderBy=fullName';

if (nextPageToken != null && nextPageToken.isNotEmpty) {
url += '&pageToken=$nextPageToken';
}

final response = await http.get(
Uri.parse(url),
headers: {
'Authorization': 'Bearer $idToken',
'Content-Type': 'application/json',
},
);

if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final documents = data['documents'] ?? [];
allDocuments.addAll(documents);
nextPageToken = data['nextPageToken'];
} else {
throw Exception('Lỗi khi tải queue: ${response.statusCode} ${response.body}');
}
} while (nextPageToken != null);

return allDocuments;
}

// Các phương thức khác không thay đổi...

// Hàm lấy danh sách cư dân
Future<List<dynamic>> fetchResidents(String idToken) async {
final url = 'https://firestore.googleapis.com/v1/projects/$projectId/databases/(default)/documents/residents?key=$apiKey';
Expand Down Expand Up @@ -158,10 +174,10 @@ class AdminRepository {
final url = 'https://firestore.googleapis.com/v1/$documentName?key=$apiKey&$updateMask';

// **Debug:** In URL và payload
print('Update URL: $url');
print('Payload: ${jsonEncode({
'fields': updatedData.map((key, value) => MapEntry(key, _encodeField(value))),
})}');
// print('Update URL: $url');
// print('Payload: ${jsonEncode({
// 'fields': updatedData.map((key, value) => MapEntry(key, _encodeField(value))),
// })}');

final response = await http.patch(
Uri.parse(url),
Expand All @@ -175,8 +191,8 @@ class AdminRepository {
);

// **Debug:** In phản hồi từ Firestore
print('Response Status: ${response.statusCode}');
print('Response Body: ${response.body}');
// print('Response Status: ${response.statusCode}');
// print('Response Body: ${response.body}');

if (response.statusCode == 200) {
// Cập nhật thành công
Expand Down
2 changes: 1 addition & 1 deletion lib/features/admin/presentation/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ class _AdminHomePageState extends State<AdminHomePage> {
Expanded(
child: Scaffold(
appBar: AppBar(
title: const Text('Trang Chủ Admin'),
title: const Text('Trang chủ Quản trị viên'),
backgroundColor: Colors.white,
actions: [
IconButton(
Expand Down
107 changes: 107 additions & 0 deletions lib/features/admin/presentation/tabs/guests_tab.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// lib/features/admin/presentation/tabs/guests_tab.dart
import 'package:flutter/material.dart';
import '../../data/admin_repository.dart';
import 'package:intl/intl.dart';

class GuestsTab extends StatefulWidget {
final AdminRepository adminRepository;
final String idToken;

const GuestsTab({
super.key,
required this.adminRepository,
required this.idToken,
});

@override
_GuestsTabState createState() => _GuestsTabState();
}

class _GuestsTabState extends State<GuestsTab> {
List<dynamic> guestsList = [];
bool isLoadingGuests = false;

@override
void initState() {
super.initState();
fetchGuests();
}

@override
void dispose() {
// Nếu bạn có các Stream hoặc các đối tượng khác cần hủy bỏ, hãy thực hiện ở đây.
super.dispose();
}

// Hàm lấy danh sách khách
Future<void> fetchGuests() async {
setState(() {
isLoadingGuests = true;
});

try {
List<dynamic> fetchedGuests = await widget.adminRepository.fetchGuests(widget.idToken);
if (!mounted) return; // Kiểm tra nếu widget vẫn còn mount
setState(() {
guestsList = fetchedGuests;
isLoadingGuests = false;
});
} catch (e) {
if (!mounted) return; // Kiểm tra nếu widget vẫn còn mount
setState(() {
// Xử lý lỗi nếu cần
isLoadingGuests = false;
});
print('Lỗi khi tải guests: $e');
}
}

// Hàm định dạng ngày sinh
String formatDob(String dobString) {
try {
// Giả sử dobString có định dạng DD/MM/YYYY
DateFormat inputFormat = DateFormat('dd/MM/yyyy');
DateFormat outputFormat = DateFormat('dd/MM/yyyy');
DateTime date = inputFormat.parse(dobString);
return outputFormat.format(date);
} catch (e) {
return dobString; // Nếu không thể định dạng, trả về nguyên bản
}
}

@override
Widget build(BuildContext context) {
if (isLoadingGuests) {
return const Center(child: CircularProgressIndicator());
}

if (guestsList.isEmpty) {
return const Center(child: Text('Không có khách nào.'));
}

return ListView.builder(
itemCount: guestsList.length,
itemBuilder: (context, index) {
final doc = guestsList[index];
final fields = doc['fields'];
return Card(
child: ListTile(
title: Text(fields['fullName']['stringValue']),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Giới tính: ${fields['gender']['stringValue']}'),
Text('Ngày sinh: ${formatDob(fields['dob']['stringValue'])}'),
Text('Số điện thoại: ${fields['phone']['stringValue']}'),
Text('Số ID: ${fields['id']['stringValue']}'),
Text('Email: ${fields['email']['stringValue']}'),
Text('Chức vụ: ${fields['jobTitle']['stringValue']}'),
Text('Trạng thái: ${fields['status']['stringValue']}'),
],
),
),
);
},
);
}
}
Loading

0 comments on commit 2c76162

Please sign in to comment.