blob: 57f2bb5a751b30a4c9b2495a0438b00d260c5646 [file] [log] [blame]
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:app_flutter/canvaskit_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'service/google_authentication.dart';
/// Widget for displaying sign in information for the current user.
///
/// If logged in, it will display the user's avatar. Clicking it opens a dropdown for logging out.
/// Otherwise, a sign in button will show.
class SignInButton extends StatelessWidget {
const SignInButton({@required this.authService, Key key}) : super(key: key);
final GoogleSignInService authService;
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: authService.isAuthenticated,
builder: (_, AsyncSnapshot<bool> isAuthenticated) {
/// On sign out, there's a second where the user is null before isAuthenticated catches up.
if (isAuthenticated.data == true && authService.user != null) {
return PopupMenuButton<String>(
// TODO(chillers): Show a Network Image. https://github.com/flutter/flutter/issues/45955
// CanvasKit currently cannot render a NetworkImage because of CORS issues.
child: CanvasKitWidget(
canvaskit: Padding(
child: Text(authService.user.email),
padding: const EdgeInsets.only(right: 10.0, top: 20.0),
),
// TODO(chillers): Switch to use avatar widget provided by google_sign_in plugin
other: Image.network(authService.user?.photoUrl),
),
offset: const Offset(0, 50),
itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
const PopupMenuItem<String>(
value: 'logout',
child: Text('Log out'),
),
],
onSelected: (String value) {
if (value == 'logout') {
authService.signOut();
}
},
);
}
return FlatButton(
child: const Text(
'Sign in',
style: TextStyle(color: Colors.white),
),
onPressed: authService.signIn,
);
},
);
}
}