Closed54

視覚的なタイマーを作りたい

hajimismhajimism

要件

  • 30~120min、15分ごとに設定できればいいかな
  • 残り時間の減りが視覚的にわかる
  • 終わったら音がなる
  • pauseもできる
hajimismhajimism

適当にvisual timer reactでググったらこれが出てきた。神OSSだな。
https://github.com/vydimitrov/react-countdown-circle-timer

hajimismhajimism

一旦これでよくて、あとは時間設定、pause、終わったときのアクションかな

hajimismhajimism

Start/Stop/Resetはアイコンが欲しい
状態を明示するためにStartとStopは交代表示がいい

hajimismhajimism

え、なんか変なエラー出て動かないんだけど

'PlayCircle' cannot be used as a JSX component.
  Its type 'IconNode' is not a valid JSX element type.
hajimismhajimism

Resetはkeyの変更で実現した

  const reset = useCallback(() => {
    setKey();
    playStop();
  }, [playStop, setKey]);
hajimismhajimism

次は秒数選択だな

hajimismhajimism

Radixでやった
一応できたけどstepごとにmarkつけるのはできてない

hajimismhajimism
export const getTimeSeconds = (time: number) => (minuteSeconds - time) | 0;

これで整数に丸めてるのちょっとエッチだな

hajimismhajimism

音ならすかー

hajimismhajimism

一方でloaderの問題は残った

 ⨯ ./public/celebration.mp3
Module parse failed: Unexpected character '�' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
(Source code omitted for this binary file)
hajimismhajimism

use-soundのREADMEに書いてあった

If you try to pull this trick in another React build system like Next.js, you may get an error like this:

You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.

The problem is that Webpack (the bundler used under-the-hood to generate JS bundles) doesn't know how to process an MP3 file.

If you have access to the Webpack config, you can update it to use file-loader, which will create a dynamic, publicly-accessible path to the file.

Alternatively, most tools will give you a "public" (create-react-app, Next.js) or a "static" (Gatsby) folder. You can drop your audio files in there, and then use a string path.

The sound files you'll use with use-sound follow the same rules as other static assets like images or fonts. Follow the guides for your meta-framework of choice:

hajimismhajimism

ni -D file-loaderしてこれをnextConfigに付け加えるとビルドは通った

  webpack(config) {
    config.module.rules.push({
      test: /\.mp3$/,
      use: {
        loader: "file-loader",
      },
    });
    return config;
  },
hajimismhajimism

use-soundが機能してない

そもそもこれで型エラーなるし

        <button onClick={play}>play</button>

これでも鳴らない

        <button onClick={() => play()}>play</button>
hajimismhajimism

あーなんか、こっちに直接パスを指定したら音なった

  const [play] = useSound("/celebration.mp3", { volume: 0.25 });
hajimismhajimism

適当に色とfavicon設定した

hajimismhajimism

これよく考えたらCircleSliderにしてそれがそのまま減る方がわかりやすいな

hajimismhajimism

いやだめだ
ここは別々にしないと%表示がうまくいかないわ

例えば60分図るとして、max 90の場合、スタート時で66%になっちゃう

このスクラップは2023/11/03にクローズされました