Advertisement
vasil_k_k

React multi-channel-notification

Sep 5th, 2024 (edited)
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { useState } from 'react';
  2.  
  3.  
  4. const NotificationDatePicker = () => {
  5.  
  6.   const [selectedDays, setSelectedDays] = useState({
  7.     phoneFromDay: undefined,
  8.     phoneToDay: undefined,
  9.     emailFromDay: undefined,
  10.     emailToDay: undefined,
  11.     appFromDay: undefined,
  12.     appToDay: undefined,
  13.   });
  14.  
  15.  
  16.   const getAllSelectedDays = () => {
  17.     return Object.values(selectedDays).filter(day => day !== undefined);
  18.   };
  19.  
  20.  
  21.   const getValidOptions = (type) => {
  22.     const allSelectedDays = getAllSelectedDays();
  23.     const { emailFromDay, emailToDay, phoneFromDay, phoneToDay } = selectedDays;
  24.  
  25.     switch (type) {
  26.       case 'emailFrom':
  27.         return [2, 3, 4, 5, 6, 7]
  28.           .filter(day => !allSelectedDays.includes(day))
  29.           .filter(day => phoneFromDay ? day < phoneFromDay : true)
  30.           .filter(day => emailToDay ? emailToDay - day >= 2 : true);
  31.  
  32.       case 'emailTo':
  33.         return [4, 5, 6, 7]
  34.           .filter(day => !allSelectedDays.includes(day))
  35.           .filter(day => phoneToDay ? day < phoneToDay : true)
  36.           .filter(day => emailFromDay ? day - emailFromDay >= 2 : true);
  37.  
  38.       case 'phoneFrom':
  39.         return [3, 4, 5, 6, 7]
  40.           .filter(day => !allSelectedDays.includes(day))
  41.           .filter(day => emailFromDay ? day > emailFromDay : true)
  42.           .filter(day => phoneToDay ? phoneToDay - day >= 2 : true);
  43.  
  44.       case 'phoneTo':
  45.         return [5, 6, 7]
  46.           .filter(day => !allSelectedDays.includes(day))
  47.           .filter(day => emailToDay ? day > emailToDay : true)
  48.           .filter(day => phoneFromDay ? day - phoneFromDay >= 2 : true);
  49.  
  50.       default:
  51.         return [2, 3, 4, 5, 6, 7]
  52.     }
  53.   };
  54.  
  55.  
  56.   const handleDayChange = (e) => {
  57.     const { id, value } = e.target;
  58.     setSelectedDays(prevState => ({
  59.       ...prevState,
  60.       [id]: Number(value),
  61.     }));
  62.   };
  63.  
  64.  
  65.   const renderOptions = (type) =>
  66.     getValidOptions(type).map((day) => (
  67.       <option key={type} value={day}>
  68.         Ден {day}
  69.       </option>
  70.     ));
  71.  
  72.  
  73.   return (
  74.     <div>
  75.       <h2>Телефонно обаждане</h2>
  76.       <span>
  77.         <label htmlFor="phoneFromDay">Ден:</label>
  78.         <select id="phoneFromDay" value={selectedDays.phoneFromDay} onChange={handleDayChange}>
  79.           <option value={selectedDays.phoneFromDay}>Избери</option>
  80.           {renderOptions('phoneFrom')}
  81.         </select>
  82.         <input value={selectedDays.phoneFromDay}/>
  83.       </span>
  84.       <span>
  85.         <label htmlFor="phoneToDay">Ден:</label>
  86.         <select id="phoneToDay" value={selectedDays.phoneToDay} onChange={handleDayChange}>
  87.           <option value="">Избери</option>
  88.           {renderOptions('phoneTo')}
  89.         </select>
  90.         <input value={selectedDays.phoneToDay}/>
  91.       </span>
  92.  
  93.       <h2>Известие по имейл</h2>
  94.       <span>
  95.         <label htmlFor="emailFromDay">Ден:</label>
  96.         <select id="emailFromDay" value={selectedDays.emailFromDay} onChange={handleDayChange}>
  97.           <option value="">Избери</option>
  98.           {renderOptions('emailFrom')}
  99.         </select>
  100.         <input value={selectedDays.emailFromDay}/>
  101.       </span>
  102.  
  103.       <span>
  104.         <label htmlFor="emailToDay">Ден:</label>
  105.         <select id="emailToDay" value={selectedDays.emailToDay} onChange={handleDayChange}>
  106.           <option value="">Избери</option>
  107.           {renderOptions('emailTo')}
  108.         </select>
  109.         <input value={selectedDays.emailToDay}/>
  110.       </span>
  111.  
  112.       <h2>Известие в приложението на телефона</h2>
  113.       <span>
  114.         <label htmlFor="appFromDay">Ден:</label>
  115.         <select id="appFromDay" value={selectedDays.appFromDay} onChange={handleDayChange}>
  116.           <option value="">Избери</option>
  117.           {renderOptions('appFrom')}
  118.         </select>
  119.         <input value={selectedDays.appFromDay}/>
  120.       </span>
  121.  
  122.       <span>
  123.         <label htmlFor="appToDay">Ден:</label>
  124.         <select id="appToDay" value={selectedDays.appToDay} onChange={handleDayChange}>
  125.           <option value="">Избери</option>
  126.           {renderOptions('appTwo')}
  127.         </select>
  128.         <input value={selectedDays.appToDay}/>
  129.       </span>
  130.     </div>
  131.   );
  132. };
  133.  
  134. export default NotificationDatePicker;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement