@product7/product7-js 0.1.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.
Files changed (58) hide show
  1. package/README.md +1025 -0
  2. package/dist/README.md +1025 -0
  3. package/dist/product7-js.js +14658 -0
  4. package/dist/product7-js.js.map +1 -0
  5. package/dist/product7-js.min.js +2 -0
  6. package/dist/product7-js.min.js.map +1 -0
  7. package/package.json +114 -0
  8. package/src/api/mock-data/index.js +360 -0
  9. package/src/api/services/ChangelogService.js +28 -0
  10. package/src/api/services/FeedbackService.js +44 -0
  11. package/src/api/services/HelpService.js +50 -0
  12. package/src/api/services/MessengerService.js +279 -0
  13. package/src/api/services/SurveyService.js +127 -0
  14. package/src/api/utils/helpers.js +30 -0
  15. package/src/core/APIService.js +303 -0
  16. package/src/core/BaseAPIService.js +298 -0
  17. package/src/core/EventBus.js +54 -0
  18. package/src/core/Product7.js +812 -0
  19. package/src/core/WebSocketService.js +275 -0
  20. package/src/docs/api.md +226 -0
  21. package/src/docs/example.md +461 -0
  22. package/src/docs/framework-integrations.md +714 -0
  23. package/src/docs/installation.md +281 -0
  24. package/src/index.js +894 -0
  25. package/src/styles/base.js +50 -0
  26. package/src/styles/changelog.js +665 -0
  27. package/src/styles/components.js +553 -0
  28. package/src/styles/design-tokens.js +124 -0
  29. package/src/styles/feedback.js +325 -0
  30. package/src/styles/messenger-components.js +632 -0
  31. package/src/styles/messenger-core.js +233 -0
  32. package/src/styles/messenger-features.js +169 -0
  33. package/src/styles/messenger-views.js +877 -0
  34. package/src/styles/messenger.js +17 -0
  35. package/src/styles/messengerCustomStyles.js +114 -0
  36. package/src/styles/styles.js +26 -0
  37. package/src/styles/survey.js +894 -0
  38. package/src/utils/errors.js +142 -0
  39. package/src/utils/helpers.js +219 -0
  40. package/src/widgets/BaseWidget.js +548 -0
  41. package/src/widgets/ButtonWidget.js +104 -0
  42. package/src/widgets/ChangelogWidget.js +615 -0
  43. package/src/widgets/InlineWidget.js +148 -0
  44. package/src/widgets/MessengerWidget.js +979 -0
  45. package/src/widgets/SurveyWidget.js +1325 -0
  46. package/src/widgets/TabWidget.js +45 -0
  47. package/src/widgets/WidgetFactory.js +70 -0
  48. package/src/widgets/messenger/MessengerState.js +323 -0
  49. package/src/widgets/messenger/components/MessengerLauncher.js +124 -0
  50. package/src/widgets/messenger/components/MessengerPanel.js +111 -0
  51. package/src/widgets/messenger/components/NavigationTabs.js +130 -0
  52. package/src/widgets/messenger/views/ChangelogView.js +167 -0
  53. package/src/widgets/messenger/views/ChatView.js +592 -0
  54. package/src/widgets/messenger/views/ConversationsView.js +244 -0
  55. package/src/widgets/messenger/views/HelpView.js +239 -0
  56. package/src/widgets/messenger/views/HomeView.js +300 -0
  57. package/src/widgets/messenger/views/PreChatFormView.js +109 -0
  58. package/types/index.d.ts +341 -0
@@ -0,0 +1,148 @@
1
+ import { BaseWidget } from './BaseWidget.js';
2
+
3
+ export class InlineWidget extends BaseWidget {
4
+ constructor(options) {
5
+ super({ ...options, type: 'inline' });
6
+ }
7
+
8
+ _render() {
9
+ const widget = document.createElement('div');
10
+ widget.className = 'feedback-widget feedback-widget-inline';
11
+ widget.innerHTML = `
12
+ <div class="feedback-inline-content">
13
+ <h3>Send us your feedback</h3>
14
+ <form class="feedback-inline-form">
15
+ <div class="sdk-form-group">
16
+ <input
17
+ type="text"
18
+ name="title"
19
+ class="sdk-input"
20
+ placeholder="Title (optional)"
21
+ value="${this.state.title}"
22
+ />
23
+ </div>
24
+ <div class="sdk-form-group">
25
+ <textarea
26
+ name="content"
27
+ class="sdk-textarea"
28
+ placeholder="Your feedback..."
29
+ required
30
+ >${this.state.content}</textarea>
31
+ </div>
32
+ <div class="sdk-form-group">
33
+ <input
34
+ type="email"
35
+ name="email"
36
+ class="sdk-input"
37
+ placeholder="Email (optional)"
38
+ value="${this.state.email}"
39
+ />
40
+ </div>
41
+ <button type="submit" class="sdk-btn-primary sdk-btn-block">
42
+ Send Feedback
43
+ </button>
44
+ <div class="feedback-error"></div>
45
+ </form>
46
+ </div>
47
+ `;
48
+
49
+ if (this.options.customStyles) {
50
+ Object.assign(widget.style, this.options.customStyles);
51
+ }
52
+
53
+ return widget;
54
+ }
55
+
56
+ _attachEvents() {
57
+ const form = this.element.querySelector('.feedback-inline-form');
58
+
59
+ form.addEventListener('submit', (e) => {
60
+ e.preventDefault();
61
+ this.submitFeedback();
62
+ });
63
+
64
+ form.querySelector('input[name="title"]').addEventListener('input', (e) => {
65
+ this.state.title = e.target.value;
66
+ });
67
+
68
+ form
69
+ .querySelector('textarea[name="content"]')
70
+ .addEventListener('input', (e) => {
71
+ this.state.content = e.target.value;
72
+ });
73
+
74
+ form.querySelector('input[name="email"]').addEventListener('input', (e) => {
75
+ this.state.email = e.target.value;
76
+ });
77
+ }
78
+
79
+ openModal() {
80
+ const textarea = this.element.querySelector('textarea[name="content"]');
81
+ if (textarea) {
82
+ textarea.focus();
83
+ }
84
+ }
85
+
86
+ closeModal() {
87
+ // Inline widget doesn't use modal
88
+ }
89
+
90
+ _showSuccessMessage() {
91
+ const widget = this.element.querySelector('.feedback-inline-content');
92
+ const originalContent = widget.innerHTML;
93
+
94
+ widget.innerHTML = `
95
+ <div class="feedback-success">
96
+ <div class="sdk-notification-icon">✓</div>
97
+ <h3>Thank you!</h3>
98
+ <p>Your feedback has been submitted successfully.</p>
99
+ <button class="sdk-btn-primary">Send Another</button>
100
+ </div>
101
+ `;
102
+
103
+ const resetBtn = widget.querySelector('.sdk-btn-primary');
104
+ resetBtn.addEventListener('click', () => {
105
+ widget.innerHTML = originalContent;
106
+ this._attachEvents();
107
+ this._resetForm();
108
+ });
109
+ }
110
+
111
+ _showError(message) {
112
+ const errorElement = this.element.querySelector('.feedback-error');
113
+ if (errorElement) {
114
+ errorElement.textContent = message;
115
+ errorElement.classList.add('show');
116
+
117
+ setTimeout(() => {
118
+ if (errorElement) {
119
+ errorElement.classList.remove('show');
120
+ }
121
+ }, 5000);
122
+ }
123
+ }
124
+
125
+ _updateSubmitButton() {
126
+ const submitBtn = this.element.querySelector('.sdk-btn-primary');
127
+ if (submitBtn) {
128
+ submitBtn.textContent = this.state.isSubmitting
129
+ ? 'Sending...'
130
+ : 'Send Feedback';
131
+ submitBtn.disabled = this.state.isSubmitting;
132
+ }
133
+ }
134
+
135
+ updateTitle(title) {
136
+ const titleElement = this.element?.querySelector('h3');
137
+ if (titleElement) {
138
+ titleElement.textContent = title;
139
+ }
140
+ }
141
+
142
+ setPlaceholder(field, placeholder) {
143
+ const input = this.element?.querySelector(`[name="${field}"]`);
144
+ if (input) {
145
+ input.placeholder = placeholder;
146
+ }
147
+ }
148
+ }