Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
3fdbbd2
build(dependencies): update core dependency to latest commit
fulleni Dec 20, 2025
36818ca
feat(l10n): add analytics related strings for English and Arabic
fulleni Dec 20, 2025
2bb4dcd
build(l10n): sync
fulleni Dec 20, 2025
e121d04
feat(app_configuration): add analytics config form widget
fulleni Dec 20, 2025
9374afd
feat(app_configuration): add analytics configuration tab
fulleni Dec 20, 2025
7c655a7
chore: feature overhaul
fulleni Dec 20, 2025
de3636c
chore: misc
fulleni Dec 20, 2025
d3598e2
docs(l10n): add analytics event labels and descriptions
fulleni Dec 20, 2025
c52eccd
build(l10n): sync
fulleni Dec 20, 2025
66c7226
feat(app_configuration): add analytics configuration to features tab
fulleni Dec 20, 2025
6e7034c
feat(analytics): enhance event configuration with labels and descript…
fulleni Dec 20, 2025
a4714de
fix(analytics): handle null values and update event descriptions
fulleni Dec 20, 2025
2311f44
refactor(features-tab): remove redundnt analytics configuration
fulleni Dec 20, 2025
35ce718
feat(app_configuration): add feed config form widget
fulleni Dec 20, 2025
d1e615b
refactor(app_configuration): simplify features configuration tab
fulleni Dec 20, 2025
a616919
feat(analytics): conditionally render config sections based on analyt…
fulleni Dec 20, 2025
d127215
feat(push-notification): conditionally render settings sections based…
fulleni Dec 20, 2025
7711cfe
style: format
fulleni Dec 20, 2025
4f7d5f3
refactor(README): streamline remote control & app configuration details
fulleni Dec 20, 2025
0e1aa40
refactor(analytics): improve event info retrieval
fulleni Dec 20, 2025
b3a86d2
refactor(app_configuration): use enum for ExpansionTile state management
fulleni Dec 20, 2025
e0707c3
style: format
fulleni Dec 20, 2025
4c62e71
build: upgrade pinput package from 5.0.1 to 6.0.1
fulleni Dec 20, 2025
69ef8ab
chore(dependencies): revert pinput version to 6.0.0
fulleni Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 10 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,24 +59,16 @@ Directly manage all user-generated content from a centralized command center. Re


<details>
<summary><strong>⚙️ App Monetization & Remote Control</strong></summary>

### 💸 Centralized Monetization Engine
Take direct control of your mobile app's revenue strategy. This integrated system allows you to manage your ad inventory and fine-tune display rules without ever touching the mobile app's code.
- **Flexible Ad Provider Strategy:** Instantly switch the mobile app's primary ad source between industry-standard networks like Google AdMob for maximum control.
- **Granular, Role-Based Rules:** Define precisely how and when ads are shown based on user subscription tiers (e.g., guest, standard, premium), optimizing both revenue and user experience.
> **Your Advantage:** Deploy a powerful, backend-driven monetization strategy. A/B test ad providers and adjust revenue models on the fly to respond to market demands in real-time.

---

### 🚀 Real-Time Application Management
Dynamically control the mobile app's behavior and operational state directly from the dashboard, eliminating the need for constant app store updates.
- **Critical State Management:** Instantly activate a maintenance mode or enforce a mandatory app update for your users to handle operational issues or critical releases gracefully.
- **Dynamic In-App Content:** Remotely manage the visibility and behavior of in-feed promotional prompts and user engagement elements.
- **Tier-Based Feature Gating:** Define and enforce feature limits based on user roles, such as setting the maximum number of followed topics or saved headlines for different subscription levels.
- **Full Community Feature Control:** Remotely enable or disable the entire user engagement system (reactions, comments), the content reporting feature, and the in-app review funnel. Fine-tune engagement modes and configure rules for when and how users are prompted for feedback.
- **Global Notification Control:** Remotely enable or disable the entire push notification system, switch between providers (e.g., Firebase, OneSignal), and toggle specific delivery types like breaking news or daily digests.
> **Your Advantage:** Gain unparalleled agility to manage your live application. Ensure service stability, drive user actions, and configure business rules instantly, all from a centralized control panel.
<summary><strong>⚙️ Real-Time App Configuration & Remote Control</strong></summary>

### 🚀 Dynamic Application Control
Dynamically control the mobile app's behavior, features, and operational state directly from the dashboard, eliminating the need for constant app store updates.
- **App Monetization:** Take direct control of your mobile app's revenue. Remotely manage ad providers like Google AdMob and define granular, role-based display rules to optimize revenue and user experience.
- **Feature Toggling:** Instantly enable or disable major features. Globally toggle the entire push notification system, the community engagement suite (reactions, comments), the content reporting feature, and the in-app review funnel.
- **Operational Control:** Ensure stability and manage releases gracefully. Activate a maintenance mode or enforce a mandatory app update for all users directly from the dashboard.
- **Content & Access Control:** Define and enforce feature limits based on user subscription tiers, such as setting the maximum number of saved articles. Remotely manage the visibility and behavior of in-feed promotional prompts.
- **Analytics & Data Insights:** Gain critical insights by remotely configuring the analytics system. Enable or disable the entire system, switch between providers like Firebase or Mixpanel, and fine-tune event tracking and sampling rates to understand user behavior without deploying new app versions.
> **Your Advantage:** Gain unparalleled agility to manage your live application. Ensure service stability, drive user actions, configure business rules, and adjust your data strategy instantly, all from a single, centralized control panel.

</details>

Expand Down
22 changes: 8 additions & 14 deletions lib/app/view/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import 'package:flutter_news_app_web_dashboard_full_source_code/content_manageme
import 'package:flutter_news_app_web_dashboard_full_source_code/content_management/bloc/sources_filter/sources_filter_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/content_management/bloc/topics_filter/topics_filter_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/l10n/app_localizations.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/overview/bloc/overview_bloc.dart';
// import 'package:flutter_news_app_web_dashboard_full_source_code/overview/bloc/overview_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/router/router.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/shared/services/pending_deletions_service.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/shared/services/pending_updates_service.dart';
Expand All @@ -40,7 +40,6 @@ class App extends StatelessWidget {
required DataRepository<UserContentPreferences>
userContentPreferencesRepository,
required DataRepository<RemoteConfig> remoteConfigRepository,
required DataRepository<DashboardSummary> dashboardSummaryRepository,
required DataRepository<Country> countriesRepository,
required DataRepository<Language> languagesRepository,
required DataRepository<User> usersRepository,
Expand All @@ -59,7 +58,6 @@ class App extends StatelessWidget {
_userContentPreferencesRepository = userContentPreferencesRepository,
_remoteConfigRepository = remoteConfigRepository,
_kvStorageService = storageService,
_dashboardSummaryRepository = dashboardSummaryRepository,
_countriesRepository = countriesRepository,
_languagesRepository = languagesRepository,
_usersRepository = usersRepository,
Expand All @@ -77,7 +75,6 @@ class App extends StatelessWidget {
final DataRepository<UserContentPreferences>
_userContentPreferencesRepository;
final DataRepository<RemoteConfig> _remoteConfigRepository;
final DataRepository<DashboardSummary> _dashboardSummaryRepository;
final DataRepository<Country> _countriesRepository;
final DataRepository<Language> _languagesRepository;
final DataRepository<User> _usersRepository;
Expand All @@ -101,7 +98,6 @@ class App extends StatelessWidget {
RepositoryProvider.value(value: _appSettingsRepository),
RepositoryProvider.value(value: _userContentPreferencesRepository),
RepositoryProvider.value(value: _remoteConfigRepository),
RepositoryProvider.value(value: _dashboardSummaryRepository),
RepositoryProvider.value(value: _countriesRepository),
RepositoryProvider.value(value: _languagesRepository),
RepositoryProvider.value(value: _usersRepository),
Expand Down Expand Up @@ -163,15 +159,13 @@ class App extends StatelessWidget {
pendingDeletionsService: context.read<PendingDeletionsService>(),
),
),
BlocProvider(
create: (context) => OverviewBloc(
dashboardSummaryRepository: context
.read<DataRepository<DashboardSummary>>(),
headlinesRepository: context.read<DataRepository<Headline>>(),
topicsRepository: context.read<DataRepository<Topic>>(),
sourcesRepository: context.read<DataRepository<Source>>(),
),
),
// BlocProvider(
// create: (context) => OverviewBloc(
// headlinesRepository: context.read<DataRepository<Headline>>(),
// topicsRepository: context.read<DataRepository<Topic>>(),
// sourcesRepository: context.read<DataRepository<Source>>(),
// ),
// ),
// The UserFilterBloc is provided here to be available for both the
// UserManagementBloc and the UI components.
BlocProvider(create: (_) => UserFilterBloc()),
Expand Down
Loading
Loading