Skip to content

Commit

Permalink
feat(auth): login integration
Browse files Browse the repository at this point in the history
closes #16
  • Loading branch information
Hagith committed Oct 24, 2020
1 parent 0e44774 commit db402fa
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@ import axios from 'axios';
export function authenticate(login: string, password: string): Promise<AuthTokenDto> {
return axios
.post<AuthTokenDto>('/auth', { login, password } as AuthRequestDto)
.then((res) => res.data);
.then((res) => res.data)
.catch((res) => {
throw res.response;
});
}
2 changes: 1 addition & 1 deletion apps/web/src/modules/auth/store/actions.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { RootState } from '~app/core/store';
import { createActionFactory } from '~app/shared/store';
import { authenticate } from '../domain/auth.service';
import { authenticate } from '../domain/auth.api';
import { loadStoredToken } from '../domain/token';
import { authGetters, authMutations } from './index';
import { AuthState } from './state';
Expand Down
96 changes: 60 additions & 36 deletions apps/web/src/modules/auth/views/login.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,54 +5,55 @@
<article class="card-body">
<h4 class="card-title text-center mb-4 mt-1">Sign in</h4>
<hr />
<!-- TODO
<p class="text-success text-center">Some message goes here</p>
-->
<form @submit.prevent="submit">
<div class="form-group">
<div class="input-group">

<p class="alert alert-danger text-center" v-if="error">{{ error }}</p>

<b-form novalidate @submit.prevent="submit">
<b-form-group invalid-feedback="Field required" :state="valid.login">
<b-input-group>
<!-- TODO
<div class="input-group-prepend">
<span class="input-group-text"> <i class="fa fa-user"></i> </span>
</div>
<template #prepend>
<b-input-group-text><i class="fa fa-user"></i></b-input-group-text>
</template>
-->
<input
name="login"
class="form-control"
type="text"
<b-form-input
autofocus
placeholder="Login"
v-model="form.login"
:state="valid.login"
/>
</div>
</div>
<div class="form-group">
<div class="input-group">
</b-input-group>
</b-form-group>

<b-form-group invalid-feedback="Field required" :state="valid.password">
<b-input-group>
<!-- TODO
<div class="input-group-prepend">
<span class="input-group-text"> <i class="fa fa-lock"></i> </span>
</div>
<template #prepend>
<b-input-group-text><i class="fa fa-lock"></i></b-input-group-text>
</template>
-->
<input
class="form-control"
name="password"
<b-form-input
type="password"
placeholder="Password"
v-model="form.password"
placeholder="Password"
:state="valid.password"
/>
</div>
</div>
<div class="form-group text-center">
</b-input-group>
</b-form-group>

<b-form-group class="text-center">
<!-- TODO demo mode -->
<small class="text-muted">
Use <strong>demo</strong> / <strong>demo</strong> to login
</small>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block">Login</button>
</div>
</b-form-group>
<b-form-group>
<b-button type="submit" variant="primary" block>Login</b-button>
</b-form-group>
<!-- TODO
<p class="text-center"><a href="#" class="btn">Forgot password?</a></p>
-->
</form>
</b-form>
</article>
</div>
</div>
Expand All @@ -72,17 +73,40 @@ export default Vue.extend({
login: '',
password: '',
},
valid: {
login: void 0,
password: void 0,
} as { login?: boolean; password?: boolean },
error: '',
};
},
methods: {
...mapActions({
login: authActions.login,
}),
submit() {
this.login(this.form).then(() => {
const back = this.$route.query.back as string;
this.$router.push(back || { name: 'home' });
});
this.valid = { login: void 0, password: void 0 };
const login = this.form.login.trim();
this.valid.login = !login ? false : void 0;
const password = this.form.password.trim();
this.valid.password = !password ? false : void 0;
if (!login || !password) {
return;
}
this.error = false;
return this.login({ login, password })
.then(() => {
const back = this.$route.query.back as string;
this.$router.push(back || { name: 'home' });
})
.catch((e) => {
this.error = e.status === 401 ? 'Wrong login and/or password' : 'Unexpected server error';
});
},
},
});
Expand Down
14 changes: 13 additions & 1 deletion apps/web/src/shared/bootstrap-vue.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
import { NavbarPlugin } from 'bootstrap-vue';
import {
ButtonPlugin,
FormGroupPlugin,
FormInputPlugin,
FormPlugin,
InputGroupPlugin,
NavbarPlugin,
} from 'bootstrap-vue';
import Vue from 'vue';

Vue.use(ButtonPlugin);
Vue.use(FormGroupPlugin);
Vue.use(FormInputPlugin);
Vue.use(FormPlugin);
Vue.use(InputGroupPlugin);
Vue.use(NavbarPlugin);
4 changes: 2 additions & 2 deletions apps/web/src/styles/vendors/_bootstrap.scss
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
@import '~bootstrap/scss/dropdown';
//@import '~bootstrap/scss/button-group';
@import '~bootstrap/scss/input-group';
//@import '~bootstrap/scss/custom-forms';
@import '~bootstrap/scss/custom-forms';
@import '~bootstrap/scss/nav';
@import '~bootstrap/scss/navbar';
//@import '~bootstrap/scss/card';
//@import '~bootstrap/scss/breadcrumb';
//@import '~bootstrap/scss/pagination';
//@import '~bootstrap/scss/badge';
//@import '~bootstrap/scss/jumbotron';
//@import '~bootstrap/scss/alert';
@import '~bootstrap/scss/alert';
//@import '~bootstrap/scss/progress';
//@import '~bootstrap/scss/media';
//@import '~bootstrap/scss/list-group';
Expand Down

0 comments on commit db402fa

Please sign in to comment.