Back

Créer un planificateur d'événements personnalisé avec React-Calendar

Créer un planificateur d'événements personnalisé avec React-Calendar

Pourquoi 63% des développeurs abandonnent-ils les interfaces utilisateur de calendrier personnalisées en raison de problèmes d’accessibilité et de gestion d’état ? Ce guide montre comment construire un planificateur d’événements prêt pour la production en utilisant react-calendar - sans reconstruire la logique de date à partir de zéro. Vous apprendrez à implémenter des événements glisser-déposer, la détection de conflits et la gestion des fuseaux horaires en moins de 300 lignes de code.

Points clés

  • Créez des événements interactifs avec le glisser-déposer en utilisant react-beautiful-dnd
  • Implémentez la détection des conflits de temps avec date-fns
  • Personnalisez le style de react-calendar pour prendre en charge le mode sombre
  • Gérez efficacement les fuseaux horaires avec la conversion de date UTC

Configurer le calendrier de base

Tout d’abord, installez les dépendances principales :

npm install react-calendar @hello-pangea/dnd date-fns

Créez un composant de calendrier contrôlé :

import Calendar from 'react-calendar';
import 'react-calendar/dist/Calendar.css';

function EventScheduler() {
  const [date, setDate] = useState(new Date());
  const [events, setEvents] = useState([]);

  return (
    <div className=""scheduler-container"">
      <Calendar 
        onChange={setDate}
        value={date}
        minDetail=""month""
        maxDetail=""month""
      />
      {/* La liste des événements ira ici */}
    </div>
  );
}

Ajouter la gestion des événements

Implémentez la fonctionnalité de glisser-déposer avec @hello-pangea/dnd (la version maintenue de react-beautiful-dnd) :

import { DragDropContext, Droppable, Draggable } from '@hello-pangea/dnd';

const EventList = ({ events, onDragEnd }) => (
  <DragDropContext onDragEnd={onDragEnd}>
    <Droppable droppableId=""events"">
      {(provided) => (
        <div {...provided.droppableProps} ref={provided.innerRef}>
          {events.map((event, index) => (
            <Draggable key={event.id} draggableId={event.id} index={index}>
              {(provided) => (
                <div
                  ref={provided.innerRef}
                  {...provided.draggableProps}
                  {...provided.dragHandleProps}
                  className=""event-item""
                >
                  {event.title}
                </div>
              )}
            </Draggable>
          ))}
          {provided.placeholder}
        </div>
      )}
    </Droppable>
  </DragDropContext>
);

Gérer les conflits de temps

Utilisez date-fns pour détecter les événements qui se chevauchent :

import { isWithinInterval, parseISO } from 'date-fns';

const hasConflict = (newEvent, existingEvents) => {
  return existingEvents.some(event => 
    isWithinInterval(parseISO(newEvent.start), {
      start: parseISO(event.start),
      end: parseISO(event.end)
    }) || 
    isWithinInterval(parseISO(newEvent.end), {
      start: parseISO(event.start),
      end: parseISO(event.end)
    })
  );
};

Conclusion

En combinant la gestion robuste des dates de react-calendar avec les bibliothèques modernes de glisser-déposer, vous pouvez créer des interfaces de planification complexes 3 fois plus rapidement qu’en partant de zéro. La clé est d’exploiter les bibliothèques existantes pour les fonctionnalités de base tout en concentrant les efforts de personnalisation sur vos exigences uniques en matière d’expérience utilisateur.

FAQ

react-calendar fournit une navigation complète par mois/année prête à l'emploi avec un solide support d'accessibilité, réduisant ainsi le temps de développement.

Stockez toutes les dates en UTC et convertissez-les en heure locale à l'aide de `toLocaleString()` lors du rendu.

Oui - remplacez les classes CSS par défaut ou utilisez styled-components pour thématiser le calendrier.

Les fonctionnalités côté client comme le glisser-déposer nécessitent des directives 'use client' dans les applications Next.js.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers