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 || serverClock.nativeClockMissing) {
final precondition =
serverClock == null ? 'server_time_missing' : 'native_clock_missing';
_log.e('Dropped — timer precondition $precondition',
stage: TimelineStage.parse,
reason: TimelineReason.campaignUnsupported,
extras: {'precondition': precondition});
throw const ReportedParseFailure();
}
final stateful = optMap(json, 'stateful');
if (stateful == null) return null;
final version = stateful['version'];
if (version != null && version is! int) return null;
if (version is int && version < 1) return null;
if (version is int && version > 1) {
_log.e('Dropped — unsupported stateful version $version',
stage: TimelineStage.parse,
reason: TimelineReason.schemaVersionTooNew,
extras: {'required': '$version', 'supported': '1'});
throw const ReportedParseFailure();
}
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;
}
}