├── Procfile
├── src
├── oauth.js
├── Attendees.js
├── PollPanel.js
├── DiscussionPanel.js
├── GroupHeader.js
├── EventPanel.js
├── utils.js
├── Event.js
├── Poll.js
├── Discussion.js
└── App.js
├── webpack.config.js
├── public
└── index.html
├── .gitignore
├── index.js
├── LICENSE
└── package.json
/Procfile:
--------------------------------------------------------------------------------
1 | web: node index.js
--------------------------------------------------------------------------------
/src/oauth.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | token: "11fa3038ab813c81f474e64f917872dc17dad7d7",
3 | auth: "oauth"
4 | };
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | entry: "./src/App.js",
3 | output: {
4 | filename: "./public/app.js"
5 | },
6 | module: {
7 | loaders: [
8 | {test: /\.js$/, loader: 'jsx-loader'}
9 | ]
10 | }
11 | };
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Meetup
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # Compiled binary addons (http://nodejs.org/api/addons.html)
20 | build/Release
21 |
22 | # Dependency directory
23 | # Commenting this out is preferred by some people, see
24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
25 | node_modules
26 |
27 | # Users Environment Variables
28 | .lock-wscript
29 |
30 |
31 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 |
3 | var app = express();
4 |
5 |
6 | app.use(express.static(__dirname + '/public'));
7 |
8 | app.use('/groups/:name', express.static(__dirname + '/public'));
9 | app.use('/groups/:name/events/:id', express.static(__dirname + '/public'));
10 | app.use('/groups/:name/discussions/:id', express.static(__dirname + '/public'));
11 | app.use('/groups/:name/polls/:id', express.static(__dirname + '/public'));
12 | app.use('/groups', express.static(__dirname + '/public'));
13 |
14 |
15 | var port = process.env.PORT || 3000;
16 | app.listen(port, function (err) {
17 | if (err) {
18 | console.error('failed to start the server');
19 | } else {
20 | console.error('server start on the port', port);
21 | }
22 |
23 | });
--------------------------------------------------------------------------------
/src/Attendees.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Attendees = React.createClass({
4 | render: function () {
5 | console.log('attendees', this.props.attendees);
6 | return (
7 |
8 | {
9 | this.props.attendees.map(function(attendee) {
10 | return (
11 |
12 |
13 |
14 | )
15 | })
16 | }
17 |
18 | )
19 | }
20 | });
21 |
22 | module.exports = Attendees;
--------------------------------------------------------------------------------
/src/PollPanel.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var ReactIntl = require('react-intl');
3 | var FormattedDate = ReactIntl.FormattedDate;
4 | var Remarkable = require('remarkable');
5 | var md = new Remarkable();
6 | var Link = require('react-router').Link;
7 |
8 |
9 | var PollPanel = React.createClass({
10 |
11 | render: function () {
12 | var poll = this.props.poll;
13 | var description = md.render(poll.body);
14 | return (
15 |
16 |
17 |
18 | {poll.title}
19 |
20 |
21 |
22 |
23 |
24 | )
25 | }
26 | });
27 |
28 | module.exports = PollPanel;
--------------------------------------------------------------------------------
/src/DiscussionPanel.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var ReactIntl = require('react-intl');
3 | var FormattedDate = ReactIntl.FormattedDate;
4 | var Remarkable = require('remarkable');
5 | var md = new Remarkable();
6 | var Link = require('react-router').Link;
7 |
8 |
9 | var DiscussionPanel = React.createClass({
10 |
11 | render: function () {
12 | var discussion = this.props.discussion;
13 | var description = md.render(discussion.body);
14 | return (
15 |
16 |
17 |
18 | {discussion.title}
19 |
20 |
21 |
22 |
23 |
24 | )
25 | }
26 | });
27 |
28 | module.exports = DiscussionPanel;
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Apps built on top of GitHub API
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/src/GroupHeader.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Link = require('react-router').Link;
3 | var Count = require('react-count');
4 |
5 |
6 | var GroupHeader = React.createClass({
7 |
8 | render: function () {
9 | return (
10 |
11 |
Join
12 |
{this.props.group.name}
13 |
{this.props.group.description}
14 |
15 |
16 |
17 |
18 |
19 |
20 | )
21 | }
22 |
23 | });
24 |
25 | module.exports= GroupHeader;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "meetup",
3 | "version": "0.1.0",
4 | "description": "Meetup-like site with GitHub as backend",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/gitrun/meetup.git"
12 | },
13 | "keywords": [
14 | "meetup",
15 | "github",
16 | "api"
17 | ],
18 | "author": "hashobject team (team@hashobject.com)",
19 | "license": "MIT",
20 | "bugs": {
21 | "url": "https://github.com/gitrun/meetup/issues"
22 | },
23 | "homepage": "https://github.com/gitrun/meetup",
24 | "devDependencies": {
25 | "jsx-loader": "^0.12.2",
26 | "webpack": "^1.7.3"
27 | },
28 | "dependencies": {
29 | "async": "^0.9.0",
30 | "chart.js": "^1.0.2",
31 | "express": "^4.12.2",
32 | "github-api": "^0.10.3",
33 | "react": "^0.12.2",
34 | "react-chartjs": "^0.5.0",
35 | "react-count": "^0.2.4",
36 | "react-grid-layout": "^0.8.0",
37 | "react-intl": "^1.1.0",
38 | "react-pie": "0.0.3",
39 | "react-router": "^0.12.4",
40 | "react-style": "^0.4.1",
41 | "remarkable": "^1.6.0",
42 | "superagent": "^1.1.0"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/EventPanel.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var ReactIntl = require('react-intl');
3 | var FormattedDate = ReactIntl.FormattedDate;
4 | var Remarkable = require('remarkable');
5 | var md = new Remarkable();
6 | var Link = require('react-router').Link;
7 |
8 |
9 | var EventPanel = React.createClass({
10 |
11 | render: function () {
12 | var ev = this.props.ev;
13 | var date = 'not defined';
14 | if(ev.milestone && ev.milestone.due_on) {
15 | date = ev.milestone.due_on;
16 | }
17 | var eventDescription = md.render(ev.body);
18 | return (
19 |
20 |
21 |
22 | {ev.title}
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 | )
33 | }
34 | });
35 |
36 | module.exports = EventPanel;
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | var async = require('async');
2 | var request = require('superagent');
3 | var oauth = require('./oauth');
4 |
5 | exports.fetchMeta = function (github, group, callback) {
6 | var groupRepo = github.getRepo('meetups', group.name);
7 | groupRepo.read('master', 'meetup.json', function(err, data) {
8 | if (err) {
9 | return callback(err);
10 | }
11 | var meta = JSON.parse(data);
12 | group.logo = meta.logo;
13 | group.cssurl = meta.css;
14 | callback(null, group);
15 | });
16 | };
17 |
18 |
19 | exports.fetchCSS = function (github, group, callback) {
20 | var groupRepo = github.getRepo('meetups', group.name);
21 | groupRepo.read('master', 'styles.css', function(err, data) {
22 | if (err) {
23 | group.css = ''
24 | return callback(null, group);
25 | }
26 | group.css = data;
27 | callback(null, group);
28 | });
29 | };
30 |
31 |
32 | exports.fetchGroup = function (github, groupName, callback) {
33 | var groupRepo = github.getRepo('meetups', groupName);
34 | groupRepo.show(function(err, group) {
35 | if (err) {
36 | return callback(err);
37 | }
38 | async.parallel({
39 | meta: exports.fetchMeta.bind(null, github, group),
40 | css: exports.fetchCSS.bind(null, github, group)
41 | }, function (err, results) {
42 | if (err) {
43 | return callback(err);
44 | }
45 | console.log('fetched repo', results, group);
46 | callback(null, group);
47 | });
48 | })
49 | };
50 |
51 | exports.fetchEvents = function (groupName, type, callback) {
52 | var issueUrl = 'https://api.github.com/repos/meetups/' + groupName + '/issues?labels=' + type;
53 | var tokenHeader = 'token ' + oauth.token;
54 | request.get(issueUrl).set('Authorization', tokenHeader).end(function (err, res) {
55 | if (err) {
56 | return callback(err);
57 | }
58 | callback(null, res.body);
59 | });
60 | }
61 |
62 |
63 | exports.fetchEvent = function (groupName, issueNumber, callback) {
64 | var issueUrl = 'https://api.github.com/repos/meetups/' + groupName + '/issues/' + issueNumber;
65 | var tokenHeader = 'token ' + oauth.token;
66 | request.get(issueUrl).set('Authorization', tokenHeader).end(function (err, res) {
67 | if (err) {
68 | return callback(err);
69 | }
70 | var ev = res.body;
71 | var commentsUrl = issueUrl + '/comments';
72 | request.get(commentsUrl).set('Authorization', tokenHeader).end(function (err, res) {
73 | if (err) {
74 | return callback(null, ev);
75 | }
76 | var comments = res.body;
77 | ev.comments = comments;
78 | callback(null, ev)
79 | });
80 | });
81 | }
82 |
--------------------------------------------------------------------------------
/src/Event.js:
--------------------------------------------------------------------------------
1 | var async = require('async');
2 | var React = require('react');
3 | var Github = require('github-api');
4 | var ReactGridLayout = require('react-grid-layout');
5 | var StyleSheet = require('react-style')
6 |
7 | var ReactIntl = require('react-intl');
8 | var FormattedDate = ReactIntl.FormattedDate;
9 |
10 | var Remarkable = require('remarkable');
11 | var md = new Remarkable();
12 |
13 | var Router = require('react-router');
14 | var Route = Router.Route;
15 | var DefaultRoute = Router.DefaultRoute;
16 | var Link = Router.Link;
17 | var RouteHandler = Router.RouteHandler;
18 |
19 | var EventPanel = require('./EventPanel');
20 | var DiscussionPanel = require('./DiscussionPanel');
21 | var Attendees = require('./Attendees');
22 | var GroupHeader = require('./GroupHeader');
23 | var oauth = require('./oauth');
24 |
25 |
26 | var utils = require('./utils');
27 |
28 |
29 | var Event = React.createClass({
30 | mixins: [ Router.State ],
31 |
32 | getInitialState: function () {
33 | return {
34 | ev: {},
35 | group: {}
36 | }
37 | },
38 |
39 | componentWillMount: function () {
40 | this.github = new Github(oauth);
41 | this.githubUser = this.github.getUser();
42 | },
43 |
44 | componentDidMount: function () {
45 | utils.fetchEvent(this.getParams().groupName, this.getParams().eventId, function (err, ev) {
46 | console.log('fulll event', err, ev);
47 | this.setState({ev: ev});
48 | }.bind(this));
49 | utils.fetchGroup(this.github, this.getParams().groupName, function (err, group) {
50 | console.log('done', err, group);
51 | this.setState({group: group});
52 | }.bind(this))
53 | },
54 |
55 | getAttendees: function () {
56 | var comments = this.state.ev.comments || [];
57 | var attending = comments.filter(function (comment) {
58 | return comment.body.indexOf('+1') > -1;
59 | });
60 | var attendees = attending.map(function (comment) {
61 | return comment.user;
62 | });
63 | return attendees;
64 | },
65 |
66 | render: function (){
67 | var content;
68 | var attendees = this.getAttendees();
69 | if (Object.keys(this.state.group).length > 0 && Object.keys(this.state.ev).length > 0) {
70 | content =
71 |
72 |
75 |
76 |
77 |
78 |
79 | } else {
80 | content =
83 | }
84 | return (
85 | {content}
86 |
87 |
88 | )
89 | }
90 | });
91 |
92 |
93 | module.exports = Event;
94 |
--------------------------------------------------------------------------------
/src/Poll.js:
--------------------------------------------------------------------------------
1 | var async = require('async');
2 | var React = require('react');
3 | var Github = require('github-api');
4 | var ReactGridLayout = require('react-grid-layout');
5 | var StyleSheet = require('react-style')
6 | var Pie = require('react-pie');
7 | var ReactIntl = require('react-intl');
8 | var FormattedDate = ReactIntl.FormattedDate;
9 | var PieChart = require("react-chartjs").Pie;
10 | var Remarkable = require('remarkable');
11 | var md = new Remarkable();
12 |
13 | var Router = require('react-router');
14 | var Route = Router.Route;
15 | var DefaultRoute = Router.DefaultRoute;
16 | var Link = Router.Link;
17 | var RouteHandler = Router.RouteHandler;
18 |
19 | var PollPanel = require('./PollPanel');
20 | var DiscussionPanel = require('./DiscussionPanel');
21 | var Attendees = require('./Attendees');
22 | var GroupHeader = require('./GroupHeader');
23 | var oauth = require('./oauth');
24 |
25 | console.log('dasdasd', Pie);
26 | var utils = require('./utils');
27 |
28 |
29 | var Poll = React.createClass({
30 | mixins: [ Router.State ],
31 |
32 | getInitialState: function () {
33 | return {
34 | poll: {},
35 | group: {}
36 | }
37 | },
38 |
39 | componentWillMount: function () {
40 | this.github = new Github(oauth);
41 | this.githubUser = this.github.getUser();
42 | },
43 |
44 | componentDidMount: function () {
45 | console.log('xxxxx', this.getParams());
46 | utils.fetchEvent(this.getParams().groupName, this.getParams().pollId, function (err, poll) {
47 | console.log('fulll poll', err, poll);
48 | this.setState({poll: poll});
49 | }.bind(this));
50 | utils.fetchGroup(this.github, this.getParams().groupName, function (err, group) {
51 | console.log('done', err, group);
52 | this.setState({group: group});
53 | }.bind(this))
54 | },
55 |
56 | getData: function () {
57 | var comments = this.state.poll.comments || [];
58 | var votedYes = comments.filter(function (comment) {
59 | return comment.body.indexOf('+1') > -1;
60 | });
61 | var votedNo = comments.filter(function (comment) {
62 | return comment.body.indexOf('-1') > -1;
63 | });
64 | var data = [
65 | {
66 | label: 'Yes',
67 | color:"#F7464A",
68 | highlight: "#FF5A5E",
69 | value: (votedYes.length/comments.length)*100
70 | },
71 | {
72 | label: 'No',
73 | color:"#46BFBD",
74 | highlight: "#5AD3D1",
75 | value: (votedNo.length/comments.length)*100
76 | }
77 | ]
78 | return data;
79 | },
80 | getCommenters: function () {
81 | var comments = this.state.poll.comments || [];
82 | var attendees = comments.map(function (comment) {
83 | return comment.user;
84 | });
85 | return attendees;
86 | },
87 |
88 | render: function (){
89 | var content;
90 | var data = this.getData();
91 |
92 |
93 | var commenters = this.getCommenters();
94 | if (Object.keys(this.state.group).length > 0 && Object.keys(this.state.poll).length > 0) {
95 | content =
96 |
97 |
100 |
101 |
102 |
103 |
104 |
105 | } else {
106 | content =
109 | }
110 | return (
111 | {content}
112 |
113 |
114 | )
115 | }
116 | });
117 |
118 |
119 | module.exports = Poll;
120 |
--------------------------------------------------------------------------------
/src/Discussion.js:
--------------------------------------------------------------------------------
1 | var async = require('async');
2 | var React = require('react');
3 | var Github = require('github-api');
4 | var ReactGridLayout = require('react-grid-layout');
5 | var StyleSheet = require('react-style')
6 |
7 | var ReactIntl = require('react-intl');
8 | var FormattedDate = ReactIntl.FormattedDate;
9 |
10 | var Remarkable = require('remarkable');
11 | var md = new Remarkable();
12 |
13 | var Router = require('react-router');
14 | var Route = Router.Route;
15 | var DefaultRoute = Router.DefaultRoute;
16 | var Link = Router.Link;
17 | var RouteHandler = Router.RouteHandler;
18 |
19 | var EventPanel = require('./EventPanel');
20 | var DiscussionPanel = require('./DiscussionPanel');
21 | var Attendees = require('./Attendees');
22 | var GroupHeader = require('./GroupHeader');
23 | var oauth = require('./oauth');
24 |
25 |
26 | var utils = require('./utils');
27 |
28 | var Discussion = React.createClass({
29 | mixins: [ Router.State ],
30 |
31 | getInitialState: function () {
32 | return {
33 | discussion: {},
34 | group: {}
35 | }
36 | },
37 |
38 | componentWillMount: function () {
39 | this.github = new Github(oauth);
40 | this.githubUser = this.github.getUser();
41 | },
42 |
43 | componentDidMount: function () {
44 | utils.fetchEvent(this.getParams().groupName, this.getParams().discussionId, function (err, discussion) {
45 | console.log('fulll discussion', err, discussion);
46 | this.setState({discussion: discussion});
47 | }.bind(this));
48 | utils.fetchGroup(this.github, this.getParams().groupName, function (err, group) {
49 | console.log('done', err, group);
50 | this.setState({group: group});
51 | }.bind(this))
52 | },
53 |
54 | getCommenters: function () {
55 | var comments = this.state.discussion.comments || [];
56 | var attendees = comments.map(function (comment) {
57 | return comment.user;
58 | });
59 | return attendees;
60 | },
61 |
62 | render: function (){
63 | var content;
64 | var comments = this.state.discussion.comments || [];
65 | var attendees = this.getCommenters();
66 | if (Object.keys(this.state.group).length > 0 && Object.keys(this.state.discussion).length > 0) {
67 | content =
68 |
69 |
72 |
73 |
74 |
75 |
76 |
77 | } else {
78 | content =
81 | }
82 | return (
83 | {content}
84 |
85 |
86 | )
87 | }
88 | });
89 |
90 | var Comments = React.createClass({
91 |
92 | render: function () {
93 | var comments = this.props.comments;
94 | var content = comments.map(function(comment){
95 | var body = md.render(comment.body);
96 | return (
97 |
98 |
99 |
100 |
{comment.user.login}
101 |
102 |
105 |
106 |
107 |
108 |
)
109 | })
110 | return (
111 | {content}
112 | )
113 | }
114 |
115 | });
116 |
117 | module.exports = Discussion;
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | var async = require('async');
2 | var React = require('react');
3 | var Github = require('github-api');
4 | var ReactGridLayout = require('react-grid-layout');
5 | var StyleSheet = require('react-style')
6 |
7 | var ViewCount = require('react-count').ViewCount;
8 | var OnlineCount = require('react-count').OnlineCount;
9 |
10 | var Remarkable = require('remarkable');
11 | var md = new Remarkable();
12 |
13 | var Router = require('react-router');
14 | var Route = Router.Route;
15 | var DefaultRoute = Router.DefaultRoute;
16 | var Link = Router.Link;
17 | var RouteHandler = Router.RouteHandler;
18 |
19 | var EventPanel = require('./EventPanel');
20 | var DiscussionPanel = require('./DiscussionPanel');
21 | var PollPanel = require('./PollPanel');
22 | var Attendees = require('./Attendees');
23 | var Discussion = require('./Discussion');
24 | var Event = require('./Event');
25 | var Poll = require('./Poll');
26 | var GroupHeader = require('./GroupHeader');
27 | var oauth = require('./oauth');
28 |
29 |
30 |
31 | var utils = require('./utils');
32 |
33 | var App = React.createClass({
34 |
35 | render: function () {
36 |
37 | return (
38 |
39 |
40 |
41 | )
42 | }
43 |
44 | });
45 |
46 | var Index = React.createClass({
47 | getInitialState: function () {
48 | return {
49 | groups: []
50 | }
51 | },
52 |
53 | componentWillMount: function () {
54 | this.github = new Github(oauth);
55 | this.githubUser = this.github.getUser();
56 | },
57 |
58 | componentDidMount: function () {
59 | this.githubUser.orgRepos('meetups', function(err, groups) {
60 | this.setState({
61 | groups: groups
62 | });
63 | async.map(groups, utils.fetchMeta.bind(null, this.github), function (err, groups) {
64 | console.log('new groups', groups);
65 | this.setState({
66 | groups: groups
67 | });
68 | }.bind(this));
69 | }.bind(this));
70 | },
71 |
72 | render: function () {
73 | var groups = this.state.groups;
74 | var groupsList = groups.map(function (group) {
75 | console.log('all groups', group);
76 | return (
77 |
78 |
79 |
80 |
{group.name}
81 |
82 |
83 |
84 |
{group.description}
85 |
86 |
87 | 10 members
88 |
89 |
)
90 | });
91 | return (
92 |
93 |
94 |
Groups
95 | {groupsList}
96 |
97 |
98 | )
99 | }
100 |
101 | });
102 |
103 | var Group = React.createClass({
104 | mixins: [ Router.State ],
105 |
106 | getInitialState: function () {
107 | return {
108 | events: [],
109 | questions: [],
110 | polls: [],
111 | group: {},
112 | selectedTab: 'events'
113 | }
114 | },
115 |
116 | componentWillMount: function () {
117 | this.github = new Github(oauth);
118 | },
119 |
120 | componentDidMount: function () {
121 | utils.fetchEvents(this.getParams().groupName, 'event', function(err, events) {
122 | console.log('events', events);
123 | this.setState({events: events});
124 | }.bind(this));
125 |
126 | utils.fetchEvents(this.getParams().groupName, 'question', function(err, questions) {
127 | console.log('questions', questions);
128 | this.setState({questions: questions});
129 | }.bind(this));
130 |
131 | utils.fetchEvents(this.getParams().groupName, 'poll', function(err, polls) {
132 | console.log('poll', polls);
133 | this.setState({polls: polls});
134 | }.bind(this));
135 |
136 | utils.fetchGroup(this.github, this.getParams().groupName, function (err, group) {
137 | console.log('done', err, group);
138 | this.setState({group: group});
139 | }.bind(this))
140 | },
141 |
142 | selectTab: function (name) {
143 | this.setState({
144 | selectedTab: name
145 | });
146 | },
147 | render: function (){
148 | var events = this.state.events || [];
149 | var questions = this.state.questions || [];
150 | var polls = this.state.polls || [];
151 | var eventsList = events.map(function (ev) {
152 | return ()
153 | }.bind(this));
154 | var discussionsList = questions.map(function (question) {
155 | return ()
156 | }.bind(this));
157 | var pollsList = polls.map(function (poll) {
158 | return ()
159 | }.bind(this));
160 | var content;
161 | if (Object.keys(this.state.group).length > 0 ) {
162 | content =
163 |
164 |
167 |
168 |
169 |
174 |
175 |
176 | {eventsList}
177 |
178 |
179 | {discussionsList}
180 |
181 |
182 | {pollsList}
183 |
184 |
185 |
186 |
187 | } else {
188 | content =
191 | }
192 | return (
193 | {content}
194 |
195 |
196 | )
197 | }
198 | });
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 | var routes = (
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 | );
217 |
218 | Router.run(routes, Router.HistoryLocation, function (Handler) {
219 | console.log('run');
220 | React.render( , document.getElementById('app'));
221 | });
222 |
223 |
--------------------------------------------------------------------------------