adam-26/react-router-dispatcher-metadata

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# react-router-dispatcher-metadata

[![Greenkeeper badge](https://badges.greenkeeper.io/adam-26/react-router-dispatcher-metadata.svg)](https://greenkeeper.io/)
[![npm](https://img.shields.io/npm/v/react-router-dispatcher-metadata.svg)](https://www.npmjs.com/package/react-router-dispatcher-metadata)
[![npm](https://img.shields.io/npm/dm/react-router-dispatcher-metadata.svg)](https://www.npmjs.com/package/react-router-dispatcher-metadata)
[![CircleCI branch](https://img.shields.io/circleci/project/github/adam-26/react-router-dispatcher-metadata/master.svg)](https://circleci.com/gh/adam-26/react-router-dispatcher-metadata/tree/master)
[![Maintainability](https://api.codeclimate.com/v1/badges/60ba2c7c8b6a2a73d599/maintainability)](https://codeclimate.com/github/adam-26/react-router-dispatcher-metadata/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/60ba2c7c8b6a2a73d599/test_coverage)](https://codeclimate.com/github/adam-26/react-router-dispatcher-metadata/test_coverage)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)

A [react-router-dispatcher](https://github.com/adam-26/react-router-dispatcher) **action** for defining HTML metadata.

Read the [react-router-dispatcher](https://github.com/adam-26/react-router-dispatcher) documentation if you haven't already done so.

##### This package supports:
  * server-side rendering using **stream**s
  * composing metadata from nested components (similar to [react-helmet](https://github.com/nfl/react-helmet))

There is an [working example here](https://github.com/adam-26/react-router-dispatcher-metadata/tree/master/examples/ssr)

Internally, [react-html-metadata](https://github.com/adam-26/react-html-metadata) is used to support the use of metadata with the react SSR stream interface, for more information
about how to define metadata you should view that packages [readme file](https://github.com/adam-26/react-html-metadata).

### Install

##### NPM

```js
npm install --save react-router-dispatcher-metadata react-router-metadata
```

##### Yarn

```js
yarn add react-router-dispatcher-metadata react-router-metadata
```

### Usage

```js
import metadataAction, { withMetadata, METADATA } from 'react-router-dispatcher-metadata';

// METADATA is the action name, used to configure react-router-dispatcher
```

### Example

##### Using the metadata action

```js
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { renderRoutes } from 'react-router-config';
import { withMetadata } from 'react-router-dispatcher-metadata';

class AppRoot extends Component {

    static propTypes = {
        route: PropTypes.object.isRequired,
        assets: PropTypes.object.isRequired
    };

    // define metadata for this component
    static getMetadata(match, { assets }) {
        return {
            htmlAttributes: {lang: 'en', amp: undefined},
            bodyAttributes: {className: 'root'},
            titleTemplate: "MySite.com - %s",
            meta: [
                { charset: 'utf-8' },
                { name: 'viewport', content: 'width=device-width, initial-scale=1' }
            ],
            link: [
                { rel: 'shortcut icon', href: 'favicon.ico' },
                { rel: 'stylesheet', href: assets['main.css'] }
            ]
        };
    }

    render() {
        const { route: { routes } } = this.props;
        return renderRoutes(routes || null);
    }
}

// Maps react-router-dispatcher action parameters to component prop values
// - this is used for SSR and client metadata-hydration to enable correct props to be passed to 'getMetadata()'
// - the map function MUST map params to the SAME prop values the component will receive during a normal render
const mapParamsToProps = ({ assets }) => ({ assets });

export default withMetadata({ mapParamsToProps })(AppRoot);
```

##### Configuring the metadata action using [react-router-dispatcher](https://github.com/adam-26/react-router-dispatcher)

```js
import { createRouteDispatchers } from 'react-router-dispatcher';
import { METADATA } from 'react-router-dispatcher-metadata';
import routes from './routes';

const {
    UniversalRouteDispatcher,
    ClientRouteDispatcher,
    dispatchClientActions,
    dispatchServerActions
} = createRouteDispatchers(routes, [[METADATA]]);

```

### API

`metadataAction(options)`

#### Options

**mapParamsToProps**: `(params: Object, routerCtx: Object) => Object`

  * An optional function that maps action parameters to component props

### Contribute
For questions or issues, please [open an issue](https://github.com/adam-26/react-router-dispatcher-metadata/issues), and you're welcome to submit a PR for bug fixes and feature requests.

Before submitting a PR, ensure you run `npm test` to verify that your coe adheres to the configured lint rules and passes all tests. Be sure to include unit tests for any code changes or additions.

### License
MIT