@copilotkitnext/angular 1.52.0-next.8 → 1.52.0
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.
- package/README.md +225 -432
- package/dist/README.md +225 -432
- package/dist/fesm2022/copilotkitnext-angular.mjs +312 -161
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/lib/agent.d.ts +20 -20
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +46 -46
- package/dist/lib/components/chat/copilot-chat-message-view.d.ts +126 -126
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +23 -23
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +6 -6
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +6 -6
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +18 -18
- package/dist/lib/components/chat/copilot-chat-view.d.ts +54 -54
- package/dist/lib/components/chat/copilot-chat.d.ts +18 -18
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/copilotkit.d.ts +6 -1
- package/dist/lib/license-watermark.d.ts +1 -0
- package/dist/lib/render-tool-calls.d.ts +23 -23
- package/dist/styles.css +3 -0
- package/package.json +18 -18
- package/dist/esm2022/copilotkitnext-angular.mjs +0 -5
- package/dist/esm2022/index.mjs +0 -2
- package/dist/esm2022/lib/agent-context.mjs +0 -25
- package/dist/esm2022/lib/agent.mjs +0 -73
- package/dist/esm2022/lib/chat-config.mjs +0 -35
- package/dist/esm2022/lib/chat-state.mjs +0 -18
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +0 -344
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +0 -260
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +0 -22
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.mjs +0 -415
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +0 -196
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +0 -299
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +0 -39
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +0 -634
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +0 -27
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +0 -269
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +0 -139
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +0 -36
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +0 -20
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +0 -203
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +0 -118
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +0 -182
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +0 -28
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +0 -25
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +0 -328
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +0 -48
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +0 -41
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +0 -19
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +0 -96
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +0 -89
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +0 -456
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +0 -404
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +0 -165
- package/dist/esm2022/lib/config.mjs +0 -9
- package/dist/esm2022/lib/copilotkit.mjs +0 -125
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +0 -130
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +0 -170
- package/dist/esm2022/lib/directives/tooltip.mjs +0 -217
- package/dist/esm2022/lib/human-in-the-loop.mjs +0 -19
- package/dist/esm2022/lib/render-tool-calls.mjs +0 -167
- package/dist/esm2022/lib/resize-observer.mjs +0 -152
- package/dist/esm2022/lib/scroll-position.mjs +0 -123
- package/dist/esm2022/lib/slots/copilot-slot.mjs +0 -156
- package/dist/esm2022/lib/slots/index.mjs +0 -4
- package/dist/esm2022/lib/slots/slot.types.mjs +0 -6
- package/dist/esm2022/lib/slots/slot.utils.mjs +0 -235
- package/dist/esm2022/lib/tools.mjs +0 -31
- package/dist/esm2022/lib/utils.mjs +0 -10
- package/dist/esm2022/public-api.mjs +0 -48
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { NgComponentOutlet } from "@angular/common";
|
|
2
|
-
import { Component, inject, input } from "@angular/core";
|
|
3
|
-
import { CopilotKit } from "./copilotkit";
|
|
4
|
-
import { partialJSONParse } from "@copilotkitnext/shared";
|
|
5
|
-
import { HumanInTheLoop } from "./human-in-the-loop";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class RenderToolCalls {
|
|
8
|
-
#copilotKit = inject(CopilotKit);
|
|
9
|
-
#hitl = inject(HumanInTheLoop);
|
|
10
|
-
message = input.required();
|
|
11
|
-
messages = input.required();
|
|
12
|
-
isLoading = input(false);
|
|
13
|
-
pickRenderer(name) {
|
|
14
|
-
const messageAgentId = this.message()
|
|
15
|
-
.agentId;
|
|
16
|
-
const renderers = this.#copilotKit.toolCallRenderConfigs();
|
|
17
|
-
const clientTools = this.#copilotKit.clientToolCallRenderConfigs();
|
|
18
|
-
const humanInTheLoopTools = this.#copilotKit.humanInTheLoopToolRenderConfigs();
|
|
19
|
-
const renderer = renderers.find((candidate) => candidate.name === name &&
|
|
20
|
-
(candidate.agentId === undefined ||
|
|
21
|
-
candidate.agentId === messageAgentId));
|
|
22
|
-
if (renderer)
|
|
23
|
-
return { type: "renderer", config: renderer };
|
|
24
|
-
const clientTool = clientTools.find((candidate) => candidate.name === name &&
|
|
25
|
-
(candidate.agentId === undefined ||
|
|
26
|
-
candidate.agentId === messageAgentId));
|
|
27
|
-
if (clientTool)
|
|
28
|
-
return { type: "clientTool", config: clientTool };
|
|
29
|
-
const humanInTheLoopTool = humanInTheLoopTools.find((candidate) => candidate.name === name &&
|
|
30
|
-
(candidate.agentId === undefined ||
|
|
31
|
-
candidate.agentId === messageAgentId));
|
|
32
|
-
if (humanInTheLoopTool)
|
|
33
|
-
return { type: "humanInTheLoopTool", config: humanInTheLoopTool };
|
|
34
|
-
const starRenderer = renderers.find((candidate) => candidate.name === "*");
|
|
35
|
-
if (starRenderer)
|
|
36
|
-
return { type: "renderer", config: starRenderer };
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
buildToolCall(toolCall) {
|
|
40
|
-
const args = partialJSONParse(toolCall.function.arguments);
|
|
41
|
-
const message = this.#getToolMessage(toolCall.id);
|
|
42
|
-
if (message) {
|
|
43
|
-
return {
|
|
44
|
-
args,
|
|
45
|
-
status: "complete",
|
|
46
|
-
result: message.content,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
else if (this.isLoading()) {
|
|
50
|
-
return {
|
|
51
|
-
args,
|
|
52
|
-
status: "in-progress",
|
|
53
|
-
result: undefined,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return {
|
|
58
|
-
args,
|
|
59
|
-
status: "executing",
|
|
60
|
-
result: undefined,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
buildHumanInTheLoopToolCall(toolCall) {
|
|
65
|
-
const args = partialJSONParse(toolCall.function.arguments);
|
|
66
|
-
const message = this.#getToolMessage(toolCall.id);
|
|
67
|
-
const respond = (result) => {
|
|
68
|
-
this.#hitl.addResult(toolCall.id, toolCall.function.name, result);
|
|
69
|
-
};
|
|
70
|
-
if (message) {
|
|
71
|
-
return {
|
|
72
|
-
args,
|
|
73
|
-
status: "complete",
|
|
74
|
-
result: message.content,
|
|
75
|
-
respond,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
else if (this.isLoading()) {
|
|
79
|
-
return {
|
|
80
|
-
args,
|
|
81
|
-
status: "in-progress",
|
|
82
|
-
result: undefined,
|
|
83
|
-
respond,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
return {
|
|
88
|
-
args,
|
|
89
|
-
status: "executing",
|
|
90
|
-
result: undefined,
|
|
91
|
-
respond,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
#getToolMessage(toolCallId) {
|
|
96
|
-
const message = this.messages().find((m) => m.role === "tool" && m.toolCallId === toolCallId);
|
|
97
|
-
return message;
|
|
98
|
-
}
|
|
99
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RenderToolCalls, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
100
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RenderToolCalls, isStandalone: true, selector: "copilot-render-tool-calls", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
101
|
-
@for (toolCall of message().toolCalls ?? []; track toolCall.id) {
|
|
102
|
-
@let renderConfig = pickRenderer(toolCall.function.name);
|
|
103
|
-
@if (
|
|
104
|
-
renderConfig &&
|
|
105
|
-
renderConfig.type !== "humanInTheLoopTool" &&
|
|
106
|
-
renderConfig.config.component
|
|
107
|
-
) {
|
|
108
|
-
<ng-container
|
|
109
|
-
*ngComponentOutlet="
|
|
110
|
-
renderConfig.config.component;
|
|
111
|
-
inputs: { toolCall: buildToolCall(toolCall) }
|
|
112
|
-
"
|
|
113
|
-
/>
|
|
114
|
-
}
|
|
115
|
-
@if (
|
|
116
|
-
renderConfig &&
|
|
117
|
-
renderConfig.type === "humanInTheLoopTool" &&
|
|
118
|
-
renderConfig.config.component
|
|
119
|
-
) {
|
|
120
|
-
<ng-container
|
|
121
|
-
*ngComponentOutlet="
|
|
122
|
-
renderConfig.config.component;
|
|
123
|
-
inputs: { toolCall: buildHumanInTheLoopToolCall(toolCall) }
|
|
124
|
-
"
|
|
125
|
-
/>
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] });
|
|
129
|
-
}
|
|
130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RenderToolCalls, decorators: [{
|
|
131
|
-
type: Component,
|
|
132
|
-
args: [{
|
|
133
|
-
selector: "copilot-render-tool-calls",
|
|
134
|
-
standalone: true,
|
|
135
|
-
imports: [NgComponentOutlet],
|
|
136
|
-
template: `
|
|
137
|
-
@for (toolCall of message().toolCalls ?? []; track toolCall.id) {
|
|
138
|
-
@let renderConfig = pickRenderer(toolCall.function.name);
|
|
139
|
-
@if (
|
|
140
|
-
renderConfig &&
|
|
141
|
-
renderConfig.type !== "humanInTheLoopTool" &&
|
|
142
|
-
renderConfig.config.component
|
|
143
|
-
) {
|
|
144
|
-
<ng-container
|
|
145
|
-
*ngComponentOutlet="
|
|
146
|
-
renderConfig.config.component;
|
|
147
|
-
inputs: { toolCall: buildToolCall(toolCall) }
|
|
148
|
-
"
|
|
149
|
-
/>
|
|
150
|
-
}
|
|
151
|
-
@if (
|
|
152
|
-
renderConfig &&
|
|
153
|
-
renderConfig.type === "humanInTheLoopTool" &&
|
|
154
|
-
renderConfig.config.component
|
|
155
|
-
) {
|
|
156
|
-
<ng-container
|
|
157
|
-
*ngComponentOutlet="
|
|
158
|
-
renderConfig.config.component;
|
|
159
|
-
inputs: { toolCall: buildHumanInTheLoopToolCall(toolCall) }
|
|
160
|
-
"
|
|
161
|
-
/>
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
`,
|
|
165
|
-
}]
|
|
166
|
-
}] });
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXRvb2wtY2FsbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci10b29sLWNhbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU96RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBUTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFzRHJELE1BQU0sT0FBTyxlQUFlO0lBQ2pCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztJQUM3QyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYSxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFakMsWUFBWSxDQUFDLElBQVk7UUFJakMsTUFBTSxjQUFjLEdBQUksSUFBSSxDQUFDLE9BQU8sRUFBZ0M7YUFDakUsT0FBTyxDQUFDO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuRSxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFckQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FDN0IsQ0FBQyxT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LE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQVE7Z0JBQ3hCLE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDNUIsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixNQUFNLEVBQUUsU0FBUztnQkFDakIsT0FBTzthQUNSLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDbEMsQ0FBQyxDQUFDLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FDMUUsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7d0dBcEhVLGVBQWU7NEZBQWYsZUFBZSxrZUE5QmhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJULDREQTdCUyxpQkFBaUI7OzRGQStCaEIsZUFBZTtrQkFsQzNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NvbXBvbmVudE91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBBc3Npc3RhbnRNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBUb29sQ2FsbCxcbiAgVG9vbE1lc3NhZ2UsXG59IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5pbXBvcnQgeyBDb3BpbG90S2l0IH0gZnJvbSBcIi4vY29waWxvdGtpdFwiO1xuaW1wb3J0IHtcbiAgRnJvbnRlbmRUb29sQ29uZmlnLFxuICBIdW1hbkluVGhlTG9vcFRvb2xDYWxsLFxuICBIdW1hbkluVGhlTG9vcENvbmZpZyxcbiAgQW5ndWxhclRvb2xDYWxsLFxuICBSZW5kZXJUb29sQ2FsbENvbmZpZyxcbn0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7IHBhcnRpYWxKU09OUGFyc2UgfSBmcm9tIFwiQGNvcGlsb3RraXRuZXh0L3NoYXJlZFwiO1xuaW1wb3J0IHsgSHVtYW5JblRoZUxvb3AgfSBmcm9tIFwiLi9odW1hbi1pbi10aGUtbG9vcFwiO1xuXG50eXBlIFJlbmRlcmVyVG9vbENhbGxIYW5kbGVyID0ge1xuICB0eXBlOiBcInJlbmRlcmVyXCI7XG4gIGNvbmZpZzogUmVuZGVyVG9vbENhbGxDb25maWc7XG59O1xudHlwZSBDbGllbnRUb29sQ2FsbEhhbmRsZXIgPSB7XG4gIHR5cGU6IFwiY2xpZW50VG9vbFwiO1xuICBjb25maWc6IEZyb250ZW5kVG9vbENvbmZpZztcbn07XG50eXBlIEh1bWFuSW5UaGVMb29wVG9vbENhbGxIYW5kbGVyID0ge1xuICB0eXBlOiBcImh1bWFuSW5UaGVMb29wVG9vbFwiO1xuICBjb25maWc6IEh1bWFuSW5UaGVMb29wQ29uZmlnO1xufTtcblxudHlwZSBUb29sQ2FsbEhhbmRsZXIgPVxuICB8IFJlbmRlcmVyVG9vbENhbGxIYW5kbGVyXG4gIHwgQ2xpZW50VG9vbENhbGxIYW5kbGVyXG4gIHwgSHVtYW5JblRoZUxvb3BUb29sQ2FsbEhhbmRsZXI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb3BpbG90LXJlbmRlci10b29sLWNhbGxzXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0NvbXBvbmVudE91dGxldF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGZvciAodG9vbENhbGwgb2YgbWVzc2FnZSgpLnRvb2xDYWxscyA/PyBbXTsgdHJhY2sgdG9vbENhbGwuaWQpIHtcbiAgICAgIEBsZXQgcmVuZGVyQ29uZmlnID0gcGlja1JlbmRlcmVyKHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUpO1xuICAgICAgQGlmIChcbiAgICAgICAgcmVuZGVyQ29uZmlnICYmXG4gICAgICAgIHJlbmRlckNvbmZpZy50eXBlICE9PSBcImh1bWFuSW5UaGVMb29wVG9vbFwiICYmXG4gICAgICAgIHJlbmRlckNvbmZpZy5jb25maWcuY29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgcmVuZGVyQ29uZmlnLmNvbmZpZy5jb21wb25lbnQ7XG4gICAgICAgICAgICBpbnB1dHM6IHsgdG9vbENhbGw6IGJ1aWxkVG9vbENhbGwodG9vbENhbGwpIH1cbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgICAgQGlmIChcbiAgICAgICAgcmVuZGVyQ29uZmlnICYmXG4gICAgICAgIHJlbmRlckNvbmZpZy50eXBlID09PSBcImh1bWFuSW5UaGVMb29wVG9vbFwiICYmXG4gICAgICAgIHJlbmRlckNvbmZpZy5jb25maWcuY29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgcmVuZGVyQ29uZmlnLmNvbmZpZy5jb21wb25lbnQ7XG4gICAgICAgICAgICBpbnB1dHM6IHsgdG9vbENhbGw6IGJ1aWxkSHVtYW5JblRoZUxvb3BUb29sQ2FsbCh0b29sQ2FsbCkgfVxuICAgICAgICAgIFwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgfVxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBSZW5kZXJUb29sQ2FsbHMge1xuICByZWFkb25seSAjY29waWxvdEtpdCA9IGluamVjdChDb3BpbG90S2l0KTtcbiAgcmVhZG9ubHkgI2hpdGwgPSBpbmplY3QoSHVtYW5JblRoZUxvb3ApO1xuICByZWFkb25seSBtZXNzYWdlID0gaW5wdXQucmVxdWlyZWQ8QXNzaXN0YW50TWVzc2FnZT4oKTtcbiAgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbnB1dC5yZXF1aXJlZDxNZXNzYWdlW10+KCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcGlja1JlbmRlcmVyKG5hbWU6IHN0cmluZyk6IFRvb2xDYWxsSGFuZGxlciB8IHVuZGVmaW5lZCB7XG4gICAgdHlwZSBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50ID0gQXNzaXN0YW50TWVzc2FnZSAmIHtcbiAgICAgIGFnZW50SWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlQWdlbnRJZCA9ICh0aGlzLm1lc3NhZ2UoKSBhcyBBc3Npc3RhbnRNZXNzYWdlV2l0aEFnZW50KVxuICAgICAgLmFnZW50SWQ7XG4gICAgY29uc3QgcmVuZGVyZXJzID0gdGhpcy4jY29waWxvdEtpdC50b29sQ2FsbFJlbmRlckNvbmZpZ3MoKTtcbiAgICBjb25zdCBjbGllbnRUb29scyA9IHRoaXMuI2NvcGlsb3RLaXQuY2xpZW50VG9vbENhbGxSZW5kZXJDb25maWdzKCk7XG4gICAgY29uc3QgaHVtYW5JblRoZUxvb3BUb29scyA9XG4gICAgICB0aGlzLiNjb3BpbG90S2l0Lmh1bWFuSW5UaGVMb29wVG9vbFJlbmRlckNvbmZpZ3MoKTtcblxuICAgIGNvbnN0IHJlbmRlcmVyID0gcmVuZGVyZXJzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSAmJlxuICAgICAgICAoY2FuZGlkYXRlLmFnZW50SWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNhbmRpZGF0ZS5hZ2VudElkID09PSBtZXNzYWdlQWdlbnRJZCksXG4gICAgKTtcblxuICAgIGlmIChyZW5kZXJlcikgcmV0dXJuIHsgdHlwZTogXCJyZW5kZXJlclwiLCBjb25maWc6IHJlbmRlcmVyIH07XG5cbiAgICBjb25zdCBjbGllbnRUb29sID0gY2xpZW50VG9vbHMuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgIGNhbmRpZGF0ZS5uYW1lID09PSBuYW1lICYmXG4gICAgICAgIChjYW5kaWRhdGUuYWdlbnRJZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgY2FuZGlkYXRlLmFnZW50SWQgPT09IG1lc3NhZ2VBZ2VudElkKSxcbiAgICApO1xuICAgIGlmIChjbGllbnRUb29sKSByZXR1cm4geyB0eXBlOiBcImNsaWVudFRvb2xcIiwgY29uZmlnOiBjbGllbnRUb29sIH07XG5cbiAgICBjb25zdCBodW1hbkluVGhlTG9vcFRvb2wgPSBodW1hbkluVGhlTG9vcFRvb2xzLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PlxuICAgICAgICBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSAmJlxuICAgICAgICAoY2FuZGlkYXRlLmFnZW50SWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNhbmRpZGF0ZS5hZ2VudElkID09PSBtZXNzYWdlQWdlbnRJZCksXG4gICAgKTtcbiAgICBpZiAoaHVtYW5JblRoZUxvb3BUb29sKVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJodW1hbkluVGhlTG9vcFRvb2xcIiwgY29uZmlnOiBodW1hbkluVGhlTG9vcFRvb2wgfTtcblxuICAgIGNvbnN0IHN0YXJSZW5kZXJlciA9IHJlbmRlcmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBcIipcIik7XG4gICAgaWYgKHN0YXJSZW5kZXJlcikgcmV0dXJuIHsgdHlwZTogXCJyZW5kZXJlclwiLCBjb25maWc6IHN0YXJSZW5kZXJlciB9O1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFRvb2xDYWxsPEFyZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdG9vbENhbGw6IFRvb2xDYWxsLFxuICApOiBBbmd1bGFyVG9vbENhbGw8QXJncz4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwYXJ0aWFsSlNPTlBhcnNlKHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuI2dldFRvb2xNZXNzYWdlKHRvb2xDYWxsLmlkKTtcblxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzLFxuICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVcIixcbiAgICAgICAgcmVzdWx0OiBtZXNzYWdlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImluLXByb2dyZXNzXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImV4ZWN1dGluZ1wiLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkSHVtYW5JblRoZUxvb3BUb29sQ2FsbDxBcmdzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHRvb2xDYWxsOiBUb29sQ2FsbCxcbiAgKTogSHVtYW5JblRoZUxvb3BUb29sQ2FsbDxBcmdzPiB7XG4gICAgY29uc3QgYXJncyA9IHBhcnRpYWxKU09OUGFyc2UodG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzKTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy4jZ2V0VG9vbE1lc3NhZ2UodG9vbENhbGwuaWQpO1xuICAgIGNvbnN0IHJlc3BvbmQgPSAocmVzdWx0OiB1bmtub3duKSA9PiB7XG4gICAgICB0aGlzLiNoaXRsLmFkZFJlc3VsdCh0b29sQ2FsbC5pZCwgdG9vbENhbGwuZnVuY3Rpb24ubmFtZSwgcmVzdWx0KTtcbiAgICB9O1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXR1czogXCJjb21wbGV0ZVwiLFxuICAgICAgICByZXN1bHQ6IG1lc3NhZ2UuY29udGVudCEsXG4gICAgICAgIHJlc3BvbmQsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImluLXByb2dyZXNzXCIsXG4gICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICByZXNwb25kLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhdHVzOiBcImV4ZWN1dGluZ1wiLFxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVzcG9uZCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgI2dldFRvb2xNZXNzYWdlKHRvb2xDYWxsSWQ6IHN0cmluZyk6IFRvb2xNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlcygpLmZpbmQoXG4gICAgICAobSk6IG0gaXMgVG9vbE1lc3NhZ2UgPT4gbS5yb2xlID09PSBcInRvb2xcIiAmJiBtLnRvb2xDYWxsSWQgPT09IHRvb2xDYWxsSWQsXG4gICAgKTtcblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG59XG4iXX0=
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { Injectable, ElementRef } from "@angular/core";
|
|
2
|
-
import { Subject, BehaviorSubject } from "rxjs";
|
|
3
|
-
import { debounceTime, takeUntil, distinctUntilChanged } from "rxjs/operators";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class ResizeObserverService {
|
|
6
|
-
ngZone;
|
|
7
|
-
destroy$ = new Subject();
|
|
8
|
-
observers = new Map();
|
|
9
|
-
resizeStates = new Map();
|
|
10
|
-
resizeTimeouts = new Map();
|
|
11
|
-
constructor(ngZone) {
|
|
12
|
-
this.ngZone = ngZone;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Observe element resize with debouncing and resizing state
|
|
16
|
-
* @param element Element to observe
|
|
17
|
-
* @param debounceMs Debounce time (default 250ms)
|
|
18
|
-
* @param resizingDurationMs How long to show "isResizing" state (default 250ms)
|
|
19
|
-
*/
|
|
20
|
-
observeElement(element, debounceMs = 0, resizingDurationMs = 250) {
|
|
21
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
22
|
-
// Return existing observer if already observing
|
|
23
|
-
if (this.resizeStates.has(el)) {
|
|
24
|
-
return this.resizeStates.get(el).asObservable();
|
|
25
|
-
}
|
|
26
|
-
// Create new subject for this element
|
|
27
|
-
const resizeState$ = new BehaviorSubject({
|
|
28
|
-
width: el.offsetWidth,
|
|
29
|
-
height: el.offsetHeight,
|
|
30
|
-
isResizing: false,
|
|
31
|
-
});
|
|
32
|
-
this.resizeStates.set(el, resizeState$);
|
|
33
|
-
// Create ResizeObserver
|
|
34
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
35
|
-
if (entries.length === 0)
|
|
36
|
-
return;
|
|
37
|
-
const entry = entries[0];
|
|
38
|
-
if (!entry)
|
|
39
|
-
return;
|
|
40
|
-
const { width, height } = entry.contentRect;
|
|
41
|
-
this.ngZone.run(() => {
|
|
42
|
-
// Clear existing timeout
|
|
43
|
-
const existingTimeout = this.resizeTimeouts.get(el);
|
|
44
|
-
if (existingTimeout) {
|
|
45
|
-
clearTimeout(existingTimeout);
|
|
46
|
-
}
|
|
47
|
-
// Update state with isResizing = true
|
|
48
|
-
resizeState$.next({
|
|
49
|
-
width,
|
|
50
|
-
height,
|
|
51
|
-
isResizing: true,
|
|
52
|
-
});
|
|
53
|
-
// Set timeout to clear isResizing flag
|
|
54
|
-
if (resizingDurationMs > 0) {
|
|
55
|
-
const timeout = window.setTimeout(() => {
|
|
56
|
-
resizeState$.next({
|
|
57
|
-
width,
|
|
58
|
-
height,
|
|
59
|
-
isResizing: false,
|
|
60
|
-
});
|
|
61
|
-
this.resizeTimeouts.delete(el);
|
|
62
|
-
}, resizingDurationMs);
|
|
63
|
-
this.resizeTimeouts.set(el, timeout);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
// If no duration, immediately set isResizing to false
|
|
67
|
-
resizeState$.next({
|
|
68
|
-
width,
|
|
69
|
-
height,
|
|
70
|
-
isResizing: false,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
// Start observing
|
|
76
|
-
resizeObserver.observe(el);
|
|
77
|
-
this.observers.set(el, resizeObserver);
|
|
78
|
-
// Return observable with debouncing if specified
|
|
79
|
-
const observable = resizeState$.asObservable().pipe(debounceMs > 0 ? debounceTime(debounceMs) : (source) => source, distinctUntilChanged((a, b) => a.width === b.width &&
|
|
80
|
-
a.height === b.height &&
|
|
81
|
-
a.isResizing === b.isResizing), takeUntil(this.destroy$));
|
|
82
|
-
return observable;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Stop observing an element
|
|
86
|
-
* @param element Element to stop observing
|
|
87
|
-
*/
|
|
88
|
-
unobserve(element) {
|
|
89
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
90
|
-
// Clear timeout if exists
|
|
91
|
-
const timeout = this.resizeTimeouts.get(el);
|
|
92
|
-
if (timeout) {
|
|
93
|
-
clearTimeout(timeout);
|
|
94
|
-
this.resizeTimeouts.delete(el);
|
|
95
|
-
}
|
|
96
|
-
// Disconnect observer
|
|
97
|
-
const observer = this.observers.get(el);
|
|
98
|
-
if (observer) {
|
|
99
|
-
observer.disconnect();
|
|
100
|
-
this.observers.delete(el);
|
|
101
|
-
}
|
|
102
|
-
// Complete and remove subject
|
|
103
|
-
const subject = this.resizeStates.get(el);
|
|
104
|
-
if (subject) {
|
|
105
|
-
subject.complete();
|
|
106
|
-
this.resizeStates.delete(el);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Get current size of element
|
|
111
|
-
* @param element Element to measure
|
|
112
|
-
*/
|
|
113
|
-
getCurrentSize(element) {
|
|
114
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
115
|
-
return {
|
|
116
|
-
width: el.offsetWidth,
|
|
117
|
-
height: el.offsetHeight,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Get current resize state of element
|
|
122
|
-
* @param element Element to check
|
|
123
|
-
*/
|
|
124
|
-
getCurrentState(element) {
|
|
125
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
126
|
-
const subject = this.resizeStates.get(el);
|
|
127
|
-
return subject ? subject.value : null;
|
|
128
|
-
}
|
|
129
|
-
ngOnDestroy() {
|
|
130
|
-
// Clear all timeouts
|
|
131
|
-
this.resizeTimeouts.forEach((timeout) => clearTimeout(timeout));
|
|
132
|
-
this.resizeTimeouts.clear();
|
|
133
|
-
// Disconnect all observers
|
|
134
|
-
this.observers.forEach((observer) => observer.disconnect());
|
|
135
|
-
this.observers.clear();
|
|
136
|
-
// Complete all subjects
|
|
137
|
-
this.resizeStates.forEach((subject) => subject.complete());
|
|
138
|
-
this.resizeStates.clear();
|
|
139
|
-
// Complete destroy subject
|
|
140
|
-
this.destroy$.next();
|
|
141
|
-
this.destroy$.complete();
|
|
142
|
-
}
|
|
143
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ResizeObserverService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
144
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ResizeObserverService, providedIn: "root" });
|
|
145
|
-
}
|
|
146
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ResizeObserverService, decorators: [{
|
|
147
|
-
type: Injectable,
|
|
148
|
-
args: [{
|
|
149
|
-
providedIn: "root",
|
|
150
|
-
}]
|
|
151
|
-
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZXNpemUtb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBVy9FLE1BQU0sT0FBTyxxQkFBcUI7SUFNWjtJQUxaLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUNuRCxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQTZDLENBQUM7SUFDcEUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO0lBRXhELFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUcsQ0FBQztJQUV0Qzs7Ozs7T0FLRztJQUNILGNBQWMsQ0FDWixPQUE4QyxFQUM5QyxhQUFxQixDQUFDLEVBQ3RCLHFCQUE2QixHQUFHO1FBRWhDLE1BQU0sRUFBRSxHQUFHLE9BQU8sWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUUzRSxnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBYztZQUNwRCxLQUFL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QUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEVsZW1lbnRSZWYsIE5nWm9uZSwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNpemVTdGF0ZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBpc1Jlc2l6aW5nOiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBvYnNlcnZlcnMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBSZXNpemVPYnNlcnZlcj4oKTtcbiAgcHJpdmF0ZSByZXNpemVTdGF0ZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBCZWhhdmlvclN1YmplY3Q8UmVzaXplU3RhdGU+PigpO1xuICBwcml2YXRlIHJlc2l6ZVRpbWVvdXRzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgbnVtYmVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgZWxlbWVudCByZXNpemUgd2l0aCBkZWJvdW5jaW5nIGFuZCByZXNpemluZyBzdGF0ZVxuICAgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIG9ic2VydmVcbiAgICogQHBhcmFtIGRlYm91bmNlTXMgRGVib3VuY2UgdGltZSAoZGVmYXVsdCAyNTBtcylcbiAgICogQHBhcmFtIHJlc2l6aW5nRHVyYXRpb25NcyBIb3cgbG9uZyB0byBzaG93IFwiaXNSZXNpemluZ1wiIHN0YXRlIChkZWZhdWx0IDI1MG1zKVxuICAgKi9cbiAgb2JzZXJ2ZUVsZW1lbnQoXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICBkZWJvdW5jZU1zOiBudW1iZXIgPSAwLFxuICAgIHJlc2l6aW5nRHVyYXRpb25NczogbnVtYmVyID0gMjUwLFxuICApOiBPYnNlcnZhYmxlPFJlc2l6ZVN0YXRlPiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IGVsZW1lbnQubmF0aXZlRWxlbWVudCA6IGVsZW1lbnQ7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2ZXIgaWYgYWxyZWFkeSBvYnNlcnZpbmdcbiAgICBpZiAodGhpcy5yZXNpemVTdGF0ZXMuaGFzKGVsKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzaXplU3RhdGVzLmdldChlbCkhLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgc3ViamVjdCBmb3IgdGhpcyBlbGVtZW50XG4gICAgY29uc3QgcmVzaXplU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXNpemVTdGF0ZT4oe1xuICAgICAgd2lkdGg6IGVsLm9mZnNldFdpZHRoLFxuICAgICAgaGVpZ2h0OiBlbC5vZmZzZXRIZWlnaHQsXG4gICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMucmVzaXplU3RhdGVzLnNldChlbCwgcmVzaXplU3RhdGUkKTtcblxuICAgIC8vIENyZWF0ZSBSZXNpemVPYnNlcnZlclxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGVudHJ5LmNvbnRlbnRSZWN0O1xuXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAvLyBDbGVhciBleGlzdGluZyB0aW1lb3V0XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nVGltZW91dCA9IHRoaXMucmVzaXplVGltZW91dHMuZ2V0KGVsKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChleGlzdGluZ1RpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHdpdGggaXNSZXNpemluZyA9IHRydWVcbiAgICAgICAgcmVzaXplU3RhdGUkLm5leHQoe1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBpc1Jlc2l6aW5nOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgdGltZW91dCB0byBjbGVhciBpc1Jlc2l6aW5nIGZsYWdcbiAgICAgICAgaWYgKHJlc2l6aW5nRHVyYXRpb25NcyA+IDApIHtcbiAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplU3RhdGUkLm5leHQoe1xuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0cy5kZWxldGUoZWwpO1xuICAgICAgICAgIH0sIHJlc2l6aW5nRHVyYXRpb25Ncyk7XG5cbiAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXRzLnNldChlbCwgdGltZW91dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm8gZHVyYXRpb24sIGltbWVkaWF0ZWx5IHNldCBpc1Jlc2l6aW5nIHRvIGZhbHNlXG4gICAgICAgICAgcmVzaXplU3RhdGUkLm5leHQoe1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCBvYnNlcnZpbmdcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICB0aGlzLm9ic2VydmVycy5zZXQoZWwsIHJlc2l6ZU9ic2VydmVyKTtcblxuICAgIC8vIFJldHVybiBvYnNlcnZhYmxlIHdpdGggZGVib3VuY2luZyBpZiBzcGVjaWZpZWRcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gcmVzaXplU3RhdGUkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICBkZWJvdW5jZU1zID4gMCA/IGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSA6IChzb3VyY2UpID0+IHNvdXJjZSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKFxuICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICBhLndpZHRoID09PSBiLndpZHRoICYmXG4gICAgICAgICAgYS5oZWlnaHQgPT09IGIuaGVpZ2h0ICYmXG4gICAgICAgICAgYS5pc1Jlc2l6aW5nID09PSBiLmlzUmVzaXppbmcsXG4gICAgICApLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICk7XG5cbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIG9ic2VydmluZyBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gc3RvcCBvYnNlcnZpbmdcbiAgICovXG4gIHVub2JzZXJ2ZShlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IGVsZW1lbnQubmF0aXZlRWxlbWVudCA6IGVsZW1lbnQ7XG5cbiAgICAvLyBDbGVhciB0aW1lb3V0IGlmIGV4aXN0c1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnJlc2l6ZVRpbWVvdXRzLmdldChlbCk7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVzaXplVGltZW91dHMuZGVsZXRlKGVsKTtcbiAgICB9XG5cbiAgICAvLyBEaXNjb25uZWN0IG9ic2VydmVyXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSB0aGlzLm9ic2VydmVycy5nZXQoZWwpO1xuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5vYnNlcnZlcnMuZGVsZXRlKGVsKTtcbiAgICB9XG5cbiAgICAvLyBDb21wbGV0ZSBhbmQgcmVtb3ZlIHN1YmplY3RcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNpemVTdGF0ZXMuZ2V0KGVsKTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy5yZXNpemVTdGF0ZXMuZGVsZXRlKGVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2l6ZSBvZiBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gbWVhc3VyZVxuICAgKi9cbiAgZ2V0Q3VycmVudFNpemUoZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCk6IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9IHtcbiAgICBjb25zdCBlbCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gZWxlbWVudC5uYXRpdmVFbGVtZW50IDogZWxlbWVudDtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IGVsLm9mZnNldFdpZHRoLFxuICAgICAgaGVpZ2h0OiBlbC5vZmZzZXRIZWlnaHQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCByZXNpemUgc3RhdGUgb2YgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBnZXRDdXJyZW50U3RhdGUoXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgKTogUmVzaXplU3RhdGUgfCBudWxsIHtcbiAgICBjb25zdCBlbCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gZWxlbWVudC5uYXRpdmVFbGVtZW50IDogZWxlbWVudDtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNpemVTdGF0ZXMuZ2V0KGVsKTtcbiAgICByZXR1cm4gc3ViamVjdCA/IHN1YmplY3QudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgYWxsIHRpbWVvdXRzXG4gICAgdGhpcy5yZXNpemVUaW1lb3V0cy5mb3JFYWNoKCh0aW1lb3V0KSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICAgIHRoaXMucmVzaXplVGltZW91dHMuY2xlYXIoKTtcblxuICAgIC8vIERpc2Nvbm5lY3QgYWxsIG9ic2VydmVyc1xuICAgIHRoaXMub2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLmNsZWFyKCk7XG5cbiAgICAvLyBDb21wbGV0ZSBhbGwgc3ViamVjdHNcbiAgICB0aGlzLnJlc2l6ZVN0YXRlcy5mb3JFYWNoKChzdWJqZWN0KSA9PiBzdWJqZWN0LmNvbXBsZXRlKCkpO1xuICAgIHRoaXMucmVzaXplU3RhdGVzLmNsZWFyKCk7XG5cbiAgICAvLyBDb21wbGV0ZSBkZXN0cm95IHN1YmplY3RcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { Injectable, ElementRef } from "@angular/core";
|
|
2
|
-
import { Subject, BehaviorSubject, fromEvent, merge, animationFrameScheduler, } from "rxjs";
|
|
3
|
-
import { takeUntil, debounceTime, throttleTime, distinctUntilChanged, map, startWith, } from "rxjs/operators";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/cdk/scrolling";
|
|
6
|
-
export class ScrollPosition {
|
|
7
|
-
scrollDispatcher;
|
|
8
|
-
viewportRuler;
|
|
9
|
-
ngZone;
|
|
10
|
-
destroy$ = new Subject();
|
|
11
|
-
scrollStateSubject = new BehaviorSubject({
|
|
12
|
-
isAtBottom: true,
|
|
13
|
-
scrollTop: 0,
|
|
14
|
-
scrollHeight: 0,
|
|
15
|
-
clientHeight: 0,
|
|
16
|
-
});
|
|
17
|
-
scrollState$ = this.scrollStateSubject.asObservable();
|
|
18
|
-
constructor(scrollDispatcher, viewportRuler, ngZone) {
|
|
19
|
-
this.scrollDispatcher = scrollDispatcher;
|
|
20
|
-
this.viewportRuler = viewportRuler;
|
|
21
|
-
this.ngZone = ngZone;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Monitor scroll position of an element
|
|
25
|
-
* @param element The element to monitor
|
|
26
|
-
* @param threshold Pixels from bottom to consider "at bottom" (default 10)
|
|
27
|
-
*/
|
|
28
|
-
monitorScrollPosition(element, threshold = 10) {
|
|
29
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
30
|
-
// Create scroll observable
|
|
31
|
-
const scroll$ = merge(fromEvent(el, "scroll"), this.viewportRuler.change(150)).pipe(startWith(null), // Emit initial state
|
|
32
|
-
throttleTime(16, animationFrameScheduler, { trailing: true }), // ~60fps
|
|
33
|
-
map(() => this.getScrollState(el, threshold)), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom &&
|
|
34
|
-
a.scrollTop === b.scrollTop &&
|
|
35
|
-
a.scrollHeight === b.scrollHeight), takeUntil(this.destroy$));
|
|
36
|
-
// Subscribe and update subject
|
|
37
|
-
scroll$.subscribe((state) => {
|
|
38
|
-
this.scrollStateSubject.next(state);
|
|
39
|
-
});
|
|
40
|
-
return scroll$;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Scroll element to bottom with smooth animation
|
|
44
|
-
* @param element The element to scroll
|
|
45
|
-
* @param smooth Whether to use smooth scrolling
|
|
46
|
-
*/
|
|
47
|
-
scrollToBottom(element, smooth = true) {
|
|
48
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
49
|
-
this.ngZone.runOutsideAngular(() => {
|
|
50
|
-
if (smooth && "scrollBehavior" in document.documentElement.style) {
|
|
51
|
-
el.scrollTo({
|
|
52
|
-
top: el.scrollHeight,
|
|
53
|
-
behavior: "smooth",
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
el.scrollTop = el.scrollHeight;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Check if element is at bottom
|
|
63
|
-
* @param element The element to check
|
|
64
|
-
* @param threshold Pixels from bottom to consider "at bottom"
|
|
65
|
-
*/
|
|
66
|
-
isAtBottom(element, threshold = 10) {
|
|
67
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
68
|
-
return this.getScrollState(el, threshold).isAtBottom;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Get current scroll state of element
|
|
72
|
-
*/
|
|
73
|
-
getScrollState(element, threshold) {
|
|
74
|
-
const scrollTop = element.scrollTop;
|
|
75
|
-
const scrollHeight = element.scrollHeight;
|
|
76
|
-
const clientHeight = element.clientHeight;
|
|
77
|
-
const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
|
|
78
|
-
const isAtBottom = distanceFromBottom <= threshold;
|
|
79
|
-
return {
|
|
80
|
-
isAtBottom,
|
|
81
|
-
scrollTop,
|
|
82
|
-
scrollHeight,
|
|
83
|
-
clientHeight,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Create a ResizeObserver for element size changes
|
|
88
|
-
* @param element The element to observe
|
|
89
|
-
* @param debounceMs Debounce time in milliseconds
|
|
90
|
-
*/
|
|
91
|
-
observeResize(element, debounceMs = 250) {
|
|
92
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
93
|
-
const resize$ = new Subject();
|
|
94
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
95
|
-
const entry = entries[0];
|
|
96
|
-
if (entry) {
|
|
97
|
-
this.ngZone.run(() => {
|
|
98
|
-
resize$.next(entry);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
resizeObserver.observe(el);
|
|
103
|
-
// Cleanup on destroy
|
|
104
|
-
this.destroy$.subscribe(() => {
|
|
105
|
-
resizeObserver.disconnect();
|
|
106
|
-
});
|
|
107
|
-
return resize$.pipe(debounceTime(debounceMs), takeUntil(this.destroy$));
|
|
108
|
-
}
|
|
109
|
-
ngOnDestroy() {
|
|
110
|
-
this.destroy$.next();
|
|
111
|
-
this.destroy$.complete();
|
|
112
|
-
this.scrollStateSubject.complete();
|
|
113
|
-
}
|
|
114
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScrollPosition, deps: [{ token: i1.ScrollDispatcher }, { token: i1.ViewportRuler }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
115
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScrollPosition, providedIn: "root" });
|
|
116
|
-
}
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScrollPosition, decorators: [{
|
|
118
|
-
type: Injectable,
|
|
119
|
-
args: [{
|
|
120
|
-
providedIn: "root",
|
|
121
|
-
}]
|
|
122
|
-
}], ctorParameters: () => [{ type: i1.ScrollDispatcher }, { type: i1.ViewportRuler }, { type: i0.NgZone }] });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXBvc2l0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zY3JvbGwtcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFFTCxPQUFPLEVBQ1AsZUFBZSxFQUNmLFNBQVMsRUFDVCxLQUFLLEVBQ0wsdUJBQXVCLEdBQ3hCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7OztBQVl4QixNQUFNLE9BQU8sY0FBYztJQVlmO0lBQ0E7SUFDQTtJQWJGLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLGtCQUFrQixHQUFHLElBQUksZUFBZSxDQUFjO1FBQzVELFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLENBQUM7UUFDZixZQUFZLEVBQUUsQ0FBQztLQUNoQixDQUFDLENBQUM7SUFFSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBRTdELFlBQ1UsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLE1BQWM7UUFGZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FDbkIsT0FBOEMsRUFDOUMsWUFBb0IsRUFBRTtRQUV0QixNQUFNLEVBQUUsR0FBRyxPQUFPLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFF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SW5qZWN0YWJsZSwgRWxlbWVudFJlZiwgTmdab25lLCBPbkRlc3Ryb3kgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2Nyb2xsRGlzcGF0Y2hlciwgVmlld3BvcnRSdWxlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBCZWhhdmlvclN1YmplY3QsXG4gIGZyb21FdmVudCxcbiAgbWVyZ2UsXG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgdGFrZVVudGlsLFxuICBkZWJvdW5jZVRpbWUsXG4gIHRocm90dGxlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc3RhcnRXaXRoLFxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxTdGF0ZSB7XG4gIGlzQXRCb3R0b206IGJvb2xlYW47XG4gIHNjcm9sbFRvcDogbnVtYmVyO1xuICBzY3JvbGxIZWlnaHQ6IG51bWJlcjtcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbFBvc2l0aW9uIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgc2Nyb2xsU3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxTdGF0ZT4oe1xuICAgIGlzQXRCb3R0b206IHRydWUsXG4gICAgc2Nyb2xsVG9wOiAwLFxuICAgIHNjcm9sbEhlaWdodDogMCxcbiAgICBjbGllbnRIZWlnaHQ6IDAsXG4gIH0pO1xuXG4gIHB1YmxpYyBzY3JvbGxTdGF0ZSQgPSB0aGlzLnNjcm9sbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXIsXG4gICAgcHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICAvKipcbiAgICogTW9uaXRvciBzY3JvbGwgcG9zaXRpb24gb2YgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBtb25pdG9yXG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgUGl4ZWxzIGZyb20gYm90dG9tIHRvIGNvbnNpZGVyIFwiYXQgYm90dG9tXCIgKGRlZmF1bHQgMTApXG4gICAqL1xuICBtb25pdG9yU2Nyb2xsUG9zaXRpb24oXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICB0aHJlc2hvbGQ6IG51bWJlciA9IDEwLFxuICApOiBPYnNlcnZhYmxlPFNjcm9sbFN0YXRlPiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFJlZiA/IGVsZW1lbnQubmF0aXZlRWxlbWVudCA6IGVsZW1lbnQ7XG5cbiAgICAvLyBDcmVhdGUgc2Nyb2xsIG9ic2VydmFibGVcbiAgICBjb25zdCBzY3JvbGwkID0gbWVyZ2UoXG4gICAgICBmcm9tRXZlbnQoZWwsIFwic2Nyb2xsXCIpLFxuICAgICAgdGhpcy52aWV3cG9ydFJ1bGVyLmNoYW5nZSgxNTApLCAvLyBNb25pdG9yIHZpZXdwb3J0IGNoYW5nZXNcbiAgICApLnBpcGUoXG4gICAgICBzdGFydFdpdGgobnVsbCksIC8vIEVtaXQgaW5pdGlhbCBzdGF0ZVxuICAgICAgdGhyb3R0bGVUaW1lKDE2LCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgeyB0cmFpbGluZzogdHJ1ZSB9KSwgLy8gfjYwZnBzXG4gICAgICBtYXAoKCkgPT4gdGhpcy5nZXRTY3JvbGxTdGF0ZShlbCwgdGhyZXNob2xkKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgYS5pc0F0Qm90dG9tID09PSBiLmlzQXRCb3R0b20gJiZcbiAgICAgICAgICBhLnNjcm9sbFRvcCA9PT0gYi5zY3JvbGxUb3AgJiZcbiAgICAgICAgICBhLnNjcm9sbEhlaWdodCA9PT0gYi5zY3JvbGxIZWlnaHQsXG4gICAgICApLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICk7XG5cbiAgICAvLyBTdWJzY3JpYmUgYW5kIHVwZGF0ZSBzdWJqZWN0XG4gICAgc2Nyb2xsJC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbFN0YXRlU3ViamVjdC5uZXh0KHN0YXRlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzY3JvbGwkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBlbGVtZW50IHRvIGJvdHRvbSB3aXRoIHNtb290aCBhbmltYXRpb25cbiAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gc2Nyb2xsXG4gICAqIEBwYXJhbSBzbW9vdGggV2hldGhlciB0byB1c2Ugc21vb3RoIHNjcm9sbGluZ1xuICAgKi9cbiAgc2Nyb2xsVG9Cb3R0b20oXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICBzbW9vdGg6IGJvb2xlYW4gPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gZWxlbWVudC5uYXRpdmVFbGVtZW50IDogZWxlbWVudDtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmIChzbW9vdGggJiYgXCJzY3JvbGxCZWhhdmlvclwiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSkge1xuICAgICAgICBlbC5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgYmVoYXZpb3I6IFwic21vb3RoXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgaXMgYXQgYm90dG9tXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgUGl4ZWxzIGZyb20gYm90dG9tIHRvIGNvbnNpZGVyIFwiYXQgYm90dG9tXCJcbiAgICovXG4gIGlzQXRCb3R0b20oXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICB0aHJlc2hvbGQ6IG51bWJlciA9IDEwLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBlbCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gZWxlbWVudC5uYXRpdmVFbGVtZW50IDogZWxlbWVudDtcbiAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxTdGF0ZShlbCwgdGhyZXNob2xkKS5pc0F0Qm90dG9tO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHNjcm9sbCBzdGF0ZSBvZiBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0U2Nyb2xsU3RhdGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHRocmVzaG9sZDogbnVtYmVyKTogU2Nyb2xsU3RhdGUge1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodDtcbiAgICBjb25zdCBpc0F0Qm90dG9tID0gZGlzdGFuY2VGcm9tQm90dG9tIDw9IHRocmVzaG9sZDtcblxuICAgIHJldHVybiB7XG4gICAgICBpc0F0Qm90dG9tLFxuICAgICAgc2Nyb2xsVG9wLFxuICAgICAgc2Nyb2xsSGVpZ2h0LFxuICAgICAgY2xpZW50SGVpZ2h0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUmVzaXplT2JzZXJ2ZXIgZm9yIGVsZW1lbnQgc2l6ZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIG9ic2VydmVcbiAgICogQHBhcmFtIGRlYm91bmNlTXMgRGVib3VuY2UgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIG9ic2VydmVSZXNpemUoXG4gICAgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCxcbiAgICBkZWJvdW5jZU1zOiBudW1iZXIgPSAyNTAsXG4gICk6IE9ic2VydmFibGU8UmVzaXplT2JzZXJ2ZXJFbnRyeT4ge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBlbGVtZW50O1xuICAgIGNvbnN0IHJlc2l6ZSQgPSBuZXcgU3ViamVjdDxSZXNpemVPYnNlcnZlckVudHJ5PigpO1xuXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHJlc2l6ZSQubmV4dChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbCk7XG5cbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzaXplJC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLnNjcm9sbFN0YXRlU3ViamVjdC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
|