diff --git a/dataExample.json b/dataExample.json index e8db07f..2f7a0fc 100644 --- a/dataExample.json +++ b/dataExample.json @@ -3,11 +3,9 @@ { "events": [ { - "time": 0, "lessons": [0, 1, 2, 3, 4, 5] }, { - "time": 1, "lessons": [0, 1, 2, 3, 4, 5] } ], diff --git a/src/hooks.ts b/src/hooks.ts index 9815d76..71e2a36 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -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({ - cards: [], - days: [], - subjects: [], - }); + const [cardState, setCardState] = useState([]) + const [dayState, setDayState] = useState([]) + const [subjectState, setSubjectState] = useState([]) + // const [startDateState, setStartDateState] = useState(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 }; }; diff --git a/src/types/timetable.ts b/src/types/timetable.ts index eefbbf9..2b8d64d 100644 --- a/src/types/timetable.ts +++ b/src/types/timetable.ts @@ -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; }; diff --git a/src/utils/timetable.ts b/src/utils/timetable.ts new file mode 100644 index 0000000..97126ee --- /dev/null +++ b/src/utils/timetable.ts @@ -0,0 +1,2 @@ +export const initialEventLessonsGenrator = () => + Array(6).map(() => [0, 0]) \ No newline at end of file