Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 2 additions & 4 deletions catalyst_voices/apps/voices/integration_test/all_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,11 @@ import 'suites/suites.dart';

void main() {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
final f14Campaign = Campaign.f14();

setUpAll(() async {
binding.testTextInput.register();

// F14
final f14Campaign = Campaign.f14();
mockedActiveCampaign = f14Campaign;

final proposalSubmissionTimeline = f14Campaign.timeline.phases
.firstWhere((element) => element.type == CampaignPhaseType.proposalSubmission)
.timeline;
Expand All @@ -33,6 +30,7 @@ void main() {

await loggingService.updateSettings(printToConsole: const Optional(false));

await Dependencies.instance.get<CampaignService>().setActiveCampaign(f14Campaign);
await Dependencies.instance.get<SyncManager>().waitForSync;
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ final class Dependencies extends DependencyProvider {
isRegistered<LoggingService>() ? get<LoggingService>() : null,
get<DownloaderService>(),
get<DocumentsService>(),
get<CampaignService>(),
);
})
..registerFactory<DocumentLookupBloc>(() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ class _AddCollaboratorDialogState extends State<AddCollaboratorDialog> {
Widget build(BuildContext context) {
return BlocProvider.value(
value: _cubit,
child: ScaffoldMessenger(
child: const ScaffoldMessenger(
child: Scaffold(
backgroundColor: Colors.transparent,
body: VoicesPanelDialog(
constraints: const Responsive.single(BoxConstraints(maxWidth: 602, maxHeight: 396)),
child: const AddCollaboratorView(),
constraints: Responsive.single(BoxConstraints(maxWidth: 602, maxHeight: 396)),
child: AddCollaboratorView(),
),
),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import 'package:catalyst_voices/pages/dev_tools/cards/info_card.dart';
import 'package:catalyst_voices_blocs/catalyst_voices_blocs.dart';
import 'package:catalyst_voices_models/catalyst_voices_models.dart';
import 'package:flutter/material.dart';

class ActiveCampaignCard extends StatelessWidget {
const ActiveCampaignCard({super.key});

@override
Widget build(BuildContext context) {
return BlocSelector<DevToolsBloc, DevToolsState, DevToolsCampaignState>(
selector: (state) => state.campaign,
builder: (context, state) {
return _ActiveCampaignCard(
activeCampaign: state.activeCampaign,
allCampaigns: state.allCampaigns,
);
},
);
}
}

class _ActiveCampaignCard extends StatelessWidget {
final Campaign? activeCampaign;
final List<Campaign> allCampaigns;

const _ActiveCampaignCard({
required this.activeCampaign,
required this.allCampaigns,
});

@override
Widget build(BuildContext context) {
return InfoCard(
title: const Text('Campaign'),
children: [
Row(
mainAxisSize: MainAxisSize.min,
spacing: 16,
children: [
const Text('Active Campaign'),
DropdownButton<Campaign>(
value: activeCampaign,
hint: const Text('Select a campaign'),
items: allCampaigns.map((Campaign value) {
return DropdownMenuItem<Campaign>(
value: value,
child: Text(value.name),
);
}).toList(),
onChanged: (Campaign? newValue) {
if (newValue != null) {
context.read<DevToolsBloc>().add(ChangeActiveCampaignEvent(newValue));
}
},
),
],
),
],
);
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:catalyst_voices/pages/dev_tools/cards/active_campaign_card.dart';
import 'package:catalyst_voices/pages/dev_tools/cards/app_info_card.dart';
import 'package:catalyst_voices/pages/dev_tools/cards/config_card.dart';
import 'package:catalyst_voices/pages/dev_tools/cards/documents_card.dart';
Expand Down Expand Up @@ -50,6 +51,8 @@ class _DevToolsPageState extends State<DevToolsPage> {
SizedBox(height: 12),
ConfigCard(),
SizedBox(height: 12),
ActiveCampaignCard(),
SizedBox(height: 12),
DocumentsCard(),
SizedBox(height: 12),
FeatureFlagsCard(),
Expand All @@ -71,6 +74,7 @@ class _DevToolsPageState extends State<DevToolsPage> {
void dispose() {
_bloc?.add(const StopWatchingSystemInfoEvent());
_bloc?.add(const StopWatchingDocumentsEvent());
_bloc?.add(const StopWatchingActiveCampaignEvent());
_bloc = null;
super.dispose();
}
Expand All @@ -80,8 +84,9 @@ class _DevToolsPageState extends State<DevToolsPage> {
super.initState();

_bloc = context.read<DevToolsBloc>()
..add(const UpdateAllEvent())
..add(const InitDataEvent())
..add(const WatchSystemInfoEvent())
..add(const WatchDocumentsEvent());
..add(const WatchDocumentsEvent())
..add(const WatchActiveCampaignEvent());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ class _Icon extends StatelessWidget {
class _LeaveProposalDialogState extends State<LeaveProposalDialog> {
@override
Widget build(BuildContext context) {
return VoicesPanelDialog(
constraints: const Responsive.single(
return const VoicesPanelDialog(
constraints: Responsive.single(
BoxConstraints(maxWidth: 511, maxHeight: 285),
),
child: const Padding(
child: Padding(
padding: EdgeInsets.fromLTRB(16, 36, 16, 20),
child: Column(
children: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,36 +19,39 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
final LoggingService? _loggingService;
final DownloaderService _downloaderService;
final DocumentsService _documentsService;
final CampaignService _campaignService;

Timer? _resetCountTimer;
StreamSubscription<SyncStats>? _syncStartsSub;
StreamSubscription<int>? _documentsCountSub;
StreamSubscription<Campaign?>? _activeCampaignSub;

DevToolsBloc(
this._devToolsService,
this._syncManager,
this._loggingService,
this._downloaderService,
this._documentsService,
this._campaignService,
) : super(const DevToolsState()) {
on<DevToolsEnablerTappedEvent>(_handleEnablerTap);
on<DevToolsEnablerTapResetEvent>(_handleTapCountReset);
on<RecoverDataEvent>(_handleRecoverData);
on<UpdateSystemInfoEvent>(_handleUpdateSystemInfo);
on<InitDataEvent>(_handleInitData);
on<SyncDocumentsEvent>(_handleSyncDocuments);
on<UpdateAllEvent>(_handleUpdateAll);
on<WatchSystemInfoEvent>(_handleWatchSystemInfoEvent);
on<StopWatchingSystemInfoEvent>(_handleStopWatchingSystemInfoEvent);
on<WatchDocumentsEvent>(_handleWatchDocumentsEvent);
on<StopWatchingDocumentsEvent>(_handleStopWatchingDocumentsEvent);
on<DocumentsCountChangedEvent>(_updateDocumentsCount);
on<WatchSystemInfoEvent>(_handleWatchSystemInfo);
on<StopWatchingSystemInfoEvent>(_handleStopWatchingSystemInfo);
on<WatchDocumentsEvent>(_handleWatchDocuments);
on<StopWatchingDocumentsEvent>(_handleStopWatchingDocuments);
on<WatchActiveCampaignEvent>(_handleWatchActiveCampaign);
on<StopWatchingActiveCampaignEvent>(_handleStopWatchingActiveCampaign);
on<DocumentsCountChangedEvent>(_updateDocumentsCountChanged);
on<SyncStatsChangedEvent>(_handleSyncStatsChanged);
on<ChangeLogLevelEvent>(_handleChangeLogLevel);
on<ChangeCollectLogsEvent>(_handleChangeCollectLogs);
on<ChangeCollectLogsEvent>(_handleChangeCollectLogsEvent);
on<ChangeActiveCampaignEvent>(_handleChangeActiveCampaign);
on<PrepareAndExportLogsEvent>(_handleExportLogs);
on<ClearDocumentsEvent>(_handleClearDocuments);

add(const RecoverDataEvent());
on<ActiveCampaignChangedEvent>(_handleActiveCampaignChanged);
}

@override
Expand All @@ -62,10 +65,31 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
await _documentsCountSub?.cancel();
_documentsCountSub = null;

await _activeCampaignSub?.cancel();
_activeCampaignSub = null;

return super.close();
}

Future<void> _handleChangeCollectLogs(
void _handleActiveCampaignChanged(ActiveCampaignChangedEvent event, Emitter<DevToolsState> emit) {
emit(state.copyWithActiveCampaign(event.campaign));
}

Future<void> _handleChangeActiveCampaign(
ChangeActiveCampaignEvent event,
Emitter<DevToolsState> emit,
) async {
final previousCampaign = state.campaign.activeCampaign;
try {
emit(state.copyWithActiveCampaign(event.campaign));
await _campaignService.setActiveCampaign(event.campaign);
} catch (error, stackTrace) {
_logger.severe('handleChangeActiveCampaign', error, stackTrace);
emit(state.copyWithActiveCampaign(previousCampaign));
}
}

Future<void> _handleChangeCollectLogsEvent(
ChangeCollectLogsEvent event,
Emitter<DevToolsState> emit,
) async {
Expand Down Expand Up @@ -142,19 +166,21 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
final content = await _loggingService!.prepareForExportCollectedLogs();
final encodedContent = utf8.encode(content);

final filename = 'catalyst_app_${DateTimeExt.now().toIso8601String()}_logs.txt';
final filename = 'catalyst_app_${DateTimeExt.now().microsecondsSinceEpoch}_logs.txt';

await _downloaderService.download(data: encodedContent, filename: filename);
} catch (error, stack) {
_logger.severe('Exporting logs failed', error, stack);
}
}

Future<void> _handleRecoverData(RecoverDataEvent event, Emitter<DevToolsState> emit) async {
Future<void> _handleInitData(InitDataEvent event, Emitter<DevToolsState> emit) async {
final isDeveloper = await _devToolsService.isDeveloper();
final syncStats = await _devToolsService.getStats();
final areLogsOptionsAvailable = _loggingService != null;
final loggingSettings = await _loggingService?.getSettings();
final activeCampaign = await _campaignService.getActiveCampaign();
final allCampaigns = await _campaignService.getAllCampaigns();

if (!isClosed) {
emit(
Expand All @@ -164,20 +190,32 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
areLogsOptionsAvailable: areLogsOptionsAvailable,
logsLevel: Optional(loggingSettings?.effectiveLevel),
collectLogs: loggingSettings?.effectiveCollectLogs ?? false,
campaign: DevToolsCampaignState(
activeCampaign: activeCampaign,
allCampaigns: allCampaigns,
),
),
);
}
}

Future<void> _handleStopWatchingDocumentsEvent(
Future<void> _handleStopWatchingActiveCampaign(
StopWatchingActiveCampaignEvent event,
Emitter<DevToolsState> emit,
) async {
await _activeCampaignSub?.cancel();
_activeCampaignSub = null;
}

Future<void> _handleStopWatchingDocuments(
StopWatchingDocumentsEvent event,
Emitter<DevToolsState> emit,
) async {
await _documentsCountSub?.cancel();
_documentsCountSub = null;
}

Future<void> _handleStopWatchingSystemInfoEvent(
Future<void> _handleStopWatchingSystemInfo(
StopWatchingSystemInfoEvent event,
Emitter<DevToolsState> emit,
) async {
Expand All @@ -204,38 +242,16 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
emit(state.copyWith(enableTapCount: 0));
}

Future<void> _handleUpdateAll(UpdateAllEvent event, Emitter<DevToolsState> emit) async {
try {
final systemInfo = await _devToolsService.getSystemInfo();
final syncStats = await _devToolsService.getStats();

if (!isClosed) {
emit(state.copyWith(systemInfo: Optional(systemInfo), syncStats: Optional(syncStats)));
}
} catch (error, stack) {
_logger.warning('Updating all failed', error, stack);
}
}

Future<void> _handleUpdateSystemInfo(
UpdateSystemInfoEvent event,
Future<void> _handleWatchActiveCampaign(
WatchActiveCampaignEvent event,
Emitter<DevToolsState> emit,
) async {
SystemInfo? systemInfo;

try {
systemInfo = await _devToolsService.getSystemInfo();
} catch (error, stack) {
_logger.warning('Updating system info failed', error, stack);
systemInfo = null;
} finally {
if (!isClosed) {
emit(state.copyWith(systemInfo: Optional(systemInfo)));
}
}
_activeCampaignSub = _campaignService.watchActiveCampaign.listen((value) {
add(ActiveCampaignChangedEvent(value));
});
}

Future<void> _handleWatchDocumentsEvent(
Future<void> _handleWatchDocuments(
WatchDocumentsEvent event,
Emitter<DevToolsState> emit,
) async {
Expand All @@ -244,7 +260,7 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
);
}

Future<void> _handleWatchSystemInfoEvent(
Future<void> _handleWatchSystemInfo(
WatchSystemInfoEvent event,
Emitter<DevToolsState> emit,
) async {
Expand All @@ -253,7 +269,7 @@ final class DevToolsBloc extends Bloc<DevToolsEvent, DevToolsState>
);
}

void _updateDocumentsCount(DocumentsCountChangedEvent event, Emitter<DevToolsState> emit) {
void _updateDocumentsCountChanged(DocumentsCountChangedEvent event, Emitter<DevToolsState> emit) {
emit(state.copyWith(documentsCount: Optional(event.count)));
}
}
Loading
Loading