Skip to content

Commit

Permalink
use built_value for options
Browse files Browse the repository at this point in the history
  • Loading branch information
smkhalsa committed Feb 12, 2020
1 parent 188b343 commit 77ba81a
Show file tree
Hide file tree
Showing 7 changed files with 732 additions and 89 deletions.
4 changes: 4 additions & 0 deletions build.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
targets:
$default:
sources:
- lib/**
builders:
req_builder:
import: "package:gql_client/src/req_builder/req_builder.dart"
Expand Down
19 changes: 12 additions & 7 deletions lib/src/cache/cache.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import '../store/store.dart';

class GQLCache {
final Map<String, TypePolicy> typePolicies;
final bool addTypename;
final Store _dataStore;

final BehaviorSubject<Map<String, Map<String, Map<String, dynamic>>>>
Expand All @@ -19,6 +20,7 @@ class GQLCache {
GQLCache({
Store dataStore,
this.typePolicies = const {},
this.addTypename = true,
Map<String, Map<String, Map<String, dynamic>>> seedOptimisticPatches,
}) : _dataStore = dataStore ?? MemoryStore(),
_optimisticPatchesStream = BehaviorSubject.seeded(
Expand All @@ -39,13 +41,16 @@ class GQLCache {
}

Stream<Map<String, dynamic>> watchQuery(
WatchQueryOptions options,
ReadQueryOptions options,
) =>
(options.optimistic ? _optimisticDataStream : _dataStore.watch()).map(
((options.optimistic ?? true)
? _optimisticDataStream
: _dataStore.watch())
.map(
(data) => denormalize(
reader: (dataId) => data[dataId],
query: options.document,
addTypename: options.addTypename,
addTypename: addTypename,
operationName: options.operationName,
variables: options.variables,
typePolicies: typePolicies,
Expand All @@ -56,29 +61,29 @@ class GQLCache {
ReadQueryOptions options,
) =>
denormalize(
reader: (dataId) => options.optimistic
reader: (dataId) => (options.optimistic ?? true)
? _optimisticDataStream.value[dataId]
: _dataStore.get(dataId),
query: options.document,
addTypename: options.addTypename,
operationName: options.operationName,
variables: options.variables,
typePolicies: typePolicies,
addTypename: addTypename,
);

Map<String, dynamic> readFragment(
ReadFragmentOptions options,
) =>
denormalizeFragment(
reader: (dataId) => options.optimistic
reader: (dataId) => (options.optimistic ?? true)
? _optimisticDataStream.value[dataId]
: _dataStore.get(dataId),
fragment: options.fragment,
idFields: options.idFields,
fragmentName: options.fragmentName,
variables: options.variables,
typePolicies: typePolicies,
addTypename: options.addTypename,
addTypename: addTypename,
);

void writeQuery(
Expand Down
4 changes: 2 additions & 2 deletions lib/src/cache/cache_proxy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ class CacheProxy {
Map<String, dynamic> readQuery(
ReadQueryOptions options,
) =>
_cache.readQuery(options);
_cache.readQuery(options.rebuild((b) => b..optimistic ??= false));

Map<String, dynamic> readFragment(
ReadFragmentOptions options,
) =>
_cache.readFragment(options);
_cache.readFragment(options.rebuild((b) => b..optimistic ??= false));

void writeQuery(
WriteQueryOptions options,
Expand Down
161 changes: 90 additions & 71 deletions lib/src/cache/options.dart
Original file line number Diff line number Diff line change
@@ -1,84 +1,103 @@
import 'package:meta/meta.dart';
import 'package:gql/ast.dart';
import 'package:built_value/built_value.dart';

export 'package:normalize/normalize.dart' show TypePolicy, AddTypenameVisitor;

class WatchQueryOptions {
final DocumentNode document;
final String operationName;
final Map<String, dynamic> variables;
final bool optimistic;
final bool addTypename;

const WatchQueryOptions({
@required this.document,
this.operationName,
this.variables,
this.optimistic = true,
this.addTypename = true,
});
part 'options.g.dart';

abstract class BaseQueryOptions {
DocumentNode get document;
String get operationName;
Map<String, dynamic> get variables;
}

class ReadQueryOptions {
final DocumentNode document;
final String operationName;
final Map<String, dynamic> variables;
final bool addTypename;
final bool optimistic;

const ReadQueryOptions({
@required this.document,
this.operationName,
this.variables,
this.addTypename = true,
this.optimistic = true,
});
abstract class ReadQueryOptions
implements
Built<ReadQueryOptions, ReadQueryOptionsBuilder>,
BaseQueryOptions {
@nullable
bool get optimistic;

DocumentNode get document;

@nullable
String get operationName;

@nullable
Map<String, dynamic> get variables;

ReadQueryOptions._();
factory ReadQueryOptions([void Function(ReadQueryOptionsBuilder) updates]) =
_$ReadQueryOptions;
}

class ReadFragmentOptions {
final DocumentNode fragment;
final Map<String, dynamic> idFields;
final String fragmentName;
final Map<String, dynamic> variables;
final bool addTypename;
final bool optimistic;

const ReadFragmentOptions({
@required this.fragment,
@required this.idFields,
this.fragmentName,
this.variables,
this.addTypename = true,
this.optimistic = true,
});
abstract class WriteQueryOptions
implements
Built<WriteQueryOptions, WriteQueryOptionsBuilder>,
BaseQueryOptions {
Map<String, dynamic> get data;

DocumentNode get document;

@nullable
String get operationName;

@nullable
Map<String, dynamic> get variables;

WriteQueryOptions._();
factory WriteQueryOptions([void Function(WriteQueryOptionsBuilder) updates]) =
_$WriteQueryOptions;
}

class WriteQueryOptions {
final DocumentNode document;
final Map<String, dynamic> data;
final String operationName;
final Map<String, dynamic> variables;

const WriteQueryOptions({
@required this.document,
@required this.data,
this.operationName,
this.variables,
});
abstract class BaseFragmentOptions {
DocumentNode get fragment;
Map<String, dynamic> get idFields;
String get fragmentName;
Map<String, dynamic> get variables;
}

class WriteFragmentOptions {
final DocumentNode fragment;
final Map<String, dynamic> idFields;
final Map<String, dynamic> data;
final String fragmentName;
final Map<String, dynamic> variables;

const WriteFragmentOptions({
@required this.fragment,
@required this.idFields,
@required this.data,
this.fragmentName,
this.variables,
});
abstract class ReadFragmentOptions
implements
Built<ReadFragmentOptions, ReadFragmentOptionsBuilder>,
BaseQueryOptions {
@nullable
bool get optimistic;

DocumentNode get fragment;

Map<String, dynamic> get idFields;

@nullable
String get fragmentName;

@nullable
Map<String, dynamic> get variables;

ReadFragmentOptions._();
factory ReadFragmentOptions(
[void Function(ReadFragmentOptionsBuilder) updates]) =
_$ReadFragmentOptions;
}

abstract class WriteFragmentOptions
implements
Built<WriteFragmentOptions, WriteFragmentOptionsBuilder>,
BaseQueryOptions {
Map<String, dynamic> get data;

DocumentNode get fragment;

Map<String, dynamic> get idFields;

@nullable
String get fragmentName;

@nullable
Map<String, dynamic> get variables;

WriteFragmentOptions._();
factory WriteFragmentOptions(
[void Function(WriteFragmentOptionsBuilder) updates]) =
_$WriteFragmentOptions;
}

0 comments on commit 77ba81a

Please sign in to comment.