EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
SlackCard.jsx
Go to the documentation of this file.
1import React, { useState } from 'react';
2
3function SlackCard({ config, status, loading, onConfigure, tenantId }) {
4 const [webhookUrl, setWebhookUrl] = useState(config?.slack?.webhookUrl || '');
5 const [channel, setChannel] = useState(config?.slack?.channel || '');
6 const [saving, setSaving] = useState(false);
7 const [saveStatus, setSaveStatus] = useState('');
8
9 const handleSave = async () => {
10 setSaving(true);
11 setSaveStatus('');
12 try {
13 const res = await fetch(`/api/slack/settings/${tenantId}`, {
14 method: 'POST',
15 headers: { 'Content-Type': 'application/json' },
16 body: JSON.stringify({
17 slack: { webhookUrl, channel }
18 })
19 });
20 if (res.ok) {
21 setSaveStatus('Connected to Slack');
22 } else {
23 setSaveStatus('Failed to save Slack settings');
24 }
25 } catch (e) {
26 setSaveStatus('Error saving Slack settings');
27 }
28 setSaving(false);
29 };
30
31 return (
32 <div className="config-card">
33 <h3>Slack Integration</h3>
34 <p>Send notifications and ticket updates to Slack channels.</p>
35 <div className="form-row">
36 <label>
37 Webhook URL:
38 <input type="text" value={webhookUrl} onChange={e => setWebhookUrl(e.target.value)} style={{ width: '320px' }} />
39 </label>
40 </div>
41 <div className="form-row">
42 <label>
43 Channel:
44 <input type="text" value={channel} onChange={e => setChannel(e.target.value)} style={{ width: '180px' }} />
45 </label>
46 </div>
47 <button onClick={handleSave} disabled={saving || loading} className="btn-primary">
48 {saving || loading ? 'Saving...' : 'Save Slack Settings'}
49 </button>
50 {(status || saveStatus) && (
51 <div className={`status-message ${(status || saveStatus).startsWith('Connected') ? 'success' : 'error'}`}>
52 {status || saveStatus}
53 </div>
54 )}
55 {config && (
56 <div className="current-config">
57 <b>Current config:</b> {JSON.stringify(config)}
58 </div>
59 )}
60 </div>
61 );
62}
63
64export default SlackCard;