Skip to content
This repository was archived by the owner on Jul 13, 2023. It is now read-only.

Commit

Permalink
feat: add ResourceBloc.delete
Browse files Browse the repository at this point in the history
  • Loading branch information
JonasWanke committed Mar 6, 2020
1 parent e023065 commit 612ee52
Showing 6 changed files with 86 additions and 50 deletions.
2 changes: 0 additions & 2 deletions lib/data/blocs/bloc.dart
Original file line number Diff line number Diff line change
@@ -10,8 +10,6 @@ abstract class Bloc {

final Database db;
final BehaviorSubject eventQueue;

void close() {}
}

@immutable
77 changes: 42 additions & 35 deletions lib/data/blocs/error.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'dart:async';
import 'dart:ui';

import 'package:meta/meta.dart';
import 'package:rxdart/rxdart.dart';
import 'package:sembast/sembast.dart';
import 'package:tuple/tuple.dart';

import '../error.dart';
import '../utils.dart';
import 'bloc.dart';
import 'locale.dart';
import 'resource.dart';
import 'translation.dart';

class ErrorBloc extends Bloc {
@@ -18,47 +21,22 @@ class ErrorBloc extends Bloc {
@required this.translationBloc,
}) : assert(localeBloc != null),
assert(translationBloc != null),
super(db, eventQueue);
super(db, eventQueue) {
eventQueue.listen((event) {
if (!(event is ResourceAddedEvent)) {
return;
}

_startJobForResource((event as ResourceAddedEvent).id);
});
}

final LocaleBloc localeBloc;
final TranslationBloc translationBloc;

final StoreRef<int, Map<String, dynamic>> _store =
intMapStoreFactory.store('error');

// final Map<String, StreamSubscription> _perResourceJobs = {};
// void _startLinting() async {
// (await all.first).forEach(_startJobForResource);
// }

// void _startJobForResource(String id) {
// _perResourceJobs[id]?.cancel();
// _perResourceJobs[id] = Rx.combineLatest2(
// localeBloc.all,
// translationBloc.getAllForResource(id),
// (l, t) => Tuple2<List<Locale>, Map<Locale, String>>(l, t),
// ).listen((tuple) {
// final locales = tuple.item1;
// final translations = tuple.item2;

// final errors = locales
// .where((l) => translations[l] == null)
// .map((l) => MissingTranslationError(l))
// .map((e) => _Error(id, e).toJson())
// .toList();
// db.transaction((t) async {
// await _store.delete(
// t,
// finder: Finder(
// filter: Filter.equals('resource', id) &
// Filter.equals('error._type', MissingTranslationError.type),
// ),
// );
// await _store.addAll(t, errors);
// });
// });
// }

Stream<List<L42nStringError>> allForResource(String id) {
return _store
.query(
@@ -68,8 +46,37 @@ class ErrorBloc extends Bloc {
),
)
.onSnapshots(db)
.map((list) => list.map((e) => _Error.fromJson(e.value).error));
.map(
(list) => list.map((e) => _Error.fromJson(e.value).error).toList());
}

final Map<String, StreamSubscription> _perResourceJobs = {};
void _startJobForResource(String id) {
_stopJobForResource(id);
_perResourceJobs[id] = Rx.combineLatest2(
localeBloc.all,
translationBloc.getAllForResource(id),
(l, t) => Tuple2<List<Locale>, Map<Locale, String>>(l, t),
).listen((tuple) {
final locales = tuple.item1;
final translations = tuple.item2;

final errors = locales
.where((l) => translations[l] == null)
.map((l) => MissingTranslationError(l))
.map((e) => _Error(id, e).toJson())
.toList();
db.transaction((t) async {
await _store.delete(
t,
finder: Finder(filter: Filter.equals('resource', id)),
);
await _store.addAll(t, errors);
});
});
}

void _stopJobForResource(String id) => _perResourceJobs.remove(id)?.cancel();
}

@immutable
12 changes: 12 additions & 0 deletions lib/data/blocs/resource.dart
Original file line number Diff line number Diff line change
@@ -24,6 +24,12 @@ class ResourceBloc extends Bloc {
await ref.add(db, _Resource().toJson());
eventQueue.add(ResourceAddedEvent(id));
}

Future<void> delete(String id) async {
await _ref(id).delete(db);

eventQueue.add(ResourceDeletedEvent(id));
}
}

class ResourceAddedEvent extends Event {
@@ -32,6 +38,12 @@ class ResourceAddedEvent extends Event {
final String id;
}

class ResourceDeletedEvent extends Event {
const ResourceDeletedEvent(this.id) : assert(id != null);

final String id;
}

@immutable
class _Resource {
const _Resource();
21 changes: 18 additions & 3 deletions lib/data/blocs/translation.dart
Original file line number Diff line number Diff line change
@@ -6,10 +6,15 @@ import 'package:sembast/sembast.dart';

import '../utils.dart';
import 'bloc.dart';
import 'resource.dart';

class TranslationBloc extends Bloc {
TranslationBloc(Database db, BehaviorSubject<Event> eventQueue)
: super(db, eventQueue);
: super(db, eventQueue) {
eventQueue.listen((event) {
if (event is ResourceDeletedEvent) {}
});
}

final StoreRef<int, Map<String, dynamic>> _store =
intMapStoreFactory.store('translation');
@@ -73,10 +78,10 @@ class TranslationBloc extends Bloc {
};
}

Stream<Map<Locale, String>> getAllForResource(String id) {
Stream<Map<Locale, String>> getAllForResource(String resourceId) {
return _store
.query(
finder: Finder(filter: Filter.equals('resourceId', id)),
finder: Finder(filter: Filter.equals('resourceId', resourceId)),
)
.onSnapshots(db)
.map((list) => list
@@ -87,6 +92,16 @@ class TranslationBloc extends Bloc {
translation.locale: translation.value,
});
}

Future<void> deleteAllForResource(String resourceId) async {
final keys = await _store.findKeys(
db,
finder: Finder(filter: Filter.equals('resourceId', resourceId)),
);
for (final key in keys) {
await _store.record(key).delete(db);
}
}
}

class TranslationChangedEvent extends Event {
12 changes: 2 additions & 10 deletions lib/data/project.dart
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@ import 'package:l42n/data/blocs/resource.dart';
import 'package:l42n/data/blocs/translation.dart';
import 'package:meta/meta.dart';
import 'package:rxdart/rxdart.dart';
import 'package:sembast/sembast.dart';
import 'package:sembast/sembast_memory.dart';

import 'blocs/bloc.dart';
@@ -17,14 +16,12 @@ import 'project_backend.dart';
@immutable
class Project {
const Project._(
this._db,
this.eventQueue,
this.localeBloc,
this.errorBloc,
this.resourceBloc,
this.translationBloc,
) : assert(_db != null),
assert(eventQueue != null),
) : assert(eventQueue != null),
assert(localeBloc != null),
assert(errorBloc != null),
assert(resourceBloc != null),
@@ -73,13 +70,12 @@ class Project {
}

return Project._(
db, eventQueue, localeBloc, errorBloc, resourceBloc, translationBloc);
eventQueue, localeBloc, errorBloc, resourceBloc, translationBloc);
}

static Future<Project> forDirectory(Directory directory) =>
DirectoryProjectBackend.from(directory);

final Database _db;
final BehaviorSubject<Event> eventQueue;

final LocaleBloc localeBloc;
@@ -88,10 +84,6 @@ class Project {
final TranslationBloc translationBloc;

void close() {
translationBloc.close();
resourceBloc.close();
errorBloc.close();
localeBloc.close();
eventQueue.close();
}
}
12 changes: 12 additions & 0 deletions lib/data/project_backend.dart
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'dart:ui';

import 'package:l42n/data/blocs/resource.dart';
import 'package:l42n/data/blocs/translation.dart';
import 'package:path/path.dart';

@@ -15,6 +16,10 @@ class DirectoryProjectBackend {
project.eventQueue.listen((event) async {
if (event is LocaleAddedEvent) {
await _saveLocale(event.locale);
} else if (event is ResourceAddedEvent) {
await _saveAllLocales();
} else if (event is ResourceDeletedEvent) {
await _saveAllLocales();
} else if (event is TranslationChangedEvent) {
await _saveLocale(event.locale);
}
@@ -62,6 +67,13 @@ class DirectoryProjectBackend {
final Directory directory;
final Project project;

Future<void> _saveAllLocales() async {
final locales = await project.localeBloc.all.first;
for (final locale in locales) {
await _saveLocale(locale);
}
}

Future<void> _saveLocale(Locale locale) async {
final file = File(join(directory.path, 'intl_$locale.arb'));
final translations = await project.translationBloc.getAllForLocale(locale);

0 comments on commit 612ee52

Please sign in to comment.