locality_social_cloud_chat 1.2.0 copy "locality_social_cloud_chat: ^1.2.0" to clipboard
locality_social_cloud_chat: ^1.2.0 copied to clipboard

A chat based on Locality Social Cloud that supported End-to-End encrypted Chats and GroupChats and Chat Message state management.

Locality Social Cloud Chat #

locality_social_cloud_chat is a Flutter library that provides a real-time messaging system for managing direct messages and group chats. It supports message delivery, reactions, notifications, and invitations, integrating with the locality_social_cloud API.

Features #

  • End-to-End-Encryption: Uses ECDH with elliptic Curve M-511 and ChaCha20 for encryption.
  • Message Reactions: Users can react to messages with predefined or custom reactions.
  • Event-driven Architecture: Respond to specific message types (e.g., text, media) using a PubSub model.
  • Group Chats: Invite users to group chats and manage acceptances.
  • Efficient UI Updates: Implemented using ThrottledChangeNotifier for optimized state updates.
  • Message Observers: Track message states like seen, delivered, and reactions in real-time.

Getting Started #

This project is written with Locality Social Cloud. To use it, you must have a Social Cloud Developer Account and obtain a secret for your app.

Write

flutter pub add locality_social_cloud
flutter pub add locality_social_cloud_chat
flutter pub get

to import the package. At some point, register your app secret and log your user in to the Locality Social Cloud.

Configure Locality Social Cloud #

Obtain your app-ID and app secret from your and write

LocalitySocialCloud.configure(app_id: 'YOUR APP ID', app_secret: 'YOUR APP SECRET');

Then, run flutter pub get to install the package.

Import the Library #

import 'package:locality_social_cloud_chat/locality_social_cloud_chat.dart';

Example Usage #

1. Initialize Direct Messages Chat #

Create an instance of DirectMessagesChat for one-on-one messaging.

DirectMessagesChat chat = await DirectMessagesFacade.getTargetUserChat(
      loggedInUser,
      targetUser
  );

You can listen to which groupchats are available like

GroupChats.getInstance().addListener(() {
    List<GroupChat> groupChats = GroupChats.getInstance().groupChats;
    for (GroupChat groupChat in groupChats) {
      debugPrint("We are connected to the groupchat ... ${groupChat.title}");
    }
  });

To obtain groupchats, you need an existing DirectMessagesChat. With a DirectMessagesChat you can create groupchats and invite other users to join groupchats with the methods

void inviteToGroupChat(String groupChatTitle, String groupChatId, String topic, BigInt key)
void acceptGroupChatInvitation(String messageUuid, String groupChatId)

2. Sending a Message #

Send a new message to the chat by providing the message payload.

chat.sendMessage({
  'content': 'Hello, this is a message!',
});

You can listen to state updates like this:

chat.addListener(() {
    ...
});

This is throttled, it means it will at max 120 times per second be called and only if new state is available. You can use it like a Provider to easily integrate with your UI. If you want certain events to only happen after synchronization you can use the Timeline from locality_social_cloud like

chat.timeline.whenSynchronized(() {
    for (var chatMessage in chat.chatMessages) {
      String messageUuid = chatMessage.payload['message_uuid'];
      ....
    }
  });

3. Adding a Reaction to a Message #

React to a specific message using its unique message ID.

chat.reactToMessage('message_uuid_123', 'like');

4. Tracking Message States #

You can monitor whether a message has been delivered or seen by subscribing to its MessageObserver.

MessageObserver chatMessageObserver = chat.messageObserversByChatMessageUUID[messageUuid]!;
if (!messageObserver.seen) {
    print('Message not seen yet');
}
messageObserver.addListener((){
    // Will be called when the state changes
    if (messageObserver.seen) {
        print('Message seen');
    }
});

Use this inside of

chat.timeline.whenSynchronized(() {
    ...
});

If you have special message types that should trigger other things like photo_messages triggering a photo download, you could use

chat.whenMessageOfTypeReceived('photo_message', (messageObserver) {
    
});

5. Handling Group Chat Invitations #

Invite a user to a group chat or accept an invitation:

chat.inviteToGroupChat('Cool Group', 'group_uuid_456', 'group_topic', BigInt.from(123456));
chat.acceptGroupChatInvitation('message_uuid_789', 'group_uuid_456');

Use also an invitation to create a group chat.

The GroupChats class will hold the group chats yielded from accepted invitations.

GroupChats.getInstance().addListener(() {
    List<GroupChat> groupChats = GroupChats.getInstance().groupChats;
    for(GroupChat groupChat in groupChats) {
      print("We are connected to the groupchat ... "+groupChat.title);
    }
  });

Event Handling #

The DirectMessagesChat class listens for various chat-related events (message added, reacted, seen, delivered, etc.). You can handle these events by implementing custom actions.

Entering and Leaving a Chat #

When a user enters or leaves a chat, you can influence whether they’ve viewed messages.

chat.enterChat();  // Marks all messages as seen.
chat.leaveChat();  // Marks the chat as unviewed.
2
likes
140
points
25
downloads

Publisher

verified publisherlocality.media

Weekly Downloads

A chat based on Locality Social Cloud that supported End-to-End encrypted Chats and GroupChats and Chat Message state management.

Homepage
Repository
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

crypto, flutter, locality_social_cloud, m511chacha20, theory, uuid

More

Packages that depend on locality_social_cloud_chat