diff --git a/client/coral-embed-stream/src/containers/Embed.js b/client/coral-embed-stream/src/containers/Embed.js index 0ea577530..7309965a4 100644 --- a/client/coral-embed-stream/src/containers/Embed.js +++ b/client/coral-embed-stream/src/containers/Embed.js @@ -65,6 +65,7 @@ const EMBED_QUERY = gql` totalCommentCount(excludeIgnored: $excludeIgnored) } me { + id status } ...${getDefinitionName(Stream.fragments.root)} diff --git a/client/coral-framework/actions/auth.js b/client/coral-framework/actions/auth.js index 20069070c..4ab42d701 100644 --- a/client/coral-framework/actions/auth.js +++ b/client/coral-framework/actions/auth.js @@ -148,10 +148,12 @@ export const fetchSignIn = (formData) => (dispatch) => { const signInFacebookRequest = () => ({ type: actions.FETCH_SIGNIN_FACEBOOK_REQUEST }); + const signInFacebookSuccess = (user) => ({ type: actions.FETCH_SIGNIN_FACEBOOK_SUCCESS, user }); + const signInFacebookFailure = (error) => ({ type: actions.FETCH_SIGNIN_FACEBOOK_FAILURE, error @@ -189,8 +191,8 @@ export const facebookCallback = (err, data) => (dispatch) => { return; } try { - const user = JSON.parse(data); - dispatch(signInFacebookSuccess(user)); + dispatch(handleAuthToken(data.token)); + dispatch(signInFacebookSuccess(data.user)); dispatch(hideSignInDialog()); dispatch(showCreateUsernameDialog()); dispatch(hideSignInDialog()); @@ -263,8 +265,8 @@ export const fetchForgotPassword = (email) => (dispatch) => { export const logout = () => (dispatch) => { return coralApi('/auth', {method: 'DELETE'}).then(() => { - dispatch({type: actions.LOGOUT}); Storage.removeItem('token'); + dispatch({type: actions.LOGOUT}); }); }; diff --git a/client/coral-framework/helpers/storage.js b/client/coral-framework/helpers/storage.js index fa20fa168..ec83c3fb3 100644 --- a/client/coral-framework/helpers/storage.js +++ b/client/coral-framework/helpers/storage.js @@ -86,7 +86,6 @@ export function clear() { } } -// Enable this to debug WEB Storage events // window.addEventListener('storage', function(e) { // const msg = `${e.key} " was changed in page ${e.url} from ${e.oldValue} to ${e.newValue}`; // console.log(msg); diff --git a/client/coral-settings/containers/ProfileContainer.js b/client/coral-settings/containers/ProfileContainer.js index f484b5d24..37c5991b3 100644 --- a/client/coral-settings/containers/ProfileContainer.js +++ b/client/coral-settings/containers/ProfileContainer.js @@ -23,6 +23,14 @@ class ProfileContainer extends Component { }; } + componentWillReceiveProps(nextProps) { + if (!this.props.auth.loggedIn && nextProps.auth.loggedIn) { + + // Refetch after login. + this.props.data.refetch(); + } + } + handleTabChange = (tab) => { this.setState({ activeTab: tab @@ -37,7 +45,7 @@ class ProfileContainer extends Component { return ; } - if (data.loading) { + if (!me || data.loading) { return ; } @@ -76,6 +84,7 @@ const withQuery = graphql( gql` query EmbedStreamProfileQuery { me { + id ignoredUsers { id, username, diff --git a/client/coral-sign-in/containers/SignInContainer.js b/client/coral-sign-in/containers/SignInContainer.js index 9f97e0cc9..1350b423a 100644 --- a/client/coral-sign-in/containers/SignInContainer.js +++ b/client/coral-sign-in/containers/SignInContainer.js @@ -38,24 +38,26 @@ class SignInContainer extends Component { constructor(props) { super(props); this.state = this.initialState; + this.addError = this.addError.bind(this); + this.handleAuth = this.handleAuth.bind(this); + this.handleSignUp = this.handleSignUp.bind(this); + this.handleSignIn = this.handleSignIn.bind(this); this.handleChange = this.handleChange.bind(this); this.handleChangeEmail = this.handleChangeEmail.bind(this); this.handleResendVerification = this.handleResendVerification.bind(this); - this.handleSignUp = this.handleSignUp.bind(this); - this.handleSignIn = this.handleSignIn.bind(this); - this.addError = this.addError.bind(this); } static propTypes = { requireEmailConfirmation: PropTypes.bool.isRequired - } + }; - componentWillMount () { + componentWillMount() { this.props.checkLogin(); } componentDidMount() { - window.authCallback = this.props.facebookCallback; + window.addEventListener('storage', this.handleAuth); + const {formData} = this.state; const errors = Object.keys(formData).reduce((map, prop) => { map[prop] = t('sign_in.required_field'); @@ -64,17 +66,36 @@ class SignInContainer extends Component { this.setState({errors}); } + componentWillUnmount() { + window.removeEventListener('storage', this.handleAuth); + } + + handleAuth(e) { + + // Listening to FB changes + // FB localStorage key is 'auth' + const authCallback = this.props.facebookCallback; + + if (e.key === 'auth') { + const {err, data} = JSON.parse(e.newValue); + authCallback(err, data); + } + } + handleChange(e) { const {name, value} = e.target; - this.setState((state) => ({ - ...state, - formData: { - ...state.formData, - [name]: value + this.setState( + (state) => ({ + ...state, + formData: { + ...state.formData, + [name]: value + } + }), + () => { + this.validation(name, value); } - }), () => { - this.validation(name, value); - }); + ); } handleChangeEmail(e) { @@ -84,7 +105,11 @@ class SignInContainer extends Component { handleResendVerification(e) { e.preventDefault(); - this.props.requestConfirmEmail(this.state.emailToBeResent, pym.parentUrl || location.href) + this.props + .requestConfirmEmail( + this.state.emailToBeResent, + pym.parentUrl || location.href + ) .then(() => { setTimeout(() => { @@ -109,12 +134,15 @@ class SignInContainer extends Component { if (!value.length) { addError(name, t('sign_in.required_field')); - } else if (name === 'confirmPassword' && formData.confirmPassword !== formData.password) { + } else if ( + name === 'confirmPassword' && + formData.confirmPassword !== formData.password + ) { addError('confirmPassword', t('sign_in.passwords_dont_match')); } else if (!validate[name](value)) { addError(name, errorMsj[name]); } else { - const { [name]: prop, ...errors } = this.state.errors; // eslint-disable-line + const {[name]: prop, ...errors} = this.state.errors; // eslint-disable-line // Removes Error this.setState((state) => ({...state, errors})); } @@ -180,14 +208,12 @@ const mapDispatchToProps = (dispatch) => ({ fetchSignInFacebook: () => dispatch(fetchSignInFacebook()), fetchSignUpFacebook: () => dispatch(fetchSignUpFacebook()), fetchForgotPassword: (formData) => dispatch(fetchForgotPassword(formData)), - requestConfirmEmail: (email, url) => dispatch(requestConfirmEmail(email, url)), + requestConfirmEmail: (email, url) => + dispatch(requestConfirmEmail(email, url)), changeView: (view) => dispatch(changeView(view)), handleClose: () => dispatch(hideSignInDialog()), invalidForm: (error) => dispatch(invalidForm(error)), validForm: () => dispatch(validForm()) }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(SignInContainer); +export default connect(mapStateToProps, mapDispatchToProps)(SignInContainer); diff --git a/graph/resolvers/asset.js b/graph/resolvers/asset.js index 41710ba35..747e2534e 100644 --- a/graph/resolvers/asset.js +++ b/graph/resolvers/asset.js @@ -1,4 +1,11 @@ const Asset = { + lastComment({id}, _, {loaders: {Comments}}) { + return Comments.getByQuery({ + asset_id: id, + limit: 1, + parent_id: null + }).then((data) => data[0]); + }, recentComments({id}, _, {loaders: {Comments}}) { return Comments.genRecentComments.load(id); }, diff --git a/views/auth-callback.ejs b/views/auth-callback.ejs index a97884ae2..22103226d 100644 --- a/views/auth-callback.ejs +++ b/views/auth-callback.ejs @@ -5,7 +5,7 @@ <%/* set the auth data in localStorage, this will ensure that only javascript on the same domain can access the data, they can listen for updates by attaching to localStorage event changes */%> - localStorage.setItem('auth', <%- auth %>); + localStorage.setItem('auth', '<%- auth %>'); setTimeout(function() { window.close(); }, 50);