@@ -4,6 +4,7 @@ import ky from 'ky/umd';
44import TimeAgo from 'react-timeago' ;
55import classNames from 'classnames' ;
66import { Link } from 'react-router-dom' ;
7+ import { CopyToClipboard } from 'react-copy-to-clipboard' ;
78
89import AutoProgressBar from './AutoProgressBar' ;
910import shortUrls from './shortUrls' ;
@@ -358,7 +359,12 @@ class DeployTable extends React.Component {
358359 Use the links below to compare directly on GitHub.
359360 </ div >
360361 ) }
361- < BadgesAndUrls deployInfo = { deployInfo } shortUrl = { shortUrl } />
362+ < BadgesAndUrls
363+ deployInfo = { deployInfo }
364+ shortUrl = { shortUrl }
365+ owner = { owner }
366+ repo = { repo }
367+ />
362368 </ div >
363369 </ >
364370 ) ;
@@ -679,19 +685,51 @@ class Culprits extends React.PureComponent {
679685
680686class BadgesAndUrls extends React . Component {
681687 state = {
682- showHelp : false
688+ showHelp : false ,
689+ textCopied : ''
683690 } ;
684691
692+ componentWillUnmount ( ) {
693+ this . dismounted = true ;
694+ }
695+
685696 toggleHelp = ( ) => {
686697 this . setState ( state => ( { showHelp : ! state . showHelp } ) ) ;
687698 } ;
688699
700+ copiedText = textCopied => {
701+ this . setState ( { textCopied } , ( ) => {
702+ window . setTimeout ( ( ) => {
703+ if ( ! this . dismounted ) {
704+ this . setState ( { textCopied : '' } ) ;
705+ }
706+ } , 4 * 1000 ) ;
707+ } ) ;
708+ } ;
709+
710+ showCopyToClipboard = text => {
711+ return (
712+ < CopyToClipboard text = { text } onCopy = { ( ) => this . copiedText ( text ) } >
713+ < small >
714+ < button
715+ className = "btn btn-outline-secondary btn-sm"
716+ disabled = { text === this . state . textCopied }
717+ >
718+ { text === this . state . textCopied
719+ ? 'Copied to clipboard'
720+ : 'Copy to clipboard' }
721+ </ button >
722+ </ small >
723+ </ CopyToClipboard >
724+ ) ;
725+ } ;
726+
689727 render ( ) {
690- const { deployInfo, shortUrl } = this . props ;
728+ const { deployInfo, shortUrl, owner , repo } = this . props ;
691729 const { showHelp } = this . state ;
692730
693731 const { protocol, host } = window . location ;
694- const fullUrl = `${ protocol } //${ host } ${ shortUrl } ` ;
732+ const fullUrl = `${ protocol } //${ host } ${ shortUrl } / ${ owner } / ${ repo } ` ;
695733 const envs = deployInfo . map ( deploy => deploy . name . toLowerCase ( ) ) . join ( ',' ) ;
696734 const badgeUrl = `https://img.shields.io/badge/whatsdeployed-${ envs } -green.svg` ;
697735 const badgeAlt = `What's deployed on ${ envs } ?` ;
@@ -720,21 +758,19 @@ class BadgesAndUrls extends React.Component {
720758 < div >
721759 < h3 > Badge Help</ h3 >
722760 < dl >
723- < dt > Image URL</ dt >
761+ < dt > Image URL { this . showCopyToClipboard ( badgeUrl ) } </ dt >
724762 < dd >
725- < code > { badgeUrl } </ code >
763+ < pre > { badgeUrl } </ pre >
726764 </ dd >
727- < dt > Markdown</ dt >
765+ < dt > Markdown { this . showCopyToClipboard ( markdown ) } </ dt >
728766 < dd >
729- < pre >
730- < code > { markdown } </ code >
731- </ pre >
767+ < pre > { markdown } </ pre >
732768 </ dd >
733- < dt > ReStructuredText</ dt >
769+ < dt >
770+ ReStructuredText { this . showCopyToClipboard ( restructuredText ) }
771+ </ dt >
734772 < dd >
735- < pre >
736- < code > { restructuredText } </ code >
737- </ pre >
773+ < pre > { restructuredText } </ pre >
738774 </ dd >
739775 </ dl >
740776 </ div >
0 commit comments