Advertisement
oscarviedma

Funcionalidad JavaScript Taxi Admin - OV

Dec 23rd, 2024
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 7.34 KB | None | 0 0
  1. function taxista_dashboard_shortcode() {
  2.     ob_start();
  3.     ?>
  4.     <script>
  5.       const urlParams = new URLSearchParams(window.location.search);
  6.       const taxistaId = urlParams.get('id');
  7.       let taxistaData = null;
  8.  
  9.       function showMessage(containerId, message, type) {
  10.           const messageDiv = document.getElementById(containerId);
  11.           messageDiv.textContent = message;
  12.           messageDiv.className = `message ${type}`;
  13.           messageDiv.style.display = 'block';
  14.           setTimeout(() => messageDiv.style.display = 'none', 3000);
  15.       }
  16.  
  17.       async function verifyPin() {
  18.           const pin = document.getElementById('pinInput').value;
  19.          
  20.           try {
  21.               const response = await fetch('<?php echo admin_url('admin-ajax.php'); ?>?action=verify_taxista_pin', {
  22.                   method: 'POST',
  23.                   headers: {
  24.                       'Content-Type': 'application/json',
  25.                   },
  26.                   body: JSON.stringify({
  27.                       taxistaId: taxistaId,
  28.                       pin: pin
  29.                   })
  30.               });
  31.              
  32.               const result = await response.json();
  33.              
  34.               if (result.success) {
  35.                   document.getElementById('authScreen').style.display = 'none';
  36.                   document.getElementById('mainScreen').style.display = 'block';
  37.                   loadTaxistaInfo(result.data);
  38.               } else {
  39.                   showMessage('authMessage', result.data || 'PIN incorrecto', 'error');
  40.               }
  41.           } catch (error) {
  42.               showMessage('authMessage', 'Error al verificar PIN', 'error');
  43.           }
  44.       }
  45.  
  46.       function loadTaxistaInfo(data) {
  47.           taxistaData = data;
  48.          
  49.           document.getElementById('taxistaName').textContent = data.fields.Nombre;
  50.           document.getElementById('taxistaUnit').textContent = `Unidad: ${data.fields.Unidad}`;
  51.  
  52.           if (data.fields.Foto && data.fields.Foto.length > 0) {
  53.              document.getElementById('taxistaPhoto').src = data.fields.Foto[0].url;
  54.           }
  55.  
  56.           updateStatusDisplay(data.fields.Estado);
  57.       }
  58.  
  59.       async function updateStatus(newStatus) {
  60.           try {
  61.               const response = await fetch('<?php echo admin_url('admin-ajax.php'); ?>?action=update_taxista_status', {
  62.                   method: 'POST',
  63.                   headers: {
  64.                       'Content-Type': 'application/json',
  65.                   },
  66.                   body: JSON.stringify({
  67.                       taxistaId: taxistaId,
  68.                       newStatus: newStatus,
  69.                       pin: document.getElementById('pinInput').value // Enviamos el PIN para reverificar
  70.                   })
  71.               });
  72.  
  73.               const result = await response.json();
  74.              
  75.               if (result.success) {
  76.                   updateStatusDisplay(newStatus);
  77.                   showMessage('statusMessage', 'Estado actualizado correctamente', 'success');
  78.               } else {
  79.                   showMessage('statusMessage', result.data || 'Error al actualizar el estado', 'error');
  80.               }
  81.           } catch (error) {
  82.               showMessage('statusMessage', 'Error al actualizar el estado', 'error');
  83.           }
  84.       }
  85.  
  86.       function updateStatusDisplay(status) {
  87.           const statusDiv = document.getElementById('currentStatus');
  88.           statusDiv.className = `current-status status-${status}`;
  89.           statusDiv.innerHTML = `
  90.               <i class="fas fa-${status === 'ocupado' ? 'times-circle' : 'check-circle'}"></i>
  91.               Estado actual: ${status === 'ocupado' ? 'Ocupado' : 'Disponible'}
  92.           `;
  93.       }
  94.  
  95.       document.getElementById('loginButton').addEventListener('click', verifyPin);
  96.       document.getElementById('pinInput').addEventListener('keypress', function(e) {
  97.           if (e.key === 'Enter') verifyPin();
  98.       });
  99.  
  100.       if (!taxistaId) {
  101.           showMessage('authMessage', 'Error: No se especificó un taxista', 'error');
  102.       }
  103.     </script>
  104.     <?php
  105.    return ob_get_clean();
  106. }
  107. add_shortcode('taxista_dashboard', 'taxista_dashboard_shortcode');
  108.  
  109. // Nuevos endpoints seguros
  110. function verify_taxista_pin() {
  111.    try {
  112.        $data = json_decode(file_get_contents('php://input'), true);
  113.        
  114.        if (!isset($data['taxistaId']) || !isset($data['pin'])) {
  115.            wp_send_json_error('Datos incompletos');
  116.        }
  117.  
  118.        $config = get_airtable_config();
  119.        
  120.        // Verificar taxista y PIN
  121.        $response = wp_remote_get("https://api.airtable.com/v0/{$config['baseId']}/{$config['tableId']}/{$data['taxistaId']}", array(
  122.            'headers' => array(
  123.                 'Authorization' => "Bearer {$config['apiKey']}"
  124.             )
  125.         ));
  126.  
  127.         if (is_wp_error($response)) {
  128.             throw new Exception($response->get_error_message());
  129.         }
  130.  
  131.         $taxista = json_decode(wp_remote_retrieve_body($response), true);
  132.  
  133.         if (!isset($taxista['fields']['PIN']) || $taxista['fields']['PIN'] !== $data['pin']) {
  134.             wp_send_json_error('PIN incorrecto');
  135.         }
  136.  
  137.         wp_send_json_success($taxista);
  138.  
  139.     } catch (Exception $e) {
  140.         wp_send_json_error($e->getMessage());
  141.     }
  142. }
  143. add_action('wp_ajax_verify_taxista_pin', 'verify_taxista_pin');
  144. add_action('wp_ajax_nopriv_verify_taxista_pin', 'verify_taxista_pin');
  145.  
  146. function update_taxista_status() {
  147.     try {
  148.         $data = json_decode(file_get_contents('php://input'), true);
  149.        
  150.         if (!isset($data['taxistaId']) || !isset($data['newStatus']) || !isset($data['pin'])) {
  151.             wp_send_json_error('Datos incompletos');
  152.         }
  153.  
  154.         $config = get_airtable_config();
  155.  
  156.         // Primero verificamos el PIN nuevamente por seguridad
  157.         $verify_response = wp_remote_get("https://api.airtable.com/v0/{$config['baseId']}/{$config['tableId']}/{$data['taxistaId']}", array(
  158.             'headers' => array(
  159.                 'Authorization' => "Bearer {$config['apiKey']}"
  160.             )
  161.         ));
  162.  
  163.         $taxista = json_decode(wp_remote_retrieve_body($verify_response), true);
  164.  
  165.         if (!isset($taxista['fields']['PIN']) || $taxista['fields']['PIN'] !== $data['pin']) {
  166.             wp_send_json_error('No autorizado');
  167.         }
  168.  
  169.         // Actualizar el estado
  170.         $response = wp_remote_request(
  171.             "https://api.airtable.com/v0/{$config['baseId']}/{$config['tableId']}/{$data['taxistaId']}",
  172.             array(
  173.                 'method' => 'PATCH',
  174.                 'headers' => array(
  175.                     'Authorization' => "Bearer {$config['apiKey']}",
  176.                     'Content-Type' => 'application/json'
  177.                 ),
  178.                 'body' => json_encode(array(
  179.                     'fields' => array(
  180.                         'Estado' => $data['newStatus']
  181.                     )
  182.                 ))
  183.             )
  184.         );
  185.  
  186.         if (is_wp_error($response)) {
  187.             throw new Exception($response->get_error_message());
  188.         }
  189.  
  190.         wp_send_json_success('Estado actualizado correctamente');
  191.  
  192.     } catch (Exception $e) {
  193.         wp_send_json_error($e->getMessage());
  194.     }
  195. }
  196. add_action('wp_ajax_update_taxista_status', 'update_taxista_status');
  197. add_action('wp_ajax_nopriv_update_taxista_status', 'update_taxista_status');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement