fromJson static method
InlineTimerConfig?
fromJson(
- Map<
String, dynamic> json, { - required DesignTokenCatalog designTokens,
- required ServerTimeClock? serverClock,
Implementation
static InlineTimerConfig? fromJson(
Map<String, dynamic> json, {
required DesignTokenCatalog designTokens,
required ServerTimeClock? serverClock,
}) {
if (serverClock == null) return null;
final stateful = optMap(json, 'stateful');
if (stateful == null || stateful['version'] is! int) return null;
if (stateful['version'] != 1) return null;
final sources = optList(stateful, 'sources');
if (sources == null || sources.length != 1) {
return null;
}
final rawSource = sources.single;
if (rawSource is! Map<String, dynamic>) return null;
final source = rawSource;
if (source['kind'] != 'timer' || source['mode'] != 'countdown') return null;
final deadline = InlineTimerInstant.fromJson(
optMap(source, 'deadline'),
);
if (deadline == null) return null;
final startsAt = source.containsKey('startsAt')
? InlineTimerInstant.fromJson(optMap(source, 'startsAt'))
: null;
if (source.containsKey('startsAt') && startsAt == null) return null;
final urgentRaw = source['urgentBelowSeconds'];
if (urgentRaw != null && urgentRaw is! int) return null;
if (urgentRaw is int && urgentRaw < 0) return null;
final urgent = urgentRaw is int && urgentRaw > 0 ? urgentRaw : null;
final slotKey = optString(json, 'slotKey').trim();
if (slotKey.isEmpty) return null;
try {
final rules = _parseTimerRules(
stateful,
designTokens: designTokens,
);
if (rules == null) return null;
return InlineTimerConfig(
slotKey: slotKey,
designWidth: _positive(json['designWidth'], 360),
cornerRadius: _finiteNonNegative(json['cornerRadius']),
margin: InlineCanvasMargin.fromJson(
optMap(optMap(json, 'layout') ?? const {}, 'margin'),
),
startsAt: startsAt,
deadline: deadline,
urgentBelowSeconds: urgent,
rules: Map.unmodifiable(rules),
clock: serverClock,
);
} on FormatException {
return null;
}
}