153 lines
4.1 KiB
JavaScript
153 lines
4.1 KiB
JavaScript
import { useState, useEffect, useCallback } from 'react'
|
|
import { databases, DATABASE_ID, COLLECTIONS, ID, Query, isDemoMode } from '../lib/appwrite'
|
|
import {
|
|
createCustomerWithPortalAccess,
|
|
updateCustomerWithPortalAccess,
|
|
} from '../lib/customerAdminApi'
|
|
|
|
const DEMO_MODE = isDemoMode
|
|
|
|
// Demo-Kunden für Testing
|
|
const DEMO_CUSTOMERS = [
|
|
{ $id: '1', code: 'C001', name: 'Kunde A', location: 'Berlin', email: 'kunde.a@example.com', phone: '030-123456' },
|
|
{ $id: '2', code: 'C002', name: 'Kunde B', location: 'München', email: 'kunde.b@example.com', phone: '089-654321' }
|
|
]
|
|
|
|
export function useCustomers() {
|
|
const [customers, setCustomers] = useState([])
|
|
const [loading, setLoading] = useState(true)
|
|
const [error, setError] = useState(null)
|
|
|
|
const fetchCustomers = useCallback(async () => {
|
|
if (DEMO_MODE) {
|
|
setCustomers(DEMO_CUSTOMERS)
|
|
setLoading(false)
|
|
return
|
|
}
|
|
|
|
try {
|
|
const response = await databases.listDocuments(
|
|
DATABASE_ID,
|
|
COLLECTIONS.CUSTOMERS,
|
|
[Query.orderAsc('name')]
|
|
)
|
|
setCustomers(response.documents)
|
|
setError(null)
|
|
} catch (err) {
|
|
console.error('Error fetching customers:', err)
|
|
// Wenn Collection nicht existiert, setze leeres Array (kein Fehler)
|
|
if (err.code === 404 || err.message?.includes('not found')) {
|
|
setCustomers([])
|
|
setError(null) // Kein Fehler, Collection existiert einfach noch nicht
|
|
} else {
|
|
setError(err.message)
|
|
setCustomers([])
|
|
}
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
fetchCustomers()
|
|
}, [fetchCustomers])
|
|
|
|
const createCustomer = async (data) => {
|
|
if (DEMO_MODE) {
|
|
const { password, ...rest } = data
|
|
const newCustomer = {
|
|
...rest,
|
|
portalPassword: password || rest.portalPassword || '',
|
|
$id: Date.now().toString(),
|
|
}
|
|
setCustomers(prev => [...prev, newCustomer])
|
|
return { success: true, data: newCustomer }
|
|
}
|
|
|
|
try {
|
|
const { password, ...fields } = data
|
|
const result = await createCustomerWithPortalAccess({ ...fields, password })
|
|
const customer = {
|
|
...result.customer,
|
|
portalPassword: result.customer?.portalPassword || password || '',
|
|
}
|
|
setCustomers(prev => [...prev, customer])
|
|
return { success: true, data: customer }
|
|
} catch (err) {
|
|
return { success: false, error: err.message }
|
|
}
|
|
}
|
|
|
|
const updateCustomer = async (id, data) => {
|
|
if (DEMO_MODE) {
|
|
const { password, ...rest } = data
|
|
setCustomers(prev =>
|
|
prev.map(c => {
|
|
if (c.$id !== id) return c
|
|
const next = { ...c, ...rest }
|
|
if (password) next.portalPassword = password
|
|
return next
|
|
})
|
|
)
|
|
return { success: true }
|
|
}
|
|
|
|
try {
|
|
const { password, ...fields } = data
|
|
const payload = { ...fields }
|
|
if (password) payload.password = password
|
|
|
|
const result = await updateCustomerWithPortalAccess(id, payload)
|
|
const customer = {
|
|
...result.customer,
|
|
portalPassword:
|
|
result.customer?.portalPassword ||
|
|
password ||
|
|
undefined,
|
|
}
|
|
setCustomers(prev =>
|
|
prev.map(c => {
|
|
if (c.$id !== id) return c
|
|
return {
|
|
...customer,
|
|
portalPassword: customer.portalPassword ?? c.portalPassword,
|
|
}
|
|
})
|
|
)
|
|
return { success: true, data: customer }
|
|
} catch (err) {
|
|
return { success: false, error: err.message }
|
|
}
|
|
}
|
|
|
|
const deleteCustomer = async (id) => {
|
|
if (DEMO_MODE) {
|
|
setCustomers(prev => prev.filter(c => c.$id !== id))
|
|
return { success: true }
|
|
}
|
|
|
|
try {
|
|
await databases.deleteDocument(
|
|
DATABASE_ID,
|
|
COLLECTIONS.CUSTOMERS,
|
|
id
|
|
)
|
|
setCustomers(prev => prev.filter(c => c.$id !== id))
|
|
return { success: true }
|
|
} catch (err) {
|
|
return { success: false, error: err.message }
|
|
}
|
|
}
|
|
|
|
return {
|
|
customers,
|
|
loading,
|
|
error,
|
|
refresh: fetchCustomers,
|
|
createCustomer,
|
|
updateCustomer,
|
|
deleteCustomer
|
|
}
|
|
}
|
|
|