Skip to content

Commit 9efb25a

Browse files
committed
Component Instances #20
- Variants support.
1 parent 1b9598f commit 9efb25a

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

lib/src/api/field_access.dart

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ mixin FieldsHolder {
2626

2727
/// The complete schema of the [FieldsHolder]'s [fields].
2828
dynamic get fieldSchema => {
29-
for (final MapEntry(:key, :value) in fields.entries) key: value.fieldSchema,
29+
for (final MapEntry(:key, :value) in fields.entries)
30+
key: value.fieldSchema,
3031
};
3132
}
3233

@@ -304,3 +305,40 @@ final class RadiusFieldAccess extends FieldAccess<CornerRadius> {
304305
@override
305306
void setValue(Object? value) => setter(value.typedValue<CornerRadius>()!);
306307
}
308+
309+
/// A field accessor for variants.
310+
final class VariantAccess extends FieldAccess<String> {
311+
/// Constructs a new [VariantAccess] instance with the given parameters.
312+
const VariantAccess(
313+
super.label,
314+
super.description,
315+
super.getValue,
316+
super.setter, {
317+
required super.defaultValue,
318+
// Variant ID -> Variant Name.
319+
required FieldOptionsGetter<String> options,
320+
}) : getOptions = options;
321+
322+
/// The options of the field. Variant ID -> Variant Name.
323+
final FieldOptionsGetter<String> getOptions;
324+
325+
@override
326+
String get dynamicKeyType => 'options';
327+
328+
@override
329+
dynamic serialize(String? obj) => obj;
330+
331+
@override
332+
Map<String, dynamic> get supplementarySchema => {
333+
'options': {
334+
for (final String name in getOptions()) name: name,
335+
},
336+
};
337+
338+
@override
339+
void setValue(Object? value) {
340+
if (value case String? value) {
341+
setter(value ?? getDefaultValue!());
342+
}
343+
}
344+
}

lib/src/api/nodes/variance_node.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:codelessly_json_annotation/codelessly_json_annotation.dart';
2+
import 'package:collection/collection.dart';
23
import 'package:equatable/equatable.dart';
34

5+
import '../field_access.dart';
46
import '../mixins.dart';
57
import '../models/models.dart';
68
import 'nodes.dart';
@@ -59,6 +61,22 @@ class VarianceNode extends SinglePlaceholderNode with CustomPropertiesMixin {
5961
@override
6062
covariant VarianceProperties properties;
6163

64+
@override
65+
late final Map<String, FieldAccess> fields = {
66+
'currentVariantId': VariantAccess(
67+
() => 'Variant',
68+
() => 'Select a variant to load',
69+
() => currentVariant.name,
70+
(String name) {
71+
final String? newId =
72+
variants.firstWhereOrNull((e) => e.name == name)?.id;
73+
if (newId != null) currentVariantId = newId;
74+
},
75+
options: () => variants.map((variant) => variant.name).toList(),
76+
defaultValue: () => 'default',
77+
),
78+
};
79+
6280
/// Creates a [VarianceNode] instance with the given data.
6381
VarianceNode({
6482
bool? value,

0 commit comments

Comments
 (0)