97 lines
2.7 kB
1
import {
2
MessageBadge,
3
MessageBadgeIndicies,
4
Messages,
5
MessageUsername,
6
MessageUsernameBadge,
7
MessageUsernameBadgeIndicies,
8
MessageUsernameIndicies
9
} from "@moonlight-mod/types/coreExtensions/componentEditor";
10
import React from "@moonlight-mod/wp/react";
11
12
const username: Record<string, MessageUsername> = {};
13
const usernameBadges: Record<string, MessageUsernameBadge> = {};
14
const badges: Record<string, MessageBadge> = {};
15
const accessories: Record<string, React.FC<any>> = {};
16
17
function addEntries(
18
elements: React.ReactNode[],
19
entries: Record<string, MessageUsername | MessageUsernameBadge | MessageBadge>,
20
indicies: Partial<
21
Record<
22
| keyof typeof MessageUsernameIndicies
23
| keyof typeof MessageUsernameBadgeIndicies
24
| keyof typeof MessageBadgeIndicies,
25
number
26
>
27
>,
28
props: any
29
) {
30
const originalElements = [...elements];
31
for (const [id, entry] of Object.entries(entries)) {
32
const component = <entry.component {...props} key={id} />;
33
34
if (entry.anchor === undefined) {
35
if (entry.before) {
36
elements.splice(0, 0, component);
37
} else {
38
elements.push(component);
39
}
40
} else {
41
const index = elements.indexOf(originalElements[indicies[entry.anchor]!]);
42
elements.splice(index! + (entry.before ? 0 : 1), 0, component);
43
}
44
}
45
}
46
47
function addComponents(elements: React.ReactNode[], components: Record<string, React.FC<any>>, props: any) {
48
for (const [id, Component] of Object.entries(components)) {
49
const component = <Component {...props} key={id} />;
50
elements.push(component);
51
}
52
}
53
54
export const messages: Messages = {
55
addToUsername(id, component, anchor, before = false) {
56
username[id] = {
57
component,
58
anchor,
59
before
60
};
61
},
62
addUsernameBadge(id, component, anchor, before = false) {
63
usernameBadges[id] = {
64
component,
65
anchor,
66
before
67
};
68
},
69
addBadge(id, component, anchor, before = false) {
70
badges[id] = {
71
component,
72
anchor,
73
before
74
};
75
},
76
addAccessory(id, component) {
77
accessories[id] = component;
78
},
79
_patchUsername(elements, props) {
80
addEntries(elements, username, MessageUsernameIndicies, props);
81
return elements;
82
},
83
_patchUsernameBadges(elements, props) {
84
addEntries(elements, usernameBadges, MessageUsernameBadgeIndicies, props);
85
return elements;
86
},
87
_patchBadges(elements, props) {
88
addEntries(elements, badges, MessageBadgeIndicies, props);
89
return elements;
90
},
91
_patchAccessories(elements, props) {
92
addComponents(elements, accessories, props);
93
return elements;
94
}
95
};
96
97
export default messages;
98