mirror of https://github.com/AMT-Cheif/drift.git
106 lines
2.8 KiB
Dart
106 lines
2.8 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:drift/drift.dart';
|
|
import 'package:drift/wasm.dart';
|
|
import 'package:rxdart/rxdart.dart';
|
|
|
|
part 'database.g.dart';
|
|
|
|
enum TodoListFilter { all, active, completed }
|
|
|
|
class TodoItems extends Table {
|
|
IntColumn get id => integer().autoIncrement()();
|
|
TextColumn get description => text()();
|
|
BoolColumn get completed => boolean().withDefault(const Constant(false))();
|
|
}
|
|
|
|
@DriftDatabase(tables: [TodoItems])
|
|
class Database extends _$Database {
|
|
final BehaviorSubject<TodoListFilter> _filterChanges =
|
|
BehaviorSubject.seeded(TodoListFilter.all);
|
|
|
|
Database(super.e);
|
|
|
|
@override
|
|
int get schemaVersion => 1;
|
|
|
|
@override
|
|
MigrationStrategy get migration {
|
|
return MigrationStrategy(
|
|
onCreate: (m) async {
|
|
await m.createAll();
|
|
|
|
// Create some entries by default
|
|
await batch((b) {
|
|
b.insertAll(todoItems, [
|
|
TodoItemsCompanion.insert(description: 'Migrate to drift'),
|
|
TodoItemsCompanion.insert(description: 'Support all platforms'),
|
|
TodoItemsCompanion.insert(
|
|
description: 'Solve local persistence issues'),
|
|
]);
|
|
});
|
|
},
|
|
);
|
|
}
|
|
|
|
TodoListFilter get currentFilter => _filterChanges.value;
|
|
|
|
set currentFilter(TodoListFilter value) {
|
|
_filterChanges.add(value);
|
|
}
|
|
|
|
Stream<List<TodoItem>> get items => _filterChanges.stream.switchMap(_items);
|
|
|
|
Stream<int> get uncompletedItems {
|
|
final all = countAll();
|
|
final query = selectOnly(todoItems)
|
|
..addColumns([all])
|
|
..where(todoItems.completed.not());
|
|
|
|
return query.map((row) => row.read(all)!).watchSingle();
|
|
}
|
|
|
|
Stream<List<TodoItem>> _items(TodoListFilter filter) {
|
|
final query = todoItems.select();
|
|
|
|
switch (filter) {
|
|
case TodoListFilter.completed:
|
|
query.where((row) => row.completed);
|
|
case TodoListFilter.active:
|
|
query.where((row) => row.completed.not());
|
|
case TodoListFilter.all:
|
|
break;
|
|
}
|
|
|
|
return query.watch();
|
|
}
|
|
|
|
Future<void> toggleCompleted(TodoItem item) async {
|
|
final statement = update(todoItems)..whereSamePrimaryKey(item);
|
|
await statement.write(TodoItemsCompanion.custom(
|
|
completed: todoItems.completed.not(),
|
|
));
|
|
}
|
|
}
|
|
|
|
Future<WasmDatabaseResult> connect() async {
|
|
final result = await WasmDatabase.open(
|
|
databaseName: 'todo_example',
|
|
sqlite3Uri: Uri.parse('sqlite3.wasm'),
|
|
driftWorkerUri: Uri.parse('/drift_worker.dart.js'),
|
|
);
|
|
|
|
if (!result.chosenImplementation.fullySupported) {
|
|
print('Using ${result.chosenImplementation} due to unsupported browser '
|
|
'features: ${result.missingFeatures}');
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
extension CompatibilityUI on WasmStorageImplementation {
|
|
bool get fullySupported =>
|
|
this != WasmStorageImplementation.inMemory &&
|
|
this != WasmStorageImplementation.unsafeIndexedDb;
|
|
}
|