Move user_avator_widget to sharing package

This commit is contained in:
AmanRajSinghMourya
2025-09-05 23:46:59 +05:30
parent 9a13b99b20
commit df522658bb
4 changed files with 545 additions and 3 deletions

View File

@@ -0,0 +1,223 @@
import "package:ente_configuration/base_configuration.dart";
import "package:ente_sharing/models/user.dart";
import "package:ente_ui/theme/colors.dart";
import "package:ente_ui/theme/ente_theme.dart";
import "package:ente_utils/extensions/user_extension.dart";
import 'package:flutter/material.dart';
import 'package:tuple/tuple.dart';
enum AvatarType { small, mini, tiny, extra }
class UserAvatarWidget extends StatefulWidget {
final User user;
final AvatarType type;
final int currentUserID;
final bool thumbnailView;
final BaseConfiguration config;
const UserAvatarWidget(
this.user, {
super.key,
this.currentUserID = -1,
this.type = AvatarType.mini,
this.thumbnailView = false,
required this.config,
});
@override
State<UserAvatarWidget> createState() => _UserAvatarWidgetState();
static const strokeWidth = 1.0;
}
class _UserAvatarWidgetState extends State<UserAvatarWidget> {
@override
Widget build(BuildContext context) {
final double size = getAvatarSize(widget.type);
return Container(
padding: const EdgeInsets.all(0.5),
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: widget.thumbnailView
? strokeMutedDark
: getEnteColorScheme(context).strokeMuted,
width: UserAvatarWidget.strokeWidth,
strokeAlign: BorderSide.strokeAlignOutside,
),
),
child: SizedBox(
height: size,
width: size,
child: _FirstLetterCircularAvatar(
user: widget.user,
currentUserID: widget.currentUserID,
thumbnailView: widget.thumbnailView,
type: widget.type,
config: widget.config,
),
),
);
}
}
class _FirstLetterCircularAvatar extends StatefulWidget {
final User user;
final int currentUserID;
final bool thumbnailView;
final AvatarType type;
final BaseConfiguration config;
const _FirstLetterCircularAvatar({
required this.user,
required this.currentUserID,
required this.thumbnailView,
required this.type,
required this.config,
});
@override
State<_FirstLetterCircularAvatar> createState() =>
_FirstLetterCircularAvatarState();
}
class _FirstLetterCircularAvatarState
extends State<_FirstLetterCircularAvatar> {
@override
Widget build(BuildContext context) {
final colorScheme = getEnteColorScheme(context);
final displayChar =
(widget.user.displayName == null || widget.user.displayName!.isEmpty)
? ((widget.user.email.isEmpty)
? " "
: widget.user.email.substring(0, 1))
: widget.user.displayName!.substring(0, 1);
Color decorationColor;
if ((widget.user.id != null && widget.user.id! < 0) ||
widget.user.email == widget.config.getEmail()) {
decorationColor = Colors.black;
} else {
decorationColor = colorScheme.avatarColors[(widget.user.email.length)
.remainder(colorScheme.avatarColors.length)];
}
final avatarStyle = getAvatarStyle(context, widget.type);
final double size = avatarStyle.item1;
final TextStyle textStyle = avatarStyle.item2;
return Container(
padding: const EdgeInsets.all(0.5),
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: widget.thumbnailView
? strokeMutedDark
: getEnteColorScheme(context).strokeMuted,
width: UserAvatarWidget.strokeWidth,
strokeAlign: BorderSide.strokeAlignOutside,
),
),
child: SizedBox(
height: size,
width: size,
child: CircleAvatar(
backgroundColor: decorationColor,
child: Text(
displayChar.toUpperCase(),
// fixed color
style: textStyle.copyWith(color: Colors.white),
),
),
),
);
}
Tuple2<double, TextStyle> getAvatarStyle(
BuildContext context,
AvatarType type,
) {
final enteTextTheme = getEnteTextTheme(context);
switch (type) {
case AvatarType.small:
return Tuple2(32.0, enteTextTheme.small);
case AvatarType.mini:
return Tuple2(24.0, enteTextTheme.mini);
case AvatarType.tiny:
return Tuple2(18.0, enteTextTheme.tiny);
case AvatarType.extra:
return Tuple2(18.0, enteTextTheme.tiny);
}
}
}
double getAvatarSize(
AvatarType type,
) {
switch (type) {
case AvatarType.small:
return 32.0;
case AvatarType.mini:
return 24.0;
case AvatarType.tiny:
return 18.0;
case AvatarType.extra:
return 18.0;
}
}
class FirstLetterUserAvatar extends StatefulWidget {
final User user;
final BaseConfiguration config;
const FirstLetterUserAvatar(
this.user, {
super.key,
required this.config,
});
@override
State<FirstLetterUserAvatar> createState() => _FirstLetterUserAvatarState();
}
class _FirstLetterUserAvatarState extends State<FirstLetterUserAvatar> {
late String? currentUserEmail;
late User user;
@override
void initState() {
super.initState();
user = widget.user;
currentUserEmail = widget.config.getEmail();
}
@override
void didUpdateWidget(covariant FirstLetterUserAvatar oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.user != widget.user) {
setState(() {
user = widget.user;
});
}
}
@override
Widget build(BuildContext context) {
final colorScheme = getEnteColorScheme(context);
final displayChar = (user.displayName == null || user.displayName!.isEmpty)
? ((user.email.isEmpty) ? " " : user.email.substring(0, 1))
: user.displayName!.substring(0, 1);
Color decorationColor;
if ((widget.user.id != null && widget.user.id! < 0) ||
user.email == currentUserEmail) {
decorationColor = Colors.black;
} else {
decorationColor = colorScheme.avatarColors[
(user.email.length).remainder(colorScheme.avatarColors.length)];
}
return Container(
color: decorationColor,
child: Center(
child: Text(
displayChar.toUpperCase(),
style: getEnteTextTheme(context).small.copyWith(color: Colors.white),
),
),
);
}
}

View File

@@ -1,6 +1,14 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
url: "https://pub.dev"
source: hosted
version: "4.0.7"
args:
dependency: transitive
description:
@@ -73,6 +81,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.0"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
crypto:
dependency: transitive
description:
@@ -129,6 +145,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.1"
email_validator:
dependency: transitive
description:
name: email_validator
sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb
url: "https://pub.dev"
source: hosted
version: "3.0.0"
ente_base:
dependency: "direct overridden"
description:
@@ -137,7 +161,7 @@ packages:
source: path
version: "1.0.0"
ente_configuration:
dependency: "direct overridden"
dependency: "direct main"
description:
path: "../configuration"
relative: true
@@ -173,6 +197,27 @@ packages:
relative: true
source: path
version: "1.0.0"
ente_strings:
dependency: "direct overridden"
description:
path: "../strings"
relative: true
source: path
version: "1.0.0"
ente_ui:
dependency: "direct main"
description:
path: "../ui"
relative: true
source: path
version: "1.0.0"
ente_utils:
dependency: "direct main"
description:
path: "../utils"
relative: true
source: path
version: "1.0.0"
event_bus:
dependency: transitive
description:
@@ -181,6 +226,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.1"
expandable:
dependency: transitive
description:
name: expandable
sha256: "9604d612d4d1146dafa96c6d8eec9c2ff0994658d6d09fed720ab788c7f5afc2"
url: "https://pub.dev"
source: hosted
version: "5.0.1"
fake_async:
dependency: transitive
description:
@@ -213,6 +266,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.0.1"
file_saver:
dependency: transitive
description:
name: file_saver
sha256: "9d93db09bd4da9e43238f9dd485360fc51a5c138eea5ef5f407ec56e58079ac0"
url: "https://pub.dev"
source: hosted
version: "0.3.1"
fixnum:
dependency: transitive
description:
@@ -226,6 +287,86 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_animate:
dependency: transitive
description:
name: flutter_animate
sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5"
url: "https://pub.dev"
source: hosted
version: "4.5.2"
flutter_email_sender:
dependency: transitive
description:
name: flutter_email_sender
sha256: d39eb5e91358fc19ec4050da69accec21f9d5b2b6bcf188aa246327b6ca2352c
url: "https://pub.dev"
source: hosted
version: "7.0.0"
flutter_inappwebview:
dependency: transitive
description:
name: flutter_inappwebview
sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5"
url: "https://pub.dev"
source: hosted
version: "6.1.5"
flutter_inappwebview_android:
dependency: transitive
description:
name: flutter_inappwebview_android
sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
flutter_inappwebview_internal_annotations:
dependency: transitive
description:
name: flutter_inappwebview_internal_annotations
sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
flutter_inappwebview_ios:
dependency: transitive
description:
name: flutter_inappwebview_ios
sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_macos:
dependency: transitive
description:
name: flutter_inappwebview_macos
sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_platform_interface:
dependency: transitive
description:
name: flutter_inappwebview_platform_interface
sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500
url: "https://pub.dev"
source: hosted
version: "1.3.0+1"
flutter_inappwebview_web:
dependency: transitive
description:
name: flutter_inappwebview_web
sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_inappwebview_windows:
dependency: transitive
description:
name: flutter_inappwebview_windows
sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
flutter_lints:
dependency: "direct dev"
description:
@@ -234,6 +375,11 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_localizations:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_secure_storage:
dependency: transitive
description:
@@ -282,6 +428,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.2"
flutter_shaders:
dependency: transitive
description:
name: flutter_shaders
sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2"
url: "https://pub.dev"
source: hosted
version: "0.1.3"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -292,6 +446,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
fluttertoast:
dependency: transitive
description:
name: fluttertoast
sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
url: "https://pub.dev"
source: hosted
version: "8.2.12"
freezed_annotation:
dependency: transitive
description:
@@ -444,6 +606,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
modal_bottom_sheet:
dependency: transitive
description:
name: modal_bottom_sheet
sha256: eac66ef8cb0461bf069a38c5eb0fa728cee525a531a8304bd3f7b2185407c67e
url: "https://pub.dev"
source: hosted
version: "3.0.0"
native_dio_adapter:
dependency: transitive
description:
@@ -564,6 +734,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.9.1"
posix:
dependency: transitive
description:
name: posix
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
url: "https://pub.dev"
source: hosted
version: "6.0.3"
pub_semver:
dependency: transitive
description:
@@ -572,6 +750,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
screen_retriever:
dependency: transitive
description:
name: screen_retriever
sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
screen_retriever_linux:
dependency: transitive
description:
name: screen_retriever_linux
sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18
url: "https://pub.dev"
source: hosted
version: "0.2.0"
screen_retriever_macos:
dependency: transitive
description:
name: screen_retriever_macos
sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
screen_retriever_platform_interface:
dependency: transitive
description:
name: screen_retriever_platform_interface
sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0
url: "https://pub.dev"
source: hosted
version: "0.2.0"
screen_retriever_windows:
dependency: transitive
description:
name: screen_retriever_windows
sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
sentry:
dependency: transitive
description:
@@ -588,6 +806,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "8.14.2"
share_plus:
dependency: transitive
description:
name: share_plus
sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1
url: "https://pub.dev"
source: hosted
version: "11.1.0"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a"
url: "https://pub.dev"
source: hosted
version: "6.1.0"
shared_preferences:
dependency: transitive
description:
@@ -730,7 +964,7 @@ packages:
source: hosted
version: "0.7.4"
tuple:
dependency: transitive
dependency: "direct main"
description:
name: tuple
sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
@@ -753,6 +987,70 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.1"
url_launcher:
dependency: transitive
description:
name: url_launcher
sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
url: "https://pub.dev"
source: hosted
version: "6.3.2"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7"
url: "https://pub.dev"
source: hosted
version: "6.3.18"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7
url: "https://pub.dev"
source: hosted
version: "6.3.4"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f
url: "https://pub.dev"
source: hosted
version: "3.2.3"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
uuid:
dependency: transitive
description:
@@ -809,6 +1107,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.5"
window_manager:
dependency: transitive
description:
name: window_manager
sha256: "7eb6d6c4164ec08e1bf978d6e733f3cebe792e2a23fb07cbca25c2872bfdbdcd"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
xdg_directories:
dependency: transitive
description:

View File

@@ -10,15 +10,22 @@ environment:
dependencies:
collection: ^1.17.0
dio: ^5.0.0
ente_configuration:
path: ../configuration
ente_crypto_dart:
git:
url: https://github.com/ente-io/ente_crypto_dart.git
ente_network:
path: ../network
ente_ui:
path: ../ui
ente_utils:
path: ../utils
fast_base58: ^0.2.1
flutter:
sdk: flutter
logging: ^1.0.0
tuple: ^2.0.2
dev_dependencies:
flutter_lints: ^2.0.0

View File

@@ -1,4 +1,4 @@
# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network
# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils
dependency_overrides:
ente_base:
path: ../base
@@ -10,3 +10,9 @@ dependency_overrides:
path: ../logging
ente_network:
path: ../network
ente_strings:
path: ../strings
ente_ui:
path: ../ui
ente_utils:
path: ../utils