MIF_E31231313/Android/flutter_app/lib/models/article_model.dart

109 lines
3.1 KiB
Dart

class ArticleModel {
const ArticleModel({
required this.id,
required this.title,
required this.description,
required this.content,
required this.category,
required this.publishedAt,
this.source,
this.author,
this.imageUrl,
this.articleUrl,
});
final int id;
final String title;
final String description;
final String content;
final String category;
final String publishedAt;
final String? source;
final String? author;
final String? imageUrl;
final String? articleUrl;
factory ArticleModel.fromJson(Map<String, dynamic> json) {
final source = json['source'];
final sourceName = source is Map<String, dynamic>
? source['name'] as String?
: json['source_name'] as String?;
return ArticleModel(
id: _stableId(
json['id']?.toString() ??
json['url'] as String? ??
json['articleUrl'] as String? ??
json['title'] as String? ??
'',
),
title: (json['title'] as String? ?? '-').trim(),
description:
(json['description'] as String? ?? json['excerpt'] as String? ?? '-')
.trim(),
content: (json['content'] as String? ?? '').trim(),
category: _categoryFromJson(json),
publishedAt:
(json['publishedAt'] as String? ??
json['published_at'] as String? ??
json['created_at'] as String? ??
'')
.trim(),
source: sourceName?.trim().isEmpty == true ? null : sourceName?.trim(),
author: (json['author'] as String?)?.trim(),
imageUrl:
(json['image'] as String? ??
json['image_url'] as String? ??
json['urlToImage'] as String?)
?.trim(),
articleUrl: (json['url'] as String? ?? json['articleUrl'] as String?)
?.trim(),
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'title': title,
'description': description,
'content': content,
'category': category,
'published_at': publishedAt,
'source_name': source,
'author': author,
'image_url': imageUrl,
'url': articleUrl,
};
}
}
String _categoryFromJson(Map<String, dynamic> json) {
final raw = (json['category'] as String? ?? '').trim();
if (raw.isNotEmpty) return raw;
final text = '${json['title'] ?? ''} ${json['description'] ?? ''}'
.toLowerCase();
if (text.contains('stunting')) return 'Stunting';
if (text.contains('mpasi')) return 'MPASI';
if (text.contains('imunisasi') || text.contains('vaksin')) {
return 'Imunisasi';
}
if (text.contains('kesehatan anak') || text.contains('balita')) {
return 'Kesehatan Anak';
}
if (text.contains('protein')) return 'Protein';
if (text.contains('vitamin')) return 'Vitamin';
if (text.contains('tumbuh') || text.contains('kembang')) {
return 'Tumbuh Kembang';
}
return 'Gizi';
}
int _stableId(String value) {
var hash = 0;
for (final codeUnit in value.codeUnits) {
hash = (hash * 31 + codeUnit) & 0x7fffffff;
}
return hash;
}