@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.
- package/README.md +1025 -0
- package/dist/README.md +1025 -0
- package/dist/product7-js.js +14658 -0
- package/dist/product7-js.js.map +1 -0
- package/dist/product7-js.min.js +2 -0
- package/dist/product7-js.min.js.map +1 -0
- package/package.json +114 -0
- package/src/api/mock-data/index.js +360 -0
- package/src/api/services/ChangelogService.js +28 -0
- package/src/api/services/FeedbackService.js +44 -0
- package/src/api/services/HelpService.js +50 -0
- package/src/api/services/MessengerService.js +279 -0
- package/src/api/services/SurveyService.js +127 -0
- package/src/api/utils/helpers.js +30 -0
- package/src/core/APIService.js +303 -0
- package/src/core/BaseAPIService.js +298 -0
- package/src/core/EventBus.js +54 -0
- package/src/core/Product7.js +812 -0
- package/src/core/WebSocketService.js +275 -0
- package/src/docs/api.md +226 -0
- package/src/docs/example.md +461 -0
- package/src/docs/framework-integrations.md +714 -0
- package/src/docs/installation.md +281 -0
- package/src/index.js +894 -0
- package/src/styles/base.js +50 -0
- package/src/styles/changelog.js +665 -0
- package/src/styles/components.js +553 -0
- package/src/styles/design-tokens.js +124 -0
- package/src/styles/feedback.js +325 -0
- package/src/styles/messenger-components.js +632 -0
- package/src/styles/messenger-core.js +233 -0
- package/src/styles/messenger-features.js +169 -0
- package/src/styles/messenger-views.js +877 -0
- package/src/styles/messenger.js +17 -0
- package/src/styles/messengerCustomStyles.js +114 -0
- package/src/styles/styles.js +26 -0
- package/src/styles/survey.js +894 -0
- package/src/utils/errors.js +142 -0
- package/src/utils/helpers.js +219 -0
- package/src/widgets/BaseWidget.js +548 -0
- package/src/widgets/ButtonWidget.js +104 -0
- package/src/widgets/ChangelogWidget.js +615 -0
- package/src/widgets/InlineWidget.js +148 -0
- package/src/widgets/MessengerWidget.js +979 -0
- package/src/widgets/SurveyWidget.js +1325 -0
- package/src/widgets/TabWidget.js +45 -0
- package/src/widgets/WidgetFactory.js +70 -0
- package/src/widgets/messenger/MessengerState.js +323 -0
- package/src/widgets/messenger/components/MessengerLauncher.js +124 -0
- package/src/widgets/messenger/components/MessengerPanel.js +111 -0
- package/src/widgets/messenger/components/NavigationTabs.js +130 -0
- package/src/widgets/messenger/views/ChangelogView.js +167 -0
- package/src/widgets/messenger/views/ChatView.js +592 -0
- package/src/widgets/messenger/views/ConversationsView.js +244 -0
- package/src/widgets/messenger/views/HelpView.js +239 -0
- package/src/widgets/messenger/views/HomeView.js +300 -0
- package/src/widgets/messenger/views/PreChatFormView.js +109 -0
- 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
|
+
}
|