Files
enlight-lms/frontend/src/pages/Home/Home.vue
2026-02-23 14:54:54 +05:30

161 lines
4.1 KiB
Vue

<template>
<div class="w-full px-5 pt-5 pb-10">
<div class="space-y-2">
<div class="flex items-center justify-between">
<div class="text-xl font-bold text-ink-gray-9">
{{ __('Hey') }}, {{ user.data?.full_name }} 👋
</div>
<div>
<div
v-if="!isAdmin"
@click="showStreakModal = true"
class="bg-surface-amber-2 px-2 py-1 rounded-md cursor-pointer"
>
<span> 🔥 </span>
<span class="text-ink-gray-9">
{{ streakInfo.data?.current_streak }}
</span>
</div>
</div>
</div>
<div class="text-lg text-ink-gray-6 leading-6">
{{ subtitle }}
</div>
</div>
<AdminHome
v-if="isAdmin && currentTab === 'instructor'"
:liveClasses="adminLiveClasses"
:evals="adminEvals"
/>
<StudentHome
v-else-if="currentTab === 'student'"
:myLiveClasses="myLiveClasses"
/>
</div>
<Streak v-model="showStreakModal" :streakInfo="streakInfo" />
</template>
<script setup lang="ts">
import { computed, inject, onMounted, ref } from 'vue'
import { call, createResource, usePageMeta } from 'frappe-ui'
import { sessionStore } from '@/stores/session'
import StudentHome from '@/pages/Home/StudentHome.vue'
import AdminHome from '@/pages/Home/AdminHome.vue'
import Streak from '@/pages/Home/Streak.vue'
const user = inject<any>('$user')
const { brand } = sessionStore()
const evalCount = ref(0)
const currentTab = ref<'student' | 'instructor'>('student')
const showStreakModal = ref(false)
const fetchEvalCount = () => {
call('frappe.client.get_count', {
doctype: 'LMS Certificate Request',
filters: {
member: user?.data?.name,
status: 'Upcoming',
date: ['>=', inject<any>('$dayjs')().format('YYYY-MM-DD')],
},
}).then((data: any) => {
evalCount.value = data
})
}
const isAdmin = computed(() => {
return (
user.data?.is_moderator ||
user.data?.is_instructor ||
user.data?.is_evaluator
)
})
onMounted(() => {
if (isAdmin.value) {
currentTab.value = 'instructor'
} else {
currentTab.value = 'student'
fetchEvalCount()
}
})
const myLiveClasses = createResource({
url: 'lms.lms.api.get_my_live_classes',
auto: !isAdmin.value ? true : false,
})
const adminLiveClasses = createResource({
url: 'lms.lms.api.get_admin_live_classes',
auto: isAdmin.value ? true : false,
})
const adminEvals = createResource({
url: 'lms.lms.api.get_admin_evals',
auto: isAdmin.value ? true : false,
})
const streakInfo = createResource({
url: 'lms.lms.api.get_streak_info',
auto: true,
})
const subtitle = computed(() => {
if (isAdmin.value) {
let liveClassSuffix =
adminLiveClasses.data?.length > 1 ? __('live classes') : __('live class')
let evalSuffix =
adminEvals.data?.length > 1 ? __('evaluations') : __('evaluation')
if (adminLiveClasses.data?.length > 0 && adminEvals.data?.length > 0) {
return __('You have {0} upcoming {1} and {2} {3} scheduled.').format(
adminLiveClasses.data.length,
liveClassSuffix,
adminEvals.data.length,
evalSuffix
)
} else if (adminLiveClasses.data?.length > 0) {
return __('You have {0} upcoming {1}.').format(
adminLiveClasses.data.length,
liveClassSuffix
)
} else if (adminEvals.data?.length > 0) {
return __('You have {0} {1} scheduled.').format(
adminEvals.data.length,
evalSuffix
)
}
return __('Manage your courses and batches at a glance')
} else {
let liveClassSuffix =
myLiveClasses.data?.length > 1 ? __('live classes') : __('live class')
let evalSuffix = evalCount.value > 1 ? __('evaluations') : __('evaluation')
if (myLiveClasses.data?.length > 0 && evalCount.value > 0) {
return __('You have {0} upcoming {1} and {2} {3} scheduled.').format(
myLiveClasses.data.length,
liveClassSuffix,
evalCount.value,
evalSuffix
)
} else if (myLiveClasses.data?.length > 0) {
return __('You have {0} upcoming {1}.').format(
myLiveClasses.data.length,
liveClassSuffix
)
} else if (evalCount.value > 0) {
return __('You have {0} {1} scheduled.').format(
evalCount.value,
evalSuffix
)
}
return __('Resume where you left off')
}
})
usePageMeta(() => {
return {
title: __('Home'),
icon: brand.favicon,
}
})
</script>