feat(02-02): create room providers, form screen, icon picker, and router routes

- Add Riverpod providers (roomWithStatsList, RoomActions) connecting to RoomsDao
- Create RoomFormScreen with name field, icon picker preview, create/edit modes
- Create IconPickerSheet bottom sheet with curated Material Icons grid
- Add nested GoRouter routes: /rooms/new, /rooms/:roomId, /rooms/:roomId/edit
- Add placeholder TaskListScreen and TaskFormScreen for Plan 03 routes
- Add 11 new German localization keys for room management UI
- Add flutter_reorderable_grid_view dependency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 22:00:57 +01:00
parent ead53b4c02
commit 32e61e4bec
11 changed files with 652 additions and 1 deletions

View File

@@ -0,0 +1,48 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:household_keeper/core/database/database.dart';
import 'package:household_keeper/core/providers/database_provider.dart';
import 'package:household_keeper/features/rooms/data/rooms_dao.dart';
part 'room_providers.g.dart';
/// Watches all rooms with computed task stats (due count, cleanliness ratio).
@riverpod
Stream<List<RoomWithStats>> roomWithStatsList(Ref ref) {
final db = ref.watch(appDatabaseProvider);
return db.roomsDao.watchRoomWithStats();
}
/// Async notifier for room mutation actions (create, update, delete, reorder).
@riverpod
class RoomActions extends _$RoomActions {
@override
FutureOr<void> build() {}
/// Create a new room. Returns the auto-generated id.
Future<int> createRoom(String name, String iconName) async {
final db = ref.read(appDatabaseProvider);
return db.roomsDao.insertRoom(RoomsCompanion.insert(
name: name,
iconName: iconName,
));
}
/// Update an existing room.
Future<void> updateRoom(Room room) async {
final db = ref.read(appDatabaseProvider);
await db.roomsDao.updateRoom(room);
}
/// Delete a room and cascade to its tasks and completions.
Future<void> deleteRoom(int roomId) async {
final db = ref.read(appDatabaseProvider);
await db.roomsDao.deleteRoom(roomId);
}
/// Reorder rooms by their IDs in the new order.
Future<void> reorderRooms(List<int> roomIds) async {
final db = ref.read(appDatabaseProvider);
await db.roomsDao.reorderRooms(roomIds);
}
}