@allior/wmake-streamelements-events 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +46 -0
  2. package/README_RU.md +46 -0
  3. package/dist/react/hooks/index.d.ts +4 -0
  4. package/dist/react/hooks/index.d.ts.map +1 -0
  5. package/dist/react/hooks/use-event-listener.d.ts +4 -0
  6. package/dist/react/hooks/use-event-listener.d.ts.map +1 -0
  7. package/dist/react/hooks/use-on-event-received.d.ts +44 -0
  8. package/dist/react/hooks/use-on-event-received.d.ts.map +1 -0
  9. package/dist/react/hooks/use-on-widget-load.d.ts +4 -0
  10. package/dist/react/hooks/use-on-widget-load.d.ts.map +1 -0
  11. package/dist/react/index.d.ts +4 -0
  12. package/dist/react/index.d.ts.map +1 -0
  13. package/dist/react/index.iife.js +2 -0
  14. package/dist/react/index.iife.js.map +1 -0
  15. package/dist/react/index.js +179 -0
  16. package/dist/react/index.js.map +1 -0
  17. package/dist/react/types/index.d.ts +2 -0
  18. package/dist/react/types/index.d.ts.map +1 -0
  19. package/dist/react/types/window-events.d.ts +3 -0
  20. package/dist/react/types/window-events.d.ts.map +1 -0
  21. package/dist/root/aggregate.d.ts +12 -0
  22. package/dist/root/aggregate.d.ts.map +1 -0
  23. package/dist/root/classifier.d.ts +9 -0
  24. package/dist/root/classifier.d.ts.map +1 -0
  25. package/dist/root/commands.d.ts +9 -0
  26. package/dist/root/commands.d.ts.map +1 -0
  27. package/dist/root/data/event-detail.d.ts +10 -0
  28. package/dist/root/data/event-detail.d.ts.map +1 -0
  29. package/dist/root/data/field-value.d.ts +3 -0
  30. package/dist/root/data/field-value.d.ts.map +1 -0
  31. package/dist/root/data/index.d.ts +3 -0
  32. package/dist/root/data/index.d.ts.map +1 -0
  33. package/dist/root/data/widget-load.d.ts +5 -0
  34. package/dist/root/data/widget-load.d.ts.map +1 -0
  35. package/dist/root/index.d.ts +10 -0
  36. package/dist/root/index.d.ts.map +1 -0
  37. package/dist/root/index.iife.js +2 -0
  38. package/dist/root/index.iife.js.map +1 -0
  39. package/dist/root/index.js +2692 -0
  40. package/dist/root/index.js.map +1 -0
  41. package/dist/root/keys.d.ts +6 -0
  42. package/dist/root/keys.d.ts.map +1 -0
  43. package/dist/root/message/event.d.ts +7 -0
  44. package/dist/root/message/event.d.ts.map +1 -0
  45. package/dist/root/message/index.d.ts +5 -0
  46. package/dist/root/message/index.d.ts.map +1 -0
  47. package/dist/root/message/message.d.ts +37 -0
  48. package/dist/root/message/message.d.ts.map +1 -0
  49. package/dist/root/message/roles.d.ts +4 -0
  50. package/dist/root/message/roles.d.ts.map +1 -0
  51. package/dist/root/message/tags.d.ts +69 -0
  52. package/dist/root/message/tags.d.ts.map +1 -0
  53. package/dist/root/sources/alerts.d.ts +162 -0
  54. package/dist/root/sources/alerts.d.ts.map +1 -0
  55. package/dist/root/sources/index.d.ts +5 -0
  56. package/dist/root/sources/index.d.ts.map +1 -0
  57. package/dist/root/sources/messages.d.ts +963 -0
  58. package/dist/root/sources/messages.d.ts.map +1 -0
  59. package/dist/root/sources/on-widget-load-detail.d.ts +542 -0
  60. package/dist/root/sources/on-widget-load-detail.d.ts.map +1 -0
  61. package/dist/root/types/index.d.ts +3 -0
  62. package/dist/root/types/index.d.ts.map +1 -0
  63. package/dist/root/types/on-event-received.d.ts +170 -0
  64. package/dist/root/types/on-event-received.d.ts.map +1 -0
  65. package/dist/root/types/on-widget-load.d.ts +135 -0
  66. package/dist/root/types/on-widget-load.d.ts.map +1 -0
  67. package/dist/root/window-event-map.d.ts +10 -0
  68. package/dist/root/window-event-map.d.ts.map +1 -0
  69. package/package.json +48 -0
  70. package/src/react/hooks/index.ts +3 -0
  71. package/src/react/hooks/use-event-listener.ts +17 -0
  72. package/src/react/hooks/use-on-event-received.ts +206 -0
  73. package/src/react/hooks/use-on-widget-load.ts +15 -0
  74. package/src/react/index.ts +3 -0
  75. package/src/react/types/index.ts +1 -0
  76. package/src/react/types/window-events.ts +6 -0
  77. package/src/root/aggregate.ts +258 -0
  78. package/src/root/classifier.ts +208 -0
  79. package/src/root/commands.ts +33 -0
  80. package/src/root/data/event-detail.ts +14 -0
  81. package/src/root/data/field-value.ts +2 -0
  82. package/src/root/data/index.ts +2 -0
  83. package/src/root/data/widget-load.ts +5 -0
  84. package/src/root/index.ts +9 -0
  85. package/src/root/keys.ts +14 -0
  86. package/src/root/message/event.ts +7 -0
  87. package/src/root/message/index.ts +4 -0
  88. package/src/root/message/message.ts +40 -0
  89. package/src/root/message/roles.ts +43 -0
  90. package/src/root/message/tags.ts +119 -0
  91. package/src/root/sources/alerts.ts +163 -0
  92. package/src/root/sources/index.ts +5 -0
  93. package/src/root/sources/messages.ts +1245 -0
  94. package/src/root/sources/on-widget-load-detail.ts +969 -0
  95. package/src/root/types/index.ts +2 -0
  96. package/src/root/types/on-event-received.ts +198 -0
  97. package/src/root/types/on-widget-load.ts +171 -0
  98. package/src/root/window-event-map.ts +11 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Типы для входящих событий StreamElements/Twitch и результата классификации.
3
+ */
4
+ /** Алерт: новый подписчик (follower-latest). */
5
+ export interface FollowerDetail {
6
+ listener: "follower-latest";
7
+ event: {
8
+ name: string;
9
+ };
10
+ }
11
+ /** Алерт: массовая раздача подписок (communityGiftPurchase). */
12
+ export interface CommunityGiftPurchaseDetail {
13
+ listener: "event";
14
+ event: {
15
+ type: "communityGiftPurchase";
16
+ provider: string;
17
+ channel: string;
18
+ activityGroup: string;
19
+ data: {
20
+ amount: number;
21
+ username: string;
22
+ displayName: string;
23
+ tier: string;
24
+ sender?: string;
25
+ };
26
+ _id: string;
27
+ activityId: string;
28
+ };
29
+ }
30
+ /** Алерт: подписка latest (subscriber-latest). */
31
+ export interface SubscriberLatestDetail {
32
+ listener: "subscriber-latest";
33
+ event: {
34
+ name: string;
35
+ amount: number;
36
+ };
37
+ }
38
+ /** Алерт: подписка (self, подарок одному, продление). */
39
+ export interface SubscriberDetail {
40
+ listener: "event";
41
+ event: {
42
+ type: "subscriber";
43
+ provider: string;
44
+ channel: string;
45
+ data: {
46
+ amount: number;
47
+ username: string;
48
+ displayName: string;
49
+ tier: string;
50
+ sender?: string;
51
+ gifted?: boolean;
52
+ message?: string;
53
+ };
54
+ _id: string;
55
+ activityId: string;
56
+ };
57
+ }
58
+ /** Алерт: чиры (bits). */
59
+ export interface CheerDetail {
60
+ listener: "cheer-latest";
61
+ event: {
62
+ name: string;
63
+ amount: number;
64
+ };
65
+ }
66
+ /** Алерт: рейд. */
67
+ export interface RaidDetail {
68
+ listener: "raid-latest";
69
+ event: {
70
+ name: string;
71
+ amount: number;
72
+ };
73
+ }
74
+ /** Алерт: донат. */
75
+ export interface DonationDetail {
76
+ listener: "donation";
77
+ event: {
78
+ data: {
79
+ alert_type?: string;
80
+ currency?: string;
81
+ billing_system?: string;
82
+ id?: number;
83
+ amount_main?: number;
84
+ amount?: number;
85
+ username?: string;
86
+ message?: string;
87
+ [key: string]: unknown;
88
+ };
89
+ };
90
+ }
91
+ /** Все типы алертов (onEventReceived). */
92
+ export type AlertDetail = FollowerDetail | SubscriberLatestDetail | CommunityGiftPurchaseDetail | SubscriberDetail | CheerDetail | RaidDetail | DonationDetail;
93
+ /** Входящее событие (обобщённый вид для classifyEvent и т.д.). */
94
+ export interface IncomingDetail {
95
+ listener: string;
96
+ event?: {
97
+ type?: string;
98
+ provider?: string;
99
+ channel?: string;
100
+ activityGroup?: string;
101
+ activityId?: string;
102
+ _id?: string;
103
+ bulkGifted?: boolean;
104
+ sender?: string;
105
+ name?: string;
106
+ amount?: number;
107
+ tier?: string | number;
108
+ gifted?: boolean;
109
+ isCommunityGift?: boolean;
110
+ communityGifted?: boolean;
111
+ message?: string;
112
+ data?: Record<string, unknown>;
113
+ [key: string]: unknown;
114
+ };
115
+ }
116
+ export interface TierInfo {
117
+ tier: number;
118
+ tierText: string;
119
+ }
120
+ export type NormalizedType = "community-gift-anonymous" | "community-gift" | "self-sub" | "solo-sub-to-someone" | "sub-renewal";
121
+ export interface ClassifiedBase {
122
+ type: NormalizedType;
123
+ tier: number;
124
+ tierText: string;
125
+ }
126
+ export interface ClassifiedCommunityGiftPurchase extends ClassifiedBase {
127
+ type: "community-gift" | "community-gift-anonymous";
128
+ totalAmount: number;
129
+ recipients: string[];
130
+ sender?: string;
131
+ anonymousDisplayName?: string;
132
+ }
133
+ export interface ClassifiedRecipient extends ClassifiedBase {
134
+ _role: "recipient";
135
+ activityGroup: string;
136
+ recipient: string;
137
+ }
138
+ export interface ClassifiedSoloSub extends ClassifiedBase {
139
+ type: "solo-sub-to-someone";
140
+ sender: string;
141
+ recipient: string;
142
+ firstGiftInChannel?: boolean;
143
+ }
144
+ export interface ClassifiedSubRenewal extends ClassifiedBase {
145
+ type: "sub-renewal";
146
+ name: string;
147
+ months: number;
148
+ }
149
+ export interface ClassifiedSelfSub extends ClassifiedBase {
150
+ type: "self-sub";
151
+ name: string;
152
+ }
153
+ export type ClassifiedEvent = ClassifiedCommunityGiftPurchase | ClassifiedRecipient | ClassifiedSoloSub | ClassifiedSubRenewal | ClassifiedSelfSub | (ClassifiedBase & {
154
+ type: NormalizedType;
155
+ [key: string]: unknown;
156
+ });
157
+ export interface CacheLike {
158
+ _has(key: string): boolean;
159
+ _set(key: string, value: boolean): void;
160
+ }
161
+ export interface CacheSubsByType {
162
+ _has?(key: string): boolean;
163
+ _set?(key: string, value: boolean): void;
164
+ [type: string]: CacheLike | ((k: string) => boolean) | ((k: string, v: boolean) => void) | undefined;
165
+ }
166
+ export interface NormalizerOptions {
167
+ cacheSubs?: CacheSubsByType;
168
+ broadcasterLogin?: string;
169
+ }
170
+ //# sourceMappingURL=on-event-received.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-event-received.d.ts","sourceRoot":"","sources":["../../../src/root/types/on-event-received.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ export interface OnWidgetLoadEventDetails {
2
+ channel: Channel;
3
+ currency: Currency;
4
+ fieldData: FieldData;
5
+ overlay: Overlay;
6
+ recents: Recents;
7
+ session: Session;
8
+ }
9
+ export interface Channel {
10
+ /**
11
+ * StreamElements API Token (not JWT Token)
12
+ */
13
+ apiToken: string;
14
+ avatar: string;
15
+ id: string;
16
+ providerId: string;
17
+ username: string;
18
+ }
19
+ export interface Currency {
20
+ code: string;
21
+ name: string;
22
+ symbol: string;
23
+ }
24
+ export type FieldData = Record<string, unknown>;
25
+ export interface Overlay {
26
+ isEditorMode: boolean;
27
+ muted: boolean;
28
+ }
29
+ /** Base for recent (onWidgetLoad): follower / subscriber / cheer / raid */
30
+ export interface RecentItemBase {
31
+ name: string;
32
+ createdAt: string;
33
+ }
34
+ export interface RecentItemFollower extends RecentItemBase {
35
+ type: "follower";
36
+ }
37
+ export interface RecentItemSubscriber extends RecentItemBase {
38
+ type: "subscriber";
39
+ tier: string;
40
+ amount: number;
41
+ }
42
+ export interface RecentItemCheer extends RecentItemBase {
43
+ type: "cheer";
44
+ amount: number;
45
+ }
46
+ export interface RecentItemRaid extends RecentItemBase {
47
+ type: "raid";
48
+ amount: number;
49
+ }
50
+ export type RecentsItem = RecentItemFollower | RecentItemSubscriber | RecentItemCheer | RecentItemRaid;
51
+ export type Recents = RecentsItem[];
52
+ export interface SessionSettings {
53
+ autoReset: boolean;
54
+ calendar: boolean;
55
+ resetOnStart: boolean;
56
+ }
57
+ /** Запись в списке follower-recent / subscriber-recent / raid-recent / cheer-recent */
58
+ export interface SessionRecentItem {
59
+ name: string;
60
+ createdAt: string;
61
+ type: string;
62
+ amount?: number;
63
+ tier?: string;
64
+ }
65
+ /** Объект *-latest с полями name и amount (subscriber, cheer, tip, host, raid и т.д.) */
66
+ export interface SessionLatestNamedAmount {
67
+ name: string;
68
+ amount: number;
69
+ message?: string;
70
+ tier?: string;
71
+ sender?: string;
72
+ redemption?: string;
73
+ items?: unknown[];
74
+ }
75
+ /** Объект *-session / *-total и т.п. с полем count */
76
+ export interface SessionCountEntry {
77
+ count: number;
78
+ }
79
+ /** Объект *-goal / *-session (amount) и т.п. с полем amount */
80
+ export interface SessionAmountEntry {
81
+ amount: number;
82
+ }
83
+ /** Объект top-donation / top-donator */
84
+ export interface SessionTopEntry {
85
+ name: string;
86
+ amount: number;
87
+ }
88
+ /** channel-points-latest */
89
+ export interface SessionChannelPointsLatest {
90
+ name: string;
91
+ amount: number;
92
+ message: string;
93
+ redemption: string;
94
+ }
95
+ /** community-gift-latest */
96
+ export interface SessionCommunityGiftLatest {
97
+ name: string;
98
+ amount: number;
99
+ tier: string;
100
+ }
101
+ /** hypetrain-latest */
102
+ export interface SessionHypetrainLatest {
103
+ active: number;
104
+ amount: number;
105
+ level: number;
106
+ levelChanged: number;
107
+ name: string;
108
+ type: string;
109
+ }
110
+ /** merch-latest */
111
+ export interface SessionMerchLatest {
112
+ name: string;
113
+ amount: number;
114
+ items: unknown[];
115
+ }
116
+ /** Элемент массива purchase-latest */
117
+ export interface SessionPurchaseLatest {
118
+ name: string;
119
+ amount: number;
120
+ avatar: string;
121
+ message: string;
122
+ items: unknown[];
123
+ }
124
+ export type SessionDataEntry = SessionLatestNamedAmount | SessionCountEntry | SessionAmountEntry | SessionTopEntry | SessionChannelPointsLatest | SessionCommunityGiftLatest | SessionHypetrainLatest | SessionMerchLatest | SessionPurchaseLatest | SessionRecentItem[] | {
125
+ name: string;
126
+ } | {
127
+ level?: number;
128
+ percent?: number;
129
+ amount?: number;
130
+ } | Record<string, unknown>;
131
+ export interface Session {
132
+ data: Record<string, SessionDataEntry>;
133
+ settings: SessionSettings;
134
+ }
135
+ //# sourceMappingURL=on-widget-load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-widget-load.d.ts","sourceRoot":"","sources":["../../../src/root/types/on-widget-load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { EventDetail } from "./data/event-detail.js";
2
+ import type { WidgetLoadDetail } from "./data/widget-load.js";
3
+ declare global {
4
+ interface WindowEventMap {
5
+ onEventReceived: CustomEvent<EventDetail>;
6
+ onWidgetLoad: CustomEvent<WidgetLoadDetail>;
7
+ }
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=window-event-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window-event-map.d.ts","sourceRoot":"","sources":["../../src/root/window-event-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc;QACtB,eAAe,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,YAAY,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;KAC7C;CACF;AAED,OAAO,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@allior/wmake-streamelements-events",
3
+ "version": "0.0.1",
4
+ "description": "Twitch/StreamElements subscription event normalizer for widgets (alerts).",
5
+ "type": "module",
6
+ "types": "./dist/root/index.d.ts",
7
+ "main": "./dist/root/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/root/index.d.ts",
11
+ "import": "./dist/root/index.js"
12
+ },
13
+ "./react": {
14
+ "types": "./dist/react/index.d.ts",
15
+ "import": "./dist/react/index.js"
16
+ },
17
+ "./src/*": "./src/*"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "src",
22
+ "README.md",
23
+ "README_RU.md"
24
+ ],
25
+ "keywords": [
26
+ "wmake",
27
+ "events",
28
+ "twitch",
29
+ "subscriber",
30
+ "normalizer",
31
+ "streamelements"
32
+ ],
33
+ "author": "An1by",
34
+ "license": "ISC",
35
+ "peerDependencies": {
36
+ "react": "^18.0.0 || ^19.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "cross-env": "^10.1.0",
40
+ "rimraf": "^6.0.1",
41
+ "typescript": "^5.9.3"
42
+ },
43
+ "scripts": {
44
+ "build": "rimraf dist && vite build && cross-env VITE_IIFE_ENTRY=root vite build --config vite.iife.config.ts && cross-env VITE_IIFE_ENTRY=react vite build --config vite.iife.config.ts && tsc -p tsconfig.types.json",
45
+ "build:iife": "cross-env VITE_IIFE_ENTRY=root vite build --config vite.iife.config.ts && cross-env VITE_IIFE_ENTRY=react vite build --config vite.iife.config.ts",
46
+ "clean": "rimraf dist"
47
+ }
48
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./use-event-listener.js";
2
+ export * from "./use-on-event-received.js";
3
+ export * from "./use-on-widget-load.js";
@@ -0,0 +1,17 @@
1
+ import { type DependencyList, useEffect, useRef } from "react";
2
+ import type { WindowEventKey, WindowEventListener } from "../types/window-events.js";
3
+
4
+ export function useEventListener<K extends WindowEventKey>(
5
+ eventName: K,
6
+ handler: WindowEventListener<K>,
7
+ deps: DependencyList = [],
8
+ ): void {
9
+ const callbackRef = useRef<WindowEventListener<K>>(handler);
10
+ callbackRef.current = handler;
11
+
12
+ useEffect(() => {
13
+ const fn = (ev: WindowEventMap[K]) => callbackRef.current.call(window, ev);
14
+ window.addEventListener(eventName, fn as EventListener);
15
+ return () => window.removeEventListener(eventName, fn as EventListener);
16
+ }, [eventName, ...deps]);
17
+ }
@@ -0,0 +1,206 @@
1
+ import type { DependencyList } from "react";
2
+ import type { WindowEventListener } from "../types/window-events";
3
+ import type {
4
+ CheerDetail,
5
+ CommunityGiftPurchaseDetail,
6
+ DonationDetail,
7
+ FollowerDetail,
8
+ RaidDetail,
9
+ SubscriberDetail,
10
+ SubscriberLatestDetail,
11
+ } from "@/root/types/on-event-received";
12
+ import type { WidgetButtonDetail } from "@/root/data/event-detail";
13
+ import type { MessageEvent } from "@/root/message";
14
+ import { useEventListener } from "./use-event-listener";
15
+
16
+ /** Проверка, что detail — сообщение чата (listener "message"). */
17
+ export function isMessageEvent(d: unknown): d is MessageEvent {
18
+ return (d as { listener?: string }).listener === "message";
19
+ }
20
+
21
+ /** Проверка, что detail — FollowerDetail (follower-latest). */
22
+ export function isFollowerDetail(d: unknown): d is FollowerDetail {
23
+ return (d as { listener?: string }).listener === "follower-latest";
24
+ }
25
+
26
+ /** Проверка, что detail — CommunityGiftPurchaseDetail. */
27
+ export function isCommunityGiftPurchaseDetail(
28
+ d: unknown,
29
+ ): d is CommunityGiftPurchaseDetail {
30
+ const x = d as { listener?: string; event?: { type?: string } };
31
+ return x.listener === "event" && x.event?.type === "communityGiftPurchase";
32
+ }
33
+
34
+ /** Проверка, что detail — SubscriberLatestDetail. */
35
+ export function isSubscriberLatestDetail(
36
+ d: unknown,
37
+ ): d is SubscriberLatestDetail {
38
+ return (d as { listener?: string }).listener === "subscriber-latest";
39
+ }
40
+
41
+ /** Проверка, что detail — SubscriberDetail (event type subscriber). */
42
+ export function isSubscriberDetail(d: unknown): d is SubscriberDetail {
43
+ const x = d as { listener?: string; event?: { type?: string } };
44
+ return x.listener === "event" && x.event?.type === "subscriber";
45
+ }
46
+
47
+ /** Проверка, что detail — CheerDetail. */
48
+ export function isCheerDetail(d: unknown): d is CheerDetail {
49
+ return (d as { listener?: string }).listener === "cheer-latest";
50
+ }
51
+
52
+ /** Проверка, что detail — RaidDetail. */
53
+ export function isRaidDetail(d: unknown): d is RaidDetail {
54
+ return (d as { listener?: string }).listener === "raid-latest";
55
+ }
56
+
57
+ /** Проверка, что detail — DonationDetail. */
58
+ export function isDonationDetail(d: unknown): d is DonationDetail {
59
+ return (d as { listener?: string }).listener === "donation";
60
+ }
61
+
62
+ /** Проверка, что detail — WidgetButtonDetail (event:test, widget-button). */
63
+ export function isWidgetButtonDetail(d: unknown): d is WidgetButtonDetail {
64
+ const x = d as { listener?: string; event?: { listener?: string } };
65
+ return x.listener === "event:test" && x.event?.listener === "widget-button";
66
+ }
67
+
68
+ /** Общий хук на любое событие onEventReceived. */
69
+ export function useOnEventReceived(
70
+ handler: WindowEventListener<"onEventReceived">,
71
+ deps: DependencyList = [],
72
+ ): void {
73
+ useEventListener("onEventReceived", handler, deps);
74
+ }
75
+
76
+ /** Хук на сообщение чата (listener "message"). */
77
+ export function useOnMessageReceived(
78
+ handler: (ev: CustomEvent<MessageEvent>) => void,
79
+ deps: DependencyList = [],
80
+ ): void {
81
+ useEventListener(
82
+ "onEventReceived",
83
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
84
+ if (isMessageEvent(ev.detail)) handler(ev as CustomEvent<MessageEvent>);
85
+ },
86
+ deps,
87
+ );
88
+ }
89
+
90
+ /** Хук на нажатие кнопки виджета (event:test, widget-button). В detail.event.field — имя поля кнопки. */
91
+ export function useOnWidgetButtonReceived(
92
+ handler: (ev: CustomEvent<WidgetButtonDetail>) => void,
93
+ deps: DependencyList = [],
94
+ ): void {
95
+ useEventListener(
96
+ "onEventReceived",
97
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
98
+ if (isWidgetButtonDetail(ev.detail))
99
+ handler(ev as CustomEvent<WidgetButtonDetail>);
100
+ },
101
+ deps,
102
+ );
103
+ }
104
+
105
+ /** Хук на алерт follower-latest. */
106
+ export function useOnFollowerReceived(
107
+ handler: (ev: CustomEvent<FollowerDetail>) => void,
108
+ deps: DependencyList = [],
109
+ ): void {
110
+ useEventListener(
111
+ "onEventReceived",
112
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
113
+ if (isFollowerDetail(ev.detail))
114
+ handler(ev as CustomEvent<FollowerDetail>);
115
+ },
116
+ deps,
117
+ );
118
+ }
119
+
120
+ /** Хук на алерт communityGiftPurchase. */
121
+ export function useOnCommunityGiftPurchaseReceived(
122
+ handler: (ev: CustomEvent<CommunityGiftPurchaseDetail>) => void,
123
+ deps: DependencyList = [],
124
+ ): void {
125
+ useEventListener(
126
+ "onEventReceived",
127
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
128
+ if (isCommunityGiftPurchaseDetail(ev.detail))
129
+ handler(ev as CustomEvent<CommunityGiftPurchaseDetail>);
130
+ },
131
+ deps,
132
+ );
133
+ }
134
+
135
+ /** Хук на алерт subscriber-latest. */
136
+ export function useOnSubscriberLatestReceived(
137
+ handler: (ev: CustomEvent<SubscriberLatestDetail>) => void,
138
+ deps: DependencyList = [],
139
+ ): void {
140
+ useEventListener(
141
+ "onEventReceived",
142
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
143
+ if (isSubscriberLatestDetail(ev.detail))
144
+ handler(ev as CustomEvent<SubscriberLatestDetail>);
145
+ },
146
+ deps,
147
+ );
148
+ }
149
+
150
+ /** Хук на алерт subscriber (self / подарок / продление). */
151
+ export function useOnSubscriberReceived(
152
+ handler: (ev: CustomEvent<SubscriberDetail>) => void,
153
+ deps: DependencyList = [],
154
+ ): void {
155
+ useEventListener(
156
+ "onEventReceived",
157
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
158
+ if (isSubscriberDetail(ev.detail))
159
+ handler(ev as CustomEvent<SubscriberDetail>);
160
+ },
161
+ deps,
162
+ );
163
+ }
164
+
165
+ /** Хук на алерт cheer-latest (биты). */
166
+ export function useOnCheerReceived(
167
+ handler: (ev: CustomEvent<CheerDetail>) => void,
168
+ deps: DependencyList = [],
169
+ ): void {
170
+ useEventListener(
171
+ "onEventReceived",
172
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
173
+ if (isCheerDetail(ev.detail)) handler(ev as CustomEvent<CheerDetail>);
174
+ },
175
+ deps,
176
+ );
177
+ }
178
+
179
+ /** Хук на алерт raid-latest. */
180
+ export function useOnRaidReceived(
181
+ handler: (ev: CustomEvent<RaidDetail>) => void,
182
+ deps: DependencyList = [],
183
+ ): void {
184
+ useEventListener(
185
+ "onEventReceived",
186
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
187
+ if (isRaidDetail(ev.detail)) handler(ev as CustomEvent<RaidDetail>);
188
+ },
189
+ deps,
190
+ );
191
+ }
192
+
193
+ /** Хук на алерт donation. */
194
+ export function useOnDonationReceived(
195
+ handler: (ev: CustomEvent<DonationDetail>) => void,
196
+ deps: DependencyList = [],
197
+ ): void {
198
+ useEventListener(
199
+ "onEventReceived",
200
+ function (this: Window, ev: WindowEventMap["onEventReceived"]) {
201
+ if (isDonationDetail(ev.detail))
202
+ handler(ev as CustomEvent<DonationDetail>);
203
+ },
204
+ deps,
205
+ );
206
+ }
@@ -0,0 +1,15 @@
1
+ import type { DependencyList } from "react";
2
+ import type { WindowEventListener } from "../types/window-events.js";
3
+ import type { OnWidgetLoadEventDetails } from "@/root/types/on-widget-load";
4
+ import { useEventListener } from "./use-event-listener.js";
5
+
6
+ export function useOnWidgetLoad(
7
+ handler: (ev: CustomEvent<OnWidgetLoadEventDetails>) => void,
8
+ deps: DependencyList = [],
9
+ ): void {
10
+ useEventListener(
11
+ "onWidgetLoad",
12
+ handler as WindowEventListener<"onWidgetLoad">,
13
+ deps,
14
+ );
15
+ }
@@ -0,0 +1,3 @@
1
+ export * from "../root";
2
+ export * from "./hooks";
3
+ export * from "./types";
@@ -0,0 +1 @@
1
+ export * from "./window-events";
@@ -0,0 +1,6 @@
1
+ export type WindowEventKey = keyof WindowEventMap;
2
+
3
+ export type WindowEventListener<K extends WindowEventKey> = (
4
+ this: Window,
5
+ ev: WindowEventMap[K],
6
+ ) => unknown;