diff --git a/package-lock.json b/package-lock.json index 47a9bd8..bf65984 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@chargebee/chargebee-js-react-wrapper": "^0.6.3", "@reduxjs/toolkit": "^1.9.5", + "apng-js": "^1.1.1", "html-react-parser": "^3.0.16", "i18next": "^22.5.0", "i18next-react-postprocessor": "^3.1.0", @@ -1351,6 +1352,11 @@ "node": ">=4" } }, + "node_modules/apng-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/apng-js/-/apng-js-1.1.1.tgz", + "integrity": "sha512-UWaloDssWCE8Bj0wipyNxEXPnMadYS0VAjghCLas5nKGqfiBMNdQJhg8Fawq2+jZ50IOM1feKwjiqPAC/bvKgg==" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4245,6 +4251,11 @@ "color-convert": "^1.9.0" } }, + "apng-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/apng-js/-/apng-js-1.1.1.tgz", + "integrity": "sha512-UWaloDssWCE8Bj0wipyNxEXPnMadYS0VAjghCLas5nKGqfiBMNdQJhg8Fawq2+jZ50IOM1feKwjiqPAC/bvKgg==" + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", diff --git a/package.json b/package.json index 4c44719..a119672 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@chargebee/chargebee-js-react-wrapper": "^0.6.3", "@reduxjs/toolkit": "^1.9.5", + "apng-js": "^1.1.1", "html-react-parser": "^3.0.16", "i18next": "^22.5.0", "i18next-react-postprocessor": "^3.1.0", diff --git a/src/components/BreathPage/index.tsx b/src/components/BreathPage/index.tsx index df56535..7d725e8 100644 --- a/src/components/BreathPage/index.tsx +++ b/src/components/BreathPage/index.tsx @@ -1,5 +1,5 @@ import styles from "./styles.module.css"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { UserCallbacks, useApi, useApiCall } from "@/api"; import { Asset } from "@/api/resources/Assets"; import { useDispatch } from "react-redux"; @@ -11,16 +11,24 @@ import StartBreathModalChild from "../StartBreathModalChild"; import Title from "../Title"; import { useNavigate } from "react-router-dom"; import routes from "@/routes"; +import parseAPNG from "apng-js"; function BreathPage(): JSX.Element { const { t } = useTranslation(); const [asset, setAsset] = useState(); const [isOpenModal, setIsOpenModal] = useState(true); const [isShowPreview, setIsShowPreview] = useState(true); + const leoCanvasRef = useRef(null); const api = useApi(); const dispatch = useDispatch(); const navigate = useNavigate(); + const fetchAPNG = async () => { + const response = await fetch(asset?.url || ""); + const arrayBuffer = await response.arrayBuffer(); + return parseAPNG(arrayBuffer); + }; + const assetsData = useCallback(async () => { const { assets } = await api.getAssets({ category: String("au"), @@ -36,26 +44,39 @@ function BreathPage(): JSX.Element { setIsShowPreview(false); }, 10_000); - const navigateTimeOut = setTimeout(() => { - navigate(routes.client.breathResult()); - }, 60_000); + // const navigateTimeOut = setTimeout(() => { + // navigate(routes.client.breathResult()); + // }, 60_000); return () => { - clearTimeout(navigateTimeOut); + // clearTimeout(navigateTimeOut); clearTimeout(previewTimeOut); }; }, [navigate, isOpenModal]); useEffect(() => { if (!data) return; - const leoTimeOut = setTimeout(() => { - setAsset(data[getRandomArbitrary(0, data?.length || 0)]); + const leoTimeOut = setTimeout(async () => { + setAsset(data.find((item) => item.key === "au.apng.leo")); + const apng = await fetchAPNG(); + if (apng instanceof Error) { + return; + } + // apng.createImages().then(() => { + + // }) + const context = leoCanvasRef.current?.getContext("2d"); + console.log('context: ', context); + if (context) { + + (await apng.getPlayer(context)).pause(); + } }, 9_000); return () => { clearTimeout(leoTimeOut); }; - }, [data, isOpenModal]); + }, [data, isOpenModal, fetchAPNG]); const beginBreath = () => { setIsOpenModal(false); @@ -107,13 +128,17 @@ function BreathPage(): JSX.Element { // }} > {!isOpenModal && asset?.url && ( -
- + {/* leo apng -
+ /> */} + )} {!isOpenModal && isShowPreview && (
diff --git a/src/components/BreathPage/styles.module.css b/src/components/BreathPage/styles.module.css index 6ac4cb6..e3cbf63 100644 --- a/src/components/BreathPage/styles.module.css +++ b/src/components/BreathPage/styles.module.css @@ -18,6 +18,7 @@ } .leo-apng { + width: 100%; animation-name: leo-apng; animation-duration: 1.5s; animation-iteration-count: 1;