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\">×</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 © {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":""}