bemusic/bemuse

View on GitHub
bemuse/src/app/ui/MusicInfoTabInformation.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import './MusicInfoTabInformation.scss'

import Markdown from 'bemuse/ui/Markdown'
import YouTube from 'bemuse/ui/YouTube'
import React, { memo } from 'react'
import type { Song } from 'bemuse/collection-model/types'

import { useReadme } from '../io/ReadmeIO'

export interface MusicInfoTabInformationProps {
  song: Song
}

const Buttons = ({ song }: MusicInfoTabInformationProps) => {
  const buttons = []
  if (song.bms_url) {
    buttons.push(<Link text='Download BMS' url={song.bms_url} />)
  }
  if (song.song_url) {
    const text = /soundcloud\.com/.test(song.song_url)
      ? 'SoundCloud'
      : 'Song URL'
    buttons.push(<Link text={text} url={song.song_url} />)
  }
  if (song.long_url) {
    buttons.push(<Link text='Long Version' url={song.long_url} />)
  }
  if (song.bmssearch_id) {
    buttons.push(
      <Link
        text='BMS Search'
        url={
          typeof song.bmssearch_id === 'number' ||
          String(song.bmssearch_id).match(/^\d{1,6}$/)
            ? `http://bmssearch.net/bms?id=${song.bmssearch_id}`
            : `https://bmssearch.net/bmses/${song.bmssearch_id}`
        }
      />
    )
  }
  if (buttons.length === 0) {
    return null
  } else {
    return <p className='MusicInfoTabInformationのbuttons'>{buttons}</p>
  }
}

const Link = ({ text, url }: { text: string; url?: string }) =>
  url ? (
    <a key={text} href={url} target='_blank' rel='noreferrer'>
      {text}
    </a>
  ) : (
    <>{text}</>
  )

const MusicInfoTabInformation = ({ song }: MusicInfoTabInformationProps) => {
  const readme = useReadme(song)

  return (
    <div className='MusicInfoTabInformation'>
      <Buttons song={song} />
      <p className='MusicInfoTabInformationのartist'>
        <span>Artist:</span>
        <strong>
          <Link text={song.artist} url={song.artist_url} />
        </strong>
      </p>
      {song.youtube_url ? <YouTube url={song.youtube_url} /> : null}
      <section className='MusicInfoTabInformationのreadme'>
        <Markdown source={readme} />
      </section>
    </div>
  )
}

export default memo(MusicInfoTabInformation)