mirror of
https://github.com/myronblair/tomsjavajive
synced 2026-06-30 17:50:32 -05:00
Switch email to CyberMail API; integrations page manages API key via DB
This commit is contained in:
+43
-45
@@ -3,33 +3,31 @@
|
||||
* Tom's Java Jive - Admin Integrations Settings
|
||||
*/
|
||||
|
||||
// Auth only — no HTML yet
|
||||
require_once __DIR__ . '/../includes/auth.php';
|
||||
AdminAuth::require();
|
||||
|
||||
// Handle POST before any output
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$section = $_POST['section'] ?? '';
|
||||
|
||||
if ($section === 'cybermail') {
|
||||
setSetting('cybermail_api_key', trim($_POST['cybermail_api_key'] ?? ''));
|
||||
setSetting('cybermail_from_email', trim($_POST['cybermail_from_email'] ?? ''));
|
||||
setSetting('cybermail_from_name', trim($_POST['cybermail_from_name'] ?? ''));
|
||||
setSetting('email_notifications_enabled', isset($_POST['email_notifications_enabled']) ? '1' : '0');
|
||||
setFlash('success', 'CyberMail settings saved.');
|
||||
if ($section === 'email') {
|
||||
setSetting('cybermail_api_key', trim($_POST['cybermail_api_key'] ?? ''));
|
||||
setSetting('cybermail_from_email', trim($_POST['cybermail_from_email'] ?? ''));
|
||||
setSetting('cybermail_from_name', trim($_POST['cybermail_from_name'] ?? ''));
|
||||
setSetting('email_notifications_enabled', isset($_POST['email_notifications_enabled']) ? '1' : '0');
|
||||
setFlash('success', 'Email settings saved.');
|
||||
}
|
||||
|
||||
if ($section === 'twilio') {
|
||||
setSetting('twilio_account_sid', trim($_POST['twilio_account_sid'] ?? ''));
|
||||
setSetting('twilio_auth_token', trim($_POST['twilio_auth_token'] ?? ''));
|
||||
setSetting('twilio_phone_number', trim($_POST['twilio_phone_number'] ?? ''));
|
||||
setSetting('twilio_account_sid', trim($_POST['twilio_account_sid'] ?? ''));
|
||||
setSetting('twilio_auth_token', trim($_POST['twilio_auth_token'] ?? ''));
|
||||
setSetting('twilio_phone_number', trim($_POST['twilio_phone_number'] ?? ''));
|
||||
setSetting('sms_notifications_enabled', isset($_POST['sms_notifications_enabled']) ? '1' : '0');
|
||||
setFlash('success', 'Twilio settings saved.');
|
||||
}
|
||||
|
||||
if ($section === 'push') {
|
||||
setSetting('vapid_public_key', trim($_POST['vapid_public_key'] ?? ''));
|
||||
setSetting('vapid_private_key', trim($_POST['vapid_private_key'] ?? ''));
|
||||
setSetting('vapid_public_key', trim($_POST['vapid_public_key'] ?? ''));
|
||||
setSetting('vapid_private_key', trim($_POST['vapid_private_key'] ?? ''));
|
||||
setSetting('push_notifications_enabled', isset($_POST['push_notifications_enabled']) ? '1' : '0');
|
||||
setFlash('success', 'Push notification settings saved.');
|
||||
}
|
||||
@@ -43,23 +41,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
exit;
|
||||
}
|
||||
|
||||
// --- GET: render page ---
|
||||
ob_start();
|
||||
$pageTitle = 'Integrations';
|
||||
$currentPage = 'integrations';
|
||||
require_once __DIR__ . '/includes/header.php';
|
||||
|
||||
// Load current settings
|
||||
$cm = [
|
||||
'api_key' => getSetting('cybermail_api_key', ''),
|
||||
'from_email' => getSetting('cybermail_from_email', 'noreply@tomsjavajive.com'),
|
||||
'from_name' => getSetting('cybermail_from_name', "Tom's Java Jive"),
|
||||
'enabled' => getSetting('email_notifications_enabled', '0'),
|
||||
$email = [
|
||||
'api_key' => getSetting('cybermail_api_key', ''),
|
||||
'from' => getSetting('cybermail_from_email', 'noreply@tomsjavajive.com'),
|
||||
'from_name' => getSetting('cybermail_from_name', "Tom's Java Jive"),
|
||||
'enabled' => getSetting('email_notifications_enabled', '0'),
|
||||
];
|
||||
$tw = [
|
||||
'sid' => getSetting('twilio_account_sid', ''),
|
||||
'token' => getSetting('twilio_auth_token', ''),
|
||||
'phone' => getSetting('twilio_phone_number', ''),
|
||||
'sid' => getSetting('twilio_account_sid', ''),
|
||||
'token' => getSetting('twilio_auth_token', ''),
|
||||
'phone' => getSetting('twilio_phone_number', ''),
|
||||
'enabled' => getSetting('sms_notifications_enabled', '0'),
|
||||
];
|
||||
$push = [
|
||||
@@ -75,10 +71,10 @@ $loyaltyEnabled = getSetting('loyalty_enabled', '1') === '1';
|
||||
.integration-header { display: flex; justify-content: space-between; align-items: center; padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--admin-border); }
|
||||
.integration-title { display: flex; align-items: center; gap: 1rem; }
|
||||
.integration-icon { width: 48px; height: 48px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; }
|
||||
.integration-icon.cybermail { background: #0ea5e9; color: white; }
|
||||
.integration-icon.twilio { background: #F22F46; color: white; }
|
||||
.integration-icon.push { background: #8B5CF6; color: white; }
|
||||
.integration-icon.loyalty { background: #F59E0B; color: white; }
|
||||
.integration-icon.email { background: #0ea5e9; color: white; }
|
||||
.integration-icon.twilio { background: #F22F46; color: white; }
|
||||
.integration-icon.push { background: #8B5CF6; color: white; }
|
||||
.integration-icon.loyalty { background: #F59E0B; color: white; }
|
||||
.integration-body { padding: 1.5rem; }
|
||||
.status-badge { padding: .375rem .75rem; border-radius: 20px; font-size: .75rem; font-weight: 600; }
|
||||
.status-badge.configured { background: rgba(16,185,129,.1); color: var(--admin-success); }
|
||||
@@ -99,49 +95,51 @@ $loyaltyEnabled = getSetting('loyalty_enabled', '1') === '1';
|
||||
<div class="alert alert-success mb-2"><i class="fas fa-check-circle"></i> <?= getFlash('success') ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- CyberMail -->
|
||||
<!-- Email — CyberMail -->
|
||||
<div class="integration-card">
|
||||
<div class="integration-header">
|
||||
<div class="integration-title">
|
||||
<div class="integration-icon cybermail"><i class="fas fa-envelope"></i></div>
|
||||
<div class="integration-icon email"><i class="fas fa-envelope"></i></div>
|
||||
<div>
|
||||
<h3 style="margin:0;">CyberMail</h3>
|
||||
<p style="margin:.25rem 0 0;color:var(--admin-text-muted);font-size:.875rem;">Transactional email — order confirmations, shipping updates</p>
|
||||
<h3 style="margin:0;">Email — CyberMail</h3>
|
||||
<p style="margin:.25rem 0 0;color:var(--admin-text-muted);font-size:.875rem;">Transactional email — order confirmations, shipping updates, password resets</p>
|
||||
</div>
|
||||
</div>
|
||||
<?php $cmOk = !empty($cm['api_key']); $cmOn = $cm['enabled'] === '1'; ?>
|
||||
<span class="status-badge <?= $cmOk && $cmOn ? 'enabled' : ($cmOk ? 'configured' : 'not-configured') ?>">
|
||||
<?= $cmOk && $cmOn ? 'Enabled' : ($cmOk ? 'Configured' : 'Not Configured') ?>
|
||||
<?php $emailOk = !empty($email['api_key']); $emailOn = $email['enabled'] === '1'; ?>
|
||||
<span class="status-badge <?= $emailOk && $emailOn ? 'enabled' : ($emailOk ? 'configured' : 'not-configured') ?>">
|
||||
<?= $emailOk && $emailOn ? 'Enabled' : ($emailOk ? 'Configured' : 'Not Configured') ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="integration-body">
|
||||
<form method="POST">
|
||||
<input type="hidden" name="section" value="cybermail">
|
||||
<input type="hidden" name="section" value="email">
|
||||
<div class="form-group">
|
||||
<label class="form-label">CyberMail API Key</label>
|
||||
<input type="password" name="cybermail_api_key" class="form-input key-input"
|
||||
value="<?= htmlspecialchars($cm['api_key']) ?>" placeholder="sk_live_...">
|
||||
value="<?= htmlspecialchars($email['api_key']) ?>" placeholder="sk_live_...">
|
||||
<p class="help-text">Manage at <a href="https://platform.cyberpersons.com/email/api-keys/" target="_blank" class="help-link">CyberMail Dashboard</a></p>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label class="form-label">From Email</label>
|
||||
<input type="email" name="cybermail_from_email" class="form-input" value="<?= htmlspecialchars($cm['from_email']) ?>">
|
||||
<input type="email" name="cybermail_from_email" class="form-input"
|
||||
value="<?= htmlspecialchars($email['from']) ?>">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">From Name</label>
|
||||
<input type="text" name="cybermail_from_name" class="form-input" value="<?= htmlspecialchars($cm['from_name']) ?>">
|
||||
<input type="text" name="cybermail_from_name" class="form-input"
|
||||
value="<?= htmlspecialchars($email['from_name']) ?>">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-checkbox">
|
||||
<input type="checkbox" name="email_notifications_enabled" value="1" <?= $cmOn ? 'checked' : '' ?>>
|
||||
<input type="checkbox" name="email_notifications_enabled" value="1" <?= $emailOn ? 'checked' : '' ?>>
|
||||
Enable email notifications
|
||||
</label>
|
||||
</div>
|
||||
<div style="display:flex;gap:.5rem;">
|
||||
<button type="submit" class="btn btn-primary"><i class="fas fa-save"></i> Save Settings</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="testCyberMail()"><i class="fas fa-paper-plane"></i> Send Test Email</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="testEmail()"><i class="fas fa-paper-plane"></i> Send Test Email</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -296,7 +294,7 @@ $loyaltyEnabled = getSetting('loyalty_enabled', '1') === '1';
|
||||
|
||||
<script>
|
||||
let testType = '';
|
||||
function testCyberMail() {
|
||||
function testEmail() {
|
||||
testType = 'email';
|
||||
document.getElementById('testModalTitle').textContent = 'Send Test Email';
|
||||
document.getElementById('testInputLabel').textContent = 'Recipient Email';
|
||||
@@ -322,19 +320,19 @@ document.getElementById('testForm').addEventListener('submit', async function(e)
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Sending...';
|
||||
try {
|
||||
const response = await fetch('/api/test-notification.php', {
|
||||
const r = await fetch('/api/test-notification.php', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({type: testType, recipient})
|
||||
});
|
||||
const data = await response.json();
|
||||
const data = await r.json();
|
||||
resultDiv.style.display = 'block';
|
||||
if (data.success) {
|
||||
resultDiv.style.background = 'rgba(16,185,129,.1)';
|
||||
resultDiv.innerHTML = '<i class="fas fa-check-circle" style="color:var(--admin-success);"></i> ' + (data.message || 'Sent successfully!');
|
||||
resultDiv.innerHTML = '<i class="fas fa-check-circle" style="color:var(--admin-success);"></i> ' + (data.message || 'Sent!');
|
||||
} else {
|
||||
resultDiv.style.background = 'rgba(239,68,68,.1)';
|
||||
resultDiv.innerHTML = '<i class="fas fa-times-circle" style="color:var(--admin-error);"></i> ' + (data.error || 'Failed to send');
|
||||
resultDiv.innerHTML = '<i class="fas fa-times-circle" style="color:var(--admin-error);"></i> ' + (data.error || 'Failed');
|
||||
}
|
||||
} catch (err) {
|
||||
resultDiv.style.display = 'block';
|
||||
|
||||
Reference in New Issue
Block a user