vkashti / app / admin / events / EventsList.tsx
EventsList.tsx
Raw
'use client';
import { useEvents } from './EventsProvider';
import { useState } from 'react';
import { Event } from '@/types/event';
import {
  FaCalendarAlt,
  FaInfoCircle,
  FaMoneyBill,
  FaTrash,
  FaHeading,
} from 'react-icons/fa';

export default function EventsList() {
  const { events, updateEvent, deleteEvent } = useEvents();
  const [editingField, setEditingField] = useState<{
    id: string;
    field: keyof Event;
  } | null>(null);
  const [fieldValue, setFieldValue] = useState<string | number | null>(null);

  const handleFieldClick = (
    id: string,
    field: keyof Event,
    value: string | number | null
  ) => {
    if (field === 'from_date' || field === 'to_date') {
      value = value
        ? new Date(new Date(value).getTime() + 2 * 60 * 60 * 1000).toISOString().slice(0, 16)
        : null;
    }
    setEditingField({ id, field });
    setFieldValue(value);
  };

  const handleFieldChange = (
    e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
  ) => {
    setFieldValue(e.target.value);
  };

  const handleFieldBlur = () => {
    if (editingField && fieldValue !== null) {
      let valueToSave = fieldValue;
      if (editingField.field === 'from_date' || editingField.field === 'to_date') {
        valueToSave = new Date(new Date(fieldValue).getTime() - 0 * 60 * 60 * 1000).toISOString();
      }
      updateEvent(editingField.id, { [editingField.field]: valueToSave });
    }
    setEditingField(null);
    setFieldValue(null);
  };

  const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    handleFieldBlur();
  };

  const handleDeleteClick = (id: string) => {
    if (confirm('Сигурни ли сте, че искате да изтриете този евент?')) {
      deleteEvent(id);
    }
  };

  const renderField = (
    event: Event,
    field: keyof Event,
    type: string = 'text'
  ) => {
    if (editingField?.id === event.id && editingField.field === field) {
      return (
        <form onSubmit={handleFormSubmit}>
          <input
            type={type}
            value={fieldValue !== null ? fieldValue : event[field]}
            onChange={handleFieldChange}
            onBlur={handleFieldBlur}
            autoFocus
            className="border input input-sm p-2 w-full rounded bg-white"
          />
        </form>
      );
    }

    let displayValue = event[field];
    if (type === 'datetime-local' && typeof displayValue === 'string') {
      const date = new Date(displayValue);
      displayValue = date.toLocaleTimeString([], {
        hour: '2-digit',
        minute: '2-digit'
      });
    }

    return (
      <span
        onClick={() =>
          handleFieldClick(event.id, field, event[field])
        }
        className="hover:bg-orange-200 rounded-sm rounded cursor-pointer inline-block p-1"
      >
        {displayValue}
      </span>
    );
  };

  if (events.length === 0) {
    return <p>Няма евенти за избраната дата.</p>;
  }

  return (
    <div>
      {events.map((event, index) => (
        <div key={event.id}>
          <div
            id={event.id}
            className="relative p-2 shadow rounded mb-2 bg-orange-100 group"
          >
            <button
              onClick={() => handleDeleteClick(event.id)}
              className="absolute top-2 right-2 text-gray-600 hover:text-gray-800 lg:hidden group-hover:block"
            >
              <FaTrash />
            </button>
            <table className="w-full table-fixed lg:table-auto">
              <tbody>
                <tr className="flex flex-wrap lg:flex-nowrap">
                  <td className="w-full lg:w-1/2">
                    <div className="flex">
                      <div className="font-bold w-1/6 lg:w-1/12 flex justify-center items-center">
                        <FaHeading />
                      </div>
                      <div className="w-5/6 lg:w-11/12">
                        {renderField(event, 'title')}
                      </div>
                    </div>
                  </td>
                  <td className="w-full lg:w-1/2">
                    <div className="flex">
                      <div className="font-bold w-1/6 lg:w-1/12 flex justify-center items-center">
                        <FaCalendarAlt />
                      </div>
                      <div className="w-5/6 lg:w-11/12">
                        {renderField(
                          event,
                          'from_date',
                          'datetime-local'
                        )}{' '}
                        -{' '}
                        {renderField(event, 'to_date', 'datetime-local')}
                      </div>
                    </div>
                  </td>
                </tr>
                <tr className="flex flex-wrap lg:flex-nowrap">
                  <td className="w-full lg:w-1/2">
                    <div className="flex">
                      <div className="font-bold w-1/6 lg:w-1/12 flex justify-center items-center">
                        <FaMoneyBill />
                      </div>
                      <div className="w-5/6 lg:w-11/12 flex items-center">
                        {renderField(event, 'price', 'number')} лв
                      </div>
                    </div>
                  </td>
                  <td className="w-full lg:w-1/2">
                    <div className="flex">
                      <div className="font-bold w-1/6 lg:w-1/12 flex justify-center items-center">
                        <FaInfoCircle />
                      </div>
                      <div className="w-5/6 lg:w-11/12">
                        {renderField(event, 'description')}
                      </div>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
          {index < events.length - 1 && <hr className="my-4" />}{' '}
          {/* Add a divider between each event */}
        </div>
      ))}
    </div>
  );
}