time-convertor-ts

Convert time across timezones (typescript)
git clone http://git.hanabi.in/repos/time-convertor-ts.git
Log | Files | Refs | README | LICENSE

main.099424a2.chunk.js.map (58093B)


      1 {"version":3,"sources":["utils/index.ts","App/comps/TimezoneInput.tsx","App/pages/CreateEvent.tsx","App/comps/ShowSavedZones.tsx","App/comps/SavedTimezones.tsx","App/pages/DualConvertor.tsx","App/comps/ErrorAlert.tsx","App/comps/FutureConverted.tsx","App/comps/ShowFuture.tsx","App/comps/SavedFuture.tsx","App/pages/FutureConversion.tsx","App/pages/Help.tsx","App/pages/SimpleConvertor.tsx","App/pages/UNIXTime.tsx","App/comps/Footer.tsx","App/comps/Header.tsx","utils/useTime.ts","App/index.tsx","serviceWorker.ts","index.tsx"],"names":["clearTimezones","localStorage","setItem","displayTime","fmtStr","time","timezone","tz","format","friendlyStr","str","replace","getAbbr","moment","zone","abbr","getSavedZones","savedData","getItem","JSON","parse","list","removeTimeZone","savedZones","updatedZones","filter","savedZone","newZonesStr","stringify","saveTimezones","newZones","Array","from","Set","sort","unfriendlyStr","HMMDY","HMSDMY","localTimezone","guess","timezoneList","names","YEAR","Date","getFullYear","YMD","TimezoneInput","autofocus","changeValue","clearInput","id","placeholder","TZ","options","React","useState","suggestions","setSuggestions","inputValue","setInputValue","border","borderBottom","style","setStyle","className","aria-placeholder","autoComplete","autoFocus","maxLength","name","onBlur","onChange","e","value","target","undefined","recommendations","length","option","toLowerCase","includes","a","b","onFocus","role","type","boxShadow","left","maxHeight","overflowX","scrollbarWidth","position","right","WebkitOverflowScrolling","zIndex","map","index","arr","key","onClick","cursor","CreateEvent","textArea","window","location","protocol","host","url","now","defaults","date","stamp","unix","fullurl","setFullurl","setDate","setTime","setTimezone","htmlFor","aria-describedby","max","instance","select","document","execCommand","readOnly","ref","text","background","ShowSavedZones","SavedTimezones","paddingTop","aria-label","DualConvertor","TZ1","TZ2","setTZ1","setTZ2","disabled","ErrorAlert","msg","data-dismiss","aria-hidden","FutureConverted","selectedTime","chosenTime","convertedTime","clone","fromLbl","toLbl","ShowFuture","zones","SavedFuture","FutureConversion","setSelectedTime","err","setErr","yesterday","today","getDate","getYesterday","onSubmit","preventDefault","selectedDate","isValid","console","warn","yDayMoment","dateStr","timeStr","dateTimeStr","dateTime","indexOf","min","Help","to","process","SimpleConvertor","UNIXTime","timestamp","pathname","setTZ","urlTime","rightNow","isWas","valueOf","setInstance","setDisplayTime","Footer","bottom","href","rel","Header","data-target","data-toggle","useTime","useEffect","interval","setInterval","clearInterval","App","timezone1","setTimezone1","timezone2","setTimezone2","paddingLeft","paddingRight","path","render","Boolean","hostname","match","ReactDOM","StrictMode","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error","message"],"mappings":"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","file":"static/js/main.099424a2.chunk.js","sourcesContent":["import moment from \"moment-timezone\";\n\nimport { IDisplayTime, IGetAbbr } from \"../utils/interfaces\";\n\n/**\n * @description clears the zones in localStorage\n */\nfunction clearTimezones<never>() {\n  localStorage.setItem(\"zones\", \"{}\");\n}\n\n/**\n *\n * @param fmtStr {string} Formatting string (ex. 'HH:mm:ss MMMM DD, YYYY')\n * @param time {moment.Moment} Time to be formatted\n * @param timezone {string} Timezone to set\n * @returns {string} formatted time\n */\nfunction displayTime({ fmtStr, time, timezone }: IDisplayTime) {\n  return time.tz(timezone).format(fmtStr);\n}\n\n/**\n * @description Convert a string like `foo_bar_baz` to `foo bar baz`\n * @param {string} str\n */\nfunction friendlyStr(str: string): string {\n  return str.replace(/_/g, \" \");\n}\n\n/**\n *\n * @description Obtain the abbreviation of a timezone\n * @param timezone {string} Time zone string\n * @param time {moment.Moment} moment object\n * @returns {string}\n */\nfunction getAbbr({ timezone, time }: IGetAbbr): string {\n  // @ts-ignore -- they most certainly won't be undefined\n  return moment.tz.zone(timezone).abbr(time);\n}\n\n/**\n * @description Fetch list of saved time zones from the localStorage\n * @returns {string[] | []} Array of saved time zones\n */\nfunction getSavedZones<never>(): string[] | [] {\n  // query localStorage to get JSON as string\n  const savedData: string = localStorage.getItem(\"zones\") || \"{}\";\n  // extract array\n  const savedZones: string[] = JSON.parse(savedData).list || [];\n  return savedZones;\n}\n\n/**\n * @description get yesterday's date as a moment object\n * @ref { https://flaviocopes.com/how-to-get-yesterday-date-javascript/ }\n * @returns {moment.Moment}\n */\nfunction getYesterday<never>(): moment.Moment {\n  const today = new Date();\n  const yesterday = new Date();\n\n  yesterday.setDate(today.getDate() - 1);\n  return moment(yesterday);\n}\n\n/**\n * @description Removes one zone from localStorage\n * @param {string} zone zone to be removed from the localStorage\n */\nfunction removeTimeZone(zone: string = \"\"): void {\n  // get saved zones\n  const savedZones = getSavedZones();\n  // filter out\n  const updatedZones = savedZones.filter((savedZone) => savedZone !== zone);\n  // stringify JSON\n  const newZonesStr = JSON.stringify({ list: updatedZones });\n  // save to localStorage\n  localStorage.setItem(\"zones\", newZonesStr);\n}\n\n/**\n *\n * @description takes in an array of timezones and updates the localStorage\n * @param timezone {string[]} An array of timezones\n */\nfunction saveTimezones(timezone: string[] | [] = []) {\n  // get saved zones\n  const savedZones = getSavedZones();\n  // new array of sorted time zones\n  const newZones = Array.from(new Set([...savedZones, ...timezone])).sort();\n  // stringify JSON\n  const newZonesStr = JSON.stringify({ list: newZones });\n  // save to localStorage\n  localStorage.setItem(\"zones\", newZonesStr);\n}\n\n/**\n * @description Convert a string like `foo bar baz` to `foo_bar_baz`\n * @param {string} str\n */\nfunction unfriendlyStr(str: string): string {\n  return str.replace(/ /g, \"_\");\n}\n\nexport {\n  clearTimezones,\n  displayTime,\n  friendlyStr,\n  getAbbr,\n  getSavedZones,\n  getYesterday,\n  removeTimeZone,\n  saveTimezones,\n  unfriendlyStr,\n};\n\nconst basePath = process.env.PUBLIC_URL;\nconst DEFAULT_TZ = \"UTC\";\nconst HM = \"HH:mm\";\nconst HMMDY = \"HH:mm MMMM DD, YYYY\";\nconst HMSDMY = \"HH:mm:ss MMMM DD, YYYY\";\nconst localTimezone = moment.tz.guess();\nconst MAX_DATE = \"2038-01-18\";\nconst timezoneList = moment.tz.names().sort();\nconst YEAR = new Date().getFullYear();\nconst YMD = \"YYYY-MM-DD\";\n\nexport {\n  basePath,\n  DEFAULT_TZ,\n  HM,\n  HMMDY,\n  HMSDMY,\n  localTimezone,\n  MAX_DATE,\n  timezoneList,\n  YEAR,\n  YMD,\n};\n","import React from \"react\";\n\nimport { friendlyStr, unfriendlyStr } from \"../../utils\";\n\nimport { timezoneList } from \"../../utils\";\n\nimport { ITimezoneInput } from \"../../utils/interfaces\";\n\nfunction TimezoneInput({\n  autofocus = false,\n  changeValue,\n  clearInput,\n  id = \"\",\n  placeholder = \"Time zone\",\n  TZ = \"UTC\",\n}: ITimezoneInput): JSX.Element {\n  const options = timezoneList;\n  const [suggestions, setSuggestions] = React.useState<string[]>([]);\n  const [inputValue, setInputValue] = React.useState(friendlyStr(TZ));\n  const [style, setStyle] = React.useState<object>({\n    border: 0,\n    borderBottom: \"1px solid silver\",\n  });\n\n  function handleBlur(): void {\n    setStyle({\n      border: 0,\n      borderBottom: \"1px solid silver\",\n    });\n  }\n\n  function handleChange(e: React.ChangeEvent<HTMLInputElement>): void {\n    const { value } = e.target;\n    if (clearInput) clearInput(undefined);\n    setInputValue(value);\n\n    let recommendations: string[] | [] = [];\n    if (value.length) {\n      recommendations = options.filter((option) =>\n        option.toLowerCase().includes(unfriendlyStr(value).toLowerCase())\n      );\n      if (value.length <= 3)\n        recommendations.sort((a, b) => a.length - b.length);\n    } else {\n      recommendations = [...options];\n    }\n    setSuggestions(recommendations);\n  }\n\n  function handleClick(value: string) {\n    setSuggestions([]);\n    setInputValue(friendlyStr(value));\n    changeValue(unfriendlyStr(value));\n  }\n\n  function handleFocus(): void {\n    setStyle({\n      border: \"none\",\n    });\n  }\n\n  function showLI(str: string, index: number, arr: string[]): JSX.Element {\n    return (\n      <li\n        className=\"list-group-item list-group-item-action\"\n        key={index}\n        onClick={() => handleClick(str)}\n        style={{ cursor: \"pointer\" }}\n      >\n        {friendlyStr(str)}\n      </li>\n    );\n  }\n\n  return (\n    <div className=\"h4\">\n      <input\n        aria-placeholder={placeholder}\n        autoComplete=\"false\"\n        autoFocus={autofocus}\n        className=\"w-75\"\n        id={id}\n        maxLength={100}\n        name={id}\n        onBlur={handleBlur}\n        onChange={handleChange}\n        onFocus={handleFocus}\n        placeholder={placeholder}\n        role=\"searchbox\"\n        style={style}\n        type=\"text\"\n        value={inputValue}\n      />\n      <div\n        className=\"suggestion-list\"\n        style={{\n          boxShadow:\n            suggestions.length > 0\n              ? \"0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)\"\n              : \"none\",\n          left: \"15px\",\n          maxHeight: \"50vh\",\n          overflowX: \"scroll\",\n          scrollbarWidth: \"none\",\n          position: \"absolute\",\n          right: \"15px\",\n          WebkitOverflowScrolling: \"touch\",\n          zIndex: 2,\n        }}\n      >\n        <div className=\"h6 mb-0\">\n          <ul className=\"list-group text-left\">\n            {suggestions.length > 0 ? suggestions.map(showLI) : null}\n          </ul>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default TimezoneInput;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\n\nimport TimezoneInput from \"../comps/TimezoneInput\";\n\nimport { HM, localTimezone, MAX_DATE, YMD } from \"../../utils\";\n\nfunction CreateEvent() {\n  const { protocol, host } = window.location;\n  const url = `${protocol}//${host}/`;\n  const now = moment(Date.now());\n  const defaults = {\n    date: now.format(YMD),\n    stamp: now.unix(),\n    time: now.format(HM),\n  };\n  const [fullurl, setFullurl] = React.useState<string>(\"\");\n  const [date, setDate] = React.useState<string>(defaults.date);\n  const [time, setTime] = React.useState<string>(defaults.time);\n  const [timezone, setTimezone] = React.useState<string>(localTimezone);\n  let textArea: HTMLInputElement | null;\n\n  function copyToClipboard(): void {\n    const el = textArea;\n    el?.select();\n    document.execCommand(\"copy\");\n  }\n\n  function generateLink(): void {\n    const instance = moment.tz(`${date} ${time}`, timezone).unix();\n    setFullurl(`${url}${instance}`);\n  }\n\n  function handleDateChange(e: React.ChangeEvent<HTMLInputElement>): void {\n    setDate(e.target.value);\n    setFullurl(\"\");\n  }\n\n  function handleTimeChange(e: React.ChangeEvent<HTMLInputElement>): void {\n    setTime(e.target.value);\n    setFullurl(\"\");\n  }\n\n  function handleTimezoneChange(tz: React.SetStateAction<string>): void {\n    setTimezone(tz);\n    setFullurl(\"\");\n  }\n\n  return (\n    <main className=\"container\">\n      <h1 className=\"mb-3 text-center\">\n        Select the date, time and timezone of your event.\n      </h1>\n      <label htmlFor=\"event-date\">Event date</label>\n      <input\n        aria-describedby=\"event-date\"\n        className=\"form-control mb-4\"\n        id=\"event-date\"\n        max={MAX_DATE}\n        name=\"event-date\"\n        onChange={handleDateChange}\n        placeholder=\"Enter date\"\n        type=\"date\"\n        value={date}\n      />\n      <label htmlFor=\"event-time\">Event time</label>\n      <input\n        aria-describedby=\"event-time\"\n        className=\"form-control mb-4\"\n        id=\"event-time\"\n        name=\"event-time\"\n        onChange={handleTimeChange}\n        placeholder=\"Enter time\"\n        type=\"time\"\n        value={time}\n      />\n      <label htmlFor=\"event-timezone\">Set timezone</label>\n      <TimezoneInput\n        autofocus={false}\n        changeValue={handleTimezoneChange}\n        id=\"event-timezone-input\"\n        placeholder=\"Time zone\"\n        TZ={timezone}\n      />\n      <h1 className=\"mt-5\">Share link!</h1>\n      <div className=\"input-group\">\n        <div className=\"input-group-prepend\" onClick={generateLink}>\n          <span className=\"input-group-text\">Click to create link!</span>\n        </div>\n        <input\n          className=\"form-control\"\n          id=\"event-url\"\n          onClick={copyToClipboard}\n          readOnly={true}\n          ref={(text) => (textArea = text)}\n          style={{\n            background: \"white\",\n          }}\n          type=\"text\"\n          value={fullurl}\n        />\n      </div>\n    </main>\n  );\n}\n\nexport default CreateEvent;\n","import React from \"react\";\n\nimport { displayTime, friendlyStr, removeTimeZone } from \"../../utils\";\n\nimport { HMSDMY } from \"../../utils\";\n\nimport { IShowSavedTimezones } from \"../../utils/interfaces\";\n\nfunction ShowSavedZones({\n  savedZones,\n  time,\n}: IShowSavedTimezones): JSX.Element {\n  return (\n    <>\n      <h3 className=\"mt-5 mb-3\">Saved time zones</h3>\n      <ul className=\"list-group\">\n        {savedZones.map((zone) => (\n          <li\n            className=\"list-group-item list-group-item-action\"\n            key={zone}\n            style={{ cursor: \"pointer\" }}\n          >\n            <div className=\"row\">\n              <div className=\"col\">\n                <span className=\"h4\">{friendlyStr(zone)}</span>\n                <br />\n                <span>\n                  {displayTime({ fmtStr: HMSDMY, time, timezone: zone })}\n                </span>\n              </div>\n              <div className=\"justify-content-center align-self-center col\">\n                <button\n                  className=\"btn btn-danger float-right\"\n                  onClick={() => removeTimeZone(zone)}\n                  type=\"button\"\n                >\n                  Remove\n                </button>\n              </div>\n            </div>\n          </li>\n        ))}\n      </ul>\n    </>\n  );\n}\n\nexport default ShowSavedZones;\n","import React from \"react\";\n\nimport ShowSavedZones from \"./ShowSavedZones\";\n\nimport { getSavedZones } from \"../../utils\";\n\nimport { IMoment } from \"../../utils/interfaces\";\n\nfunction SavedTimezones({ time }: IMoment): JSX.Element {\n  const savedZones = getSavedZones();\n  return (\n    <div className=\"saved\">\n      {savedZones.length > 0 ? (\n        <ShowSavedZones savedZones={savedZones} time={time} />\n      ) : (\n        <h5\n          className=\"border-top mt-5 text-center\"\n          style={{ paddingTop: \"1rem\" }}\n        >\n          You haven't saved any timezones so far.{\" \"}\n          <span aria-label=\"Saved list is empty.\" role=\"img\">\n            😅\n          </span>\n        </h5>\n      )}\n    </div>\n  );\n}\n\nexport default SavedTimezones;\n","import React from \"react\";\n\nimport SavedTimezones from \"../comps/SavedTimezones\";\nimport TimezoneInput from \"../comps/TimezoneInput\";\n\nimport {\n  clearTimezones,\n  displayTime,\n  getSavedZones,\n  saveTimezones,\n} from \"../../utils\";\n\nimport { HMSDMY } from \"../../utils\";\n\nimport { IDualConvertor } from \"../../utils/interfaces\";\n\nfunction DualConvertor({\n  time,\n  TZ1,\n  TZ2,\n  setTZ1,\n  setTZ2,\n}: IDualConvertor): JSX.Element {\n  return (\n    <main className=\"container\">\n      <h3 className=\"mb-5 text-center\">\n        Convert <em>current</em> time across time zones.\n      </h3>\n      <div className=\"mb-3 row\" id=\"labels\">\n        <div className=\"col text-right\" id=\"first-time-lbl-box\">\n          <TimezoneInput\n            autofocus={true}\n            changeValue={setTZ1}\n            id=\"first-time-lbl\"\n            placeholder=\"Time zone\"\n            TZ={TZ1}\n          />\n        </div>\n        <div className=\"col\" id=\"second-time-lbl-box\">\n          <TimezoneInput\n            autofocus={false}\n            changeValue={setTZ2}\n            id=\"second-time-lbl\"\n            placeholder=\"Time zone\"\n            TZ={TZ2}\n          />\n        </div>\n      </div>\n      <div className=\"row\" id=\"times\">\n        <div className=\"col text-right\" id=\"first-time-box\">\n          <h4 id=\"first-time\">\n            {displayTime({ fmtStr: HMSDMY, time, timezone: TZ1 })}\n          </h4>\n        </div>\n        <div className=\"col\" id=\"second-time-box\">\n          <h4 id=\"second-time\">\n            {displayTime({ fmtStr: HMSDMY, time, timezone: TZ2 })}\n          </h4>\n        </div>\n      </div>\n      <div className=\"text-right mt-5\">\n        <button\n          className=\"btn btn-success mr-3\"\n          type=\"button\"\n          onClick={() => saveTimezones([TZ1, TZ2])}\n        >\n          Save timezones\n        </button>\n        <button\n          className=\"btn btn-danger\"\n          disabled={getSavedZones().length === 0}\n          type=\"button\"\n          onClick={clearTimezones}\n        >\n          Clear All\n        </button>\n      </div>\n      <SavedTimezones time={time} />\n    </main>\n  );\n}\n\nexport default DualConvertor;\n","import React from \"react\";\n\nfunction ErrorAlert({ msg }: { msg: string }) {\n  return (\n    <div\n      className=\"alert alert-dismissible alert-warning fade mt-5 show\"\n      role=\"alert\"\n    >\n      {msg}\n      <button\n        aria-label=\"Close\"\n        className=\"close\"\n        data-dismiss=\"alert\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n    </div>\n  );\n}\n\nexport default ErrorAlert;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\n\nimport { displayTime, friendlyStr, getAbbr } from \"../../utils\";\n\nimport { HMMDY, HMSDMY } from \"../../utils\";\n\nimport { IFutureConverted } from \"../../utils/interfaces\";\n\nfunction FutureConverted({\n  selectedTime,\n  TZ1,\n  TZ2,\n}: IFutureConverted): JSX.Element {\n  const chosenTime = selectedTime;\n  const convertedTime = selectedTime.clone().tz(TZ2);\n  const fromLbl = getAbbr({ timezone: TZ1, time: moment(chosenTime, HMSDMY) });\n  const toLbl = getAbbr({ timezone: TZ2, time: moment(convertedTime, HMSDMY) });\n  return (\n    <div className=\"mt-5\">\n      <div className=\"row\">\n        <div className=\"col\">\n          <h1>{friendlyStr(TZ1)}</h1>\n        </div>\n        <div className=\"col\">\n          <h1>{friendlyStr(TZ2)}</h1>\n        </div>\n      </div>\n      <div className=\"row\">\n        <div className=\"col\">\n          {displayTime({ fmtStr: HMMDY, time: chosenTime, timezone: TZ1 })} (\n          {fromLbl})\n        </div>\n        <div className=\"col\">\n          {displayTime({ fmtStr: HMMDY, time: convertedTime, timezone: TZ2 })} (\n          {toLbl})\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default FutureConverted;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\n\nimport { displayTime, friendlyStr, removeTimeZone } from \"../../utils\";\nimport { HMMDY } from \"../../utils\";\n\nfunction ShowFuture({\n  selectedTime,\n  zones,\n}: {\n  selectedTime: moment.Moment;\n  zones: string[];\n}): JSX.Element {\n  return (\n    <>\n      <h3 className=\"mt-5 mb-3\">In other time zones...</h3>\n      <ul className=\"list-group\">\n        {zones.map((zone) => (\n          <li\n            className=\"list-group-item list-group-item-action\"\n            key={zone}\n            style={{ cursor: \"pointer\" }}\n          >\n            <h4>{friendlyStr(zone)}</h4>\n            <span>\n              {displayTime({\n                fmtStr: HMMDY,\n                time: selectedTime,\n                timezone: zone,\n              })}\n            </span>\n            <button\n              className=\"btn btn-danger float-right\"\n              onClick={() => removeTimeZone(zone)}\n              type=\"button\"\n            >\n              Remove\n            </button>\n          </li>\n        ))}\n      </ul>\n    </>\n  );\n}\n\nexport default ShowFuture;\n","import React from \"react\";\n\nimport ShowFuture from \"./ShowFuture\";\n\nimport { getSavedZones } from \"../../utils\";\n\nfunction SavedFuture({\n  selectedTime,\n}: {\n  selectedTime: moment.Moment | undefined;\n}): JSX.Element {\n  const list = getSavedZones();\n  return (\n    <div className=\"mt-5\">\n      {selectedTime && list.length > 0 ? (\n        <ShowFuture selectedTime={selectedTime} zones={list} />\n      ) : (\n        <h5\n          className=\"border-top mt-5 text-center\"\n          style={{ paddingTop: \"1rem\" }}\n        >\n          You haven't {selectedTime ? \"saved any timezones\" : \"selected a time\"}{\" \"}\n          so far.{\" \"}\n          <span aria-label=\"Saved list is empty.\" role=\"img\">\n            😅\n          </span>\n        </h5>\n      )}\n    </div>\n  );\n}\n\nexport default SavedFuture;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\n\nimport ErrorAlert from \"../comps/ErrorAlert\";\nimport FutureConverted from \"../comps/FutureConverted\";\nimport SavedFuture from \"../comps/SavedFuture\";\nimport TimezoneInput from \"../comps/TimezoneInput\";\n\nimport { displayTime, getYesterday, timezoneList } from \"../../utils\";\nimport { MAX_DATE, YMD, localTimezone } from \"../../utils\";\n\nimport { IFutureConversion } from \"../../utils/interfaces\";\n\nfunction FutureConversion({\n  date,\n  setDate,\n  setTime,\n  setTZ1,\n  setTZ2,\n  time,\n  // now, // aliased because [time, setTime] hook\n  TZ1,\n  TZ2,\n}: IFutureConversion): JSX.Element {\n  const [selectedTime, setSelectedTime] = React.useState<\n    moment.Moment | undefined\n  >(undefined);\n  const [err, setErr] = React.useState<string>(\"\");\n\n  function handleDateChange(e: React.ChangeEvent<HTMLInputElement>): void {\n    setDate(e.target.value);\n    setSelectedTime(undefined);\n  }\n\n  function handleFormSubmit(e: React.FormEvent<HTMLFormElement>): void {\n    e.preventDefault();\n\n    // 0. Reset Error and selected time\n    setErr(\"\");\n    setSelectedTime(undefined);\n    // 1. Validate selected date\n    const selectedDate = moment(date);\n    if (!selectedDate.isValid()) {\n      setErr(\"Chosen date is not valid.\");\n      console.warn(err);\n      return;\n    }\n    // 2. Check limit of selected date\n    // 2.1 MAX allowed\n    const epoch = moment(MAX_DATE, YMD);\n    if (epoch.unix() - selectedDate.unix() < 0) {\n      setErr(\"Chosen date is outside the maximum permissible limit.\");\n      console.warn(err);\n      return;\n    }\n    // 2.2 MIN allowed -- yesterday\n    const yDayMoment = moment(yesterday.format(YMD), YMD);\n    const selectedMoment = moment(selectedDate.format(YMD), YMD);\n    if (selectedMoment.unix() - yDayMoment.unix() < 0) {\n      setErr(\"Chosen date is in the past.\");\n      console.warn(err);\n      return;\n    }\n    // 3. Validate chosen time\n    const dateStr = selectedDate.format(YMD);\n    const timeStr = time;\n    const dateTimeStr = `${dateStr} ${timeStr}`;\n    const dateTime = moment.tz(dateTimeStr, TZ1);\n    if (!dateTime.isValid()) {\n      setErr(\"Error occurred while parsing time.\");\n      console.warn(err);\n      return;\n    }\n    // 4. validate chosen timezone\n    if (timezoneList.indexOf(TZ1) < 0) {\n      setErr(\"Selected timezone is invalid.\");\n      console.warn(err);\n      return;\n    }\n    // 5. validate set timezone\n    if (timezoneList.indexOf(TZ2) < 0) {\n      setErr(\"Selected timezone to convert is invalid.\");\n      console.warn(err);\n      return;\n    }\n    // 6. convert time\n    setSelectedTime(dateTime);\n  }\n\n  function handleTimeChange(e: React.ChangeEvent<HTMLInputElement>): void {\n    setTime(e.target.value);\n    setSelectedTime(undefined);\n  }\n\n  const yesterday = getYesterday();\n\n  return (\n    <div className=\"container\">\n      <form autoComplete=\"false\" onSubmit={handleFormSubmit}>\n        <div className=\"form-group\">\n          <label htmlFor=\"choose-date\">Choose date</label>\n          <input\n            aria-describedby=\"choose-date\"\n            className=\"form-control\"\n            id=\"chosen-date\"\n            max={MAX_DATE}\n            min={displayTime({\n              fmtStr: YMD,\n              time: yesterday,\n              timezone: localTimezone,\n            })}\n            name=\"choose-date\"\n            onChange={handleDateChange}\n            placeholder=\"Enter date\"\n            type=\"date\"\n            value={date}\n          />\n        </div>\n        <div className=\"form-group\">\n          <label htmlFor=\"choose-time\">Choose time</label>\n          <input\n            aria-describedby=\"choose-time\"\n            className=\"form-control\"\n            id=\"choose-time\"\n            name=\"choose-time\"\n            onChange={handleTimeChange}\n            placeholder=\"Enter time\"\n            type=\"time\"\n            value={time}\n          />\n        </div>\n        <div className=\"form-group\">\n          <label htmlFor=\"choose-from-timezone\">Set timezone</label>\n          <TimezoneInput\n            autofocus={false}\n            changeValue={setTZ1}\n            clearInput={setSelectedTime}\n            id=\"choose-from-timezone\"\n            placeholder=\"Set timezone\"\n            TZ={TZ1}\n          />\n        </div>\n        <div className=\"form-group\">\n          <label htmlFor=\"convert-to-timezone\">Convert to timezone</label>\n          <TimezoneInput\n            autofocus={false}\n            changeValue={setTZ2}\n            clearInput={setSelectedTime}\n            id=\"convert-to-timezone\"\n            placeholder=\"Convert to timezone\"\n            TZ={TZ2}\n          />\n        </div>\n        <button className=\"btn btn-success\" type=\"submit\">\n          Convert\n        </button>\n        {err ? <ErrorAlert msg={err} /> : null}\n        {selectedTime !== undefined ? (\n          <FutureConverted selectedTime={selectedTime} TZ1={TZ1} TZ2={TZ2} />\n        ) : null}\n      </form>\n      <SavedFuture selectedTime={selectedTime} />\n    </div>\n  );\n}\n\nexport default FutureConversion;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { getAbbr } from \"../../utils\";\n\nimport { basePath, localTimezone } from \"../../utils\";\n\nimport { IMoment } from \"../../utils/interfaces\";\n\nfunction Help({ time }: IMoment): JSX.Element {\n  return (\n    <div className=\"container\">\n      <ol>\n        <li>\n          Use the <Link to={`${basePath}/`}>homepage</Link> to convert your{\" \"}\n          <span className=\"font-weight-bold\">current time</span> (\n          {getAbbr({ time, timezone: localTimezone })}) to other timezone.\n        </li>\n        <li>\n          Use the <Link to={`${basePath}/future`}>/future</Link> to convert a{\" \"}\n          <span className=\"font-weight-bold\">future date</span> between\n          different timezones.\n        </li>\n        <li>\n          Use the <Link to={`${basePath}/from-to`}>/from-to</Link> to convert{\" \"}\n          <span className=\"font-weight-bold\">current time</span> between\n          different timezones.\n        </li>\n        <li>\n          You can <span className=\"font-weight-bold\">save</span> the converted\n          timezones, by clicking the \"Save\" button.\n        </li>\n        <li>\n          Use the <Link to={`${basePath}/create`}>Create event</Link> link to\n          schedule an event and share the link with participants. They can view\n          the event's scheduled time in their respective time zones.\n        </li>\n      </ol>\n    </div>\n  );\n}\n\nexport default Help;\n","import React from \"react\";\n\nimport SavedTimezones from \"../comps/SavedTimezones\";\nimport TimezoneInput from \"../comps/TimezoneInput\";\n\nimport {\n  clearTimezones,\n  displayTime,\n  friendlyStr,\n  getSavedZones,\n  localTimezone,\n  saveTimezones,\n} from \"../../utils\";\n\nimport { HMSDMY } from \"../../utils\";\n\nimport { ISimpleConvertor } from \"../../utils/interfaces\";\n\nfunction SimpleConvertor({ setTZ1, time, TZ1 }: ISimpleConvertor): JSX.Element {\n  return (\n    <main className=\"container\">\n      <h1 className=\"mb-5 text-center\">\n        Convert <em>current</em> time to other time zone.\n      </h1>\n      <div className=\"mb-3 row\" id=\"labels\">\n        <div\n          className=\"col text-right\"\n          id=\"first-time-lbl-box\"\n          style={{ cursor: \"not-allowed\" }}\n        >\n          <div className=\"h4\">{friendlyStr(localTimezone)} (Local time)</div>\n        </div>\n        <div className=\"col\" id=\"second-time-lbl-box\">\n          <TimezoneInput\n            autofocus={true}\n            changeValue={setTZ1}\n            id=\"second-time-lbl\"\n            placeholder=\"Time zone\"\n            TZ={TZ1}\n          />\n        </div>\n      </div>\n      <div className=\"row\" id=\"times\">\n        <div className=\"col text-right\" id=\"first-time-box\">\n          <h4 id=\"first-time\">\n            {displayTime({ fmtStr: HMSDMY, time, timezone: localTimezone })}\n          </h4>\n        </div>\n        <div className=\"col\" id=\"second-time-box\">\n          <h4 id=\"second-time\">\n            {displayTime({ fmtStr: HMSDMY, time, timezone: TZ1 })}\n          </h4>\n        </div>\n      </div>\n      <div className=\"text-right mt-5\">\n        <button\n          className=\"btn btn-success mr-3\"\n          onClick={() => saveTimezones([TZ1])}\n          type=\"button\"\n        >\n          Save timezone\n        </button>\n        <button\n          className=\"btn btn-danger\"\n          disabled={getSavedZones().length === 0}\n          onClick={clearTimezones}\n          type=\"button\"\n        >\n          Clear All\n        </button>\n      </div>\n      <SavedTimezones time={time} />\n    </main>\n  );\n}\n\nexport default SimpleConvertor;\n","import React from \"react\";\nimport moment from \"moment-timezone\";\nimport { Link } from \"react-router-dom\";\nimport Countdown from \"react-countdown\";\n\nimport { basePath, localTimezone } from \"../../utils\";\nimport TimezoneInput from \"../comps/TimezoneInput\";\n\nfunction UNIXTime(): JSX.Element {\n  const timestamp = +window.location.pathname.replace(\"/\", \"\") * 1000;\n\n  const [TZ, setTZ] = React.useState<string>(localTimezone);\n\n  const urlTime = moment.tz(timestamp, TZ);\n  const rightNow = Date.now();\n  const isWas = urlTime.valueOf() >= rightNow ? \"is\" : \"was\";\n\n  const [instance, setInstance] = React.useState<moment.Moment>(urlTime);\n\n  const [displayTime, setDisplayTime] = React.useState<string>(\n    instance.format(\"HH:mm MMM DD, YYYY Z (z)\")\n  );\n\n  const [timezone, setTimezone] = React.useState<string>(\n    instance.format(\"Z (z)\")\n  );\n\n  function handleClick() {\n    setInstance(moment.tz(timestamp, TZ));\n    setDisplayTime(instance.format(\"HH:mm MMM DD, YYYY Z (z)\"));\n    setTimezone(instance.format(\"Z (z)\"));\n  }\n\n  function handleTimezoneChange(tz: React.SetStateAction<string>) {\n    setTZ(tz);\n    setInstance(moment.tz(timestamp, \"\" + tz));\n  }\n\n  return (\n    <main className=\"container\">\n      <div className=\"text-center\">\n        <h3>That {isWas}:</h3>\n        <h1 className=\"mb-5 mt-3\">{displayTime}</h1>\n        <h5>Not {timezone}?</h5>\n        <TimezoneInput\n          autofocus={false}\n          changeValue={handleTimezoneChange}\n          id=\"event-time-mismatch\"\n          placeholder=\"Time zone\"\n          TZ={TZ}\n        />\n        <button className=\"btn btn-primary mb-5 mt-3\" onClick={handleClick}>\n          Change\n        </button>\n        <h2 className=\"mb-2 mt-2\">\n          {isWas === \"is\" ? (\n            <Countdown date={timestamp} />\n          ) : (\n            \"The event has commenced.\"\n          )}\n        </h2>\n        <Link\n          className=\"btn btn-info mt-5\"\n          role=\"button\"\n          to={`${basePath}/create`}\n        >\n          Schedule a new event\n        </Link>\n      </div>\n    </main>\n  );\n}\n\nexport default UNIXTime;\n","import React from \"react\";\n\nimport { YEAR } from \"../../utils\";\n\nfunction Footer<never>(): JSX.Element {\n  return (\n    <footer\n      className=\"border-top mt-5 page-footer\"\n      style={{\n        bottom: 0,\n        paddingTop: \"1rem\",\n      }}\n    >\n      <div className=\"text-center\">\n        <p>\n          Copyright &copy; {YEAR}{\" \"}\n          <a\n            href=\"https://en.wikinews.org/wiki/User:Acagastya\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            Agastya\n          </a>\n          . This project is licensed under{\" \"}\n          <a\n            href=\"https://opensource.org/licenses/BSD-3-Clause\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            BSD-3-Clause license\n          </a>\n          . Report bugs{\" \"}\n          <a\n            href=\"https://github.com/acagastya/time-convertor-ts/issues/new\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            here\n          </a>\n          .\n        </p>\n      </div>\n    </footer>\n  );\n}\n\nexport default Footer;\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { basePath } from \"../../utils\";\n\nfunction Header<never>(): JSX.Element {\n  return (\n    <nav className=\"bg-danger mb-5 navbar navbar-dark navbar-expand-lg\">\n      <Link className=\"navbar-brand\" to={`${basePath}/`}>\n        <span aria-label=\"time-convertor\" role=\"img\">\n          ⏳\n        </span>{\" \"}\n        time convertor\n      </Link>\n      <button\n        aria-label=\"Toggle navigation\"\n        className=\"navbar-toggler\"\n        data-target=\"#collapsibleNavbar\"\n        data-toggle=\"collapse\"\n        type=\"button\"\n      >\n        <span className=\"navbar-toggler-icon\"></span>\n      </button>\n      <div className=\"collapse navbar-collapse\" id=\"collapsibleNavbar\">\n        <ul className=\"navbar-nav\">\n          <li className=\"nav-item\">\n            <Link className=\"nav-link\" to={`${basePath}/create`}>\n              Create-events\n            </Link>\n          </li>\n          <li className=\"nav-item\">\n            <Link className=\"nav-link\" to={`${basePath}/help`}>\n              Help\n            </Link>\n          </li>\n          <li className=\"nav-item\">\n            <Link className=\"nav-link\" to={`${basePath}/future`}>\n              Future\n            </Link>\n          </li>\n          <li className=\"nav-item\">\n            <Link className=\"nav-link\" to={`${basePath}/from-to`}>\n              From-to\n            </Link>\n          </li>\n        </ul>\n      </div>\n    </nav>\n  );\n}\n\nexport default Header;\n","import { useState, useEffect } from \"react\";\nimport moment from \"moment-timezone\";\n\n/**\n * @description A custom hook which returns the current time as a moment object.\n * @param none\n * @returns {moment.Moment} moment object containing current time.\n */\nfunction useTime<never>(): moment.Moment {\n  const [time, setTime] = useState(moment());\n\n  function updateTime() {\n    setTime(moment());\n  }\n\n  useEffect(() => {\n    const interval = setInterval(() => updateTime(), 1000);\n    return () => clearInterval(interval);\n  });\n\n  return time;\n}\n\nexport default useTime;\n","import React from \"react\";\nimport { Route, BrowserRouter as Router, Switch } from \"react-router-dom\";\n\nimport CreateEvent from \"./pages/CreateEvent\";\nimport DualConvertor from \"./pages/DualConvertor\";\nimport FutureConversion from \"./pages/FutureConversion\";\nimport Help from \"./pages/Help\";\nimport SimpleConvertor from \"./pages/SimpleConvertor\";\nimport UNIXTime from \"./pages/UNIXTime\";\n\nimport Footer from \"./comps/Footer\";\nimport Header from \"./comps/Header\";\n\nimport { displayTime } from \"../utils\";\nimport { basePath, DEFAULT_TZ, HM, localTimezone, YMD } from \"../utils\";\nimport useTime from \"../utils/useTime\";\n\nfunction App<never>(): JSX.Element {\n  const now = useTime();\n  const [timezone1, setTimezone1] = React.useState(DEFAULT_TZ);\n  const [timezone2, setTimezone2] = React.useState(localTimezone);\n  const [date, setDate] = React.useState(\n    displayTime({ fmtStr: YMD, time: now, timezone: localTimezone })\n  );\n  const [time, setTime] = React.useState(\n    displayTime({ fmtStr: HM, time: now, timezone: localTimezone })\n  );\n\n  return (\n    <Router>\n      <div\n        className=\"container-fluid\"\n        style={{ paddingLeft: 0, paddingRight: 0 }}\n      >\n        <Header />\n        <Switch>\n          <Route\n            path={`${basePath}/future`}\n            render={() => (\n              <FutureConversion\n                date={date}\n                setDate={setDate}\n                setTime={setTime}\n                setTZ1={setTimezone1}\n                setTZ2={setTimezone2}\n                time={time}\n                TZ1={timezone1}\n                TZ2={timezone2}\n              />\n            )}\n          />\n          <Route path={`${basePath}/help`} render={() => <Help time={now} />} />\n          <Route\n            path={`${basePath}/from-to`}\n            render={() => (\n              <DualConvertor\n                setTZ1={setTimezone2}\n                setTZ2={setTimezone1}\n                time={now}\n                TZ1={timezone2}\n                TZ2={timezone1}\n              />\n            )}\n          />\n          <Route path={`${basePath}/create`} render={() => <CreateEvent />} />\n          <Route path={`${basePath}/([0-9]+)`} render={() => <UNIXTime />} />\n          <Route\n            path={`${basePath}/`}\n            render={() => (\n              <SimpleConvertor\n                setTZ1={setTimezone1}\n                time={now}\n                TZ1={timezone1}\n              />\n            )}\n          />\n        </Switch>\n        <Footer />\n      </div>\n    </Router>\n  );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === \"localhost\" ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === \"[::1]\" ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n  if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener(\"load\", () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            \"This web app is being served cache-first by a service \" +\n              \"worker. To learn more, visit https://bit.ly/CRA-PWA\"\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then((registration) => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === \"installed\") {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                \"New content is available and will be used when all \" +\n                  \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\"\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log(\"Content is cached for offline use.\");\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch((error) => {\n      console.error(\"Error during service worker registration:\", error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { \"Service-Worker\": \"script\" },\n  })\n    .then((response) => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get(\"content-type\");\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf(\"javascript\") === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then((registration) => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        \"No internet connection found. App is running in offline mode.\"\n      );\n    });\n}\n\nexport function unregister() {\n  if (\"serviceWorker\" in navigator) {\n    navigator.serviceWorker.ready\n      .then((registration) => {\n        registration.unregister();\n      })\n      .catch((error) => {\n        console.error(error.message);\n      });\n  }\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App/index\";\nimport * as serviceWorker from \"./serviceWorker\";\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}