| Current File : /home/digitaw/www/wp-content/updraft/plugins-old/simple-history/src/components/EventOccasions.jsx |
import apiFetch from '@wordpress/api-fetch';
import { Button, ExternalLink } from '@wordpress/components';
import { useState } from '@wordpress/element';
import { __, _n, sprintf } from '@wordpress/i18n';
import { addQueryArgs } from '@wordpress/url';
import { EventOccasionsList } from './EventOccasionsList';
/**
* Displays some text for failed login attempts.
* If the Extended Settings add-on is active, the text will be a link to the settings page.
* If the Extended Settings add-on is not active, the text will be a link to the add-on page.
*
* @param {Object} props
*/
function EventOccasionsAddonsContent( props ) {
const { event, hasExtendedSettingsAddOn } = props;
// Bail if the event is not from the SimpleUserLogger.
if ( event.logger !== 'SimpleUserLogger' ) {
return null;
}
// Bail if the event is not a failed login attempt.
if (
event.message_key !== 'user_login_failed' &&
event.message_key !== 'user_unknown_login_failed'
) {
return null;
}
return (
<div className="SimpleHistoryLogitem__occasionsAddOns">
<p className="SimpleHistoryLogitem__occasionsAddOnsText">
{ hasExtendedSettingsAddOn ? (
<a href="options-general.php?page=simple_history_settings_menu_slug&selected-sub-tab=failed-login-attempts">
{ __(
'Configure failed login attempts',
'simple-history'
) }
</a>
) : (
<ExternalLink href="https://simple-history.com/add-ons/extended-settings/?utm_source=wpadmin#limit-number-of-failed-login-attempts">
{ __(
'Limit logged login attempts',
'simple-history'
) }
</ExternalLink>
) }
</p>
</div>
);
}
/**
* Outputs a button that when clicked will load and show similar events.
*
* @param {Object} props
*/
export function EventOccasions( props ) {
const { event, eventVariant, hasExtendedSettingsAddOn } = props;
const { subsequent_occasions_count: subsequentOccasionsCount } = event;
const [ isLoadingOccasions, setIsLoadingOccasions ] = useState( false );
const [ isShowingOccasions, setIsShowingOccasions ] = useState( false );
const [ occasions, setOccasions ] = useState( [] );
const occasionsCountMaxReturn = 15;
// Bail if the current event is the only occasion.
if ( subsequentOccasionsCount === 1 ) {
return null;
}
// Bail if variant is modal.
if ( eventVariant === 'modal' ) {
return null;
}
const loadOccasions = async () => {
setIsLoadingOccasions( true );
const eventsQueryParams = {
type: 'occasions',
logRowID: event.id,
occasionsID: event.occasions_id,
occasionsCount: subsequentOccasionsCount - 1,
occasionsCountMaxReturn,
per_page: 5,
_fields: [
'id',
'date',
'date_gmt',
'message',
'message_html',
'details_data',
'details_html',
'loglevel',
'occasions_id',
'subsequent_occasions_count',
'initiator',
'initiator_data',
'via',
],
};
const eventsResponse = await apiFetch( {
path: addQueryArgs(
'/simple-history/v1/events',
eventsQueryParams
),
// Skip parsing to be able to retrieve headers.
parse: false,
} );
const responseJson = await eventsResponse.json();
setOccasions( responseJson );
setIsLoadingOccasions( false );
setIsShowingOccasions( true );
};
const showOccasionsEventsContent = (
<>
<div className="SimpleHistoryLogitem__occasions">
<Button
variant="link"
onClick={ ( evt ) => {
loadOccasions();
evt.preventDefault();
} }
>
{ sprintf(
/* translators: %s: number of similar events */
_n(
'+%1$s similar event',
'+%1$s similar events',
subsequentOccasionsCount,
'simple-history'
),
subsequentOccasionsCount
) }
</Button>
<EventOccasionsAddonsContent
event={ event }
hasExtendedSettingsAddOn={ hasExtendedSettingsAddOn }
/>
</div>
</>
);
return (
<div>
{ ! isShowingOccasions && ! isLoadingOccasions
? showOccasionsEventsContent
: null }
{ isLoadingOccasions ? (
<span>{ __( 'Loading…', 'simple-history' ) }</span>
) : null }
{ isShowingOccasions ? (
<>
<span>
{ sprintf(
/* translators: %s: number of similar events */
__( 'Showing %1$s more', 'simple-history' ),
subsequentOccasionsCount - 1
) }
</span>
<EventOccasionsList
isLoadingOccasions={ isLoadingOccasions }
isShowingOccasions={ isShowingOccasions }
occasions={ occasions }
subsequent_occasions_count={ subsequentOccasionsCount }
occasionsCountMaxReturn={ occasionsCountMaxReturn }
/>
</>
) : null }
</div>
);
}