<?php
namespace OTGS\Installer\AdminNotices;
use OTGS\Installer\FP\Obj;
class Dismissed {
const STORE_KEY = 'dismissed';
/**
* @param array $dismissedNotices
* @param string $repo
* @param string $id
*
* @return bool
*/
public static function isDismissed( array $dismissedNotices, $repo, $id ) {
return isset( $dismissedNotices['repo'][ $repo ][ $id ] );
}
/**
* @param string $plugin_slug
* @param bool $network
* @return void
*/
public static function dismissNoticeOnPluginActivation( $plugin_slug, $network ) {
$repositoryRecommendations = Obj::propOr([], 'repo', apply_filters( 'otgs_installer_admin_notices', [] ) );
$isPluginRecommendation = function( $plugin_attrs ) use ( $plugin_slug ) {
return '' == $plugin_slug || strpos( $plugin_slug, $plugin_attrs['glue_plugin_slug'] ) !== false;
};
foreach( $repositoryRecommendations as $repository => $notices ) {
if ( ! isset( $notices['plugin-activated'] ) ) {
continue;
}
$pluginRecommendationsToDisable = array_filter( $notices['plugin-activated'], $isPluginRecommendation );
foreach ( $pluginRecommendationsToDisable as $plugin => $recommendation ) {
self::dismissNoticeByTypeAndRepository( $repository, 'plugin-activated', $plugin );
}
}
}
/**
* @param array $dismissedNotices
* @param callable $timeOut - int -> string -> string -> bool
*
* @return mixed
*/
public static function clearExpired( array $dismissedNotices, callable $timeOut ) {
if ( isset( $dismissedNotices['repo'] ) ) {
foreach ( $dismissedNotices['repo'] as $repo => $ids ) {
foreach ( $ids as $id => $dismissedTimeStamp ) {
if ( $timeOut( $dismissedTimeStamp, $repo, $id ) ) {
unset ( $dismissedNotices['repo'][ $repo ][ $id ] );
}
}
}
}
return $dismissedNotices;
}
public static function dismissNotice() {
$rawData = filter_var_array( $_POST, [
'repository' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'noticeType' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'noticePluginSlug' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
] );
self::dismissNoticeByTypeAndRepository(
Obj::propOr('', 'repository', $rawData ),
Obj::propOr('', 'noticeType', $rawData ),
Obj::propOr('', 'noticePluginSlug', $rawData )
);
wp_send_json_success( [] );
}
public static function dismissRecommendationNoticeByPluginSlug( $dismissed, $data ) {
$dismissed['repo'][ $data['repository'] ][ $data['noticePluginSlug'] ] = time();
return $dismissed;
}
/**
* @param string $dismissRepository
* @param string $dismissNoticeType
* @param string $dismissNoticePluginSlug
* @return void
*/
private static function dismissNoticeByTypeAndRepository($dismissRepository, $dismissNoticeType, $dismissNoticePluginSlug) {
$dismissions = apply_filters('otgs_installer_admin_notices_dismissions', []);
$store = new Store();
$dismissed = $store->get(self::STORE_KEY, []);
$data = [
'repository' => $dismissRepository,
'noticeType' => $dismissNoticeType,
'noticePluginSlug' => $dismissNoticePluginSlug,
];
$dismissed = $dismissions[$dismissNoticeType]($dismissed, $data);
$store->save(self::STORE_KEY, $dismissed);
}
}