Skip to content

Commit 69e7720

Browse files
authored
Merge pull request #190 from Emilia-Capital/add/challenges-widget
Add challenges widget
2 parents 9e74041 + 9d39b4d commit 69e7720

File tree

5 files changed

+179
-18
lines changed

5 files changed

+179
-18
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.prpl-widget-wrapper.prpl-challenge {
2+
3+
h2.prpl-widget-title {
4+
background: var(--prpl-background-purple);
5+
padding: 0.75rem 1rem;
6+
border-radius: 0.5rem;
7+
color: var(--prpl-color-headings);
8+
display: flex;
9+
gap: 0.5rem;
10+
align-items: center;
11+
12+
img {
13+
max-width: 1em;
14+
max-height: 1em;
15+
}
16+
}
17+
}

assets/js/settings-page.js

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,29 @@ prplDocumentReady( function () {
5151
* Handle the form submission.
5252
*/
5353
prplDocumentReady( function () {
54+
const prplFormSubmit = function ( event ) {
55+
event.preventDefault();
56+
const formData = new FormData(
57+
document.getElementById( 'prpl-settings' )
58+
);
59+
const data = {
60+
action: 'prpl_settings_form',
61+
};
62+
formData.forEach( function ( value, key ) {
63+
data[ key ] = value;
64+
} );
65+
const request = wp.ajax.post( 'prpl_settings_form', data );
66+
request.done( function () {
67+
window.location.reload();
68+
} );
69+
request.fail( function ( response ) {
70+
alert( response.licensingError || response ); // eslint-disable-line no-alert
71+
} );
72+
};
5473
document
5574
.getElementById( 'prpl-settings-submit' )
56-
.addEventListener( 'click', function () {
57-
const formData = new FormData(
58-
document.getElementById( 'prpl-settings' )
59-
);
60-
const data = {
61-
action: 'prpl_settings_form',
62-
};
63-
formData.forEach( function ( value, key ) {
64-
data[ key ] = value;
65-
} );
66-
const request = wp.ajax.post( 'prpl_settings_form', data );
67-
request.done( function () {
68-
window.location.reload();
69-
} );
70-
request.fail( function ( response ) {
71-
alert( response.licensingError || response ); // eslint-disable-line no-alert
72-
} );
73-
} );
75+
.addEventListener( 'click', prplFormSubmit );
76+
document
77+
.getElementById( 'prpl-settings' )
78+
.addEventListener( 'submit', prplFormSubmit );
7479
} );

classes/admin/class-page.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public function get_widgets() {
4040
\progress_planner()->get_widgets__activity_scores(),
4141
\progress_planner()->get_widgets__suggested_tasks(),
4242
\progress_planner()->get_widgets__todo(),
43+
\progress_planner()->get_widgets__challenge(),
4344
\progress_planner()->get_widgets__latest_badge(),
4445
\progress_planner()->get_widgets__badge_streak(),
4546
\progress_planner()->get_widgets__published_content(),
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
/**
3+
* A widget class.
4+
*
5+
* @package Progress_Planner
6+
*/
7+
8+
namespace Progress_Planner\Widgets;
9+
10+
/**
11+
* Challenge class.
12+
*/
13+
final class Challenge extends \Progress_Planner\Widget {
14+
15+
/**
16+
* The widget ID.
17+
*
18+
* @var string
19+
*/
20+
protected $id = 'challenge';
21+
22+
/**
23+
* Get the feed from the blog.
24+
*
25+
* @param bool $force_free Whether to force the free version.
26+
*
27+
* @return array
28+
*/
29+
public function get_challenge( $force_free = false ) {
30+
$cache_key = $this->get_cache_key( $force_free );
31+
$feed_data = \progress_planner()->get_cache()->get( $cache_key );
32+
33+
// Transient not set.
34+
if ( false === $feed_data ) {
35+
$feed_data = [
36+
'feed' => [],
37+
'expires' => 0,
38+
];
39+
}
40+
41+
// Transient expired, fetch new feed.
42+
if ( $feed_data['expires'] < time() ) {
43+
// Get the feed using the REST API.
44+
$response = \wp_remote_get( $this->get_remote_api_url( $force_free ) );
45+
46+
if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
47+
// Fallback to free response if PRO but the license is invalid.
48+
if ( ! $force_free && \progress_planner()->is_pro_site() ) {
49+
return $this->get_challenge( true );
50+
}
51+
52+
// If we cant fetch the feed, we will try again later.
53+
$feed_data['expires'] = time() + 5 * MINUTE_IN_SECONDS;
54+
} else {
55+
$feed = json_decode( \wp_remote_retrieve_body( $response ), true );
56+
57+
$feed_data['feed'] = $feed;
58+
$feed_data['expires'] = time() + 1 * DAY_IN_SECONDS;
59+
if ( empty( $feed ) ) {
60+
$feed_data['expires'] = time() + 1 * HOUR_IN_SECONDS;
61+
}
62+
}
63+
64+
// Transient uses 'expires' key to determine if it's expired.
65+
\progress_planner()->get_cache()->set( $cache_key, $feed_data, 0 );
66+
}
67+
68+
return $feed_data['feed'];
69+
}
70+
71+
/**
72+
* Render the widget.
73+
*
74+
* @return void
75+
*/
76+
public function render() {
77+
if ( empty( $this->get_challenge() ) ) {
78+
return;
79+
}
80+
parent::render();
81+
}
82+
83+
/**
84+
* Get the cache key.
85+
*
86+
* @param bool $force_free Whether to force the free version.
87+
*
88+
* @return string
89+
*/
90+
public function get_cache_key( $force_free = false ) {
91+
return md5( $this->get_remote_api_url( $force_free ) );
92+
}
93+
94+
/**
95+
* Get the remote-API URL.
96+
*
97+
* @param bool $force_free Whether to force the free version.
98+
*
99+
* @return string
100+
*/
101+
public function get_remote_api_url( $force_free = false ) {
102+
$url = \progress_planner()->get_remote_server_root_url() . '/wp-json/progress-planner-saas/v1/challenges';
103+
$url = ( ! $force_free && \progress_planner()->is_pro_site() )
104+
? \add_query_arg(
105+
[
106+
'license_key' => \get_option( 'progress_planner_pro_license_key' ),
107+
'site' => \get_site_url(),
108+
],
109+
$url
110+
)
111+
: \add_query_arg( [ 'site' => \get_site_url() ], $url );
112+
113+
return $url;
114+
}
115+
}

views/page-widgets/challenge.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Widget view.
4+
*
5+
* @package Progress_Planner
6+
*/
7+
8+
if ( ! defined( 'ABSPATH' ) ) {
9+
exit;
10+
}
11+
12+
$prpl_challenge = \progress_planner()->get_widgets__challenge()->get_challenge();
13+
?>
14+
<h2 class="prpl-widget-title">
15+
<?php if ( $prpl_challenge['icon'] ) : ?>
16+
<img src="<?php echo \esc_url( $prpl_challenge['icon'] ); ?>" alt="">
17+
<?php endif; ?>
18+
<?php echo \esc_html( $prpl_challenge['name'] ); ?>
19+
</h2>
20+
21+
<div class="prpl-challenge-content">
22+
<?php echo \wp_kses_post( str_replace( '{{admin_url}}', \admin_url(), $prpl_challenge['content'] ) ); ?>
23+
</div>

0 commit comments

Comments
 (0)