11import { IApi , ResourceData , ResourceId , ResourceParams } from './types' ;
22import { parseParams , replaceParams } from './utils' ;
33
4+ type EventHandler < T > = ( data ?: T | void ) => void ;
5+
46export 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