sidekick-1.0.x-dev/src/Form/SettingsForm.php

src/Form/SettingsForm.php
<?php

namespace Drupal\sidekick\Form;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\TypedConfigManagerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Render\Renderer;
use Drupal\sidekick\SidekickService;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Configure Sidekick settings.
 */
class SettingsForm extends ConfigFormBase {

  /**
   * Language manager service.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected LanguageManagerInterface $language;

  /**
   * The Sidekick service.
   *
   * @var \Drupal\sidekick\SidekickService
   */
  protected SidekickService $sidekickService;

  /**
   * The renderer service.
   *
   * @var \Drupal\Core\Render\Renderer
   */
  protected Renderer $renderer;

  /**
   * SettingsForm constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The factory for configuration objects.
   * @param \Drupal\Core\Config\TypedConfigManagerInterface|null $typedConfigManager
   *   The typed config manager.
   * @param \Drupal\Core\Language\LanguageManagerInterface|null $language
   *   The language manager service.
   * @param \Drupal\sidekick\SidekickService|null $sidekickService
   *   The Sidekick service.
   * @param \Drupal\Core\Render\Renderer|null $renderer
   *   The renderer service.
   */
  public function __construct(
    ConfigFactoryInterface $config_factory,
    ?TypedConfigManagerInterface $typedConfigManager = NULL,
    ?LanguageManagerInterface $language = NULL,
    ?SidekickService $sidekickService = NULL,
    ?Renderer $renderer = NULL,
  ) {
    parent::__construct($config_factory, $typedConfigManager);
    $this->language = $language;
    $this->sidekickService = $sidekickService;
    $this->renderer = $renderer;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('config.factory'),
      $container->get('config.typed'),
      $container->get('language_manager'),
      $container->get('sidekick.service'),
      $container->get('renderer')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId(): string {
    return 'sidekick_settings';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state): array {
    $sidekickAccountUsage = '';
    if ($this->config('sidekick.settings')->get('api_key')) {
      $sidekickAccountUsage = $this->sidekickService->getAccountUsage(
        $this->config('sidekick.settings')->get('api_key')
      );
    }

    $form['usage_bar'] = [
      '#type' => 'item',
      '#theme' => 'usage_bar',
      '#sidekickAccountUsage' => $sidekickAccountUsage,
    ];
    $form['info'] = [
      '#type' => 'html_tag',
      '#tag' => 'h5',
      '#value' => $this->t(
        'Please add https://*.ai-sidekick.app/chat in your trustworthy iframe sources.'
      ),
    ];
    $form['api_key'] = [
      '#type' => 'textfield',
      '#title' => $this->t('API Key'),
      '#default_value' => $this->config('sidekick.settings')
        ->get('api_key'),
      '#required' => TRUE,
    ];
    $form['display_type'] = [
      '#type' => 'select',
      '#options' => [
        'no_display' => $this->t('Do not display'),
        'inline' => $this->t('Inline'),
        'inline_closed' => $this->t('Inline (closed)'),
        'modal' => $this->t('Modal'),
      ],
      '#title' => $this->t('Show Sidekick in Sidebar'),
      '#default_value' => $this->config('sidekick.settings')
        ->get('display_type'),
    ];
    $form['target_audience'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Target Audience'),
      '#default_value' => $this->config('sidekick.settings')
        ->get('target_audience'),
      '#rows' => '5',
    ];
    $form['page_briefing'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Page briefing'),
      '#default_value' => $this->config('sidekick.settings')
        ->get('page_briefing'),
      '#rows' => '5',
    ];

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state): void {
    $api_key = $form_state->getValue('api_key');
    if (!empty($api_key)) {
      $language_code = $this->language
        ->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)
        ->getId();
      $sidekickKeyStatus = $this->sidekickService->checkKeyStatus(
        $language_code,
        $api_key,
        TRUE
      );

      if (!empty($sidekickKeyStatus['status']) && $sidekickKeyStatus['status'] == 498) {
        $form_state->setErrorByName('api_key');
        $build_message = [
          '#type' => 'container',
          '#markup' => $sidekickKeyStatus['message'],
          '#attributes' => ['class' => ['messages--error']],
        ];
        $message = $this->renderer->renderInIsolation($build_message);
        $this->messenger()->addError($message);
      }
    }

    parent::validateForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state): void {
    $api_key = $form_state->getValue('api_key');
    $page_briefing = $form_state->getValue('page_briefing');
    $target_audience = $form_state->getValue('target_audience');

    if (empty($page_briefing) && empty($target_audience)) {
      $sidekickAccountContext = $this->sidekickService->getAccountContext(
        $api_key
      );
      $page_briefing = $sidekickAccountContext['message']['data']['context'] ?? '';
      $target_audience = $sidekickAccountContext['message']['data']['target_audience'] ?? '';
    }
    else {
      $this->sidekickService->setAccountContext(
        $api_key,
        $page_briefing,
        $target_audience
      );
    }

    $this->config('sidekick.settings')
      ->set('api_key', $form_state->getValue('api_key'))
      ->set('display_type', $form_state->getValue('display_type'))
      ->set('target_audience', $target_audience)
      ->set('page_briefing', $page_briefing)
      ->save();

    parent::submitForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames(): array {
    return ['sidekick.settings'];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc