feat: use <time>
tag (#34131)
This commit is contained in:
parent
c43508b3e0
commit
e9fe01e2a6
5 changed files with 42 additions and 16 deletions
|
@ -6,6 +6,7 @@ import { FormattedMessage, injectIntl } from 'react-intl';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
import { openModal } from 'mastodon/actions/modal';
|
import { openModal } from 'mastodon/actions/modal';
|
||||||
|
import { FormattedDateWrapper } from 'mastodon/components/formatted_date';
|
||||||
import InlineAccount from 'mastodon/components/inline_account';
|
import InlineAccount from 'mastodon/components/inline_account';
|
||||||
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
||||||
|
|
||||||
|
@ -60,12 +61,12 @@ class EditedTimestamp extends PureComponent {
|
||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { timestamp, intl, statusId } = this.props;
|
const { timestamp, statusId } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>
|
<DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>
|
||||||
<button className='dropdown-menu__text-button'>
|
<button className='dropdown-menu__text-button'>
|
||||||
<FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: <span className='animated-number'>{intl.formatDate(timestamp, { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</span> }} />
|
<FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: <FormattedDateWrapper className='animated-number' value={timestamp} month='short' day='2-digit' hour='2-digit' minute='2-digit' /> }} />
|
||||||
</button>
|
</button>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
);
|
);
|
||||||
|
|
26
app/javascript/mastodon/components/formatted_date.tsx
Normal file
26
app/javascript/mastodon/components/formatted_date.tsx
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import type { ComponentProps } from 'react';
|
||||||
|
|
||||||
|
import { FormattedDate } from 'react-intl';
|
||||||
|
|
||||||
|
export const FormattedDateWrapper = (
|
||||||
|
props: ComponentProps<typeof FormattedDate> & { className?: string },
|
||||||
|
) => (
|
||||||
|
<FormattedDate {...props}>
|
||||||
|
{(date) => (
|
||||||
|
<time dateTime={tryIsoString(props.value)} className={props.className}>
|
||||||
|
{date}
|
||||||
|
</time>
|
||||||
|
)}
|
||||||
|
</FormattedDate>
|
||||||
|
);
|
||||||
|
|
||||||
|
const tryIsoString = (date?: string | number | Date): string => {
|
||||||
|
if (!date) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new Date(date).toISOString();
|
||||||
|
} catch {
|
||||||
|
return date.toString();
|
||||||
|
}
|
||||||
|
};
|
|
@ -37,6 +37,7 @@ import {
|
||||||
FollowingCounter,
|
FollowingCounter,
|
||||||
StatusesCounter,
|
StatusesCounter,
|
||||||
} from 'mastodon/components/counters';
|
} from 'mastodon/components/counters';
|
||||||
|
import { FormattedDateWrapper } from 'mastodon/components/formatted_date';
|
||||||
import { Icon } from 'mastodon/components/icon';
|
import { Icon } from 'mastodon/components/icon';
|
||||||
import { IconButton } from 'mastodon/components/icon_button';
|
import { IconButton } from 'mastodon/components/icon_button';
|
||||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||||
|
@ -938,11 +939,12 @@ export const AccountHeader: React.FC<{
|
||||||
/>
|
/>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
{intl.formatDate(account.created_at, {
|
<FormattedDateWrapper
|
||||||
year: 'numeric',
|
value={account.created_at}
|
||||||
month: 'short',
|
year='numeric'
|
||||||
day: '2-digit',
|
month='short'
|
||||||
})}
|
day='2-digit'
|
||||||
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,13 @@
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
|
|
||||||
import {
|
import { FormattedMessage, useIntl, defineMessages } from 'react-intl';
|
||||||
FormattedMessage,
|
|
||||||
FormattedDate,
|
|
||||||
useIntl,
|
|
||||||
defineMessages,
|
|
||||||
} from 'react-intl';
|
|
||||||
|
|
||||||
import { Helmet } from 'react-helmet';
|
import { Helmet } from 'react-helmet';
|
||||||
|
|
||||||
import { apiGetPrivacyPolicy } from 'mastodon/api/instance';
|
import { apiGetPrivacyPolicy } from 'mastodon/api/instance';
|
||||||
import type { ApiPrivacyPolicyJSON } from 'mastodon/api_types/instance';
|
import type { ApiPrivacyPolicyJSON } from 'mastodon/api_types/instance';
|
||||||
import { Column } from 'mastodon/components/column';
|
import { Column } from 'mastodon/components/column';
|
||||||
|
import { FormattedDateWrapper } from 'mastodon/components/formatted_date';
|
||||||
import { Skeleton } from 'mastodon/components/skeleton';
|
import { Skeleton } from 'mastodon/components/skeleton';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
|
@ -58,7 +54,7 @@ const PrivacyPolicy: React.FC<{
|
||||||
date: loading ? (
|
date: loading ? (
|
||||||
<Skeleton width='10ch' />
|
<Skeleton width='10ch' />
|
||||||
) : (
|
) : (
|
||||||
<FormattedDate
|
<FormattedDateWrapper
|
||||||
value={response?.updated_at}
|
value={response?.updated_at}
|
||||||
year='numeric'
|
year='numeric'
|
||||||
month='short'
|
month='short'
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
import type { CSSProperties } from 'react';
|
import type { CSSProperties } from 'react';
|
||||||
import { useState, useRef, useCallback } from 'react';
|
import { useState, useRef, useCallback } from 'react';
|
||||||
|
|
||||||
import { FormattedDate, FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
@ -16,6 +16,7 @@ import { AnimatedNumber } from 'mastodon/components/animated_number';
|
||||||
import { ContentWarning } from 'mastodon/components/content_warning';
|
import { ContentWarning } from 'mastodon/components/content_warning';
|
||||||
import EditedTimestamp from 'mastodon/components/edited_timestamp';
|
import EditedTimestamp from 'mastodon/components/edited_timestamp';
|
||||||
import { FilterWarning } from 'mastodon/components/filter_warning';
|
import { FilterWarning } from 'mastodon/components/filter_warning';
|
||||||
|
import { FormattedDateWrapper } from 'mastodon/components/formatted_date';
|
||||||
import type { StatusLike } from 'mastodon/components/hashtag_bar';
|
import type { StatusLike } from 'mastodon/components/hashtag_bar';
|
||||||
import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';
|
import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';
|
||||||
import { Icon } from 'mastodon/components/icon';
|
import { Icon } from 'mastodon/components/icon';
|
||||||
|
@ -388,7 +389,7 @@ export const DetailedStatus: React.FC<{
|
||||||
target='_blank'
|
target='_blank'
|
||||||
rel='noopener noreferrer'
|
rel='noopener noreferrer'
|
||||||
>
|
>
|
||||||
<FormattedDate
|
<FormattedDateWrapper
|
||||||
value={new Date(status.get('created_at') as string)}
|
value={new Date(status.get('created_at') as string)}
|
||||||
year='numeric'
|
year='numeric'
|
||||||
month='short'
|
month='short'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue