fromJson static method

InlineTimerConfig? fromJson(
  1. Map<String, dynamic> json, {
  2. required DesignTokenCatalog designTokens,
  3. 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;
  }
}