activitypub-academy/app/javascript/mastodon/features/activity_log/index.js

113 lines
3.7 KiB
JavaScript
Raw Normal View History

import React from 'react';
import { connect } from 'react-redux';
import ImmutablePureComponent from 'react-immutable-pure-component';
2023-01-15 01:19:37 +09:00
import { FormattedMessage } from 'react-intl';
2022-12-24 01:24:28 +09:00
import PropTypes from 'prop-types';
import Column from 'mastodon/components/column';
import ColumnHeader from 'mastodon/components/column_header';
import { HotKeys } from 'react-hotkeys';
2023-01-28 01:47:50 +09:00
import { setExplorerData, setExplorerUrl } from 'mastodon/actions/activitypub_explorer';
2023-01-15 01:19:37 +09:00
import DismissableBanner from 'mastodon/components/dismissable_banner';
2023-01-02 23:34:54 +09:00
2023-01-26 05:34:01 +09:00
import { ActivityPubVisualization } from 'activitypub-visualization';
2022-12-24 01:24:28 +09:00
const mapStateToProps = (state) => {
return {
logs: state.getIn(['activity_log', 'logs']),
};
};
2022-12-22 03:40:05 +09:00
export default @connect(mapStateToProps)
class ActivityLog extends ImmutablePureComponent {
2022-12-24 01:24:28 +09:00
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
dispatch: PropTypes.func.isRequired,
multiColumn: PropTypes.bool,
};
handleHeaderClick = () => {
this.column.scrollTop();
}
2023-01-03 03:50:03 +09:00
setRef = c => {
this.column = c;
}
render() {
const { dispatch, logs, multiColumn } = this.props;
const darkMode = !(document.body && document.body.classList.contains('theme-mastodon-light'));
// hijack the toggleHidden shortcut to copy the logs to clipbaord
const handlers = {
toggleHidden: () => navigator.clipboard.writeText(JSON.stringify(logs, null, 2)),
};
2023-01-31 04:18:57 +09:00
const Content = () => {
if (logs.length > 0) {
return ( <HotKeys handlers={handlers}>
<div className={`${darkMode ? 'dark' : ''}`} style={{height: '100%'}}>
<ActivityPubVisualization
logs={logs}
clickableLinks
onLinkClick={(url) => {
dispatch(setExplorerUrl(url));
this.context.router.history.push('/activitypub_explorer');
}}
showExplorerLink
onExplorerLinkClick={(data) => {
dispatch(setExplorerData(data));
this.context.router.history.push('/activitypub_explorer');
}}
/>
</div>
</HotKeys>) } else {
return (<div className='empty-column-indicator'>
<FormattedMessage id='empty_column.activity_log' defaultMessage='The Activity Log is empty. Interact with accounts on other instances to trigger activities. You can find more information on my {blog}.'
values={{
blog: <a className='blog-link' href='//seb.jambor.dev/'>blog</a>,
}}
/>
</div>)
}
}
return (
<Column bindToDocument={!multiColumn} ref={this.setRef} label='Activity Log'>
<ColumnHeader
icon='comments'
title='Activity Log'
onClick={this.handleHeaderClick}
multiColumn={multiColumn}
/>
<DismissableBanner id='activity_log'>
<p>
<FormattedMessage
id='dismissable_banner.activity_log_information'
defaultMessage='When you interact with another instance (for example, follow an account on another instance), the resulting Activities will be shown here. You can find more information on my {blog}.'
values={{
2023-01-30 04:12:00 +09:00
blog: <a className='blog-link' href='//seb.jambor.dev/'>blog</a>,
}}
/>
</p>
<p style={{ paddingTop: '5px' }}>
<FormattedMessage
id='dismissable_banner.activity_log_clear'
defaultMessage='Note: Activities will only be logged while Mastodon is open. When you navigate elsewhere or reload the page, the log will be cleared.'
/>
</p>
</DismissableBanner>
2023-01-31 04:18:57 +09:00
<Content />
</Column>
);
}
}