PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.76
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.76
51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 51.1.46 51.1.47 51.1.49 All 37 releases
king-addons / includes / extensions / Live_Chat / templates / admin-page.php

admin-page.php in King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder 51.1.76, at includes/extensions/Live_Chat/templates/admin-page.php

1,332 lines 46.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Live Chat admin page template.
4 *
5 * @package King_Addons
6 * @var array $options Current options
7 * @var bool $is_premium Whether premium is active
8 */
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 // Enqueue shared V3 styles
15 wp_enqueue_style(
16 'king-addons-admin-v3',
17 KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css',
18 [],
19 KING_ADDONS_VERSION
20 );
21
22 // Theme mode is per-user
23 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
24 $allowed_theme_modes = ['dark', 'light', 'auto'];
25 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
26 $theme_mode = 'dark';
27 }
28
29 $current_tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'inbox';
30 $conversation_id = isset($_GET['conversation']) ? intval($_GET['conversation']) : 0;
31 $saved = isset($_GET['saved']) && $_GET['saved'] === '1';
32 ?>
33 <style>
34 /* Page specific styles */
35 .ka-live-chat-page .ka-admin-wrap {
36 --ka-accent: #0066ff;
37 --ka-accent-hover: #0052cc;
38 }
39
40 /* Widget Mode Selector */
41 .ka-widget-mode-selector {
42 display: grid;
43 gap: 12px;
44 }
45
46 .ka-mode-option {
47 display: flex;
48 align-items: flex-start;
49 gap: 16px;
50 padding: 16px 20px;
51 background: #f8f9fa;
52 border: 2px solid #e5e5ea;
53 border-radius: 14px;
54 cursor: pointer;
55 transition: all 0.2s ease;
56 }
57
58 .ka-mode-option:hover {
59 border-color: #c5c5ca;
60 background: #f5f5f7;
61 }
62
63 .ka-mode-option.active,
64 .ka-mode-option:has(input:checked) {
65 border-color: var(--ka-accent);
66 background: #f0f7ff;
67 }
68
69 .ka-mode-option input {
70 display: none;
71 }
72
73 .ka-mode-icon {
74 width: 48px;
75 height: 48px;
76 background: linear-gradient(135deg, var(--ka-accent) 0%, #5ac8fa 100%);
77 border-radius: 12px;
78 display: flex;
79 align-items: center;
80 justify-content: center;
81 flex-shrink: 0;
82 }
83
84 .ka-mode-icon .dashicons {
85 color: #fff;
86 font-size: 24px;
87 width: 24px;
88 height: 24px;
89 }
90
91 .ka-mode-content {
92 flex: 1;
93 }
94
95 .ka-mode-title {
96 display: block;
97 font-size: 15px;
98 font-weight: 600;
99 color: #1d1d1f;
100 margin-bottom: 4px;
101 }
102
103 .ka-mode-desc {
104 display: block;
105 font-size: 13px;
106 color: #6e6e73;
107 line-height: 1.4;
108 }
109
110 .ka-v3-dark .ka-mode-option {
111 background: #1e1e1e;
112 border-color: #3a3a3a;
113 }
114
115 .ka-v3-dark .ka-mode-option:hover {
116 background: #2a2a2a;
117 border-color: #4a4a4a;
118 }
119
120 .ka-v3-dark .ka-mode-option.active,
121 .ka-v3-dark .ka-mode-option:has(input:checked) {
122 border-color: var(--ka-accent);
123 background: #0d1f33;
124 }
125
126 .ka-v3-dark .ka-mode-title {
127 color: #f5f5f7;
128 }
129
130 .ka-v3-dark .ka-mode-desc {
131 color: #8e8e93;
132 }
133
134 /* Inbox Layout */
135 .ka-inbox-layout {
136 display: grid;
137 grid-template-columns: 380px 1fr;
138 gap: 24px;
139 min-height: 600px;
140 }
141
142 .ka-inbox-list {
143 background: #fff;
144 border-radius: 20px;
145 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.04);
146 overflow: hidden;
147 display: flex;
148 flex-direction: column;
149 }
150
151 .ka-inbox-header {
152 padding: 20px;
153 border-bottom: 1px solid #f1f1f4;
154 }
155
156 .ka-inbox-filters {
157 display: flex;
158 gap: 8px;
159 margin-bottom: 12px;
160 }
161
162 .ka-inbox-filter {
163 padding: 6px 12px;
164 border: none;
165 background: #f5f5f7;
166 border-radius: 8px;
167 font-size: 13px;
168 cursor: pointer;
169 transition: all 0.2s;
170 }
171
172 .ka-inbox-filter:hover,
173 .ka-inbox-filter.active {
174 background: var(--ka-accent);
175 color: #fff;
176 }
177
178 .ka-inbox-search {
179 width: 100%;
180 padding: 10px 14px;
181 border: 1px solid #e5e5ea;
182 border-radius: 10px;
183 font-size: 14px;
184 }
185
186 .ka-inbox-search:focus {
187 outline: none;
188 border-color: var(--ka-accent);
189 }
190
191 .ka-inbox-conversations {
192 flex: 1;
193 overflow-y: auto;
194 }
195
196 .ka-inbox-item {
197 display: flex;
198 align-items: flex-start;
199 gap: 12px;
200 padding: 16px 20px;
201 border-bottom: 1px solid #f1f1f4;
202 cursor: pointer;
203 transition: background 0.2s;
204 }
205
206 .ka-inbox-item:hover,
207 .ka-inbox-item.active {
208 background: #f8f9fa;
209 }
210
211 .ka-inbox-item.unread {
212 background: #f0f7ff;
213 }
214
215 .ka-inbox-avatar {
216 width: 44px;
217 height: 44px;
218 border-radius: 50%;
219 background: var(--ka-accent);
220 color: #fff;
221 display: flex;
222 align-items: center;
223 justify-content: center;
224 font-weight: 600;
225 font-size: 16px;
226 flex-shrink: 0;
227 }
228
229 .ka-inbox-item-content {
230 flex: 1;
231 min-width: 0;
232 }
233
234 .ka-inbox-item-header {
235 display: flex;
236 justify-content: space-between;
237 align-items: center;
238 margin-bottom: 4px;
239 }
240
241 .ka-inbox-item-name {
242 font-weight: 600;
243 font-size: 14px;
244 color: #1d1d1f;
245 }
246
247 .ka-inbox-item-time {
248 font-size: 12px;
249 color: #86868b;
250 }
251
252 .ka-inbox-item-preview {
253 font-size: 13px;
254 color: #6e6e73;
255 white-space: nowrap;
256 overflow: hidden;
257 text-overflow: ellipsis;
258 }
259
260 .ka-inbox-badge {
261 background: var(--ka-accent);
262 color: #fff;
263 font-size: 11px;
264 font-weight: 600;
265 padding: 2px 6px;
266 border-radius: 10px;
267 margin-left: 8px;
268 }
269
270 .ka-inbox-empty {
271 padding: 40px 20px;
272 text-align: center;
273 color: #86868b;
274 }
275
276 /* Conversation View */
277 .ka-conversation-view {
278 background: #fff;
279 border-radius: 20px;
280 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.04);
281 display: flex;
282 flex-direction: column;
283 overflow: hidden;
284 }
285
286 .ka-conversation-header {
287 padding: 20px;
288 border-bottom: 1px solid #f1f1f4;
289 display: flex;
290 justify-content: space-between;
291 align-items: center;
292 }
293
294 .ka-conversation-info {
295 display: flex;
296 align-items: center;
297 gap: 12px;
298 }
299
300 .ka-conversation-details h3 {
301 margin: 0 0 4px;
302 font-size: 16px;
303 font-weight: 600;
304 }
305
306 .ka-conversation-email {
307 font-size: 13px;
308 color: #6e6e73;
309 }
310
311 .ka-conversation-actions {
312 display: flex;
313 gap: 8px;
314 }
315
316 .ka-conversation-btn {
317 padding: 8px 16px;
318 border: 1px solid #e5e5ea;
319 background: #fff;
320 border-radius: 8px;
321 font-size: 13px;
322 cursor: pointer;
323 transition: all 0.2s;
324 display: flex;
325 align-items: center;
326 gap: 6px;
327 }
328
329 .ka-conversation-btn:hover {
330 border-color: var(--ka-accent);
331 color: var(--ka-accent);
332 }
333
334 .ka-conversation-btn--danger:hover {
335 border-color: #ff3b30;
336 color: #ff3b30;
337 }
338
339 .ka-conversation-btn--primary {
340 background: var(--ka-accent);
341 color: #fff;
342 border-color: var(--ka-accent);
343 }
344
345 .ka-conversation-btn--primary:hover {
346 background: var(--ka-accent-hover);
347 color: #fff;
348 }
349
350 /* Messages */
351 .ka-conversation-messages {
352 flex: 1;
353 overflow-y: auto;
354 padding: 20px;
355 display: flex;
356 flex-direction: column;
357 gap: 16px;
358 max-height: 400px;
359 }
360
361 .ka-message {
362 max-width: 70%;
363 padding: 12px 16px;
364 border-radius: 16px;
365 font-size: 14px;
366 line-height: 1.5;
367 }
368
369 .ka-message--visitor {
370 background: #f5f5f7;
371 color: #1d1d1f;
372 align-self: flex-start;
373 border-bottom-left-radius: 4px;
374 }
375
376 .ka-message--admin {
377 background: var(--ka-accent);
378 color: #fff;
379 align-self: flex-end;
380 border-bottom-right-radius: 4px;
381 }
382
383 .ka-message-meta {
384 font-size: 11px;
385 margin-top: 6px;
386 opacity: 0.7;
387 }
388
389 /* Reply Form */
390 .ka-conversation-reply {
391 padding: 20px;
392 border-top: 1px solid #f1f1f4;
393 }
394
395 .ka-reply-form {
396 display: flex;
397 gap: 12px;
398 }
399
400 .ka-reply-textarea {
401 flex: 1;
402 padding: 12px 16px;
403 border: 1px solid #e5e5ea;
404 border-radius: 12px;
405 font-size: 14px;
406 resize: none;
407 min-height: 80px;
408 }
409
410 .ka-reply-textarea:focus {
411 outline: none;
412 border-color: var(--ka-accent);
413 }
414
415 .ka-reply-send {
416 padding: 12px 24px;
417 background: var(--ka-accent);
418 color: #fff;
419 border: none;
420 border-radius: 12px;
421 font-size: 14px;
422 font-weight: 500;
423 cursor: pointer;
424 transition: background 0.2s;
425 align-self: flex-end;
426 }
427
428 .ka-reply-send:hover {
429 background: var(--ka-accent-hover);
430 }
431
432 .ka-reply-send:disabled {
433 opacity: 0.6;
434 cursor: not-allowed;
435 }
436
437 /* Visitor Info Sidebar */
438 .ka-visitor-info {
439 padding: 20px;
440 border-top: 1px solid #f1f1f4;
441 background: #fafafa;
442 }
443
444 .ka-visitor-info h4 {
445 margin: 0 0 12px;
446 font-size: 13px;
447 font-weight: 600;
448 color: #86868b;
449 text-transform: uppercase;
450 }
451
452 .ka-visitor-info-item {
453 display: flex;
454 gap: 8px;
455 font-size: 13px;
456 margin-bottom: 8px;
457 word-break: break-all;
458 }
459
460 .ka-visitor-info-label {
461 color: #86868b;
462 flex-shrink: 0;
463 width: 80px;
464 }
465
466 .ka-visitor-info-value {
467 color: #1d1d1f;
468 }
469
470 /* Empty State */
471 .ka-conversation-empty {
472 display: flex;
473 flex-direction: column;
474 align-items: center;
475 justify-content: center;
476 height: 100%;
477 color: #86868b;
478 }
479
480 .ka-conversation-empty svg {
481 width: 80px;
482 height: 80px;
483 margin-bottom: 16px;
484 opacity: 0.3;
485 }
486
487 /* Status Badge */
488 .ka-status-open {
489 color: #34c759;
490 }
491
492 .ka-status-closed {
493 color: #86868b;
494 }
495
496 /* Loading */
497 .ka-loading {
498 display: flex;
499 align-items: center;
500 justify-content: center;
501 padding: 40px;
502 }
503
504 .ka-loading-spinner {
505 width: 32px;
506 height: 32px;
507 border: 3px solid #f1f1f4;
508 border-top-color: var(--ka-accent);
509 border-radius: 50%;
510 animation: ka-spin 0.8s linear infinite;
511 }
512
513 @keyframes ka-spin {
514 to { transform: rotate(360deg); }
515 }
516
517 /* Responsive */
518 @media (max-width: 1024px) {
519 .ka-inbox-layout {
520 grid-template-columns: 1fr;
521 }
522
523 .ka-inbox-list {
524 max-height: 400px;
525 }
526 }
527
528 /* Dark Mode - Full Dark Theme */
529 .ka-v3-dark .ka-live-chat-page {
530 background: #0a0a0a;
531 }
532
533 .ka-v3-dark .ka-admin-wrap {
534 background: #0a0a0a;
535 }
536
537 .ka-v3-dark .ka-inbox-list,
538 .ka-v3-dark .ka-conversation-view,
539 .ka-v3-dark .ka-card {
540 background: #141414;
541 border-color: #2a2a2a;
542 }
543
544 .ka-v3-dark .ka-inbox-header {
545 border-color: #2a2a2a;
546 }
547
548 .ka-v3-dark .ka-inbox-item {
549 border-color: #2a2a2a;
550 }
551
552 .ka-v3-dark .ka-inbox-item:hover,
553 .ka-v3-dark .ka-inbox-item.active {
554 background: #1e1e1e;
555 }
556
557 .ka-v3-dark .ka-inbox-item.unread {
558 background: #0d1f33;
559 }
560
561 .ka-v3-dark .ka-inbox-item-name,
562 .ka-v3-dark .ka-conversation-details h3,
563 .ka-v3-dark .ka-card-header h2 {
564 color: #f5f5f7;
565 }
566
567 .ka-v3-dark .ka-inbox-item-preview,
568 .ka-v3-dark .ka-inbox-item-time {
569 color: #8e8e93;
570 }
571
572 .ka-v3-dark .ka-inbox-search,
573 .ka-v3-dark .ka-reply-textarea,
574 .ka-v3-dark .ka-row-field input,
575 .ka-v3-dark .ka-row-field select,
576 .ka-v3-dark .ka-row-field textarea {
577 background: #1e1e1e;
578 border-color: #3a3a3a;
579 color: #f5f5f7;
580 }
581
582 .ka-v3-dark .ka-inbox-search:focus,
583 .ka-v3-dark .ka-row-field input:focus,
584 .ka-v3-dark .ka-row-field select:focus,
585 .ka-v3-dark .ka-row-field textarea:focus {
586 border-color: var(--ka-accent);
587 background: #1e1e1e;
588 }
589
590 .ka-v3-dark .ka-inbox-filter {
591 background: #1e1e1e;
592 color: #f5f5f7;
593 }
594
595 .ka-v3-dark .ka-inbox-filter.active,
596 .ka-v3-dark .ka-inbox-filter:hover {
597 background: var(--ka-accent);
598 color: #fff;
599 }
600
601 .ka-v3-dark .ka-message--visitor {
602 background: #1e1e1e;
603 color: #f5f5f7;
604 }
605
606 .ka-v3-dark .ka-message--admin {
607 background: var(--ka-accent);
608 color: #fff;
609 }
610
611 .ka-v3-dark .ka-visitor-info {
612 background: #0f0f0f;
613 border-color: #2a2a2a;
614 }
615
616 .ka-v3-dark .ka-visitor-info dt {
617 color: #8e8e93;
618 }
619
620 .ka-v3-dark .ka-visitor-info dd {
621 color: #f5f5f7;
622 }
623
624 .ka-v3-dark .ka-conversation-btn {
625 background: #1e1e1e;
626 border-color: #3a3a3a;
627 color: #f5f5f7;
628 }
629
630 .ka-v3-dark .ka-conversation-btn:hover {
631 background: #2a2a2a;
632 border-color: var(--ka-accent);
633 color: var(--ka-accent);
634 }
635
636 .ka-v3-dark .ka-conversation-header,
637 .ka-v3-dark .ka-card-header {
638 border-color: #2a2a2a;
639 }
640
641 .ka-v3-dark .ka-conversation-empty {
642 color: #6e6e73;
643 }
644
645 .ka-v3-dark .ka-conversation-empty svg {
646 stroke: #4a4a4a;
647 }
648
649 .ka-v3-dark .ka-row-label {
650 color: #c7c7cc;
651 }
652
653 .ka-v3-dark .ka-row-desc {
654 color: #6e6e73;
655 }
656
657 .ka-v3-dark .ka-tabs {
658 background: #141414;
659 border-color: #2a2a2a;
660 }
661
662 .ka-v3-dark .ka-tab {
663 color: #8e8e93;
664 }
665
666 .ka-v3-dark .ka-tab:hover,
667 .ka-v3-dark .ka-tab.active {
668 color: var(--ka-accent);
669 }
670
671 .ka-v3-dark .ka-admin-header {
672 border-color: #2a2a2a;
673 }
674
675 .ka-v3-dark .ka-admin-title {
676 color: #f5f5f7;
677 }
678
679 .ka-v3-dark .ka-admin-subtitle {
680 color: #8e8e93;
681 }
682
683 /* Save Button Styles */
684 .ka-save-btn {
685 display: inline-flex;
686 align-items: center;
687 gap: 8px;
688 padding: 14px 28px;
689 background: linear-gradient(135deg, #0066ff 0%, #0052cc 100%);
690 color: #fff;
691 border: none;
692 border-radius: 12px;
693 font-size: 15px;
694 font-weight: 600;
695 cursor: pointer;
696 transition: all 0.2s ease;
697 box-shadow: 0 4px 15px rgba(0, 102, 255, 0.25);
698 }
699
700 .ka-save-btn:hover {
701 transform: translateY(-2px);
702 box-shadow: 0 6px 20px rgba(0, 102, 255, 0.35);
703 }
704
705 .ka-save-btn:active {
706 transform: translateY(0);
707 }
708
709 .ka-save-btn .dashicons {
710 font-size: 18px;
711 width: 18px;
712 height: 18px;
713 }
714
715 .ka-card-footer {
716 background: transparent;
717 box-shadow: none;
718 padding: 24px 0;
719 }
720
721 .ka-v3-dark .ka-save-btn {
722 background: linear-gradient(135deg, #0077ff 0%, #0055cc 100%);
723 box-shadow: 0 4px 15px rgba(0, 102, 255, 0.3);
724 }
725
726 .ka-v3-dark .ka-save-btn:hover {
727 box-shadow: 0 6px 20px rgba(0, 102, 255, 0.4);
728 }
729 </style>
730
731 <div class="wrap ka-live-chat-page">
732 <script>
733 (function() {
734 const mode = '<?php echo esc_js($theme_mode); ?>';
735 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
736 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
737 document.documentElement.classList.toggle('ka-v3-dark', isDark);
738 document.body.classList.toggle('ka-v3-dark', isDark);
739 document.body.classList.add('ka-admin-v3');
740 })();
741 </script>
742
743 <div class="ka-admin-wrap">
744 <!-- Header -->
745 <div class="ka-admin-header">
746 <div class="ka-admin-header-left">
747 <div class="ka-admin-header-icon" style="background: linear-gradient(135deg, #0066ff 0%, #5ac8fa 100%);">
748 <span class="dashicons dashicons-format-chat"></span>
749 </div>
750 <div>
751 <h1 class="ka-admin-title"><?php esc_html_e('Live Chat', 'king-addons'); ?></h1>
752 <p class="ka-admin-subtitle"><?php esc_html_e('Real-time customer support', 'king-addons'); ?></p>
753 </div>
754 </div>
755 <div class="ka-admin-header-actions">
756 <?php if (!empty($options['enabled'])): ?>
757 <span class="ka-status-badge enabled">
758 <span class="ka-status-badge-dot"></span>
759 <?php esc_html_e('Online', 'king-addons'); ?>
760 </span>
761 <?php else: ?>
762 <span class="ka-status-badge disabled">
763 <span class="ka-status-badge-dot"></span>
764 <?php esc_html_e('Offline', 'king-addons'); ?>
765 </span>
766 <?php endif; ?>
767 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>">
768 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
769 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>">
770 <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span>
771 <?php esc_html_e('Light', 'king-addons'); ?>
772 </button>
773 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>">
774 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
775 <?php esc_html_e('Dark', 'king-addons'); ?>
776 </button>
777 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>">
778 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
779 <?php esc_html_e('Auto', 'king-addons'); ?>
780 </button>
781 </div>
782 </div>
783 </div>
784
785 <?php if ($saved): ?>
786 <div class="notice notice-success is-dismissible" style="margin: 20px 0;">
787 <p><?php esc_html_e('Settings saved successfully.', 'king-addons'); ?></p>
788 </div>
789 <?php endif; ?>
790
791 <!-- Tabs -->
792 <div class="ka-tabs">
793 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-live-chat&tab=inbox')); ?>"
794 class="ka-tab <?php echo $current_tab === 'inbox' ? 'active' : ''; ?>">
795 <?php esc_html_e('Inbox', 'king-addons'); ?>
796 </a>
797 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-live-chat&tab=settings')); ?>"
798 class="ka-tab <?php echo $current_tab === 'settings' ? 'active' : ''; ?>">
799 <?php esc_html_e('Settings', 'king-addons'); ?>
800 </a>
801 </div>
802
803 <?php if ($current_tab === 'inbox'): ?>
804 <!-- Inbox View -->
805 <div class="ka-inbox-layout">
806 <!-- Conversations List -->
807 <div class="ka-inbox-list">
808 <div class="ka-inbox-header">
809 <div class="ka-inbox-filters">
810 <button type="button" class="ka-inbox-filter active" data-status="all">
811 <?php esc_html_e('All', 'king-addons'); ?>
812 </button>
813 <button type="button" class="ka-inbox-filter" data-status="open">
814 <?php esc_html_e('Open', 'king-addons'); ?>
815 </button>
816 <button type="button" class="ka-inbox-filter" data-status="closed">
817 <?php esc_html_e('Closed', 'king-addons'); ?>
818 </button>
819 </div>
820 <input type="text" class="ka-inbox-search" placeholder="<?php esc_attr_e('Search conversations...', 'king-addons'); ?>">
821 </div>
822 <div class="ka-inbox-conversations" id="ka-inbox-conversations">
823 <div class="ka-loading">
824 <div class="ka-loading-spinner"></div>
825 </div>
826 </div>
827 </div>
828
829 <!-- Conversation View -->
830 <div class="ka-conversation-view" id="ka-conversation-view">
831 <div class="ka-conversation-empty">
832 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
833 <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/>
834 </svg>
835 <p><?php esc_html_e('Select a conversation to view messages', 'king-addons'); ?></p>
836 </div>
837 </div>
838 </div>
839
840 <?php else: ?>
841 <!-- Settings View -->
842 <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post">
843 <input type="hidden" name="action" value="king_addons_live_chat_save">
844 <?php wp_nonce_field('king_addons_live_chat_save', 'king_live_chat_nonce'); ?>
845
846 <!-- General Settings -->
847 <div class="ka-card">
848 <div class="ka-card-header">
849 <span class="dashicons dashicons-admin-settings"></span>
850 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
851 </div>
852 <div class="ka-card-body">
853 <div class="ka-row">
854 <div class="ka-row-label"><?php esc_html_e('Enable Chat Widget', 'king-addons'); ?></div>
855 <div class="ka-row-field">
856 <label class="ka-toggle">
857 <input type="checkbox" name="enabled" value="1" <?php checked(!empty($options['enabled'])); ?>>
858 <span class="ka-toggle-slider"></span>
859 <span class="ka-toggle-label"><?php esc_html_e('Show chat widget on frontend', 'king-addons'); ?></span>
860 </label>
861 </div>
862 </div>
863
864 <!-- Widget Mode -->
865 <div class="ka-row">
866 <div class="ka-row-label"><?php esc_html_e('Widget Mode', 'king-addons'); ?></div>
867 <div class="ka-row-field">
868 <div class="ka-widget-mode-selector">
869 <label class="ka-mode-option <?php echo ($options['widget_mode'] ?? 'live_chat') === 'live_chat' ? 'active' : ''; ?>">
870 <input type="radio" name="widget_mode" value="live_chat" <?php checked(($options['widget_mode'] ?? 'live_chat'), 'live_chat'); ?>>
871 <span class="ka-mode-icon">
872 <span class="dashicons dashicons-format-chat"></span>
873 </span>
874 <span class="ka-mode-content">
875 <span class="ka-mode-title"><?php esc_html_e('Live Chat', 'king-addons'); ?></span>
876 <span class="ka-mode-desc"><?php esc_html_e('Real-time messaging with polling. Visitors can have ongoing conversations.', 'king-addons'); ?></span>
877 </span>
878 </label>
879 <label class="ka-mode-option <?php echo ($options['widget_mode'] ?? 'live_chat') === 'contact_form' ? 'active' : ''; ?>">
880 <input type="radio" name="widget_mode" value="contact_form" <?php checked(($options['widget_mode'] ?? 'live_chat'), 'contact_form'); ?>>
881 <span class="ka-mode-icon">
882 <span class="dashicons dashicons-email-alt"></span>
883 </span>
884 <span class="ka-mode-content">
885 <span class="ka-mode-title"><?php esc_html_e('Contact Form', 'king-addons'); ?></span>
886 <span class="ka-mode-desc"><?php esc_html_e('Simple contact form. Messages are sent via email, no real-time chat.', 'king-addons'); ?></span>
887 </span>
888 </label>
889 </div>
890 </div>
891 </div>
892
893 <div class="ka-grid-2">
894 <div class="ka-row">
895 <div class="ka-row-label"><?php esc_html_e('Position', 'king-addons'); ?></div>
896 <div class="ka-row-field">
897 <select name="position">
898 <option value="right" <?php selected($options['position'], 'right'); ?>><?php esc_html_e('Right', 'king-addons'); ?></option>
899 <option value="left" <?php selected($options['position'], 'left'); ?>><?php esc_html_e('Left', 'king-addons'); ?></option>
900 </select>
901 </div>
902 </div>
903 <div class="ka-row">
904 <div class="ka-row-label"><?php esc_html_e('Z-Index', 'king-addons'); ?></div>
905 <div class="ka-row-field">
906 <input type="number" name="z_index" value="<?php echo esc_attr($options['z_index']); ?>" min="1">
907 </div>
908 </div>
909 <div class="ka-row">
910 <div class="ka-row-label"><?php esc_html_e('Bottom Offset', 'king-addons'); ?></div>
911 <div class="ka-row-field">
912 <input type="number" name="offset_bottom" value="<?php echo esc_attr($options['offset_bottom']); ?>" min="0">
913 <span style="color:#64748b;margin-left:6px">px</span>
914 </div>
915 </div>
916 <div class="ka-row">
917 <div class="ka-row-label"><?php esc_html_e('Side Offset', 'king-addons'); ?></div>
918 <div class="ka-row-field">
919 <input type="number" name="offset_side" value="<?php echo esc_attr($options['offset_side']); ?>" min="0">
920 <span style="color:#64748b;margin-left:6px">px</span>
921 </div>
922 </div>
923 </div>
924 </div>
925 </div>
926
927 <!-- Appearance -->
928 <div class="ka-card">
929 <div class="ka-card-header">
930 <span class="dashicons dashicons-art"></span>
931 <h2><?php esc_html_e('Appearance', 'king-addons'); ?></h2>
932 </div>
933 <div class="ka-card-body">
934 <div class="ka-grid-2">
935 <div class="ka-row">
936 <div class="ka-row-label"><?php esc_html_e('Button Size', 'king-addons'); ?></div>
937 <div class="ka-row-field">
938 <input type="number" name="button_size" value="<?php echo esc_attr($options['button_size']); ?>" min="40" max="80">
939 <span style="color:#64748b;margin-left:6px">px</span>
940 </div>
941 </div>
942 <div class="ka-row">
943 <div class="ka-row-label"><?php esc_html_e('Button Color', 'king-addons'); ?></div>
944 <div class="ka-row-field">
945 <input type="text" name="button_color" value="<?php echo esc_attr($options['button_color']); ?>" class="ka-color-picker">
946 </div>
947 </div>
948 <div class="ka-row">
949 <div class="ka-row-label"><?php esc_html_e('Chat Width', 'king-addons'); ?></div>
950 <div class="ka-row-field">
951 <input type="number" name="chat_width" value="<?php echo esc_attr($options['chat_width']); ?>" min="300" max="500">
952 <span style="color:#64748b;margin-left:6px">px</span>
953 </div>
954 </div>
955 <div class="ka-row">
956 <div class="ka-row-label"><?php esc_html_e('Chat Height', 'king-addons'); ?></div>
957 <div class="ka-row-field">
958 <input type="number" name="chat_height" value="<?php echo esc_attr($options['chat_height']); ?>" min="400" max="700">
959 <span style="color:#64748b;margin-left:6px">px</span>
960 </div>
961 </div>
962 </div>
963
964 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Colors', 'king-addons'); ?></h4>
965 <div class="ka-grid-2">
966 <div class="ka-row">
967 <div class="ka-row-label"><?php esc_html_e('Header Background', 'king-addons'); ?></div>
968 <div class="ka-row-field">
969 <input type="text" name="header_bg" value="<?php echo esc_attr($options['header_bg']); ?>" class="ka-color-picker">
970 </div>
971 </div>
972 <div class="ka-row">
973 <div class="ka-row-label"><?php esc_html_e('Header Text', 'king-addons'); ?></div>
974 <div class="ka-row-field">
975 <input type="text" name="header_text_color" value="<?php echo esc_attr($options['header_text_color']); ?>" class="ka-color-picker">
976 </div>
977 </div>
978 <div class="ka-row">
979 <div class="ka-row-label"><?php esc_html_e('Chat Background', 'king-addons'); ?></div>
980 <div class="ka-row-field">
981 <input type="text" name="chat_bg" value="<?php echo esc_attr($options['chat_bg']); ?>" class="ka-color-picker">
982 </div>
983 </div>
984 </div>
985
986 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Message Bubbles', 'king-addons'); ?></h4>
987 <div class="ka-grid-2">
988 <div class="ka-row">
989 <div class="ka-row-label"><?php esc_html_e('Visitor Message BG', 'king-addons'); ?></div>
990 <div class="ka-row-field">
991 <input type="text" name="visitor_msg_bg" value="<?php echo esc_attr($options['visitor_msg_bg']); ?>" class="ka-color-picker">
992 </div>
993 </div>
994 <div class="ka-row">
995 <div class="ka-row-label"><?php esc_html_e('Visitor Message Text', 'king-addons'); ?></div>
996 <div class="ka-row-field">
997 <input type="text" name="visitor_msg_text" value="<?php echo esc_attr($options['visitor_msg_text']); ?>" class="ka-color-picker">
998 </div>
999 </div>
1000 <div class="ka-row">
1001 <div class="ka-row-label"><?php esc_html_e('Admin Message BG', 'king-addons'); ?></div>
1002 <div class="ka-row-field">
1003 <input type="text" name="admin_msg_bg" value="<?php echo esc_attr($options['admin_msg_bg']); ?>" class="ka-color-picker">
1004 </div>
1005 </div>
1006 <div class="ka-row">
1007 <div class="ka-row-label"><?php esc_html_e('Admin Message Text', 'king-addons'); ?></div>
1008 <div class="ka-row-field">
1009 <input type="text" name="admin_msg_text" value="<?php echo esc_attr($options['admin_msg_text']); ?>" class="ka-color-picker">
1010 </div>
1011 </div>
1012 </div>
1013 </div>
1014 </div>
1015
1016 <!-- Texts -->
1017 <div class="ka-card">
1018 <div class="ka-card-header">
1019 <span class="dashicons dashicons-editor-textcolor"></span>
1020 <h2><?php esc_html_e('Texts', 'king-addons'); ?></h2>
1021 </div>
1022 <div class="ka-card-body">
1023 <div class="ka-grid-2">
1024 <div class="ka-row">
1025 <div class="ka-row-label"><?php esc_html_e('Header Title', 'king-addons'); ?></div>
1026 <div class="ka-row-field">
1027 <input type="text" name="header_title" value="<?php echo esc_attr($options['header_title']); ?>">
1028 </div>
1029 </div>
1030 <div class="ka-row">
1031 <div class="ka-row-label"><?php esc_html_e('Header Subtitle', 'king-addons'); ?></div>
1032 <div class="ka-row-field">
1033 <input type="text" name="header_subtitle" value="<?php echo esc_attr($options['header_subtitle']); ?>">
1034 </div>
1035 </div>
1036 </div>
1037 <div class="ka-row">
1038 <div class="ka-row-label"><?php esc_html_e('Input Placeholder', 'king-addons'); ?></div>
1039 <div class="ka-row-field">
1040 <input type="text" name="placeholder" value="<?php echo esc_attr($options['placeholder']); ?>">
1041 </div>
1042 </div>
1043 <div class="ka-row">
1044 <div class="ka-row-label"><?php esc_html_e('Welcome Message', 'king-addons'); ?></div>
1045 <div class="ka-row-field">
1046 <textarea name="welcome_message" rows="2"><?php echo esc_textarea($options['welcome_message']); ?></textarea>
1047 <p class="ka-row-desc"><?php esc_html_e('Shown as first message when chat is opened', 'king-addons'); ?></p>
1048 </div>
1049 </div>
1050 <div class="ka-row">
1051 <div class="ka-row-label"><?php esc_html_e('Offline Message', 'king-addons'); ?></div>
1052 <div class="ka-row-field">
1053 <textarea name="offline_message" rows="2"><?php echo esc_textarea($options['offline_message']); ?></textarea>
1054 </div>
1055 </div>
1056
1057 <!-- Contact Form Mode specific -->
1058 <div class="ka-contact-form-fields" style="display: <?php echo ($options['widget_mode'] ?? 'live_chat') === 'contact_form' ? 'block' : 'none'; ?>;">
1059 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Contact Form Mode', 'king-addons'); ?></h4>
1060 <div class="ka-row">
1061 <div class="ka-row-label"><?php esc_html_e('Subject Label', 'king-addons'); ?></div>
1062 <div class="ka-row-field">
1063 <input type="text" name="subject_label" value="<?php echo esc_attr($options['subject_label'] ?? __('Subject', 'king-addons')); ?>">
1064 </div>
1065 </div>
1066 <div class="ka-row">
1067 <div class="ka-row-label"><?php esc_html_e('Message Label', 'king-addons'); ?></div>
1068 <div class="ka-row-field">
1069 <input type="text" name="message_label" value="<?php echo esc_attr($options['message_label'] ?? __('Your message', 'king-addons')); ?>">
1070 </div>
1071 </div>
1072 <div class="ka-row">
1073 <div class="ka-row-label"><?php esc_html_e('Submit Button', 'king-addons'); ?></div>
1074 <div class="ka-row-field">
1075 <input type="text" name="submit_button" value="<?php echo esc_attr($options['submit_button'] ?? __('Send Message', 'king-addons')); ?>">
1076 </div>
1077 </div>
1078 <div class="ka-row">
1079 <div class="ka-row-label"><?php esc_html_e('Success Message', 'king-addons'); ?></div>
1080 <div class="ka-row-field">
1081 <textarea name="success_message" rows="2"><?php echo esc_textarea($options['success_message'] ?? __('Thank you! Your message has been sent. We\'ll get back to you soon.', 'king-addons')); ?></textarea>
1082 </div>
1083 </div>
1084 </div>
1085 </div>
1086 </div>
1087
1088 <!-- Pre-chat Form -->
1089 <div class="ka-card">
1090 <div class="ka-card-header">
1091 <span class="dashicons dashicons-id-alt"></span>
1092 <h2><?php esc_html_e('Pre-chat Form', 'king-addons'); ?></h2>
1093 </div>
1094 <div class="ka-card-body">
1095 <div class="ka-grid-2">
1096 <div class="ka-row">
1097 <div class="ka-row-label"><?php esc_html_e('Require Name', 'king-addons'); ?></div>
1098 <div class="ka-row-field">
1099 <label class="ka-toggle">
1100 <input type="checkbox" name="require_name" value="1" <?php checked(!empty($options['require_name'])); ?>>
1101 <span class="ka-toggle-slider"></span>
1102 </label>
1103 </div>
1104 </div>
1105 <div class="ka-row">
1106 <div class="ka-row-label"><?php esc_html_e('Require Email', 'king-addons'); ?></div>
1107 <div class="ka-row-field">
1108 <label class="ka-toggle">
1109 <input type="checkbox" name="require_email" value="1" <?php checked(!empty($options['require_email'])); ?>>
1110 <span class="ka-toggle-slider"></span>
1111 </label>
1112 </div>
1113 </div>
1114 <div class="ka-row">
1115 <div class="ka-row-label"><?php esc_html_e('Name Label', 'king-addons'); ?></div>
1116 <div class="ka-row-field">
1117 <input type="text" name="name_label" value="<?php echo esc_attr($options['name_label']); ?>">
1118 </div>
1119 </div>
1120 <div class="ka-row">
1121 <div class="ka-row-label"><?php esc_html_e('Email Label', 'king-addons'); ?></div>
1122 <div class="ka-row-field">
1123 <input type="text" name="email_label" value="<?php echo esc_attr($options['email_label']); ?>">
1124 </div>
1125 </div>
1126 </div>
1127 <div class="ka-row">
1128 <div class="ka-row-label"><?php esc_html_e('Start Chat Button', 'king-addons'); ?></div>
1129 <div class="ka-row-field">
1130 <input type="text" name="start_chat_button" value="<?php echo esc_attr($options['start_chat_button']); ?>">
1131 </div>
1132 </div>
1133 </div>
1134 </div>
1135
1136 <!-- Email Notifications -->
1137 <div class="ka-card">
1138 <div class="ka-card-header">
1139 <span class="dashicons dashicons-email"></span>
1140 <h2><?php esc_html_e('Email Notifications', 'king-addons'); ?></h2>
1141 </div>
1142 <div class="ka-card-body">
1143 <div class="ka-row">
1144 <div class="ka-row-label"><?php esc_html_e('Admin Email', 'king-addons'); ?></div>
1145 <div class="ka-row-field">
1146 <input type="email" name="admin_email" value="<?php echo esc_attr($options['admin_email']); ?>">
1147 <p class="ka-row-desc"><?php esc_html_e('Where to send new conversation notifications', 'king-addons'); ?></p>
1148 </div>
1149 </div>
1150 <div class="ka-grid-2">
1151 <div class="ka-row">
1152 <div class="ka-row-label"><?php esc_html_e('New Conversation', 'king-addons'); ?></div>
1153 <div class="ka-row-field">
1154 <label class="ka-toggle">
1155 <input type="checkbox" name="notify_new_conversation" value="1" <?php checked(!empty($options['notify_new_conversation'])); ?>>
1156 <span class="ka-toggle-slider"></span>
1157 <span class="ka-toggle-label"><?php esc_html_e('Email on new conversation', 'king-addons'); ?></span>
1158 </label>
1159 </div>
1160 </div>
1161 <div class="ka-row">
1162 <div class="ka-row-label"><?php esc_html_e('New Messages', 'king-addons'); ?></div>
1163 <div class="ka-row-field">
1164 <label class="ka-toggle">
1165 <input type="checkbox" name="notify_new_message" value="1" <?php checked(!empty($options['notify_new_message'])); ?>>
1166 <span class="ka-toggle-slider"></span>
1167 <span class="ka-toggle-label"><?php esc_html_e('Email on each new message', 'king-addons'); ?></span>
1168 </label>
1169 </div>
1170 </div>
1171 </div>
1172 <div class="ka-grid-2">
1173 <div class="ka-row">
1174 <div class="ka-row-label"><?php esc_html_e('Admin Email Subject', 'king-addons'); ?></div>
1175 <div class="ka-row-field">
1176 <input type="text" name="email_subject_admin" value="<?php echo esc_attr($options['email_subject_admin']); ?>">
1177 <p class="ka-row-desc"><?php esc_html_e('Use {visitor_name}, {site_name}', 'king-addons'); ?></p>
1178 </div>
1179 </div>
1180 <div class="ka-row">
1181 <div class="ka-row-label"><?php esc_html_e('Visitor Email Subject', 'king-addons'); ?></div>
1182 <div class="ka-row-field">
1183 <input type="text" name="email_subject_visitor" value="<?php echo esc_attr($options['email_subject_visitor']); ?>">
1184 </div>
1185 </div>
1186 </div>
1187 </div>
1188 </div>
1189
1190 <!-- Advanced -->
1191 <div class="ka-card">
1192 <div class="ka-card-header">
1193 <span class="dashicons dashicons-admin-generic"></span>
1194 <h2><?php esc_html_e('Advanced', 'king-addons'); ?></h2>
1195 </div>
1196 <div class="ka-card-body">
1197 <div class="ka-row">
1198 <div class="ka-row-label"><?php esc_html_e('Polling Interval', 'king-addons'); ?></div>
1199 <div class="ka-row-field">
1200 <input type="number" name="poll_interval" value="<?php echo esc_attr($options['poll_interval']); ?>" min="2000" max="10000" step="500">
1201 <span style="color:#64748b;margin-left:6px">ms</span>
1202 <p class="ka-row-desc"><?php esc_html_e('How often to check for new messages (lower = faster but more server load)', 'king-addons'); ?></p>
1203 </div>
1204 </div>
1205 </div>
1206 </div>
1207
1208 <!-- Save Button -->
1209 <div class="ka-card ka-card-footer">
1210 <button type="submit" class="ka-save-btn">
1211 <span class="dashicons dashicons-saved"></span>
1212 <?php esc_html_e('Save Settings', 'king-addons'); ?>
1213 </button>
1214 </div>
1215 </form>
1216 <?php endif; ?>
1217 </div>
1218
1219 <script>
1220 (function() {
1221 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
1222 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
1223 const segment = document.getElementById('ka-v3-theme-segment');
1224 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
1225 let mode = (segment && segment.getAttribute('data-active') ? segment.getAttribute('data-active') : 'dark').toString();
1226 let mqlHandler = null;
1227
1228 function saveUISetting(key, value) {
1229 const body = new URLSearchParams();
1230 body.set('action', 'king_addons_save_dashboard_ui');
1231 body.set('nonce', nonce);
1232 body.set('key', key);
1233 body.set('value', value);
1234 fetch(ajaxUrl, {
1235 method: 'POST',
1236 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
1237 body: body.toString()
1238 });
1239 }
1240
1241 function updateSegment(activeMode) {
1242 if (!segment) {
1243 return;
1244 }
1245 segment.setAttribute('data-active', activeMode);
1246 segment.querySelectorAll('.ka-v3-segmented-btn').forEach((btn) => {
1247 const theme = btn.getAttribute('data-theme');
1248 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
1249 });
1250 }
1251
1252 function applyTheme(isDark) {
1253 document.body.classList.toggle('ka-v3-dark', isDark);
1254 document.documentElement.classList.toggle('ka-v3-dark', isDark);
1255 }
1256
1257 function setThemeMode(nextMode, save) {
1258 mode = nextMode;
1259 updateSegment(nextMode);
1260
1261 if (mqlHandler && mql) {
1262 if (mql.removeEventListener) {
1263 mql.removeEventListener('change', mqlHandler);
1264 } else if (mql.removeListener) {
1265 mql.removeListener(mqlHandler);
1266 }
1267 mqlHandler = null;
1268 }
1269
1270 if (nextMode === 'auto') {
1271 applyTheme(!!(mql && mql.matches));
1272 mqlHandler = (e) => {
1273 if (mode !== 'auto') {
1274 return;
1275 }
1276 applyTheme(!!e.matches);
1277 };
1278 if (mql) {
1279 if (mql.addEventListener) {
1280 mql.addEventListener('change', mqlHandler);
1281 } else if (mql.addListener) {
1282 mql.addListener(mqlHandler);
1283 }
1284 }
1285 } else {
1286 applyTheme(nextMode === 'dark');
1287 }
1288
1289 if (save) {
1290 saveUISetting('theme_mode', nextMode);
1291 }
1292 }
1293
1294 window.kaV3ToggleDark = function() {
1295 const isDark = document.body.classList.contains('ka-v3-dark');
1296 setThemeMode(isDark ? 'light' : 'dark', true);
1297 };
1298
1299 if (segment) {
1300 segment.addEventListener('click', function(e) {
1301 const btn = e.target.closest('.ka-v3-segmented-btn');
1302 if (!btn) return;
1303 e.preventDefault();
1304 setThemeMode((btn.getAttribute('data-theme') || 'dark').toString(), true);
1305 });
1306 }
1307
1308 if (segment) {
1309 setThemeMode(mode, false);
1310 }
1311 })();
1312
1313 // Widget mode toggle
1314 document.querySelectorAll('input[name="widget_mode"]').forEach(function(radio) {
1315 radio.addEventListener('change', function() {
1316 const contactFormFields = document.querySelector('.ka-contact-form-fields');
1317 const modeOptions = document.querySelectorAll('.ka-mode-option');
1318
1319 modeOptions.forEach(function(opt) {
1320 opt.classList.remove('active');
1321 });
1322
1323 this.closest('.ka-mode-option').classList.add('active');
1324
1325 if (contactFormFields) {
1326 contactFormFields.style.display = this.value === 'contact_form' ? 'block' : 'none';
1327 }
1328 });
1329 });
1330 </script>
1331 </div>
1332