Skip to content

Commit a16824a

Browse files
committed
Implement simple resource life cycle
1 parent 416798f commit a16824a

File tree

1 file changed

+76
-8
lines changed

1 file changed

+76
-8
lines changed

src/resource.ts

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { IApi, ResourceData, ResourceId, ResourceParams } from './types';
22
import { parseParams, replaceParams } from './utils';
33

4+
type EventHandler<T> = (data?: T | void) => void;
5+
46
export class Resource<
57
T extends object,
68
TItem = T,
@@ -11,6 +13,10 @@ export class Resource<
1113
public route: string;
1214
public paramNames: string[];
1315

16+
protected createdHandlers: Set<EventHandler<T>> = new Set();
17+
protected updatedHandlers: Set<EventHandler<T>> = new Set();
18+
protected deletedHandlers: Set<EventHandler<T>> = new Set();
19+
1420
constructor(api: IApi, route: string) {
1521
this.api = api;
1622

@@ -22,6 +28,51 @@ export class Resource<
2228
}
2329
}
2430

31+
public onCreated(handler: EventHandler<T>) {
32+
this.createdHandlers.add(handler);
33+
34+
// Unsubscribe
35+
return () => {
36+
this.createdHandlers.delete(handler);
37+
};
38+
}
39+
40+
public created(data?: T | void) {
41+
this.createdHandlers.forEach((handler) => {
42+
handler(data);
43+
});
44+
}
45+
46+
public onUpdated(handler: EventHandler<T>) {
47+
this.updatedHandlers.add(handler);
48+
49+
// Unsubscribe
50+
return () => {
51+
this.updatedHandlers.delete(handler);
52+
};
53+
}
54+
55+
public updated(data?: T | void) {
56+
this.updatedHandlers.forEach((handler) => {
57+
handler(data);
58+
});
59+
}
60+
61+
public onDeleted(handler: EventHandler<T>) {
62+
this.deletedHandlers.add(handler);
63+
64+
// Unsubscribe
65+
return () => {
66+
this.deletedHandlers.delete(handler);
67+
};
68+
}
69+
70+
public deleted(data?: T | void) {
71+
this.deletedHandlers.forEach((handler) => {
72+
handler(data);
73+
});
74+
}
75+
2576
public match(pathname: string) {
2677
return (
2778
this.matchRoute(`${this.route}/:id`, pathname) ||
@@ -77,10 +128,14 @@ export class Resource<
77128

78129
// C
79130
public create<
80-
Res = T,
131+
Res extends T | void = T,
81132
Req extends object | void = ResourceData<T, idAttribute>,
82-
>(data: Req, params?: ResourceParams) {
83-
return this.api.post<Res, Req>(this.buildUrl(params), data);
133+
>(req: Req, params?: ResourceParams) {
134+
return this.api.post<Res, Req>(this.buildUrl(params), req).then((data) => {
135+
this.created(data);
136+
137+
return data;
138+
});
84139
}
85140

86141
// R
@@ -90,15 +145,28 @@ export class Resource<
90145

91146
// U
92147
public update<
93-
Res = T,
148+
Res extends T | void = T,
94149
Req extends object | void = ResourceData<T, idAttribute>,
95-
>(id: ResourceId, data: Req, params?: ResourceParams) {
96-
return this.api.put<Res, Req>(this.buildUrl(params, id), data);
150+
>(id: ResourceId, req: Req, params?: ResourceParams) {
151+
return this.api
152+
.put<Res, Req>(this.buildUrl(params, id), req)
153+
.then((data) => {
154+
this.updated(data);
155+
156+
return data;
157+
});
97158
}
98159

99160
// D
100-
public delete<Res = void>(id: ResourceId, params?: ResourceParams) {
101-
return this.api.delete<Res>(this.buildUrl(params, id));
161+
public delete<Res extends T | void = void>(
162+
id: ResourceId,
163+
params?: ResourceParams,
164+
) {
165+
return this.api.delete<Res>(this.buildUrl(params, id)).then((data) => {
166+
this.deleted(data);
167+
168+
return data;
169+
});
102170
}
103171

104172
// L

0 commit comments

Comments
 (0)