{"version":3,"file":"Countdown.mjs","sources":["../../../../../../../../../web/src/ui/components/atoms/Countdown.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport type Countdown = {\n  expiration: number; // Unix epoch\n  start: (durationInSeconds: number) => void;\n  clear: () => void;\n};\n\nexport function useCountdown(): Countdown {\n  const [expiration, setExpiration] = useState(0);\n\n  const start = (durationInSeconds: number) => {\n    setExpiration(Date.now() + durationInSeconds * 1_000);\n  };\n\n  const clear = () => {\n    setExpiration(0);\n  };\n\n  return {\n    expiration,\n    start,\n    clear,\n  };\n}\n\nexport function formatCountdown(secondsLeft: number) {\n  const minutes = Math.floor(secondsLeft / 60);\n  const seconds = secondsLeft - minutes * 60;\n  return minutes + ':' + String(seconds).padStart(2, '0');\n}\n\nconst getSecondsRemaining = (expiration: number) => Math.max(0, Math.ceil((expiration - Date.now()) / 1_000));\n\nexport const useTimeRemaining = (expirationEpoch: number) => {\n  const [seconds, setSeconds] = useState(() => getSecondsRemaining(expirationEpoch));\n\n  const codeExpired = seconds <= 0;\n  useEffect(() => {\n    const updateSeconds = () => setSeconds(getSecondsRemaining(expirationEpoch));\n    updateSeconds();\n\n    if (Date.now() >= expirationEpoch) return;\n    const interval = setInterval(updateSeconds, 1000);\n\n    return () => clearInterval(interval);\n  }, [codeExpired, expirationEpoch]);\n\n  return [seconds, !codeExpired] as const;\n};\n"],"names":["useCountdown","expiration","setExpiration","useState","start","durationInSeconds","Date","now","clear","formatCountdown","secondsLeft","minutes","Math","floor","seconds","String","padStart","getSecondsRemaining","max","ceil","useTimeRemaining","expirationEpoch","setSeconds","codeExpired","useEffect","updateSeconds","interval","setInterval","clearInterval"],"mappings":";;;AAQO,SAASA,YAAAA,GAAAA;AACd,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,CAAAA,CAAS,CAAA,CAAA;AAE7C,IAAA,MAAMC,QAAQ,CAACC,iBAAAA,GAAAA;QACbH,aAAAA,CAAcI,IAAAA,CAAKC,GAAG,EAAA,GAAKF,iBAAAA,GAAoB,IAAA,CAAA;AACjD,IAAA,CAAA;AAEA,IAAA,MAAMG,KAAAA,GAAQ,IAAA;QACZN,aAAAA,CAAc,CAAA,CAAA;AAChB,IAAA,CAAA;IAEA,OAAO;AACLD,QAAAA,UAAAA;AACAG,QAAAA,KAAAA;AACAI,QAAAA;AACF,KAAA;AACF;AAEO,SAASC,gBAAgBC,WAAmB,EAAA;AACjD,IAAA,MAAMC,OAAAA,GAAUC,IAAAA,CAAKC,KAAK,CAACH,WAAAA,GAAc,EAAA,CAAA;IACzC,MAAMI,OAAAA,GAAUJ,cAAcC,OAAAA,GAAU,EAAA;AACxC,IAAA,OAAOA,UAAU,GAAA,GAAMI,MAAAA,CAAOD,OAAAA,CAAAA,CAASE,QAAQ,CAAC,CAAA,EAAG,GAAA,CAAA;AACrD;AAEA,MAAMC,sBAAsB,CAAChB,UAAAA,GAAuBW,IAAAA,CAAKM,GAAG,CAAC,CAAA,EAAGN,IAAAA,CAAKO,IAAI,CAAC,CAAClB,UAAAA,GAAaK,IAAAA,CAAKC,GAAG,EAAC,IAAK,IAAA,CAAA,CAAA;AAE/F,MAAMa,mBAAmB,CAACC,eAAAA,GAAAA;AAC/B,IAAA,MAAM,CAACP,OAAAA,EAASQ,UAAAA,CAAW,GAAGnB,CAAAA,CAAS,IAAMc,mBAAAA,CAAoBI,eAAAA,CAAAA,CAAAA;AAEjE,IAAA,MAAME,cAAcT,OAAAA,IAAW,CAAA;IAC/BU,CAAAA,CAAU,IAAA;QACR,MAAMC,aAAAA,GAAgB,IAAMH,UAAAA,CAAWL,mBAAAA,CAAoBI,eAAAA,CAAAA,CAAAA;AAC3DI,QAAAA,aAAAA,EAAAA;QAEA,IAAInB,IAAAA,CAAKC,GAAG,EAAA,IAAMc,eAAAA,EAAiB;QACnC,MAAMK,QAAAA,GAAWC,YAAYF,aAAAA,EAAe,IAAA,CAAA;AAE5C,QAAA,OAAO,IAAMG,aAAAA,CAAcF,QAAAA,CAAAA;IAC7B,CAAA,EAAG;AAACH,QAAAA,WAAAA;AAAaF,QAAAA;AAAgB,KAAA,CAAA;IAEjC,OAAO;AAACP,QAAAA,OAAAA;QAAS,CAACS;AAAY,KAAA;AAChC;;;;"}