hasura_connect

Last updated:

0 purchases

hasura_connect Image
hasura_connect Images
Add to Cart

Description:

hasura connect

Hasura Connect - Connect your Flutter/Dart apps to Hasura simply.








The hasura_connect is designed to facilitate Hasura's integration with Flutter applications.





Report Bug
ยท
Request Feature













Table of Contents


About The Project

Sponsors



Getting Started

Contributing
License
Contact




About The Project #



The hasura_connect is designed to facilitate Hasura's integration with Flutter applications, leveraging the full power of Graphql.
(back to top)

Sponsors #



(back to top)


Getting Started #
To install Hasura Connect in your project you can follow the instructions below:
a) Add in your pubspec.yaml:
dependencies:
hasura_connect: <last-version>
copied to clipboard
b) or use slidy:
slidy install hasura_connect
copied to clipboard
(back to top)

How To Use #
A simple usage example:
//import
import 'package:hasura_connect/hasura_connect.dart';

String url = 'http://localhost:8080/v1/graphql';
HasuraConnect hasuraConnect = HasuraConnect(url);
copied to clipboard
You can encapsulate this instance into a BLoC class or directly into a Provider.
Create a document with Query:
//document
String docQuery = """
query {
authors {
id
email
name
}
}
""";
copied to clipboard
Now just add the document to the "query" method of the HasuraConnect instance.
//get query
var r = await hasuraConnect.query(docQuery);

//OR USE MUTATION
var r = await hasuraConnect.mutation(docQuery);
copied to clipboard
Subscriptions #
Subscriptions will notify you each time you have a change to the searched items. Use the "hasuraConnect.subscription" method to receive a stream.
Snapshot snapshot = await hasuraConnect.subscription(docSubscription);
snapshot.listen((data) {
print(data);
}).onError((err) {
print(err);
});
copied to clipboard
Using variables #
Variables maintain the integrity of Querys, see an example:
String docSubscription = """
subscription algumaCoisa($limit:Int!){
users(limit: $limit, order_by: {user_id: desc}) {
id
email
name
}
}
""";

Snapshot snapshot = await hasuraConnect.subscription(docSubscription, variables: {"limit": 10});

//change values of variables for PAGINATIONS
snapshot.changeVariable({"limit": 20});
copied to clipboard
Execute a Query from a Document #
Future query(
String document, {
String? key,
Map<String, dynamic>? variables,
Map<String, String>? headers,
}) async {
final _key = key ?? _keyGenerator.generateBase(document);
return executeQuery(
Query(
key: _key,
headers: headers,
document: document.trimLeft(),
variables: variables,
),
);
}
copied to clipboard
Execute a Subscription from a Document #
Future<Snapshot> subscription(
String document, {
String? key,
Map<String, dynamic>? variables,
Map<String, String>? headers,
}) async {
final _document = document.trim();
final _key = key ?? _keyGenerator.generateBase(document);

return executeSubscription(
Query(
key: _key,
headers: headers,
document: _document,
variables: variables,
),
);
}
copied to clipboard
Execute a Mutation from a Document #
Future mutation(
String document, {
Map<String, dynamic>? variables,
bool tryAgain = true,
String? key,
Map<String, String>? headers,
}) async {
final _key = key ?? _keyGenerator.randomString(15);

return executeMutation(
Query(
key: _key,
headers: headers,
document: document.trimLeft(),
variables: variables,
),
);
}
copied to clipboard
INTERCEPTORS #
This is a good strategy to control the flow of requests. With that we can create interceptors for logs or cache for example. The community has already provided some interceptors for caching. Interceptors are highly customizable.

hive_cache_interceptor
shared_preferences_cache_interceptor
hasura_cache_interceptor

View Hasura's official Authorization documentation.
class TokenInterceptor extends Interceptor {
final FirebaseAuth auth;
TokenInterceptor(this.auth);

@override
Future<void> onConnected(HasuraConnect connect) {}

@override
Future<void> onDisconnected() {}

@override
Future onError(HasuraError request) async {
return request;
}

@override
Future<Request> onRequest(Request request) async {
var user = await auth.currentUser();
var token = await user.getIdToken(refresh: true);
if (token != null) {
try {
request.headers["Authorization"] = "Bearer ${token.token}";
return request;
} catch (e) {
return null;
}
} else {
Modular.to.pushReplacementNamed("/login");
}
}

@override
Future onResponse(Response data) async {
return data;
}

@override
Future<void> onSubscription(Request request, Snapshot snapshot) {}

@override
Future<void> onTryAgain(HasuraConnect connect) {}
}
copied to clipboard
Or:
class TokenInterceptor extends InterceptorBase {
final FirebaseAuth auth;
TokenInterceptor(this.auth);

@override
Future<Request> onRequest(Request request) async {
var user = await auth.currentUser();
var token = await user.getIdToken(refresh: true);
if (token != null) {
try {
request.headers["Authorization"] = "Bearer ${token.token}";
return request;
} catch (e) {
return null;
}
} else {
Modular.to.pushReplacementNamed("/login");
}
}
}
copied to clipboard
INTERCEPTOR #
Now you can intercept all requests, erros, subscritions.... all states of your hasura_connect connection.

onConnected
onDisconnected
onError
onRequest
onResponse
onSubscription
onTryAgain

CACHE OFFLINE #
Now you will need to create a Interceptor or use a Cache Interceptor Package made to help you like: InMemory, Hive or SharedPreference
//In Memory
import 'package:hasura_cache_interceptor/hasura_hive_cache_interceptor.dart';

final storage = MemoryStorageService();
final cacheInterceptor = CacheInterceptor(storage);
final hasura = HasuraConnect(
"<your hasura url>",
interceptors: [cacheInterceptor],
httpClient: httpClient,
)
copied to clipboard
//Hive
import 'package:hasura_connect/hasura_connect.dart';
import 'package:hasura_hive_cache_interceptor/hasura_hive_cache_interceptor.dart';

final cacheInterceptor = HiveCacheInterceptor("<your box name> (optional)");
final hasura = HasuraConnect(
"<your hasura url>",
interceptors: [cacheInterceptor],
httpClient: httpClient,
)
copied to clipboard
//Shared Preference
import 'package:hasura_connect/hasura_connect.dart';
import 'package:shared_preferences_cache_interceptor/shared_preferences_cache_interceptor.dart';

final cacheInterceptor = SharedPreferencesCacheInterceptor();
final hasura = HasuraConnect(
"<your hasura url>",
interceptors: [cacheInterceptor],
httpClient: httpClient,
)
copied to clipboard
Dispose #
HasuraConnect provides a dispose() method for use in Provider or BlocProvider. Subscription will start only when someone is listening, and when all listeners are closed HasuraConnect automatically disconnects.
Therefore, we only connect to Hasura when we are actually using it;
_For more examples, please refer to the ๐Ÿšง Documentation - Currently being updated ๐Ÿšง .
(back to top)

Features #

โœ… Queries
โœ… Mutations
โœ… Subscriptions
โœ… Change Variable in Subscriptions
โœ… Auto-Reconnect
โœ… Dynamic JWT Token
โœ… bloc_pattern Integration
โœ… Provider Integration
โœ… Variables
โœ… Cache Subscription
โœ… Cache Mutation
โœ… Cache Query

Right now this package has concluded all his intended features. If you have any suggestions or find something to report, see below how to contribute to it.
(back to top)

Contributing #
๐Ÿšง Contributing Guidelines - Currently being updated ๐Ÿšง
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the appropriate tag.
Don't forget to give the project a star! Thanks again!

Fork the Project
Create your Feature Branch (git checkout -b feature/AmazingFeature)
Commit your Changes (git commit -m 'Add some AmazingFeature')
Push to the Branch (git push origin feature/AmazingFeature)
Open a Pull Request

Remember to include a tag, and to follow Conventional Commits and Semantic Versioning when uploading your commit and/or creating the issue.
(back to top)

License #
Distributed under the MIT License. See LICENSE.txt for more information.
(back to top)

Contact #
Flutterando Community

Discord
Telegram
Website
Youtube Channel
Other useful links

(back to top)

Contributors #





(back to top)

Maintaned by #







Built and maintained by Flutterando.

License:

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.