diff --git a/Readme.md b/Readme.md index 5329b55..1b59ed3 100644 --- a/Readme.md +++ b/Readme.md @@ -58,6 +58,7 @@ Please do not use it in production yet. - [x] Text `string` - [x] Events - [x] `onLoad` + - [x] `onLoadWithStatusCode` - [x] `onProgress` - [x] `onAbort` - [x] send @@ -65,10 +66,10 @@ Please do not use it in production yet. - [x] async - [x] timeout - [x] withCredentials +- [x] statusCode - [ ] overrideMimeType - [ ] auth (username / password) - [ ] upload -- [ ] statusCode # How do I install it? @@ -147,7 +148,9 @@ client->Warp.Event.onProgress(_event => { }); ``` -**onLoad** The datatype of the response is based on the currently set `ResponseType` (`option(string)` by default). +**onLoad** + +The datatype of the response is based on the currently set `ResponseType` (`option(string)` by default). ```reason client->Warp.Event.onLoad(response => { @@ -159,6 +162,20 @@ client->Warp.Event.onLoad(response => { }); ``` +**onLoadWithStatusCode** + +Same as `onLoad` but gets the requests statusCode as a second argument + +```reason +client->Warp.Event.onLoadWithStatusCode((response, statusCode) => { + switch (response) { + | Ok(Some(data)) => Js.Console.log2(data, statusCode) + | Ok(None) => Js.Console.info2("No Response!", statusCode) + | Error(message) => Js.Console.error2(message, statusCode) + } +}); +``` + **onAbort** ```reason diff --git a/src/Warp.re b/src/Warp.re index 9a3555a..8520839 100644 --- a/src/Warp.re +++ b/src/Warp.re @@ -115,6 +115,64 @@ let send: | None => () }; + switch (client.onLoadWithStatusCode) { + | Some(onLoad) => + xhr->Warp_XHR.onError(_ => { + onLoad( + Types.ResponseType.Error(xhr->Warp_XHR.statusText), + xhr->Warp_XHR.status, + ) + }); + xhr->Warp_XHR.onTimeout(_ => { + onLoad( + Types.ResponseType.Error(xhr->Warp_XHR.statusText), + xhr->Warp_XHR.status, + ) + }); + + xhr->Warp_XHR.onLoad(_ => { + switch (client.responseType) { + | Types.ResponseType.TextResponse(_) => + onLoad( + Types.ResponseType.Ok( + Types.ResponseType.TextResponse( + xhr->Warp_XHR.responseText->Js.Nullable.toOption, + ), + ), + xhr->Warp_XHR.status, + ) + | Types.ResponseType.JSONResponse(_) => + onLoad( + Types.ResponseType.Ok( + Types.ResponseType.JSONResponse( + xhr->Warp_XHR.responseJson->Js.Nullable.toOption, + ), + ), + xhr->Warp_XHR.status, + ) + | Types.ResponseType.DocumentResponse(_) => + onLoad( + Types.ResponseType.Ok( + Types.ResponseType.DocumentResponse( + xhr->Warp_XHR.responseDocument->Js.Nullable.toOption, + ), + ), + xhr->Warp_XHR.status, + ) + | Types.ResponseType.ArrayBufferResponse(_) => + onLoad( + Types.ResponseType.Ok( + Types.ResponseType.ArrayBufferResponse( + xhr->Warp_XHR.responseArrayBuffer->Js.Nullable.toOption, + ), + ), + xhr->Warp_XHR.status, + ) + } + }); + | None => () + }; + switch (client.method, Js.List.isEmpty(client.formData)) { | (GET, _) | (HEAD, _) diff --git a/src/Warp/Types/Warp_Types_Client.re b/src/Warp/Types/Warp_Types_Client.re index 65f79a1..beff7bc 100644 --- a/src/Warp/Types/Warp_Types_Client.re +++ b/src/Warp/Types/Warp_Types_Client.re @@ -9,6 +9,7 @@ type t('a) = { headers: list((string, string)), responseType: 'a, onLoad: option(Warp_Types_ResponseType.t('a) => unit), + onLoadWithStatusCode: option((Warp_Types_ResponseType.t('a), int) => 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 840ca3f..8753465 100644 --- a/src/Warp/Warp_Client.re +++ b/src/Warp/Warp_Client.re @@ -12,6 +12,7 @@ let make = (~url, ~method) => { formData: [], headers: [], onLoad: None, + onLoadWithStatusCode: None, onProgess: None, onAbort: None, }; diff --git a/src/Warp/Warp_Event.re b/src/Warp/Warp_Event.re index 216754f..00f06c4 100644 --- a/src/Warp/Warp_Event.re +++ b/src/Warp/Warp_Event.re @@ -30,6 +30,37 @@ let onLoad: }; }; +let onLoadWithStatusCode: + type a. + ( + Warp_Types_Client.t(Warp_Types_ResponseType.payload(a)), + (Warp_Types_ResponseType.t(a), int) => 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, + onLoadWithStatusCode: + Some( + (data, statusCode) => { + switch (data) { + | Warp_Types_ResponseType.Ok(data) => + callback(Ok(eval(data)), statusCode) + | Warp_Types_ResponseType.Error(message) => + callback(Error(message), statusCode) + } + }, + ), + }; + }; + let onProgress = (client, callback) => { {...client, onProgess: Some(callback)}; }; diff --git a/src/Warp/Warp_Event.rei b/src/Warp/Warp_Event.rei index 2c221f7..ba7801a 100644 --- a/src/Warp/Warp_Event.rei +++ b/src/Warp/Warp_Event.rei @@ -5,6 +5,13 @@ let onLoad: ) => Warp_Types_Client.t(Warp_Types_ResponseType.payload('a)); +let onLoadWithStatusCode: + ( + Warp_Types_Client.t(Warp_Types_ResponseType.payload('a)), + (Warp_Types_ResponseType.t('a), int) => 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); diff --git a/src/Warp/Warp_ResponseType.re b/src/Warp/Warp_ResponseType.re index d571f39..5740c18 100644 --- a/src/Warp/Warp_ResponseType.re +++ b/src/Warp/Warp_ResponseType.re @@ -5,6 +5,7 @@ let setText = client => { ...client, responseType: Warp_Types_ResponseType.TextResponse(None), onLoad: None, + onLoadWithStatusCode: None, }; }; @@ -13,6 +14,7 @@ let setDocument = client => { ...client, responseType: Warp_Types_ResponseType.DocumentResponse(None), onLoad: None, + onLoadWithStatusCode: None, }; }; @@ -21,6 +23,7 @@ let setJson = client => { ...client, responseType: Warp_Types_ResponseType.JSONResponse(None), onLoad: None, + onLoadWithStatusCode: None, }; }; @@ -29,5 +32,6 @@ let setArrayBuffer = client => { ...client, responseType: Warp_Types_ResponseType.ArrayBufferResponse(None), onLoad: None, + onLoadWithStatusCode: None, }; }; \ No newline at end of file