- {[
- { title: '新会话提醒', desc: '有新访客进线时桌面通知' },
- { title: '离线留言通知', desc: '访客提交离线留言时提醒' },
- { title: '日报推送', desc: '每日服务数据摘要' },
- ].map(item => (
-
-
-
{item.title}
-
{item.desc}
+ {loadingSettings && !settings ? (
+
+ ) : (
+
+
+
+
+
+ )}
)}
diff --git a/web/src/services/api.ts b/web/src/services/api.ts
index 0ae5323..6b901ef 100644
--- a/web/src/services/api.ts
+++ b/web/src/services/api.ts
@@ -142,6 +142,25 @@ export const getChannels = () => get
('/channels')
export const createChannel = (data: { type: string; name?: string }) => post('/channels', data)
export const updateChannel = (id: number, data: { name?: string; status?: string }) => put(`/channels/${id}`, data)
+// Tenant settings
+export type WorkHours = Record
+export interface TenantSettings {
+ tenant_id: number
+ display_name: string
+ agent_nickname: string
+ timezone: string
+ welcome_message: string
+ offline_prompt: string
+ work_hours: WorkHours
+ worktime_prompt: string
+ notify_new_session: boolean
+ notify_offline_leave: boolean
+ notify_daily_report: boolean
+}
+export const getTenantSettings = () => get('/settings')
+export const updateTenantSettings = (data: Partial & { work_hours?: WorkHours }) =>
+ put('/settings', data)
+
// Statistics
export const getKPIs = () => get('/statistics/kpi')
export const getSessionTrend = (period: 'today' | 'day' | 'month' = 'day') => get<{ date: string; count: number }[]>(`/statistics/trend?period=${period}`)
diff --git a/web/src/widgets/VisitorChat.tsx b/web/src/widgets/VisitorChat.tsx
index 35be5be..40d28d6 100644
--- a/web/src/widgets/VisitorChat.tsx
+++ b/web/src/widgets/VisitorChat.tsx
@@ -56,6 +56,8 @@ const VisitorChat = ({
const [sendError, setSendError] = useState('')
const [agentsOnline, setAgentsOnline] = useState(true)
const [offlinePrompt, setOfflinePrompt] = useState('当前无客服在线,请留言并留下联系方式,我们上线后会尽快回复您。')
+ const [welcomeMessage, setWelcomeMessage] = useState('您好!欢迎咨询,请问有什么可以帮您?')
+ const [displayName, setDisplayName] = useState('在线客服')
const [agentName, setAgentName] = useState('')
const [leaveName, setLeaveName] = useState('')
const [leavePhone, setLeavePhone] = useState('')
@@ -112,7 +114,10 @@ const VisitorChat = ({
setVisitorToken(token)
setAgentsOnline(Boolean(data.agents_online))
if (data.offline_prompt) setOfflinePrompt(data.offline_prompt)
+ if (data.welcome_message) setWelcomeMessage(data.welcome_message)
+ if (data.display_name) setDisplayName(data.display_name)
if (data.agent_name) setAgentName(data.agent_name)
+ else if (data.agent_nickname) setAgentName(data.agent_nickname)
if (data.session_status === 'ended') setSessionEnded(true)
localStorage.setItem(storageKey, String(sid))
localStorage.setItem(tokenKey, token)
@@ -365,7 +370,7 @@ const VisitorChat = ({