Files
BadNote/lib/providers/notebook_container_provider.dart
Akiba So 2b1c6ba7e0
All checks were successful
CI / Windows build (push) Successful in 8m42s
feat: OneNote-style notebooks, text fonts, and page navigation
Add notebook.json containers with multi-member pages, fix PDF text
editing (size/bold/drag/double-tap), index SidecarText in search, and
share keyboard page shortcuts plus a PDF scrubber.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 20:27:35 +08:00

47 lines
1.7 KiB
Dart

// lib/providers/notebook_container_provider.dart
//
// Home-screen list of OneNote-style notebook containers: vault folders that
// hold a `notebook.json` manifest (see `storage/notebook_manifest.dart`). This
// mirrors `note_provider.dart` / `document_provider.dart`'s vault-scan pattern
// — the manifest on disk is the source of truth, there is no SQLite cache.
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../services/vault_service.dart';
import 'document_provider.dart' show vaultServiceProvider;
final notebookContainerListProvider = AsyncNotifierProvider<
NotebookContainerListNotifier, List<VaultContainer>>(
NotebookContainerListNotifier.new,
);
class NotebookContainerListNotifier
extends AsyncNotifier<List<VaultContainer>> {
Future<VaultService> get _vault => ref.read(vaultServiceProvider.future);
@override
Future<List<VaultContainer>> build() => _scan();
Future<List<VaultContainer>> _scan() async {
final vault = await _vault;
return vault.scanContainers();
}
/// Re-scan the vault and publish the result. Used by pull-to-refresh and
/// after a container is created elsewhere.
Future<void> loadContainers() async {
state = const AsyncLoading();
state = await AsyncValue.guard(_scan);
}
/// Create a new notebook container (folder + `notebook.json` + one blank ink
/// page) titled [title], prepend it to the list, and return it so the caller
/// can navigate straight into it.
Future<VaultContainer> createContainer(String title) async {
final vault = await _vault;
final container = await vault.createNotebookContainer(title);
state = AsyncData([container, ...state.value ?? []]);
return container;
}
}