From 45bd71c0a99b5fefdb46ed77c9d7ee053b3da170 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Thu, 27 Feb 2020 16:10:16 -0400 Subject: [PATCH 01/13] Remove unnecessary parameter binding --- src/BsFirebase.re | 4 ++-- src/BsFirebase.rei | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BsFirebase.re b/src/BsFirebase.re index c04a925..ec79322 100644 --- a/src/BsFirebase.re +++ b/src/BsFirebase.re @@ -9,5 +9,5 @@ module Firestore = BsFirebase__Firestore; [@bs.send] external initializeApp: (firebase, firebaseConfig) => unit = "initializeApp"; -[@bs.send] external auth: (firebase, unit) => Auth.t = "auth"; -[@bs.send] external firestore: (firebase, unit) => Firestore.t = "firestore"; \ No newline at end of file +[@bs.send] external auth: firebase => Auth.t = "auth"; +[@bs.send] external firestore: firebase => Firestore.t = "firestore"; \ No newline at end of file diff --git a/src/BsFirebase.rei b/src/BsFirebase.rei index c04a925..ec79322 100644 --- a/src/BsFirebase.rei +++ b/src/BsFirebase.rei @@ -9,5 +9,5 @@ module Firestore = BsFirebase__Firestore; [@bs.send] external initializeApp: (firebase, firebaseConfig) => unit = "initializeApp"; -[@bs.send] external auth: (firebase, unit) => Auth.t = "auth"; -[@bs.send] external firestore: (firebase, unit) => Firestore.t = "firestore"; \ No newline at end of file +[@bs.send] external auth: firebase => Auth.t = "auth"; +[@bs.send] external firestore: firebase => Firestore.t = "firestore"; \ No newline at end of file From aaf793cb01db94e061ff00ab6c25af49b3b32fb0 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Sun, 1 Mar 2020 22:47:06 -0400 Subject: [PATCH 02/13] Fix firebase warning Previously we were requiring the entire top level firebase module. This generates a warning in the console "It looks like you're using the development build of the Firebase JS SDK". This fix simply follows the recommendations detailed in the warning message which is to specifically require "firebase/app". --- src/BsFirebase.re | 2 +- src/BsFirebase.rei | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BsFirebase.re b/src/BsFirebase.re index ec79322..4274810 100644 --- a/src/BsFirebase.re +++ b/src/BsFirebase.re @@ -4,7 +4,7 @@ type firebaseConfig; module Auth = BsFirebase__Auth; module Firestore = BsFirebase__Firestore; -[@bs.module] external firebase: firebase = "firebase"; +[@bs.module] external firebase: firebase = "firebase/app"; [@bs.send] external initializeApp: (firebase, firebaseConfig) => unit = "initializeApp"; diff --git a/src/BsFirebase.rei b/src/BsFirebase.rei index ec79322..4274810 100644 --- a/src/BsFirebase.rei +++ b/src/BsFirebase.rei @@ -4,7 +4,7 @@ type firebaseConfig; module Auth = BsFirebase__Auth; module Firestore = BsFirebase__Firestore; -[@bs.module] external firebase: firebase = "firebase"; +[@bs.module] external firebase: firebase = "firebase/app"; [@bs.send] external initializeApp: (firebase, firebaseConfig) => unit = "initializeApp"; From 59ff8d2362d2486eb734d548867ae61332d58bd6 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Mon, 2 Mar 2020 08:39:01 -0400 Subject: [PATCH 03/13] Fix optional parameter in final position will not be optional --- src/BsFirebase__Firestore.re | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BsFirebase__Firestore.re b/src/BsFirebase__Firestore.re index 5a9b2a0..54cc62a 100644 --- a/src/BsFirebase__Firestore.re +++ b/src/BsFirebase__Firestore.re @@ -26,7 +26,7 @@ module Collection = { [@bs.send] external get: (t, unit) => Js.Promise.t(DocRef.t) = "get"; [@bs.send] external delete: (t, unit) => Js.Promise.t(unit) = "delete"; [@bs.send] - external set: (t, 'a, ~options: setOptions=?) => Js.Promise.t(unit) = + external set: (t, 'a, ~options: setOptions=?, unit) => Js.Promise.t(unit) = "set"; }; From 92b1316a573c96cec560214975041bdb75afbef3 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Mon, 2 Mar 2020 09:14:40 -0400 Subject: [PATCH 04/13] Add auth methods --- src/BsFirebase__Auth.re | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/BsFirebase__Auth.re b/src/BsFirebase__Auth.re index 5604fa2..ed1ac4b 100644 --- a/src/BsFirebase__Auth.re +++ b/src/BsFirebase__Auth.re @@ -65,6 +65,9 @@ module Provider = { external twitter: unit => t = "TwitterAuthProvider"; }; +[@bs.send] +external signInAnonymously: t => Js.Promise.t(Result.t) = "signInAnonymously"; + [@bs.send] external signInWithEmailAndPassword: (t, ~email: string, ~password: string) => Js.Promise.t(Result.t) = @@ -78,4 +81,6 @@ external signInWithPopup: (t, Provider.t) => Js.Promise.t(Result.t) = external onAuthStateChanged: (t, Js.Nullable.t(User.t) => unit) => unit = "onAuthStateChanged"; -[@bs.send] external signOut: (t, unit) => unit = "signOut"; \ No newline at end of file +[@bs.send] external signOut: (t, unit) => unit = "signOut"; + +[@bs.get] external currentUser: t => User.t = "currentUser"; \ No newline at end of file From d8999e87dad3b321700a8f227700a7c0352b7d59 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Mon, 2 Mar 2020 09:15:40 -0400 Subject: [PATCH 05/13] Add require firebase/auth --- src/BsFirebase__Auth.re | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/BsFirebase__Auth.re b/src/BsFirebase__Auth.re index ed1ac4b..d5cb0c6 100644 --- a/src/BsFirebase__Auth.re +++ b/src/BsFirebase__Auth.re @@ -1,5 +1,7 @@ type t; +[@bs.module] external require: t = "firebase/auth"; + module User = { type t; From 3e5bc2147909fa64aa199f16f4cdcd13d954bcc9 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Mon, 2 Mar 2020 15:06:58 -0400 Subject: [PATCH 06/13] Refactor module names to better match firebase API. Note: QuerySnapshot.get technically returns a [QueryDocumentSnapshot](https://firebase.google.com/docs/reference/js/firebase.firestore.QueryDocumentSnapshot) but from the docs it offers the same API surface as a DocumentSnapshot. --- src/BsFirebase__Firestore.re | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BsFirebase__Firestore.re b/src/BsFirebase__Firestore.re index 54cc62a..555afe0 100644 --- a/src/BsFirebase__Firestore.re +++ b/src/BsFirebase__Firestore.re @@ -1,6 +1,6 @@ type t; -module DocRef = { +module DocSnapshot = { type t; [@bs.get] external exists: t => bool = "exists"; @@ -11,19 +11,19 @@ module DocRef = { module QuerySnapshot = { type t; - [@bs.get] external docs: t => array(DocRef.t) = "docs"; + [@bs.get] external docs: t => array(DocSnapshot.t) = "docs"; }; module Collection = { type t; - module Doc = { + module DocRef = { type t; [@bs.deriving abstract] type setOptions = {merge: bool}; - [@bs.send] external get: (t, unit) => Js.Promise.t(DocRef.t) = "get"; + [@bs.send] external get: (t, unit) => Js.Promise.t(DocSnapshot.t) = "get"; [@bs.send] external delete: (t, unit) => Js.Promise.t(unit) = "delete"; [@bs.send] external set: (t, 'a, ~options: setOptions=?, unit) => Js.Promise.t(unit) = @@ -32,7 +32,7 @@ module Collection = { [@bs.send] external add: (t, 'a) => Js.Promise.t(DocRef.t) = "add"; [@bs.send] external get: (t, unit) => Js.Promise.t(QuerySnapshot.t) = "get"; - [@bs.send] external doc: (t, string) => Doc.t = "doc"; + [@bs.send] external doc: (t, string) => DocRef.t = "doc"; [@bs.send] external where: ( From 81a747daad8801279dfd8bf3e76735860ac1ebb2 Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Tue, 3 Mar 2020 16:19:14 -0400 Subject: [PATCH 07/13] Add QuerySnapshot.size property --- src/BsFirebase__Firestore.re | 1 + 1 file changed, 1 insertion(+) diff --git a/src/BsFirebase__Firestore.re b/src/BsFirebase__Firestore.re index 555afe0..5cda110 100644 --- a/src/BsFirebase__Firestore.re +++ b/src/BsFirebase__Firestore.re @@ -12,6 +12,7 @@ module QuerySnapshot = { type t; [@bs.get] external docs: t => array(DocSnapshot.t) = "docs"; + [@bs.get] external size: t => int = "size"; }; module Collection = { From 86db802947dced435f8261597cf7759b517049be Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Fri, 13 Mar 2020 12:44:55 -0400 Subject: [PATCH 08/13] Add support for multiple updates within a transaction. --- src/BsFirebase__Firestore.re | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/BsFirebase__Firestore.re b/src/BsFirebase__Firestore.re index 5cda110..f858da8 100644 --- a/src/BsFirebase__Firestore.re +++ b/src/BsFirebase__Firestore.re @@ -55,4 +55,17 @@ module Collection = { [@bs.module] external require: t = "firebase/firestore"; -[@bs.send] external collection: (t, string) => Collection.t = "collection"; \ No newline at end of file +[@bs.send] external collection: (t, string) => Collection.t = "collection"; + +module Transaction = { + type firestore = t; + type t; + + type updateFunction('a) = t => Js.Promise.t('a); + + [@bs.send] external get: (t, Collection.DocRef.t) => Js.Promise.t(DocSnapshot.t) = "get"; + [@bs.send] external update: (t, Collection.DocRef.t, 'a) => t = "update"; +} + + +[@bs.send] external runTransaction: (t, Transaction.updateFunction('a)) => Js.Promise.t('a) = "runTransaction"; \ No newline at end of file From 414aefb7adebb5cc4ef198693302f2160f33a03a Mon Sep 17 00:00:00 2001 From: Niren Orie Date: Wed, 8 Apr 2020 15:11:31 -0400 Subject: [PATCH 09/13] Add transaction bindings for set and delete --- src/BsFirebase__Firestore.re | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/BsFirebase__Firestore.re b/src/BsFirebase__Firestore.re index f858da8..610f881 100644 --- a/src/BsFirebase__Firestore.re +++ b/src/BsFirebase__Firestore.re @@ -65,6 +65,8 @@ module Transaction = { [@bs.send] external get: (t, Collection.DocRef.t) => Js.Promise.t(DocSnapshot.t) = "get"; [@bs.send] external update: (t, Collection.DocRef.t, 'a) => t = "update"; + [@bs.send] external set: (t, Collection.DocRef.t, 'a, ~options: Collection.DocRef.setOptions=?, unit) => t = "set"; + [@bs.send] external delete: (t, Collection.DocRef.t) => t = "delete"; } From 270241da7c934330cd5511382592dcd65f10df69 Mon Sep 17 00:00:00 2001 From: Ravi Chandra Date: Mon, 24 Aug 2020 22:01:58 +1200 Subject: [PATCH 10/13] Add password reset/confirm bindings + bump bs-platform --- package.json | 4 ++-- src/BsFirebase__Auth.re | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5a1ad32..237b59e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dck/bs-firebase", - "version": "0.3.0", + "version": "0.4.0", "scripts": { "build": "bsb -make-world", "start": "bsb -make-world -w", @@ -15,6 +15,6 @@ "author": "Thomas Deconinck", "license": "MIT", "devDependencies": { - "bs-platform": "7.2.1" + "bs-platform": "^7.3.2" } } diff --git a/src/BsFirebase__Auth.re b/src/BsFirebase__Auth.re index d5cb0c6..4287c0d 100644 --- a/src/BsFirebase__Auth.re +++ b/src/BsFirebase__Auth.re @@ -75,6 +75,22 @@ external signInWithEmailAndPassword: (t, ~email: string, ~password: string) => Js.Promise.t(Result.t) = "signInWithEmailAndPassword"; +type actionCodeSettings = {url: string}; +[@bs.send] +external sendPasswordResetEmail: + ( + t, + ~email: string, + ~actionCodeSettings: Js.Nullable.t(actionCodeSettings) + ) => + Js.Promise.t(unit) = + "sendPasswordResetEmail"; + +[@bs.send] +external confirmPasswordReset: + (t, ~code: string, ~newPassword: string) => Js.Promise.t(unit) = + "confirmPasswordReset"; + [@bs.send] external signInWithPopup: (t, Provider.t) => Js.Promise.t(Result.t) = "signInWithPopup"; From bf071562613780a9886603c54bf271fa1ebd2fc3 Mon Sep 17 00:00:00 2001 From: Ravi Chandra Date: Tue, 25 Aug 2020 16:39:46 +1200 Subject: [PATCH 11/13] add getIdToken --- src/BsFirebase__Auth.re | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/BsFirebase__Auth.re b/src/BsFirebase__Auth.re index 4287c0d..3761ff8 100644 --- a/src/BsFirebase__Auth.re +++ b/src/BsFirebase__Auth.re @@ -13,6 +13,9 @@ module User = { [@bs.get] external refreshToken: t => string = "refreshToken"; [@bs.get] external uid: t => string = "uid"; [@bs.get] external phoneNumber: t => Js.Nullable.t(string) = "phoneNumber"; + + [@bs.send] + external getIdToken: (t, unit) => Js.Promise.t(string) = "getIdToken"; }; module Result = { From 5c92f2133a2d918f091b2837fcd737ddfde7d1fb Mon Sep 17 00:00:00 2001 From: Ravi Chandra Date: Wed, 26 Aug 2020 09:25:34 +1200 Subject: [PATCH 12/13] update usage in README --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6059edc..d0a8fc6 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Add it to `bsconfig.json` ## Initialize app ```reason +open BsFirebase; + [@bs.module] external firebaseConfig: firebaseConfig = "./config/firebase-config.json"; @@ -28,11 +30,15 @@ firebase->initializeApp(firebaseConfig); ## Authentication -```reason -open BsFirebase; +First include the 'firebase/auth' module in our app bundle. + BsFirebase.Auth.(require); + +#### Watch for user change + +```reason firebase -->auth() +->auth ->Auth.onAuthStateChanged(user => { switch (user->Js.Nullable.toOption) { | None => () @@ -45,9 +51,35 @@ firebase } }); -let signInWithGoogle = () => firebase->auth()->Auth.signInWithPopup(Auth.Provider.google()); -let signInWithEmailAndPassword = (~email, ~password) => firebase->auth()->Auth.signInWithEmailAndPassword(~email, ~password); -let signOut = () => firebase->auth()->Auth.signOut(); +let signInWithGoogle = () => firebase->auth->Auth.signInWithPopup(Auth.Provider.google()); +let signInWithEmailAndPassword = (~email, ~password) => firebase->auth->Auth.signInWithEmailAndPassword(~email, ~password); +let signOut = () => firebase->auth->Auth.signOut(); +``` + +#### Sign in etc + +```reason +Js.Promise.( + BsFirebase.(firebase->auth->Auth.signInWithEmailAndPassword(~email, ~password)) + |> then_(value => { + Js.log(value); + Js.Promise.resolve(value); + }) + |> ignore +); +``` + +#### Get token + +```reason +Js.Promise.( + firebase->auth->Auth.currentUser->Auth.User.getIdToken() + |> then_(value => { + Js.log(value); + Js.Promise.resolve(value); + }) + |> ignore +); ``` ## Firestore @@ -57,7 +89,7 @@ let signOut = () => firebase->auth()->Auth.signOut(); ```reason let fetchAll = () => { firebase - ->firestore() + ->firestore ->Firestore.collection("mycollection") ->Firestore.Collection.get() |> Js.Promise.then_(querySnapshot => @@ -80,7 +112,7 @@ let fetchAll = () => { ```reason let fetchItem = (id) => { firebase - ->firestore() + ->firestore ->Firestore.collection("mycollection") ->Firestore.Collection.doc(id) ->Firestore.Collection.Doc.get() @@ -98,7 +130,7 @@ let fetchItem = (id) => { ```reason let create = (title, description) => firebase - ->firestore() + ->firestore ->Firestore.collection("collection") ->Firestore.Collection.add({ "title": title, @@ -111,10 +143,10 @@ let create = (title, description) => ```reason let update = (id, title) => firebase - ->firestore() + ->firestore ->Firestore.collection("collection") ->Firestore.Collection.doc(id) - ->Firestore.Collection.Doc.set({ + ->Firestore.Collection.DocRef.set({ "title": title }); ``` @@ -124,8 +156,8 @@ let update = (id, title) => ```reason let remove = (id: string) => firebase - ->firestore() + ->firestore ->Firestore.collection("mycollection") ->Firestore.Collection.doc(id) - ->Firestore.Collection.Doc.delete(); + ->Firestore.Collection.DocRef.delete(); ``` From 86f2aa0fe1f4d460857150f0dad4c8e2408bbaf4 Mon Sep 17 00:00:00 2001 From: Ravi Chandra Date: Tue, 1 Sep 2020 11:03:50 +1200 Subject: [PATCH 13/13] more README fixes --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d0a8fc6..39bd4eb 100644 --- a/README.md +++ b/README.md @@ -115,9 +115,9 @@ let fetchItem = (id) => { ->firestore ->Firestore.collection("mycollection") ->Firestore.Collection.doc(id) - ->Firestore.Collection.Doc.get() + ->Firestore.Collection.DocRef.get() |> Js.Promise.then_(doc => { - let data = doc->Firestore.DocRef.data(); + let data = doc->Firestore.DocSnapshot.data(); Js.log(data); data; @@ -146,9 +146,11 @@ let update = (id, title) => ->firestore ->Firestore.collection("collection") ->Firestore.Collection.doc(id) - ->Firestore.Collection.DocRef.set({ - "title": title - }); + ->Firestore.Collection.DocRef.set( + {"title": title}, + ~options=Firestore.Collection.DocRef.setOptions(~merge=true), + (), + ); ``` #### Remove