feat: implement Phase 7 (Course Player v2, Furigana, XP System, Integrated Vocab)

This commit is contained in:
2026-01-23 18:15:51 +07:00
parent 82fe5f8a79
commit 7aa4eb89df
8 changed files with 386 additions and 73 deletions

View File

@@ -41,6 +41,12 @@ class LessonForm
->default(0),
Textarea::make('metadata')
->columnSpanFull(),
Select::make('vocabularies')
->relationship('vocabularies', 'word')
->multiple()
->searchable()
->preload()
->label('Focus Vocabularies'),
]);
}
}

View File

@@ -37,10 +37,10 @@ class CoursePlayerController extends Controller
// Get all lessons for navigation and progress check
$allLessons = $course->modules->flatMap->lessons;
// Find current lesson
// Find current lesson with vocabularies
$currentLesson = $lessonSlug
? Lesson::where('slug', $lessonSlug)->firstOrFail()
: $allLessons->first();
? Lesson::where('slug', $lessonSlug)->with('vocabularies')->firstOrFail()
: $allLessons->first()->load('vocabularies');
// Get user progress for this course
$completedLessonsIds = UserProgress::where('user_id', $user->id)
@@ -77,6 +77,7 @@ class CoursePlayerController extends Controller
'content' => $currentLesson->content,
'video_url' => $currentLesson->video_url,
'content_pdf' => $currentLesson->content_pdf,
'vocabularies' => $currentLesson->vocabularies,
],
'progress' => [
'completed_count' => count($completedLessonsIds),
@@ -93,13 +94,19 @@ class CoursePlayerController extends Controller
{
$user = $request->user();
$alreadyCompleted = UserProgress::where('user_id', $user->id)
->where('lesson_id', $lesson->id)
->exists();
UserProgress::updateOrCreate(
['user_id' => $user->id, 'lesson_id' => $lesson->id],
['completed_at' => now()]
);
// Optional: Add XP points logic here later
if (!$alreadyCompleted) {
$user->increment('xp_points', 50);
}
return back()->with('success', 'Materi selesai!');
return back()->with('success', 'Materi selesai! +50 XP');
}
}

View File

@@ -23,4 +23,9 @@ class Lesson extends Model
{
return $this->belongsTo(Module::class);
}
public function vocabularies()
{
return $this->belongsToMany(Vocabulary::class, 'lesson_vocabulary');
}
}

View File

@@ -24,4 +24,14 @@ class Vocabulary extends Model
{
return $this->hasMany(SrsReview::class);
}
public function level()
{
return $this->belongsTo(Level::class);
}
public function lessons()
{
return $this->belongsToMany(Lesson::class, 'lesson_vocabulary');
}
}