Merge pull request #704 from ente-io/user-details-fixes-2
User details fixes 2
This commit is contained in:
commit
0f6bab53f3
9 changed files with 30 additions and 94 deletions
|
@ -817,18 +817,6 @@ class FilesDB {
|
|||
);
|
||||
}
|
||||
|
||||
Future<int> getNumberOfUploadedFiles() async {
|
||||
final db = await instance.database;
|
||||
final rows = await db.query(
|
||||
filesTable,
|
||||
columns: [columnUploadedFileID],
|
||||
where:
|
||||
'($columnLocalID IS NOT NULL AND ($columnUploadedFileID IS NOT NULL AND $columnUploadedFileID IS NOT -1) AND $columnUpdationTime IS NOT NULL)',
|
||||
distinct: true,
|
||||
);
|
||||
return rows.length;
|
||||
}
|
||||
|
||||
Future<int> updateUploadedFile(
|
||||
String localID,
|
||||
String title,
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:photos/models/file_type.dart';
|
||||
import 'package:photos/models/subscription.dart';
|
||||
|
||||
class UserDetails extends Equatable {
|
||||
class UserDetails {
|
||||
final String email;
|
||||
final int usage;
|
||||
final int fileCount;
|
||||
|
@ -22,16 +21,6 @@ class UserDetails extends Equatable {
|
|||
this.familyData,
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
email,
|
||||
usage,
|
||||
fileCount,
|
||||
sharedCollectionsCount,
|
||||
subscription,
|
||||
familyData
|
||||
];
|
||||
|
||||
bool isPartOfFamily() {
|
||||
return familyData?.members?.isNotEmpty ?? false;
|
||||
}
|
||||
|
|
|
@ -136,7 +136,7 @@ class UserService {
|
|||
Future<UserDetails> getUserDetailsV2({bool memoryCount = true}) async {
|
||||
try {
|
||||
final response = await _enteDio.get(
|
||||
"/users/details/v2?memoryCount=$memoryCount",
|
||||
"/users/details/v2",
|
||||
queryParameters: {
|
||||
"memoryCount": memoryCount,
|
||||
},
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/events/opened_settings_event.dart';
|
||||
import 'package:photos/events/user_details_changed_event.dart';
|
||||
import 'package:photos/models/user_details.dart';
|
||||
// ignore: import_of_legacy_library_into_null_safe
|
||||
import 'package:photos/services/user_service.dart';
|
||||
|
@ -21,26 +19,17 @@ class UserDetailsStateWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
class UserDetailsStateWidgetState extends State<UserDetailsStateWidget> {
|
||||
late Future<UserDetails?> userDetails;
|
||||
late StreamSubscription<UserDetailsChangedEvent> _userDetailsChangedEvent;
|
||||
late UserDetails? userDetails;
|
||||
late StreamSubscription<OpenedSettingsEvent> _openedSettingsEventSubscription;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
if (Configuration.instance.hasConfiguredAccount()) {
|
||||
_fetchUserDetails();
|
||||
} else {
|
||||
userDetails = Future.value(null);
|
||||
}
|
||||
_userDetailsChangedEvent =
|
||||
Bus.instance.on<UserDetailsChangedEvent>().listen((event) {
|
||||
_fetchUserDetails();
|
||||
});
|
||||
userDetails = null;
|
||||
_openedSettingsEventSubscription =
|
||||
Bus.instance.on<OpenedSettingsEvent>().listen((event) {
|
||||
Future.delayed(
|
||||
const Duration(
|
||||
seconds: 1,
|
||||
milliseconds: 750,
|
||||
),
|
||||
_fetchUserDetails,
|
||||
);
|
||||
|
@ -50,7 +39,6 @@ class UserDetailsStateWidgetState extends State<UserDetailsStateWidget> {
|
|||
|
||||
@override
|
||||
void dispose() {
|
||||
_userDetailsChangedEvent.cancel();
|
||||
_openedSettingsEventSubscription.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
@ -62,8 +50,9 @@ class UserDetailsStateWidgetState extends State<UserDetailsStateWidget> {
|
|||
child: widget.child,
|
||||
);
|
||||
|
||||
void _fetchUserDetails() {
|
||||
userDetails = UserService.instance.getUserDetailsV2(memoryCount: true);
|
||||
void _fetchUserDetails() async {
|
||||
userDetails =
|
||||
await UserService.instance.getUserDetailsV2(memoryCount: true);
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
|
@ -72,7 +61,7 @@ class UserDetailsStateWidgetState extends State<UserDetailsStateWidget> {
|
|||
|
||||
class InheritedUserDetails extends InheritedWidget {
|
||||
final UserDetailsStateWidgetState userDetailsState;
|
||||
final Future<UserDetails?> userDetails;
|
||||
final UserDetails? userDetails;
|
||||
|
||||
const InheritedUserDetails({
|
||||
Key? key,
|
||||
|
@ -85,6 +74,8 @@ class InheritedUserDetails extends InheritedWidget {
|
|||
context.dependOnInheritedWidgetOfExactType<InheritedUserDetails>();
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(covariant InheritedUserDetails oldWidget) =>
|
||||
userDetails != oldWidget.userDetails;
|
||||
bool updateShouldNotify(covariant InheritedUserDetails oldWidget) {
|
||||
return (userDetails?.usage != oldWidget.userDetails?.usage) ||
|
||||
(userDetails?.fileCount != oldWidget.userDetails?.fileCount);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/events/opened_settings_event.dart';
|
||||
import 'package:photos/ui/components/icon_button_widget.dart';
|
||||
import 'package:photos/ui/viewer/search/search_widget.dart';
|
||||
|
||||
|
@ -24,7 +22,6 @@ class _HomeHeaderWidgetState extends State<HomeHeaderWidget> {
|
|||
icon: Icons.menu_outlined,
|
||||
onTap: () {
|
||||
Scaffold.of(context).openDrawer();
|
||||
Bus.instance.fire(OpenedSettingsEvent());
|
||||
},
|
||||
),
|
||||
AnimatedSwitcher(
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/widgets.dart' hide PageView;
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/events/opened_settings_event.dart';
|
||||
|
||||
/// This is copy-pasted from the Flutter framework with a support added for building
|
||||
/// pages off screen using [Viewport.cacheExtents] and a [LayoutBuilder]
|
||||
|
@ -295,7 +293,6 @@ class _PageViewState extends State<ExtentsPageView> {
|
|||
? widget.controller.addListener(() {
|
||||
if (widget.controller.offset < -45) {
|
||||
widget.openDrawer();
|
||||
Bus.instance.fire(OpenedSettingsEvent());
|
||||
}
|
||||
})
|
||||
: null;
|
||||
|
|
|
@ -12,6 +12,7 @@ class SettingsTitleBarWidget extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final logger = Logger((SettingsTitleBarWidget).toString());
|
||||
final userDetails = InheritedUserDetails.of(context)?.userDetails;
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
child: Padding(
|
||||
|
@ -26,31 +27,12 @@ class SettingsTitleBarWidget extends StatelessWidget {
|
|||
},
|
||||
icon: const Icon(Icons.keyboard_double_arrow_left_outlined),
|
||||
),
|
||||
FutureBuilder(
|
||||
future: InheritedUserDetails.of(context)?.userDetails,
|
||||
builder: (context, snapshot) {
|
||||
if (InheritedUserDetails.of(context) == null) {
|
||||
logger.severe(
|
||||
(InheritedUserDetails).toString() +
|
||||
' not found before ' +
|
||||
(SettingsTitleBarWidget).toString() +
|
||||
' on tree',
|
||||
);
|
||||
throw Error();
|
||||
} else if (snapshot.hasData) {
|
||||
final userDetails = snapshot.data as UserDetails;
|
||||
return Text(
|
||||
userDetails is UserDetails
|
||||
? Text(
|
||||
"${NumberFormat().format(userDetails.fileCount)} memories",
|
||||
style: getEnteTextTheme(context).largeBold,
|
||||
);
|
||||
} else if (snapshot.hasError) {
|
||||
logger.severe('failed to load user details');
|
||||
return const EnteLoadingWidget();
|
||||
} else {
|
||||
return const EnteLoadingWidget();
|
||||
}
|
||||
},
|
||||
)
|
||||
)
|
||||
: const EnteLoadingWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -9,7 +9,6 @@ import 'package:photos/theme/ente_theme.dart';
|
|||
import 'package:photos/ui/common/loading_widget.dart';
|
||||
// ignore: import_of_legacy_library_into_null_safe
|
||||
import 'package:photos/ui/payment/subscription.dart';
|
||||
import 'package:photos/ui/settings/storage_error_widget.dart';
|
||||
import 'package:photos/ui/settings/storage_progress_widget.dart';
|
||||
import 'package:photos/utils/data_util.dart';
|
||||
|
||||
|
@ -51,6 +50,7 @@ class _StorageCardWidgetState extends State<StorageCardWidget> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final inheritedUserDetails = InheritedUserDetails.of(context);
|
||||
final userDetails = inheritedUserDetails?.userDetails;
|
||||
|
||||
if (inheritedUserDetails == null) {
|
||||
_logger.severe(
|
||||
|
@ -72,13 +72,13 @@ class _StorageCardWidgetState extends State<StorageCardWidget> {
|
|||
onTapDown: (details) => _isStorageCardPressed.value = true,
|
||||
onTapCancel: () => _isStorageCardPressed.value = false,
|
||||
onTapUp: (details) => _isStorageCardPressed.value = false,
|
||||
child: containerForUserDetails(inheritedUserDetails),
|
||||
child: containerForUserDetails(userDetails),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget containerForUserDetails(
|
||||
InheritedUserDetails inheritedUserDetails,
|
||||
UserDetails? userDetails,
|
||||
) {
|
||||
return ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 350),
|
||||
|
@ -87,22 +87,11 @@ class _StorageCardWidgetState extends State<StorageCardWidget> {
|
|||
child: Stack(
|
||||
children: [
|
||||
_background,
|
||||
FutureBuilder(
|
||||
future: inheritedUserDetails.userDetails,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return userDetails(snapshot.data as UserDetails);
|
||||
}
|
||||
if (snapshot.hasError) {
|
||||
_logger.severe(
|
||||
'failed to load user details',
|
||||
snapshot.error,
|
||||
);
|
||||
return const StorageErrorWidget();
|
||||
}
|
||||
return const EnteLoadingWidget(color: strokeBaseDark);
|
||||
},
|
||||
),
|
||||
userDetails is UserDetails
|
||||
? _userDetails(userDetails)
|
||||
: const EnteLoadingWidget(
|
||||
color: strokeBaseDark,
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Padding(
|
||||
|
@ -124,7 +113,7 @@ class _StorageCardWidgetState extends State<StorageCardWidget> {
|
|||
);
|
||||
}
|
||||
|
||||
Widget userDetails(UserDetails userDetails) {
|
||||
Widget _userDetails(UserDetails userDetails) {
|
||||
const hundredMBinBytes = 107374182;
|
||||
const oneTBinBytes = 1073741824000;
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ import 'dart:io';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/event_bus.dart';
|
||||
import 'package:photos/events/opened_settings_event.dart';
|
||||
import 'package:photos/services/feature_flag_service.dart';
|
||||
import 'package:photos/theme/colors.dart';
|
||||
import 'package:photos/theme/ente_theme.dart';
|
||||
|
@ -27,6 +29,7 @@ class SettingsPage extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Bus.instance.fire(OpenedSettingsEvent());
|
||||
final enteColorScheme = getEnteColorScheme(context);
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
|
|
Loading…
Add table
Reference in a new issue