/ client / src / components / otherModels.tsx
otherModels.tsx
  1  import { useQuery } from "@tanstack/react-query";
  2  import { Tooltip } from "antd";
  3  import { ColumnFilterItem } from "antd/es/table/interface";
  4  import { IFilament } from "../pages/filaments/model";
  5  import { IVendor } from "../pages/vendors/model";
  6  import { getAPIURL } from "../utils/url";
  7  
  8  export function useSpoolmanFilamentFilter(enabled: boolean = false) {
  9    return useQuery<IFilament[], unknown, ColumnFilterItem[]>({
 10      enabled: enabled,
 11      queryKey: ["filaments"],
 12      queryFn: async () => {
 13        const response = await fetch(getAPIURL() + "/filament");
 14        if (!response.ok) {
 15          throw new Error("Network response was not ok");
 16        }
 17        return response.json();
 18      },
 19      select: (data) => {
 20        // Concatenate vendor name and filament name
 21        const names = data
 22          // Remove empty names
 23          .filter((filament) => {
 24            return filament.name !== null && filament.name !== undefined && filament.name !== "";
 25          })
 26          // Transform to ColumnFilterItem
 27          .map((filament) => {
 28            let name = "";
 29            if (filament.vendor?.name) {
 30              name = `${filament.vendor.name} - ${filament.name ?? "<unknown>"}`;
 31            } else {
 32              name = `${filament.name ?? "<unknown>"}`;
 33            }
 34  
 35            const tooltipParts: React.ReactNode[] = [];
 36            if (filament.color_hex) {
 37              tooltipParts.push(
 38                <div
 39                  key="color"
 40                  style={{
 41                    borderRadius: ".4em",
 42                    width: "1.4em",
 43                    height: "1.4em",
 44                    backgroundColor: "#" + filament.color_hex,
 45                  }}
 46                ></div>,
 47              );
 48            }
 49            if (filament.material) {
 50              tooltipParts.push(<div key="material">{filament.material}</div>);
 51            }
 52            if (filament.weight) {
 53              tooltipParts.push(<div key="weight">{filament.weight}g</div>);
 54            }
 55  
 56            return {
 57              text: (
 58                <Tooltip
 59                  title={
 60                    <div
 61                      style={{
 62                        display: "flex",
 63                        flexDirection: "row",
 64                        gap: ".5em",
 65                        alignContent: "center",
 66                      }}
 67                    >
 68                      {tooltipParts}
 69                    </div>
 70                  }
 71                >
 72                  {name}
 73                </Tooltip>
 74              ),
 75              value: filament.id,
 76              sortId: name,
 77            };
 78          })
 79          // Remove duplicates
 80          .filter((item, index, self) => self.findIndex((t) => t.value === item.value) === index)
 81          // Sort by name
 82          .sort((a, b) => a.sortId.localeCompare(b.sortId));
 83        return names;
 84      },
 85    });
 86  }
 87  
 88  export function useSpoolmanFilamentNames(enabled: boolean = false) {
 89    return useQuery<IFilament[], unknown, string[]>({
 90      enabled: enabled,
 91      queryKey: ["filaments"],
 92      queryFn: async () => {
 93        const response = await fetch(getAPIURL() + "/filament");
 94        if (!response.ok) {
 95          throw new Error("Network response was not ok");
 96        }
 97        return response.json();
 98      },
 99      select: (data) => {
100        // Concatenate vendor name and filament name
101        let names = data
102          .filter((filament) => {
103            return filament.name !== null && filament.name !== undefined && filament.name !== "";
104          })
105          .map((filament) => {
106            return filament.name ?? "<unknown>";
107          })
108          .sort();
109        // Remove duplicates
110        names = [...new Set(names)];
111        return names;
112      },
113    });
114  }
115  
116  export function useSpoolmanVendors(enabled: boolean = false) {
117    return useQuery<IVendor[], unknown, string[]>({
118      enabled: enabled,
119      queryKey: ["vendors"],
120      queryFn: async () => {
121        const response = await fetch(getAPIURL() + "/vendor");
122        if (!response.ok) {
123          throw new Error("Network response was not ok");
124        }
125        return response.json();
126      },
127      select: (data) => {
128        return data
129          .map((vendor) => {
130            return vendor.name ?? `ID ${vendor.id}`;
131          })
132          .sort();
133      },
134    });
135  }
136  
137  export function useSpoolmanMaterials(enabled: boolean = false) {
138    return useQuery<string[]>({
139      enabled: enabled,
140      queryKey: ["materials"],
141      queryFn: async () => {
142        const response = await fetch(getAPIURL() + "/material");
143        if (!response.ok) {
144          throw new Error("Network response was not ok");
145        }
146        return response.json();
147      },
148      select: (data) => {
149        return data.sort();
150      },
151    });
152  }
153  
154  export function useSpoolmanArticleNumbers(enabled: boolean = false) {
155    return useQuery<string[]>({
156      enabled: enabled,
157      queryKey: ["articleNumbers"],
158      queryFn: async () => {
159        const response = await fetch(getAPIURL() + "/article-number");
160        if (!response.ok) {
161          throw new Error("Network response was not ok");
162        }
163        return response.json();
164      },
165      select: (data) => {
166        return data.sort();
167      },
168    });
169  }
170  
171  export function useSpoolmanLotNumbers(enabled: boolean = false) {
172    return useQuery<string[]>({
173      enabled: enabled,
174      queryKey: ["lotNumbers"],
175      queryFn: async () => {
176        const response = await fetch(getAPIURL() + "/lot-number");
177        if (!response.ok) {
178          throw new Error("Network response was not ok");
179        }
180        return response.json();
181      },
182      select: (data) => {
183        return data.sort();
184      },
185    });
186  }
187  
188  export function useSpoolmanLocations(enabled: boolean = false) {
189    return useQuery<string[]>({
190      enabled: enabled,
191      queryKey: ["locations"],
192      queryFn: async () => {
193        const response = await fetch(getAPIURL() + "/location");
194        if (!response.ok) {
195          throw new Error("Network response was not ok");
196        }
197        return response.json();
198      },
199      select: (data) => {
200        return data.sort();
201      },
202    });
203  }