This repository has been archived on 2026-06-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
FabledApp/lib/providers/notes_provider.dart
T
bvandeusen fceae5529d Add Projects feature; sync Note/Task models with backend additions
## New: Projects
- Project model, API, repository, Riverpod provider
- ProjectListScreen: active/archived sections, create dialog, long-press status/delete
- ProjectSelector widget: DropdownButtonFormField for note + task editors
- Projects tab added to shell (bottom nav + navigation rail, 4th position)
- /projects route registered in GoRouter ShellRoute

## Updated: Note model
- Added tags: List<String>, projectId: int?, milestoneId: int?
- NotesApi.create/update pass tags and project_id
- NotesRepository and NotesNotifier signatures updated
- NoteEditScreen: chip-based tag input + ProjectSelector

## Updated: Task model
- Added projectId: int?, milestoneId: int?, parentId: int?
- TasksApi.create passes project_id; update payload includes project_id
- TasksRepository and TasksNotifier signatures updated
- TaskEditScreen: ProjectSelector added; project_id sent on save

## Provider fix
- ProjectsNotifier.update renamed to updateProject to avoid conflict
  with AsyncNotifier.update(FutureOr<State> Function(State)) base method

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 20:52:59 -05:00

64 lines
1.6 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../data/models/note.dart';
import 'api_client_provider.dart';
final notesProvider =
AsyncNotifierProvider<NotesNotifier, List<Note>>(NotesNotifier.new);
class NotesNotifier extends AsyncNotifier<List<Note>> {
@override
Future<List<Note>> build() async {
return ref.watch(notesRepositoryProvider).getAll();
}
Future<Note> create(
String title,
String body, {
List<String> tags = const [],
int? projectId,
}) async {
final note = await ref
.read(notesRepositoryProvider)
.create(title, body, tags: tags, projectId: projectId);
state = AsyncData([...state.valueOrNull ?? [], note]);
return note;
}
Future<Note> updateNote(
int id,
String title,
String body, {
List<String> tags = const [],
int? projectId,
bool clearProject = false,
}) async {
final updated = await ref.read(notesRepositoryProvider).update(
id,
title,
body,
tags: tags,
projectId: projectId,
clearProject: clearProject,
);
state = AsyncData([
for (final n in state.valueOrNull ?? [])
if (n.id == id) updated else n,
]);
return updated;
}
Future<void> delete(int id) async {
await ref.read(notesRepositoryProvider).delete(id);
state = AsyncData([
for (final n in state.valueOrNull ?? [])
if (n.id != id) n,
]);
}
}
final noteDetailProvider =
FutureProvider.family<Note, int>((ref, id) async {
return ref.watch(notesRepositoryProvider).getOne(id);
});