mirror of
https://github.com/pinry/pinry.git
synced 2025-11-16 18:05:51 +01:00
Feature: Add register function for UI
This commit is contained in:
committed by
Isaac Bythewood
parent
a268a886e0
commit
28ebe49550
@@ -21,7 +21,7 @@
|
|||||||
BookmarkLet
|
BookmarkLet
|
||||||
</a>
|
</a>
|
||||||
<div
|
<div
|
||||||
v-show="user.loggedIn"
|
v-if="user.loggedIn"
|
||||||
class="navbar-item has-dropdown is-hoverable">
|
class="navbar-item has-dropdown is-hoverable">
|
||||||
<a class="navbar-link">
|
<a class="navbar-link">
|
||||||
Create
|
Create
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-show="user.loggedIn"
|
v-if="user.loggedIn"
|
||||||
class="navbar-item has-dropdown is-hoverable">
|
class="navbar-item has-dropdown is-hoverable">
|
||||||
<a class="navbar-link">
|
<a class="navbar-link">
|
||||||
My Collections
|
My Collections
|
||||||
@@ -76,6 +76,7 @@
|
|||||||
<div class="navbar-item">
|
<div class="navbar-item">
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<a
|
<a
|
||||||
|
@click="signUp"
|
||||||
v-show="!user.loggedIn"
|
v-show="!user.loggedIn"
|
||||||
class="button is-primary">
|
class="button is-primary">
|
||||||
<strong>Sign up</strong>
|
<strong>Sign up</strong>
|
||||||
@@ -104,6 +105,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import api from './api';
|
import api from './api';
|
||||||
import LoginForm from './LoginForm.vue';
|
import LoginForm from './LoginForm.vue';
|
||||||
|
import SignUpForm from './SignUpForm.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'p-header',
|
name: 'p-header',
|
||||||
@@ -121,7 +123,10 @@ export default {
|
|||||||
this.active = !this.active;
|
this.active = !this.active;
|
||||||
},
|
},
|
||||||
onLoginSucceed() {
|
onLoginSucceed() {
|
||||||
this.initializeUser();
|
this.initializeUser(true);
|
||||||
|
},
|
||||||
|
onSignUpSucceed() {
|
||||||
|
this.initializeUser(true);
|
||||||
},
|
},
|
||||||
logOut() {
|
logOut() {
|
||||||
api.User.logOut().then(
|
api.User.logOut().then(
|
||||||
@@ -140,9 +145,19 @@ export default {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
initializeUser() {
|
signUp() {
|
||||||
|
this.$buefy.modal.open({
|
||||||
|
parent: this,
|
||||||
|
component: SignUpForm,
|
||||||
|
hasModalCard: true,
|
||||||
|
events: {
|
||||||
|
'signup.succeed': this.onSignUpSucceed,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
initializeUser(force = false) {
|
||||||
const self = this;
|
const self = this;
|
||||||
api.User.fetchUserInfo().then(
|
api.User.fetchUserInfo(force).then(
|
||||||
(user) => {
|
(user) => {
|
||||||
if (user === null) {
|
if (user === null) {
|
||||||
self.user.loggedIn = false;
|
self.user.loggedIn = false;
|
||||||
|
|||||||
142
pinry-spa/src/components/SignUpForm.vue
Normal file
142
pinry-spa/src/components/SignUpForm.vue
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
<template>
|
||||||
|
<div class="signup-modal">
|
||||||
|
<form action="">
|
||||||
|
<div class="modal-card" style="width: auto">
|
||||||
|
<header class="modal-card-head">
|
||||||
|
<p class="modal-card-title">Sign Up</p>
|
||||||
|
</header>
|
||||||
|
<section class="modal-card-body">
|
||||||
|
<b-field label="Username"
|
||||||
|
:type="username.type"
|
||||||
|
:message="username.error">
|
||||||
|
<b-input
|
||||||
|
type="string"
|
||||||
|
v-model="username.value"
|
||||||
|
placeholder="Your Username"
|
||||||
|
maxlength="30"
|
||||||
|
required>
|
||||||
|
</b-input>
|
||||||
|
</b-field>
|
||||||
|
|
||||||
|
<b-field label="Email"
|
||||||
|
:type="email.type"
|
||||||
|
:message="email.error">
|
||||||
|
<b-input
|
||||||
|
type="email"
|
||||||
|
v-model="email.value"
|
||||||
|
password-reveal
|
||||||
|
placeholder="Your email"
|
||||||
|
required>
|
||||||
|
</b-input>
|
||||||
|
</b-field>
|
||||||
|
<b-field label="Password"
|
||||||
|
:type="password.type"
|
||||||
|
:message="password.error">
|
||||||
|
<b-input
|
||||||
|
type="password"
|
||||||
|
v-model="password.value"
|
||||||
|
password-reveal
|
||||||
|
placeholder="Your password"
|
||||||
|
required>
|
||||||
|
</b-input>
|
||||||
|
</b-field>
|
||||||
|
<b-field label="Password repeat"
|
||||||
|
:type="password_repeat.type"
|
||||||
|
:message="password_repeat.error">
|
||||||
|
<b-input
|
||||||
|
type="password"
|
||||||
|
v-model="password_repeat.value"
|
||||||
|
password-reveal
|
||||||
|
placeholder="Your password again"
|
||||||
|
required>
|
||||||
|
</b-input>
|
||||||
|
</b-field>
|
||||||
|
</section>
|
||||||
|
<footer class="modal-card-foot">
|
||||||
|
<button class="button" type="button" @click="$parent.close()">Close</button>
|
||||||
|
<button
|
||||||
|
@click="doRegister"
|
||||||
|
class="button is-primary">Register</button>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import api from './api';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'SignUpForm',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
username: {
|
||||||
|
value: null,
|
||||||
|
error: null,
|
||||||
|
type: null,
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
value: null,
|
||||||
|
error: null,
|
||||||
|
type: null,
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
value: null,
|
||||||
|
error: null,
|
||||||
|
type: null,
|
||||||
|
},
|
||||||
|
password_repeat: {
|
||||||
|
value: null,
|
||||||
|
error: null,
|
||||||
|
type: null,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
resetStatus() {
|
||||||
|
this.resetField('username');
|
||||||
|
this.resetField('email');
|
||||||
|
this.resetField('password');
|
||||||
|
this.resetField('password_repeat');
|
||||||
|
},
|
||||||
|
resetField(fieldName) {
|
||||||
|
this[fieldName].type = 'is-info';
|
||||||
|
this[fieldName].error = null;
|
||||||
|
},
|
||||||
|
markFieldAsDanger(fieldName, errorMsg) {
|
||||||
|
this[fieldName].error = errorMsg;
|
||||||
|
this[fieldName].type = 'is-danger';
|
||||||
|
},
|
||||||
|
doRegister() {
|
||||||
|
this.resetStatus();
|
||||||
|
const self = this;
|
||||||
|
const promise = api.User.signUp(
|
||||||
|
self.username.value,
|
||||||
|
self.email.value,
|
||||||
|
self.password.value,
|
||||||
|
self.password_repeat.value,
|
||||||
|
);
|
||||||
|
promise.then(
|
||||||
|
(user) => {
|
||||||
|
self.$emit('signup.succeed', user);
|
||||||
|
self.$parent.close();
|
||||||
|
},
|
||||||
|
(resp) => {
|
||||||
|
Object.entries(resp.data).forEach(
|
||||||
|
(errorTuple) => {
|
||||||
|
const [key, error] = errorTuple;
|
||||||
|
let msg;
|
||||||
|
if (Array.isArray(error)) {
|
||||||
|
[msg] = error;
|
||||||
|
} else {
|
||||||
|
msg = error;
|
||||||
|
}
|
||||||
|
this.markFieldAsDanger(key, msg);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -62,6 +62,34 @@ function fetchBoardForUser(username) {
|
|||||||
|
|
||||||
const User = {
|
const User = {
|
||||||
storageKey: 'pinry.user',
|
storageKey: 'pinry.user',
|
||||||
|
signUp(username, email, password, passwordRepeat) {
|
||||||
|
const url = `${API_PREFIX}profile/users/`;
|
||||||
|
return new Promise(
|
||||||
|
(resolve, reject) => {
|
||||||
|
const p = axios.post(
|
||||||
|
url,
|
||||||
|
{
|
||||||
|
username,
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
password_repeat: passwordRepeat,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
p.then(
|
||||||
|
(resp) => {
|
||||||
|
if (resp.status !== 201) {
|
||||||
|
reject(resp);
|
||||||
|
}
|
||||||
|
resolve(resp.data);
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
console.log('Failed to sign up due to unexpected error:', error);
|
||||||
|
reject(error.response);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
logIn(username, password) {
|
logIn(username, password) {
|
||||||
const url = `${API_PREFIX}profile/login/`;
|
const url = `${API_PREFIX}profile/login/`;
|
||||||
return new Promise(
|
return new Promise(
|
||||||
@@ -101,15 +129,17 @@ const User = {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
fetchUserInfo() {
|
fetchUserInfo(force = false) {
|
||||||
/* returns null if user not logged in */
|
/* returns null if user not logged in */
|
||||||
const self = this;
|
const self = this;
|
||||||
|
if (!force) {
|
||||||
const userInfo = storage.get(self.storageKey);
|
const userInfo = storage.get(self.storageKey);
|
||||||
if (userInfo !== null) {
|
if (userInfo !== null) {
|
||||||
return new Promise(
|
return new Promise(
|
||||||
resolve => resolve(userInfo),
|
resolve => resolve(userInfo),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
const url = `${API_PREFIX}/profile/users/`;
|
const url = `${API_PREFIX}/profile/users/`;
|
||||||
return new Promise(
|
return new Promise(
|
||||||
(resolve) => {
|
(resolve) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user