Skip to content

Commit 4d42f50

Browse files
authored
Add Notice component (#13)
* Add Notice component * Add Notice component to Guest layout * Use helper functions instead of importing facades where applicable * Fix PSR-12 issue
1 parent ec3a32b commit 4d42f50

File tree

12 files changed

+173
-56
lines changed

12 files changed

+173
-56
lines changed

app/Http/Controllers/AccountController.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44

55
use App\Http\Requests\Account\AccountUpdate;
66
use App\Http\Resources\UserResource;
7-
use Illuminate\Support\Facades\Auth;
8-
use Inertia\Inertia;
7+
use Illuminate\Http\Request;
98

109
class AccountController extends Controller
1110
{
12-
public function edit()
11+
public function edit(Request $request)
1312
{
14-
$user = UserResource::make(Auth::user());
13+
$user = UserResource::make($request->user());
1514

16-
return Inertia::render('Account/Edit', [
15+
return \inertia()->render('Account/Edit', [
1716
'first_name' => $user->first_name,
1817
'last_name' => $user->last_name,
1918
'email' => $user->email,
@@ -27,7 +26,7 @@ public function update(AccountUpdate $request)
2726
$user->update($request->only('first_name', 'last_name', 'email'));
2827
$user->updatePassword($request->validated('password'));
2928

30-
return redirect()->route('account.edit')->with('notice', [
29+
return redirect()->back()->with('notice', [
3130
'type' => 'success',
3231
'message' => 'Your account has been updated.',
3332
]);

app/Http/Controllers/HomeController.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
namespace App\Http\Controllers;
44

5-
use Inertia\Inertia;
6-
75
class HomeController extends Controller
86
{
97
public function index()
108
{
11-
return Inertia::render('Index');
9+
return \inertia()->render('Index');
1210
}
1311
}

app/Http/Controllers/LoginController.php

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,15 @@
44

55
use App\Http\Requests\Login\LoginStore;
66
use Illuminate\Http\Request;
7-
use Illuminate\Support\Facades\App;
8-
use Illuminate\Support\Facades\Auth;
9-
use Illuminate\Support\Facades\Redirect;
107
use Illuminate\Validation\ValidationException;
11-
use Inertia\Inertia;
128

139
class LoginController extends Controller
1410
{
1511
public function show(Request $request)
1612
{
17-
$isProd = App::environment('production');
13+
$isProd = \app()->environment('production');
1814

19-
return Inertia::render('Login/Show', [
15+
return \inertia()->render('Login/Show', [
2016
'email' => !$isProd ? \env('SEED_ADMIN_EMAIL') : '',
2117
'password' => !$isProd ? '12345' : '',
2218
'remember' => !$isProd ? true : false,
@@ -26,33 +22,29 @@ public function show(Request $request)
2622

2723
public function store(LoginStore $request)
2824
{
29-
$attempt = Auth::attempt([
30-
'email' => $request->validated('email'),
31-
'password' => $request->validated('password'),
32-
], $request->validated('remember'));
33-
34-
if (!$attempt) {
35-
throw ValidationException::withMessages([
36-
'email' => ['The provided credentials are incorrect.'],
37-
]);
38-
}
25+
\throw_if(
26+
!\auth()->attempt($request->only('email', 'password'), $request->validated('remember')),
27+
ValidationException::withMessages([
28+
'email' => ['Your account is not active.'],
29+
])
30+
);
3931

4032
$request->session()->regenerate();
4133

4234
if ($request->validated('redirect')) {
43-
return Redirect::to($request->validated('redirect'));
35+
return \redirect()->to($request->validated('redirect'));
4436
}
4537

46-
return Redirect::route('home');
38+
return \redirect()->route('home');
4739
}
4840

4941
public function destroy(Request $request)
5042
{
51-
Auth::logout();
43+
\auth()->logout();
5244

5345
$request->session()->invalidate();
5446
$request->session()->regenerateToken();
5547

56-
return Redirect::route('login');
48+
return \redirect()->route('login');
5749
}
5850
}

app/Http/Controllers/RegisterController.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,14 @@
55
use App\Http\Controllers\Controller;
66
use App\Http\Requests\Register\RegisterStore;
77
use App\Models\User;
8-
use Illuminate\Support\Facades\App;
9-
use Illuminate\Support\Facades\Auth;
10-
use Illuminate\Support\Facades\Redirect;
11-
use Inertia\Inertia;
128

139
class RegisterController extends Controller
1410
{
1511
public function show()
1612
{
17-
$isProd = App::environment('production');
13+
$isProd = \app()->environment('production');
1814

19-
return Inertia::render('Register/Show', [
15+
return \inertia()->render('Register/Show', [
2016
'first_name' => !$isProd ? 'Jim' : '',
2117
'last_name' => !$isProd ? 'Gordon' : '',
2218
'email' => !$isProd ? 'test@test.com' : '',
@@ -31,8 +27,8 @@ public function store(RegisterStore $request)
3127
$user->password = $request->validated('password');
3228
$user->save();
3329

34-
Auth::loginUsingId($user->id);
30+
\auth()->loginUsingId($user->id);
3531

36-
return Redirect::route('home');
32+
return \redirect()->route('home');
3733
}
3834
}

app/Http/Requests/Account/AccountUpdate.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33
namespace App\Http\Requests\Account;
44

55
use Illuminate\Foundation\Http\FormRequest;
6-
use Illuminate\Support\Facades\Auth;
76
use Illuminate\Validation\Rules\Password;
87

98
class AccountUpdate extends FormRequest
109
{
1110
public function rules()
1211
{
1312
return [
14-
'first_name' => ['required', 'string', 'max:255'],
15-
'last_name' => ['required', 'string', 'max:255'],
16-
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . Auth::id()],
13+
'first_name' => ['required', 'sometimes', 'string', 'max:255'],
14+
'last_name' => ['required', 'sometimes', 'string', 'max:255'],
15+
'email' => [
16+
'required',
17+
'sometimes',
18+
'string',
19+
'email',
20+
'max:255',
21+
'unique:users,email,' . \auth()->id(),
22+
],
1723
'password' => [
1824
'nullable',
1925
Password::min(6)

app/Models/Organisation.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ class Organisation extends Model
1010
use HasFactory;
1111

1212
protected $fillable = [
13-
'name',
1413
'user_id',
14+
'name',
1515
];
1616

1717
public function user()
1818
{
19-
return $this->belongsTo(User::class)->withDefault();
19+
return $this->belongsTo(User::class);
2020
}
2121

2222
public function users()

app/Models/User.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ class User extends Authenticatable
2020
use HasRoles;
2121

2222
protected $fillable = [
23+
'current_organisation_id',
2324
'first_name',
2425
'last_name',
2526
'email',
26-
'current_organisation_id',
2727
];
2828

2929
protected $hidden = [

resources/js/Components/Notice.vue

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<template>
2+
<div class="notice" :class="cssClass" v-if="active && type && message">
3+
<p class="notice__description" v-text="message"></p>
4+
</div>
5+
</template>
6+
7+
<script>
8+
import { router } from "@inertiajs/vue3";
9+
10+
export default {
11+
data() {
12+
return {
13+
active: false,
14+
type: "",
15+
message: "",
16+
cssClass: "",
17+
};
18+
},
19+
20+
watch: {
21+
"$page.props.notice": {
22+
handler() {
23+
this.setNotice(router.page.props.notice, "success");
24+
},
25+
},
26+
"$page.props.errors": {
27+
handler() {
28+
let errors = router.page.props.errors;
29+
30+
let firstError = errors[Object.keys(errors)[0]];
31+
32+
if (
33+
!firstError ||
34+
(Object.keys(errors).length === 0 &&
35+
errors.constructor === Object)
36+
) {
37+
return;
38+
}
39+
40+
this.type = "error";
41+
this.message = firstError;
42+
43+
this.setActive();
44+
45+
this.setClasses();
46+
},
47+
},
48+
},
49+
50+
methods: {
51+
setNotice(notice, type) {
52+
if (type && notice.message != "") {
53+
this.type = type;
54+
this.message = notice.message;
55+
56+
this.setActive();
57+
}
58+
59+
this.setClasses();
60+
},
61+
62+
setActive() {
63+
this.active = true;
64+
65+
setTimeout(() => {
66+
this.active = false;
67+
}, 3000);
68+
},
69+
70+
setClasses() {
71+
if (this.type == "error") {
72+
this.cssClass = "notice--error";
73+
} else if (this.type == "success") {
74+
this.cssClass = "notice--success";
75+
}
76+
},
77+
},
78+
};
79+
</script>
80+
81+
<style lang="scss">
82+
.notice {
83+
max-width: 400px;
84+
padding: 20px;
85+
margin-bottom: 30px;
86+
position: fixed;
87+
right: 20px;
88+
bottom: 20px;
89+
z-index: 950;
90+
// Type
91+
background-color: #f8f9fa;
92+
color: #212529;
93+
94+
&--error {
95+
background-color: #f8d7da;
96+
// Type
97+
color: #721c24;
98+
}
99+
100+
&--success {
101+
background-color: #d4edda;
102+
// Type
103+
color: #155724;
104+
}
105+
}
106+
</style>

resources/js/Layouts/App.vue

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,37 @@
44
</Head>
55

66
<div class="app-page">
7+
<Notice />
8+
79
<div class="app-page__inner">
810
<Link :href="route('home')">Home</Link>
911
<br />
1012
<Link :href="route('account.edit')">Account</Link>
1113
<br />
12-
<Link :href="route('logout')" method="post" as="button"
13-
>Logout</Link
14-
>
15-
14+
<Link :href="route('logout')" method="post" as="button">
15+
Logout
16+
</Link>
1617
<slot />
1718
</div>
1819
</div>
1920
</template>
2021

2122
<script>
23+
import Notice from "@js/Components/Notice.vue";
24+
2225
export default {
2326
name: "App Layout",
2427
28+
components: {
29+
Notice,
30+
},
31+
2532
data() {
2633
return {};
2734
},
2835
};
2936
</script>
3037

31-
3238
<style lang="scss">
3339
body {
3440
background-color: #eee;

resources/js/Layouts/Guest.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,24 @@
44
</Head>
55

66
<div class="guest-page">
7+
<Notice />
8+
79
<div class="guest-page__inner">
810
<slot />
911
</div>
1012
</div>
1113
</template>
1214

1315
<script>
16+
import Notice from "@js/Components/Notice.vue";
17+
1418
export default {
1519
name: "Guest Layout",
1620
21+
components: {
22+
Notice,
23+
},
24+
1725
data() {
1826
return {};
1927
},

0 commit comments

Comments
 (0)