270 lines
11 KiB
Dart
270 lines
11 KiB
Dart
/// News Local DataSource
|
|
///
|
|
/// Handles all local data operations for news articles.
|
|
/// Currently provides mock data for development and testing.
|
|
/// Will be extended to use Hive cache when backend API is available.
|
|
library;
|
|
|
|
import 'package:worker/features/news/data/models/news_article_model.dart';
|
|
|
|
/// News Local Data Source
|
|
///
|
|
/// Provides mock data for news articles.
|
|
/// In production, this will cache data from the remote API.
|
|
class NewsLocalDataSource {
|
|
/// Get all news articles
|
|
///
|
|
/// Returns a list of all articles from mock data.
|
|
/// In production, this will fetch from Hive cache.
|
|
Future<List<NewsArticleModel>> getAllArticles() async {
|
|
// Simulate network delay
|
|
await Future<void>.delayed(const Duration(milliseconds: 300));
|
|
|
|
return _mockArticles;
|
|
}
|
|
|
|
/// Get featured article
|
|
///
|
|
/// Returns the main featured article for the top section.
|
|
Future<NewsArticleModel?> getFeaturedArticle() async {
|
|
// Simulate network delay
|
|
await Future<void>.delayed(const Duration(milliseconds: 200));
|
|
|
|
try {
|
|
return _mockArticles.firstWhere((article) => article.isFeatured);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Get articles by category
|
|
///
|
|
/// Returns filtered list of articles matching the [category].
|
|
Future<List<NewsArticleModel>> getArticlesByCategory(String category) async {
|
|
// Simulate network delay
|
|
await Future<void>.delayed(const Duration(milliseconds: 200));
|
|
|
|
if (category == 'all') {
|
|
return _mockArticles;
|
|
}
|
|
|
|
return _mockArticles
|
|
.where(
|
|
(article) => article.category.toLowerCase() == category.toLowerCase(),
|
|
)
|
|
.toList();
|
|
}
|
|
|
|
/// Get a specific article by ID
|
|
///
|
|
/// Returns the article if found, null otherwise.
|
|
Future<NewsArticleModel?> getArticleById(String articleId) async {
|
|
// Simulate network delay
|
|
await Future<void>.delayed(const Duration(milliseconds: 100));
|
|
|
|
try {
|
|
return _mockArticles.firstWhere((article) => article.id == articleId);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Check if cache is valid
|
|
///
|
|
/// Returns true if cached data is still valid.
|
|
/// Currently always returns false since we're using mock data.
|
|
Future<bool> isCacheValid() async {
|
|
// TODO: Implement cache validation when using Hive
|
|
return false;
|
|
}
|
|
|
|
/// Cache articles locally
|
|
///
|
|
/// Saves articles to Hive for offline access.
|
|
/// Currently not implemented (using mock data).
|
|
Future<void> cacheArticles(List<NewsArticleModel> articles) async {
|
|
// TODO: Implement Hive caching when backend API is ready
|
|
}
|
|
|
|
/// Clear cached articles
|
|
///
|
|
/// Removes all cached articles from Hive.
|
|
/// Currently not implemented (using mock data).
|
|
Future<void> clearCache() async {
|
|
// TODO: Implement cache clearing when using Hive
|
|
}
|
|
|
|
/// Mock articles matching HTML design
|
|
///
|
|
/// This data will be replaced with real API data in production.
|
|
static final List<NewsArticleModel> _mockArticles = [
|
|
// Featured article with full content
|
|
const NewsArticleModel(
|
|
id: 'featured-1',
|
|
title: '5 xu hướng gạch men phòng tắm được ưa chuộng năm 2024',
|
|
excerpt:
|
|
'Khám phá những mẫu gạch men hiện đại, sang trọng cho không gian phòng tắm. Từ những tone màu trung tính đến các họa tiết độc đáo, cùng tìm hiểu các xu hướng đang được yêu thích nhất.',
|
|
content: '''
|
|
<p>Năm 2024 đánh dấu sự trở lại mạnh mẽ của các thiết kế phòng tắm hiện đại với những xu hướng gạch men đột phá. Không chỉ đơn thuần là vật liệu ốp lát, gạch men ngày nay đã trở thành yếu tố quyết định phong cách và cảm xúc của không gian.</p>
|
|
|
|
<h2>1. Gạch men họa tiết đá tự nhiên</h2>
|
|
<p>Xu hướng bắt chước kết cấu và màu sắc của đá tự nhiên đang trở nên cực kỳ phổ biến. Các sản phẩm gạch men mô phỏng đá marble, granite hay travertine mang đến vẻ đẹp sang trọng mà vẫn đảm bảo tính thực tiễn cao.</p>
|
|
|
|
<highlight type="tip">Chọn gạch men vân đá với kích thước lớn (60x120cm trở lên) để tạo cảm giác không gian rộng rãi và giảm số đường nối.</highlight>
|
|
|
|
<h2>2. Tone màu trung tính và earth tone</h2>
|
|
<p>Các gam màu trung tính như be, xám nhạt, và các tone đất đang thống trị xu hướng thiết kế. Những màu sắc này không chỉ tạo cảm giác thư giãn mà còn dễ dàng kết hợp với nhiều phong cách nội thất khác nhau.</p>
|
|
|
|
<ul>
|
|
<li>Beige và cream: Tạo cảm giác ấm áp, thân thiện</li>
|
|
<li>Xám nhạt: Hiện đại, tinh tế và sang trọng</li>
|
|
<li>Nâu đất: Gần gũi với thiên nhiên, tạo cảm giác thư thái</li>
|
|
</ul>
|
|
|
|
<h2>3. Kích thước lớn và định dạng dài</h2>
|
|
<p>Gạch men kích thước lớn (60x120cm, 75x150cm) và định dạng dài đang được ưa chuộng vì khả năng tạo ra không gian liền mạch, giảm đường nối và dễ vệ sinh.</p>
|
|
|
|
<blockquote>"Việc sử dụng gạch men kích thước lớn không chỉ tạo vẻ hiện đại mà còn giúp phòng tắm nhỏ trông rộng rãi hơn đáng kể" - KTS Nguyễn Minh Tuấn</blockquote>
|
|
|
|
<h2>4. Bề mặt texture và 3D</h2>
|
|
<p>Các loại gạch men với bề mặt có texture hoặc hiệu ứng 3D đang tạo nên điểm nhấn thú vị cho không gian phòng tắm. Từ các họa tiết geometric đến surface sần sùi tự nhiên.</p>
|
|
|
|
<h3>Các loại texture phổ biến:</h3>
|
|
<ol>
|
|
<li>Matt finish: Bề mặt nhám, chống trượt tốt</li>
|
|
<li>Structured surface: Có kết cấu sần sùi như đá tự nhiên</li>
|
|
<li>3D geometric: Họa tiết nổi tạo hiệu ứng thị giác</li>
|
|
</ol>
|
|
|
|
<h2>5. Gạch men màu đen và tương phản cao</h2>
|
|
<p>Xu hướng sử dụng gạch men màu đen hoặc tạo tương phản mạnh đang được nhiều gia chủ lựa chọn để tạo điểm nhấn đặc biệt cho phòng tắm.</p>
|
|
|
|
<highlight type="warning">Gạch men màu tối dễ để lại vết ố từ nước cứng và xà phòng. Cần vệ sinh thường xuyên và sử dụng sản phẩm chống thấm phù hợp.</highlight>
|
|
|
|
<h2>Kết luận</h2>
|
|
<p>Xu hướng gạch men phòng tắm năm 2024 hướng tới sự kết hợp hoàn hảo giữa thẩm mỹ và tính năng. Việc lựa chọn đúng loại gạch men không chỉ tăng giá trị thẩm mỹ mà còn đảm bảo độ bền và dễ bảo trì trong thời gian dài.</p>
|
|
|
|
<p>Hãy tham khảo ý kiến của chuyên gia và cân nhắc kỹ về điều kiện sử dụng thực tế để đưa ra lựa chọn phù hợp nhất cho không gian của bạn.</p>
|
|
''',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1503387762-592deb58ef4e?w=400&h=200&fit=crop',
|
|
category: 'news',
|
|
publishedDate: '2024-11-15T00:00:00.000Z',
|
|
viewCount: 2300,
|
|
readingTimeMinutes: 5,
|
|
isFeatured: true,
|
|
tags: [
|
|
'#gạch-men',
|
|
'#phòng-tắm',
|
|
'#xu-hướng-2024',
|
|
'#thiết-kế-nội-thất',
|
|
'#đá-tự-nhiên',
|
|
'#tone-trung-tính',
|
|
],
|
|
likeCount: 156,
|
|
commentCount: 23,
|
|
shareCount: 45,
|
|
),
|
|
|
|
// Latest articles
|
|
const NewsArticleModel(
|
|
id: 'news-1',
|
|
title: 'Hướng dẫn thi công gạch granite 60x60 chuyên nghiệp',
|
|
excerpt:
|
|
'Quy trình thi công chi tiết từ A-Z cho thầy thợ xây dựng. Các bước chuẩn bị, kỹ thuật thi công và kinh nghiệm thực tế.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1586023492125-27b2c045efd7?w=80&h=80&fit=crop',
|
|
category: 'professional',
|
|
publishedDate: '2024-11-12T00:00:00.000Z',
|
|
viewCount: 1800,
|
|
readingTimeMinutes: 8,
|
|
isFeatured: false,
|
|
),
|
|
|
|
const NewsArticleModel(
|
|
id: 'news-2',
|
|
title: 'Bảng giá gạch men cao cấp mới nhất tháng 11/2024',
|
|
excerpt:
|
|
'Cập nhật bảng giá chi tiết các dòng sản phẩm gạch men nhập khẩu. So sánh giá các thương hiệu hàng đầu.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=80&h=80&fit=crop',
|
|
category: 'news',
|
|
publishedDate: '2024-11-10T00:00:00.000Z',
|
|
viewCount: 3100,
|
|
readingTimeMinutes: 4,
|
|
isFeatured: false,
|
|
),
|
|
|
|
const NewsArticleModel(
|
|
id: 'news-3',
|
|
title: 'Mẹo chọn gạch ốp tường phòng bếp đẹp và bền',
|
|
excerpt:
|
|
'Những lưu ý quan trọng khi chọn gạch ốp tường cho khu vực bếp. Tư vấn về chất liệu, màu sắc và kích thước phù hợp.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1545558014-8692077e9b5c?w=80&h=80&fit=crop',
|
|
category: 'professional',
|
|
publishedDate: '2024-11-08T00:00:00.000Z',
|
|
viewCount: 1500,
|
|
readingTimeMinutes: 6,
|
|
isFeatured: false,
|
|
),
|
|
|
|
const NewsArticleModel(
|
|
id: 'news-4',
|
|
title: 'Dự án biệt thự Quận 2: Ứng dụng gạch men cao cấp',
|
|
excerpt:
|
|
'Case study về việc sử dụng gạch men trong dự án biệt thự 300m². Chia sẻ kinh nghiệm và bài học từ thầu thợ.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1484101403633-562f891dc89a?w=80&h=80&fit=crop',
|
|
category: 'projects',
|
|
publishedDate: '2024-11-05T00:00:00.000Z',
|
|
viewCount: 2700,
|
|
readingTimeMinutes: 10,
|
|
isFeatured: false,
|
|
),
|
|
|
|
const NewsArticleModel(
|
|
id: 'news-5',
|
|
title: 'Công cụ hỗ trợ tính toán diện tích gạch chính xác',
|
|
excerpt:
|
|
'Hướng dẫn sử dụng các công cụ và ứng dụng giúp tính toán diện tích gạch cần thiết cho công trình một cách chính xác nhất.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=80&h=80&fit=crop',
|
|
category: 'professional',
|
|
publishedDate: '2024-11-03T00:00:00.000Z',
|
|
viewCount: 1200,
|
|
readingTimeMinutes: 7,
|
|
isFeatured: false,
|
|
),
|
|
|
|
// Additional articles for different categories
|
|
const NewsArticleModel(
|
|
id: 'event-1',
|
|
title: 'Hội nghị thầu thợ miền Nam 2024',
|
|
excerpt:
|
|
'Tham gia sự kiện kết nối, chia sẻ kinh nghiệm và cập nhật xu hướng mới nhất trong ngành xây dựng.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1540575467063-178a50c2df87?w=80&h=80&fit=crop',
|
|
category: 'events',
|
|
publishedDate: '2024-11-01T00:00:00.000Z',
|
|
viewCount: 950,
|
|
readingTimeMinutes: 3,
|
|
isFeatured: false,
|
|
),
|
|
|
|
const NewsArticleModel(
|
|
id: 'promo-1',
|
|
title: 'Khuyến mãi mua 10 tặng 1 - Gạch Granite 60x60',
|
|
excerpt:
|
|
'Chương trình ưu đãi đặc biệt dành cho thầu thợ và đại lý. Áp dụng cho đơn hàng từ 500m² trở lên.',
|
|
imageUrl:
|
|
'https://images.unsplash.com/photo-1607400201889-565b1ee75f8e?w=80&h=80&fit=crop',
|
|
category: 'promotions',
|
|
publishedDate: '2024-10-28T00:00:00.000Z',
|
|
viewCount: 4200,
|
|
readingTimeMinutes: 2,
|
|
isFeatured: false,
|
|
),
|
|
];
|
|
}
|