diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart index 66ee094..6de525e 100644 --- a/filcnaplo/lib/api/client.dart +++ b/filcnaplo/lib/api/client.dart @@ -19,8 +19,8 @@ class FilcAPI { static const supporters = "https://api.refilc.hu/v1/public/supporters"; // Private API - static const config = "https://api.refilc.hu/v1/private/config"; static const ads = "https://api.refilc.hu/v1/private/ads"; + static const config = "https://api.refilc.hu/v1/private/config"; static const reportApi = "https://api.refilc.hu/v1/private/crash-report"; static const premiumApi = "https://api.filcnaplo.hu/premium/activate"; // static const premiumScopesApi = "https://api.filcnaplo.hu/premium/scopes"; diff --git a/filcnaplo/lib/app.dart b/filcnaplo/lib/app.dart index d6bbcea..717b3b1 100644 --- a/filcnaplo/lib/app.dart +++ b/filcnaplo/lib/app.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:filcnaplo/api/client.dart'; +import 'package:filcnaplo/api/providers/ad_provider.dart'; import 'package:filcnaplo/api/providers/live_card_provider.dart'; import 'package:filcnaplo/api/providers/news_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart'; @@ -104,6 +105,8 @@ class App extends StatelessWidget { create: (context) => NewsProvider(context: context)), ChangeNotifierProvider( create: (context) => UpdateProvider(context: context)), + ChangeNotifierProvider( + create: (context) => AdProvider(context: context)), // user data (kreten) providers ChangeNotifierProvider( diff --git a/filcnaplo/lib/models/ad.dart b/filcnaplo/lib/models/ad.dart index 48ea5bf..8279214 100644 --- a/filcnaplo/lib/models/ad.dart +++ b/filcnaplo/lib/models/ad.dart @@ -5,14 +5,16 @@ class Ad { Uri? logoUrl; bool overridePremium; DateTime date; + Uri launchUrl; Ad({ required this.title, required this.description, required this.author, - required this.logoUrl, + this.logoUrl, this.overridePremium = false, required this.date, + required this.launchUrl, }); factory Ad.fromJson(Map json) { @@ -24,6 +26,7 @@ class Ad { overridePremium: json['override_premium'] ?? false, date: json['date'] != null ? DateTime.parse(json['date']) : DateTime.now(), + launchUrl: Uri.parse(json['launch_url'] ?? 'https://refilc.hu'), ); } } diff --git a/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_tile.dart b/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_tile.dart index 90b9efd..b12f9de 100644 --- a/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_tile.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_tile.dart @@ -1,4 +1,5 @@ import 'package:filcnaplo/models/ad.dart'; +import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:flutter/material.dart'; import 'package:filcnaplo_mobile_ui/common/panel/panel_button.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; @@ -17,12 +18,30 @@ class AdTile extends StatelessWidget { child: PanelButton( onPressed: onTap, title: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(ad.title), - Text(ad.description), + Text( + ad.title, + ), + Text( + ad.description, + style: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context).text.withOpacity(0.7), + ), + ), ], ), - leading: Image.network(ad.logoUrl.toString()), + leading: ad.logoUrl != null + ? Image.network( + ad.logoUrl.toString(), + errorBuilder: (context, error, stackTrace) { + ad.logoUrl = null; + return const SizedBox(); + }, + ) + : null, trailing: const Icon(FeatherIcons.externalLink), ), ); diff --git a/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_viewable.dart b/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_viewable.dart index 9676728..fa7ed4a 100644 --- a/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_viewable.dart +++ b/filcnaplo_mobile_ui/lib/common/widgets/ad/ad_viewable.dart @@ -1,5 +1,6 @@ import 'package:filcnaplo/models/ad.dart'; import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'ad_tile.dart'; @@ -12,7 +13,10 @@ class AdViewable extends StatelessWidget { Widget build(BuildContext context) { return AdTile( ad, - onTap: () => [], + onTap: () => launchUrl( + ad.launchUrl, + mode: LaunchMode.externalApplication, + ), ); } }