@mckit/chat 20.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.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Chat
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build chat
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+ ```bash
35
+ cd dist/chat
36
+ ```
37
+
38
+ 2. Run the `npm publish` command to publish your library to the npm registry:
39
+ ```bash
40
+ npm publish
41
+ ```
42
+
43
+ ## Running unit tests
44
+
45
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
46
+
47
+ ```bash
48
+ ng test
49
+ ```
50
+
51
+ ## Running end-to-end tests
52
+
53
+ For end-to-end (e2e) testing, run:
54
+
55
+ ```bash
56
+ ng e2e
57
+ ```
58
+
59
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
+
61
+ ## Additional Resources
62
+
63
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,180 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, Component, Injectable, inject } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as i2 from 'primeng/image';
6
+ import { ImageModule } from 'primeng/image';
7
+ import * as i2$1 from '@angular/forms';
8
+ import { FormsModule } from '@angular/forms';
9
+ import * as i3 from 'primeng/avatar';
10
+ import { AvatarModule } from 'primeng/avatar';
11
+ import * as i4 from 'primeng/button';
12
+ import { ButtonModule } from 'primeng/button';
13
+ import * as i5 from 'primeng/inputtext';
14
+ import { InputTextModule } from 'primeng/inputtext';
15
+
16
+ var MCMessageChatType;
17
+ (function (MCMessageChatType) {
18
+ MCMessageChatType["TEXT"] = "text";
19
+ MCMessageChatType["IMAGE"] = "image";
20
+ MCMessageChatType["VIDEO"] = "video";
21
+ MCMessageChatType["AUDIO"] = "audio";
22
+ MCMessageChatType["FILE"] = "file";
23
+ })(MCMessageChatType || (MCMessageChatType = {}));
24
+ var MCMessageChatSide;
25
+ (function (MCMessageChatSide) {
26
+ MCMessageChatSide["LEFT"] = "left";
27
+ MCMessageChatSide["RIGHT"] = "right";
28
+ })(MCMessageChatSide || (MCMessageChatSide = {}));
29
+ class MCMessageChat {
30
+ id;
31
+ type;
32
+ side;
33
+ content;
34
+ createdAt;
35
+ }
36
+
37
+ class MCConversation {
38
+ }
39
+
40
+ class MCBaseMessageComponent {
41
+ message = input.required(...(ngDevMode ? [{ debugName: "message" }] : []));
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCBaseMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.4", type: MCBaseMessageComponent, isStandalone: true, selector: "mc-base-message", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: '', isInline: true });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCBaseMessageComponent, decorators: [{
46
+ type: Component,
47
+ args: [{
48
+ selector: 'mc-base-message',
49
+ template: ''
50
+ }]
51
+ }] });
52
+
53
+ class MCMessageTextComponent extends MCBaseMessageComponent {
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageTextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: MCMessageTextComponent, isStandalone: true, selector: "mc-message-text", usesInheritance: true, ngImport: i0, template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"p-3 rounded-lg shadow-sm\" [ngClass]=\"{\n 'bg-blue-600 text-white rounded-br-none': message().side !== 'left',\n 'bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200 border border-gray-200 dark:border-gray-700 rounded-bl-none': message().id === '1'\n }\">\n <p class=\"text-sm\">{{ message().content }}</p>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageTextComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ selector: 'mc-message-text', imports: [CommonModule], template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"p-3 rounded-lg shadow-sm\" [ngClass]=\"{\n 'bg-blue-600 text-white rounded-br-none': message().side !== 'left',\n 'bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200 border border-gray-200 dark:border-gray-700 rounded-bl-none': message().id === '1'\n }\">\n <p class=\"text-sm\">{{ message().content }}</p>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>" }]
60
+ }] });
61
+
62
+ class MCMessageImageComponent extends MCBaseMessageComponent {
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageImageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
64
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: MCMessageImageComponent, isStandalone: true, selector: "mc-message-image", usesInheritance: true, ngImport: i0, template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <p-image [src]=\"message().content\" [alt]=\"'Image'\" [preview]=\"true\" width=\"250\">\n </p-image>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ImageModule }, { kind: "component", type: i2.Image, selector: "p-image", inputs: ["imageClass", "imageStyle", "styleClass", "src", "srcSet", "sizes", "previewImageSrc", "previewImageSrcSet", "previewImageSizes", "alt", "width", "height", "loading", "preview", "showTransitionOptions", "hideTransitionOptions", "appendTo"], outputs: ["onShow", "onHide", "onImageError"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageImageComponent, decorators: [{
67
+ type: Component,
68
+ args: [{ selector: 'mc-message-image', imports: [CommonModule, ImageModule], template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <p-image [src]=\"message().content\" [alt]=\"'Image'\" [preview]=\"true\" width=\"250\">\n </p-image>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>" }]
69
+ }] });
70
+
71
+ class MCMessageVideoComponent extends MCBaseMessageComponent {
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageVideoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
73
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: MCMessageVideoComponent, isStandalone: true, selector: "mc-message-video", usesInheritance: true, ngImport: i0, template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <video [src]=\"message().content\" controls width=\"250\" class=\"block\">\n </video>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCMessageVideoComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'mc-message-video', imports: [CommonModule], template: "<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <video [src]=\"message().content\" controls width=\"250\" class=\"block\">\n </video>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>" }]
78
+ }] });
79
+
80
+ class MCChatService {
81
+ registry = new Map();
82
+ constructor() {
83
+ this.register(MCMessageChatType.TEXT, MCMessageTextComponent);
84
+ this.register(MCMessageChatType.IMAGE, MCMessageImageComponent);
85
+ this.register(MCMessageChatType.VIDEO, MCMessageVideoComponent);
86
+ }
87
+ register(type, component) {
88
+ this.registry.set(type, component);
89
+ }
90
+ getComponent(type) {
91
+ return this.registry.get(type);
92
+ }
93
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
94
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCChatService, providedIn: 'root' });
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCChatService, decorators: [{
97
+ type: Injectable,
98
+ args: [{
99
+ providedIn: 'root'
100
+ }]
101
+ }], ctorParameters: () => [] });
102
+
103
+ class MCConversationComponent {
104
+ chatService = inject(MCChatService);
105
+ messages = [];
106
+ newMessage = '';
107
+ ngOnInit() {
108
+ // Dummy data for visualization
109
+ this.messages = [
110
+ {
111
+ id: '1',
112
+ type: MCMessageChatType.TEXT,
113
+ content: 'Hello! How can I help you?',
114
+ createdAt: new Date().toISOString(),
115
+ side: MCMessageChatSide.LEFT,
116
+ // sentByMe: false // assuming we might need this property, adding strictly to the class later if needed, for now I'll handle "me" vs "them" by some logic or just assumed property if I can modify the entity.
117
+ // Wait, looking at MCMessageChat entity, it doesn't have a sender field.
118
+ // I should probably add one to the entity or extend it locally for the UI.
119
+ // For now let's assume I check a 'senderId' or something.
120
+ // Let's modify the entity first or just add a 'sender' property for now to the object literals and see if TS complains (it will).
121
+ // I will add a sender 'me' or 'other' for this demo.
122
+ },
123
+ {
124
+ id: '2',
125
+ type: MCMessageChatType.IMAGE,
126
+ content: 'data:image/png;base64,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',
127
+ createdAt: new Date().toISOString(),
128
+ side: MCMessageChatSide.LEFT,
129
+ },
130
+ {
131
+ id: '3',
132
+ type: MCMessageChatType.VIDEO,
133
+ content: 'https://www.w3schools.com/html/mov_bbb.mp4',
134
+ createdAt: new Date().toISOString(),
135
+ side: MCMessageChatSide.LEFT,
136
+ },
137
+ ];
138
+ // Better yet, let's update the entity to have a sender or owner since checking the file `message.ts` it was very basic.
139
+ // actually, I'll stick to the existing entity for now and maybe just use an extra property in the component.
140
+ }
141
+ // Let's pretend we have a currentUserId = 1.
142
+ currentUserId = 1;
143
+ getComponent(type) {
144
+ return this.chatService.getComponent(type) ?? MCBaseMessageComponent;
145
+ }
146
+ sendMessage() {
147
+ if (!this.newMessage.trim())
148
+ return;
149
+ const message = {
150
+ id: Date.now().toString(),
151
+ type: MCMessageChatType.TEXT,
152
+ content: this.newMessage,
153
+ createdAt: new Date().toISOString(),
154
+ side: MCMessageChatSide.RIGHT,
155
+ };
156
+ // Ideally we would push to a service, but for now just local array
157
+ this.messages.push(message);
158
+ this.newMessage = '';
159
+ }
160
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCConversationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
161
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: MCConversationComponent, isStandalone: true, selector: "mc-conversation", ngImport: i0, template: "<div\n class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700\">\n <!-- Header -->\n <div class=\"flex items-center p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\">\n <p-avatar image=\"https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png\" shape=\"circle\"\n size=\"large\" styleClass=\"mr-3\">\n </p-avatar>\n <div>\n <h2 class=\"text-lg font-semibold text-gray-800 dark:text-white\">Amy Elsner</h2>\n <p class=\"text-sm text-green-500 flex items-center\">\n <span class=\"w-2 h-2 rounded-full bg-green-500 mr-2\"></span>\n Online\n </p>\n </div>\n </div>\n\n <!-- Messages Body -->\n <div class=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50 dark:bg-gray-900\">\n <!-- Message Item -->\n @for (msg of messages; track $index) {\n <div class=\"mb-3\">\n <ng-container *ngComponentOutlet=\"getComponent(msg.type); inputs: { message: msg }\"></ng-container>\n </div>\n }\n </div>\n\n <!-- Footer / Input Area -->\n <div class=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700\">\n <div class=\"flex gap-2\">\n <input pInputText type=\"text\" class=\"flex-1 w-full\" placeholder=\"Type a message...\" [(ngModel)]=\"newMessage\"\n (keydown.enter)=\"sendMessage()\" />\n\n <p-button icon=\"pi pi-send\" (onClick)=\"sendMessage()\" styleClass=\"p-button-rounded p-button-primary\">\n </p-button>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i3.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["pSize", "variant", "fluid", "invalid"] }] });
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: MCConversationComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'mc-conversation', imports: [CommonModule, FormsModule, AvatarModule, ButtonModule, InputTextModule], template: "<div\n class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700\">\n <!-- Header -->\n <div class=\"flex items-center p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\">\n <p-avatar image=\"https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png\" shape=\"circle\"\n size=\"large\" styleClass=\"mr-3\">\n </p-avatar>\n <div>\n <h2 class=\"text-lg font-semibold text-gray-800 dark:text-white\">Amy Elsner</h2>\n <p class=\"text-sm text-green-500 flex items-center\">\n <span class=\"w-2 h-2 rounded-full bg-green-500 mr-2\"></span>\n Online\n </p>\n </div>\n </div>\n\n <!-- Messages Body -->\n <div class=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50 dark:bg-gray-900\">\n <!-- Message Item -->\n @for (msg of messages; track $index) {\n <div class=\"mb-3\">\n <ng-container *ngComponentOutlet=\"getComponent(msg.type); inputs: { message: msg }\"></ng-container>\n </div>\n }\n </div>\n\n <!-- Footer / Input Area -->\n <div class=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700\">\n <div class=\"flex gap-2\">\n <input pInputText type=\"text\" class=\"flex-1 w-full\" placeholder=\"Type a message...\" [(ngModel)]=\"newMessage\"\n (keydown.enter)=\"sendMessage()\" />\n\n <p-button icon=\"pi pi-send\" (onClick)=\"sendMessage()\" styleClass=\"p-button-rounded p-button-primary\">\n </p-button>\n </div>\n </div>\n</div>" }]
166
+ }] });
167
+
168
+ /*
169
+ * Public API Surface of chat
170
+ */
171
+ /**
172
+ * Entities
173
+ */
174
+
175
+ /**
176
+ * Generated bundle index. Do not edit.
177
+ */
178
+
179
+ export { MCBaseMessageComponent, MCChatService, MCConversation, MCConversationComponent, MCMessageChat, MCMessageChatSide, MCMessageChatType, MCMessageImageComponent, MCMessageTextComponent, MCMessageVideoComponent };
180
+ //# sourceMappingURL=mckit-chat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mckit-chat.mjs","sources":["../../../../projects/mckit/chat/src/lib/entities/message.ts","../../../../projects/mckit/chat/src/lib/entities/conversation.ts","../../../../projects/mckit/chat/src/lib/messages/base-message.component.ts","../../../../projects/mckit/chat/src/lib/messages/text/text.component.ts","../../../../projects/mckit/chat/src/lib/messages/text/text.component.html","../../../../projects/mckit/chat/src/lib/messages/image/image.component.ts","../../../../projects/mckit/chat/src/lib/messages/image/image.component.html","../../../../projects/mckit/chat/src/lib/messages/video/video.component.ts","../../../../projects/mckit/chat/src/lib/messages/video/video.component.html","../../../../projects/mckit/chat/src/lib/services/chat.service.ts","../../../../projects/mckit/chat/src/lib/components/conversation/conversation.component.ts","../../../../projects/mckit/chat/src/lib/components/conversation/conversation.component.html","../../../../projects/mckit/chat/src/public-api.ts","../../../../projects/mckit/chat/src/mckit-chat.ts"],"sourcesContent":["export enum MCMessageChatType {\n TEXT = 'text',\n IMAGE = 'image',\n VIDEO = 'video',\n AUDIO = 'audio',\n FILE = 'file'\n}\n\nexport enum MCMessageChatSide {\n LEFT = 'left',\n RIGHT = 'right'\n}\n\nexport class MCMessageChat {\n id?: string | number;\n type!: string;\n side!: MCMessageChatSide;\n content?: any;\n createdAt?: string;\n}","export class MCConversation {\n\n}","import { Component, input } from '@angular/core';\nimport { MCMessageChat } from '../entities/message';\n\n@Component({\n selector: 'mc-base-message',\n template: ''\n})\nexport class MCBaseMessageComponent {\n message = input.required<MCMessageChat>();\n}\n","import { Component } from '@angular/core';\nimport { MCBaseMessageComponent } from '../base-message.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'mc-message-text',\n imports: [CommonModule],\n templateUrl: './text.component.html',\n styleUrl: './text.component.css'\n})\nexport class MCMessageTextComponent extends MCBaseMessageComponent {\n\n}\n","<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"p-3 rounded-lg shadow-sm\" [ngClass]=\"{\n 'bg-blue-600 text-white rounded-br-none': message().side !== 'left',\n 'bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200 border border-gray-200 dark:border-gray-700 rounded-bl-none': message().id === '1'\n }\">\n <p class=\"text-sm\">{{ message().content }}</p>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { ImageModule } from 'primeng/image';\nimport { MCBaseMessageComponent } from '../base-message.component';\n\n@Component({\n selector: 'mc-message-image',\n imports: [CommonModule, ImageModule],\n templateUrl: './image.component.html',\n styleUrl: './image.component.css'\n})\nexport class MCMessageImageComponent extends MCBaseMessageComponent {\n\n}\n","<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <p-image [src]=\"message().content\" [alt]=\"'Image'\" [preview]=\"true\" width=\"250\">\n </p-image>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { MCBaseMessageComponent } from '../base-message.component';\n\n@Component({\n selector: 'mc-message-video',\n imports: [CommonModule],\n templateUrl: './video.component.html',\n styleUrl: './video.component.css'\n})\nexport class MCMessageVideoComponent extends MCBaseMessageComponent {\n\n}\n","<div class=\"flex w-full\"\n [ngClass]=\"{'justify-end': message().side !== 'left', 'justify-start': message().side === 'left'}\">\n\n <div class=\"max-w-[70%] flex flex-col\"\n [ngClass]=\"{'items-end': message().side !== 'left', 'items-start': message().side === 'left'}\">\n\n <div class=\"rounded-lg shadow-sm overflow-hidden\" [ngClass]=\"{\n 'rounded-br-none': message().side !== 'left',\n 'rounded-bl-none': message().side === 'left'\n }\">\n <video [src]=\"message().content\" controls width=\"250\" class=\"block\">\n </video>\n </div>\n <span class=\"text-xs text-gray-400 mt-1 px-1\">\n {{ message().createdAt | date:'shortTime' }}\n </span>\n </div>\n</div>","import { Injectable, Type } from '@angular/core';\nimport { MCBaseMessageComponent } from '../messages/base-message.component';\nimport { MCMessageChatType } from '../entities/message';\nimport { MCMessageTextComponent } from '../messages/text/text.component';\nimport { MCMessageImageComponent } from '../messages/image/image.component';\nimport { MCMessageVideoComponent } from '../messages/video/video.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MCChatService {\n\n private registry = new Map<string, Type<MCBaseMessageComponent>>();\n\n constructor() {\n this.register(MCMessageChatType.TEXT, MCMessageTextComponent);\n this.register(MCMessageChatType.IMAGE, MCMessageImageComponent);\n this.register(MCMessageChatType.VIDEO, MCMessageVideoComponent);\n }\n\n register(type: string, component: Type<MCBaseMessageComponent>) {\n this.registry.set(type, component);\n }\n\n getComponent(type: string): Type<MCBaseMessageComponent> | undefined {\n return this.registry.get(type);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, OnInit, Type } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AvatarModule } from 'primeng/avatar';\nimport { ButtonModule } from 'primeng/button';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MCMessageChat, MCMessageChatSide, MCMessageChatType } from '../../entities/message';\nimport { MCChatService } from '../../services/chat.service';\nimport { MCBaseMessageComponent } from '../../messages/base-message.component';\n\n@Component({\n selector: 'mc-conversation',\n imports: [CommonModule, FormsModule, AvatarModule, ButtonModule, InputTextModule],\n templateUrl: './conversation.component.html',\n styleUrl: './conversation.component.css'\n})\nexport class MCConversationComponent implements OnInit {\n\n chatService = inject(MCChatService);\n\n messages: MCMessageChat[] = [];\n newMessage: string = '';\n\n ngOnInit(): void {\n // Dummy data for visualization\n this.messages = [\n {\n id: '1',\n type: MCMessageChatType.TEXT,\n content: 'Hello! How can I help you?',\n createdAt: new Date().toISOString(),\n side: MCMessageChatSide.LEFT,\n // sentByMe: false // assuming we might need this property, adding strictly to the class later if needed, for now I'll handle \"me\" vs \"them\" by some logic or just assumed property if I can modify the entity.\n // Wait, looking at MCMessageChat entity, it doesn't have a sender field. \n // I should probably add one to the entity or extend it locally for the UI.\n // For now let's assume I check a 'senderId' or something.\n // Let's modify the entity first or just add a 'sender' property for now to the object literals and see if TS complains (it will).\n // I will add a sender 'me' or 'other' for this demo.\n } as any,\n {\n id: '2',\n type: MCMessageChatType.IMAGE,\n content: 'data:image/png;base64,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',\n createdAt: new Date().toISOString(),\n side: MCMessageChatSide.LEFT,\n } as any,\n {\n id: '3',\n type: MCMessageChatType.VIDEO,\n content: 'https://www.w3schools.com/html/mov_bbb.mp4',\n createdAt: new Date().toISOString(),\n side: MCMessageChatSide.LEFT,\n } as any,\n ];\n\n // Better yet, let's update the entity to have a sender or owner since checking the file `message.ts` it was very basic. \n // actually, I'll stick to the existing entity for now and maybe just use an extra property in the component.\n }\n\n // Let's pretend we have a currentUserId = 1.\n currentUserId = 1;\n\n getComponent(type: string): Type<MCBaseMessageComponent> {\n return this.chatService.getComponent(type) ?? MCBaseMessageComponent;\n }\n\n sendMessage() {\n if (!this.newMessage.trim()) return;\n\n const message: MCMessageChat = {\n id: Date.now().toString(),\n type: MCMessageChatType.TEXT,\n content: this.newMessage,\n createdAt: new Date().toISOString(),\n side: MCMessageChatSide.RIGHT,\n };\n\n // Ideally we would push to a service, but for now just local array\n this.messages.push(message);\n this.newMessage = '';\n }\n}\n","<div\n class=\"flex flex-col h-full bg-white dark:bg-gray-900 rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700\">\n <!-- Header -->\n <div class=\"flex items-center p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\">\n <p-avatar image=\"https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png\" shape=\"circle\"\n size=\"large\" styleClass=\"mr-3\">\n </p-avatar>\n <div>\n <h2 class=\"text-lg font-semibold text-gray-800 dark:text-white\">Amy Elsner</h2>\n <p class=\"text-sm text-green-500 flex items-center\">\n <span class=\"w-2 h-2 rounded-full bg-green-500 mr-2\"></span>\n Online\n </p>\n </div>\n </div>\n\n <!-- Messages Body -->\n <div class=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50 dark:bg-gray-900\">\n <!-- Message Item -->\n @for (msg of messages; track $index) {\n <div class=\"mb-3\">\n <ng-container *ngComponentOutlet=\"getComponent(msg.type); inputs: { message: msg }\"></ng-container>\n </div>\n }\n </div>\n\n <!-- Footer / Input Area -->\n <div class=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700\">\n <div class=\"flex gap-2\">\n <input pInputText type=\"text\" class=\"flex-1 w-full\" placeholder=\"Type a message...\" [(ngModel)]=\"newMessage\"\n (keydown.enter)=\"sendMessage()\" />\n\n <p-button icon=\"pi pi-send\" (onClick)=\"sendMessage()\" styleClass=\"p-button-rounded p-button-primary\">\n </p-button>\n </div>\n </div>\n</div>","/*\n * Public API Surface of chat\n */\n\n/**\n * Entities\n */\nexport * from './lib/entities/message';\nexport * from './lib/entities/conversation';\n\n/**\n * Messages\n */\nexport * from './lib/messages/base-message.component';\nexport * from './lib/messages/text/text.component';\nexport * from './lib/messages/image/image.component';\nexport * from './lib/messages/video/video.component';\n\n/**\n * Components\n */\nexport * from './lib/components/conversation/conversation.component';\n\n/**\n * Services\n */\nexport * from './lib/services/chat.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Type, OnInit } from '@angular/core';
3
+
4
+ declare enum MCMessageChatType {
5
+ TEXT = "text",
6
+ IMAGE = "image",
7
+ VIDEO = "video",
8
+ AUDIO = "audio",
9
+ FILE = "file"
10
+ }
11
+ declare enum MCMessageChatSide {
12
+ LEFT = "left",
13
+ RIGHT = "right"
14
+ }
15
+ declare class MCMessageChat {
16
+ id?: string | number;
17
+ type: string;
18
+ side: MCMessageChatSide;
19
+ content?: any;
20
+ createdAt?: string;
21
+ }
22
+
23
+ declare class MCConversation {
24
+ }
25
+
26
+ declare class MCBaseMessageComponent {
27
+ message: i0.InputSignal<MCMessageChat>;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCBaseMessageComponent, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCBaseMessageComponent, "mc-base-message", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
30
+ }
31
+
32
+ declare class MCMessageTextComponent extends MCBaseMessageComponent {
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCMessageTextComponent, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCMessageTextComponent, "mc-message-text", never, {}, {}, never, never, true, never>;
35
+ }
36
+
37
+ declare class MCMessageImageComponent extends MCBaseMessageComponent {
38
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCMessageImageComponent, never>;
39
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCMessageImageComponent, "mc-message-image", never, {}, {}, never, never, true, never>;
40
+ }
41
+
42
+ declare class MCMessageVideoComponent extends MCBaseMessageComponent {
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCMessageVideoComponent, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCMessageVideoComponent, "mc-message-video", never, {}, {}, never, never, true, never>;
45
+ }
46
+
47
+ declare class MCChatService {
48
+ private registry;
49
+ constructor();
50
+ register(type: string, component: Type<MCBaseMessageComponent>): void;
51
+ getComponent(type: string): Type<MCBaseMessageComponent> | undefined;
52
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCChatService, never>;
53
+ static ɵprov: i0.ɵɵInjectableDeclaration<MCChatService>;
54
+ }
55
+
56
+ declare class MCConversationComponent implements OnInit {
57
+ chatService: MCChatService;
58
+ messages: MCMessageChat[];
59
+ newMessage: string;
60
+ ngOnInit(): void;
61
+ currentUserId: number;
62
+ getComponent(type: string): Type<MCBaseMessageComponent>;
63
+ sendMessage(): void;
64
+ static ɵfac: i0.ɵɵFactoryDeclaration<MCConversationComponent, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCConversationComponent, "mc-conversation", never, {}, {}, never, never, true, never>;
66
+ }
67
+
68
+ export { MCBaseMessageComponent, MCChatService, MCConversation, MCConversationComponent, MCMessageChat, MCMessageChatSide, MCMessageChatType, MCMessageImageComponent, MCMessageTextComponent, MCMessageVideoComponent };
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@mckit/chat",
3
+ "version": "20.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.3.0",
6
+ "@angular/core": "^20.3.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/mckit-chat.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "default": "./fesm2022/mckit-chat.mjs"
21
+ }
22
+ }
23
+ }