diff options
| author | soryu <soryu@soryu.co> | 2026-02-12 16:09:44 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2026-02-12 16:09:44 +0000 |
| commit | f77f1829861db0bf3815114c73d1f579376d6965 (patch) | |
| tree | c33bd225df9cf05832dc5e598792c32c5b4e462d | |
| parent | 355f10964c4dbec24a244a00caba5c17ed23fc65 (diff) | |
| download | soryu-makima/makima-jp--create-frontend-useorders-hook-ac8618f3.tar.gz soryu-makima/makima-jp--create-frontend-useorders-hook-ac8618f3.zip | |
feat: makima.jp: Create frontend useOrders hookmakima/makima-jp--create-frontend-useorders-hook-ac8618f3
| -rw-r--r-- | makima/frontend/src/hooks/useOrders.ts | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/makima/frontend/src/hooks/useOrders.ts b/makima/frontend/src/hooks/useOrders.ts new file mode 100644 index 0000000..23f2a76 --- /dev/null +++ b/makima/frontend/src/hooks/useOrders.ts @@ -0,0 +1,141 @@ +import { useState, useEffect, useCallback } from "react"; +import { + type OrderSummary, + type OrderWithLabels, + type OrderLabel, + type OrderListFilters, + type CreateOrderRequest, + type UpdateOrderRequest, + type CreateOrderLabelRequest, + listOrders, + getOrder, + createOrder, + updateOrder, + deleteOrder, + listOrderLabels, + createOrderLabel, + deleteOrderLabel, + addLabelToOrder, + removeLabelFromOrder, +} from "../lib/api"; + +export function useOrders(filters?: OrderListFilters) { + const [orders, setOrders] = useState<OrderSummary[]>([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState<string | null>(null); + + const refresh = useCallback(async () => { + try { + setLoading(true); + setError(null); + const res = await listOrders(filters); + setOrders(res.orders); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to load orders"); + } finally { + setLoading(false); + } + }, [filters]); + + useEffect(() => { + refresh(); + }, [refresh]); + + const create = useCallback(async (req: CreateOrderRequest) => { + const o = await createOrder(req); + await refresh(); + return o; + }, [refresh]); + + const remove = useCallback(async (id: string) => { + await deleteOrder(id); + await refresh(); + }, [refresh]); + + return { orders, loading, error, refresh, create, remove }; +} + +export function useOrder(id: string | undefined) { + const [order, setOrder] = useState<OrderWithLabels | null>(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState<string | null>(null); + + const refresh = useCallback(async () => { + if (!id) return; + try { + setLoading(true); + setError(null); + const o = await getOrder(id); + setOrder(o); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to load order"); + } finally { + setLoading(false); + } + }, [id]); + + useEffect(() => { + refresh(); + }, [refresh]); + + const update = useCallback(async (req: UpdateOrderRequest) => { + if (!id) return; + await updateOrder(id, req); + await refresh(); + }, [id, refresh]); + + const remove = useCallback(async () => { + if (!id) return; + await deleteOrder(id); + }, [id]); + + const addLabel = useCallback(async (labelId: string) => { + if (!id) return; + await addLabelToOrder(id, labelId); + await refresh(); + }, [id, refresh]); + + const removeLabel = useCallback(async (labelId: string) => { + if (!id) return; + await removeLabelFromOrder(id, labelId); + await refresh(); + }, [id, refresh]); + + return { order, loading, error, refresh, update, remove, addLabel, removeLabel }; +} + +export function useOrderLabels() { + const [labels, setLabels] = useState<OrderLabel[]>([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState<string | null>(null); + + const refresh = useCallback(async () => { + try { + setLoading(true); + setError(null); + const res = await listOrderLabels(); + setLabels(res.labels); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to load labels"); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + refresh(); + }, [refresh]); + + const create = useCallback(async (req: CreateOrderLabelRequest) => { + const l = await createOrderLabel(req); + await refresh(); + return l; + }, [refresh]); + + const remove = useCallback(async (id: string) => { + await deleteOrderLabel(id); + await refresh(); + }, [refresh]); + + return { labels, loading, error, refresh, create, remove }; +} |
