diff --git a/src/components/User/ProfileData.vue b/src/components/User/ProfileData.vue new file mode 100644 index 0000000..b2eddd1 --- /dev/null +++ b/src/components/User/ProfileData.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/helpers/formRules.js b/src/helpers/formRules.js new file mode 100644 index 0000000..0cc5c47 --- /dev/null +++ b/src/helpers/formRules.js @@ -0,0 +1,13 @@ +export const emailRules = [ + (value) => !!value || 'Пожалуйста, введите email', + (value) => /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(value) || 'Неправильный email', +]; + +export const passwordRules = [ + (value) => !!value || 'Пожалуйста введите пароль', + (value) => (value && value.length >= 6) || 'Пароль слишком короткий - минимум 6 символов', +]; + +export const nameRules = [ + (value) => !!value || 'Пожалуйста введите ваше имя', +]; diff --git a/src/helpers/index.js b/src/helpers/index.js index cc98907..ca44309 100644 --- a/src/helpers/index.js +++ b/src/helpers/index.js @@ -1,2 +1,3 @@ export * from '@/helpers/article'; -export * from '@/helpers/utils'; \ No newline at end of file +export * from '@/helpers/utils'; +export * from '@/helpers/formRules'; diff --git a/src/store/user.js b/src/store/user.js index 86a9b31..06be246 100644 --- a/src/store/user.js +++ b/src/store/user.js @@ -1,3 +1,4 @@ +import Vue from 'vue'; import firebase from 'firebase/app'; import 'firebase/auth'; @@ -6,16 +7,25 @@ export default { user: { isAuthentificated: false, uid: null, + email: null, + name: null, }, }, mutations: { - setUser(state, payload) { + setUser(state, { id, email}) { state.user.isAuthentificated = true; - state.user.uid = payload; + state.user.uid = id; + state.user.email = email; }, unSetUser(state) { state.user.isAuthentificated = false; state.user.uid = null; + }, + setUserName(state, name) { + Vue.set(state.user, 'name', name); + }, + setUserEmail(state, email) { + Vue.set(state.user, 'email', email); } }, actions: { @@ -23,10 +33,15 @@ export default { commit('setProcessing', true); commit('clearError'); - const { email, password } = payload; + const { email, password, name } = payload; firebase.auth() .createUserWithEmailAndPassword(email, password) .then(() => { + firebase.auth().currentUser + .updateProfile({ + displayName: name, + }) + .then(() => commit('setUserName', name)); commit('setProcessing', false); }) .catch(function(error) { @@ -56,15 +71,60 @@ export default { }, stateChanged({ commit, dispatch }, payload) { if (payload) { - commit('setUser', payload.uid); + commit('setUser', payload); + commit('setUserName', payload.displayName); dispatch('loadUserData', payload.uid); } else { commit('unSetUser'); } - } + }, + changeUserProfileData({ commit }, payload) { + const { email, password } = payload; + const credential = firebase.auth.EmailAuthProvider.credential(email, password); + + commit('setProcessing', true); + commit('clearError'); + + firebase.auth().currentUser.reauthenticateAndRetrieveDataWithCredential(credential) + .then(() => { + const { changeType } = payload; + const reauthenticatedUser = firebase.auth().currentUser; + + if (changeType === 'changeName') { + const { newName } = payload; + return reauthenticatedUser.updateProfile({ + displayName: newName, + }) + .then(() => commit('setUserName', newName)) + } + + if (changeType === 'changeEmail') { + const { newEmail } = payload; + return reauthenticatedUser.updateEmail(newEmail) + .then(() => commit('setUserEmail', newEmail)) + } + + if (changeType === 'changePassword') { + const { newPassword } = payload; + return reauthenticatedUser.updatePassword(newPassword); + } + + throw Error('invalid change type'); + }) + .then(() => commit('setProcessing', false)) + .catch((e) => { + window.console.error(e); + + const { message } = e; + commit('setProcessing', false); + commit('setError', message); + }); + }, }, getters: { isUserAuthentificated: state => state.user.isAuthentificated, userId: state => state.user.uid, + userName: state => state.user.name, + userEmail: state => state.user.email, }, }; diff --git a/src/views/Profile.vue b/src/views/Profile.vue index 6a6b496..d4ca152 100644 --- a/src/views/Profile.vue +++ b/src/views/Profile.vue @@ -1,12 +1,44 @@ diff --git a/src/views/SignIn.vue b/src/views/SignIn.vue index 56f2b20..5f8eca0 100644 --- a/src/views/SignIn.vue +++ b/src/views/SignIn.vue @@ -17,7 +17,7 @@