Skip to content

Commit ae0e265

Browse files
authored
Merge pull request #3681 from benjiwheeler/show-creator
added author-info, user-avatar components
2 parents a6e7e85 + 358600d commit ae0e265

File tree

15 files changed

+206
-27
lines changed

15 files changed

+206
-27
lines changed

src/components/action-menu/action-menu.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@import "../../css/colors.css";
2+
@import "../../css/units.css";
23
@import "../../css/z-index.css";
34

45
$main-button-size: 2.75rem;
@@ -153,7 +154,7 @@ button::-moz-focus-inner {
153154

154155
.tooltip {
155156
border: 1px solid hsla(0, 0%, 0%, .1) !important;
156-
border-radius: .25rem !important;
157+
border-radius: $form-radius !important;
157158
box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;
158159
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important;
159160
z-index: $z-index-tooltip !important;

src/components/button/button.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
@import "../../css/units.css";
2+
13
.outlined-button {
24
cursor: pointer;
3-
border-radius: .25rem;
5+
border-radius: $form-radius;
46
font-weight: bold;
57
display: flex;
68
flex-direction: row;

src/components/coming-soon/coming-soon.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
*/
66

77
@import "../../css/colors.css";
8+
@import "../../css/units.css";
89
@import "../../css/z-index.css";
910

1011
.coming-soon {
1112
background-color: $data-primary !important;
1213
border: 1px solid $ui-black-transparent !important;
13-
border-radius: .25rem !important;
14+
border-radius: $form-radius !important;
1415
box-shadow: 0 0 .5rem $ui-black-transparent !important;
1516
padding: .75rem 1rem !important;
1617
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important;
@@ -25,7 +26,7 @@
2526
border-left: 0 !important;
2627
border-bottom: 0 !important;
2728
border-right: 1px solid $ui-black-transparent !important;
28-
border-radius: .25rem;
29+
border-radius: $form-radius;
2930
background-color: $data-primary !important;
3031
height: 1rem !important;
3132
width: 1rem !important;

src/components/gui/gui.jsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,17 @@ const GUIComponent = props => {
5858
accountNavOpen,
5959
activeTabIndex,
6060
alertsVisible,
61+
authorId,
62+
authorThumbnailUrl,
63+
authorUsername,
6164
basePath,
6265
backdropLibraryVisible,
6366
backpackHost,
6467
backpackVisible,
6568
blocksTabVisible,
6669
cardsVisible,
6770
canCreateNew,
71+
canEditTitle,
6872
canRemix,
6973
canSave,
7074
canCreateCopy,
@@ -180,8 +184,12 @@ const GUIComponent = props => {
180184
) : null}
181185
<MenuBar
182186
accountNavOpen={accountNavOpen}
187+
authorId={authorId}
188+
authorThumbnailUrl={authorThumbnailUrl}
189+
authorUsername={authorUsername}
183190
canCreateCopy={canCreateCopy}
184191
canCreateNew={canCreateNew}
192+
canEditTitle={canEditTitle}
185193
canRemix={canRemix}
186194
canSave={canSave}
187195
canShare={canShare}
@@ -324,13 +332,17 @@ const GUIComponent = props => {
324332
GUIComponent.propTypes = {
325333
accountNavOpen: PropTypes.bool,
326334
activeTabIndex: PropTypes.number,
335+
authorId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), // can be false
336+
authorThumbnailUrl: PropTypes.string,
337+
authorUsername: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), // can be false
327338
backdropLibraryVisible: PropTypes.bool,
328339
backpackHost: PropTypes.string,
329340
backpackVisible: PropTypes.bool,
330341
basePath: PropTypes.string,
331342
blocksTabVisible: PropTypes.bool,
332343
canCreateCopy: PropTypes.bool,
333344
canCreateNew: PropTypes.bool,
345+
canEditTitle: PropTypes.bool,
334346
canRemix: PropTypes.bool,
335347
canSave: PropTypes.bool,
336348
canShare: PropTypes.bool,
@@ -374,6 +386,7 @@ GUIComponent.defaultProps = {
374386
backpackVisible: false,
375387
basePath: './',
376388
canCreateNew: false,
389+
canEditTitle: false,
377390
canRemix: false,
378391
canSave: false,
379392
canCreateCopy: false,

src/components/menu-bar/account-nav.css

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,8 @@
2828
}
2929

3030
.user-info .avatar {
31-
margin-right: calc($space * .8125);
32-
border-radius: $form-radius;
3331
width: 2rem;
3432
height: 2rem;
35-
vertical-align: middle;
3633
}
3734

3835
[dir="ltr"] .user-info .dropdown-caret-position {
@@ -45,6 +42,12 @@
4542

4643
.user-info .dropdown-caret-position {
4744
display: inline-block;
48-
padding-bottom: .125rem;
45+
padding-bottom: .0625rem;
4946
vertical-align: middle;
5047
}
48+
49+
.user-info .profile-name {
50+
font-size: .75rem;
51+
line-height: .9375rem;
52+
font-weight: bold;
53+
}

src/components/menu-bar/account-nav.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import React from 'react';
1212
import MenuBarMenu from './menu-bar-menu.jsx';
1313
import {MenuSection} from '../menu/menu.jsx';
1414
import MenuItemContainer from '../../containers/menu-item.jsx';
15+
import UserAvatar from './user-avatar.jsx';
1516
import dropdownCaret from './dropdown-caret.svg';
1617

1718
import styles from './account-nav.css';
@@ -40,9 +41,9 @@ const AccountNavComponent = ({
4041
onMouseUp={onClick}
4142
>
4243
{thumbnailUrl ? (
43-
<img
44+
<UserAvatar
4445
className={styles.avatar}
45-
src={thumbnailUrl}
46+
imageUrl={thumbnailUrl}
4647
/>
4748
) : null}
4849
<span className={styles.profileName}>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
@import "../../css/colors.css";
2+
@import "../../css/units.css";
3+
4+
.author-info {
5+
color: $ui-white;
6+
font-family: "Helvetica Neue";
7+
display: flex;
8+
justify-content: start;
9+
align-items: center;
10+
cursor: default;
11+
}
12+
13+
.avatar {
14+
margin-right: .5625rem;
15+
}
16+
17+
.project-title {
18+
max-width: $menu-bar-item-max-width;
19+
display: block;
20+
overflow: hidden;
21+
font-size: $menu-bar-large-font-size;
22+
font-weight: bold;
23+
text-overflow: ellipsis;
24+
white-space: nowrap;
25+
}
26+
27+
.username-line {
28+
max-width: $menu-bar-item-max-width;
29+
font-size: $menu-bar-standard-font-size;
30+
display: block;
31+
overflow: hidden;
32+
font-weight: normal;
33+
text-overflow: ellipsis;
34+
white-space: nowrap;
35+
}
36+
37+
.username {
38+
font-weight: bold;
39+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import PropTypes from 'prop-types';
2+
import React from 'react';
3+
import classNames from 'classnames';
4+
import {FormattedMessage, injectIntl} from 'react-intl';
5+
import UserAvatar from './user-avatar.jsx';
6+
7+
import styles from './author-info.css';
8+
9+
const AuthorInfo = ({
10+
className,
11+
imageUrl,
12+
projectTitle,
13+
// TODO: use userId to link to user's profile
14+
userId, // eslint-disable-line no-unused-vars
15+
username
16+
}) => (
17+
<div
18+
className={classNames(
19+
className,
20+
styles.authorInfo
21+
)}
22+
>
23+
<UserAvatar
24+
className={styles.avatar}
25+
imageUrl={imageUrl}
26+
/>
27+
<div className={styles.titleAuthor}>
28+
<span className={styles.projectTitle}>
29+
{projectTitle}
30+
</span>
31+
<div>
32+
<span className={styles.usernameLine}>
33+
<FormattedMessage
34+
defaultMessage="by {username}"
35+
description="Shows that a project was created by this user"
36+
id="gui.authorInfo.byUser"
37+
values={{
38+
username: <span className={styles.username}>{username}</span>
39+
}}
40+
/>
41+
</span>
42+
</div>
43+
</div>
44+
</div>
45+
);
46+
47+
AuthorInfo.propTypes = {
48+
className: PropTypes.string,
49+
imageUrl: PropTypes.string,
50+
projectTitle: PropTypes.string,
51+
userId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
52+
username: PropTypes.oneOfType([PropTypes.string, PropTypes.bool])
53+
};
54+
55+
export default injectIntl(AuthorInfo);

src/components/menu-bar/menu-bar.css

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
width: 100%;
2626
*/
2727
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
28-
font-size: .75rem;
28+
font-size: $menu-bar-standard-font-size;
2929
font-weight: bold;
3030
background-color: $motion-primary;
3131
color: $ui-white;
@@ -83,7 +83,7 @@
8383
}
8484

8585
.menu-bar-item.growable {
86-
max-width: 12rem;
86+
max-width: $menu-bar-item-max-width;
8787
flex: 1;
8888
}
8989

@@ -126,8 +126,13 @@
126126
height: 34px;
127127
}
128128

129+
.author-info {
130+
margin-left: .25rem;
131+
margin-right: .6875rem;
132+
}
133+
129134
.menu-bar-button {
130-
height: 2rem;
135+
height: $menu-bar-button-size;
131136
}
132137

133138
.remix-button {
@@ -170,8 +175,8 @@
170175

171176
.profile-icon {
172177
margin: 0 .25rem;
173-
width: 2rem;
174-
border-radius: 0.25rem;
178+
width: $menu-bar-button-size;
179+
border-radius: $form-radius;
175180
}
176181

177182
.dropdown-caret-icon {

src/components/menu-bar/menu-bar.jsx

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import ProjectWatcher from '../../containers/project-watcher.jsx';
1717
import MenuBarMenu from './menu-bar-menu.jsx';
1818
import {MenuItem, MenuSection} from '../menu/menu.jsx';
1919
import ProjectTitleInput from './project-title-input.jsx';
20+
import AuthorInfo from './author-info.jsx';
2021
import AccountNav from '../../containers/account-nav.jsx';
2122
import LoginDropdown from './login-dropdown.jsx';
2223
import SB3Downloader from '../../containers/sb3-downloader.jsx';
@@ -448,17 +449,27 @@ class MenuBar extends React.Component {
448449
<FormattedMessage {...ariaMessages.tutorials} />
449450
</div>
450451
<Divider className={classNames(styles.divider)} />
451-
<div className={classNames(styles.menuBarItem, styles.growable)}>
452-
<MenuBarItemTooltip
453-
enable
454-
id="title-field"
455-
>
456-
<ProjectTitleInput
457-
className={classNames(styles.titleFieldGrowable)}
458-
onUpdateProjectTitle={this.props.onUpdateProjectTitle}
459-
/>
460-
</MenuBarItemTooltip>
461-
</div>
452+
{this.props.canEditTitle ? (
453+
<div className={classNames(styles.menuBarItem, styles.growable)}>
454+
<MenuBarItemTooltip
455+
enable
456+
id="title-field"
457+
>
458+
<ProjectTitleInput
459+
className={classNames(styles.titleFieldGrowable)}
460+
onUpdateProjectTitle={this.props.onUpdateProjectTitle}
461+
/>
462+
</MenuBarItemTooltip>
463+
</div>
464+
) : ((this.props.authorUsername && this.props.authorUsername !== this.props.username) ? (
465+
<AuthorInfo
466+
className={styles.authorInfo}
467+
imageUrl={this.props.authorThumbnailUrl}
468+
projectTitle={this.props.projectTitle}
469+
userId={this.props.authorId}
470+
username={this.props.authorUsername}
471+
/>
472+
) : null)}
462473
<div className={classNames(styles.menuBarItem)}>
463474
{this.props.canShare ? (
464475
(this.props.isShowingProject || this.props.isUpdating) && (
@@ -667,8 +678,12 @@ class MenuBar extends React.Component {
667678

668679
MenuBar.propTypes = {
669680
accountMenuOpen: PropTypes.bool,
681+
authorId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
682+
authorThumbnailUrl: PropTypes.string,
683+
authorUsername: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
670684
canCreateCopy: PropTypes.bool,
671685
canCreateNew: PropTypes.bool,
686+
canEditTitle: PropTypes.bool,
672687
canRemix: PropTypes.bool,
673688
canSave: PropTypes.bool,
674689
canShare: PropTypes.bool,
@@ -704,6 +719,7 @@ MenuBar.propTypes = {
704719
onShare: PropTypes.func,
705720
onToggleLoginOpen: PropTypes.func,
706721
onUpdateProjectTitle: PropTypes.func,
722+
projectTitle: PropTypes.string,
707723
renderLogin: PropTypes.func,
708724
sessionExists: PropTypes.bool,
709725
showComingSoon: PropTypes.bool,
@@ -726,6 +742,7 @@ const mapStateToProps = state => {
726742
isShowingProject: getIsShowingProject(loadingState),
727743
languageMenuOpen: languageMenuOpen(state),
728744
loginMenuOpen: loginMenuOpen(state),
745+
projectTitle: state.scratchGui.projectTitle,
729746
sessionExists: state.session && typeof state.session.session !== 'undefined',
730747
username: user ? user.username : null
731748
};

0 commit comments

Comments
 (0)