o2web-react-core

0.9.3 • Public • Published

o2web-react-core

NPM JavaScript Style Guide

Install

npm install --save o2web-react-core

Usage

Available components and methods

// using ES6 modules
import {
  BaseRoute,
  CacheBuster,
  CrumbRoute,
  LanguageSwitcher,
  GAListener,
  NavLink,
  Redirector,
  Route,
  translateRoute,
  ValidateRoutes,
} from 'o2web-react-core';

Example in /example

GraphQL Requests

This package uses Apollo Client as GraphQL client.

Duplicate .env.sample file and add GraphQL endpoint

REACT_APP_API_URL=https://example.com/graphql

Check /example/src/app/actions/artworks directory for GraphQL queries definition examples

export default {
  fetchArtwork: `
    query($id: ID!) {
      artwork(id: $id) {
        id
        name
        description
      }
    }
  `,
  fetchArtworks: `
    query($limit: Int) {
      artworks(limit: $limit) {
        artworks {
          id
          name
          description
        }
      }
    }
  `,
};
 

Authentication

This package is intended to authenticate with a GraphQL Authentication with JWT. You can use the gem graphql-auth if you are using rails for your api

The authentication forms Components are located in `example/src/app/components/user

Redux

This package uses Redux to manage data states

Check /example/src/app/reducers directory for reducers stucture

import { combineReducers } from 'redux';
import { i18nState } from 'redux-i18n';
import { reducer as formReducer } from 'redux-form';
import artworkReducer from './artwork';
import artworksReducer from './artworks';
 
const rootReducer = combineReducers({
  i18nState,
  form: formReducer,
  artwork: artworkReducer,
  artworks: artworksReducer,
});
 
export default rootReducer;
 

react-redux is use to connect Redux data state to React components

import { connect } from 'react-redux';
 
...
 
export default connect(mapStateToProps, actions)(Artworks);

This package also uses redux-action-creator to define Redux actions types

Check /example/src/app/actions/artworks directory for redux action types examples

import { async, createTypes } from 'redux-action-creator';
 
export default createTypes([
  ...async('FETCH_ARTWORK'),
  ...async('FETCH_ARTWORKS'),
], 'ARTWORKS');

Define the Redux Store this way src/config/redux/store.js

import reduxThunk from 'redux-thunk';
import { createStore, applyMiddleware } from 'redux';
import reducers from '../../app/reducers/index';
 
const middlewares = [reduxThunk];
 
const createStoreWithMiddleware = applyMiddleware(...middlewares)(createStore);
const store = createStoreWithMiddleware(reducers);
 
export default store;
 

Translations

This package uses redux-i18n for texts translation

Check /example/src/app/components/pages/About.js for translation examples

function About(pros, { t }) {
  return (
    <div>
      <h2>{t('pages.titles.about')}</h2>
    </div>
  );
}
 
About.contextTypes = {
  t: PropTypes.func,
};

Create a directory with translations in /example/src/config/locales directory

t('pages.titles.about') matches /example/src/config/locales/en/pages.js definition

export default {
  titles: {
    home: 'Home page',
    about: 'About page',
  },
};

Translation keys can be nested

Router

This package uses react-router v4 to define translated routes. These routes must be named with their translations keys.

Check /example/src/config/locales/en/routes.js for routes definitions

export default {
  en: 'en',
  about: 'about',
  artworks: 'artworks',
  demo: 'demo-form',
};
 

<BaseRoute />, <LanguageSwitcher />, <NavLink />, <Route /> can be used for translated routes

Breadcrumbs

This package uses react-breadcrumbs to generate automatic breadcrumbs.

Routes must be nested so react-breadcrumbs can generate breadcrumbs. Check /example/src/app/components/layouts/PrimaryLayout.js for automatic breadcrumbs definition examples

<main>
  <Breadcrumbs />
  <Route exact path="/en" component={HomePage} />
  <CrumbRoute exact path="/en/about" title="about" component={AboutPage} />
  <CrumbRoute
    path="/en/artworks"
    title="artworks"
    render={({ match }) =>
      <Switch>
        <Route exact path={match.url} component={Artworks} />
        <CrumbRoute path={`${match.url}/:artworkId`} title="artwork" component={Artwork} />
      </Switch>
    }
  />
  <CrumbRoute exact path="/en/demo" title="demo" component={DemoForm} />
</main>

<CrumbRoute /> can be used for translated routes

Redirects

Update redirects array located at /example/src/config/redirects/redirects.js

const redirects = [
  { from: '/en/route', to: '/en/redirect-to' },
];

SEO

This package uses react-helmet to manage document head

<Helmet /> can be used in nested components. The most nested definition will be displayed in the page. Check /example/src/app/components/App.js for document head definition example

Tag Manager

Add GTM ID in the .env file REACT_APP_TAG_MANAGER_ID=GTM-000000. Use https://www.npmjs.com/package/react-gtm-module.

Forms

This packages uses redux-form for form definition

Check /example/src/app/components/forms/Demo.js for form example

import { Field, reduxForm } from 'redux-form';
import Input from './fields/input/Input';
 
<form onSubmit={submitForm} className="form--demo">
  <Field
    name="firstName"
    component={Input}
    type="text"
    placeholder="Your name..."
  />
 
  ...
 
export default connect(mapStateToProps)(reduxForm({
  form: 'demo',
  enableReinitialize: true,
  validate,
}, mapStateToProps)(DemoForm));

Cookies

This package uses redux-cookie

<CookiesProvider /> is defined in /example/src/app/components/App.js so cookies prop is available to children components

CacheBuster

This article was used to create the CacheBuster component.

React apps can sometimes get stuck on the client's side cache (ex: when the app is added to the phone's homepage). You can use the CacheBuster component to help refresh the app. Here are the steps to help you set it up.

  • Copy the generate-build-version.js script to your app folder
  • Add the generate-build-version task to your app's package.json and call it with the prestart/prebuild hook. This will generate a meta.json file in your static folder.
"scripts": {
    "generate-build-version": "node ./generate-build-version.js",
    "prestart": "npm run generate-build-version",
    "pressr:build": "npm run generate-build-version",
    "prestatic:build": "npm run generate-build-version"
    [...]
    "static:build": "REACT_APP_CURRENT_APP_VERSION=$npm_package_version react-app-rewired build", # hosted on Heroku
    "static:build": "react-app-rewired build", # not hosted on Heroku
    [...]
},
  • If your app is hosted on Heroku, you must add this REACT_APP_CURRENT_APP_VERSION=$npm_package_version to the build and start script in package.json to include the current version in your build.
  • If your app is not hosted on Heroku, you can simply add REACT_APP_CURRENT_APP_VERSION=$npm_package_version to your .env file.
  • In the root component of your App (generally src/app/components/App.js), add the CacheBuster component around your app code
  • The CacheBuster will now compare the current version, from your .env file, which should be cached, and the current build version, from the generate-build-version.js, which should not be cached, because we fetch it asynchronously and browsers don't cache XHR requests.

Advanced usage

Add custom Apollo client

You can add a custom Apollo client to further customize your app with advanced features. To do so, you need to create a custom client, import it in your action files and send it as a parameter to the async query object. You can find an example of this feature in the example folder (custom client in example/src/config/graphql/client.js and usage in example/src/app/actions/artworks/index.js).

Development

Start package core

cd /
npm install
npm start

Start example app

cd /example
npm install
npm start

Run server build

To run the server build update package.json at the root of the project to point to the server build.

"ssr:serve": "nodemon -r dotenv/config ./example/build/server.js",

Javascript Linting

This package uses ESLint with Airbnb React/JSX Style Guide as React/JSX style guide


Package created with create-react-library

License

MIT © o2web

Versions

Current Tags

VersionDownloads (Last 7 Days)Tag
0.9.31latest

Version History

VersionDownloads (Last 7 Days)Published
0.9.31
0.9.20
0.9.10
0.9.01
0.8.60
0.8.50
0.8.40
0.8.30
0.8.20
0.8.10
0.8.00
0.7.20
0.7.10
0.7.00
0.6.00
0.5.00
0.4.20
0.4.10
0.4.00
0.3.50
0.3.40
0.3.30
0.3.20
0.3.10
0.3.00
0.2.50
0.2.40
0.2.30
0.2.10
0.2.00
0.1.20
0.1.10
0.1.00

Package Sidebar

Install

npm i o2web-react-core

Weekly Downloads

2

Version

0.9.3

License

MIT

Unpacked Size

384 kB

Total Files

8

Last publish

Collaborators

  • bedardo
  • bricesanchez
  • ctibo
  • loubz
  • o2.web