diff --git a/.gitignore b/.gitignore index 07488ba61a..d67e947eea 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,5 @@ !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +ios/Flutter/flutter_export_environment.sh +.flutter-plugins-dependencies diff --git a/android/app/build.gradle b/android/app/build.gradle index e8d2b49ddc..d4763cfe2a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -24,6 +24,7 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +apply plugin: 'com.google.gms.google-services' android { compileSdkVersion 29 @@ -33,8 +34,7 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "co.appbrewery.flash_chat" + applicationId "co.Amin.flash_chat" minSdkVersion 16 targetSdkVersion 29 versionCode flutterVersionCode.toInteger() @@ -57,4 +57,5 @@ flutter { dependencies { implementation 'androidx.multidex:multidex:2.0.0' + implementation platform('com.google.firebase:firebase-bom:28.3.0') } diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000000..4e1c821362 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "634133896248", + "project_id": "flash-chat-b53b8", + "storage_bucket": "flash-chat-b53b8.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:634133896248:android:b16dec15d1983a1bb69acd", + "android_client_info": { + "package_name": "co.Amin.flash_chat" + } + }, + "oauth_client": [ + { + "client_id": "634133896248-3ovprilllms8msddc4mcsr01tdd3q1vh.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAxyBWIgj76cpgVOKnqmw4ugHNUVbJNxMk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "634133896248-3ovprilllms8msddc4mcsr01tdd3q1vh.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 6de372893d..f82140cd49 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,6 +6,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.google.gms:google-services:4.3.8' } } diff --git a/lib/components/ButtonWidget.dart b/lib/components/ButtonWidget.dart new file mode 100644 index 0000000000..77915913fa --- /dev/null +++ b/lib/components/ButtonWidget.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class ButtonWidget extends StatelessWidget { + + final Color color; + final String name; + final Function fun; + + ButtonWidget({this.color,this.fun,this.name}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 16.0), + child: Material( + elevation: 5.0, + color: this.color, + borderRadius: BorderRadius.circular(30.0), + child: MaterialButton( + onPressed: fun, + minWidth: 200.0, + height: 42.0, + child: Text( + name, + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/components/message_bubble.dart b/lib/components/message_bubble.dart new file mode 100644 index 0000000000..6b136026e9 --- /dev/null +++ b/lib/components/message_bubble.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +class MessageBubble extends StatelessWidget { + MessageBubble({this.sender, this.text, this.isMe}); + + final String text; + final String sender; + final bool isMe; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, + children: [ + Text( + sender, + style: TextStyle(fontSize: 12.0), + ), + Material( + borderRadius: isMe + ? BorderRadius.only( + topLeft: Radius.circular(30.0), + bottomRight: Radius.circular(30.0), + bottomLeft: Radius.circular(30.0), + ) + : BorderRadius.only( + topRight: Radius.circular(30.0), + bottomRight: Radius.circular(30.0), + bottomLeft: Radius.circular(30.0), + ), + elevation: 5.0, + color: isMe ? Colors.white : Colors.lightBlue, + child: Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 20.0, + ), + child: Text( + text, + style: TextStyle( + color: isMe ? Colors.black54 : Colors.white, + fontSize: 20.0, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/components/message_stream.dart b/lib/components/message_stream.dart new file mode 100644 index 0000000000..61512ff527 --- /dev/null +++ b/lib/components/message_stream.dart @@ -0,0 +1,38 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flash_chat/components/message_bubble.dart'; +import 'package:flutter/material.dart'; + +class MessageStream extends StatelessWidget { + MessageStream(this._fireStore, this.currentUser); + + final CollectionReference> _fireStore; + final currentUser; + + @override + Widget build(BuildContext context) { + return Expanded( + child: StreamBuilder( + //.orderBy("time", descending: true) + stream: _fireStore.orderBy('time',descending: true).snapshots(), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return Text('something went wrong !'); + } + var messages = snapshot.requireData; + return ListView.builder( + reverse: true, + padding: EdgeInsets.all(10.0), + itemCount: messages.size, + itemBuilder: (context, index) { + return MessageBubble( + sender: messages.docs[index]['sender'], + text: messages.docs[index]['text'], + isMe: currentUser == messages.docs[index]['sender'], + ); + }, + ); + }, + ), + ); + } +} diff --git a/lib/constants.dart b/lib/constants.dart index 25e5f5c22f..44d153177a 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +const String logoTag = 'logo'; + const kSendButtonTextStyle = TextStyle( color: Colors.lightBlueAccent, fontWeight: FontWeight.bold, @@ -9,6 +11,9 @@ const kSendButtonTextStyle = TextStyle( const kMessageTextFieldDecoration = InputDecoration( contentPadding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), hintText: 'Type your message here...', + hintStyle: TextStyle( + color: Colors.black, + ), border: InputBorder.none, ); @@ -17,3 +22,22 @@ const kMessageContainerDecoration = BoxDecoration( top: BorderSide(color: Colors.lightBlueAccent, width: 2.0), ), ); + +const kInputTextDecoration = InputDecoration( + hintText: 'Text', + hintStyle: TextStyle( + color: Colors.black, + ), + contentPadding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.lightBlueAccent, width: 1.0), + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.lightBlueAccent, width: 2.0), + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), +); diff --git a/lib/main.dart b/lib/main.dart index 6ea23d095c..8efbcc594a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,15 @@ +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flash_chat/screens/welcome_screen.dart'; import 'package:flash_chat/screens/login_screen.dart'; import 'package:flash_chat/screens/registration_screen.dart'; import 'package:flash_chat/screens/chat_screen.dart'; -void main() => runApp(FlashChat()); +void main() async{ + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp(); + return runApp(FlashChat()); +} class FlashChat extends StatelessWidget { @override @@ -12,10 +17,16 @@ class FlashChat extends StatelessWidget { return MaterialApp( theme: ThemeData.dark().copyWith( textTheme: TextTheme( - body1: TextStyle(color: Colors.black54), + bodyText2: TextStyle(color: Colors.black54), ), ), - home: WelcomeScreen(), + initialRoute: WelcomeScreen.welcomId, + routes: { + WelcomeScreen.welcomId: (context) => WelcomeScreen(), + LoginScreen.loginId: (context) => LoginScreen(), + ChatScreen.chatId: (context) => ChatScreen(), + RegistrationScreen.regId: (context) => RegistrationScreen(), + }, ); } } diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index 42d8b67b9b..a9723cd1f9 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -1,22 +1,50 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flash_chat/components/message_stream.dart'; import 'package:flutter/material.dart'; import 'package:flash_chat/constants.dart'; class ChatScreen extends StatefulWidget { + static const String chatId = 'chat'; + @override _ChatScreenState createState() => _ChatScreenState(); } class _ChatScreenState extends State { + final _auth = FirebaseAuth.instance; + User loggedInUser; + String messageText; + final messageController = TextEditingController(); + final _fireStore = FirebaseFirestore.instance.collection('message'); + + void getCurrentUser() { + try { + final user = _auth.currentUser; + if (user != null) loggedInUser = user; + } catch (e) { + print(e); + } + } + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Colors.white, appBar: AppBar( leading: null, actions: [ IconButton( icon: Icon(Icons.close), onPressed: () { - //Implement logout functionality + _auth.signOut(); + Navigator.pop(context); }), ], title: Text('⚡️Chat'), @@ -27,6 +55,10 @@ class _ChatScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + MessageStream( + _fireStore, + loggedInUser.email, + ), Container( decoration: kMessageContainerDecoration, child: Row( @@ -34,15 +66,22 @@ class _ChatScreenState extends State { children: [ Expanded( child: TextField( + style: TextStyle(color: Colors.black), onChanged: (value) { - //Do something with the user input. + messageText = value; }, + controller: messageController, decoration: kMessageTextFieldDecoration, ), ), - FlatButton( + TextButton( onPressed: () { - //Implement send functionality. + messageController.clear(); + _fireStore.add({ + 'sender': loggedInUser.email, + 'text': messageText, + 'time': DateTime.now(), + }); }, child: Text( 'Send', diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index 852e116a19..3085e13f36 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -1,11 +1,21 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flash_chat/components/ButtonWidget.dart'; +import 'package:flash_chat/constants.dart'; +import 'package:flash_chat/screens/chat_screen.dart'; import 'package:flutter/material.dart'; class LoginScreen extends StatefulWidget { + static const String loginId = 'login'; + @override _LoginScreenState createState() => _LoginScreenState(); } class _LoginScreenState extends State { + final _auth = FirebaseAuth.instance; + String mail; + String pass; + @override Widget build(BuildContext context) { return Scaffold( @@ -16,82 +26,62 @@ class _LoginScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Container( - height: 200.0, - child: Image.asset('images/logo.png'), + Hero( + tag: logoTag, + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), ), SizedBox( height: 48.0, ), TextField( + style: TextStyle( + color: Colors.black, + ), + textAlign: TextAlign.center, onChanged: (value) { - //Do something with the user input. + mail=value; }, - decoration: InputDecoration( - hintText: 'Enter your email', - contentPadding: - EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), - border: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - enabledBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.lightBlueAccent, width: 1.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - focusedBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.lightBlueAccent, width: 2.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), + decoration: kInputTextDecoration.copyWith( + hintText: 'Enter your Email.', ), ), SizedBox( height: 8.0, ), TextField( + style: TextStyle( + color: Colors.black, + ), + obscureText: true, + textAlign: TextAlign.center, onChanged: (value) { - //Do something with the user input. + pass=value; }, - decoration: InputDecoration( + decoration: kInputTextDecoration.copyWith( hintText: 'Enter your password.', - contentPadding: - EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), - border: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - enabledBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.lightBlueAccent, width: 1.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - focusedBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.lightBlueAccent, width: 2.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), ), ), SizedBox( height: 24.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 16.0), - child: Material( - color: Colors.lightBlueAccent, - borderRadius: BorderRadius.all(Radius.circular(30.0)), - elevation: 5.0, - child: MaterialButton( - onPressed: () { - //Implement login functionality. - }, - minWidth: 200.0, - height: 42.0, - child: Text( - 'Log In', - ), - ), - ), + ButtonWidget( + color: Colors.lightBlueAccent, + fun: () async{ + try { + final user = await _auth.signInWithEmailAndPassword( + email: mail, + password: pass, + ); + if (user != null) + Navigator.pushNamed(context, ChatScreen.chatId); + } catch (e) { + print(e); + } + }, + name: 'Log In', ), ], ), diff --git a/lib/screens/registration_screen.dart b/lib/screens/registration_screen.dart index bbc0d5195e..cc1ced682c 100644 --- a/lib/screens/registration_screen.dart +++ b/lib/screens/registration_screen.dart @@ -1,11 +1,20 @@ +import 'package:flash_chat/components/ButtonWidget.dart'; +import 'package:flash_chat/constants.dart'; +import 'package:flash_chat/screens/chat_screen.dart'; import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; class RegistrationScreen extends StatefulWidget { + static const String regId = 'register'; @override _RegistrationScreenState createState() => _RegistrationScreenState(); } class _RegistrationScreenState extends State { + String mail; + String pass; + final _auth = FirebaseAuth.instance; + @override Widget build(BuildContext context) { return Scaffold( @@ -16,79 +25,64 @@ class _RegistrationScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Container( - height: 200.0, - child: Image.asset('images/logo.png'), + Hero( + tag: logoTag, + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), ), SizedBox( height: 48.0, ), TextField( + style: TextStyle( + color: Colors.black, + ), + textAlign: TextAlign.center, + keyboardType: TextInputType.emailAddress, onChanged: (value) { - //Do something with the user input. + mail = value; }, - decoration: InputDecoration( - hintText: 'Enter your email', - contentPadding: - EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), - border: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.blueAccent, width: 1.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.blueAccent, width: 2.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), + decoration: kInputTextDecoration.copyWith( + hintText: 'Enter your Email.', ), ), SizedBox( height: 8.0, ), TextField( + style: TextStyle( + color: Colors.black, + ), + textAlign: TextAlign.center, + obscureText: true, onChanged: (value) { - //Do something with the user input. + pass = value; }, - decoration: InputDecoration( - hintText: 'Enter your password', - contentPadding: - EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), - border: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.blueAccent, width: 1.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.blueAccent, width: 2.0), - borderRadius: BorderRadius.all(Radius.circular(32.0)), - ), + decoration: kInputTextDecoration.copyWith( + hintText: 'Enter your password.', ), ), SizedBox( height: 24.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 16.0), - child: Material( - color: Colors.blueAccent, - borderRadius: BorderRadius.all(Radius.circular(30.0)), - elevation: 5.0, - child: MaterialButton( - onPressed: () { - //Implement registration functionality. - }, - minWidth: 200.0, - height: 42.0, - child: Text( - 'Register', - style: TextStyle(color: Colors.white), - ), - ), - ), + ButtonWidget( + name: 'Register', + color: Colors.blueAccent, + fun: () async { + try { + final newUser = await _auth.createUserWithEmailAndPassword( + email: mail, + password: pass, + ); + if (newUser != null) { + Navigator.pushNamed(context, ChatScreen.chatId); + } + } catch (e) { + print(e); + } + }, ), ], ), diff --git a/lib/screens/welcome_screen.dart b/lib/screens/welcome_screen.dart index 6270ccf476..c2b4d5113d 100644 --- a/lib/screens/welcome_screen.dart +++ b/lib/screens/welcome_screen.dart @@ -1,15 +1,59 @@ +import 'package:flash_chat/constants.dart'; +import 'package:flash_chat/screens/login_screen.dart'; +import 'package:flash_chat/screens/registration_screen.dart'; import 'package:flutter/material.dart'; +import 'package:flash_chat/components/ButtonWidget.dart'; +import 'package:animated_text_kit/animated_text_kit.dart'; class WelcomeScreen extends StatefulWidget { + static const String welcomId = 'welcom'; @override _WelcomeScreenState createState() => _WelcomeScreenState(); } -class _WelcomeScreenState extends State { +class _WelcomeScreenState extends State + with SingleTickerProviderStateMixin { + AnimationController controller; + Animation animation; + + @override + void initState() { + super.initState(); + controller = AnimationController( + duration: Duration(seconds: 2), + vsync: this, + // upperBound: 60.0, + ); + + //this is curved animation + // animation = CurvedAnimation(parent: controller, curve: Curves.bounceIn); + + // animation.addStatusListener((status) { + // if (animation.isCompleted) + // controller.reverse(from: 1.0); + // else if (animation.isDismissed) controller.forward(); + // }); + + animation = ColorTween(begin: Colors.blueGrey, end: Colors.white) + .animate(controller); + + controller.forward(); + + controller.addListener(() { + setState(() {}); + }); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.white, + backgroundColor: animation.value, body: Padding( padding: EdgeInsets.symmetric(horizontal: 24.0), child: Column( @@ -18,15 +62,24 @@ class _WelcomeScreenState extends State { children: [ Row( children: [ - Container( - child: Image.asset('images/logo.png'), - height: 60.0, + Flexible( + child: Hero( + tag: logoTag, + child: Container( + child: Image.asset('images/logo.png'), + height: 60.0, + ), + ), ), - Text( - 'Flash Chat', - style: TextStyle( - fontSize: 45.0, - fontWeight: FontWeight.w900, + DefaultTextStyle( + style:TextStyle( + fontSize: 45.0, + fontWeight: FontWeight.w900, + color:Colors.blue[700], + ) , + child: AnimatedTextKit( + animatedTexts: [WavyAnimatedText('Flash Chat')], + displayFullTextOnTap:true, ), ), ], @@ -34,41 +87,21 @@ class _WelcomeScreenState extends State { SizedBox( height: 48.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 16.0), - child: Material( - elevation: 5.0, - color: Colors.lightBlueAccent, - borderRadius: BorderRadius.circular(30.0), - child: MaterialButton( - onPressed: () { - //Go to login screen. - }, - minWidth: 200.0, - height: 42.0, - child: Text( - 'Log In', - ), - ), - ), + ButtonWidget( + name: 'Log In', + color: Colors.lightBlueAccent, + fun: () { + //Go to login screen. + Navigator.pushNamed(context, LoginScreen.loginId); + }, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 16.0), - child: Material( - color: Colors.blueAccent, - borderRadius: BorderRadius.circular(30.0), - elevation: 5.0, - child: MaterialButton( - onPressed: () { - //Go to registration screen. - }, - minWidth: 200.0, - height: 42.0, - child: Text( - 'Register', - ), - ), - ), + ButtonWidget( + color: Colors.blueAccent, + fun: () { + //Go to registration screen. + Navigator.pushNamed(context, RegistrationScreen.regId); + }, + name: 'Register', ), ], ), diff --git a/pubspec.lock b/pubspec.lock index a48c6ef150..4386108b5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,62 +1,76 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.11" - args: - dependency: transitive + animated_text_kit: + dependency: "direct main" description: - name: args + name: animated_text_kit url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "4.2.1" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.6.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" - collection: + version: "1.2.0" + clock: dependency: transitive description: - name: collection + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" - convert: + version: "2.4.0" + cloud_firestore_platform_interface: dependency: transitive description: - name: convert + name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" - crypto: + version: "5.3.0" + cloud_firestore_web: dependency: transitive description: - name: crypto + name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.3.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" cupertino_icons: dependency: "direct main" description: @@ -64,6 +78,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -74,55 +137,60 @@ packages: description: flutter source: sdk version: "0.0.0" - image: + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http_parser: dependency: transitive description: - name: image + name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" - matcher: + version: "4.0.0" + intl: dependency: transitive description: - name: matcher + name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.12.6" - meta: + version: "0.17.0" + js: dependency: transitive description: - name: meta + name: js url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" - path: + version: "0.6.3" + matcher: dependency: transitive description: - name: path + name: matcher url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" - pedantic: + version: "0.12.10" + meta: dependency: transitive description: - name: pedantic + name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.8.0+1" - petitparser: + version: "1.3.0" + path: dependency: transitive description: - name: petitparser + name: path url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" - quiver: + version: "1.8.0" + plugin_platform_interface: dependency: transitive description: - name: quiver + name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.1" sky_engine: dependency: transitive description: flutter @@ -134,62 +202,56 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.3.0" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "3.5.0" + version: "2.1.0" sdks: - dart: ">=2.4.0 <3.0.0" + dart: ">=2.12.0 <3.0.0" + flutter: ">=1.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index e6d5ae3d17..ae20d36a48 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,6 +11,10 @@ dependencies: sdk: flutter cupertino_icons: ^0.1.2 + animated_text_kit: ^4.2.1 + firebase_core: ^1.4.0 + firebase_auth: ^3.0.1 + cloud_firestore: ^2.4.0 dev_dependencies: flutter_test: