diff --git a/app/javascript/flavours/glitch/features/directory/components/account_card.js b/app/javascript/flavours/glitch/features/directory/components/account_card.js
index 2a3fd1ecfb4..c9ef5850c0d 100644
--- a/app/javascript/flavours/glitch/features/directory/components/account_card.js
+++ b/app/javascript/flavours/glitch/features/directory/components/account_card.js
@@ -7,31 +7,28 @@ import { makeGetAccount } from 'flavours/glitch/selectors';
import Avatar from 'flavours/glitch/components/avatar';
import DisplayName from 'flavours/glitch/components/display_name';
import Permalink from 'flavours/glitch/components/permalink';
-import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
-import IconButton from 'flavours/glitch/components/icon_button';
+import Button from 'flavours/glitch/components/button';
import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
import { autoPlayGif, me, unfollowModal } from 'flavours/glitch/util/initial_state';
import ShortNumber from 'flavours/glitch/components/short_number';
import {
followAccount,
unfollowAccount,
- blockAccount,
unblockAccount,
unmuteAccount,
} from 'flavours/glitch/actions/accounts';
import { openModal } from 'flavours/glitch/actions/modal';
-import { initMuteModal } from 'flavours/glitch/actions/mutes';
+import classNames from 'classnames';
const messages = defineMessages({
- follow: { id: 'account.follow', defaultMessage: 'Follow' },
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
- requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
- unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
- unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
- unfollowConfirm: {
- id: 'confirmations.unfollow.confirm',
- defaultMessage: 'Unfollow',
- },
+ follow: { id: 'account.follow', defaultMessage: 'Follow' },
+ cancel_follow_request: { id: 'account.cancel_follow_request', defaultMessage: 'Cancel follow request' },
+ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
+ unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },
+ unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },
+ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
+ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
});
const makeMapStateToProps = () => {
@@ -75,18 +72,15 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBlock(account) {
if (account.getIn(['relationship', 'blocking'])) {
dispatch(unblockAccount(account.get('id')));
- } else {
- dispatch(blockAccount(account.get('id')));
}
},
onMute(account) {
if (account.getIn(['relationship', 'muting'])) {
dispatch(unmuteAccount(account.get('id')));
- } else {
- dispatch(initMuteModal(account));
}
},
+
});
export default
@@ -138,130 +132,92 @@ class AccountCard extends ImmutablePureComponent {
handleMute = () => {
this.props.onMute(this.props.account);
- };
+ }
+
+ handleEditProfile = () => {
+ window.open('/settings/profile', '_blank');
+ }
render() {
const { account, intl } = this.props;
- let buttons;
+ let actionBtn;
- if (
- account.get('id') !== me &&
- account.get('relationship', null) !== null
- ) {
- const following = account.getIn(['relationship', 'following']);
- const requested = account.getIn(['relationship', 'requested']);
- const blocking = account.getIn(['relationship', 'blocking']);
- const muting = account.getIn(['relationship', 'muting']);
-
- if (requested) {
- buttons = (
-
- );
- } else if (blocking) {
- buttons = (
-
- );
- } else if (muting) {
- buttons = (
-
- );
- } else if (!account.get('moved') || following) {
- buttons = (
-
- );
+ if (me !== account.get('id')) {
+ if (!account.get('relationship')) { // Wait until the relationship is loaded
+ actionBtn = '';
+ } else if (account.getIn(['relationship', 'requested'])) {
+ actionBtn = ;
+ } else if (account.getIn(['relationship', 'muting'])) {
+ actionBtn = ;
+ } else if (!account.getIn(['relationship', 'blocking'])) {
+ actionBtn = ;
+ } else if (account.getIn(['relationship', 'blocking'])) {
+ actionBtn = ;
}
+ } else {
+ actionBtn = ;
}
return (
-
-
-
-
-
-
-
-
-
-
-
-
- {buttons}
+
+
+
+
-
-
+
+
+
+ {account.get('note').length > 0 && (
-
+ )}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {account.get('followers_count') < 0 ? '-' : }{' '}
+
+
+
+
+
+
+ {' '}
+
+
+
+
-
- {account.get('followers_count') < 0 ? '-' : }{' '}
-
-
-
-
-
- {account.get('last_status_at') === null ? (
-
- ) : (
-
- )}{' '}
-
-
-
+
+
+ {actionBtn}
diff --git a/app/javascript/flavours/glitch/features/directory/index.js b/app/javascript/flavours/glitch/features/directory/index.js
index cde5926e06e..87d9b36256e 100644
--- a/app/javascript/flavours/glitch/features/directory/index.js
+++ b/app/javascript/flavours/glitch/features/directory/index.js
@@ -10,9 +10,9 @@ import { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directo
import { List as ImmutableList } from 'immutable';
import AccountCard from './components/account_card';
import RadioButton from 'flavours/glitch/components/radio_button';
-import classNames from 'classnames';
import LoadMore from 'flavours/glitch/components/load_more';
import ScrollContainer from 'flavours/glitch/containers/scroll_container';
+import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
const messages = defineMessages({
title: { id: 'column.directory', defaultMessage: 'Browse profiles' },
@@ -129,7 +129,7 @@ class Directory extends React.PureComponent {
const pinned = !!columnId;
const scrollableArea = (
-
+
@@ -142,8 +142,10 @@ class Directory extends React.PureComponent {
-
- {accountIds.map(accountId =>
)}
+
+ {isLoading ?
: accountIds.map(accountId => (
+
+ ))}
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 73414785c2f..0873ac3001d 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -1236,6 +1236,11 @@ a.sparkline {
background: $ui-base-color;
border-radius: 4px;
+ &__permalink {
+ color: inherit;
+ text-decoration: none;
+ }
+
&__header {
padding: 4px;
border-radius: 4px;
@@ -1252,20 +1257,22 @@ a.sparkline {
}
&__title {
- margin-top: -25px;
+ margin-top: -(15px + 8px);
display: flex;
align-items: flex-end;
&__avatar {
- padding: 15px;
+ padding: 14px;
- img {
+ img,
+ .account__avatar {
display: block;
margin: 0;
width: 56px;
height: 56px;
- background: darken($ui-base-color, 8%);
+ background-color: darken($ui-base-color, 8%);
border-radius: 8px;
+ border: 1px solid $ui-base-color;
}
}
@@ -1273,30 +1280,34 @@ a.sparkline {
color: $darker-text-color;
padding-bottom: 15px;
font-size: 15px;
+ line-height: 20px;
bdi {
display: block;
color: $primary-text-color;
- font-weight: 500;
+ font-weight: 700;
}
}
}
&__bio {
padding: 0 15px;
+ margin: 8px 0;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
- max-height: 18px * 2;
+ max-height: 21px * 2;
position: relative;
+ font-size: 15px;
+ line-height: 21px;
&::after {
display: block;
content: "";
width: 50px;
- height: 18px;
+ height: 21px;
position: absolute;
- bottom: 0;
+ bottom: 8px;
right: 15px;
background: linear-gradient(to left, $ui-base-color, transparent);
pointer-events: none;
@@ -1309,10 +1320,6 @@ a.sparkline {
&:hover {
text-decoration: underline;
-
- .fa {
- color: lighten($dark-text-color, 7%);
- }
}
&.mention {
@@ -1329,12 +1336,21 @@ a.sparkline {
&__actions {
display: flex;
+ justify-content: space-between;
align-items: center;
- padding-top: 10px;
&__button {
- flex: 0 0 auto;
+ flex-shrink: 1;
padding: 0 15px;
+ overflow: hidden;
+
+ .button {
+ min-width: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 100%;
+ }
}
}
@@ -1343,19 +1359,23 @@ a.sparkline {
display: grid;
grid-auto-columns: minmax(0, 1fr);
grid-auto-flow: column;
+ max-width: 340px;
+ min-width: 65px * 3;
&__item {
- padding: 15px;
+ padding: 15px 0;
text-align: center;
color: $primary-text-color;
font-weight: 600;
font-size: 15px;
+ line-height: 21px;
small {
display: block;
color: $darker-text-color;
font-weight: 400;
font-size: 13px;
+ line-height: 18px;
}
}
}
diff --git a/app/javascript/flavours/glitch/styles/components/directory.scss b/app/javascript/flavours/glitch/styles/components/directory.scss
index b0ad5a88ae4..b48c6c102b4 100644
--- a/app/javascript/flavours/glitch/styles/components/directory.scss
+++ b/app/javascript/flavours/glitch/styles/components/directory.scss
@@ -1,133 +1,17 @@
-.directory {
- &__list {
- width: 100%;
- margin: 10px 0;
- transition: opacity 100ms ease-in;
+.scrollable .account-card {
+ margin: 10px;
+ background: lighten($ui-base-color, 8%);
+}
- &.loading {
- opacity: 0.7;
- }
-
- @media screen and (max-width: $no-gap-breakpoint) {
- margin: 0;
- }
+.scrollable .account-card__title__avatar {
+ img,
+ .account__avatar {
+ border-color: lighten($ui-base-color, 8%);
}
+}
- &__card {
- box-sizing: border-box;
- margin-bottom: 10px;
-
- &__img {
- height: 125px;
- position: relative;
- background: darken($ui-base-color, 12%);
- overflow: hidden;
-
- img {
- display: block;
- width: 100%;
- height: 100%;
- margin: 0;
- object-fit: cover;
- }
- }
-
- &__bar {
- display: flex;
- align-items: center;
- background: lighten($ui-base-color, 4%);
- padding: 10px;
-
- &__name {
- flex: 1 1 auto;
- display: flex;
- align-items: center;
- text-decoration: none;
- overflow: hidden;
- }
-
- &__relationship {
- width: 23px;
- min-height: 1px;
- flex: 0 0 auto;
- }
-
- .avatar {
- flex: 0 0 auto;
- width: 48px;
- height: 48px;
- padding-top: 2px;
-
- img {
- width: 100%;
- height: 100%;
- display: block;
- margin: 0;
- border-radius: 4px;
- background: darken($ui-base-color, 8%);
- object-fit: cover;
- }
- }
-
- .display-name {
- margin-left: 15px;
- text-align: left;
-
- strong {
- font-size: 15px;
- color: $primary-text-color;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- span {
- display: block;
- font-size: 14px;
- color: $darker-text-color;
- font-weight: 400;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- }
- }
-
- &__extra {
- background: $ui-base-color;
- display: flex;
- align-items: center;
- justify-content: center;
-
- .accounts-table__count {
- width: 33.33%;
- flex: 0 0 auto;
- padding: 15px 0;
- }
-
- .account__header__content {
- box-sizing: border-box;
- padding: 15px 10px;
- border-bottom: 1px solid lighten($ui-base-color, 8%);
- width: 100%;
- min-height: 18px + 30px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- p {
- display: none;
-
- &:first-child {
- display: inline;
- }
- }
-
- br {
- display: none;
- }
- }
- }
- }
+.scrollable .account-card__bio::after {
+ background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
}
.filter-form {
@@ -135,6 +19,7 @@
&__column {
padding: 10px 15px;
+ padding-bottom: 0;
}
.radio-button {
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index b6372c096b9..7364eba91ad 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -41,7 +41,7 @@
cursor: pointer;
display: inline-block;
font-family: inherit;
- font-size: 17px;
+ font-size: 15px;
font-weight: 500;
letter-spacing: 0;
line-height: 22px;
diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss
index edf705b5fdb..db510f1f483 100644
--- a/app/javascript/flavours/glitch/styles/components/single_column.scss
+++ b/app/javascript/flavours/glitch/styles/components/single_column.scss
@@ -94,17 +94,7 @@
padding: 0;
}
- .directory__list {
- display: grid;
- grid-gap: 10px;
- grid-template-columns: minmax(0, 50%) minmax(0, 50%);
-
- @media screen and (max-width: $no-gap-breakpoint) {
- display: block;
- }
- }
-
- .directory__card {
+ .account-card {
margin-bottom: 0;
}
diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss
index eb82157c8b7..98a1288ebbb 100644
--- a/app/javascript/flavours/glitch/styles/containers.scss
+++ b/app/javascript/flavours/glitch/styles/containers.scss
@@ -411,14 +411,6 @@
}
}
- .directory__card {
- border-radius: 4px;
-
- @media screen and (max-width: $no-gap-breakpoint) {
- border-radius: 0;
- }
- }
-
.page-header {
@media screen and (max-width: $no-gap-breakpoint) {
border-bottom: 0;
@@ -841,19 +833,21 @@
grid-gap: 10px;
grid-template-columns: minmax(0, 50%) minmax(0, 50%);
+ .account-card {
+ display: flex;
+ flex-direction: column;
+ }
+
@media screen and (max-width: $no-gap-breakpoint) {
display: block;
- }
- .icon-button {
- font-size: 18px;
+ .account-card {
+ margin-bottom: 10px;
+ display: block;
+ }
}
}
- .directory__card {
- margin-bottom: 0;
- }
-
.card-grid {
display: flex;
flex-wrap: wrap;
diff --git a/app/javascript/flavours/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss
index afa05d93e55..d0153c9f9eb 100644
--- a/app/javascript/flavours/glitch/styles/rtl.scss
+++ b/app/javascript/flavours/glitch/styles/rtl.scss
@@ -12,11 +12,6 @@ body.rtl {
margin-left: 10px;
}
- .directory__card__bar .display-name {
- margin-left: 0;
- margin-right: 15px;
- }
-
.display-name {
text-align: right;
}