-
Notifications
You must be signed in to change notification settings - Fork 0
/
render.ts
74 lines (63 loc) · 1.58 KB
/
render.ts
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
import { GdprGuard, GdprGuardGroup, GdprManager, GdprManagerFactory, GdprSavior } from "gdpr-guard"
import { GroupRenderFunction, GuardRenderFunction, ManagerRenderFunction, Rendered } from "./Renderer"
/**
* Configuration for the render function
*/
export interface RenderPayload {
/**
* Manager rendering function
*/
renderManager: ManagerRenderFunction;
/**
* Group rendering function
*/
renderGroup: GroupRenderFunction;
/**
* Guard rendering function
*/
renderGuard: GuardRenderFunction;
}
/**
* Result of the render function
*/
export interface GdprRenderResult {
/**
* The rendered element
*/
rendered: Rendered;
/**
* The manager used to render
*/
manager: GdprManager;
}
/**
* Render the current manager state (you will manually handle re-renders)
* @param manager - The manager to render
* @param payload - The render configuration
*/
export const render = async (manager: GdprManager, payload: RenderPayload): Promise<GdprRenderResult> => {
const {
renderManager: rm,
renderGroup: rgr,
renderGuard: rgu,
} = payload;
const renderer = {
bound(method: keyof typeof renderer) {
return this[method].bind(this);
},
renderGuard(guard: GdprGuard): Promise<Rendered> {
return rgu(this.bound("renderGroup"), guard);
},
renderGroup(group: GdprGuardGroup): Promise<Rendered> {
return rgr(this.bound("renderGuard"), group);
},
renderManager(manager: GdprManager): Promise<Rendered> {
return rm(this.bound("renderGroup"), manager);
},
};
const rendered = await renderer.renderManager(manager);
return {
rendered,
manager,
};
};