add like/dislike system
Build / Build-image (push) Successful in 1m16s

This commit is contained in:
2026-08-18 14:01:38 +02:00
parent dde6beeba8
commit 1f8f3a663e
6 changed files with 133 additions and 14 deletions
+42 -13
View File
@@ -31,12 +31,13 @@ class TlaController extends Controller
public function session_flush(Request $request, string $language) public function session_flush(Request $request, string $language)
{ {
$session = $request->session(); $session = $request->session();
if ($session->get('date', NULL) != date('Y-m-d')) if ($session->get('date'.$language, NULL) != date('Y-m-d'))
{ {
$session->forget('guesses-'.$language); $session->forget('guesses-'.$language);
$session->forget('tla'); $session->forget('tla'.$language);
$session->forget('correct'); $session->forget('correct'.$language);
$session->put('date', date('Y-m-d')); $session->forget('review'.$language);
$session->put('date'.$language, date('Y-m-d'));
} }
} }
@@ -53,10 +54,10 @@ class TlaController extends Controller
return response()->json([ return response()->json([
'hint' => $tla->hint, 'hint' => $tla->hint,
'guesses' => $session->get('guesses-'.$language, []), 'guesses' => $session->get('guesses-'.$language, []),
'date' => $session->get('date'), 'date' => $session->get('date'.$language),
'tla' => $session->get('tla') == $tla->acronym ? $tla->acronym : NULL, 'tla' => $session->get('tla'.$language) == $tla->acronym ? $tla->acronym : NULL,
'context' => $session->get('tla') == $tla->acronym ? $tla->context : NULL, 'context' => $session->get('tla'.$language) == $tla->acronym ? $tla->context : NULL,
'correct' => $session->get('correct'), 'correct' => $session->get('correct'.$language),
]); ]);
} }
@@ -110,17 +111,17 @@ class TlaController extends Controller
$guesses = $session->get('guesses-'.$language, NULL); $guesses = $session->get('guesses-'.$language, NULL);
if ($score == 12 || count($guesses) == env('MAX_GUESSES', 10)) { if ($score == 12 || count($guesses) == env('MAX_GUESSES', 10)) {
$session->put('tla', $tla_object->acronym); $session->put('tla'.$language, $tla_object->acronym);
if ($score == 12) $session->put('correct', true); if ($score == 12) $session->put('correct'.$language, true);
} }
return response()->json([ return response()->json([
'guesses' => $guesses, 'guesses' => $guesses,
'date' => $session->get('date'), 'date' => $session->get('date'),
'tla' => $session->get('tla') == $tla_object->acronym ? $tla_object->acronym : NULL, 'tla' => $session->get('tla'.$language) == $tla_object->acronym ? $tla_object->acronym : NULL,
'context' => $session->get('tla') == $tla_object->acronym ? $tla_object->context : NULL, 'context' => $session->get('tla'.$language) == $tla_object->acronym ? $tla_object->context : NULL,
'score' => $score, 'score' => $score,
'correct' => $session->get('correct'), 'correct' => $session->get('correct'.$language),
]); ]);
} }
@@ -128,6 +129,34 @@ class TlaController extends Controller
} }
public function review(Request $request, String $language, int $type) {
$session = $request->session();
$current = $session->get('review'.$language);
$tla = Tla::GetCurrentTla($language);
if ($type != 2) {
if ($current == $type) {
if ($current == 1) $tla->likes--;
else if ($current == -1) $tla->dislikes--;
$type = 2;
} else {
if ($current == 1) $tla->likes--;
else if ($current == -1) $tla->dislikes--;
if ($type == 1) $tla->likes++;
else if ($type == -1) $tla->dislikes++;
}
$tla->save();
$session->put('review'.$language, $type);
}
return response()->json([
'likes' => $tla->likes,
'dislikes' => $tla->dislikes,
'current' => $type,
]);
}
public function update(Request $request, Tla $tla): RedirectResponse public function update(Request $request, Tla $tla): RedirectResponse
{ {
$request->validate([ $request->validate([
+1 -1
View File
@@ -11,7 +11,7 @@ class Tla extends Model
use HasFactory; use HasFactory;
protected $fillable = ['acronym', 'hint', 'language', 'used', 'context']; protected $fillable = ['acronym', 'hint', 'language', 'used', 'context', 'likes', 'dislikes'];
public static function GetCurrentTla( string $language ) : Tla { public static function GetCurrentTla( string $language ) : Tla {
$tla = Tla::where('used', date("Y-m-d")) $tla = Tla::where('used', date("Y-m-d"))
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('tla', function (Blueprint $table) {
$table->integer('likes')->default(0)->after('context');
$table->integer('dislikes')->default(0)->after('likes');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
//
}
};
+59
View File
@@ -0,0 +1,59 @@
<template>
<h3>How did you like todays TLA?</h3>
<div>
<UButton @click="makeRequest(1)" class="rounded-l-full" :icon="current == 1 ? 'mdi:thumbs-up' : 'mdi:thumbs-up-outline'" size="md" color="neutral" variant="outline">{{ likes }}</UButton>
<UButton @click="makeRequest(-1)" class="rounded-r-full" :icon="current == -1 ? 'mdi:thumbs-down' : 'mdi:thumbs-down-outline'" size="md" color="neutral" variant="outline">{{ dislikes }}</UButton>
</div>
</template>
<style lang="css" scoped>
</style>
<script lang="ts">
import axios from 'axios';
export default {
data() {
return {
likes: 0,
dislikes: 0,
current: 0,
}
},
mounted() {
this.makeRequest(2)
},
methods: {
makeRequest(type: number) {
if (this.current == type){
this.current = 0;
if (type == 1) this.likes--;
else if (type == -1) this.dislikes--;
}
else
{
if (type == 1) {
this.likes++;
if (this.current != 0) this.dislikes--;
}
else if (type == -1) {
this.dislikes++;
if (this.current != 0) this.likes--;
}
this.current = type;
}
axios
.get("/api/review/en/"+type)
.then(response => {
this.likes = response.data.likes;
this.dislikes = response.data.dislikes;
this.current = response.data.current;
});
}
}
}
</script>
+3
View File
@@ -2,6 +2,7 @@
import axios from 'axios'; import axios from 'axios';
import GuessWord from '../components/GuessWord.vue'; import GuessWord from '../components/GuessWord.vue';
import Modal from '../components/Modal.vue'; import Modal from '../components/Modal.vue';
import Review from '../components/Review.vue';
</script> </script>
<script lang="ts"> <script lang="ts">
@@ -115,9 +116,11 @@
</template> </template>
<template v-if="!correct && guesses.length >= maxGuesses"> <template v-if="!correct && guesses.length >= maxGuesses">
You ran out of guesses. Todays TLA was <b>{{ tla }}</b> You ran out of guesses. Todays TLA was <b>{{ tla }}</b>
<Review/>
</template> </template>
<template v-if="correct"> <template v-if="correct">
You completed todays TLAdle! Todays TLA was <b>{{ tla }}</b> You completed todays TLAdle! Todays TLA was <b>{{ tla }}</b>
<Review/>
</template> </template>
<h3>Guesses left: {{ maxGuesses - guesses.length }}</h3> <h3>Guesses left: {{ maxGuesses - guesses.length }}</h3>
+1
View File
@@ -11,4 +11,5 @@ Route::middleware('web')->group(function () {
Route::get('fetch_dev', function() { Route::get('fetch_dev', function() {
return response()->json(['dev' => env('DEV_MESSAGE', false)]); return response()->json(['dev' => env('DEV_MESSAGE', false)]);
}); });
Route::get('review/{language}/{type}', [\App\Http\Controllers\TlaController::class, 'review']);
}); });