From ac0af26f770b55a0000b525cbd196e7315b3b434 Mon Sep 17 00:00:00 2001 From: Brandon Presley Date: Fri, 28 Oct 2022 15:49:03 +1300 Subject: [PATCH] Add more date format options Closes #94 --- SetItem.tsx | 3 ++- SettingsPage.tsx | 18 ++++++++++-------- set.service.ts | 9 ++------- time.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/SetItem.tsx b/SetItem.tsx index d6c9fe6..a566fc0 100644 --- a/SetItem.tsx +++ b/SetItem.tsx @@ -5,6 +5,7 @@ import {Divider, List, Menu, Text} from 'react-native-paper'; import {HomePageParams} from './home-page-params'; import Set from './set'; import {deleteSet} from './set.service'; +import {format} from './time'; import useDark from './use-dark'; import {useSettings} from './use-settings'; @@ -63,7 +64,7 @@ export default function SetItem({ alignSelf: 'center', color: dark ? '#909090ff' : '#717171ff', }}> - {item.created?.replace('T', ' ')} + {format(item.created || '', settings.date)} )} + + + + + + + - - - + )} {'alarm sound'.includes(search.toLowerCase()) && ( diff --git a/set.service.ts b/set.service.ts index 211e6de..44f32d6 100644 --- a/set.service.ts +++ b/set.service.ts @@ -82,18 +82,13 @@ export const getSets = async ({ }: PageParams): Promise => { const select = ` SELECT id, name, reps, weight, sets, minutes, seconds, - STRFTIME(?, created) as created, unit, image, steps + created, unit, image, steps FROM sets WHERE name LIKE ? AND NOT hidden ORDER BY STRFTIME('%Y-%m-%d %H:%M', created) DESC LIMIT ? OFFSET ? `; - const [result] = await db.executeSql(select, [ - format, - `%${search}%`, - limit, - offset, - ]); + const [result] = await db.executeSql(select, [`%${search}%`, limit, offset]); return result.rows.raw(); }; diff --git a/time.ts b/time.ts index e0ecd78..48b1b0e 100644 --- a/time.ts +++ b/time.ts @@ -14,3 +14,48 @@ export function formatMonth(iso: string) { const mm = (date.getMonth() + 1).toString(); return `${dd}/${mm}`; } + +function twelveHour(twentyFourHour: string) { + const [hourString, minute] = twentyFourHour.split(':'); + const hour = +hourString % 24; + return (hour % 12 || 12) + ':' + minute + (hour < 12 ? ' AM' : ' PM'); +} + +function dayOfWeek(iso: string) { + const date = new Date(iso); + const day = date.getDay(); + const target = DAYS[day === 0 ? 0 : day - 1]; + return target.slice(0, 3); +} + +/** + * @param iso ISO formatted date, e.g. 1996-12-24T14:03:04 + * @param kind Intended format for the date, e.g. '%Y-%m-%d %H:%M' + */ +export function format(iso: string, kind: string) { + const split = iso.split('T'); + const [year, month, day] = split[0].split('-'); + const time = twelveHour(split[1]); + switch (kind) { + case '%Y-%m-%d %H:%M': + return iso.replace('T', ' ').replace(/:\d{2}/, ''); + case '%Y-%m-%d': + return split[0]; + case '%H:%M': + return split[1].replace(/:\d{2}/, ''); + case '%d/%m/%y %h:%M %p': + return `${day}/${month}/${year} ${time}`; + case '%d/%m %h:%M %p': + return `${day}/${month} ${time}`; + case '%d/%m/%y': + return `${day}/${month}/${year}`; + case '%d/%m': + return `${day}/${month}`; + case '%h:%M %p': + return time; + case '%A %h:%M %p': + return dayOfWeek(iso) + ' ' + time; + default: + return iso; + } +}