import { DAYS_IN_A_WEEK, DAYS_IN_A_YEAR } from '@/Constants' import { HistoryEntry, NoteHistoryEntry, RevisionListEntry } from '@standardnotes/snjs' import { calculateDifferenceBetweenDatesInDays } from '../../Utils/CalculateDifferenceBetweenDatesInDays' export type LegacyHistoryEntry = { payload: HistoryEntry['payload'] created_at: string } type RevisionEntry = RevisionListEntry | NoteHistoryEntry | LegacyHistoryEntry export type ListGroup = { title: string entries: EntryType[] | undefined } export type RemoteRevisionListGroup = ListGroup export type SessionRevisionListGroup = ListGroup export const formatDateAsMonthYearString = (date: Date) => date.toLocaleDateString(undefined, { month: 'long', year: 'numeric', }) export const getGroupIndexForEntry = (entry: RevisionEntry, groups: ListGroup[]) => { const todayAsDate = new Date() const entryDate = new Date((entry as RevisionListEntry).created_at ?? (entry as NoteHistoryEntry).payload.created_at) const differenceBetweenDatesInDays = calculateDifferenceBetweenDatesInDays(todayAsDate, entryDate) if (differenceBetweenDatesInDays === 0) { return groups.findIndex((group) => group.title === GROUP_TITLE_TODAY) } if (differenceBetweenDatesInDays > 0 && differenceBetweenDatesInDays < DAYS_IN_A_WEEK) { return groups.findIndex((group) => group.title === GROUP_TITLE_WEEK) } if (differenceBetweenDatesInDays > DAYS_IN_A_YEAR) { return groups.findIndex((group) => group.title === GROUP_TITLE_YEAR) } const formattedEntryMonthYear = formatDateAsMonthYearString(entryDate) return groups.findIndex((group) => group.title === formattedEntryMonthYear) } const GROUP_TITLE_TODAY = 'Today' const GROUP_TITLE_WEEK = 'This Week' const GROUP_TITLE_YEAR = 'More Than A Year Ago' export const sortRevisionListIntoGroups = (revisionList: EntryType[] | undefined) => { const sortedGroups: ListGroup[] = [ { title: GROUP_TITLE_TODAY, entries: [], }, { title: GROUP_TITLE_WEEK, entries: [], }, { title: GROUP_TITLE_YEAR, entries: [], }, ] const addBeforeLastGroup = (group: ListGroup) => { sortedGroups.splice(sortedGroups.length - 1, 0, group) } revisionList?.forEach((entry) => { const groupIndex = getGroupIndexForEntry(entry, sortedGroups) if (groupIndex > -1) { sortedGroups[groupIndex]?.entries?.push(entry) } else { addBeforeLastGroup({ title: formatDateAsMonthYearString( new Date((entry as RevisionListEntry).created_at ?? (entry as NoteHistoryEntry).payload.created_at), ), entries: [entry], }) } }) return sortedGroups } export const previewHistoryEntryTitle = (revision: RevisionListEntry | LegacyHistoryEntry) => { return new Date(revision.created_at).toLocaleString() }