feat: Add dashboard layout with sidebar and main content area
- Implemented AppFooter widget for mobile and desktop views. - Created ChildrenSidebar widget to display children's information. - Developed AppLayout to manage app structure with optional footer. - Added ChildrenSidebar for selecting children and displaying their status. - Introduced DashboardAppBar for navigation and user actions. - Built WMainContentArea for displaying assistant details and calendar. - Created MainContentArea to manage contracts and events display. - Implemented MessagingSidebar for messaging functionality. - Updated widget tests to reflect new structure and imports.
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
import 'package:p_tits_pas/models/m_dashbord/assistant_model.dart';
|
||||
import 'package:p_tits_pas/models/m_dashbord/child_model.dart';
|
||||
import 'package:p_tits_pas/models/m_dashbord/contract_model.dart';
|
||||
import 'package:p_tits_pas/models/m_dashbord/conversation_model.dart';
|
||||
import 'package:p_tits_pas/models/m_dashbord/event_model.dart';
|
||||
import 'package:p_tits_pas/models/m_dashbord/notification_model.dart';
|
||||
|
||||
class DashboardService {
|
||||
// URL de base de l'API
|
||||
static const String _baseUrl = 'YOUR_API_BASE_URL';
|
||||
|
||||
// Récupérer la liste des enfants
|
||||
Future<List<ChildModel>> getChildren() async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
// Exemple de mock data pour le développement
|
||||
return [
|
||||
ChildModel(
|
||||
id: '1',
|
||||
firstName: 'Emma',
|
||||
birthDate: DateTime(2020, 5, 15),
|
||||
photoUrl: 'assets/images/child1.jpg',
|
||||
status: ChildStatus.onHoliday,
|
||||
),
|
||||
ChildModel(
|
||||
id: '2',
|
||||
firstName: 'Lucas',
|
||||
birthDate: DateTime(2021, 3, 10),
|
||||
photoUrl: 'assets/images/child2.jpg',
|
||||
status: ChildStatus.searching,
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des enfants: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer l'assistante maternelle pour un enfant
|
||||
Future<AssistantModel> getAssistantForChild(String childId) async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return AssistantModel(
|
||||
id: 'am1',
|
||||
firstName: 'Marie',
|
||||
lastName: 'Dupont',
|
||||
hourlyRate: 10.0,
|
||||
dailyFees: 80.0,
|
||||
status: AssistantStatus.available,
|
||||
photoUrl: 'assets/images/assistant1.jpg',
|
||||
address: '123 rue des Lilas',
|
||||
phone: '0123456789',
|
||||
);
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération de l\'assistante: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les événements pour un enfant
|
||||
Future<List<EventModel>> getEventsForChild(String childId) async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
EventModel(
|
||||
id: 'evt1',
|
||||
title: 'Rendez-vous médical',
|
||||
startDate: DateTime.now().add(const Duration(days: 2)),
|
||||
type: EventType.parentVacation,
|
||||
status: EventStatus.pending,
|
||||
description: 'Visite de routine',
|
||||
childId: childId,
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des événements: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer tous les événements à venir
|
||||
Future<List<EventModel>> getUpcomingEvents() async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
EventModel(
|
||||
id: 'evt1',
|
||||
title: 'Activité peinture',
|
||||
startDate: DateTime.now().add(const Duration(days: 1)),
|
||||
endDate: DateTime.now().add(const Duration(days: 1, hours: 2)),
|
||||
type: EventType.parentVacation,
|
||||
status: EventStatus.pending,
|
||||
description: 'Atelier créatif',
|
||||
childId: '1',
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des événements: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les contrats
|
||||
Future<List<ContractModel>> getContracts() async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
ContractModel(
|
||||
id: 'contract1',
|
||||
childId: '1',
|
||||
assistantId: 'am1',
|
||||
startDate: DateTime(2023, 9, 1),
|
||||
endDate: DateTime(2024, 8, 31),
|
||||
status: ContractStatus.pending,
|
||||
hourlyRate: 10.0,
|
||||
createdAt: DateTime.now(),
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des contrats: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les contrats pour un enfant spécifique
|
||||
Future<List<ContractModel>> getContractsForChild(String childId) async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
ContractModel(
|
||||
id: 'contract1',
|
||||
childId: childId,
|
||||
assistantId: 'am1',
|
||||
startDate: DateTime(2023, 9, 1),
|
||||
endDate: DateTime(2024, 8, 31),
|
||||
status: ContractStatus.active,
|
||||
hourlyRate: 10.0,
|
||||
createdAt: DateTime.now(),
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des contrats: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les conversations
|
||||
Future<List<ConversationModel>> getConversations() async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
ConversationModel(
|
||||
id: 'conv1',
|
||||
title: 'Conversation avec Marie Dupont',
|
||||
participantIds: ['am1'],
|
||||
messages: [
|
||||
MessageModel(
|
||||
id: 'msg1',
|
||||
content: 'Bonjour, comment ça va ?',
|
||||
senderId: 'am1',
|
||||
sentAt: DateTime.now().subtract(const Duration(hours: 2)),
|
||||
status: MessageStatus.read,
|
||||
),
|
||||
MessageModel(
|
||||
id: 'msg2',
|
||||
content: 'Tout va bien, merci !',
|
||||
senderId: 'parent1',
|
||||
sentAt: DateTime.now().subtract(const Duration(hours: 1, minutes: 30)),
|
||||
status: MessageStatus.read,
|
||||
),
|
||||
],
|
||||
lastMessageAt: DateTime.now().subtract(const Duration(hours: 2)),
|
||||
unreadCount: 2,
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des conversations: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les notifications
|
||||
Future<List<NotificationModel>> getNotifications() async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
return [
|
||||
NotificationModel(
|
||||
id: 'notif1',
|
||||
title: 'Nouveau message',
|
||||
createdAt: DateTime.now(),
|
||||
isRead: false,
|
||||
type: NotificationType.contractPending,
|
||||
content: 'Votre contrat est en attente',
|
||||
),
|
||||
];
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors de la récupération des notifications: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Marquer une notification comme lue
|
||||
Future<void> markNotificationAsRead(String notificationId) async {
|
||||
try {
|
||||
// TODO: Implémenter l'appel API
|
||||
} catch (e) {
|
||||
throw Exception('Erreur lors du marquage de la notification: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user