Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(content-distribution): Block the editor for incoming posts #181

Merged
merged 13 commits into from
Jan 20, 2025
Merged
58 changes: 53 additions & 5 deletions includes/content-distribution/class-api.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@

namespace Newspack_Network\Content_Distribution;

use InvalidArgumentException;
use Newspack_Network\Content_Distribution;
use WP_Error;
use WP_REST_Response;
use WP_REST_Server;

/**
* API Class.
Expand All @@ -17,14 +20,14 @@ class API {
/**
* Initialize hooks.
*/
public static function init() {
public static function init(): void {
add_action( 'rest_api_init', [ __CLASS__, 'register_routes' ] );
}

/**
* Register the REST API routes.
*/
public static function register_routes() {
public static function register_routes(): void {
register_rest_route(
'newspack-network/v1',
'/content-distribution/distribute/(?P<post_id>\d+)',
Expand All @@ -40,27 +43,72 @@ public static function register_routes() {
],
],
],
'permission_callback' => function() {
'permission_callback' => function () {
return current_user_can( Admin::CAPABILITY );
},
]
);

register_rest_route(
'newspack-network/v1',
'/content-distribution/unlink/(?P<post_id>\d+)',
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ __CLASS__, 'toggle_unlink' ],
'args' => [
'unlinked' => [
'required' => true,
'type' => 'boolean',
],
],
'permission_callback' => function () {
return current_user_can( Admin::CAPABILITY );
},
]
);
}

/**
* Toggle the unlinked status of an incoming post.
*
* @param \WP_REST_Request $request The REST request object.
*
* @return WP_REST_Response|WP_Error The REST response or error.
*/
public static function toggle_unlink( $request ): WP_REST_Response|WP_Error {
$post_id = $request->get_param( 'post_id' );
$unlinked = $request->get_param( 'unlinked' );

try {
$incoming_post = new Incoming_Post( $post_id );
$incoming_post->set_unlinked( $unlinked );
} catch ( InvalidArgumentException $e ) {
return new WP_Error( 'newspack_network_content_distribution_error', $e->getMessage(), [ 'status' => 400 ] );
}

return rest_ensure_response(
[
'post_id' => $post_id,
'unlinked' => ! $incoming_post->is_linked(),
'status' => 'success',
]
);
}

/**
* Distribute a post to the network.
*
* @param \WP_REST_Request $request The REST request object.
*
* @return \WP_REST_Response|WP_Error The REST response or error.
* @return WP_REST_Response|WP_Error The REST response or error.
*/
public static function distribute( $request ) {
$post_id = $request->get_param( 'post_id' );
$urls = $request->get_param( 'urls' );

try {
$outgoing_post = new Outgoing_Post( $post_id );
} catch ( \InvalidArgumentException $e ) {
} catch ( InvalidArgumentException $e ) {
return new WP_Error( 'newspack_network_content_distribution_error', $e->getMessage(), [ 'status' => 400 ] );
}

Expand Down
69 changes: 58 additions & 11 deletions includes/content-distribution/class-editor.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use Newspack_Network\Content_Distribution;
use Newspack_Network\Utils\Network;
use WP_Post;

/**
* Editor Class.
Expand Down Expand Up @@ -47,7 +48,7 @@ public static function register_meta() {
],
],
],
'auth_callback' => function() {
'auth_callback' => function () {
return current_user_can( Admin::CAPABILITY );
},
]
Expand All @@ -56,27 +57,73 @@ public static function register_meta() {
}

/**
* Enqueue block editor assets.
* Action callback.
*
* @return void
*/
public static function enqueue_block_editor_assets() {
public static function enqueue_block_editor_assets(): void {
$screen = get_current_screen();
if ( ! in_array( $screen->post_type, Content_Distribution::get_distributed_post_types(), true ) ) {
return;
}

if ( ! current_user_can( Admin::CAPABILITY ) ) {
if (
! current_user_can( Admin::CAPABILITY )
|| ! in_array( $screen->post_type, Content_Distribution::get_distributed_post_types(), true )
) {
return;
}

$post = get_post();

// Don't enqueue the script for incoming posts.
if ( Content_Distribution::is_post_incoming( $post ) ) {
return;
self::enqueue_block_editor_assets_for_incoming_post( $post );
} else {
self::enqueue_block_editor_assets_for_outgoing_post( $post );
}
}

/**
* Enqueue block editor assets.
*
* @param WP_Post $post The post being edited.
*
* @return void
*/
private static function enqueue_block_editor_assets_for_incoming_post( WP_Post $post ): void {

$incoming = new Incoming_Post( $post->ID );

wp_enqueue_script(
'newspack-network-incoming-post',
plugins_url( '../../dist/incoming-post.js', __FILE__ ),
[],
filemtime( NEWSPACK_NETWORK_PLUGIN_DIR . 'dist/incoming-post.js' ),
true
);
wp_register_style(
'newspack-network-incoming-post',
plugins_url( '../../dist/incoming-post.css', __FILE__ ),
[],
filemtime( NEWSPACK_NETWORK_PLUGIN_DIR . 'dist/incoming-post.css' ),
);
wp_style_add_data( 'newspack-network-incoming-post', 'rtl', 'replace' );
wp_enqueue_style( 'newspack-network-incoming-post' );

wp_localize_script(
'newspack-network-incoming-post',
'newspack_network_incoming_post',
[
'originalUrl' => $incoming->get_original_site_url(),
'unlinked' => ! $incoming->is_linked(),
]
);
}

/**
* Enqueue block editor assets.
*
* @param WP_Post $post The post being edited.
*
* @return void
*/
private static function enqueue_block_editor_assets_for_outgoing_post( WP_Post $post ): void {
wp_enqueue_script(
'newspack-network-distribute',
plugins_url( '../../dist/distribute.js', __FILE__ ),
Expand All @@ -99,7 +146,7 @@ public static function enqueue_block_editor_assets() {
[
'network_sites' => Network::get_networked_urls(),
'distributed_meta' => Outgoing_Post::DISTRIBUTED_POST_META,
'post_type_label' => get_post_type_labels( get_post_type_object( $screen->post_type ) )->singular_name,
'post_type_label' => get_post_type_labels( get_post_type_object( $post->post_type ) )->singular_name,
]
);
}
Expand Down
24 changes: 12 additions & 12 deletions includes/content-distribution/class-incoming-post.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,21 +141,21 @@ protected function get_post_payload() {
}

/**
* Get the post original URL.
* Get the post's original site URL.
*
* @return string The post original post URL. Empty string if not found.
* @return string The post original site URL or an empty string if not found.
*/
public function get_original_post_url() {
return $this->payload['post_url'] ?? '';
public function get_original_site_url(): string {
return $this->payload['site_url'] ?? '';
}

/**
* Get the post original site URL.
* Get the post original URL.
*
* @return string The post original site URL. Empty string if not found.
* @return string The post original post URL. Empty string if not found.
*/
public function get_original_site_url() {
return $this->payload['site_url'] ?? '';
public function get_original_post_url() {
return $this->payload['post_url'] ?? '';
}

/**
Expand Down Expand Up @@ -206,7 +206,7 @@ public function set_unlinked( $unlinked = true ) {
if ( ! $this->ID ) {
return new WP_Error( 'invalid_post', __( 'Invalid post.', 'newspack-network' ) );
}
update_post_meta( $this->ID, self::UNLINKED_META, (bool) $unlinked );
update_post_meta( $this->ID, self::UNLINKED_META, $unlinked ? 1 : 0 );

// If the post is being re-linked, update content.
if ( ! $unlinked ) {
Expand All @@ -219,8 +219,8 @@ public function set_unlinked( $unlinked = true ) {
*
* @return bool
*/
protected function is_unlinked() {
return get_post_meta( $this->ID, self::UNLINKED_META, true );
protected function is_unlinked(): bool {
return (bool) get_post_meta( $this->ID, self::UNLINKED_META, true );
}

/**
Expand All @@ -230,7 +230,7 @@ protected function is_unlinked() {
*
* @return bool
*/
public function is_linked() {
public function is_linked(): bool {
return $this->ID && ! $this->is_unlinked();
}

Expand Down
40 changes: 40 additions & 0 deletions src/content-distribution/distribute-panel/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/**
* WordPress dependencies.
*/
import { __ } from '@wordpress/i18n';
import { PluginSidebar } from '@wordpress/editor';
import { Flex, Panel, PanelBody } from '@wordpress/components';
import { globe } from '@wordpress/icons';

/**
* Internal dependencies.
*/
import './style.scss';

const DistributePanel = ({ header, body, footer, buttons }) => {
naxoc marked this conversation as resolved.
Show resolved Hide resolved
return (
<PluginSidebar
name="newspack-network-distribute-panel"
icon={ globe }
title={ __( 'Distribute', 'newspack-network' ) }
className="newspack-network-distribute-panel"
>
<Panel>
<PanelBody className="distribute-panel-header">
{ header }
</PanelBody>
<PanelBody className="distribute-panel-body">
{ body }
</PanelBody>
<PanelBody className="distribute-panel-footer">
{ footer }
<Flex direction="column" className="distribute-panel__button-column" gap={ 4 }>
{ buttons }
</Flex>
</PanelBody>
</Panel>
</PluginSidebar>
);
};

export default DistributePanel;
26 changes: 26 additions & 0 deletions src/content-distribution/distribute-panel/style.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
.newspack-network-distribute-panel {
height: calc(100% - 47px);

.components-panel {
height: 100%;
display: flex;
flex-direction: column;
}

.components-panel__body {
border: 0;
}

.distribute-panel-body {
flex: 1 1 100%;
overflow-y: auto;
padding-top: 0;

}

.distribute-panel__button-column {
.components-button {
justify-content: center;
}
}
}
Loading