summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-02-12 16:09:44 +0000
committersoryu <soryu@soryu.co>2026-02-12 16:09:44 +0000
commitf77f1829861db0bf3815114c73d1f579376d6965 (patch)
treec33bd225df9cf05832dc5e598792c32c5b4e462d
parent355f10964c4dbec24a244a00caba5c17ed23fc65 (diff)
downloadsoryu-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.ts141
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 };
+}