feat: Check if the server supports logs

This commit is contained in:
Inex Code 2024-07-26 17:09:33 +03:00
parent 515b0e2c67
commit 8c5bdf9cd8
3 changed files with 47 additions and 12 deletions

View file

@ -37,7 +37,9 @@
"alert": "Alert", "alert": "Alert",
"copied_to_clipboard": "Copied to clipboard!", "copied_to_clipboard": "Copied to clipboard!",
"please_connect": "Please connect your server, domain and DNS provider to dive in!", "please_connect": "Please connect your server, domain and DNS provider to dive in!",
"network_error": "Network error" "network_error": "Network error",
"feature_unsupported_on_api_version": "This feature is only supported on server version {versionConstraint}. Your server is on version {currentVersion}.",
"error": "Error"
}, },
"more_page": { "more_page": {
"configuration_wizard": "Setup wizard", "configuration_wizard": "Setup wizard",

View file

@ -1,7 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:easy_localization/easy_localization.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/models/server_logs.dart'; import 'package:selfprivacy/logic/models/server_logs.dart';
@ -74,6 +76,8 @@ class ServerLogsBloc extends Bloc<ServerLogsEvent, ServerLogsState> {
}); });
} }
static const String logsSupportedVersion = '>=3.3.0';
Future<(List<ServerLogEntry>, ServerLogsPageMeta)> _getLogs({ Future<(List<ServerLogEntry>, ServerLogsPageMeta)> _getLogs({
// No more than 50 // No more than 50
required final int limit, required final int limit,
@ -82,12 +86,29 @@ class ServerLogsBloc extends Bloc<ServerLogsEvent, ServerLogsState> {
// All entries returned will be greater than this cursor. Sets lower bound on results. // All entries returned will be greater than this cursor. Sets lower bound on results.
final String? downCursor, final String? downCursor,
// Only one cursor can be set at a time. // Only one cursor can be set at a time.
}) => }) {
getIt<ApiConnectionRepository>().api.getServerLogs( final String? apiVersion =
getIt<ApiConnectionRepository>().apiData.apiVersion.data;
if (apiVersion == null) {
throw Exception('basis.network_error'.tr());
}
if (!VersionConstraint.parse(logsSupportedVersion)
.allows(Version.parse(apiVersion))) {
throw Exception(
'basis.feature_unsupported_on_api_version'.tr(
namedArgs: {
'versionConstraint': logsSupportedVersion,
'currentVersion': apiVersion,
},
),
);
}
return getIt<ApiConnectionRepository>().api.getServerLogs(
limit: limit, limit: limit,
upCursor: upCursor, upCursor: upCursor,
downCursor: downCursor, downCursor: downCursor,
); );
}
@override @override
Future<void> close() { Future<void> close() {

View file

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:selfprivacy/logic/bloc/server_logs/server_logs_bloc.dart'; import 'package:selfprivacy/logic/bloc/server_logs/server_logs_bloc.dart';
import 'package:selfprivacy/logic/models/server_logs.dart'; import 'package:selfprivacy/logic/models/server_logs.dart';
import 'package:selfprivacy/ui/helpers/empty_page_placeholder.dart';
import 'package:selfprivacy/utils/platform_adapter.dart'; import 'package:selfprivacy/utils/platform_adapter.dart';
@RoutePage() @RoutePage()
@ -86,7 +87,8 @@ class _ServerLogsScreenState extends State<ServerLogsScreen> {
if (state is ServerLogsLoaded) { if (state is ServerLogsLoaded) {
return _buildDrawer(state.systemdUnits); return _buildDrawer(state.systemdUnits);
} }
return const SizedBox.shrink(); // Return an empty drawer if the state is not loaded
return const Drawer(child: SizedBox());
}, },
), ),
body: BlocBuilder<ServerLogsBloc, ServerLogsState>( body: BlocBuilder<ServerLogsBloc, ServerLogsState>(
@ -130,7 +132,11 @@ class _ServerLogsScreenState extends State<ServerLogsScreen> {
); );
} }
} else if (state is ServerLogsError) { } else if (state is ServerLogsError) {
return Center(child: Text('Error: ${state.error}')); return EmptyPagePlaceholder(
title: 'basis.error'.tr(),
iconData: Icons.error_outline,
description: state.error.toString(),
);
} }
return Center(child: Text('server.no_logs'.tr())); return Center(child: Text('server.no_logs'.tr()));
}, },
@ -240,13 +246,19 @@ class ServerLogEntryDialog extends StatelessWidget {
_KeyValueRow('server.log_dialog.cursor'.tr(), log.cursor), _KeyValueRow('server.log_dialog.cursor'.tr(), log.cursor),
if (log.priority != null) if (log.priority != null)
_KeyValueRow( _KeyValueRow(
'server.log_dialog.priority'.tr(), log.priority?.toString()), 'server.log_dialog.priority'.tr(),
log.priority?.toString(),
),
if (log.systemdSlice != null) if (log.systemdSlice != null)
_KeyValueRow( _KeyValueRow(
'server.log_dialog.systemd_slice'.tr(), log.systemdSlice), 'server.log_dialog.systemd_slice'.tr(),
log.systemdSlice,
),
if (log.systemdUnit != null) if (log.systemdUnit != null)
_KeyValueRow( _KeyValueRow(
'server.log_dialog.systemd_unit'.tr(), log.systemdUnit), 'server.log_dialog.systemd_unit'.tr(),
log.systemdUnit,
),
const Divider(), const Divider(),
_SectionRow('server.log_dialog.message'.tr()), _SectionRow('server.log_dialog.message'.tr()),
_DataRow(log.message), _DataRow(log.message),