created Timetable state logic

This commit is contained in:
TUTOR03 2020-12-13 19:14:28 +05:00
parent d008eedce0
commit adaf786ddd
4 changed files with 65 additions and 18 deletions

View File

@ -3,11 +3,9 @@
{
"events": [
{
"time": 0,
"lessons": [0, 1, 2, 3, 4, 5]
},
{
"time": 1,
"lessons": [0, 1, 2, 3, 4, 5]
}
],

View File

@ -4,22 +4,62 @@ import {
UseTimetableHookFT,
CreateCardFT,
CreateSubjectFT,
CreateDayFT,
AddEventFT,
AddLessonFT,
DayT,
CardT,
SubjectT,
} from "./types/timetable";
import { initialEventLessonsGenrator } from './utils/timetable'
export const useTimetable: UseTimetableHookFT = () => {
const [state, setState] = useState<TimetableT>({
cards: [],
days: [],
subjects: [],
});
const [cardState, setCardState] = useState<CardT[]>([])
const [dayState, setDayState] = useState<DayT[]>([])
const [subjectState, setSubjectState] = useState<SubjectT[]>([])
// const [startDateState, setStartDateState] = useState<number>(0)
const createSubject: CreateSubjectFT = () => {
console.log();
const createSubject: CreateSubjectFT = (title, teachers) => {
setSubjectState((prev) => ([...prev, { title, teachers }]))
};
const createCard: CreateCardFT = () => {
console.log();
const createCard: CreateCardFT = (subject, teacher, room) => {
setCardState((prev) => ([...prev, { subject, teacher, room }]))
};
return { state, createCard, createSubject };
const createDay: CreateDayFT = (date) => {
setDayState((prev) => [...prev, { date, events: [] }])
}
const addEvent: AddEventFT = (dayId) => {
setDayState((days) => days.map((day, i) => (i == dayId) ? { ...day, events: [...day.events, { lessons: initialEventLessonsGenrator() }] } : day))
}
const addLesson: AddLessonFT = (dayId, eventId, groupId, isPair, lessonId, lessonNumber) => {
setDayState((days) => days.map(
(day, dayIndex) => (
(dayIndex == dayId) ? {
...day,
events: day.events.map(
(event, eventIndex) => (
(eventIndex == eventId) ? {
lessons: event.lessons.map(
(lesson, lessonIndex) => (
(lessonIndex == groupId) ? (
(isPair) ? [lessonId, lessonId] : lesson.map((lessonElement, lessonElementIndex) => (
(lessonElementIndex == lessonNumber) ? lessonId : lessonElement
))
) : lesson
)
)
} : event
)
)
} : day
)
))
}
return { state: { cards: cardState, subjects: subjectState, days: dayState }, createCard, createSubject, createDay, addLesson };
};

View File

@ -4,22 +4,22 @@ export type TimetableT = {
subjects: SubjectT[];
};
type DayT = {
export type DayT = {
events: EventT[];
date: number; // epoch time
};
type EventT = {
lessons: number[]; // IDs
lessons: number[][]; // IDs
};
type CardT = {
export type CardT = {
subject: number; // ID
room: number; // Number
teacher: number; // ID in subject
};
type SubjectT = {
export type SubjectT = {
title: string;
teachers: string[]; // teachers allowed for this subject
};
@ -27,13 +27,20 @@ type SubjectT = {
export type CreateSubjectFT = (title: string, teachers: string[]) => void;
export type CreateCardFT = (
subjectID: number,
teacherID: number,
subject: number,
teacher: number,
room: number
) => void;
export type CreateDayFT = (date: number) => void;
export type AddEventFT = (dayId: number) => void;
export type AddLessonFT = (dayId: number, eventId: number, groupId:number, isPair: boolean, lessonId: number, lessonNumber?: number) => void;
export type UseTimetableHookFT = () => {
createSubject: CreateSubjectFT;
createCard: CreateCardFT;
createDay: CreateCardFT;
state: TimetableT;
};

2
src/utils/timetable.ts Normal file
View File

@ -0,0 +1,2 @@
export const initialEventLessonsGenrator = () =>
Array(6).map<number[]>(() => [0, 0])