diff --git a/components/core/Profile.js b/components/core/Profile.js index 9ced9fd8..6b4adfdd 100644 --- a/components/core/Profile.js +++ b/components/core/Profile.js @@ -4,9 +4,10 @@ import * as Strings from "~/common/strings"; import { css } from "@emotion/core"; import { ProcessedText } from "~/components/system/components/Typography"; +import { SceneUtils } from "three"; import SlatePreviewBlocks from "~/components/core/SlatePreviewBlock"; -import { SceneUtils } from "three"; +import SlatePreviewBlocksExternal from "~/components/core/SlatePreviewBlockExternal"; const STYLES_PROFILE_INTERNAL = css` width: 100%; @@ -17,7 +18,7 @@ const STYLES_PROFILE_INTERNAL = css` const STYLES_PROFILE = css` width: 100%; - padding: 80px 64px 0px 64px; + padding: 64px 64px 0px 64px; overflow-wrap: break-word; white-space: pre-wrap; flex-shrink: 0; @@ -30,11 +31,12 @@ const STYLES_PROFILE = css` const STYLES_PROFILE_INFO = css` display: flex; line-height: 1.3; - margin: 0 auto; - width: 100%; - max-width: ${Constants.sizes.desktop}px; + width: 50%; overflow-wrap: break-word; white-space: pre-wrap; + @media (max-width: ${Constants.sizes.tablet}px) { + width: 100%; + } `; const STYLES_PROFILE_INFO_INTERNAL = css` @@ -98,7 +100,7 @@ const STYLES_NAME = css` overflow-wrap: break-word; white-space: pre-wrap; @media (max-width: ${Constants.sizes.mobile}px) { - margin-bottom: 16px; + margin-bottom: 8px; margin-right: 0; } `; @@ -112,9 +114,6 @@ const STYLES_NAME_INTERNAL = css` margin-top: 8px; overflow-wrap: break-word; white-space: pre-wrap; - @media (max-width: ${Constants.sizes.mobile}px) { - margin-bottom: 16px; - } `; const STYLES_DESCRIPTION = css` @@ -130,7 +129,7 @@ const STYLES_DESCRIPTION = css` const STYLES_STATS = css` font-size: ${Constants.typescale.lvl0}; line-height: 1.5; - margin-top: 24px; + margin: 12px 0 24px 0; display: flex; width: 100%; flex-wrap: wrap; @@ -140,9 +139,6 @@ const STYLES_STAT = css` margin-right: 16px; width: 112px; flex-shrink: 0; - margin-bottom: 16px; - ${"" /* border-left: 1px solid ${Constants.system.darkGray}; -padding-left: 12px; */}; `; const STYLES_BUTTON = css` @@ -167,7 +163,9 @@ const STYLES_FLEX = css` display: flex; margin-bottom: 12px; align-items: baseline; - @media (max-width: ${Constants.sizes.mobile}px) { + justify-content: space-between; + flex-wrap: wrap; + @media (max-width: ${Constants.sizes.tablet}px) { display: block; } `; @@ -193,19 +191,8 @@ export default class Profile extends React.Component {
{Strings.getPresentationName(data)}
+
{this.props.buttons}
- - {data.data.body ? ( -
- -
- ) : null - //
- // - //
- } - -
{this.props.buttons}
Public data
@@ -220,6 +207,12 @@ export default class Profile extends React.Component {
0
*/}
+ + {data.data.body ? ( +
+ +
+ ) : null}
) : ( @@ -232,20 +225,11 @@ export default class Profile extends React.Component {
{Strings.getPresentationName(data)}
-
- {data.data.body ? ( -
- +
+ + Follow +
- ) : null - //
- // - //
- } -
- - Follow -
@@ -263,6 +247,11 @@ export default class Profile extends React.Component {
0
*/}
+ {data.data.body ? ( +
+ +
+ ) : null}
@@ -282,9 +271,8 @@ export default class Profile extends React.Component { ) : (
{data.slates && data.slates.length ? ( - , + ]; + } else { + let trimmed = + this.props.slate.data.objects.length > numItems + ? this.props.slate.data.objects.slice(1, numItems) + : this.props.slate.data.objects.slice(1, this.props.slate.data.objects.length); + objects = trimmed.map((each) => ( +
+ +
+ )); + } + return ( +
+ {objects} +
+ ); + } +} + +const STYLES_BLOCK = css` + box-shadow: 0 0 0 0.5px ${Constants.system.lightBorder} inset, + 0 0 40px 0 ${Constants.system.shadow}; + padding: 16px; + font-size: 12px; + text-align: left; + cursor: pointer; + height: 480px; + width: 100%; + + @media (max-width: ${Constants.sizes.mobile}px) { + margin: 24px auto; + height: auto; + } +`; + +const STYLES_TITLE_LINE = css` + width: 100%; + display: flex; + align-items: center; + font-size: ${Constants.typescale.lvl1}; + margin-bottom: 8px; + overflow-wrap: break-word; +`; + +const STYLES_BODY = css` + font-family: ${Constants.font.text}; + font-size: ${Constants.typescale.lvl1}; + margin-bottom: 24px; + white-space: pre-wrap; + word-wrap: break-word; + + @media (max-width: ${Constants.sizes.mobile}px) { + display: none; + } +`; + +const STYLES_TITLE = css` + font-size: ${Constants.typescale.lvl2}; + font-family: ${Constants.font.semiBold}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 16px 0 0 0; + + @media (max-width: ${Constants.sizes.mobile}px) { + font-size: ${Constants.typescale.lvl1}; + } +`; + +const STYLES_PREVIEW = css` + display: flex; +`; + +const STYLES_INFO = css` + display: flex; +`; + +const STYLES_OBJECT_COUNT = css` + margin-top: 18px; + width: 15%; + font-size: ${Constants.typescale.lvl0}; + color: ${Constants.system.darkGray}; +`; + +export class SlatePreviewBlock extends React.Component { + _ref; + _test; + + state = { + showMenu: false, + copyValue: "", + windowWidth: 360, + }; + + componentDidMount = () => { + this.calculateWidth(); + window.addEventListener("resize", this.calculateWidth); + }; + + componentWillUnmount = () => { + window.removeEventListener("resize", this.calculateWidth); + }; + + calculateWidth = () => { + this.setState({ windowWidth: window.innerWidth }); + }; + + _handleCopy = (e, value) => { + e.stopPropagation(); + this.setState({ copyValue: value }, () => { + this._ref.select(); + document.execCommand("copy"); + this._handleHide(); + }); + }; + + _handleClick = (e) => { + e.stopPropagation(); + if (this.state.showMenu) { + this._handleHide(); + return; + } + this.setState({ showMenu: true }); + // dispatchCustomEvent({ + // name: "show-tooltip", + // detail: { + // id: `slate-tooltip-${this.props.slate.id}`, + // }, + // }); + }; + + _handleHide = (e) => { + this.setState({ showMenu: false }); + // dispatchCustomEvent({ + // name: "hide-tooltip", + // detail: { + // id: `slate-tooltip-${this.props.slate.id}`, + // }, + // }); + }; + + render() { + let first = this.props.slate.data.objects ? this.props.slate.data.objects[0] : null; + console.log(this.props.slate.data); + + return ( +
+ + {this.props.slate.data.objects.length === 1 ? ( +
+ +
+ ) : first ? ( +
+
+ +
+
+ +
+
+ ) : ( +
+ )} +
+
{this.props.slate.data.objects.length}
+
+
+
{this.props.slate.data.name}
+
+ {this.props.slate.data.body ? ( +
+ + + +
+ ) : ( +
+ )} +
+
+ + + +
+ {first ? ( + + ) : ( +
+ )} +
+
+
{this.props.slate.data.objects.length}
+
+
+
{this.props.slate.data.name}
+
+
+
+ +
+ ); + } +} + +const STYLES_LINK = css` + color: ${Constants.system.black}; + text-decoration: none; + width: calc(33.33% - 16px); + margin-bottom: 24px; + + @media (max-width: ${Constants.sizes.tablet}px) { + width: 50%; + } + + @media (max-width: ${Constants.sizes.mobile}px) { + width: 100%; + } +`; + +const STYLES_SLATES = css` + display: flex; + flex-direction: row; + flex-wrap: wrap; + overflow: hidden; + padding-bottom: 48px; + justify-content: space-between; + + @media (max-width: ${Constants.sizes.mobile}px) { + display: block; + } +`; + +export default class SlatePreviewBlocksExternal extends React.Component { + state = { + imageSize: 56, + }; + + componentDidMount = () => { + this.calculateWidth(); + this.debounceInstance = this.debounce(this.calculateWidth, 350); + window.addEventListener("resize", this.debounceInstance); + }; + + componentWillUnmount = () => { + window.removeEventListener("resize", this.debounceInstance); + }; + + debounce = (func, wait) => { + Window.debounce(func, wait); + }; + + calculateWidth = () => { + let windowWidth = window.innerWidth; + if (windowWidth > Constants.sizes.mobile) { + if (this.props.external) { + windowWidth -= 48; + } else { + windowWidth -= Constants.sizes.navigation + 96; + } + windowWidth = Math.min(windowWidth, Constants.sizes.desktop); + windowWidth -= 80; //NOTE(martina): 48px padding on scene page, 40px padding on block + for (let i = this.props.numItems || 5; i > 0; i--) { + let width = (windowWidth - MARGIN * 2 * (i - 1)) / i; + if (width < MIN_WIDTH) { + continue; + } + this.setState({ imageSize: width }); + return; + } + } + this.setState({ imageSize: windowWidth - 48 - 32 }); //NOTE(martina): 24px padding on scene page, 16px padding on block on mobile + }; + + render() { + return ( +
+ {this.props.slates.map((slate) => ( + + + + ))} +
+ ); + } +} diff --git a/components/core/ViewAll.js b/components/core/ViewAll.js index 5a4862c9..46f7082a 100644 --- a/components/core/ViewAll.js +++ b/components/core/ViewAll.js @@ -10,9 +10,8 @@ const STYLES_VIEW_BUTTON = css` font-size: 14px; margin-top: 4px; color: ${Constants.system.grayBlack}; - text-decoration: underline; cursor: pointer; - width: 64px; + width: 120px; `; export const ViewAllButton = (props) => { @@ -21,6 +20,7 @@ export const ViewAllButton = (props) => { const maxCharacter = props.maxCharacter; const displayText = isTruncated ? text.slice(0, maxCharacter) : text; const textCount = text.length; + const noButton = props.noButton; return (
@@ -28,9 +28,11 @@ export const ViewAllButton = (props) => { {textCount > maxCharacter ? ( {isTruncated ? "..." : ""} -
setTruncated(!isTruncated)}> - {isTruncated ? "view all" : "view less"} -
+ {noButton ? null : ( +
setTruncated(!isTruncated)}> + {isTruncated ? "+ View all" : "- View less"} +
+ )}
) : ( "" diff --git a/pages/_/profile.js b/pages/_/profile.js index 4818696f..fa29cec0 100644 --- a/pages/_/profile.js +++ b/pages/_/profile.js @@ -37,11 +37,11 @@ export default class ProfilePage extends React.Component { url={url} image={this.props.creator.data.photo} > +
- -
+ ); }