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": [ "events": [
{ {
"time": 0,
"lessons": [0, 1, 2, 3, 4, 5] "lessons": [0, 1, 2, 3, 4, 5]
}, },
{ {
"time": 1,
"lessons": [0, 1, 2, 3, 4, 5] "lessons": [0, 1, 2, 3, 4, 5]
} }
], ],

View File

@ -4,22 +4,62 @@ import {
UseTimetableHookFT, UseTimetableHookFT,
CreateCardFT, CreateCardFT,
CreateSubjectFT, CreateSubjectFT,
CreateDayFT,
AddEventFT,
AddLessonFT,
DayT,
CardT,
SubjectT,
} from "./types/timetable"; } from "./types/timetable";
import { initialEventLessonsGenrator } from './utils/timetable'
export const useTimetable: UseTimetableHookFT = () => { export const useTimetable: UseTimetableHookFT = () => {
const [state, setState] = useState<TimetableT>({ const [cardState, setCardState] = useState<CardT[]>([])
cards: [], const [dayState, setDayState] = useState<DayT[]>([])
days: [], const [subjectState, setSubjectState] = useState<SubjectT[]>([])
subjects: [], // const [startDateState, setStartDateState] = useState<number>(0)
});
const createSubject: CreateSubjectFT = () => { const createSubject: CreateSubjectFT = (title, teachers) => {
console.log(); setSubjectState((prev) => ([...prev, { title, teachers }]))
}; };
const createCard: CreateCardFT = () => { const createCard: CreateCardFT = (subject, teacher, room) => {
console.log(); 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[]; subjects: SubjectT[];
}; };
type DayT = { export type DayT = {
events: EventT[]; events: EventT[];
date: number; // epoch time date: number; // epoch time
}; };
type EventT = { type EventT = {
lessons: number[]; // IDs lessons: number[][]; // IDs
}; };
type CardT = { export type CardT = {
subject: number; // ID subject: number; // ID
room: number; // Number room: number; // Number
teacher: number; // ID in subject teacher: number; // ID in subject
}; };
type SubjectT = { export type SubjectT = {
title: string; title: string;
teachers: string[]; // teachers allowed for this subject teachers: string[]; // teachers allowed for this subject
}; };
@ -27,13 +27,20 @@ type SubjectT = {
export type CreateSubjectFT = (title: string, teachers: string[]) => void; export type CreateSubjectFT = (title: string, teachers: string[]) => void;
export type CreateCardFT = ( export type CreateCardFT = (
subjectID: number, subject: number,
teacherID: number, teacher: number,
room: number room: number
) => void; ) => 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 = () => { export type UseTimetableHookFT = () => {
createSubject: CreateSubjectFT; createSubject: CreateSubjectFT;
createCard: CreateCardFT; createCard: CreateCardFT;
createDay: CreateCardFT;
state: TimetableT; state: TimetableT;
}; };

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

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