commit
5a81c4672a
@ -0,0 +1,108 @@
|
||||
{
|
||||
"account": {
|
||||
"acct": "alex",
|
||||
"avatar": "https://freespeechextremist.com/images/avi.png",
|
||||
"avatar_static": "https://freespeechextremist.com/images/avi.png",
|
||||
"bot": false,
|
||||
"created_at": "2022-02-28T01:55:05.000Z",
|
||||
"display_name": "Alex Gleason",
|
||||
"emojis": [],
|
||||
"fields": [],
|
||||
"followers_count": 1,
|
||||
"following_count": 0,
|
||||
"header": "https://freespeechextremist.com/images/banner.png",
|
||||
"header_static": "https://freespeechextremist.com/images/banner.png",
|
||||
"id": "AGv8wCadU7DqWgMqNk",
|
||||
"locked": false,
|
||||
"note": "I'm testing out compatibility with an older Pleroma version",
|
||||
"pleroma": {
|
||||
"accepts_chat_messages": true,
|
||||
"ap_id": "https://freespeechextremist.com/users/alex",
|
||||
"background_image": null,
|
||||
"confirmation_pending": false,
|
||||
"favicon": null,
|
||||
"hide_favorites": true,
|
||||
"hide_followers": false,
|
||||
"hide_followers_count": false,
|
||||
"hide_follows": false,
|
||||
"hide_follows_count": false,
|
||||
"is_admin": false,
|
||||
"is_moderator": false,
|
||||
"relationship": {},
|
||||
"skip_thread_containment": false,
|
||||
"tags": []
|
||||
},
|
||||
"source": {
|
||||
"fields": [],
|
||||
"note": "I'm testing out compatibility with an older Pleroma version",
|
||||
"pleroma": {
|
||||
"actor_type": "Person",
|
||||
"discoverable": true
|
||||
},
|
||||
"sensitive": false
|
||||
},
|
||||
"statuses_count": 1,
|
||||
"url": "https://freespeechextremist.com/users/alex",
|
||||
"username": "alex"
|
||||
},
|
||||
"application": {
|
||||
"name": "Web",
|
||||
"website": null
|
||||
},
|
||||
"bookmarked": false,
|
||||
"card": null,
|
||||
"content": "<br/><a href=\"https://freespeechextremist.com/media/3e34b808-1c84-4ef3-ba56-67cc86b7911a/0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm?name=0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm\">0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm</a>",
|
||||
"created_at": "2022-04-14T19:42:48.000Z",
|
||||
"emojis": [],
|
||||
"favourited": false,
|
||||
"favourites_count": 0,
|
||||
"id": "AIRxLeIzncpCtsr2hs",
|
||||
"in_reply_to_account_id": null,
|
||||
"in_reply_to_id": null,
|
||||
"language": null,
|
||||
"media_attachments": [
|
||||
{
|
||||
"description": "0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm",
|
||||
"id": "1142674091",
|
||||
"pleroma": {
|
||||
"mime_type": "video/webm"
|
||||
},
|
||||
"preview_url": "https://freespeechextremist.com/media/3e34b808-1c84-4ef3-ba56-67cc86b7911a/0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm?name=0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm",
|
||||
"remote_url": "https://freespeechextremist.com/media/3e34b808-1c84-4ef3-ba56-67cc86b7911a/0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm?name=0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm",
|
||||
"text_url": "https://freespeechextremist.com/media/3e34b808-1c84-4ef3-ba56-67cc86b7911a/0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm?name=0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm",
|
||||
"type": "video",
|
||||
"url": "https://freespeechextremist.com/media/3e34b808-1c84-4ef3-ba56-67cc86b7911a/0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm?name=0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm"
|
||||
}
|
||||
],
|
||||
"mentions": [],
|
||||
"muted": false,
|
||||
"pinned": false,
|
||||
"pleroma": {
|
||||
"content": {
|
||||
"text/plain": "0f66e92f339705ccc03079b8f647048e15730adf2cc9eaa1071c7c7cf6884b1b.webm"
|
||||
},
|
||||
"conversation_id": 97191096,
|
||||
"direct_conversation_id": null,
|
||||
"emoji_reactions": [],
|
||||
"expires_at": null,
|
||||
"in_reply_to_account_acct": null,
|
||||
"local": true,
|
||||
"parent_visible": false,
|
||||
"spoiler_text": {
|
||||
"text/plain": ""
|
||||
},
|
||||
"thread_muted": false
|
||||
},
|
||||
"poll": null,
|
||||
"reblog": null,
|
||||
"reblogged": false,
|
||||
"reblogs_count": 0,
|
||||
"replies_count": 0,
|
||||
"sensitive": false,
|
||||
"spoiler_text": "",
|
||||
"tags": [],
|
||||
"text": null,
|
||||
"uri": "https://freespeechextremist.com/objects/419b2cad-656a-4dbc-b2b5-94bb75e0afc8",
|
||||
"url": "https://freespeechextremist.com/notice/AIRxLeIzncpCtsr2hs",
|
||||
"visibility": "public"
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import { IconButton } from 'soapbox/components/ui';
|
||||
import { useAppSelector } from 'soapbox/hooks';
|
||||
|
||||
const messages = defineMessages({
|
||||
close: { id: 'pre_header.close', defaultMessage: 'Close' },
|
||||
});
|
||||
|
||||
export default () => {
|
||||
const intl = useIntl();
|
||||
|
||||
const [hidden, setHidden] = React.useState(false);
|
||||
const siteTitle = useAppSelector((state) => state.instance.title);
|
||||
|
||||
const handleClose = () => {
|
||||
localStorage.setItem('soapbox:welcome-banner', '0');
|
||||
setHidden(true);
|
||||
};
|
||||
|
||||
React.useEffect(() => {
|
||||
const shouldBeHidden = localStorage.getItem('soapbox:welcome-banner') === '0';
|
||||
|
||||
setHidden(shouldBeHidden);
|
||||
}, []);
|
||||
|
||||
if (hidden) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='bg-primary-900 z-10'>
|
||||
<div className='max-w-7xl flex justify-between mx-auto px-2 sm:px-6 lg:px-8'>
|
||||
<div className='h-14 flex items-center space-x-3'>
|
||||
<p className='text-white font-semibold'>
|
||||
<span>Welcome to {siteTitle}</span>
|
||||
</p>
|
||||
|
||||
<Link className='text-sea-blue text-sm lowercase hover:underline' to='/beta'>
|
||||
Learn More
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className='flex items-center'>
|
||||
<IconButton
|
||||
transparent
|
||||
src={require('@tabler/icons/icons/x.svg')}
|
||||
onClick={handleClose}
|
||||
title={intl.formatMessage(messages.close)}
|
||||
className='bg-transparent text-white text-opacity-75'
|
||||
iconClassName='w-5 h-5'
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
@ -0,0 +1,53 @@
|
||||
import React from 'react';
|
||||
import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
|
||||
import { useDispatch } from 'react-redux';
|
||||
|
||||
import { importFetchedStatuses } from 'soapbox/actions/importer';
|
||||
import { expandTimelineSuccess } from 'soapbox/actions/timelines';
|
||||
import SubNavigation from 'soapbox/components/sub_navigation';
|
||||
|
||||
import { Column } from '../../components/ui';
|
||||
import StatusListContainer from '../ui/containers/status_list_container';
|
||||
|
||||
const messages = defineMessages({
|
||||
title: { id: 'column.test', defaultMessage: 'Test timeline' },
|
||||
});
|
||||
|
||||
/**
|
||||
* List of mock statuses to display in the timeline.
|
||||
* These get embedded into the build, but only in this chunk, so it's okay.
|
||||
*/
|
||||
const MOCK_STATUSES: any[] = [
|
||||
require('soapbox/__fixtures__/pleroma-status-with-poll.json'),
|
||||
require('soapbox/__fixtures__/pleroma-status-vertical-video-without-metadata.json'),
|
||||
require('soapbox/__fixtures__/pleroma-status-with-poll-with-emojis.json'),
|
||||
require('soapbox/__fixtures__/pleroma-quote-of-quote-post.json'),
|
||||
require('soapbox/__fixtures__/truthsocial-status-with-external-video.json'),
|
||||
];
|
||||
|
||||
const timelineId = 'test';
|
||||
const onlyMedia = false;
|
||||
|
||||
const TestTimeline: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useDispatch();
|
||||
|
||||
React.useEffect(() => {
|
||||
dispatch(importFetchedStatuses(MOCK_STATUSES));
|
||||
dispatch(expandTimelineSuccess(timelineId, MOCK_STATUSES, null, false, false, false));
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Column label={intl.formatMessage(messages.title)} transparent>
|
||||
<SubNavigation message={intl.formatMessage(messages.title)} />
|
||||
<StatusListContainer
|
||||
scrollKey={`${timelineId}_timeline`}
|
||||
timelineId={`${timelineId}${onlyMedia ? ':media' : ''}`}
|
||||
emptyMessage={<FormattedMessage id='empty_column.test' defaultMessage='The test timeline is empty.' />}
|
||||
divideType='space'
|
||||
/>
|
||||
</Column>
|
||||
);
|
||||
};
|
||||
|
||||
export default TestTimeline;
|
@ -1,74 +0,0 @@
|
||||
import { OrderedSet as ImmutableOrderedSet } from 'immutable';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { injectIntl, defineMessages } from 'react-intl';
|
||||
import { connect } from 'react-redux';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
|
||||
import Icon from 'soapbox/components/icon';
|
||||
import IconWithCounter from 'soapbox/components/icon_with_counter';
|
||||
import { getFeatures } from 'soapbox/utils/features';
|
||||
|
||||
const messages = defineMessages({
|
||||
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit Profile' },
|
||||
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
||||
security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
|
||||
lists: { id: 'column.lists', defaultMessage: 'Lists' },
|
||||
bookmarks: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },
|
||||
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
|
||||
});
|
||||
|
||||
const mapStateToProps = state => {
|
||||
const me = state.get('me');
|
||||
|
||||
const instance = state.get('instance');
|
||||
const features = getFeatures(instance);
|
||||
|
||||
return {
|
||||
isLocked: state.getIn(['accounts', me, 'locked']),
|
||||
followRequestsCount: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableOrderedSet()).count(),
|
||||
features,
|
||||
};
|
||||
};
|
||||
|
||||
export default @connect(mapStateToProps)
|
||||
@injectIntl
|
||||
class FeaturesPanel extends React.PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
intl: PropTypes.object.isRequired,
|
||||
isLocked: PropTypes.bool,
|
||||
followRequestsCount: PropTypes.number,
|
||||
features: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
render() {
|
||||
const { intl, isLocked, followRequestsCount, features } = this.props;
|
||||
|
||||
return (
|
||||
<div className='wtf-panel promo-panel panel'>
|
||||
<div className='promo-panel__container'>
|
||||
{(isLocked || followRequestsCount > 0) && <NavLink className='promo-panel-item' to='/follow_requests'>
|
||||
<IconWithCounter src={require('@tabler/icons/icons/user-plus.svg')} count={followRequestsCount} className='promo-panel-item__icon' />
|
||||
{intl.formatMessage(messages.follow_requests)}
|
||||
</NavLink>}
|
||||
|
||||
{features.bookmarks && (
|
||||
<NavLink className='promo-panel-item' to='/bookmarks'>
|
||||
<Icon src={require('@tabler/icons/icons/bookmark.svg')} className='promo-panel-item__icon' />
|
||||
{intl.formatMessage(messages.bookmarks)}
|
||||
</NavLink>
|
||||
)}
|
||||
|
||||
{features.lists && (
|
||||
<NavLink className='promo-panel-item' to='/lists'>
|
||||
<Icon src={require('@tabler/icons/icons/list.svg')} className='promo-panel-item__icon' />
|
||||
{intl.formatMessage(messages.lists)}
|
||||
</NavLink>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue