Merge pull request #704 from ente-io/user-details-fixes-2

User details fixes 2
This commit is contained in:
Neeraj Gupta 2022-12-14 14:13:45 +05:30 committed by GitHub
commit 0f6bab53f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 30 additions and 94 deletions

View file

@ -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,

View file

@ -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;
}

View file

@ -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,
},

View file

@ -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);
}
}

View file

@ -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(

View file

@ -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;

View file

@ -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(),
],
),
),

View file

@ -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,21 +87,10 @@ 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,
@ -124,7 +113,7 @@ class _StorageCardWidgetState extends State<StorageCardWidget> {
);
}
Widget userDetails(UserDetails userDetails) {
Widget _userDetails(UserDetails userDetails) {
const hundredMBinBytes = 107374182;
const oneTBinBytes = 1073741824000;

View file

@ -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(