0

I'm learning react and it's my first time using a library in react. I'm trying to use watermark-js. I've read articles about how I to add npm packages in my react package.json using npm install <library name> save. Here is the part of package.json which show the watermarkjs

"dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-scripts": "2.1.8",
    "save": "^2.4.0",
    "watermarkjs": "^2.0.0"

Now in my App.js component I've imported it as a module and use the snippet provided by watermarkjs in componentDidMount method as in react documentation. below is my complete App.js component.

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Form from './Components/Form';
import ImageWaterMark from './Components/ImageWaterMark';
import image1 from './test-image.jpg'
import image2 from './download.jpg'
import { watermark } from 'watermarkjs'
class App extends Component {

  componentDidMount() {

    //Snippit 

    watermark([{ image1 }, { image2 }])
      .image(watermark.image.lowerRight(0.5))
      .then(function (img) {
        document.getElementById('lower-right').appendChild(img);
      });
  }
  render() {


    return (
      <div className="App">
        <div ref="water"></div>
      </div>
    );
  }
}

export default App;

There are 2 problem that I can't seem to understand. first

How can I pass this snippet as a ref to the render method as in documentation?

Second the App through the following error

TypeError: Cannot read property 'watermark' of undefined

I've read many articles and watched videos but I haven't understand the concept of using libraries. Any help would be much appreciated.

1 Answer 1

1

watermarkjs uses a default export, not a named export. Change this:

import { watermark } from 'watermarkjs'`

To this:

import watermark from 'watermarkjs'

As for how to use it, once it loads you should call setState with the result. This will render your component again, and you can use that value however you see fit. For example:

  componentDidMount() {
    watermark([{ image1 }, { image2 }])
      .image(watermark.image.lowerRight(0.5))
      .then((img) => {
        this.setState({ img });
      });
  }

  render() {
    return (
      <div className="App">
        <div ref="water">
          {this.state.img && /* whatever you want to do with the image */ }
        </div>
      </div>
    );
  }

I'm not exactly sure what img resolves to, so don't know exactly what you'd put in the render function. If it's url string, it would be {this.state.img && <image src={this.state.img} />}

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for the answer, I'm trying use it. I'll post a comment if it works

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.