Newer
Older
skillcheck-react / app / work / 01 / counter.ts
export interface Counter {
  promise: Promise<void[]>;
  stop: () => void;
}

export function createCounter(
  seconds: number,
  callback?: (passed: number, left: number) => void
) {
  const handlerIdList: NodeJS.Timeout[] = [];

  const promiseList = [...Array(seconds + 1)].map((_, i, list) => {
    const promise = new Promise<void>((resolve) => {
      const id = setTimeout(() => {
        callback?.(i, list.length - i - 1);
        resolve();
      }, i * 1000);

      handlerIdList.push(id);
    });

    return promise;
  });

  const promise = Promise.all(promiseList);

  const stop = () => {
    handlerIdList.forEach((id) => {
      clearTimeout(id);
    });
  };

  return { promise, stop } as Counter;
}