Skip to content

An offline-first chat application built using Flutter, Supabase, and PowerSync. The app allows real-time messaging with offline support, enabling users to continue chatting seamlessly even without an internet connection. When the connection is restored, the app synchronizes messages automatically.

Notifications You must be signed in to change notification settings

albinson-arias/offline_first_chat_app

Repository files navigation

Offline First Chat App

coverage style: very good analysis License: MIT

Generated by the Very Good CLI 🤖

Offline First Chat App

An offline-first chat application built using Flutter, Supabase, and PowerSync. The app allows real-time messaging with offline support, enabling users to continue chatting seamlessly even without an internet connection. When the connection is restored, the app synchronizes messages automatically.

Features

  • Offline-First Approach: Users can send and receive messages even while offline. Messages are queued and synced when the internet connection is restored.
  • Real-Time Messaging: Leverages Supabase for real-time messaging and data synchronization.
  • Authentication: User authentication with Supabase for secure login and registration.
  • PowerSync Integration: Manages offline storage and sync operations, ensuring that all data is persisted locally and synced reliably.
  • Push Notifications: Get notified of new messages even when the app is closed or running in the background.
  • Flutter: Cross-platform support for iOS and Android.
  • Supabase: Backend as a Service (BaaS) for real-time data synchronization and authentication.

Tech Stack

  • Flutter: Frontend framework for building the app UI and logic.
  • Supabase: Backend service for real-time data, authentication, and storage.
  • PowerSync: Sync engine that manages offline data storage and synchronizes when back online.

Getting Started 🚀

This project contains 3 flavors:

  • development
  • staging
  • production

To run the desired flavor either use the launch configuration in VSCode/Android Studio or use the following commands:

# Development
$ flutter run --flavor development --target lib/main_development.dart

# Staging
$ flutter run --flavor staging --target lib/main_staging.dart

# Production
$ flutter run --flavor production --target lib/main_production.dart

*Offline First Chat App works on iOS, Android, Web, and Windows.


Running Tests 🧪

To run all unit and widget tests use the following command:

$ flutter test --coverage --test-randomize-ordering-seed random

To view the generated coverage report you can use lcov.

# Generate Coverage Report
$ genhtml coverage/lcov.info -o coverage/

# Open Coverage Report
$ open coverage/index.html

Working with Translations 🌐

This project relies on flutter_localizations and follows the official internationalization guide for Flutter.

Adding Strings

  1. To add a new localizable string, open the app_en.arb file at lib/l10n/arb/app_en.arb.
{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}
  1. Then add a new key/value and description
{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    },
    "helloWorld": "Hello World",
    "@helloWorld": {
        "description": "Hello World Text"
    }
}
  1. Use the new string
import 'package:offline_first_chat_app/l10n/l10n.dart';

@override
Widget build(BuildContext context) {
  final l10n = context.l10n;
  return Text(l10n.helloWorld);
}

Adding Supported Locales

Update the CFBundleLocalizations array in the Info.plist at ios/Runner/Info.plist to include the new locale.

    ...

    <key>CFBundleLocalizations</key>
	<array>
		<string>en</string>
		<string>es</string>
	</array>

    ...

Adding Translations

  1. For each supported locale, add a new ARB file in lib/l10n/arb.
├── l10n
│   ├── arb
│   │   ├── app_en.arb
│   │   └── app_es.arb
  1. Add the translated strings to each .arb file:

app_en.arb

{
    "@@locale": "en",
    "counterAppBarTitle": "Counter",
    "@counterAppBarTitle": {
        "description": "Text shown in the AppBar of the Counter Page"
    }
}

app_es.arb

{
    "@@locale": "es",
    "counterAppBarTitle": "Contador",
    "@counterAppBarTitle": {
        "description": "Texto mostrado en la AppBar de la página del contador"
    }
}

Generating Translations

To use the latest translations changes, you will need to generate them:

  1. Generate localizations for the current project:
flutter gen-l10n --arb-dir="lib/l10n/arb"

Alternatively, run flutter run and code generation will take place automatically.

About

An offline-first chat application built using Flutter, Supabase, and PowerSync. The app allows real-time messaging with offline support, enabling users to continue chatting seamlessly even without an internet connection. When the connection is restored, the app synchronizes messages automatically.

Topics

Resources

Stars

Watchers

Forks