Files
classroomio/src/routes/courses.svelte
T

215 lines
5.6 KiB
Svelte
Raw Normal View History

2021-08-18 19:47:02 +03:00
<script context="module">
2021-08-24 10:45:43 +03:00
import { profile } from '../utils/store/user';
2021-08-21 13:26:43 +03:00
import { fetchCourses } from '../components/Courses/api';
2021-08-18 19:47:02 +03:00
export async function preload(page, params) {
2021-08-21 10:28:57 +03:00
const parsedUser = JSON.parse(params.user);
2021-08-21 13:26:43 +03:00
2021-08-24 18:20:07 +03:00
// if (parsedUser && parsedUser.id) {
// return fetchCourses(parsedUser.id);
// }
2021-08-18 19:47:02 +03:00
2021-08-21 10:37:33 +03:00
return {
allCourses: [],
organizationId: null,
2021-08-24 18:20:07 +03:00
cantFetch: true,
2021-08-21 10:37:33 +03:00
};
2021-08-18 19:47:02 +03:00
}
</script>
2021-05-06 08:22:25 +03:00
<script>
2021-08-18 19:47:02 +03:00
import { onMount } from 'svelte';
// import { stores } from '@sapper/app';
2021-07-27 22:59:41 +03:00
import PageNav from '../components/PageNav/index.svelte';
import Courses from '../components/Courses/index.svelte';
2021-08-18 19:47:02 +03:00
import PrimaryButton from '../components/PrimaryButton/index.svelte';
import Modal from '../components/Modal/index.svelte';
import TextField from '../components/Form/TextField.svelte';
import TextArea from '../components/Form/TextArea.svelte';
import { courses, createCourseModal } from '../components/Courses/store';
import { validateForm } from '../components/Courses/functions';
import { ROLE } from '../utils/constants/roles';
2021-08-24 10:45:43 +03:00
import { addGroupMember } from '../utils/services/courses';
2021-08-24 20:26:16 +03:00
import { supabase } from '../utils/functions/supabase';
2021-08-28 22:44:06 +03:00
import { setProfileIdOfGroupMember } from '../utils/services/courses';
2021-05-06 08:22:25 +03:00
2021-08-18 19:47:02 +03:00
// const { page } = stores();
2021-05-06 08:22:25 +03:00
2021-08-24 20:26:16 +03:00
export let allCourses = [];
2021-08-21 13:26:43 +03:00
export let cantFetch;
2021-08-18 19:47:02 +03:00
let errors = {
emails: '',
};
// let tab = '';
async function createCourse(e) {
const { hasError, fieldErrors, students, tutors } =
validateForm($createCourseModal);
errors = fieldErrors;
if (hasError) return;
const { title, description } = $createCourseModal;
// Create group from course_id
const { data: newGroup } = await supabase
.from('group')
.insert({ name: title, description });
console.log(`newGroup`, newGroup);
const { id: group_id } = newGroup[0];
// Create course with group_id
const { data: newCourse } = await supabase.from('course').insert({
title,
description,
group_id,
});
2021-08-24 20:26:16 +03:00
console.log(`newCourse`, newCourse);
courses.update((_courses) => [..._courses, newCourse[0]]);
2021-08-18 19:47:02 +03:00
// Get profile of author and add as member
2021-08-24 20:26:16 +03:00
await addGroupMember({
2021-08-18 19:47:02 +03:00
profile_id: $profile.id,
2021-08-24 20:26:16 +03:00
email: $profile.email,
2021-08-18 19:47:02 +03:00
group_id,
2021-08-24 10:45:43 +03:00
role_id: ROLE.TUTOR,
2021-08-18 19:47:02 +03:00
});
let membersStack = [];
// Create groupmemebers from group_id and add teachers and students
for (const student of students) {
membersStack.push({
email: student,
group_id,
role_id: ROLE.STUDENT,
});
}
for (const tutor of tutors) {
membersStack.push({
email: tutor,
group_id,
role_id: ROLE.TUTOR,
});
}
addGroupMember(membersStack).then((membersAdded) => {
console.log(`membersAdded`, membersAdded);
2021-08-24 20:26:16 +03:00
$createCourseModal.open = false;
2021-08-18 19:47:02 +03:00
});
}
2021-08-21 13:26:43 +03:00
async function getCourses(userId) {
if (process.browser) {
2021-08-21 13:32:28 +03:00
if (cantFetch && typeof cantFetch === 'boolean' && !allCourses.length) {
2021-08-28 22:44:06 +03:00
const updatedProfile = await setProfileIdOfGroupMember(
$profile.email,
userId
);
console.log(`updatedProfile`, updatedProfile);
2021-08-21 13:26:43 +03:00
const coursesResult = await fetchCourses(userId);
console.log(`coursesResult`, coursesResult);
2021-08-24 20:26:16 +03:00
if (!coursesResult) return;
// organizationId = coursesResult.organizationId;
2021-08-21 13:26:43 +03:00
courses.set(coursesResult.allCourses);
}
}
}
onMount(async () => {
2021-08-18 19:47:02 +03:00
courses.set(allCourses);
});
2021-08-21 13:26:43 +03:00
$: getCourses($profile.id);
2021-05-06 08:22:25 +03:00
</script>
<svelte:head>
2021-05-07 03:43:37 +03:00
<title>Courses</title>
2021-05-06 08:22:25 +03:00
</svelte:head>
2021-08-29 20:35:58 +03:00
<section class="root">
2021-09-02 14:11:41 +03:00
<PageNav title="All courses">
2021-08-18 19:47:02 +03:00
<div slot="widget">
2021-09-02 14:11:41 +03:00
{#if $profile.can_add_course}
<PrimaryButton
label="New"
onClick={() => ($createCourseModal.open = true)}
/>
{/if}
2021-08-18 19:47:02 +03:00
</div>
2021-09-02 14:11:41 +03:00
</PageNav>
2021-08-18 19:47:02 +03:00
<Modal
onClose={() => ($createCourseModal.open = false)}
bind:open={$createCourseModal.open}
width="w-2/5"
modalHeading="Create a Course"
>
<form on:submit|preventDefault={createCourse}>
<TextField
label="Course name"
bind:value={$createCourseModal.title}
autofocus={true}
placeholder="Your course name"
className="mb-4"
isRequired={true}
errorMessage={errors.title}
autoComplete={false}
/>
<TextArea
label="Invite Tutors"
bind:value={$createCourseModal.tutors}
rows="2"
maxRows="3"
placeholder="tutor@company.com, john@gmail.com"
helperMessage="To invite people, add their emails separated by a comma"
errorMessage={errors.tutors}
className="mb-4"
/>
<TextArea
label="Invite Students"
bind:value={$createCourseModal.students}
rows="2"
maxRows="3"
placeholder="student@gmail.com, john@gmail.com"
helperMessage="To invite people, add their emails separated by a comma"
errorMessage={errors.students}
className="mb-4"
/>
<TextArea
label="Short description"
bind:value={$createCourseModal.description}
rows="4"
maxRows="4"
placeholder="A little description about this course"
className="mb-4"
isRequired={true}
/>
<div class="mt-5 flex items-center">
<PrimaryButton className="px-6 py-2" label="Finish" type="submit" />
</div>
</form>
</Modal>
2021-05-07 03:43:37 +03:00
<Courses />
2021-08-29 07:23:19 +03:00
</section>
2021-05-06 08:22:25 +03:00
<style>
2021-08-29 20:35:58 +03:00
.root {
width: 100%;
padding: 0 10px;
min-height: 90vh;
/* min-width: 600px;
2021-05-06 08:22:25 +03:00
margin: 0 auto;
border-left: 1px solid var(--border-color);
2021-08-29 20:35:58 +03:00
border-right: 1px solid var(--border-color); */
}
2021-05-06 08:22:25 +03:00
</style>