Joseph
Joseph

Reputation: 7755

How Do I Replace UploadCare To Display Image in React

Right now, after uploading image, it shows up only the name of the file, the size and the remove button. I wanted to display the image itself on the circle.

Pls check codesandbox here CLICK HERE

<UploadWrapper>
    <Widget
      localeTranslations={translation}
      publicKey="demopublickey"
      imagesOnly
      previewStep
      clearable
      onfi
      onFileSelect={(file) => {
        if (!file) {
          console.log("File removed from widget");
          return;
        }
        file.done((fileInfo) => {
          console.log("File uploaded: ", fileInfo.cdnUrl);
        });
      }}
    />
  </UploadWrapper>

Upvotes: 1

Views: 792

Answers (1)

Drew Reese
Drew Reese

Reputation: 202575

From what I can tell it looks like the Widget component is only for uploading a file and not for rendering one.

Here's a solution I came up with: Use some "state" to store the uploaded file URL and conditionally hide the Widget to upload a file or the rendered div/image. Use an attached ref to the Widget in a click handler on the image to trigger re-opening of the upload dialog.

Style:

import styled, { css } from "styled-components";

...

const UploadWrapper = styled.div`
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;

  ${({ image }) => image ? css`
    & .image {
      position: absolute;
      height: 300px;                      // make a circle
      width: 300px;                       // make a circle
      border-radius: 50%;                 // make a circle
      top: 50%;                           // position div
      overflow: hidden;                   // hide the circle 

      img {
        height: 100%;                     // fill parent div
        width: auto;                      // fill parent div
        transform: translate(-50%, -50%); // center image
        top: 50%;                         // center image
        left: 50%;                        // center image
        position: absolute;
      }
    }

    & .uploadcare--widget {
      display: none;
    }
  ` : css`
    & .image {
      display: none;
    }
  `}

  & .uploadcare--widget__button_type_open {
    height: 300px;
    width: 300px;
    border-radius: 100%;
  }
`;

Component:

const Upload = () => {
  const [image, setImage] = React.useState("");

  const translation = {
    buttons: {
      choose: {
        images: {
          one:
            '<div className="image"><img src="/assets/images/camera.svg" alt="camera" /><br/>Upload photo</div>'
        }
      }
    }
  };

  return (
    <FormWrapper>
      <h1>Hello</h1>
      <UploadWrapper image={image}>
        <div
          className="image"
          onClick={() => widgetApi.current.openDialog()}
        >
          <img src={image} alt="uploaded" />
        </div>
        <Widget
          localeTranslations={translation}
          publicKey="demopublickey"
          imagesOnly
          previewStep
          onFileSelect={(file) => {
            if (!file) {
              console.log("File removed from widget");
              return;
            }
            file.done((fileInfo) => {
              setImage(fileInfo.cdnUrl);
            });
          }}
        />
      </UploadWrapper>
    </FormWrapper>
  );
};

Edit how-do-i-replace-uploadcare-to-display-image-in-react

enter image description here

Upvotes: 1

Related Questions