Skip to content

Commit 825626b

Browse files
Start implementing settings in SPA prototype
1 parent a04d106 commit 825626b

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api;
4+
5+
use App\Http\Controllers\Controller;
6+
use Illuminate\Http\JsonResponse;
7+
use Illuminate\Http\Request;
8+
9+
class SettingsController extends Controller
10+
{
11+
public function index(Request $request): JsonResponse
12+
{
13+
/** @var ApiKey $apiKey */
14+
$apiKey = $request->get('apiKey');
15+
16+
return response()
17+
->json([
18+
'language' => $apiKey->user->language,
19+
'theme' => $apiKey->user->theme,
20+
]);
21+
}
22+
23+
public function store(Request $request): JsonResponse
24+
{
25+
$request->validate([
26+
'language' => 'nullable|string|in:en,nl,dk,de,fr,pt,ru',
27+
'theme' => 'nullable|string|in:light,dark',
28+
]);
29+
30+
/** @var ApiKey $apiKey */
31+
$apiKey = $request->get('apiKey');
32+
33+
if ($request->has('language')) {
34+
$apiKey->user()->update(['language' => $request->get('language')]);
35+
}
36+
37+
if ($request->has('theme')) {
38+
$apiKey->user()->update(['theme' => $request->get('theme')]);
39+
}
40+
41+
return response()->json([]);
42+
}
43+
}

resources/assets/js/prototype/app.js

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Login from './screens/Login.vue';
77
import Dashboard from './screens/Dashboard.vue';
88
import TransactionsIndex from './screens/Transactions/Index.vue';
99
import TransactionsCreate from './screens/Transactions/Create.vue';
10+
import SettingsPreferences from './screens/Settings/Preferences.vue';
1011

1112
Vue.use(VueRouter);
1213

@@ -27,6 +28,10 @@ const routes = [
2728
path: '/prototype/transactions/create',
2829
name: 'transactions.create',
2930
component: TransactionsCreate,
31+
}, {
32+
path: '/prototype/settings/preferences',
33+
name: 'settings.preferences',
34+
component: SettingsPreferences,
3035
},
3136
];
3237

resources/assets/js/prototype/components/Navigation.vue

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import { ArrowRightLeft, Home, LogOut, PlusCircle } from 'lucide-vue';
2+
import { ArrowRightLeft, Home, LogOut, PlusCircle, Settings2 } from 'lucide-vue';
33
import { getCurrentInstance } from 'vue';
44
55
const router = getCurrentInstance().proxy.$router;
@@ -28,6 +28,9 @@ const logOut = () => {
2828
<router-link class="flex py-1 px-3 text-gray-500 hover:text-black" :to="{ name: 'transactions.create' }">
2929
<PlusCircle :size="20" :strokeWidth="1.6" />
3030
</router-link>
31+
<router-link class="flex py-1 px-3 text-gray-500 hover:text-black" :to="{ name: 'settings.preferences' }">
32+
<Settings2 :size="16" />
33+
</router-link>
3134
<button class="flex py-1 px-3 text-gray-500 hover:text-black" @click="logOut()">
3235
<LogOut :size="16" />
3336
</button>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<script setup>
2+
import axios from 'axios';
3+
import { onMounted, ref } from 'vue';
4+
5+
import Navigation from '../../components/Navigation.vue';
6+
7+
const language = ref('en');
8+
const theme = ref('light');
9+
10+
const retrieve = () => {
11+
axios
12+
.get('/api/settings', { headers: { 'api-key': localStorage.getItem('api_key') } })
13+
.then(response => {
14+
language.value = response.data.language;
15+
theme.value = response.data.theme;
16+
});
17+
};
18+
19+
const update = () => {
20+
axios
21+
.post('/api/settings', { language: language.value, theme: theme.value }, { headers: { 'api-key': localStorage.getItem('api_key') } })
22+
.then(() => {
23+
// Done
24+
})
25+
.catch(() => {
26+
alert('Unable to save');
27+
});
28+
};
29+
30+
onMounted(() => retrieve());
31+
</script>
32+
33+
<template>
34+
<div>
35+
<Navigation />
36+
<div class="my-10 mx-auto max-w-3xl">
37+
<div class="p-5 bg-white border border-gray-200 rounded-lg">
38+
<div class="space-y-5 max-w-xs">
39+
<div>
40+
<div class="mb-2 text-sm">Language</div>
41+
<select class="px-3.5 py-2.5 w-full text-sm border border-gray-200 rounded-lg appearance-none" v-model="language" @change="update">
42+
<option value="en">English</option>
43+
<option value="nl">Dutch</option>
44+
<option value="dk">Danish</option>
45+
<option value="de">German</option>
46+
<option value="fr">French</option>
47+
<option value="pt">Portuguese</option>
48+
<option value="ru">Russian</option>
49+
</select>
50+
</div>
51+
<div>
52+
<div class="mb-2 text-sm">Theme</div>
53+
<select class="px-3.5 py-2.5 w-full text-sm border border-gray-200 rounded-lg appearance-none" v-model="theme" @change="update">
54+
<option value="light">Light</option>
55+
<option value="dark">Dark</option>
56+
</select>
57+
</div>
58+
</div>
59+
</div>
60+
</div>
61+
</div>
62+
</template>

routes/api.php

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22

33
use App\Http\Controllers\Api\LogInController;
4+
use App\Http\Controllers\Api\SettingsController;
45
use App\Http\Controllers\Api\TransactionController;
56
use Illuminate\Support\Facades\Route;
67

@@ -10,4 +11,7 @@
1011
->group(function () {
1112
Route::resource('transactions', TransactionController::class)
1213
->only(['index', 'store']);
14+
15+
Route::resource('settings', SettingsController::class)
16+
->only(['index', 'store']);
1317
});

0 commit comments

Comments
 (0)