Skip to content
Extraits de code Groupes Projets
Valider 44e57f64 rédigé par Eugen Rochko's avatar Eugen Rochko
Parcourir les fichiers

Improving statuses, adding a composer drawer, which doesn't work yet

parent f5e11278
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Affichage de
avec 138 ajouts et 12 suppressions
import fetch from 'isomorphic-fetch'
export const SET_TIMELINE = 'SET_TIMELINE'; export const SET_TIMELINE = 'SET_TIMELINE';
export const ADD_STATUS = 'ADD_STATUS'; export const ADD_STATUS = 'ADD_STATUS';
export const PUBLISH = 'PUBLISH';
export function setTimeline(timeline, statuses) { export function setTimeline(timeline, statuses) {
return { return {
...@@ -16,3 +19,15 @@ export function addStatus(timeline, status) { ...@@ -16,3 +19,15 @@ export function addStatus(timeline, status) {
status: status status: status
}; };
} }
export function publish(text, in_reply_to_id) {
return function (dispatch) {
return fetch('/api/statuses', {
method: 'POST'
}).then(function (response) {
return response.json();
}).then(function (json) {
console.log(json);
});
};
}
const Button = React.createClass({
propTypes: {
text: React.PropTypes.string.isRequired,
onClick: React.PropTypes.func
},
handleClick (e) {
e.preventDefault();
this.props.onClick();
},
render () {
return (
<a href='#' onClick={this.handleClick} style={{ display: 'inline-block', position: 'relative', boxSizing: 'border-box', textAlign: 'center', border: '10px none', backgroundColor: '#2b90d9', color: '#fff', fontSize: '14px', fontWeight: '500', letterSpacing: '0', textTransform: 'uppercase', padding: '0 16px', height: '36px', cursor: 'pointer', lineHeight: '36px', borderRadius: '4px', textDecoration: 'none' }}>
{this.props.text}
</a>
);
}
});
export default Button;
const CharacterCounter = React.createClass({
propTypes: {
text: React.PropTypes.string.isRequired
},
render () {
return (
<span style={{ fontSize: '16px', cursor: 'default' }}>
{this.props.text.length}
</span>
);
}
});
export default CharacterCounter;
...@@ -8,7 +8,7 @@ const Column = React.createClass({ ...@@ -8,7 +8,7 @@ const Column = React.createClass({
render: function() { render: function() {
return ( return (
<div style={{ width: '350px', flex: '0 0 auto', background: '#282c37', margin: '10px', marginRight: '0', display: 'flex', flexDirection: 'column' }}> <div style={{ width: '380px', flex: '0 0 auto', background: '#282c37', margin: '10px', marginRight: '0', display: 'flex', flexDirection: 'column' }}>
<ColumnHeader type={this.props.type} /> <ColumnHeader type={this.props.type} />
<StatusListContainer type={this.props.type} /> <StatusListContainer type={this.props.type} />
</div> </div>
......
import CharacterCounter from './character_counter';
import Button from './button';
import { publish } from '../actions/statuses';
const ComposerDrawer = React.createClass({
propTypes: {
onSubmit: React.PropTypes.func.isRequired
},
getInitialState() {
return {
text: ''
};
},
handleChange (e) {
this.setState({ text: e.target.value });
},
handleKeyUp (e) {
if (e.keyCode === 13 && e.ctrlKey) {
this.handleSubmit();
}
},
handleSubmit () {
this.props.onSubmit(this.state.text, null);
},
render () {
return (
<div style={{ width: '230px', background: '#454b5e', margin: '10px 0', padding: '10px' }}>
<textarea placeholder='What is on your mind?' value={this.state.text} onKeyUp={this.handleKeyUp} onChange={this.handleChange} style={{ display: 'block', boxSizing: 'border-box', width: '100%', height: '100px', background: '#fff', resize: 'none', border: 'none', color: '#282c37', padding: '10px', fontFamily: 'Roboto', fontSize: '14px' }} />
<div style={{ marginTop: '10px', overflow: 'hidden' }}>
<div style={{ float: 'right' }}><Button text='Publish' onClick={this.handleSubmit} /></div>
<div style={{ float: 'right', marginRight: '16px', lineHeight: '36px' }}><CharacterCounter text={this.state.text} /></div>
</div>
</div>
);
}
});
export default ComposerDrawer;
...@@ -11,7 +11,7 @@ const DisplayName = React.createClass({ ...@@ -11,7 +11,7 @@ const DisplayName = React.createClass({
var url = this.props.account.get('url'); var url = this.props.account.get('url');
return ( return (
<a href={url} style={{ color: '#616b86', textDecoration: 'none' }}> <a href={url} style={{ display: 'inline-block', color: '#616b86', textDecoration: 'none', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', width: '190px' }}>
<strong style={{ fontWeight: 'bold', color: '#fff' }}>{displayName}</strong> <span>{acct}</span> <strong style={{ fontWeight: 'bold', color: '#fff' }}>{displayName}</strong> <span>{acct}</span>
</a> </a>
); );
......
import NavBar from './nav_bar'; import NavBar from './nav_bar';
import ColumnsArea from './columns_area'; import ColumnsArea from './columns_area';
import ComposerDrawerContainer from '../containers/composer_drawer_container';
const Frontend = React.createClass({ const Frontend = React.createClass({
...@@ -7,6 +8,7 @@ const Frontend = React.createClass({ ...@@ -7,6 +8,7 @@ const Frontend = React.createClass({
return ( return (
<div style={{ flex: '0 0 auto', display: 'flex', width: '100%', height: '100%', background: '#1a1c23' }}> <div style={{ flex: '0 0 auto', display: 'flex', width: '100%', height: '100%', background: '#1a1c23' }}>
<NavBar /> <NavBar />
<ComposerDrawerContainer />
<ColumnsArea /> <ColumnsArea />
</div> </div>
); );
......
const NavBar = React.createClass({ const NavBar = React.createClass({
render: function() { render: function() {
return <div style={{ background: '#2f3441', width: '60px', margin: '10px', marginRight: '0' }} />; return (
<div style={{ background: '#2f3441', width: '60px', margin: '10px', marginRight: '0' }}>
</div>
);
} }
}); });
......
...@@ -12,7 +12,7 @@ moment.updateLocale('en', { ...@@ -12,7 +12,7 @@ moment.updateLocale('en', {
d: "a day", d: "a day",
dd: "%dd", dd: "%dd",
M: "a month", M: "a month",
MM: "%dm", MM: "%dmo",
y: "a year", y: "a year",
yy: "%dy" yy: "%dy"
} }
......
...@@ -13,7 +13,7 @@ const Status = React.createClass({ ...@@ -13,7 +13,7 @@ const Status = React.createClass({
var status = this.props.status; var status = this.props.status;
return ( return (
<div style={{ padding: '8px 10px', display: 'flex', flexDirection: 'row', borderBottom: '1px solid #363c4b' }}> <div style={{ padding: '8px 10px', display: 'flex', flexDirection: 'row', borderBottom: '1px solid #363c4b', cursor: 'pointer' }}>
<Avatar src={status.getIn(['account', 'avatar'])} /> <Avatar src={status.getIn(['account', 'avatar'])} />
<div style={{ flex: '1 1 auto', marginLeft: '10px' }}> <div style={{ flex: '1 1 auto', marginLeft: '10px' }}>
......
import { connect } from 'react-redux';
import ComposerDrawer from '../components/composer_drawer';
import { publish } from '../actions/statuses';
const mapStateToProps = function (state, props) {
return {};
};
const mapDispatchToProps = function (dispatch) {
return {
onSubmit: function (text, in_reply_to_id) {
dispatch(publish(text, in_reply_to_id));
}
}
};
export default connect(mapStateToProps, mapDispatchToProps)(ComposerDrawer);
import { createStore } from 'redux'; import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import appReducer from '../reducers'; import appReducer from '../reducers';
export default function configureStore(initialState) { export default function configureStore() {
return createStore(appReducer, initialState); return createStore(appReducer, applyMiddleware(thunk));
} }
...@@ -4,7 +4,7 @@ Doorkeeper.configure do ...@@ -4,7 +4,7 @@ Doorkeeper.configure do
# This block will be called to check whether the resource owner is authenticated or not. # This block will be called to check whether the resource owner is authenticated or not.
resource_owner_authenticator do resource_owner_authenticator do
current_user || redirect_to(new_user_session_url) current_user || warden.authenticate!(scope: :user)
end end
resource_owner_from_credentials do |routes| resource_owner_from_credentials do |routes|
......
...@@ -11,11 +11,14 @@ ...@@ -11,11 +11,14 @@
"redux-devtools": "^3.3.1" "redux-devtools": "^3.3.1"
}, },
"dependencies": { "dependencies": {
"es6-promise": "^3.2.1",
"immutable": "^3.8.1", "immutable": "^3.8.1",
"isomorphic-fetch": "^2.2.1",
"moment": "^2.14.1", "moment": "^2.14.1",
"react-immutable-proptypes": "^2.1.0", "react-immutable-proptypes": "^2.1.0",
"react-redux": "^4.4.5", "react-redux": "^4.4.5",
"redux": "^3.5.2", "redux": "^3.5.2",
"redux-immutable": "^3.0.8" "redux-immutable": "^3.0.8",
"redux-thunk": "^2.1.0"
} }
} }
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter