first commit

This commit is contained in:
2026-03-05 13:07:40 +01:00
commit 64ba0721ee
25709 changed files with 4691006 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
{
"name": "octolize\/wp-betterdocs-beacon",
"authors": [
{
"name": "Grzegorz",
"email": "grzegorz@octolize.com"
}
],
"license": "MIT",
"require": {
"php": ">=7.0",
"psr\/container": "^1.0",
"wpdesk\/wp-helpscout-beacon": "^1.0.0"
},
"require-dev": {
"phpunit\/phpunit": "^5",
"wp-coding-standards\/wpcs": "^0.14.1",
"squizlabs\/php_codesniffer": "^3.0.2",
"wimg\/php-compatibility": "^8",
"mockery\/mockery": "*",
"10up\/wp_mock": "*"
},
"autoload": {
"psr-4": {
"FSVendor\\Octolize\\BetterDocs\\Beacon\\": "src\/"
}
},
"autoload-dev": {},
"scripts": {
"phpunit-unit": "phpunit --configuration phpunit-unit.xml --coverage-text --colors=never",
"phpunit-unit-fast": "phpunit --configuration phpunit-unit.xml --no-coverage",
"phpunit-integration": "phpunit --configuration phpunit-integration.xml --coverage-text --colors=never",
"phpunit-integration-fast": "phpunit --configuration phpunit-integration.xml --no-coverage"
},
"extra": {
"text-domain": "wp-betterdocs-beacon",
"translations-folder": "lang",
"po-files": {
"pl_PL": "wp-betterdocs-beacon-pl_PL.po"
}
}
}

View File

@@ -0,0 +1,82 @@
<?php
namespace FSVendor\Octolize\BetterDocs\Beacon;
use FSVendor\WPDesk\Beacon\BeaconShouldShowStrategy;
/**
* Can display Better Beacon.
*/
class Beacon
{
/**
* When to display beacon.
*
* @var BeaconShouldShowStrategy
*/
private $activation_strategy;
/**
* @var string
*/
private $assets_url;
/**
* @var string
*/
private $beacon_search_elements_class;
/**
* @var string
*/
protected $confirmation_message;
/**
* @var string
*/
private $beacon_image_content;
/**
* @var BeaconOptions
*/
private $beacon_options;
public function __construct(\FSVendor\Octolize\BetterDocs\Beacon\BeaconOptions $beacon_options, \FSVendor\WPDesk\Beacon\BeaconShouldShowStrategy $strategy, $assets_url, $beacon_search_elements_class = 'search-input', $beacon_image_content = '')
{
$this->beacon_options = $beacon_options;
$this->activation_strategy = $strategy;
$this->assets_url = $assets_url;
$this->beacon_search_elements_class = $beacon_search_elements_class;
$this->confirmation_message = \__('When you click OK we will open our BetterDocs beacon where you can find answers to your questions. This beacon will load our help articles and also potentially set cookies.', 'flexible-shipping');
$this->beacon_image_content = $beacon_image_content;
}
/**
* Hooks.
*/
public function hooks()
{
\add_action('admin_footer', [$this, 'add_beacon_to_footer']);
\add_action('admin_enqueue_scripts', [$this, 'add_beacon_js']);
}
/**
* Should display beacon?
*
* @return bool
*/
protected function should_display_beacon()
{
return $this->activation_strategy->shouldDisplay();
}
public function add_beacon_js()
{
if ($this->should_display_beacon()) {
}
}
/**
* Display Beacon script.
*/
public function add_beacon_to_footer()
{
if ($this->should_display_beacon()) {
$beacon_search_elements_class = $this->beacon_search_elements_class;
$confirmation_message = $this->confirmation_message;
$beacon_image_content = $this->beacon_image_content;
$assets_url = $this->assets_url;
$betterdocs_options = $this->beacon_options->get_options();
include __DIR__ . '/views/html-beacon-script.php';
}
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace FSVendor\Octolize\BetterDocs\Beacon;
class BeaconOptions
{
/**
* @var array
*/
private $options;
public function __construct(array $doc_categories = [], string $url = 'https://octolize.com/docs/')
{
$this->options = $this->prepare_default_options($url, $doc_categories);
}
public function get_options()
{
return $this->options;
}
public function set_option(array $option) : self
{
$this->options = \array_merge_recursive($this->options, $option);
return $this;
}
private function prepare_default_options(string $url, array $doc_categories) : array
{
$categories = '';
if (!empty($doc_categories)) {
$categories = '?%64%6F%63%5F%63%61%74%65%67%6F%72%79=' . \implode(',', $doc_categories);
}
return \apply_filters('octolize/betterdocs-beacon/options', ['CHAT' => ['show' => \false, 'label' => \__('Contact us', 'flexible-shipping'), 'subtitle' => \__('Need help? Send us a message.', 'flexible-shipping'), 'subtitle_two' => \__('We usually respond within max a few hours.', 'flexible-shipping')], 'ANSWER' => ['label' => \__('Find answer', 'flexible-shipping'), 'subtitle' => \__('Knowledge base', 'flexible-shipping')], 'URL' => $url . 'wp-json/wp/v2/docs' . $categories, 'SEARCH' => ['SEARCH_URL' => $url . 'wp-json/wp/v2/docs' . $categories, 'SEARCH_PLACEHOLDER' => \__('Search...', 'flexible-shipping'), 'OOPS' => \__('Oops...', 'flexible-shipping'), 'NOT_FOUND' => \__('We couldnt find any docs that match your search. Try searching for a new term.', 'flexible-shipping')], 'FEEDBACK' => ['DISPLAY' => \true, 'SUCCESS' => \__('Thanks for your feedback', 'flexible-shipping'), 'TEXT' => \__('How did you like it?', 'flexible-shipping'), 'URL' => $url . '?rest_route=/betterdocs/feedback'], 'RESPONSE' => ['title' => \__('Thanks for the feedback', 'flexible-shipping'), 'icon' => ['show' => \false]], 'ASKFORM' => ['NAME' => \__('Name', 'flexible-shipping'), 'EMAIL' => \__('Email address', 'flexible-shipping'), 'SUBJECT' => \__('Subject', 'flexible-shipping'), 'TEXTAREA' => \__('How can we help?', 'flexible-shipping'), 'ATTACHMENT' => \__('Only .jpg, .png, .jpeg, .gif files are supported.', 'flexible-shipping'), 'SENDING' => \__('Sending', 'flexible-shipping'), 'SEND' => \__('Send', 'flexible-shipping')], 'ASK_URL' => $url . '?rest_route=/betterdocs/ask', 'BRANDING' => ['show' => \false], 'THANKS' => ['title' => \__('Thanks!', 'flexible-shipping'), 'text' => \__('Your message has been sent successfully.', 'flexible-shipping')]]);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace FSVendor\Octolize\BetterDocs\Beacon;
use FSVendor\WPDesk\Beacon\BeaconShouldShowStrategy;
/**
* Can display BetterDocs Beacon without confirmation.
*/
class BeaconPro extends \FSVendor\Octolize\BetterDocs\Beacon\Beacon
{
public function __construct(\FSVendor\Octolize\BetterDocs\Beacon\BeaconOptions $beacon_options, \FSVendor\WPDesk\Beacon\BeaconShouldShowStrategy $strategy, $assets_url, $beacon_search_elements_class = 'search-input')
{
parent::__construct($beacon_options, $strategy, $assets_url, $beacon_search_elements_class);
$this->confirmation_message = '';
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace FSVendor;
/**
* Displays Beacon script.
*
* @var $assets_url string .
* @var $betterdocs_options array .
* @var $confirmation_message string .
* @var $beacon_search_elements_class string .
* @var $beacon_image_content string .
*/
$beacon_button_class = 'octolize-beacon-button';
// TODO: use it in future versions (if possible).
$beacon_image_content = !empty($beacon_image_content) ? $beacon_image_content : 'data:image/png;base64,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';
?>
<div id="wpdesk-betterdocs-beacon">
<div class="wpdesk-betterdocs-beacon-frame">
<div id="betterdocs-ia" onclick="confirm_beacon_display(event);">Documentation</div>
<link rel="stylesheet" href="<?php
echo \esc_attr($assets_url . 'css/instant-answer.css');
?>">
<script>window.betterdocs = <?php
echo \json_encode($betterdocs_options);
?>;</script>
<script src="<?php
echo \esc_attr($assets_url . 'js/instant-answer.js');
?>"></script>
</div>
</div>
<script type="text/javascript">
var beacon_confirmation_message = '<?php
echo \esc_attr($confirmation_message);
?>';
/**
* Confirm beacon display.
*
* @param e {Event}
* @returns {boolean}
*/
function confirm_beacon_display( e ) {
if ( beacon_confirmation_message !== '' ) {
if ( ! confirm( beacon_confirmation_message ) ) {
e.stopPropagation();
return false;
} else {
beacon_confirmation_message = '';
}
}
return true;
}
</script>
<?php