/**
  * Provides a way for a step to process a token action before anything else. If feedback is returned it is displayed and nothing else with be rendered.
  *
  * @param $action
  * @param $token
  * @param $form
  * @param $entry
  *
  * @return bool|string|void|WP_Error
  */
 public function maybe_process_token_action($action, $token, $form, $entry)
 {
     $feedback = parent::maybe_process_token_action($action, $token, $form, $entry);
     if ($feedback) {
         return $feedback;
     }
     if (!in_array($action, array('approve', 'reject'))) {
         return false;
     }
     $entry_id = rgars($token, 'scopes/entry_id');
     if (empty($entry_id) || $entry_id != $entry['id']) {
         return new WP_Error('incorrect_entry_id', esc_html__('Error: incorrect entry.', 'gravityflow'));
     }
     $step_id = rgars($token, 'scopes/step_id');
     if (empty($step_id) || $step_id != $this->get_id()) {
         return new WP_Error('step_already_processed', esc_html__('Error: step already processed.', 'gravityflow'));
     }
     $assignee_key = sanitize_text_field($token['sub']);
     $assignee = new Gravity_Flow_Assignee($assignee_key, $this);
     $new_status = false;
     switch ($token['scopes']['action']) {
         case 'approve':
             $new_status = 'approved';
             break;
         case 'reject':
             $new_status = 'rejected';
             break;
     }
     $feedback = $this->process_assignee_status($assignee, $new_status, $form);
     return $feedback;
 }