WorkflowStatus.js 3.14 KB
Newer Older
timothe 2004's avatar
timothe 2004 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
import React from 'react';
import { getWorkflowStatusString } from '../utils/contract';

const WorkflowStatus = ({ status, isOwner, onAction, loading }) => {
  const workflowSteps = [
    { status: 0, label: "Enregistrement des électeurs" },
    { status: 1, label: "Enregistrement des propositions" },
    { status: 2, label: "Fin de l'enregistrement des propositions" },
    { status: 3, label: "Session de vote" },
    { status: 4, label: "Fin de la session de vote" },
    { status: 5, label: "Votes comptabilisés" }
  ];

  // Préparation des actions disponibles en fonction du statut actuel
  const getAvailableAction = () => {
    if (!isOwner) return null;

    switch (parseInt(status)) {
      case 0:
        return {
          label: "Démarrer l'enregistrement des propositions",
          action: "startProposalsRegistration",
          requireDuration: true
        };
      case 1:
        return {
          label: "Terminer l'enregistrement des propositions",
          action: "endProposalsRegistration"
        };
      case 2:
        return {
          label: "Démarrer la session de vote",
          action: "startVotingSession",
          requireDuration: true
        };
      case 3:
        return {
          label: "Terminer la session de vote",
          action: "endVotingSession"
        };
      case 4:
        return {
          label: "Comptabiliser les votes",
          action: "tallyVotes"
        };
      default:
        return null;
    }
  };

  const availableAction = getAvailableAction();
  const [duration, setDuration] = React.useState(60); // Durée par défaut: 60 minutes

  const handleActionClick = () => {
    if (availableAction.requireDuration) {
      onAction(availableAction.action, duration);
    } else {
      onAction(availableAction.action);
    }
  };

  return (
    <div className="card">
      <h2>Statut actuel: {getWorkflowStatusString(status)}</h2>
      
      <div className="workflow-status">
        {workflowSteps.map((step) => (
          <div 
            key={step.status} 
            className={`workflow-step ${parseInt(status) === step.status ? 'active' : ''} ${parseInt(status) > step.status ? 'completed' : ''}`}
          >
            <div className="step-number">{step.status + 1}</div>
            <div className="step-label">{step.label}</div>
          </div>
        ))}
      </div>
      
      {isOwner && availableAction && (
        <div className="admin-actions">
          {availableAction.requireDuration && (
            <div className="duration-input">
              <label htmlFor="duration">Durée (en minutes):</label>
              <input
                type="number"
                id="duration"
                className="input"
                value={duration}
                onChange={(e) => setDuration(e.target.value)}
                min="1"
              />
            </div>
          )}
          <button 
            className="button" 
            onClick={handleActionClick}
            disabled={loading}
          >
            {loading ? "Transaction en cours..." : availableAction.label}
          </button>
        </div>
      )}
    </div>
  );
};

export default WorkflowStatus;