From 0ae52e91ceaf1af41f12bfa6e76c7d719be5e0e5 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Jul 2023 12:16:57 -0500 Subject: #984 Updating `indexedAt` timestamps (#1024) * add TimeElapsed util component, integrate into PostThreadItem * integrate into posts * use consistent naming * use mobx and single interval for TimeElapsed --- src/state/models/ui/shell.ts | 9 +++++++++ src/view/com/post-thread/PostThreadItem.tsx | 8 ++++++-- src/view/com/util/PostMeta.tsx | 25 +++++++++++++++---------- src/view/com/util/TimeElapsed.tsx | 21 +++++++++++++++++++++ 4 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 src/view/com/util/TimeElapsed.tsx (limited to 'src') diff --git a/src/state/models/ui/shell.ts b/src/state/models/ui/shell.ts index a0e0cd7b2..1c069232c 100644 --- a/src/state/models/ui/shell.ts +++ b/src/state/models/ui/shell.ts @@ -224,6 +224,7 @@ export class ShellUiModel { activeLightbox: ProfileImageLightbox | ImagesLightbox | null = null isComposerActive = false composerOpts: ComposerOpts | undefined + tickEveryMinute = Date.now() constructor(public rootStore: RootStoreModel) { makeAutoObservable(this, { @@ -231,6 +232,8 @@ export class ShellUiModel { rootStore: false, hydrate: false, }) + + this.setupClock() } serialize(): unknown { @@ -341,4 +344,10 @@ export class ShellUiModel { this.isComposerActive = false this.composerOpts = undefined } + + setupClock() { + setInterval(() => { + this.tickEveryMinute = Date.now() + }, 60_000) + } } diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 133d38421..efc9fe694 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -15,7 +15,7 @@ import {PostDropdownBtn} from '../util/forms/DropdownButton' import * as Toast from '../util/Toast' import {PreviewableUserAvatar} from '../util/UserAvatar' import {s} from 'lib/styles' -import {ago, niceDate} from 'lib/strings/time' +import {niceDate} from 'lib/strings/time' import {sanitizeDisplayName} from 'lib/strings/display-names' import {pluralize} from 'lib/strings/helpers' import {getTranslatorLink, isPostInLanguage} from '../../../locale/helpers' @@ -30,6 +30,7 @@ import {PostSandboxWarning} from '../util/PostSandboxWarning' import {ErrorMessage} from '../util/error/ErrorMessage' import {usePalette} from 'lib/hooks/usePalette' import {formatCount} from '../util/numeric/format' +import {TimeElapsed} from 'view/com/util/TimeElapsed' const PARENT_REPLY_LINE_LENGTH = 8 @@ -189,7 +190,10 @@ export const PostThreadItem = observer(function PostThreadItem({ - · {ago(item.post.indexedAt)} + ·  + + {({timeElapsed}) => <>{timeElapsed}} + diff --git a/src/view/com/util/PostMeta.tsx b/src/view/com/util/PostMeta.tsx index 7f8abebd7..5df6b3983 100644 --- a/src/view/com/util/PostMeta.tsx +++ b/src/view/com/util/PostMeta.tsx @@ -2,12 +2,13 @@ import React from 'react' import {StyleSheet, View} from 'react-native' import {Text} from './text/Text' import {DesktopWebTextLink} from './Link' -import {ago, niceDate} from 'lib/strings/time' +import {niceDate} from 'lib/strings/time' import {usePalette} from 'lib/hooks/usePalette' import {UserAvatar} from './UserAvatar' import {observer} from 'mobx-react-lite' import {sanitizeDisplayName} from 'lib/strings/display-names' import {isAndroid} from 'platform/detection' +import {TimeElapsed} from './TimeElapsed' interface PostMetaOpts { authorAvatar?: string @@ -64,15 +65,19 @@ export const PostMeta = observer(function (opts: PostMetaOpts) { · )} - + + {({timeElapsed}) => ( + + )} + ) }) diff --git a/src/view/com/util/TimeElapsed.tsx b/src/view/com/util/TimeElapsed.tsx new file mode 100644 index 000000000..7b2dd61f3 --- /dev/null +++ b/src/view/com/util/TimeElapsed.tsx @@ -0,0 +1,21 @@ +import React from 'react' +import {observer} from 'mobx-react-lite' +import {ago} from 'lib/strings/time' +import {useStores} from 'state/index' + +export const TimeElapsed = observer(function TimeElapsed({ + timestamp, + children, +}: { + timestamp: string + children: ({timeElapsed}: {timeElapsed: string}) => JSX.Element +}) { + const stores = useStores() + const [timeElapsed, setTimeAgo] = React.useState(ago(timestamp)) + + React.useEffect(() => { + setTimeAgo(ago(timestamp)) + }, [timestamp, setTimeAgo, stores.shell.tickEveryMinute]) + + return children({timeElapsed}) +}) -- cgit 1.4.1