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'];
}
}
