IB-AR-Neural-Style-Transfers / artficial.webapp / src / components / Artwork / CreateArtwork / Step3 / Step3.js
Step3.js
Raw
import React, { useState } from "react";
import { Link } from "react-router-dom";
import { CloudinaryContext } from "cloudinary-react";
import { Image } from "@chakra-ui/react";
import { Stack } from "@chakra-ui/react";
import axios from "axios";
import { useLocation } from "react-router-dom";
import { Spinner } from "@chakra-ui/react";
import { saveAs } from "file-saver";

import { Button, Heading, Text } from "@chakra-ui/react";
import {
  Box,
  FormControl,
  FormLabel,
  useColorModeValue,
  Center,
  Input,
  FormHelperText,
} from "@chakra-ui/react";
import { motion } from "framer-motion";

const Step3 = () => {
  const { styleLink, uploadedUrl } = useLocation().state;
  // console.log("The style link in coming is :", styleLink);
  // console.log("The uploaded url in coming is :", uploadedUrl);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(false);
  const [generatedImageURL, setGeneratedImageURL] = React.useState();
  const downloadImage = () => {
    saveAs(generatedImageURL, "ARTficial.png"); // Put your image url here.
  };
  const generateImage = () => {
    setLoading(true);
    axios
      .post("http://localhost:5000/api/v1/nst", {
        styleImageURL: styleLink,
        contentImageURL: uploadedUrl,
      })
      .then((data) => {
        console.log(data.data.outputImage);
        setLoading(false);
        setGeneratedImageURL(data.data.outputImage);
      })
      .catch((err) => {
        setLoading(false);
        setError(true);
      });
  };
  return (
    <motion.Flex
      minH={"100vh"}
      align={"center"}
      justify={"center"}
      bg={useColorModeValue("gray.50", "gray.800")}
      initial={{ opacity: 0 }}
      animate={{ opacity: 1 }}
      exit={{ opacity: 0, transition: { duration: 0.1 } }}>
      <Stack spacing={8} mx={"auto"} maxW={"lg"} py={12} px={2} >
        <Stack align={"center"}>
          <Heading fontSize={"4xl"} align={"center"}>Generate the stylized image.</Heading>
          <Text fontSize={"lg"} color={"gray.600"}>
            Finally, finish off by{" "}
            <Link color={"blue.400"}> pressing the generate button.</Link> 
          </Text>
        </Stack>
        <Box
          rounded={"lg"}
          bg={useColorModeValue("white", "gray.700")}
          boxShadow={"lg"}
          px={0}
          py={5}>
          <Stack spacing={4}>
            <Center>
              <Text color={"gray.500"} fontSize={{ base: "sm", sm: "md" }}>
                 The rendering may take time depending on size of image.
              </Text>
            </Center>
            <Box>
              {generatedImageURL ? (
                <Center>
                  <Button
                    fontFamily={"heading"}
                    w={"50%"}
                    bgGradient="linear(to-r, red.900,pink.400)"
                    color={"white"}
                    _hover={{
                      bgGradient: "linear(to-r, red.900,pink.900)",
                      boxShadow: "xl",
                    }}
                    onClick={downloadImage}>
                    Download!
                  </Button>
                </Center>
              ) : (
                <Center>
                  <Button
                    fontFamily={"heading"}
                    w={"50%"}
                    bgGradient="linear(to-r, red.900,pink.400)"
                    color={"white"}
                    _hover={{
                      bgGradient: "linear(to-r, red.900,pink.900)",
                      boxShadow: "xl",
                    }}
                    onClick={generateImage}
                    disabled={loading}>
                    Generate!
                  </Button>
                </Center>
              )}
            </Box>
            <Center>
              {error && <h1>Oops! An error occured</h1>}
              {loading ? (
                <Spinner color="red.500" />
              ) : (
                generatedImageURL && (
                  <Image
                    boxSize="350px"
                    objectFit="cover"
                    src={generatedImageURL}
                  />
                )
              )}
            </Center>
            <Link to="/createartwork/step1">
              <Center>
                <Button
                  fontFamily={"heading"}
                  w={"50%"}
                  bgGradient="linear(to-r, blue.400,pink.400)"
                  color={"white"}
                  _hover={{
                    bgGradient: "linear(to-r, red.400,pink.400)",
                    boxShadow: "xl",
                  }}
                  disabled={loading}>
                  Back
                </Button>
              </Center>
            </Link>
          </Stack>
        </Box>
      </Stack>
    </motion.Flex>
  );
};
export default Step3;