Skip to content

Commit fc15387

Browse files
feat(deps): Added VeganCheck library for API calls
1 parent e665900 commit fc15387

File tree

2 files changed

+74
-55
lines changed

2 files changed

+74
-55
lines changed

src/components/check.tsx

+39-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useState, useEffect, useRef } from "react";
2+
import VeganCheck from "@frontendnetwork/vegancheck";
23
import Scan from "./Scanner/scanner";
34
import Image from "next/image";
45
import ModalWrapper from "@/components/elements/modalwrapper";
@@ -20,6 +21,12 @@ interface Sources {
2021
baseuri?: string;
2122
}
2223

24+
interface ErrorResponse {
25+
response: {
26+
status: number;
27+
};
28+
}
29+
2330
const ProductSearch: React.FC = () => {
2431
const t = useTranslations("Check");
2532
const formRef = useRef<HTMLFormElement>(null);
@@ -44,44 +51,52 @@ const ProductSearch: React.FC = () => {
4451
}, []);
4552

4653
/* Submitting */
47-
const handleSubmit = (barcode: string, event?: React.FormEvent) => {
54+
const handleSubmit = async (barcode: string, event?: React.FormEvent) => {
4855
event?.preventDefault();
4956
setShowTimeoutFinal(false);
5057
setShowTimeout(false);
5158
setShowFound(false);
5259
setShowNotFound(false);
5360
setShowInvalid(false);
54-
61+
5562
setLoading(true);
56-
fetch(`https://api.vegancheck.me/v0/product/${barcode}`, {
57-
method: "POST",
58-
})
59-
.then((res) => {
63+
try {
64+
const data = await VeganCheck.getProductByBarcode(barcode);
65+
setLoading(false);
66+
if (data.status === 200) {
67+
setResult(data.product);
68+
setSources(data.sources);
69+
setShowFound(true);
6070
setShowTimeout(false);
61-
62-
return res.json();
63-
})
64-
.then((data) => {
65-
setLoading(false);
66-
if (data.status === 200) {
67-
setResult(data.product);
68-
setSources(data.sources);
69-
setShowFound(true);
71+
} else if (data.status === 404) {
72+
setShowNotFound(true);
73+
setShowTimeout(false);
74+
} else {
75+
setShowInvalid(true);
76+
setShowTimeout(false);
77+
}
78+
} catch (error) {
79+
if (
80+
typeof error === 'object' &&
81+
error !== null &&
82+
'response' in error &&
83+
'status' in (error as ErrorResponse).response
84+
) {
85+
if ((error as ErrorResponse).response.status == 400) {
86+
setShowInvalid(true);
7087
setShowTimeout(false);
71-
} else if (data.status === 404) {
88+
}
89+
else if ((error as ErrorResponse).response.status == 404) {
7290
setShowNotFound(true);
7391
setShowTimeout(false);
74-
} else {
75-
setShowInvalid(true);
76-
setShowTimeout(false);
7792
}
78-
})
79-
.catch((error) => {
93+
} else {
8094
console.error(error);
81-
setLoading(false);
8295
setShowTimeoutFinal(true);
8396
setShowTimeout(false);
84-
});
97+
}
98+
setLoading(false);
99+
}
85100
};
86101

87102
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -469,7 +484,7 @@ const ProductSearch: React.FC = () => {
469484
</div>
470485
<div className="Grid">
471486
<div className="Grid-cell description skeleton">
472-
{t("grade")}
487+
Grade
473488
</div>
474489
<div className="Grid-cell icons skeleton">
475490
<span className="icon-help"></span>

src/components/ingredientscheck.tsx

+35-31
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,49 @@
11
import React, { useState, FormEvent } from "react";
2+
import VeganCheck from "@frontendnetwork/vegancheck";
23
import { useTranslations } from "next-intl";
34
import Image from "next/image";
45
import ModalWrapper from "@/components/elements/modalwrapper";
56

67
interface FlaggedItem {
7-
item: string;
8-
index: number;
8+
item: string;
9+
index: number;
910
}
1011

1112
const IngredientsCheck: React.FC = () => {
12-
const t = useTranslations("Ingredients");
13-
const [flagged, setFlagged] = useState<string[]>([]);
14-
const [vegan, setVegan] = useState<string | boolean>("");
15-
const [error, setError] = useState(false);
16-
const [loading, setLoading] = useState(false);
13+
const t = useTranslations("Ingredients");
14+
const [flagged, setFlagged] = useState<string[]>([]);
15+
const [vegan, setVegan] = useState<string | boolean>("");
16+
const [error, setError] = useState(false);
17+
const [loading, setLoading] = useState(false);
1718

18-
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
19-
setVegan("");
20-
setError(false);
21-
event.preventDefault();
22-
const ingredients = event.currentTarget.elements.namedItem("ingredients") as HTMLInputElement;
23-
const url = `https://api.vegancheck.me/v0/ingredients/${ingredients.value}`;
19+
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
20+
setVegan("");
21+
setError(false);
22+
event.preventDefault();
23+
const ingredients = event.currentTarget.elements.namedItem(
24+
"ingredients"
25+
) as HTMLInputElement;
2426

25-
setLoading(true);
26-
fetch(url, { method: "GET" })
27-
.then((response) => response.json())
28-
.then((data) => {
29-
if (data.data.vegan === "false") {
30-
setVegan(false);
31-
setFlagged(data.data.flagged);
32-
setLoading(false);
33-
} else if (data.data.vegan === "true") {
34-
setVegan(true);
35-
setLoading(false);
36-
}
37-
})
38-
.catch((error) => {
39-
setError(true);
40-
setLoading(false);
41-
});
42-
};
27+
const checkIngredients = async () => {
28+
setLoading(true);
29+
try {
30+
const data = await VeganCheck.checkIngredientsList(ingredients.value);
31+
if (data.data.vegan === "false") {
32+
setVegan(false);
33+
setFlagged(data.data.flagged);
34+
setLoading(false);
35+
} else if (data.data.vegan === "true") {
36+
setVegan(true);
37+
setLoading(false);
38+
}
39+
} catch (error) {
40+
setError(true);
41+
setLoading(false);
42+
}
43+
};
44+
45+
checkIngredients();
46+
};
4347

4448
return (
4549
<>

0 commit comments

Comments
 (0)