Spaces:
No application file
No application file
| namespace Mautic\NotificationBundle\Helper; | |
| use Doctrine\ORM\EntityManager; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Twig\Helper\AssetsHelper; | |
| use Mautic\LeadBundle\Entity\DoNotContact; | |
| use Mautic\PluginBundle\Helper\IntegrationHelper; | |
| use Symfony\Bundle\FrameworkBundle\Routing\Router; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
| class NotificationHelper | |
| { | |
| public function __construct( | |
| protected EntityManager $em, | |
| protected AssetsHelper $assetsHelper, | |
| protected CoreParametersHelper $coreParametersHelper, | |
| protected IntegrationHelper $integrationHelper, | |
| protected Router $router, | |
| protected RequestStack $requestStack, | |
| private \Mautic\LeadBundle\Model\DoNotContact $doNotContact | |
| ) { | |
| } | |
| /** | |
| * @param string $notification | |
| * | |
| * @return bool | |
| */ | |
| public function unsubscribe($notification) | |
| { | |
| /** @var \Mautic\LeadBundle\Entity\LeadRepository $repo */ | |
| $repo = $this->em->getRepository(\Mautic\LeadBundle\Entity\Lead::class); | |
| $lead = $repo->getLeadByEmail($notification); | |
| return $this->doNotContact->addDncForContact($lead->getId(), 'notification', DoNotContact::UNSUBSCRIBED); | |
| } | |
| public function getHeaderScript() | |
| { | |
| if ($this->hasScript()) { | |
| return 'MauticJS.insertScript(\'https://cdn.onesignal.com/sdks/OneSignalSDK.js\'); | |
| var OneSignal = OneSignal || [];'; | |
| } | |
| } | |
| public function getScript() | |
| { | |
| if ($this->hasScript()) { | |
| $integration = $this->integrationHelper->getIntegrationObject('OneSignal'); | |
| if (!$integration || false === $integration->getIntegrationSettings()->getIsPublished()) { | |
| return; | |
| } | |
| $settings = $integration->getIntegrationSettings(); | |
| $keys = $integration->getDecryptedApiKeys(); | |
| $supported = $settings->getSupportedFeatures(); | |
| $featureSettings = $settings->getFeatureSettings(); | |
| $appId = $keys['app_id']; | |
| $safariWebId = $keys['safari_web_id']; | |
| $welcomenotificationEnabled = in_array('welcome_notification_enabled', $supported); | |
| $notificationSubdomainName = $featureSettings['subdomain_name']; | |
| $leadAssociationUrl = $this->router->generate( | |
| 'mautic_subscribe_notification', | |
| [], | |
| UrlGeneratorInterface::ABSOLUTE_URL | |
| ); | |
| $welcomenotificationText = ''; | |
| if (!$welcomenotificationEnabled) { | |
| $welcomenotificationText = 'welcomeNotification: { "disable": true },'; | |
| } | |
| $server = $this->requestStack->getCurrentRequest()->server; | |
| $https = ('https' == parse_url($server->get('HTTP_REFERER'), PHP_URL_SCHEME)) ? true : false; | |
| $subdomainName = ''; | |
| if (!$https && $notificationSubdomainName) { | |
| $subdomainName = 'subdomainName: "'.$notificationSubdomainName.'", | |
| httpPermissionRequest: { | |
| enable: true, | |
| useCustomModal: true | |
| },'; | |
| } | |
| $oneSignalInit = <<<JS | |
| var scrpt = document.createElement('link'); | |
| scrpt.rel ='manifest'; | |
| scrpt.href ='/manifest.json'; | |
| var head = document.getElementsByTagName('head')[0]; | |
| head.appendChild(scrpt); | |
| OneSignal.push(["init", { | |
| appId: "{$appId}", | |
| safari_web_id: "{$safariWebId}", | |
| autoRegister: true, | |
| {$welcomenotificationText} | |
| {$subdomainName} | |
| notifyButton: { | |
| enable: false // Set to false to hide | |
| } | |
| }]); | |
| var postUserIdToMautic = function(userId) { | |
| var data = []; | |
| data['osid'] = userId; | |
| MauticJS.makeCORSRequest('GET', '{$leadAssociationUrl}', data); | |
| }; | |
| OneSignal.push(function() { | |
| OneSignal.getUserId(function(userId) { | |
| if (! userId) { | |
| OneSignal.on('subscriptionChange', function(isSubscribed) { | |
| if (isSubscribed) { | |
| OneSignal.getUserId(function(newUserId) { | |
| postUserIdToMautic(newUserId); | |
| }); | |
| } | |
| }); | |
| } else { | |
| postUserIdToMautic(userId); | |
| } | |
| }); | |
| // Just to be sure we've grabbed the ID | |
| window.onbeforeunload = function() { | |
| OneSignal.getUserId(function(userId) { | |
| if (userId) { | |
| postUserIdToMautic(userId); | |
| } | |
| }); | |
| }; | |
| }); | |
| JS; | |
| if (!$https && $notificationSubdomainName) { | |
| $oneSignalInit .= <<<'JS' | |
| OneSignal.push(function() { | |
| OneSignal.on('notificationPermissionChange', function(permissionChange) { | |
| if(currentPermission == 'granted'){ | |
| setTimeout(function(){ | |
| OneSignal.registerForPushNotifications({httpPermissionRequest: true}); | |
| }, 100); | |
| } | |
| }); | |
| }); | |
| JS; | |
| } | |
| return $oneSignalInit; | |
| } | |
| } | |
| private function hasScript(): bool | |
| { | |
| $landingPage = true; | |
| $server = $this->requestStack->getCurrentRequest()->server; | |
| $cookies = $this->requestStack->getCurrentRequest()->cookies; | |
| // already exist | |
| if ($cookies->get('mtc_osid')) { | |
| return false; | |
| } | |
| if (!str_contains($server->get('HTTP_REFERER'), $this->coreParametersHelper->get('site_url'))) { | |
| $landingPage = false; | |
| } | |
| $integration = $this->integrationHelper->getIntegrationObject('OneSignal'); | |
| if (!$integration || false === $integration->getIntegrationSettings()->getIsPublished()) { | |
| return false; | |
| } | |
| $supportedFeatures = $integration->getIntegrationSettings()->getSupportedFeatures(); | |
| // disable on Landing pages | |
| if (true === $landingPage && !in_array('landing_page_enabled', $supportedFeatures)) { | |
| return false; | |
| } | |
| // disable on Landing pages | |
| if (false === $landingPage && !in_array('tracking_page_enabled', $supportedFeatures)) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| } | |