firebase_chat 0.0.6+1 copy "firebase_chat: ^0.0.6+1" to clipboard
firebase_chat: ^0.0.6+1 copied to clipboard

Fully functional package for Cloud Firestore that makes easier to implement chat in your application

example/lib/main.dart

import 'package:firebase_chat/firebase_chat.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/services.dart';

import 'dart:typed_data';
import 'package:draw_page/draw_page.dart';
import 'package:flutter/foundation.dart';
import 'package:camera_capture/camera_capture.dart';
// import 'dart:convert';
// import 'dart:html' as html;
// import 'package:file_picker_web/file_picker_web.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
  ]);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Firebase Chat Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Map<String, PeerUser> peers = {
    'myId': PeerUser(documentId: 'myId', name: 'Grievous'),
    'otherId': PeerUser(
        documentId: 'otherId',
        name: 'Kenobi',
        image:
            'https://cdn.vox-cdn.com/thumbor/SRwHbaTMxPr4f8EJdfai_UR2y34=/1400x1050/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/6434955/obi-wan.0.jpg'),
  };
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: ChatPage(
          ChatEntity(
            mainUser: peers['myId'],
            peers: peers,
            path: 'Chats/chatId',
            title: peers['otherId'].name, // ALSO: 'Group Name',
          ),
        ));
  }
}

class ChatPage extends BaseChat {
  ChatPage(
    ChatEntity entity,
  ) : super(entity);

  @override
  _ChatPageState createState() => _ChatPageState();
}

class _ChatPageState extends BaseChatState<ChatPage> {
  @override
  Color get primaryColor => Colors.blue;

  @override
  Color get secondaryColor => Colors.blue;

  @override
  Widget get loadingWidget => Center(
        child: Padding(
          padding: const EdgeInsets.all(30.0),
          child: CircularProgressIndicator(),
        ),
      );

  @override
  Widget get emptyWidget => Center(
          child: Padding(
        padding: const EdgeInsets.all(40.0),
        child: Text("Welcome"),
      ));

  @override
  Widget errorWidget(String error) => Center(child: Text(error));

  @override
  Future editAndUpload(Uint8List data) async {
    Uint8List edited = await Navigator.of(context).push<Uint8List>(MaterialPageRoute(builder: (BuildContext context) {
      return DrawPage(imageData: data, loadingWidget: loadingWidget);
    }));
    sendImage(edited);
  }

  // Future<Uint8List> _getHtmlFileContent(html.File blob) async {
  //   Uint8List file;
  //   final reader = html.FileReader();
  //   reader.readAsDataUrl(blob.slice(0, blob.size, blob.type));
  //   reader.onLoadEnd.listen((event) {
  //     Uint8List data =
  //         Base64Decoder().convert(reader.result.toString().split(",").last);
  //     file = data;
  //   }).onData((data) {
  //     file = Base64Decoder().convert(reader.result.toString().split(",").last);
  //     return file;
  //   });
  //   while (file == null) {
  //     await new Future.delayed(const Duration(milliseconds: 1));
  //     if (file != null) {
  //       break;
  //     }
  //   }
  //   return file;
  // }

  @override
  Future getImage() async {
    List<Uint8List> images;
    // Coming soon
    // if (kIsWeb) {
    //   var file = await FilePicker.getFile();

    //   if (file != null) {
    //     var g = await _getHtmlFileContent(file);
    //     images = [g];
    //   }
    // } else {
    images = await Navigator.of(context)
        .push<List<Uint8List>>(MaterialPageRoute(builder: (BuildContext context) => CameraPage()));
    if (images != null && images.length == 1) {
      Uint8List image = await Navigator.of(context).push<Uint8List>(MaterialPageRoute(builder: (BuildContext context) {
        return DrawPage(imageData: images[0], loadingWidget: loadingWidget);
      }));
      if (image == null) return null;
      images = [image];
      // }
    }

    if (images != null) {
      for (var image in images) {
        await sendImage(image);
      }
    }
  }

  @override
  Widget inputBuilder(BuildContext context, ChatInputState state) {
    return SafeArea(
      bottom: true,
      top: false,
      child: Container(
        color: Colors.white,
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.end,
          children: <Widget>[
            Expanded(
              child: Container(
                padding: EdgeInsets.all(10),
                child: TextField(
                  onSubmitted: (text) {
                    if (text.isNotEmpty) sendMessage();
                  },
                  autofocus: false,
                  maxLines: null,
                  keyboardType: TextInputType.text,
                  style: TextStyle(fontSize: 20.0),
                  controller: textEditingController,
                  onChanged: inputChanged,
                  decoration: InputDecoration.collapsed(
                    hintText: "Type here",
                    hintStyle: TextStyle(color: Colors.grey),
                  ),
                ),
              ),
            ),
            if (state is InputEmptyState && !kIsWeb) //doesnt support web yet
              Material(
                child: new Container(
                  child: new IconButton(
                    icon: new Icon(Icons.add_a_photo),
                    onPressed: () => getImage(),
                    color: primaryColor,
                    disabledColor: Colors.grey,
                  ),
                ),
                color: Colors.white,
              ),

            // Send message button
            Material(
              child: new Container(
                margin: new EdgeInsets.only(right: 4.0),
                child: new IconButton(
                  icon: new Icon(Icons.send),
                  onPressed: state is ReadyToSendState ? sendMessage : null,
                  color: primaryColor,
                  disabledColor: Colors.grey,
                ),
              ),
              color: Colors.white,
            ),
          ],
        ),
      ),
    );
  }
}
32
likes
70
points
20
downloads

Publisher

unverified uploader

Weekly Downloads

Fully functional package for Cloud Firestore that makes easier to implement chat in your application

Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

bloc, cached_network_image, cloud_firestore, equatable, firebase_storage_repository, firestore_repository, flutter, flutter_bloc, gallery_previewer, http, intl

More

Packages that depend on firebase_chat