2023-01-24 09:25:05 -08:00
< ? php
namespace App\Http\Livewire ;
2023-02-01 16:51:05 -08:00
use GuzzleHttp\Client ;
2023-01-24 09:25:05 -08:00
use Livewire\Component ;
use App\Models\Setting ;
2023-03-21 20:00:11 -07:00
use App\Helpers\Helper ;
2023-01-24 09:25:05 -08:00
class SlackSettingsForm extends Component
{
2023-03-01 12:30:32 -08:00
public $webhook_endpoint ;
public $webhook_channel ;
public $webhook_botname ;
2023-09-20 12:54:34 -07:00
public $isDisabled = 'disabled' ;
2023-03-07 15:48:21 -08:00
public $webhook_name ;
2023-02-27 09:19:59 -08:00
public $webhook_link ;
2023-03-01 17:10:10 -08:00
public $webhook_placeholder ;
public $webhook_icon ;
2023-02-27 09:19:59 -08:00
public $webhook_selected ;
2023-03-13 16:13:02 -07:00
public array $webhook_text ;
2023-03-01 17:10:10 -08:00
public Setting $setting ;
2023-09-19 17:46:29 -07:00
public $webhook_endpoint_rules ;
2023-03-01 17:10:10 -08:00
protected $rules = [
2023-09-28 11:29:46 -07:00
'webhook_endpoint' => 'required_with:webhook_channel|starts_with:http://,https://,ftp://,irc://,https://hooks.slack.com/services/|url|nullable' ,
2023-03-07 15:48:21 -08:00
'webhook_channel' => 'required_with:webhook_endpoint|starts_with:#|nullable' ,
2023-03-01 17:10:10 -08:00
'webhook_botname' => 'string|nullable' ,
];
2023-09-28 11:29:46 -07:00
public $messages = [
'webhook_endpoint.starts_with' => 'your webhook endpoint should begin with http://, https:// or other protocol.' ,
];
2023-03-13 16:13:02 -07:00
2023-03-21 21:00:43 -07:00
public function mount () {
2023-03-13 16:13:02 -07:00
$this -> webhook_text = [
" slack " => array (
" name " => trans ( 'admin/settings/general.slack' ) ,
2023-03-01 12:30:32 -08:00
" icon " => 'fab fa-slack' ,
" placeholder " => " https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX " ,
2023-03-07 15:48:21 -08:00
" link " => 'https://api.slack.com/messaging/webhooks' ,
2023-03-01 12:30:32 -08:00
),
2023-03-13 16:13:02 -07:00
" general " => array (
" name " => trans ( 'admin/settings/general.general_webhook' ),
" icon " => " fab fa-hashtag " ,
" placeholder " => " " ,
" link " => " " ,
),
];
2023-01-25 16:22:34 -08:00
2023-01-25 16:38:08 -08:00
$this -> setting = Setting :: getSettings ();
2023-03-21 15:53:09 -07:00
$this -> save_button = trans ( 'general.save' );
2023-03-07 15:48:21 -08:00
$this -> webhook_selected = $this -> setting -> webhook_selected ;
2023-03-13 16:13:02 -07:00
$this -> webhook_placeholder = $this -> webhook_text [ $this -> setting -> webhook_selected ][ " placeholder " ];
$this -> webhook_name = $this -> webhook_text [ $this -> setting -> webhook_selected ][ " name " ];
$this -> webhook_icon = $this -> webhook_text [ $this -> setting -> webhook_selected ][ " icon " ];
2023-03-01 12:30:32 -08:00
$this -> webhook_endpoint = $this -> setting -> webhook_endpoint ;
$this -> webhook_channel = $this -> setting -> webhook_channel ;
$this -> webhook_botname = $this -> setting -> webhook_botname ;
2023-03-01 17:10:10 -08:00
$this -> webhook_options = $this -> setting -> webhook_selected ;
2023-03-01 12:30:32 -08:00
2023-09-20 12:54:34 -07:00
2023-03-21 15:53:09 -07:00
if ( $this -> setting -> webhook_endpoint != null && $this -> setting -> webhook_channel != null ){
$this -> isDisabled = '' ;
}
2023-01-25 16:22:34 -08:00
}
2023-03-21 21:00:43 -07:00
public function updated ( $field ) {
2023-03-07 15:48:21 -08:00
$this -> validateOnly ( $field , $this -> rules );
2023-09-19 17:46:29 -07:00
2023-02-06 09:40:57 -08:00
}
2023-03-21 21:00:43 -07:00
public function updatedWebhookSelected () {
2023-03-13 16:13:02 -07:00
$this -> webhook_name = $this -> webhook_text [ $this -> webhook_selected ][ 'name' ];
$this -> webhook_icon = $this -> webhook_text [ $this -> webhook_selected ][ " icon " ]; ;
$this -> webhook_placeholder = $this -> webhook_text [ $this -> webhook_selected ][ " placeholder " ];
$this -> webhook_link = $this -> webhook_text [ $this -> webhook_selected ][ " link " ];
2023-03-21 15:53:09 -07:00
if ( $this -> webhook_selected != 'slack' ){
$this -> isDisabled = '' ;
$this -> save_button = trans ( 'general.save' );
}
2023-03-01 17:10:10 -08:00
}
2023-01-24 09:25:05 -08:00
2023-03-21 21:00:43 -07:00
private function isButtonDisabled () {
2023-03-21 15:53:09 -07:00
if ( empty ( $this -> webhook_endpoint )) {
$this -> isDisabled = 'disabled' ;
$this -> save_button = trans ( 'admin/settings/general.webhook_presave' );
}
if ( empty ( $this -> webhook_channel )) {
$this -> isDisabled = 'disabled' ;
$this -> save_button = trans ( 'admin/settings/general.webhook_presave' );
}
}
2023-03-21 21:00:43 -07:00
2023-01-24 09:25:05 -08:00
public function render ()
{
2023-03-21 15:53:09 -07:00
$this -> isButtonDisabled ();
2023-01-24 09:25:05 -08:00
return view ( 'livewire.slack-settings-form' );
}
2023-03-01 12:30:32 -08:00
public function testWebhook (){
2023-02-01 16:51:05 -08:00
2023-03-07 15:48:21 -08:00
$webhook = new Client ([
2023-03-01 12:30:32 -08:00
'base_url' => e ( $this -> webhook_endpoint ),
2023-02-01 16:51:05 -08:00
'defaults' => [
'exceptions' => false ,
],
2023-09-20 12:54:34 -07:00
'allow_redirects' => false ,
2023-02-01 16:51:05 -08:00
]);
$payload = json_encode (
[
2023-03-01 12:30:32 -08:00
'channel' => e ( $this -> webhook_channel ),
2023-03-14 19:02:38 -07:00
'text' => trans ( 'general.webhook_test_msg' , [ 'app' => $this -> webhook_name ]),
2023-03-01 12:30:32 -08:00
'username' => e ( $this -> webhook_botname ),
2023-02-01 16:51:05 -08:00
'icon_emoji' => ':heart:' ,
2023-09-20 12:54:34 -07:00
2023-02-01 16:51:05 -08:00
]);
try {
2023-09-20 12:54:34 -07:00
$test = $webhook -> post ( $this -> webhook_endpoint , [ 'body' => $payload ]);
2023-03-21 21:00:43 -07:00
2023-09-28 11:29:46 -07:00
if (( $test -> getStatusCode () == 302 ) || ( $test -> getStatusCode () == 301 )){
return session () -> flash ( 'error' , 'ERROR: 301/302 ' . $this -> webhook_endpoint . ' returns a redirect. For security reasons, we don’ t follow redirects. Please use the actual endpoint.' );
2023-09-20 12:54:34 -07:00
}
2023-02-15 15:46:05 -08:00
$this -> isDisabled = '' ;
2023-03-21 15:53:09 -07:00
$this -> save_button = trans ( 'general.save' );
2023-03-07 15:57:58 -08:00
return session () -> flash ( 'success' , 'Your ' . $this -> webhook_name . ' Integration works!' );
2023-02-01 16:51:05 -08:00
} catch ( \Exception $e ) {
2023-03-21 21:00:43 -07:00
2023-09-20 12:54:34 -07:00
$this -> isDisabled = 'disabled' ;
$this -> save_button = trans ( 'admin/settings/general.webhook_presave' );
2023-03-08 10:35:45 -08:00
return session () -> flash ( 'error' , trans ( 'admin/settings/message.webhook.error' , [ 'error_message' => $e -> getMessage (), 'app' => $this -> webhook_name ]));
2023-02-01 16:51:05 -08:00
}
2023-03-21 18:59:18 -07:00
return session () -> flash ( 'error' , trans ( 'admin/settings/message.webhook.error_misc' ));
2023-02-01 16:51:05 -08:00
2023-03-21 15:53:09 -07:00
}
2023-02-01 12:08:13 -08:00
2023-03-21 15:53:09 -07:00
public function clearSettings (){
2023-03-21 21:00:43 -07:00
2023-03-21 19:27:05 -07:00
if ( Helper :: isDemoMode ()) {
session () -> flash ( 'error' , trans ( 'general.feature_disabled' ));
} else {
$this -> webhook_endpoint = '' ;
$this -> webhook_channel = '' ;
$this -> webhook_botname = '' ;
$this -> setting -> webhook_endpoint = '' ;
$this -> setting -> webhook_channel = '' ;
$this -> setting -> webhook_botname = '' ;
2023-02-01 12:08:13 -08:00
2023-03-21 19:27:05 -07:00
$this -> setting -> save ();
2023-03-21 15:53:09 -07:00
2023-03-21 19:27:05 -07:00
session () -> flash ( 'success' , trans ( 'admin/settings/message.update.success' ));
}
2023-02-01 12:08:13 -08:00
}
2023-03-21 15:53:09 -07:00
2023-01-25 16:22:34 -08:00
public function submit ()
{
2023-03-21 19:27:05 -07:00
if ( Helper :: isDemoMode ()) {
2023-03-21 18:59:18 -07:00
session () -> flash ( 'error' , trans ( 'general.feature_disabled' ));
} else {
2023-09-20 12:54:34 -07:00
$this -> validate ( $this -> rules );
2023-01-25 16:22:34 -08:00
2023-03-21 18:59:18 -07:00
$this -> setting -> webhook_selected = $this -> webhook_selected ;
$this -> setting -> webhook_endpoint = $this -> webhook_endpoint ;
$this -> setting -> webhook_channel = $this -> webhook_channel ;
$this -> setting -> webhook_botname = $this -> webhook_botname ;
2023-01-25 16:22:34 -08:00
2023-03-21 18:59:18 -07:00
$this -> setting -> save ();
session () -> flash ( 'success' , trans ( 'admin/settings/message.update.success' ));
2023-01-31 11:32:05 -08:00
2023-03-21 18:59:18 -07:00
}
2023-01-31 11:32:05 -08:00
2023-01-25 16:22:34 -08:00
}
2023-01-24 09:25:05 -08:00
}