diff --git a/.bsb.lock b/.bsb.lock index 819bfc7..afecfb4 100644 --- a/.bsb.lock +++ b/.bsb.lock @@ -1 +1 @@ -90357 \ No newline at end of file +61761 \ No newline at end of file diff --git a/Readme.md b/Readme.md index a9ef5c4..7194fb3 100644 --- a/Readme.md +++ b/Readme.md @@ -56,8 +56,8 @@ Please do not use it in production yet. - [x] Text `string` - [x] Events - [x] `onLoad` - - [ ] `onProgress` - - [ ] `onAbort` + - [x] `onProgress` + - [x] `onAbort` - [x] send - [x] abort - [ ] async @@ -127,12 +127,20 @@ client->Warp.Header.add("key", "value"); client->Warp.Header.remove("key"); ``` -### Handling Responses +### Events -The datatype of the response is based on the currently set `ResponseType` (`option(string)` by default). +**onProgress** ```reason -client->Warp.onLoad(response => { +client->Warp.Event.onProgress(_event => { + Js.Console.log("We are making progress!") +}); +``` + +**onLoad** The datatype of the response is based on the currently set `ResponseType` (`option(string)` by default). + +```reason +client->Warp.Event.onLoad(response => { switch (response) { | Ok(Some(data)) => Js.Console.log(data) | Ok(None) => Js.Console.info("Response was empty") @@ -141,6 +149,14 @@ client->Warp.onLoad(response => { }); ``` +**onAbort** + +```reason +client->Warp.Event.onAbort(() => { + Js.Console.log("The request got aborted :(") +}); +``` + ### Response Types If you want to change the `ResponseType`, you have to do it **before** the `onLoad`. If you set it afterwards, your @@ -197,7 +213,7 @@ Warp.Method.get("http://localhost:8081/") ("email", "max@mustermann.de"), ]) ->Warp.Header.add("authorization", "Bearer 123") -->Warp.onLoad(response => { +->Warp.Event.onLoad(response => { switch (response) { | Ok(Some(data)) => Js.Console.log(data) | Ok(None) => Js.Console.info("No Response!") diff --git a/src/Warp.re b/src/Warp.re index f1768bb..2d4388b 100644 --- a/src/Warp.re +++ b/src/Warp.re @@ -5,36 +5,7 @@ module QueryString = Warp_QueryString; module FormData = Warp_FormData; module ResponseType = Warp_ResponseType; module Types = Warp_Types; - -let onLoad: - type a. - ( - Types.Client.t(Types.ResponseType.payload(a)), - Types.ResponseType.t(a) => unit - ) => - Types.Client.t(Types.ResponseType.payload(a)) = - (client, callback) => { - let eval: type a. Types.ResponseType.payload(a) => a = - fun - | Types.ResponseType.ArrayBufferResponse(b) => b - | Types.ResponseType.DocumentResponse(d) => d - | Types.ResponseType.JSONResponse(j) => j - | Types.ResponseType.TextResponse(t) => t; - - { - ...client, - onLoad: - Some( - data => { - switch (data) { - | Warp_Types_ResponseType.Ok(data) => callback(Ok(eval(data))) - | Warp_Types_ResponseType.Error(message) => - callback(Error(message)) - } - }, - ), - }; - }; +module Event = Warp_Event; let send: type a. @@ -81,6 +52,18 @@ let send: xhr->Warp_XHR.setRequestHeader(key, value) }); + switch (client.onProgess) { + | Some(onProgress) => + xhr->Warp_XHR.addEventListener(`progress(evt => onProgress(evt))) + | None => () + }; + + switch (client.onAbort) { + | Some(onAbort) => + xhr->Warp_XHR.addEventListener(`abort(_ => onAbort())) + | None => () + }; + switch (client.onLoad) { | Some(onLoad) => xhr->Warp_XHR.addEventListener( @@ -137,9 +120,11 @@ let send: | None => () }; - if (Js.List.isEmpty(client.formData)) { - xhr->Warp_XHR.send; - } else { + switch (client.method, Js.List.isEmpty(client.formData)) { + | (GET, _) + | (HEAD, _) + | (_, true) => xhr->Warp_XHR.send + | (_, false) => xhr->Warp_XHR.setRequestHeader( "Content-type", "application/x-www-form-urlencoded", diff --git a/src/Warp.rei b/src/Warp.rei index 603dd4f..f5dd286 100644 --- a/src/Warp.rei +++ b/src/Warp.rei @@ -5,13 +5,7 @@ module QueryString = Warp_QueryString; module FormData = Warp_FormData; module ResponseType = Warp_ResponseType; module Types = Warp_Types; - -let onLoad: - ( - Types.Client.t(Types.ResponseType.payload('a)), - Types.ResponseType.t('a) => unit - ) => - Types.Client.t(Types.ResponseType.payload('a)); +module Event = Warp_Event; let send: Types.Client.t(Types.ResponseType.payload('a)) => option(unit => unit); \ No newline at end of file diff --git a/src/Warp/Types/Warp_Types_Client.re b/src/Warp/Types/Warp_Types_Client.re index dc99126..9a2906d 100644 --- a/src/Warp/Types/Warp_Types_Client.re +++ b/src/Warp/Types/Warp_Types_Client.re @@ -6,4 +6,6 @@ type t('a) = { headers: list((string, string)), responseType: 'a, onLoad: option(Warp_Types_ResponseType.t('a) => unit), + onProgess: option(Dom.progressEvent => unit), + onAbort: option(unit => unit), }; \ No newline at end of file diff --git a/src/Warp/Warp_Client.re b/src/Warp/Warp_Client.re index ba9fde7..b4c3823 100644 --- a/src/Warp/Warp_Client.re +++ b/src/Warp/Warp_Client.re @@ -6,8 +6,10 @@ let make = (~url, ~method) => { method, queryString: [], responseType: Warp_Types_ResponseType.TextResponse(None), - onLoad: None, formData: [], headers: [], + onLoad: None, + onProgess: None, + onAbort: None, }; }; \ No newline at end of file diff --git a/src/Warp/Warp_Event.re b/src/Warp/Warp_Event.re new file mode 100644 index 0000000..216754f --- /dev/null +++ b/src/Warp/Warp_Event.re @@ -0,0 +1,39 @@ +open Warp_Types_Client; + +let onLoad: + type a. + ( + Warp_Types_Client.t(Warp_Types_ResponseType.payload(a)), + Warp_Types_ResponseType.t(a) => unit + ) => + Warp_Types_Client.t(Warp_Types_ResponseType.payload(a)) = + (client, callback) => { + let eval: type a. Warp_Types_ResponseType.payload(a) => a = + fun + | Warp_Types_ResponseType.ArrayBufferResponse(b) => b + | Warp_Types_ResponseType.DocumentResponse(d) => d + | Warp_Types_ResponseType.JSONResponse(j) => j + | Warp_Types_ResponseType.TextResponse(t) => t; + + { + ...client, + onLoad: + Some( + data => { + switch (data) { + | Warp_Types_ResponseType.Ok(data) => callback(Ok(eval(data))) + | Warp_Types_ResponseType.Error(message) => + callback(Error(message)) + } + }, + ), + }; + }; + +let onProgress = (client, callback) => { + {...client, onProgess: Some(callback)}; +}; + +let onAbort = (client, callback) => { + {...client, onAbort: Some(callback)}; +}; \ No newline at end of file diff --git a/src/Warp/Warp_Event.rei b/src/Warp/Warp_Event.rei new file mode 100644 index 0000000..2c221f7 --- /dev/null +++ b/src/Warp/Warp_Event.rei @@ -0,0 +1,13 @@ +let onLoad: + ( + Warp_Types_Client.t(Warp_Types_ResponseType.payload('a)), + Warp_Types_ResponseType.t('a) => unit + ) => + Warp_Types_Client.t(Warp_Types_ResponseType.payload('a)); + +let onProgress: + (Warp_Types_Client.t('a), Dom.progressEvent => unit) => + Warp_Types_Client.t('a); + +let onAbort: + (Warp_Types_Client.t('a), unit => unit) => Warp_Types_Client.t('a); \ No newline at end of file