1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
import { useState, useEffect, useCallback } from "react";
import {
type DirectiveOrderGroup,
type CreateDOGRequest,
type UpdateDOGRequest,
listDogs,
createDog,
getDog,
updateDog as updateDogApi,
deleteDog as deleteDogApi,
pickUpDogOrders as pickUpDogOrdersApi,
} from "../lib/api";
export function useDogs(directiveId: string | undefined) {
const [dogs, setDogs] = useState<DirectiveOrderGroup[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const refresh = useCallback(async () => {
if (!directiveId) return;
try {
setLoading(true);
setError(null);
const res = await listDogs(directiveId);
setDogs(res.dogs);
} catch (e) {
setError(e instanceof Error ? e.message : "Failed to load DOGs");
} finally {
setLoading(false);
}
}, [directiveId]);
useEffect(() => {
refresh();
}, [refresh]);
const create = useCallback(async (req: CreateDOGRequest) => {
if (!directiveId) return null;
const dog = await createDog(directiveId, req);
await refresh();
return dog;
}, [directiveId, refresh]);
const update = useCallback(async (dogId: string, req: UpdateDOGRequest) => {
if (!directiveId) return;
await updateDogApi(directiveId, dogId, req);
await refresh();
}, [directiveId, refresh]);
const remove = useCallback(async (dogId: string) => {
if (!directiveId) return;
await deleteDogApi(directiveId, dogId);
await refresh();
}, [directiveId, refresh]);
const pickUpOrders = useCallback(async (dogId: string) => {
if (!directiveId) return null;
const result = await pickUpDogOrdersApi(directiveId, dogId);
await refresh();
return result;
}, [directiveId, refresh]);
return { dogs, loading, error, refresh, create, update, remove, pickUpOrders };
}
export function useDog(directiveId: string | undefined, dogId: string | undefined) {
const [dog, setDog] = useState<DirectiveOrderGroup | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const refresh = useCallback(async () => {
if (!directiveId || !dogId) return;
try {
setLoading(true);
setError(null);
const d = await getDog(directiveId, dogId);
setDog(d);
} catch (e) {
setError(e instanceof Error ? e.message : "Failed to load DOG");
} finally {
setLoading(false);
}
}, [directiveId, dogId]);
useEffect(() => {
setDog(null);
setError(null);
setLoading(true);
refresh();
}, [directiveId, dogId]); // eslint-disable-line react-hooks/exhaustive-deps
const update = useCallback(async (req: UpdateDOGRequest) => {
if (!directiveId || !dogId) return;
const d = await updateDogApi(directiveId, dogId, req);
setDog(d);
return d;
}, [directiveId, dogId]);
const remove = useCallback(async () => {
if (!directiveId || !dogId) return;
await deleteDogApi(directiveId, dogId);
}, [directiveId, dogId]);
const pickUpOrders = useCallback(async () => {
if (!directiveId || !dogId) return null;
const result = await pickUpDogOrdersApi(directiveId, dogId);
await refresh();
return result;
}, [directiveId, dogId, refresh]);
return { dog, loading, error, refresh, update, remove, pickUpOrders };
}
|