153 lines
4.6 KiB
JavaScript
153 lines
4.6 KiB
JavaScript
import { useState, useEffect, useCallback } from 'react'
|
|
import { databases, DATABASE_ID, COLLECTIONS, ID } from '../lib/appwrite'
|
|
|
|
const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID
|
|
|
|
// Default-Werte für Demo-Modus
|
|
const DEFAULT_CONFIG = {
|
|
ticketTypes: [
|
|
'Home Office', 'Holidays', 'Trip', 'Supportrequest', 'Change Request',
|
|
'Maintenance', 'Project', 'Controlling', 'Development', 'Documentation',
|
|
'Meeting/Conference', 'IT Management', 'IT Security', 'Procurement',
|
|
'Rollout', 'Emergency Call', 'Other Services'
|
|
],
|
|
systems: [
|
|
'Account View', 'Client', 'Cofano', 'Credentials', 'Diamant', 'Docuware',
|
|
'EDI', 'eMail', 'Employee', 'Invoice', 'LBase', 'Medical Office', 'Network',
|
|
'O365', 'PDF Viewer', 'Printer', 'Reports', 'Server', 'Time Tracking',
|
|
'TK', 'TOS', 'Vivendi NG', 'VGM', '(W)LAN', '(W)WAN', 'WOMS', 'n/a'
|
|
],
|
|
responseLevels: [
|
|
'USER', 'KEY USER', 'Helpdesk', 'Support', 'Admin', 'FS/FE', '24/7',
|
|
'TECH MGMT', 'Backoffice', 'BUSI MGMT', 'n/a'
|
|
],
|
|
serviceTypes: ['Remote', 'On Site', 'Off Site'],
|
|
priorities: [
|
|
{ value: 0, label: 'None' },
|
|
{ value: 1, label: 'Low' },
|
|
{ value: 2, label: 'Medium' },
|
|
{ value: 3, label: 'High' },
|
|
{ value: 4, label: 'Critical' }
|
|
]
|
|
}
|
|
|
|
export function useAdminConfig() {
|
|
const [config, setConfig] = useState(DEFAULT_CONFIG)
|
|
const [loading, setLoading] = useState(true)
|
|
const [error, setError] = useState(null)
|
|
|
|
const fetchConfig = useCallback(async () => {
|
|
if (DEMO_MODE) {
|
|
setConfig(DEFAULT_CONFIG)
|
|
setLoading(false)
|
|
return
|
|
}
|
|
|
|
try {
|
|
// Versuche Config-Dokument zu laden (ID: 'config')
|
|
try {
|
|
const doc = await databases.getDocument(
|
|
DATABASE_ID,
|
|
COLLECTIONS.CONFIG || 'config',
|
|
'config'
|
|
)
|
|
setConfig({
|
|
ticketTypes: doc.ticketTypes || DEFAULT_CONFIG.ticketTypes,
|
|
systems: doc.systems || DEFAULT_CONFIG.systems,
|
|
responseLevels: doc.responseLevels || DEFAULT_CONFIG.responseLevels,
|
|
serviceTypes: doc.serviceTypes || DEFAULT_CONFIG.serviceTypes,
|
|
priorities: doc.priorities || DEFAULT_CONFIG.priorities
|
|
})
|
|
} catch (e) {
|
|
// Config existiert noch nicht (404) - das ist normal, verwende Defaults
|
|
if (e.code === 404 || e.message?.includes('not found')) {
|
|
setConfig(DEFAULT_CONFIG)
|
|
setError(null) // Kein Fehler, Collection existiert einfach noch nicht
|
|
} else {
|
|
throw e
|
|
}
|
|
}
|
|
setError(null)
|
|
} catch (err) {
|
|
console.error('Error fetching config:', err)
|
|
// Nur echte Fehler als Error setzen, nicht 404
|
|
if (err.code !== 404 && !err.message?.includes('not found')) {
|
|
setError(err.message)
|
|
} else {
|
|
setError(null)
|
|
}
|
|
setConfig(DEFAULT_CONFIG) // Fallback zu Defaults
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
fetchConfig()
|
|
}, [fetchConfig])
|
|
|
|
const updateConfig = async (newConfig) => {
|
|
if (DEMO_MODE) {
|
|
setConfig(newConfig)
|
|
localStorage.setItem('admin_config', JSON.stringify(newConfig))
|
|
return { success: true }
|
|
}
|
|
|
|
try {
|
|
const configData = {
|
|
ticketTypes: newConfig.ticketTypes,
|
|
systems: newConfig.systems,
|
|
responseLevels: newConfig.responseLevels,
|
|
serviceTypes: newConfig.serviceTypes,
|
|
priorities: newConfig.priorities
|
|
}
|
|
|
|
try {
|
|
// Versuche zu aktualisieren
|
|
await databases.updateDocument(
|
|
DATABASE_ID,
|
|
COLLECTIONS.CONFIG || 'config',
|
|
'config',
|
|
configData
|
|
)
|
|
} catch (e) {
|
|
// Dokument existiert nicht (404) oder Collection existiert nicht
|
|
if (e.code === 404 || e.message?.includes('not found')) {
|
|
// Versuche zu erstellen
|
|
try {
|
|
await databases.createDocument(
|
|
DATABASE_ID,
|
|
COLLECTIONS.CONFIG || 'config',
|
|
'config',
|
|
configData
|
|
)
|
|
} catch (createErr) {
|
|
// Collection existiert nicht - zeige hilfreiche Fehlermeldung
|
|
if (createErr.code === 404 || createErr.message?.includes('Collection')) {
|
|
throw new Error('Die "config" Collection existiert noch nicht. Bitte erstelle sie zuerst in Appwrite.')
|
|
}
|
|
throw createErr
|
|
}
|
|
} else {
|
|
throw e
|
|
}
|
|
}
|
|
|
|
setConfig(newConfig)
|
|
return { success: true }
|
|
} catch (err) {
|
|
console.error('Error updating config:', err)
|
|
return { success: false, error: err.message }
|
|
}
|
|
}
|
|
|
|
return {
|
|
config,
|
|
loading,
|
|
error,
|
|
updateConfig,
|
|
refresh: fetchConfig
|
|
}
|
|
}
|
|
|