-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathuseService.js
More file actions
100 lines (87 loc) · 2.65 KB
/
useService.js
File metadata and controls
100 lines (87 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
* File: useService.js
* Project: @barteh/react-withservice
* File Created: Wednesday, 16th October 2019 6:22:33 am
* Author: rafat (ahadrt@gmail.com)
* -----
* Last Modified: Wednesday, 16th October 2019 6:22:35 am
* Modified By: rafat (ahadrt@gmail.com>)
* -----
* Copyright 2018 - 2019 Borna Mehr Fann, Borna Mehr Fann
* Trademark barteh
*/
/**
* @class
* @classdesc return type of useService
*
*/
import {useState, useEffect} from 'react';
class AUseServiceReturnType {
/**
*
* @param {string} status , can be "loading" | "error" | "ready"
* @param {any} data an object or primitives return from servic
* @param {number} error contains http error codes like 404 or 500 ...
* @param {function} retry a function can do retry geting data for service
*/
constructor(_status, _data, _error, _retry) {
this.status = _status;
this.data = _data;
this.error = _error;
this.retry = _retry;
}
status;
data;
error;
retry;
toArray() {
return [this.status, this.data, this.error, this.retry]
}
}
/**
* @param {AsService} service
* @param {any[]} params
* @returns {AUseServiceReturnType} {status, data, error, retry}
* @description Custom react hook for using ASService. 2 deferent mode of return can be used
* 1-{status, data, error, retry}=useService(...)
* 2-[status, data, error, retry]=useService(...).toArray()
*
*/
export default function useService(service, ...params) {
if (service === undefined)
throw new Error("service cant be undefined in useService");
function retry() {
setRet(new AUseServiceReturnType("loading"));
return service.refresh(...params);
}
const [ret,
setRet] = useState(new AUseServiceReturnType("loading"));
useEffect(() => {
let sub,
errorsub;
function handleChangeDone(data) {
setRet(new AUseServiceReturnType("ready", data,undefined,retry));
}
function handleChangeError(error) {
setRet(new AUseServiceReturnType("error", undefined, error, retry));
}
sub = service
.Observable(...params)
.subscribe(handleChangeDone);
errorsub = service
.ErrorObservable(...params)
.subscribe(handleChangeError);
const getData = async() => {
await service.get(...params);
}
getData();
return (ee) => {
setRet({status: "loading"})
if (sub)
sub.unsubscribe();
if (errorsub)
errorsub.unsubscribe();
};
}, [...params]);
return ret;
}