Installation
pnpm dlx @docyrus/cli add @docyrus/rn-time-entry-listUsage
import { TimeEntryList } from '@/components/docyrus-native/time-entry-list';
<TimeEntryList entries={entries} onEntryPress={openEntry} />All copy falls back to t('ui.timeEntryList.*') from <UiTranslationProvider> (English defaults below). Pass messages to override individual labels:
<TimeEntryList
entries={entries}
messages={{ empty: 'Nothing logged this week', statusLabels: { running: 'Live' } }}
/>Dates render through dateFormatter when given, else the mounted DateFormatProvider's formatDateTime, else Intl (MMM d, HH:mm in the device locale).
API Reference
TimeEntryListProps
| Prop | Type | Default | Description |
|---|---|---|---|
entries | TimeEntryListItem[] | — | Time entry rows to render |
messages | TimeEntryListMessagesInput | — | App-supplied copy; every key optional, wins over the translation provider |
isLoading | boolean | false | Shows loading state |
emptyMessage | string | — | Optional empty state override |
size | 'sm' | 'md' | 'md' | Controls row density |
showStatus | boolean | true | Displays the status chip |
showBillable | boolean | true | Displays the billable/non-billable chip |
onEntryPress | (entry: TimeEntryListItem) => void | — | Row press handler |
dateFormatter | (date: string) => string | — | Overrides the date formatting (wins over DateFormatProvider) |
className | string | — | Additional wrapper classes |
contentContainerClassName | string | — | Additional content container classes |
TimeEntryListMessages
messages accepts TimeEntryListMessagesInput — the same fields, all optional (statusLabels is a Partial).
| Field | Type | Fallback key | English fallback |
|---|---|---|---|
loading | string | ui.timeEntryList.loading | Loading time entries... |
empty | string | ui.timeEntryList.empty | No time entries yet |
billable | string | ui.timeEntryList.billable | Billable |
nonBillable | string | ui.timeEntryList.nonBillable | Non-billable |
statusLabels.draft | string | ui.timeEntryList.statusDraft | Draft |
statusLabels.submitted | string | ui.timeEntryList.statusSubmitted | Submitted |
statusLabels.approved | string | ui.timeEntryList.statusApproved | Approved |
statusLabels.rejected | string | ui.timeEntryList.statusRejected | Rejected |
statusLabels.running | string | ui.timeEntryList.statusRunning | Running |
statusLabels.completed | string | ui.timeEntryList.statusCompleted | Completed |
Components
| Component | Description |
|---|---|
TimeEntryList | FlashList-backed time entry feed |
Type Exports
| Type | Description |
|---|---|
TimeEntryListProps | Props for TimeEntryList |
TimeEntryListItem | A time entry row |
TimeEntryListStatus | 'draft' | 'submitted' | 'approved' | 'rejected' | 'running' | 'completed' |
TimeEntryListSize | 'sm' | 'md' |
TimeEntryListMessages | Full copy shape |
TimeEntryListMessagesInput | Partial messages prop shape |
TeamChatChannel
Team chat channel feed for React Native with an inverted list, day separators, an unread marker, a keyboard-docked composer with @ mentions, emoji, attachments and entity links, long-press reactions and thread sheets.
TimeSlotScheduler
Calendly-style booking scheduler — generated slots with capacity, reservations and disabled reasons, a paged week view, a month view with availability dots, and a user / event / timezone summary card.