diff --git a/src/WPStrava.php b/src/WPStrava.php index dddde35..2b7c25a 100644 --- a/src/WPStrava.php +++ b/src/WPStrava.php @@ -202,6 +202,7 @@ class WPStrava { static $blocks = array( 'WPStrava_Blocks_Activity', 'WPStrava_Blocks_Route', + 'WPStrava_Blocks_ActivitiesList', ); // automatically load dependencies and version diff --git a/src/WPStrava/ActivitiesListRenderer.php b/src/WPStrava/ActivitiesListRenderer.php index 0cdd42c..a67f1e1 100644 --- a/src/WPStrava/ActivitiesListRenderer.php +++ b/src/WPStrava/ActivitiesListRenderer.php @@ -1,6 +1,6 @@ * @since 2.3.0 */ -class WPStrava_ActivitiesList { - public static function get_activities_html( $args ) { - if ( isset( $args['athlete_token'] ) ) { +class WPStrava_ActivitiesListRenderer { + + /** + * Get the HTML for an Activities List. + * + * @param array $atts + * @return string HTML for an route. + * @author Justin Foell + * @since 2.8.0 + */ + public function get_html( $atts ) { + if ( isset( $atts['athlete_token'] ) ) { // Translators: Message shown when using deprecated athlete_token parameter. return __( 'The athlete_token parameter is deprecated as of WP-Strava version 2 and should be replaced with client_id.', 'wp-strava' ); } @@ -26,14 +35,14 @@ class WPStrava_ActivitiesList { 'date_end' => '', ); - $args = wp_parse_args( $args, $defaults ); + $atts = wp_parse_args( $atts, $defaults ); - $som = WPStrava_SOM::get_som( $args['som'] ); + $som = WPStrava_SOM::get_som( $atts['som'] ); $strava_activity = WPStrava::get_instance()->activity; $activities = array(); try { - $activities = $strava_activity->get_activities( $args ); + $activities = $strava_activity->get_activities( $atts ); } catch ( WPStrava_Exception $e ) { return $e->to_html(); } @@ -51,11 +60,11 @@ class WPStrava_ActivitiesList { // Translators: Shows something like "On <[went 10 miles] [during 2 hours] [climbing 100 feet]>." __( 'On %1$s %2$s', 'wp-strava' ), date_i18n( get_option( 'date_format' ), $unixtime ), - self::get_activity_time( $unixtime ) + $this->get_activity_time( $unixtime ) ); } - if ( is_numeric( $args['strava_club_id'] ) ) { + if ( is_numeric( $atts['strava_club_id'] ) ) { $name = $activity->athlete->firstname . ' ' . $activity->athlete->lastname; $response .= empty( $activity->athlete->id ) ? " {$name}" : @@ -86,7 +95,7 @@ class WPStrava_ActivitiesList { * @author Justin Foell * @since 1.7.1 */ - public static function get_activity_time( $unixtime ) { + private function get_activity_time( $unixtime ) { if ( WPStrava::get_instance()->settings->hide_time ) { return ''; } diff --git a/src/WPStrava/ActivitiesListShortcode.php b/src/WPStrava/ActivitiesListShortcode.php index 8749366..c1a6858 100644 --- a/src/WPStrava/ActivitiesListShortcode.php +++ b/src/WPStrava/ActivitiesListShortcode.php @@ -44,7 +44,9 @@ class WPStrava_ActivitiesListShortcode { */ public function handler( $atts ) { $this->add_script = true; - return WPStrava_ActivitiesList::get_activities_html( $atts ); + + $renderer = new WPStrava_ActivitiesListRenderer(); + return $renderer->get_html( $atts ); } /** diff --git a/src/WPStrava/ActivitiesListWidget.php b/src/WPStrava/ActivitiesListWidget.php index fea2fa9..c04db25 100644 --- a/src/WPStrava/ActivitiesListWidget.php +++ b/src/WPStrava/ActivitiesListWidget.php @@ -42,7 +42,10 @@ class WPStrava_ActivitiesListWidget extends WP_Widget { if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } - echo WPStrava_ActivitiesList::get_activities_html( $activities_args ); + + $renderer = new WPStrava_ActivitiesListRenderer(); + echo $renderer->get_html( $activities_args ); + echo $args['after_widget']; // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped } diff --git a/src/WPStrava/Blocks/ActivitiesList.php b/src/WPStrava/Blocks/ActivitiesList.php new file mode 100644 index 0000000..856c9bc --- /dev/null +++ b/src/WPStrava/Blocks/ActivitiesList.php @@ -0,0 +1,74 @@ + + * @since 2.5.0 + */ + private $add_script = false; + + /** + * Register the wp-strava/activitieslist block. + * + * @author Justin Foell + * @since 2.2.0 + */ + public function register_block() { + register_block_type( + 'wp-strava/activitieslist', + array( + 'style' => 'wp-strava-block', + 'editor_style' => 'wp-strava-block-editor', + 'editor_script' => 'wp-strava-block', + 'render_callback' => array( $this, 'render_block' ), + 'attributes' => array( + 'som' => array( + 'type' => 'string', + 'default' => null, + ), + ), + ) + ); + add_action( 'wp_footer', array( $this, 'print_scripts' ) ); + } + + /** + * Render for this block. + * + * @param array $attributes JSON attributes saved in the HTML comment for this block. + * @param string $content The content from JS save() for this block. + * @return string HTML for this block. + * @author Justin Foell + * @since 2.2.0 + */ + public function render_block( $attributes, $content ) { + $this->add_script = true; + + // Transform from block attributes to shortcode standard. + $attributes = array( + 'som' => ! empty( $attributes['som'] ) ? $attributes['som'] : null, + ); + + $renderer = new WPStrava_ActivitiesListRenderer(); + return $renderer->get_html( $attributes ); + } + + /** + * Enqueue style if block is being used. + * + * @author Justin Foell + * @since 2.5.0 + */ + public function print_scripts() { + if ( $this->add_script ) { + wp_enqueue_style( 'wp-strava-style' ); + } + } +} diff --git a/src/blocks/activitieslist/block.json b/src/blocks/activitieslist/block.json new file mode 100644 index 0000000..c99cbd8 --- /dev/null +++ b/src/blocks/activitieslist/block.json @@ -0,0 +1,18 @@ +{ + "name": "wp-strava/activitieslist", + "title": "Strava Activities List", + "category": "embed", + "icon": "editor-ul", + "description": "List of Strava Activities", + "keywords": [ "activity", "ride" ], + "textdomain": "wp-strava", + "attributes": { + "som": { + "type": "string", + "default": null + } + }, + "editorScript": "file:../../../build/index.js", + "editorStyle": "file:../../../build/editor.css", + "style": "file:../../../build/style.css" +} diff --git a/src/blocks/activitieslist/edit.js b/src/blocks/activitieslist/edit.js new file mode 100644 index 0000000..ea5dcc2 --- /dev/null +++ b/src/blocks/activitieslist/edit.js @@ -0,0 +1,52 @@ +/* global wp, wpStrava */ +import SOMOverride from '../components/som-override'; + +const { __ } = wp.i18n; +const { Component } = wp.element; +const { InspectorControls } = wp.editor; +const { PanelBody, ToggleControl, ServerSideRender } = wp.components; + +class Edit extends Component { + + constructor() { + super( ...arguments ); + this.overrideSOM = this.overrideSOM.bind( this ); + + this.state = { + som: this.props.attributes.som, + }; + } + + overrideSOM( newSOM ) { + this.setState( { som: newSOM } ); + this.props.setAttributes( { som: newSOM } ); + } + + render() { + const { + som + } = this.state; + + return ( + <> + + + + + + + + ); + } +} + +export default Edit; diff --git a/src/blocks/activitieslist/index.js b/src/blocks/activitieslist/index.js new file mode 100644 index 0000000..70a50a1 --- /dev/null +++ b/src/blocks/activitieslist/index.js @@ -0,0 +1,9 @@ +/* global wp, wpStrava */ +import { registerBlockType } from '@wordpress/blocks'; +import edit from './edit'; +import metadata from './block.json'; + +metadata.edit = edit; +metadata.save = () => null; + +registerBlockType( metadata.name, metadata ); diff --git a/src/index.js b/src/index.js index ab46a48..056e447 100644 --- a/src/index.js +++ b/src/index.js @@ -1,2 +1,3 @@ import './blocks/activity'; import './blocks/route'; +import './blocks/activitieslist';