Skip to content

Commit e61323a

Browse files
authored
refactor: migrate FeatureAccess from *Feature to *Config with mappers (#882)
1 parent f2f6a15 commit e61323a

54 files changed

Lines changed: 484 additions & 401 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/app/router/app_router.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:webtrit_phone/blocs/app/app_bloc.dart';
1111
import 'package:webtrit_phone/data/data.dart';
1212
import 'package:webtrit_phone/features/features.dart';
1313
import 'package:webtrit_phone/models/models.dart';
14+
import 'package:webtrit_phone/resolvers/resolvers.dart';
1415

1516
import 'deeplinks.dart';
1617

@@ -29,14 +30,16 @@ class AppRouter extends RootStackRouter {
2930
this._launchEmbeddedData,
3031
this._bottomMenuFeature,
3132
this._featureChecker,
33+
this._initialTabResolver,
3234
);
3335

3436
final AppBloc _appBloc;
3537
final AppPermissions _appPermissions;
3638
final FeatureChecker _featureChecker;
39+
final InitialTabResolver _initialTabResolver;
3740

3841
final EmbeddedData? _launchEmbeddedData;
39-
final BottomMenuFeature _bottomMenuFeature;
42+
final BottomMenuConfig _bottomMenuFeature;
4043

4144
Session get session => _appBloc.state.session;
4245

@@ -58,7 +61,7 @@ class AppRouter extends RootStackRouter {
5861
/// Retrieves the initial tab for the main screen.
5962
///
6063
/// This getter determines the initial tab to display on the main screen
61-
BottomMenuTab get _mainInitialTab => _bottomMenuFeature.activeTab;
64+
BottomMenuTab get _mainInitialTab => _initialTabResolver.resolve();
6265

6366
@override
6467
List<AutoRoute> get routes => [

lib/app/router/main_shell.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
172172
),
173173
RepositoryProvider<VoicemailRepository>(
174174
create: (context) {
175-
final isVoicemailsEnabled = featureAccess.settingsFeature.isVoicemailsEnabled;
175+
final isVoicemailsEnabled = featureAccess.settingsConfig.isVoicemailsEnabled;
176176

177177
if (isVoicemailsEnabled) {
178178
return VoicemailRepositoryImpl(
@@ -266,7 +266,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
266266
dispose: (context, service) => service.dispose(),
267267
lazy: false,
268268
),
269-
if (featureAccess.bottomMenuFeature.getTabEnabled<RecentsBottomMenuTab>()?.useCdrs == true)
269+
if (featureAccess.bottomMenuConfig.getTabEnabled<RecentsBottomMenuTab>()?.useCdrs == true)
270270
Provider<CdrsSyncWorker>(
271271
create: (context) =>
272272
CdrsSyncWorker(context.read<CdrsLocalRepository>(), context.read<CdrsRemoteRepository>())..init(),
@@ -329,7 +329,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
329329
final appPermissions = context.read<AppPermissions>();
330330

331331
Future<bool> isFutureEnabled() async {
332-
final contactTab = featureAccess.bottomMenuFeature.getTabEnabled<ContactsBottomMenuTab>();
332+
final contactTab = featureAccess.bottomMenuConfig.getTabEnabled<ContactsBottomMenuTab>();
333333
final contactSourceTypes = contactTab?.contactSourceTypes ?? [];
334334
return contactSourceTypes.contains(ContactSourceType.local);
335335
}
@@ -375,8 +375,8 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
375375
final encodingSettingsRepository = context.read<EncodingSettingsRepository>();
376376
final diagnosticService = context.read<DiagnosticService>();
377377

378-
final encodingConfig = featureAccess.callFeature.encoding;
379-
final peerConnectionConfig = featureAccess.callFeature.peerConnection;
378+
final encodingConfig = featureAccess.callConfig.encoding;
379+
final peerConnectionConfig = featureAccess.callConfig.peerConnection;
380380

381381
// Initialize media builder with app-configured audio/video constraints
382382
// Used to capture synchronized MediaStream (audio+video) for WebRTC track addition.
@@ -438,7 +438,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
438438
),
439439
iceFilter: FilterWithAppSettings(iceSettingsRepository),
440440
peerConnectionPolicyApplier: pearConnectionPolicyApplier,
441-
sipPresenceEnabled: featureAccess.sipPresenceFeature.sipPresenceSupport,
441+
sipPresenceEnabled: featureAccess.sipPresenceConfig.sipPresenceSupport,
442442
onCallEnded: () => cdrsSyncWorker?.forceSync(const Duration(seconds: 1)),
443443
onDiagnosticReportRequested: (id, error) => diagnosticService.request(
444444
DiagnosticType.androidCallkeepOnly,
@@ -456,7 +456,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
456456
return MessagingBloc(
457457
session.userId,
458458
createMessagingSocket(session.coreUrl!, session.token!, session.tenantId),
459-
featureAccess.messagingFeature,
459+
featureAccess.messagingConfig,
460460
context.read<ChatsRepository>(),
461461
context.read<ChatsOutboxRepository>(),
462462
context.read<SmsRepository>(),
@@ -526,7 +526,7 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
526526
],
527527
child: Builder(
528528
builder: (context) {
529-
final sipPresenceFeature = featureAccess.sipPresenceFeature;
529+
final sipPresenceFeature = featureAccess.sipPresenceConfig;
530530

531531
return PresenceViewParams(
532532
viewSource: switch (sipPresenceFeature.sipPresenceSupport) {
@@ -568,12 +568,12 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
568568
/// - [UserRepository]: polled every 10 seconds to keep user data up to date.
569569
/// - [SystemInfoRepository]: polled every 5 minutes to refresh system information.
570570
/// - [VoicemailRepository]: polled every 5 minutes, but only if the voicemail feature is enabled
571-
/// in [FeatureAccess.settingsFeature].
571+
/// in [FeatureAccess.settingsConfig].
572572
///
573573
/// This method centralizes the polling configuration, so changes in polling logic or intervals
574574
/// can be made here without touching the [Provider] or [PollingService] setup.
575575
List<PollingRegistration> _pollingRegistrations(BuildContext context) {
576-
final isVoicemailsEnabled = context.read<FeatureAccess>().settingsFeature.isVoicemailsEnabled;
576+
final isVoicemailsEnabled = context.read<FeatureAccess>().settingsConfig.isVoicemailsEnabled;
577577

578578
return [
579579
PollingRegistration(
@@ -604,12 +604,12 @@ class _MainShellState extends State<MainShell> with WidgetsBindingObserver {
604604
///
605605
/// Current registrations:
606606
/// - [VoicemailRepository]: refreshed when going online, but only if the voicemail feature
607-
/// is enabled in [FeatureAccess.settingsFeature].
607+
/// is enabled in [FeatureAccess.settingsConfig].
608608
///
609609
/// This method centralizes the connectivity recovery configuration, so changes in
610610
/// registration logic can be made here without touching the [Provider] or service setup.
611611
List<ConnectivityRecoveryRegistration> _connectivityRecoveryRegistrations(BuildContext context) {
612-
final isVoicemailsEnabled = context.read<FeatureAccess>().settingsFeature.isVoicemailsEnabled;
612+
final isVoicemailsEnabled = context.read<FeatureAccess>().settingsConfig.isVoicemailsEnabled;
613613

614614
return [if (isVoicemailsEnabled) ConnectivityRecoveryRegistration.refreshable(context.read<VoicemailRepository>())];
615615
}

lib/app/view/app.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:webtrit_phone/features/features.dart';
1313
import 'package:webtrit_phone/l10n/l10n.dart';
1414
import 'package:webtrit_phone/repositories/repositories.dart';
1515
import 'package:webtrit_phone/theme/theme.dart';
16+
import 'package:webtrit_phone/resolvers/resolvers.dart';
1617

1718
class App extends StatefulWidget {
1819
const App({super.key});
@@ -39,12 +40,19 @@ class _AppState extends State<App> {
3940
sessionRepository: context.read<SessionRepository>(),
4041
appInfo: context.read<AppInfo>(),
4142
);
43+
44+
final initialTabResolver = BottomMenuInitialTabResolver(
45+
config: featureAccess.bottomMenuConfig,
46+
repository: context.read<ActiveMainFlavorRepository>(),
47+
);
48+
4249
appRouter = AppRouter(
4350
appBloc,
4451
context.read<AppPermissions>(),
45-
featureAccess.loginFeature.launchLoginPage,
46-
featureAccess.bottomMenuFeature,
52+
featureAccess.loginConfig.launchLoginPage,
53+
featureAccess.bottomMenuConfig,
4754
featureAccess.toChecker(),
55+
initialTabResolver,
4856
);
4957
}
5058

lib/bootstrap.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ Future<void> _initCallkeep(FeatureAccess featureAccess) async {
177177
AndroidCallkeepServices.backgroundPushNotificationBootstrapService.initializeCallback(onPushNotificationSyncCallback);
178178

179179
// If the fallback incoming call trigger via SMS is enabled in the feature access config
180-
if (featureAccess.callFeature.callTriggerConfig.smsFallback.enabled) {
180+
if (featureAccess.callConfig.triggerConfig.smsFallback.enabled) {
181181
// Configure Android CallKeep to process incoming SMS messages
182182
// - prefix: filters SMS messages by required prefix
183183
// - regexPattern: extracts callId, handle, displayName, and hasVideo from the SMS body

lib/data/app_metadata_provider.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class DefaultAppMetadataProvider implements AppMetadataProvider {
5454
final token = _secureStorage.readToken();
5555
final coreUrl = _secureStorage.readCoreUrl();
5656
final tenantId = _secureStorage.readTenantId();
57-
final urls = _featureAccess?.embeddedFeature.embeddedResources.map((e) => e.uri.toString()).toList();
57+
final urls = _featureAccess?.embeddedConfig.embeddedResources.map((e) => e.uri.toString()).toList();
5858

5959
return <String, String>{
6060
'app': _packageInfo.appName,

0 commit comments

Comments
 (0)