Skip to content

Commit

Permalink
setup
Browse files Browse the repository at this point in the history
  • Loading branch information
faouzioudouh committed Jan 1, 2018
1 parent 66d8e99 commit 302bf32
Show file tree
Hide file tree
Showing 11 changed files with 209 additions and 3 deletions.
11 changes: 11 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"presets": [
["es2015", {
"loose": true
}],
"react"
],
"plugins": [
"transform-class-properties"
]
}
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
logs
*.log

node_modules

.DS_Store

/build/
8 changes: 8 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/.*

/node_modules/

/src/

/webpack.*
/server.js
24 changes: 21 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "react-tracker",
"version": "1.0.0",
"description": "Track actions whthin your component with a tracker redux-like!",
"description": "Track actions within your React app with a tracker redux-like!",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"build": "webpack"
},
"repository": {
"type": "git",
Expand All @@ -21,5 +21,23 @@
"bugs": {
"url": "https://github.com/faouzioudouh/react-tracker/issues"
},
"homepage": "https://github.com/faouzioudouh/react-tracker#readme"
"homepage": "https://github.com/faouzioudouh/react-tracker#readme",
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-loader": "^7.1.2",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-assign": "^6.22.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"react": "^16.0.0",
"react-dom": "^16.0.0",
"webpack": "^3.6.0"
},
"dependencies": {
"hoist-non-react-statics": "^2.2.1",
"prop-types": "^15.5.10"
},
"peerDependencies": {
"react": "*"
}
}
28 changes: 28 additions & 0 deletions src/HOCs/provideTrackEvent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import React from 'react'
import { getDisplayName } from '../utils';
import Types from '../types';

const provideTrackEvent = (Component, mapTrackerEventToProps) => {
const displayName = getDisplayName(Component);

const trackEventProvider = (props, context) => {
const trackEvent = context.tracker.dispatch;

if (!trackEvent) {
throw Error(`Could not find tracker in the context of ` + `"${displayName}"`);
}

const propsWithTrackEvent = Object.assign({}, props, { trackEvent });

return React.createElement(Component, propsWithTrackEvent)
}

trackEventProvider.displayName = displayName;
trackEventProvider.contextTypes = {
tracker: Types.tracker.isRequired
};

return trackEventProvider;
}

export default provideTrackEvent;
35 changes: 35 additions & 0 deletions src/Tracker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
export default class Tracker {
constructor(subscribers) {
this.trackingHistory = [];
this.subscribers = subscribers || [];
}

subscribe(eventType, callback) {
this.subscribers = [...this.subscribers, Object.assign({}, { [eventType]: callback })];
}

dispatch = (event) => {
const { type, data } = event || {};

if (!type) {
return null;
}

for (let subscriber in this.subscribers) {

if (Object.prototype.hasOwnProperty.call(this.subscribers, subscriber)) {
if (typeof this.subscribers[subscriber] === 'function' && subscriber === type) {
const save = this.subscribers[subscriber](event, this.trackingHistory);

if (save) {
this.trackingHistory = [...this.trackingHistory, save];
}
}
}
}
}

getHistory() {
return this.trackingHistory;
}
}
33 changes: 33 additions & 0 deletions src/components/TrackerProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { Component, Children } from 'react';
import Types from '../types';

export default class TrackerProvider extends Component {
getChildContext() {
console.log('from here: ', this.tracker);
return {
tracker: this.tracker
}
}

constructor(props, context) {
super(props, context)
this.tracker = props.tracker;

console.log('from here constrc: ', this.tracker);
}

render() {
console.log('from here render: ', this.tracker);

return Children.only(this.props.children)
}
}

TrackerProvider.propTypes = {
tracker: Types.tracker.isRequired,
children: Types.element.isRequired,
};

TrackerProvider.childContextTypes = {
tracker: Types.tracker.isRequired,
};
5 changes: 5 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import TrackerProvider from './components/TrackerProvider';
import provideTrackEvent from './HOCs/provideTrackEvent';
import Tracker from './Tracker';

export { Tracker, TrackerProvider, provideTrackEvent };
10 changes: 10 additions & 0 deletions src/types.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import propTypes from 'prop-types';

const Types = Object.assign({}, propTypes, {
tracker: propTypes.shape({
subscribe: propTypes.func.isRequired,
dispatch: propTypes.func.isRequired,
})
});

export default Types;
8 changes: 8 additions & 0 deletions src/utils/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export const getDisplayName = WrappedComponent => {
const wrappedComponentName = WrappedComponent.displayName
|| WrappedComponent.name
|| 'Component';


return `TrackEventProvider(${wrappedComponentName})`;
}
42 changes: 42 additions & 0 deletions webpack.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

const path = require('path');
const { ReactLoadablePlugin } = require('webpack');

module.exports = {
entry: {
index: './src/index.js'
},
output: {
path: path.join(__dirname, 'build'),
publicPath: 'build/',
filename: 'index.js',
chunkFilename: 'react-tracker.js',
sourceMapFilename: 'react-tracker.map',
library: 'ReactTracker',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
babelrc: false,
presets: [
['es2015', { modules: false }],
'react',
],
plugins: [
'transform-class-properties',
'transform-object-assign',
],
}
},
},
],
},
devtool: 'inline-source-map'
};

0 comments on commit 302bf32

Please sign in to comment.