feat: use <time> tag (#34131)

This commit is contained in:
scarf 2025-03-27 01:14:08 +09:00 committed by GitHub
parent c43508b3e0
commit e9fe01e2a6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 42 additions and 16 deletions

View file

@ -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>
); );

View 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();
}
};

View file

@ -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>

View file

@ -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'

View file

@ -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'