frontend-opensource-project / use-react-hooks

React hoooooooks😎
5 stars 0 forks source link

[URH-19] useSound μ‹ κ·œ #37

Closed Choozii closed 1 month ago

Choozii commented 1 month ago

πŸ‘Ύ Pull Request

1️⃣ Spec

2️⃣ λ³€κ²½ 사항

3️⃣ μ˜ˆμ‹œ μ½”λ“œ

import useSound from './hooks/useSound';

const App = () => {
  const result = useSound({
    url: 'https://github.com/rafaelreis-hotmart/Audio-Sample-files/raw/master/sample.mp3',
  });

  const {
    volume,
    playbackRate,
    isLoop,
    duration,
    currentTime,
    play,
    pause,
    stop,
    setIsLoop,
    setPosition,
    setVolume,
    setPlaybackRate,
  } = result;

  const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setVolume(parseFloat(e.target.value));
  };

  const handlePlaybackRateChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setPlaybackRate(parseFloat(e.target.value));
  };

  const handlePositionChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setPosition(parseFloat(e.target.value));
  };

  return (
    <div>
      <button onClick={play}>μž¬μƒ</button>
      <button onClick={pause}>μΌμ‹œμ •μ§€</button>
      <button onClick={stop}>정지</button>
      <div>
        <label>
          λ³Όλ₯¨:
          <input
            type="range"
            min="0"
            max="1"
            step="0.01"
            value={volume}
            onChange={handleVolumeChange}
          />
        </label>
      </div>
      <div>
        <label>
          배속:
          <input
            type="range"
            min="0.5"
            max="2"
            step="0.1"
            value={playbackRate}
            onChange={handlePlaybackRateChange}
          />
        </label>
      </div>
      <div>
        <label>
          μž¬μƒ μœ„μΉ˜:
          <input
            type="range"
            min="0"
            max={duration}
            step="0.1"
            value={currentTime}
            onChange={handlePositionChange}
          />
        </label>
      </div>
      <div>
        <label>
          반볡 μž¬μƒ:
          <input
            type="checkbox"
            checked={isLoop}
            onChange={(e) => setIsLoop(e.target.checked)}
          />
        </label>
      </div>
    </div>
  );
};

export default App;

4️⃣ κ΄€λ ¨ λ¬Έμ„œ (선택 사항)

Choozii commented 1 month ago

저도 λ…Έλž˜ λ“£λŠ” κ±Έ μ°Έ μ’‹μ•„ν•˜λŠ”λ°μš” κ·Έλž˜μ„œ 이런 audioκ΄€λ ¨ 훅이 더 λ°˜κ°€μš΄κ²ƒ κ°™μŠ΅λ‹ˆλ‹€!

이미 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆλŠ” ν›…μ΄μ§€λ§Œ.. μ½”λ“œ 리뷰λ₯Ό ν•˜κΈ° 전에 λΉ λ₯΄κ²Œ κΈ°λŠ₯ μΆ”κ°€λ₯Ό μ œμ•ˆλ“œλ¦¬κ³  μ‹Άμ–΄ λ¨Όμ € μ½”λ©˜νŠΈλ₯Ό λ‚¨κ²¨λ΄…λ‹ˆλ‹€.

  1. μš©λ„κ°€ μŒμ•…μž¬μƒμΌ 경우, 02:20 / 3:52와 같은 ν˜•νƒœλ‘œ ν™œμš©ν•  수 μžˆλ„λ‘ ν˜„μž¬μž¬μƒμ‹œκ°„, μ „μ²΄μž¬μƒμ‹œκ°„μ„ 제곡
  2. μš©λ„κ°€ bgmμž¬μƒμΌ 경우, μŒμ†Œκ±°λ₯Ό 켜고 λ„λŠ” κΈ°λŠ₯을 λ”°λ‘œ 제곡
  3. λ‹€λ₯Έ μš©λ„ ETC...

이 useSound훅을 μ–΄λŠ μ •λ„μ˜ λ²”μœ„λ₯Ό 염두에 두고 λ§Œλ“œμ…¨λ‚˜μš”? 일단 μ΄λ ‡κ²Œ μ œκ°€ μƒκ°ν•œ λ²”μœ„μ—μ„œ ν•„μš”ν•œ κΈ°λŠ₯을 더 μ œμ•ˆλ“œλ¦¬κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 특히 μŒμ†Œκ±°μ˜ 경우 μš©λ„κ°€ μŒμ•…μž¬μƒμ΄λ“ , BGM이든 좔가됐을 λ•Œ μœ μš©ν•˜κ²Œ 쓰일 수 μžˆλŠ” κΈ°λŠ₯이라고 μƒκ°ν•©λ‹ˆλ‹€

  1. μš©λ„κ°€ μŒμ•…μž¬μƒμΌ 경우, 02:20 / 3:52와 같은 ν˜•νƒœλ‘œ ν™œμš©ν•  수 μžˆλ„λ‘ ν˜„μž¬μž¬μƒμ‹œκ°„, μ „μ²΄μž¬μƒμ‹œκ°„μ„ 제곡 -> ν•΄λ‹Ή 건은 currentTime(ν˜„μž¬ μž¬μƒ μœ„μΉ˜)μ΄λž‘ duration(μŒμ› 총 길이)둜 λ‚˜νƒ€λ‚Ό 수 μžˆμ„κ²ƒ κ°™μ•„μš”!
  2. μŒμ†Œκ±°λ₯Ό 켜고 λ„λŠ” κΈ°λŠ₯을 λ”°λ‘œ 제곡 -> μŒμ†Œκ±°! λŠ” 생각λͺ»ν–ˆλŠ”데 μΆ”κ°€ν•΄λ³Όκ²Œμš”!!! 의견 κ°μ‚¬ν•©λ‹ˆλ‹Ή!
foresec commented 1 month ago
  1. μš©λ„κ°€ μŒμ•…μž¬μƒμΌ 경우, 02:20 / 3:52와 같은 ν˜•νƒœλ‘œ ν™œμš©ν•  수 μžˆλ„λ‘ ν˜„μž¬μž¬μƒμ‹œκ°„, μ „μ²΄μž¬μƒμ‹œκ°„μ„ 제곡 -> ν•΄λ‹Ή 건은 currentTime(ν˜„μž¬ μž¬μƒ μœ„μΉ˜)μ΄λž‘ duration(μŒμ› 총 길이)둜 λ‚˜νƒ€λ‚Ό 수 μžˆμ„κ²ƒ κ°™μ•„μš”!

이뢀뢄은 00:00ν˜•μ‹μœΌλ‘œ ν¬λ§·νŒ…λœ ν˜•μ‹μ„ μ œκ³΅ν•˜λ©΄ κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ§€ μ•Šμ„κΉŒ ν–ˆλŠ”λ° λ‹€μ‹œ μƒκ°ν•΄λ³΄λ‹ˆ λ„μ–΄μ“°κΈ°λΌλ˜κ°€ ν¬λ§·νŒ…μͺ½μ€ 자유둭게 λ‘λŠ”κ²Œ 더 λ‚˜μ„ 것 κ°™λ„€μš”πŸ˜Š

+) μ•— 그리고 또 ν•˜λ‚˜ μƒκ°λ‚¬λŠ”λ° autoplayλ₯Ό booleanκ°’μœΌλ‘œ λ‚΄λ €μ€˜μ„œ λ°”λ‘œ μ‹œμž‘ν•  수 μžˆκ²Œλ” ν•˜λŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ”κ²ƒμ€ μ–΄λ–¨κΉŒμš”? ν•˜μ§€λ§Œ ν•„μˆ˜μ μΈ κΈ°λŠ₯은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ›ν•˜μ‹œλŠ”λŒ€λ‘œ ν•˜μ…”λ„ 쒋을 것 κ°™μ•„μš” ++) μ’€ 더 μ°Ύμ•„λ³΄λ‹ˆ λΈŒλΌμš°μ €μ˜ μžλ™ μž¬μƒ 정책상 μžλ™ μž¬μƒ 방지 κΈ°λŠ₯(단, μŒμ†Œκ±°μ‹œ μž‘λ™μ€ 함)이 λ™μž‘ν•œλ‹€κ³  ν•˜λ„€μš”. 이 뢀뢄은 λ„˜μ–΄κ°€λŠ”κ²Œ μ’‹κ² λ„€μš”.. πŸ“ƒλ―Έλ””μ–΄ μ—˜λ¦¬λ¨ΌνŠΈ μžλ™μž¬μƒ