"use client"; import type { Dispatch, FormEvent, MutableRefObject, SetStateAction } from "react"; import EntryDetailsModal from "@/features/entries/components/entry-details-modal"; import EntriesFilterModal, { type EntriesFilters } from "@/features/entries/components/entries-filter-modal"; import NewEntryModal from "@/features/entries/components/new-entry-modal"; import NewScheduleModal from "@/features/entries/components/new-schedule-modal"; import ScheduleDetailsModal from "@/features/entries/components/schedule-details-modal"; import type { DeleteTarget, EntryDetailsFormState, EntryFormState, ScheduleDetailsFormState, ScheduleFormState } from "@/features/entries/components/entries-panel.types"; import ConfirmSlideModal from "@/shared/components/modals/confirm-slide-modal"; type EntriesPanelModalsProps = { activeGroupId: number | null; entriesError: string; schedulesError: string; tagSuggestions: string[]; canManageTags: boolean; emptyTagActionLabel: string; handleEmptyTagAction: () => void; filterOpen: boolean; setFilterOpen: Dispatch>; filters: EntriesFilters; setFilters: Dispatch>; activeFilterCount: number; clearFilters: () => void; onFilterAddTag: (tag: string) => void; onFilterToggleTag: (tag: string) => void; newEntryOpen: boolean; setNewEntryOpen: Dispatch>; entryForm: EntryFormState; setEntryForm: Dispatch>; submitNewEntry: (event: FormEvent) => Promise; amountInputRef: MutableRefObject; tagsInputRef: MutableRefObject; newScheduleOpen: boolean; setNewScheduleOpen: Dispatch>; scheduleForm: ScheduleFormState; setScheduleForm: Dispatch>; submitNewSchedule: (event: FormEvent) => Promise; entryDetailsOpen: boolean; setEntryDetailsOpen: Dispatch>; entryDetailsForm: EntryDetailsFormState; setEntryDetailsForm: Dispatch>; entryDetailsOriginal: EntryDetailsFormState | null; hasEntryChanges: () => boolean; submitEntryUpdate: (event: FormEvent) => Promise; entryRemovedTags: string[]; setEntryRemovedTags: Dispatch>; prevEntry: () => void; nextEntry: () => void; selectedEntryIndex: number | null; filteredEntriesCount: number; scheduleDetailsOpen: boolean; setScheduleDetailsOpen: Dispatch>; scheduleDetailsForm: ScheduleDetailsFormState; setScheduleDetailsForm: Dispatch>; scheduleDetailsOriginal: ScheduleDetailsFormState | null; hasScheduleChanges: () => boolean; submitScheduleUpdate: (event: FormEvent) => Promise; scheduleRemovedTags: string[]; setScheduleRemovedTags: Dispatch>; confirmDeleteOpen: boolean; setConfirmDeleteOpen: Dispatch>; deleteTarget: DeleteTarget; setDeleteTarget: Dispatch>; confirmDelete: () => Promise; }; export default function EntriesPanelModals(props: EntriesPanelModalsProps) { return ( <> props.setNewEntryOpen(false)} onSubmit={props.submitNewEntry} onChange={next => props.setEntryForm(prev => ({ ...prev, ...next }))} tagSuggestions={props.tagSuggestions} emptyTagActionLabel={props.emptyTagActionLabel} emptyTagActionDisabled={!props.canManageTags} onEmptyTagAction={props.handleEmptyTagAction} amountInputRef={props.amountInputRef} tagsInputRef={props.tagsInputRef} /> props.setNewScheduleOpen(false)} onSubmit={props.submitNewSchedule} onChange={next => props.setScheduleForm(prev => ({ ...prev, ...next }))} tagSuggestions={props.tagSuggestions} emptyTagActionLabel={props.emptyTagActionLabel} emptyTagActionDisabled={!props.canManageTags} onEmptyTagAction={props.handleEmptyTagAction} /> props.setEntryDetailsOpen(false)} onSubmit={props.submitEntryUpdate} onRequestDelete={() => { props.setDeleteTarget("ENTRY"); props.setConfirmDeleteOpen(true); }} onRevert={() => { if (!props.entryDetailsOriginal) return; props.setEntryDetailsForm(props.entryDetailsOriginal); props.setEntryRemovedTags([]); }} onChange={next => props.setEntryDetailsForm(prev => ({ ...prev, ...next }))} onAddTag={tag => { props.setEntryDetailsForm(prev => ({ ...prev, tags: prev.tags.includes(tag) ? prev.tags : [...prev.tags, tag] })); props.setEntryRemovedTags(prev => prev.filter(item => item !== tag)); }} onToggleTag={tag => props.setEntryRemovedTags(prev => (prev.includes(tag) ? prev.filter(item => item !== tag) : [...prev, tag]))} removedTags={props.entryRemovedTags} tagSuggestions={props.tagSuggestions} emptyTagActionLabel={props.emptyTagActionLabel} emptyTagActionDisabled={!props.canManageTags} onEmptyTagAction={props.handleEmptyTagAction} onPrev={props.prevEntry} onNext={props.nextEntry} loopHintPrev={props.selectedEntryIndex === 0 && props.filteredEntriesCount > 1 ? "Loop" : ""} loopHintNext={props.selectedEntryIndex === props.filteredEntriesCount - 1 && props.filteredEntriesCount > 1 ? "Loop" : ""} canNavigate={props.filteredEntriesCount > 1} /> props.setScheduleDetailsOpen(false)} onSubmit={props.submitScheduleUpdate} onRequestDelete={() => { props.setDeleteTarget("SCHEDULE"); props.setConfirmDeleteOpen(true); }} onRevert={() => { if (!props.scheduleDetailsOriginal) return; props.setScheduleDetailsForm(props.scheduleDetailsOriginal); props.setScheduleRemovedTags([]); }} onChange={next => props.setScheduleDetailsForm(prev => ({ ...prev, ...next }))} onAddTag={tag => { props.setScheduleDetailsForm(prev => ({ ...prev, tags: prev.tags.includes(tag) ? prev.tags : [...prev.tags, tag] })); props.setScheduleRemovedTags(prev => prev.filter(item => item !== tag)); }} onToggleTag={tag => props.setScheduleRemovedTags(prev => (prev.includes(tag) ? prev.filter(item => item !== tag) : [...prev, tag]))} removedTags={props.scheduleRemovedTags} tagSuggestions={props.tagSuggestions} emptyTagActionLabel={props.emptyTagActionLabel} emptyTagActionDisabled={!props.canManageTags} onEmptyTagAction={props.handleEmptyTagAction} /> props.setFilterOpen(false)} /> props.setConfirmDeleteOpen(false)} onConfirm={() => { props.setConfirmDeleteOpen(false); props.confirmDelete(); }} /> ); }