Skip to content

Commit 55f04eb

Browse files
authored
feat(firebase_ui_auth): Use icon from OAuth provider as a fallback in ProfileScreen (#474)
1 parent 1a7104f commit 55f04eb

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

packages/firebase_ui_auth/lib/src/oauth/provider_resolvers.dart

+32-12
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
// ignore_for_file: constant_identifier_names
66

7+
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
8+
import 'package:firebase_ui_oauth/firebase_ui_oauth.dart';
79
import 'package:flutter/cupertino.dart';
810
import 'package:flutter/material.dart';
911

10-
import 'social_icons.dart';
11-
1212
const GOOGLE_PROVIDER_ID = 'google.com';
1313
const APPLE_PROVIDER_ID = 'apple.com';
1414
const TWITTER_PROVIDER_ID = 'twitter.com';
@@ -22,31 +22,51 @@ const PASSWORD_PROVIDER_ID = 'password';
2222
/// final icon = providerIcon(context, 'google.com');
2323
/// Icon(icon);
2424
/// ```
25-
IconData providerIcon(BuildContext context, String providerId) {
25+
Widget providerIcon(BuildContext context, AuthProvider provider) {
26+
final providerId = provider.providerId;
2627
final isCupertino = CupertinoUserInterfaceLevel.maybeOf(context) != null;
2728

29+
final IconData? data;
2830
switch (providerId) {
2931
case GOOGLE_PROVIDER_ID:
30-
return SocialIcons.google;
32+
data = SocialIcons.google;
33+
break;
3134
case APPLE_PROVIDER_ID:
32-
return SocialIcons.apple;
35+
data = SocialIcons.apple;
36+
break;
3337
case TWITTER_PROVIDER_ID:
34-
return SocialIcons.twitter;
38+
data = SocialIcons.twitter;
39+
break;
3540
case FACEBOOK_PROVIDER_ID:
36-
return SocialIcons.facebook;
41+
data = SocialIcons.facebook;
42+
break;
3743
case PHONE_PROVIDER_ID:
3844
if (isCupertino) {
39-
return CupertinoIcons.phone;
45+
data = CupertinoIcons.phone;
4046
} else {
41-
return Icons.phone;
47+
data = Icons.phone;
4248
}
49+
break;
4350
case PASSWORD_PROVIDER_ID:
4451
if (isCupertino) {
45-
return CupertinoIcons.mail;
52+
data = CupertinoIcons.mail;
4653
} else {
47-
return Icons.email_outlined;
54+
data = Icons.email_outlined;
4855
}
56+
break;
4957
default:
50-
throw Exception('Unknown provider: $providerId');
58+
data = null;
59+
}
60+
61+
if (data != null) {
62+
return Icon(data);
5163
}
64+
65+
if (provider is OAuthProvider) {
66+
final brightness =
67+
CupertinoTheme.of(context).brightness ?? Theme.of(context).brightness;
68+
return provider.style.iconWidget.getValue(brightness);
69+
}
70+
71+
throw Exception('Unknown provider: $providerId');
5272
}

packages/firebase_ui_auth/lib/src/screens/profile_screen.dart

+6-9
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,11 @@ class _AvailableProvidersRowState extends State<_AvailableProvidersRow> {
8989
context: context,
9090
provider: provider,
9191
).then((_) => widget.onProviderLinked()),
92-
child: Icon(
93-
providerIcon(context, provider.providerId),
94-
),
92+
child: providerIcon(context, provider),
9593
)
9694
else
9795
IconButton(
98-
icon: Icon(
99-
providerIcon(context, provider.providerId),
100-
),
96+
icon: providerIcon(context, provider),
10197
onPressed: () => connectProvider(
10298
context: context,
10399
provider: provider,
@@ -246,7 +242,8 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
246242
}
247243
}
248244

249-
Widget buildProviderIcon(BuildContext context, String providerId) {
245+
Widget buildProviderIcon(BuildContext context, AuthProvider provider) {
246+
final providerId = provider.providerId;
250247
final isCupertino = CupertinoUserInterfaceLevel.maybeOf(context) != null;
251248
const animationDuration = Duration(milliseconds: 150);
252249
const curve = Curves.easeOut;
@@ -267,7 +264,7 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
267264
size: size - (size / 4),
268265
borderWidth: 1,
269266
)
270-
: Icon(providerIcon(context, providerId)),
267+
: providerIcon(context, provider),
271268
),
272269
if (unlinkingProvider != providerId)
273270
AnimatedOpacity(
@@ -306,7 +303,7 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
306303
Widget child = Row(
307304
children: [
308305
for (var provider in widget.providers)
309-
buildProviderIcon(context, provider.providerId)
306+
buildProviderIcon(context, provider)
310307
]
311308
.map((e) => [e, const SizedBox(width: 8)])
312309
.expand((element) => element)

packages/firebase_ui_oauth/lib/src/oauth_provider_button_style.dart

+11
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:flutter/services.dart';
6+
import 'package:flutter/widgets.dart';
67

78
import 'package:firebase_ui_shared/firebase_ui_shared.dart';
9+
import 'package:flutter_svg/svg.dart';
810

911
/// {@template ui.oauth.themed_oauth_provider_button_style}
1012
/// An object that is being used to resolve a style of the button.
@@ -23,6 +25,15 @@ abstract class ThemedOAuthProviderButtonStyle {
2325
/// Required for custom OAuth providers.
2426
String? get label => null;
2527

28+
/// The widget to display for custom OAuth providers in pages such as the
29+
/// Profile Screen.
30+
ThemedValue<Widget> get iconWidget => ThemedValue(
31+
// Display the light icon on a dark background.
32+
SvgPicture.string(iconSrc.light),
33+
// Display the dark icon on a light background.
34+
SvgPicture.string(iconSrc.dark),
35+
);
36+
2637
/// {@macro ui.oauth.themed_oauth_provider_button_style}
2738
const ThemedOAuthProviderButtonStyle();
2839

0 commit comments

Comments
 (0)