Zur Zeit arbeite ich wieder vermehrt an meinem Notiztool. Dort kann man sich dann mit einem Profil anmelden. Damit man dieses besser unterscheiden kann, soll auch ein Profilbild angezeigt werden.

In einer späteren Version soll man sein eigenes Bild wählen können. Bis dahin soll einfach ein Gravatar dargestellt werden.

Dein Gravatar ist ein Bild, das dich von Website zu Website begleitet. Es erscheint neben deinem Namen, wenn du Kommentare oder Beiträge in Blogs verfasst. Avatare helfen dabei, deine Beiträge in Blogs und Webforen zu identifizieren, warum also nicht auf jeder Website? Quelle

Leider habe ich dafür aber keine "fertige" React Komponente gefunden und durfte sie selber schreiben.

Das Grundgerüst

import React from 'react';

class Gravatar extends React.Component {

  render() {
    return <p>Gravatar</p>;
  }
}

export default Gravatar;

Bis jetzt wird durch diese Komponente nur "Gravatar" als Text angezeigt.

Not Impressed

Gravatar URL erstellen

Die Gravatar URL stellt sich wie folgt zusammen:

  • MD5 Hash der Mail
  • Größe des Avatars
  • zugelassenes Rating
  • DefaultImage, welches geladen wird, wenn der Nutzer noch keinen Gravatar hat

Auf https://de.gravatar.com/site/implement/images/ kann man diese Spezifikationen nachschlagen. Der Code dazu sieht dann aber so aus:

loadGravatar = props => {
    const lowerCaseEmail = props.email.toLowerCase();
    const hash = md5(lowerCaseEmail);
    const size = props.size ? props.size : 200;
    const rating = props.rating ? props.rating : 'g';
    const alt = props.alt ? props.alt : 'Gravatar Image';
    const defaultImage = props.defaultImage ? props.defaultImage : 'retro';
    const url =
      'https://www.gravatar.com/avatar/' +
      hash +
      '?s=' +
      size +
      '&r=' +
      rating +
      '&d=' +
      defaultImage;
    console.info(url);
    this.setState({ url, alt });
};

Um einen md5 Hash zu bilden, wird eine Node Library verwendet. Sie nennt sich js-md5 und wird mit const md5 = require('js-md5'); eingebunden. Vorher muss diese Library aber erstmal geladen werden:

yarn add js-md5

Durch loadGravatar wird der State "url" und "alt" gesetzt. Beides wird für ein HTML Image gebraucht. Das heißt, das return im Render Bereich ändert sich dann auf:

render() {
    return <img src={this.state.url} alt={this.state.alt} />;
}

Komponenten Lebenszyklus

Nun muss die loadGravatar Funktion bei jeden Einbinden der Komponente geladen werden. Da hilft die Funktion componentWillMount. Außerdem sollten auch Änderungen berücksichtigt werden. Die Funktion componentWillReceiveProps ist dafür optimal.

componentWillMount() {
    this.loadGravatar(this.props);
}

componentWillReceiveProps(nextProps) {
    if (nextProps !== this.props) {
        this.loadGravatar(nextProps);
    }
}

Quellcode

Der komplette Quellcode für diese Gravatar Komponente sieht dann wie folgt aus:

import React from 'react';

const md5 = require('js-md5');

class Gravatar extends React.Component {
  state = {
    url: '',
    alt: '',
  };

  componentWillMount() {
    this.loadGravatar(this.props);
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps !== this.props) {
      this.loadGravatar(nextProps);
    }
  }

  loadGravatar = props => {
    const lowerCaseEmail = props.email.toLowerCase();
    const hash = md5(lowerCaseEmail);
    const size = props.size ? props.size : 200;
    const rating = props.rating ? props.rating : 'g';
    const alt = props.alt ? props.alt : 'Gravatar Image';
    const defaultImage = props.defaultImage ? props.defaultImage : 'retro';
    const url =
      'https://www.gravatar.com/avatar/' +
      hash +
      '?s=' +
      size +
      '&r=' +
      rating +
      '&d=' +
      defaultImage;
    console.info(url);
    this.setState({ url, alt });
  };

  render() {
    return <img src={this.state.url} alt={this.state.alt} />;
  }
}

export default Gravatar;

Die Komponente kann dann überall anders integriert werden.

<Gravatar
    email={this.state.email}
    rating="g"
    size={24}
    defaultImage="retro"
    alt={'Gravatar of ' + this.state.email}
/>

Fertig ist die kleine feine Gravatar Komponente.

Clap