82 lines
2.2 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
16
function addEntries(
17
elements: React.ReactNode[],
18
entries: Record<string, MessageUsername | MessageUsernameBadge | MessageBadge>,
19
indicies: Partial<
20
Record<
21
| keyof typeof MessageUsernameIndicies
22
| keyof typeof MessageUsernameBadgeIndicies
23
| keyof typeof MessageBadgeIndicies,
24
number
25
>
26
>,
27
props: any
28
) {
29
const originalElements = [...elements];
30
for (const [id, entry] of Object.entries(entries)) {
31
const component = <entry.component {...props} key={id} />;
32
33
if (entry.anchor === undefined) {
34
if (entry.before) {
35
elements.splice(0, 0, component);
36
} else {
37
elements.push(component);
38
}
39
} else {
40
const index = elements.indexOf(originalElements[indicies[entry.anchor]!]);
41
elements.splice(index! + (entry.before ? 0 : 1), 0, component);
42
}
43
}
44
}
45
46
export const messages: Messages = {
47
addToUsername(id, component, anchor, before = false) {
48
username[id] = {
49
component,
50
anchor,
51
before
52
};
53
},
54
addUsernameBadge(id, component, anchor, before = false) {
55
usernameBadges[id] = {
56
component,
57
anchor,
58
before
59
};
60
},
61
addBadge(id, component, anchor, before = false) {
62
badges[id] = {
63
component,
64
anchor,
65
before
66
};
67
},
68
_patchUsername(elements, props) {
69
addEntries(elements, username, MessageUsernameIndicies, props);
70
return elements;
71
},
72
_patchUsernameBadges(elements, props) {
73
addEntries(elements, usernameBadges, MessageUsernameBadgeIndicies, props);
74
return elements;
75
},
76
_patchBadges(elements, props) {
77
addEntries(elements, badges, MessageBadgeIndicies, props);
78
return elements;
79
}
80
};
81
82
export default messages;
83