add auth, format

This commit is contained in:
Phuoc Nguyen
2025-11-07 11:52:06 +07:00
parent 24a8508fce
commit 3803bd26e0
173 changed files with 8505 additions and 7116 deletions

View File

@@ -54,13 +54,21 @@ class _ModelHousesPageState extends ConsumerState<ModelHousesPage>
children: [
Text('Đây là nội dung hướng dẫn sử dụng cho tính năng Nhà mẫu:'),
SizedBox(height: 12),
Text('• Tab "Thư viện Mẫu 360": Là nơi công ty cung cấp các mẫu thiết kế 360° có sẵn để bạn tham khảo.'),
Text(
'• Tab "Thư viện Mẫu 360": Là nơi công ty cung cấp các mẫu thiết kế 360° có sẵn để bạn tham khảo.',
),
SizedBox(height: 8),
Text('• Tab "Yêu cầu Thiết kế": Là nơi bạn gửi yêu cầu (ticket) để đội ngũ thiết kế của chúng tôi hỗ trợ bạn.'),
Text(
'• Tab "Yêu cầu Thiết kế": Là nơi bạn gửi yêu cầu (ticket) để đội ngũ thiết kế của chúng tôi hỗ trợ bạn.',
),
SizedBox(height: 8),
Text('• Bấm nút "+" trong tab "Yêu cầu Thiết kế" để tạo một Yêu cầu Thiết kế mới.'),
Text(
'• Bấm nút "+" trong tab "Yêu cầu Thiết kế" để tạo một Yêu cầu Thiết kế mới.',
),
SizedBox(height: 8),
Text('• Khi yêu cầu hoàn thành, bạn có thể xem link thiết kế 3D trong trang chi tiết yêu cầu.'),
Text(
'• Khi yêu cầu hoàn thành, bạn có thể xem link thiết kế 3D trong trang chi tiết yêu cầu.',
),
],
),
),
@@ -127,10 +135,7 @@ class _ModelHousesPageState extends ConsumerState<ModelHousesPage>
),
body: TabBarView(
controller: _tabController,
children: const [
_LibraryTab(),
_DesignRequestsTab(),
],
children: const [_LibraryTab(), _DesignRequestsTab()],
),
floatingActionButton: AnimatedBuilder(
animation: _tabController,
@@ -141,7 +146,11 @@ class _ModelHousesPageState extends ConsumerState<ModelHousesPage>
onPressed: _createNewRequest,
backgroundColor: AppColors.primaryBlue,
elevation: 4,
child: const Icon(Icons.add, color: AppColors.white, size: 28),
child: const Icon(
Icons.add,
color: AppColors.white,
size: 28,
),
)
: const SizedBox.shrink();
},
@@ -160,31 +169,39 @@ class _LibraryTab extends StatelessWidget {
padding: const EdgeInsets.all(20),
children: const [
_LibraryCard(
imageUrl: 'https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=800&h=200&fit=crop',
imageUrl:
'https://images.unsplash.com/photo-1600596542815-ffad4c1539a9?w=800&h=200&fit=crop',
title: 'Căn hộ Studio',
date: '15/11/2024',
description: 'Thiết kế hiện đại cho căn hộ studio 35m², tối ưu không gian sống với gạch men cao cấp và màu sắc hài hòa.',
description:
'Thiết kế hiện đại cho căn hộ studio 35m², tối ưu không gian sống với gạch men cao cấp và màu sắc hài hòa.',
has360View: true,
),
_LibraryCard(
imageUrl: 'https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&h=200&fit=crop',
imageUrl:
'https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&h=200&fit=crop',
title: 'Biệt thự Hiện đại',
date: '12/11/2024',
description: 'Biệt thự 3 tầng với phong cách kiến trúc hiện đại, sử dụng gạch granite và ceramic premium tạo điểm nhấn.',
description:
'Biệt thự 3 tầng với phong cách kiến trúc hiện đại, sử dụng gạch granite và ceramic premium tạo điểm nhấn.',
has360View: true,
),
_LibraryCard(
imageUrl: 'https://images.unsplash.com/photo-1562663474-6cbb3eaa4d14?w=800&h=200&fit=crop',
imageUrl:
'https://images.unsplash.com/photo-1562663474-6cbb3eaa4d14?w=800&h=200&fit=crop',
title: 'Nhà phố Tối giản',
date: '08/11/2024',
description: 'Nhà phố 4x15m với thiết kế tối giản, tận dụng ánh sáng tự nhiên và gạch men màu trung tính.',
description:
'Nhà phố 4x15m với thiết kế tối giản, tận dụng ánh sáng tự nhiên và gạch men màu trung tính.',
has360View: true,
),
_LibraryCard(
imageUrl: 'https://images.unsplash.com/photo-1600607687939-ce8a6c25118c?w=800&h=200&fit=crop',
imageUrl:
'https://images.unsplash.com/photo-1600607687939-ce8a6c25118c?w=800&h=200&fit=crop',
title: 'Chung cư Cao cấp',
date: '05/11/2024',
description: 'Căn hộ 3PN với nội thất sang trọng, sử dụng gạch marble và ceramic cao cấp nhập khẩu Italy.',
description:
'Căn hộ 3PN với nội thất sang trọng, sử dụng gạch marble và ceramic cao cấp nhập khẩu Italy.',
has360View: true,
),
],
@@ -212,15 +229,15 @@ class _LibraryCard extends StatelessWidget {
Widget build(BuildContext context) {
return Card(
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: const EdgeInsets.only(bottom: 20),
child: InkWell(
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Chức năng xem chi tiết sẽ được triển khai trong phiên bản tiếp theo'),
content: Text(
'Chức năng xem chi tiết sẽ được triển khai trong phiên bản tiếp theo',
),
),
);
},
@@ -243,9 +260,7 @@ class _LibraryCard extends StatelessWidget {
placeholder: (context, url) => Container(
height: 200,
color: AppColors.grey100,
child: const Center(
child: CircularProgressIndicator(),
),
child: const Center(child: CircularProgressIndicator()),
),
errorWidget: (context, url, error) => Container(
height: 200,
@@ -381,11 +396,7 @@ class _DesignRequestsTab extends StatelessWidget {
}
/// Design Request Status
enum DesignRequestStatus {
pending,
designing,
completed,
}
enum DesignRequestStatus { pending, designing, completed }
/// Request Card Widget
class _RequestCard extends StatelessWidget {
@@ -438,13 +449,13 @@ class _RequestCard extends StatelessWidget {
Widget build(BuildContext context) {
return Card(
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
margin: const EdgeInsets.only(bottom: 16),
child: InkWell(
onTap: () {
context.push('/model-houses/design-request/${code.replaceAll('#', '')}');
context.push(
'/model-houses/design-request/${code.replaceAll('#', '')}',
);
},
borderRadius: BorderRadius.circular(12),
child: Padding(
@@ -490,10 +501,7 @@ class _RequestCard extends StatelessWidget {
// Date
Text(
'Ngày gửi: $date',
style: const TextStyle(
fontSize: 14,
color: AppColors.grey500,
),
style: const TextStyle(fontSize: 14, color: AppColors.grey500),
),
const SizedBox(height: 8),
@@ -501,10 +509,7 @@ class _RequestCard extends StatelessWidget {
// Description
Text(
description,
style: const TextStyle(
fontSize: 14,
color: AppColors.grey900,
),
style: const TextStyle(fontSize: 14, color: AppColors.grey900),
),
],
),