X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fpages%2FAlttpSeed.js;fp=resources%2Fjs%2Fpages%2FAlttpSeed.js;h=5a7e5fd2e265a5a907b0aeed944405d218a05e3e;hb=16662be0b3432d67307ae8c2bb798362d77bab99;hp=0000000000000000000000000000000000000000;hpb=d8ca13d8ccb5efe181198d0e5243a26c9f807aa1;p=alttp.git diff --git a/resources/js/pages/AlttpSeed.js b/resources/js/pages/AlttpSeed.js new file mode 100644 index 0000000..5a7e5fd --- /dev/null +++ b/resources/js/pages/AlttpSeed.js @@ -0,0 +1,108 @@ +import axios from 'axios'; +import React, { useCallback, useEffect, useState } from 'react'; +import { Helmet } from 'react-helmet'; +import { useParams } from 'react-router-dom'; + +import NotFound from './NotFound'; +import Seed from '../components/alttp-seeds/Seed'; +import ErrorBoundary from '../components/common/ErrorBoundary'; +import ErrorMessage from '../components/common/ErrorMessage'; +import Loading from '../components/common/Loading'; + +const AlttpSeed = () => { + const params = useParams(); + const { hash } = params; + + const [error, setError] = useState(null); + const [loading, setLoading] = useState(true); + const [patch, setPatch] = useState(null); + const [seed, setSeed] = useState(null); + + const loadSeed = useCallback((hash, ctrl) => { + axios + .get(`/api/alttp-seed/${hash}`, { signal: ctrl.signal }) + .then(response => { + setError(null); + setLoading(false); + setSeed(response.data); + }) + .catch(error => { + setError(error); + setLoading(false); + setSeed(null); + }); + }, []); + + useEffect(() => { + setLoading(true); + const ctrl = new AbortController(); + loadSeed(hash, ctrl); + return () => { + ctrl.abort(); + }; + }, [hash]); + + useEffect(() => { + if (!seed || seed.status !== 'pending') { + return; + } + const ctrl = new AbortController(); + const timer = setTimeout(() => { + loadSeed(seed.hash, ctrl); + }, 2000); + return () => { + clearTimeout(timer); + ctrl.abort(); + }; + }, [seed]); + + useEffect(() => { + setPatch(null); + if (!seed || seed.status !== 'generated') { + return; + } + const ctrl = new AbortController(); + axios + .get(`/alttp-seeds/${hash}.bps`, { + responseType: 'arraybuffer', + signal: ctrl.signal, + }) + .then(response => { + setPatch(response.data); + }) + .catch(error => { + setError(error); + }); + return () => { + ctrl.abort(); + }; + }, [hash, seed]); + + const retry = useCallback(async () => { + await axios.post(`/api/alttp-seed/${hash}/retry`); + setSeed(seed => ({ ...seed, status: 'pending' })); + }); + + if (loading) { + return ; + } + + if (error) { + return ; + } + + if (!seed) { + return ; + } + + return + + {seed ? + {seed.hash} + : null} + + + ; +}; + +export default AlttpSeed;