From 014da60b76d9ccca4de4c50dd11e707533975b15 Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Thu, 11 Apr 2019 07:28:18 +1200 Subject: [PATCH] Beginning the migration to functional components --- src/js/components/Dater.js | 227 +++++++++++++++----------------- src/js/components/NiceNumber.js | 50 +++---- src/js/views/Artist.js | 2 - 3 files changed, 126 insertions(+), 153 deletions(-) diff --git a/src/js/components/Dater.js b/src/js/components/Dater.js index 70e76ec0..d8a5f5e8 100755 --- a/src/js/components/Dater.js +++ b/src/js/components/Dater.js @@ -1,130 +1,115 @@ -import React from 'react' +import React, { memo } from 'react' -export default class Dater extends React.Component{ +/** + * Format time duration + * + * @param milliseconds int + * @return string (HH:mm:ss) + **/ +const durationTime = (milliseconds = null) => { + if (!milliseconds ) return null - constructor(props){ - super(props); - } + var string = ''; + var total_hours, total_minutes, total_seconds, minutes, seconds; - /** - * Format time duration - * - * @param milliseconds int - * @return string (HH:mm:ss) - **/ - durationTime(milliseconds = null){ - if (!milliseconds ) return null + // get total values for each + total_seconds = Math.floor(milliseconds / 1000 ) + total_minutes = Math.floor(milliseconds / (1000 * 60) ) + total_hours = Math.floor(milliseconds / (1000 * 60 * 60)) - var string = ''; - var total_hours, total_minutes, total_seconds, minutes, seconds; + // get left-over number of seconds + seconds = total_seconds - (total_minutes * 60 ) + if (seconds <= 9) seconds = '0'+ seconds + if (seconds == 0) seconds = '00' - // get total values for each - total_seconds = Math.floor(milliseconds / 1000 ) - total_minutes = Math.floor(milliseconds / (1000 * 60) ) - total_hours = Math.floor(milliseconds / (1000 * 60 * 60)) + // get left-over number of minutes + minutes = total_minutes - (total_hours * 60 ) + if (minutes <= 9 && total_hours) minutes = '0'+ minutes + if (minutes == 0) minutes = '0' - // get left-over number of seconds - seconds = total_seconds - (total_minutes * 60 ) - if (seconds <= 9) seconds = '0'+ seconds - if (seconds == 0) seconds = '00' - - // get left-over number of minutes - minutes = total_minutes - (total_hours * 60 ) - if (minutes <= 9 && total_hours) minutes = '0'+ minutes - if (minutes == 0) minutes = '0' - - if (total_hours) string += total_hours+':' - if (minutes) string += minutes+':' - if (seconds) string += seconds - - return string - } - - /** - * Format time duration as a human-friendly sentence - * - * @param milliseconds int - * @return string (eg 2+ hours) - **/ - durationSentence(milliseconds = null){ - if (!milliseconds ) return null - - var string = ''; - var total_hours, total_minutes, total_seconds, minutes, seconds; - - // get total values for each - total_seconds = Math.floor(milliseconds / 1000 ) - total_minutes = Math.floor(milliseconds / (1000 * 60) ) - total_hours = Math.floor(milliseconds / (1000 * 60 * 60)) - - if (total_hours > 1 ) return total_hours+'+ hrs' - if (total_minutes > 1 ) return total_minutes+' mins' - if (total_seconds ) return total_seconds+' sec' - } - - calculate(){ - switch(this.props.type){ - - case 'total-time': - var duration = 0; - var tracks = this.props.data - for(var i = 0; i < tracks.length; i++){ - if (tracks[i].duration ){ - duration += parseInt(tracks[i].duration); - } - } - return this.durationSentence(duration); - - case 'length': - return this.durationTime(this.props.data); - - case 'date': - - // A four-character date indicates just a year (rather than a full date) - if (this.props.data.length == 4){ - return this.props.data; - - // Digest as a date string - } else { - var date = new Date(this.props.data); - return date.getDate()+'/'+(date.getMonth()+1)+'/'+date.getFullYear(); - } - - case 'ago': - var date = new Date(this.props.data) - var diff = new Date() - date - - var seconds = Math.floor(diff / 1000) - var minutes = Math.floor(diff / (1000 * 60)) - var hours = Math.floor(diff / (1000 * 60 * 60)) - var days = Math.floor(diff / (1000 * 60 * 60 * 24)) - - if (seconds < 60){ - return seconds + " seconds"; - }else if (minutes < 60){ - return minutes + " minutes"; - }else if (hours < 24){ - return hours + " hours"; - } else { - return days + " days" - }; - - default: - return null; - } - } - - render(){ - if (!this.props.data){ - return null; - } - - var calculation = this.calculate(); - if (!calculation){ - return null; - } + if (total_hours) string += total_hours+':' + if (minutes) string += minutes+':' + if (seconds) string += seconds - return {calculation}; - } + return string } + +/** + * Format time duration as a human-friendly sentence + * + * @param milliseconds int + * @return string (eg 2+ hours) + **/ +const durationSentence = (milliseconds = null) => { + if (!milliseconds ) return null + + var string = ''; + var total_hours, total_minutes, total_seconds, minutes, seconds; + + // get total values for each + total_seconds = Math.floor(milliseconds / 1000 ) + total_minutes = Math.floor(milliseconds / (1000 * 60) ) + total_hours = Math.floor(milliseconds / (1000 * 60 * 60)) + + if (total_hours > 1 ) return total_hours+'+ hrs' + if (total_minutes > 1 ) return total_minutes+' mins' + if (total_seconds ) return total_seconds+' sec' +} + +export default memo((props) => { + + if (!props.data){ + return null; + } + + switch(props.type){ + + case 'total-time': + var duration = 0; + var tracks = props.data + for(var i = 0; i < tracks.length; i++){ + if (tracks[i].duration ){ + duration += parseInt(tracks[i].duration); + } + } + return durationSentence(duration); + + case 'length': + return durationTime(props.data); + + case 'date': + + // A four-character date indicates just a year (rather than a full date) + if (props.data.length == 4){ + return props.data; + + // Digest as a date string + } else { + var date = new Date(props.data); + return date.getDate()+'/'+(date.getMonth()+1)+'/'+date.getFullYear(); + } + + case 'ago': + var date = new Date(props.data) + var diff = new Date() - date + + var seconds = Math.floor(diff / 1000) + var minutes = Math.floor(diff / (1000 * 60)) + var hours = Math.floor(diff / (1000 * 60 * 60)) + var days = Math.floor(diff / (1000 * 60 * 60 * 24)) + + if (seconds < 60){ + return seconds + " seconds"; + }else if (minutes < 60){ + return minutes + " minutes"; + }else if (hours < 24){ + return hours + " hours"; + } else { + return days + " days" + }; + + default: + return null; + } +}); diff --git a/src/js/components/NiceNumber.js b/src/js/components/NiceNumber.js index 6194782b..016bfc97 100755 --- a/src/js/components/NiceNumber.js +++ b/src/js/components/NiceNumber.js @@ -1,35 +1,25 @@ -import React from 'react' +import React, { memo } from 'react' -export default class NiceNumber extends React.Component{ +export default memo((props) => { - constructor(props){ - super(props); + let formatted = parseInt(props.value); + + // > 1 million + if (formatted > 1000000){ + formatted = formatted / 1000000; + formatted = Math.round( formatted * 10 ) / 10; + formatted = formatted+'m'; + + // > 1 thousand + } else if (formatted > 1000){ + formatted = formatted / 1000; + formatted = Math.round( formatted * 10 ) / 10; + formatted = formatted+'k'; + + } else { + formatted = formatted.toLocaleString(); } - format(){ - var formatted = parseInt(this.props.value); - - // > 1 million - if (formatted > 1000000){ - formatted = formatted / 1000000; - formatted = Math.round( formatted * 10 ) / 10; - formatted = formatted+'m'; - - // > 1 thousand - } else if (formatted > 1000){ - formatted = formatted / 1000; - formatted = Math.round( formatted * 10 ) / 10; - formatted = formatted+'k'; - - } else { - formatted = formatted.toLocaleString(); - } - - return formatted; - } - - render(){ - return {this.format()}; - } -} + return formatted; +}); \ No newline at end of file diff --git a/src/js/views/Artist.js b/src/js/views/Artist.js index f511e9c6..b20f5355 100755 --- a/src/js/views/Artist.js +++ b/src/js/views/Artist.js @@ -8,8 +8,6 @@ import { Route, Switch } from 'react-router-dom'; import ErrorMessage from '../components/ErrorMessage'; import Link from '../components/Link'; import LazyLoadListener from '../components/LazyLoadListener' -import Header from '../components/Header' -import NiceNumber from '../components/NiceNumber'; import TrackList from '../components/TrackList' import AlbumGrid from '../components/AlbumGrid' import Thumbnail from '../components/Thumbnail'