UNPKG

@fernandomg/streak-counter

Version:

This is a basic streak counter - inspired by Duolingo - written in TypeScript and ment for the browser (uses `localStorage`).

1 lines 3.76 kB
{"version":3,"file":"index.cjs","sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["export const KEY = 'streak'\n\nexport interface Streak {\n currentCount: number\n startDate: string\n lastLoginDate: string\n}\n\nexport function formattedDate(date: Date): string {\n return date.toLocaleDateString('en-US')\n}\n\nexport function buildStreak(date: Date, overrideDefaults?: Partial<Streak>): Streak {\n const defaultStreak: Streak = {\n currentCount: 1,\n startDate: formattedDate(date),\n lastLoginDate: formattedDate(date),\n }\n\n return {\n ...defaultStreak,\n ...overrideDefaults,\n }\n}\n\nexport function updateStreak(storage: Storage, streak: Streak): void {\n storage.setItem(KEY, JSON.stringify(streak))\n}","import { buildStreak, KEY, Streak, updateStreak } from \"./utils\"\n\nfunction differenceInDays(dateLeft: Date, dateRight: Date): number {\n const diffTime = Math.abs(dateLeft.getTime() - dateRight.getTime())\n const differenceInDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))\n\n return differenceInDays\n}\n\nfunction shouldIncrementOrResetStreakCount(currentDate: Date, lastLoginDate: string): 'increment' | 'reset' | 'none' {\n const difference = differenceInDays(currentDate, new Date(lastLoginDate))\n\n if (difference === 0) {\n return 'none'\n }\n\n if (difference === 1) {\n return 'increment'\n }\n\n return 'reset'\n}\n\nexport function streakCounter(storage: Storage, date: Date): Streak {\n const streakInLocalStorage = storage.getItem(KEY)\n\n if (streakInLocalStorage) {\n try {\n const streak = JSON.parse(streakInLocalStorage) as Streak\n const state = shouldIncrementOrResetStreakCount(date, streak.lastLoginDate)\n const SHOULD_INCREMENT = state === 'increment'\n const SHOULD_RESET = state === 'reset'\n\n if (SHOULD_INCREMENT) {\n const updatedStreak = buildStreak(date, {\n currentCount: streak.currentCount + 1,\n startDate: streak.startDate,\n })\n\n updateStreak(storage, updatedStreak)\n\n return updatedStreak\n }\n \n if (SHOULD_RESET) {\n const updatedStreak = buildStreak(date)\n\n updateStreak(storage, updatedStreak)\n\n return updatedStreak\n }\n\n return streak\n } catch (error) {\n console.error('Failed to parse streak from localStorage')\n }\n }\n\n const streak = buildStreak(date)\n\n updateStreak(storage, streak)\n\n return streak\n}"],"names":["KEY","formattedDate","date","toLocaleDateString","buildStreak","overrideDefaults","_extends","currentCount","startDate","lastLoginDate","updateStreak","storage","streak","setItem","JSON","stringify","dateLeft","dateRight","diffTime","difference","streakInLocalStorage","getItem","parse","state","Date","Math","abs","getTime","ceil","SHOULD_RESET","updatedStreak","error","console"],"mappings":"wOAAaA,EAAM,SAQH,SAAAC,EAAcC,GAC5B,OAAOA,EAAKC,mBAAmB,QACjC,CAEgB,SAAAC,EAAYF,EAAYG,GAOtC,OAAAC,EAAA,CAAA,EAN8B,CAC5BC,aAAc,EACdC,UAAWP,EAAcC,GACzBO,cAAeR,EAAcC,IAK1BG,EAEP,CAEgB,SAAAK,EAAaC,EAAkBC,GAC7CD,EAAQE,QAAQb,EAAKc,KAAKC,UAAUH,GACtC,uBCJgB,SAAcD,EAAkBT,GAC9C,IAtBwBc,EAAgBC,EAClCC,EAOAC,EAcAC,EAAuBT,EAAQU,QAAQrB,GAE7C,GAAIoB,EACF,IACE,IAAMR,EAASE,KAAKQ,MAAMF,GACpBG,GA3BcP,EA2B4Bd,EA3BZe,EAQS,IAAIO,KAmBKZ,EAAOH,eA1B3DS,EAAWO,KAAKC,IAAIV,EAASW,UAAYV,EAAUU,WAStC,KAFbR,EANmBM,KAAKG,KAAKV,EAAY,QAStC,OAGU,IAAfC,EACK,YAGF,SAWGU,EAAyB,UAAVN,EAErB,GAHmC,cAAVA,EAGH,CACpB,IAAMO,EAAgB1B,EAAYF,EAAM,CACtCK,aAAcK,EAAOL,aAAe,EACpCC,UAAWI,EAAOJ,YAKpB,OAFAE,EAAaC,EAASmB,GAEfA,CACR,CAED,GAAID,EAAc,CAChB,IAAMC,EAAgB1B,EAAYF,GAIlC,OAFAQ,EAAaC,EAASmB,GAEfA,CACR,CAED,OAAOlB,CACR,CAAC,MAAOmB,GACPC,QAAQD,MAAM,2CACf,CAGH,IAAMnB,EAASR,EAAYF,GAI3B,OAFAQ,EAAaC,EAASC,GAEfA,CACT"}