friend_models.dart 4.01 KB
// ─── Responses ───────────────────────────────────────────────────────────────

class FriendListResponse {
  const FriendListResponse({this.list = const []});

  final List<FriendItem> list;

  factory FriendListResponse.fromJson(Map<String, dynamic> json) {
    return FriendListResponse(
      list: (json['list'] as List<dynamic>?)
              ?.map((e) => FriendItem.fromJson(e as Map<String, dynamic>))
              .toList() ??
          const [],
    );
  }

  Map<String, dynamic> toJson() => {
        'list': list.map((e) => e.toJson()).toList(),
      };
}

class FriendItem {
  const FriendItem({
    this.id,
    this.userId,
    this.friendUserId,
    this.remarkName,
    this.showInDial,
    this.state,
    this.createTime,
    this.updateTime,
    this.avatar,
    this.friendNickname,
    this.healthData,
  });

  final int? id;
  final int? userId;
  final int? friendUserId;
  final String? remarkName;

  /// 0 = hidden, 1 = shown in dial
  final int? showInDial;

  /// 1 = normal
  final int? state;

  final int? createTime;
  final int? updateTime;
  final String? avatar;
  final String? friendNickname;
  final FriendHealthData? healthData;

  bool get isShowInDial => showInDial == 1;

  factory FriendItem.fromJson(Map<String, dynamic> json) {
    return FriendItem(
      id: json['id'] as int?,
      userId: json['user_id'] as int?,
      friendUserId: json['friend_user_id'] as int?,
      remarkName: json['remark_name'] as String?,
      showInDial: json['show_in_dial'] as int?,
      state: json['state'] as int?,
      createTime: json['create_time'] as int?,
      updateTime: json['update_time'] as int?,
      avatar: json['avatar'] as String?,
      friendNickname: json['friend_nickname'] as String?,
      healthData: json['health_data'] == null
          ? null
          : FriendHealthData.fromJson(
              json['health_data'] as Map<String, dynamic>),
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (id != null) val['id'] = id;
    if (userId != null) val['user_id'] = userId;
    if (friendUserId != null) val['friend_user_id'] = friendUserId;
    if (remarkName != null) val['remark_name'] = remarkName;
    if (showInDial != null) val['show_in_dial'] = showInDial;
    if (state != null) val['state'] = state;
    if (createTime != null) val['create_time'] = createTime;
    if (updateTime != null) val['update_time'] = updateTime;
    if (avatar != null) val['avatar'] = avatar;
    if (friendNickname != null) val['friend_nickname'] = friendNickname;
    if (healthData != null) val['health_data'] = healthData!.toJson();
    return val;
  }
}

class FriendHealthData {
  const FriendHealthData({
    this.hrvState,
    this.latestHrv,
    this.realtimeStress,
    this.sleepEvaluate,
    this.totalSteps,
  });

  /// HRV state indicator
  final int? hrvState;

  /// Latest HRV value used by the friend health card.
  final double? latestHrv;

  /// Real-time stress data (may be an empty map `{}`)
  final Map<String, dynamic>? realtimeStress;

  /// Sleep quality score
  final int? sleepEvaluate;

  /// Total step count for the day (nullable)
  final int? totalSteps;

  factory FriendHealthData.fromJson(Map<String, dynamic> json) {
    return FriendHealthData(
      hrvState: json['hrv_state'] as int?,
      latestHrv: (json['latest_hrv'] as num?)?.toDouble(),
      realtimeStress: json['realtime_stress'] as Map<String, dynamic>?,
      sleepEvaluate: json['sleep_evaluate'] as int?,
      totalSteps: json['total_steps'] as int?,
    );
  }

  Map<String, dynamic> toJson() {
    final val = <String, dynamic>{};
    if (hrvState != null) val['hrv_state'] = hrvState;
    if (latestHrv != null) val['latest_hrv'] = latestHrv;
    if (realtimeStress != null) val['realtime_stress'] = realtimeStress;
    if (sleepEvaluate != null) val['sleep_evaluate'] = sleepEvaluate;
    if (totalSteps != null) val['total_steps'] = totalSteps;
    return val;
  }
}