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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ and this project adheres to Calendar Versioning (CalVer).
### Removed

### Fixed
- Fix deleting all app data reusing a closed Whitenoise database instance [PR #662](https://github.com/marmot-protocol/whitenoise/pull/662)
- Fixed QR scanner not showing camera on first attempt after giving permission [PR #654](https://github.com/marmot-protocol/whitenoise/pull/654)
- Fix show author name in last message of pending invites in chat list [PR #668](https://github.com/marmot-protocol/whitenoise/pull/668)

Expand Down
50 changes: 37 additions & 13 deletions lib/hooks/use_delete_all_data.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import 'dart:async';

import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:logging/logging.dart';
import 'package:whitenoise/src/rust/api.dart' as api;
import 'package:whitenoise/utils/reset_marker.dart';

final _logger = Logger('useDeleteAllData');

const defaultTimeout = Duration(seconds: 10);
enum DeleteAllDataFailure {
deleteFailed,
reinitializeFailed,
}

class DeleteAllDataState {
final bool isDeleting;
Expand All @@ -27,12 +29,16 @@ class DeleteAllDataState {
({
DeleteAllDataState state,
Future<bool> Function() deleteAllData,
DeleteAllDataFailure? Function() latestFailure,
Object? Function() latestError,
StackTrace? Function() latestStackTrace,
})
useDeleteAllData({
Duration timeout = defaultTimeout,
}) {
useDeleteAllData() {
final state = useState(const DeleteAllDataState());
final isMountedRef = useRef(true);
final latestFailureRef = useRef<DeleteAllDataFailure?>(null);
final latestErrorRef = useRef<Object?>(null);
final latestStackTraceRef = useRef<StackTrace?>(null);

useEffect(() {
return () {
Expand All @@ -42,22 +48,37 @@ useDeleteAllData({

Future<bool> deleteAllData() async {
state.value = state.value.copyWith(isDeleting: true);
latestFailureRef.value = null;
latestErrorRef.value = null;
latestStackTraceRef.value = null;
try {
_logger.info('Deleting all application data');
await api.deleteAllData().timeout(timeout);
_logger.info('All data deleted successfully');
await markResetPending();
await api.deleteAllData();
} catch (e, stackTrace) {
latestFailureRef.value = DeleteAllDataFailure.deleteFailed;
latestErrorRef.value = e;
latestStackTraceRef.value = stackTrace;
_logger.severe('Failed to delete all data', e, stackTrace);
if (isMountedRef.value) {
state.value = state.value.copyWith(isDeleting: false);
}
return true;
} on TimeoutException catch (e, stackTrace) {
_logger.severe('Delete all data timed out', e, stackTrace);
return false;
}

try {
await api.reinitializeWhitenoise();
await clearResetPending();
_logger.info('All data deleted successfully');
if (isMountedRef.value) {
state.value = state.value.copyWith(isDeleting: false);
}
return false;
return true;
} catch (e, stackTrace) {
_logger.severe('Failed to delete all data', e, stackTrace);
latestFailureRef.value = DeleteAllDataFailure.reinitializeFailed;
latestErrorRef.value = e;
latestStackTraceRef.value = stackTrace;
_logger.severe('Data deleted, but failed to reinitialize Whitenoise', e, stackTrace);
if (isMountedRef.value) {
state.value = state.value.copyWith(isDeleting: false);
}
Expand All @@ -68,5 +89,8 @@ useDeleteAllData({
return (
state: state.value,
deleteAllData: deleteAllData,
latestFailure: () => latestFailureRef.value,
latestError: () => latestErrorRef.value,
latestStackTrace: () => latestStackTraceRef.value,
);
}
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import 'package:whitenoise/screens/fatal_error_screen.dart';
import 'package:whitenoise/src/rust/api.dart' as rust_api;
import 'package:whitenoise/src/rust/frb_generated.dart';
import 'package:whitenoise/theme.dart';
import 'package:whitenoise/utils/reset_marker.dart';

// TODO: Remove migration gate and related code in the next release.
const kDataVersion = 1;
Expand Down Expand Up @@ -65,6 +66,7 @@ Future<ProviderContainer> initializeAppContainer() async {
final dir = await getApplicationDocumentsDirectory();
final dataDir = '${dir.path}/whitenoise/data';
final logsDir = '${dir.path}/whitenoise/logs';
await recoverPendingReset(dataDir: dataDir, logsDir: logsDir);
await Directory(dataDir).create(recursive: true);
await Directory(logsDir).create(recursive: true);

Expand Down
17 changes: 16 additions & 1 deletion lib/screens/privacy_security_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:whitenoise/hooks/use_system_notice.dart';
import 'package:whitenoise/l10n/l10n.dart';
import 'package:whitenoise/providers/auth_provider.dart';
import 'package:whitenoise/routes.dart';
import 'package:whitenoise/screens/fatal_error_screen.dart';
import 'package:whitenoise/theme.dart';
import 'package:whitenoise/widgets/wn_button.dart';
import 'package:whitenoise/widgets/wn_confirmation_slate.dart';
Expand All @@ -21,7 +22,8 @@ class PrivacySecurityScreen extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final colors = context.colors;
final typography = context.typographyScaled;
final (:state, :deleteAllData) = useDeleteAllData();
final (:state, :deleteAllData, :latestFailure, :latestError, :latestStackTrace) =
useDeleteAllData();
final systemNotice = useSystemNotice();

Future<void> handleDeleteAllData() async {
Expand All @@ -46,6 +48,19 @@ class PrivacySecurityScreen extends HookConsumerWidget {
}
});
} else {
if (latestFailure() == DeleteAllDataFailure.reinitializeFailed) {
final error = latestError();
await Navigator.of(context, rootNavigator: true).pushAndRemoveUntil(
MaterialPageRoute<void>(
builder: (_) => FatalErrorScreen(
errorMessage: error?.toString() ?? 'Whitenoise reinitialization failed',
stackTrace: latestStackTrace(),
),
),
(_) => false,
);
return;
}
systemNotice.showErrorNotice(context.l10n.deleteAllDataError);
}
}
Expand Down
14 changes: 11 additions & 3 deletions lib/src/rust/api.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand All @@ -8,8 +8,9 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
import 'api/error.dart';
import 'frb_generated.dart';

// These functions are ignored because they are not marked as `pub`: `wn_session`, `wn`
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt`, `from`
// These functions are ignored because they are not marked as `pub`: `new_whitenoise_with_timeout`, `release_lifecycle`, `to_core_config`, `wn_session`, `wn`
// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `WnHandle`, `WnSessionHandle`
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `deref`, `deref`, `fmt`, `from`

/// Creates a `WhitenoiseConfig` object from string directory paths.
///
Expand Down Expand Up @@ -44,6 +45,13 @@ Future<WhitenoiseConfig> createWhitenoiseConfig({
Future<void> initializeWhitenoise({required WhitenoiseConfig config}) =>
RustLib.instance.api.crateApiInitializeWhitenoise(config: config);

Future<void> reinitializeWhitenoise() => RustLib.instance.api.crateApiReinitializeWhitenoise();

/// Wipes all on-disk data and clears the process-global Whitenoise instance.
/// The lifecycle write lock waits for in-flight bridge calls before the old
/// database pool is closed, then blocks new bridge calls until the global
/// instance has been cleared. Call `initialize_whitenoise` to install a fresh
/// instance after the reset.
Future<void> deleteAllData() => RustLib.instance.api.crateApiDeleteAllData();

Future<AppSettings> getAppSettings() => RustLib.instance.api.crateApiGetAppSettings();
Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/account_groups.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/accounts.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/bug_report.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/chat_list.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/chat_summary.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/drafts.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/error.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/group_state.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/groups.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/logs.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/markdown.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/media_files.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/messages.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/metadata.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/mute_list.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/notifications.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/relay_defaults.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/relays.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/signer.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/user_search.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/users.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/utils.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
2 changes: 1 addition & 1 deletion lib/src/rust/api/zapstore.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.11.1.
// @generated by `flutter_rust_bridge`@ 2.12.0.

// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import

Expand Down
Loading
Loading