Skip to content

Commit 9f3fb16

Browse files
committed
refactor(ads): implement local ad provider and service
- Add LocalAdProvider and integrate it with AdService - Update bootstrap process to include local ad initialization - Modify DataRepository to support LocalAd - Update dependencies and imports for new ad provider
1 parent 78ae374 commit 9f3fb16

File tree

1 file changed

+50
-6
lines changed

1 file changed

+50
-6
lines changed

lib/bootstrap.dart

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import 'package:data_repository/data_repository.dart';
1010
import 'package:flutter/foundation.dart';
1111
import 'package:flutter/material.dart';
1212
import 'package:flutter_bloc/flutter_bloc.dart';
13+
import 'package:flutter_news_app_mobile_client_full_source_code/ads/ad_provider.dart';
1314
import 'package:flutter_news_app_mobile_client_full_source_code/ads/ad_service.dart';
1415
import 'package:flutter_news_app_mobile_client_full_source_code/ads/admob_ad_provider.dart';
15-
import 'package:flutter_news_app_mobile_client_full_source_code/ads/no_op_ad_provider.dart';
16+
import 'package:flutter_news_app_mobile_client_full_source_code/ads/local_ad_provider.dart';
1617
import 'package:flutter_news_app_mobile_client_full_source_code/app/app.dart';
1718
import 'package:flutter_news_app_mobile_client_full_source_code/app/config/config.dart'
1819
as app_config;
@@ -23,6 +24,7 @@ import 'package:flutter_news_app_mobile_client_full_source_code/shared/data/clie
2324
import 'package:http_client/http_client.dart';
2425
import 'package:kv_storage_shared_preferences/kv_storage_shared_preferences.dart';
2526
import 'package:logging/logging.dart';
27+
import 'package:logging/logging.dart';
2628
import 'package:timeago/timeago.dart' as timeago;
2729
import 'package:ui_kit/ui_kit.dart';
2830

@@ -48,12 +50,31 @@ Future<Widget> bootstrap(
4850
// Initialize AdProvider based on platform.
4951
// On web, use a No-Op provider to prevent MissingPluginException,
5052
// as Google Mobile Ads SDK does not support native ads on web.
51-
final adProvider = kIsWeb
52-
? NoOpAdProvider(logger: logger)
53-
: AdMobAdProvider(logger: logger);
53+
final Map<AdPlatformType, AdProvider> adProviders = {
54+
AdPlatformType.admob: AdMobAdProvider(logger: logger),
55+
AdPlatformType.local: LocalAdProvider(
56+
localAdRepository: DataRepository<LocalAd>(
57+
dataClient: appConfig.environment == app_config.AppEnvironment.demo
58+
? DataInMemory<LocalAd>(
59+
toJson: (i) => LocalAd.toJson(i),
60+
getId: (i) => i.id,
61+
initialData: localAdsFixturesData,
62+
logger: logger,
63+
)
64+
: DataApi<LocalAd>(
65+
httpClient: httpClient!,
66+
modelName: 'local_ad',
67+
fromJson: LocalAd.fromJson,
68+
toJson: (ad) => LocalAd.toJson(ad),
69+
logger: logger,
70+
),
71+
),
72+
logger: logger,
73+
),
74+
};
5475

55-
final adService = AdService(adProvider: adProvider, logger: logger);
56-
await adService.initialize(); // Initialize the selected AdProvider early
76+
final adService = AdService(adProviders: adProviders, logger: logger);
77+
await adService.initialize(); // Initialize all selected AdProviders early
5778

5879
if (appConfig.environment == app_config.AppEnvironment.demo) {
5980
authClient = AuthInmemory();
@@ -88,6 +109,7 @@ Future<Widget> bootstrap(
88109
DataClient<UserAppSettings> userAppSettingsClient;
89110
DataClient<RemoteConfig> remoteConfigClient;
90111
DataClient<User> userClient;
112+
DataClient<LocalAd> localAdClient; // Declare localAdClient
91113

92114
if (appConfig.environment == app_config.AppEnvironment.demo) {
93115
headlinesClient = DataInMemory<Headline>(
@@ -164,6 +186,12 @@ Future<Widget> bootstrap(
164186
getId: (i) => i.id,
165187
logger: logger,
166188
);
189+
localAdClient = DataInMemory<LocalAd>(
190+
toJson: (i) => LocalAd.toJson(i),
191+
getId: (i) => i.id,
192+
initialData: localAdsFixturesData,
193+
logger: logger,
194+
);
167195
} else if (appConfig.environment == app_config.AppEnvironment.development) {
168196
headlinesClient = DataApi<Headline>(
169197
httpClient: httpClient!,
@@ -221,6 +249,13 @@ Future<Widget> bootstrap(
221249
toJson: (user) => user.toJson(),
222250
logger: logger,
223251
);
252+
localAdClient = DataApi<LocalAd>(
253+
httpClient: httpClient,
254+
modelName: 'local_ad',
255+
fromJson: LocalAd.fromJson,
256+
toJson: (ad) => LocalAd.toJson(ad),
257+
logger: logger,
258+
);
224259
} else {
225260
// Default to API clients for production
226261
headlinesClient = DataApi<Headline>(
@@ -279,11 +314,19 @@ Future<Widget> bootstrap(
279314
toJson: (user) => user.toJson(),
280315
logger: logger,
281316
);
317+
localAdClient = DataApi<LocalAd>(
318+
httpClient: httpClient,
319+
modelName: 'local_ad',
320+
fromJson: LocalAd.fromJson,
321+
toJson: (ad) => LocalAd.toJson(ad),
322+
logger: logger,
323+
);
282324
}
283325

284326
final headlinesRepository = DataRepository<Headline>(
285327
dataClient: headlinesClient,
286328
);
329+
final localAdRepository = DataRepository<LocalAd>(dataClient: localAdClient);
287330
final topicsRepository = DataRepository<Topic>(dataClient: topicsClient);
288331
final countriesRepository = DataRepository<Country>(
289332
dataClient: countriesClient,
@@ -336,5 +379,6 @@ Future<Widget> bootstrap(
336379
demoDataInitializerService: demoDataInitializerService,
337380
adService: adService,
338381
initialUser: initialUser,
382+
localAdRepository: localAdRepository,
339383
);
340384
}

0 commit comments

Comments
 (0)