Skip to content

feat(ui): show member created dates when the system opts in - #62

Merged
SiteRelEnby merged 2 commits into
mainfrom
feat/member-created-date
Aug 11, 2026
Merged

feat(ui): show member created dates when the system opts in#62
SiteRelEnby merged 2 commits into
mainfrom
feat/member-created-date

Conversation

@SiteRelEnby

Copy link
Copy Markdown
Collaborator

Android side of the "member created date" setting. Held back until the server field shipped; it's in v1.3.5 now, migration included, so this is unblocked.

Verified against the tag rather than the branch I originally built from: SystemRead.show_member_created_date: bool, SystemUpdate.show_member_created_date: bool | None, model default false. Matches what's implemented here.

The setting

Settings > Profile, under a new Display heading: a switch, "Show member created dates" / "Show when each member was added, on their profile."

It saves with that form's Save Changes button rather than applying instantly, which is how web does it too. Saving also writes the updated system through to the local cache, so the profile picks the change up immediately instead of waiting for a Home refresh.

The display

A Created row in the member profile's details card, next to Birthday and Privacy, rendered date-only ("Mar 4, 2026") in the resolved display timezone.

Three deliberate differences from web

Placement. Web puts it as muted text under the name and PK id. Android's profile already keeps exactly this kind of fact - birthday, privacy - in the details card, so a row there is the consistent thing; loose text under the name would be the only such text in that header.

Date only, no clock. Web formats it with the system's date_format setting, which Android doesn't have at all (there's no date_format on our SystemRead). Date-only MMM d, yyyy instead, since the hour a member was added is noise on a profile. Honouring date_format on Android generally is separate work.

No extra request. My first cut fetched systems/me in the profile loader, then I noticed that screen's loads are sequential - it would have added a round-trip to every profile open for a setting that changes about never. It reads the flag from the cached system instead, with the write-through above covering freshness.

Safe against older servers

A missing field reads as off, so an old cached payload or a server predating v1.3.5 keeps the date hidden rather than showing it unasked. No fallback needed beyond that: the setting simply stays off and the row never appears.

Testing

:app:assemblePlayRelease, :app:assembleOpenRelease, :app:testPlayReleaseUnitTest green, rebased onto current main.

Three wire-contract tests (13 in that file now): the snake_case name round-trips both directions, absent-means-off, and switching the toggle back off still reaches the wire. That last one is the silent-failure case - SystemUpdate fields are nullable and Moshi omits nulls, so a null would make un-toggling a no-op the server would happily report as unchanged.

Device checklist:

  • Settings > Profile > Display: toggle on, Save; a member profile shows a Created row
  • Toggle back off, Save; the row disappears (this is the case the test above guards)
  • Date renders in the chosen display timezone, and matches what web shows for the same member
  • Against a pre-1.3.5 server: no row, no error, toggle simply doesn't stick

Not covered

The wear member profile doesn't show it. The setting says "on their profile" and web only does its own, so I left the watch alone rather than guess.

Client side of the new show_member_created_date system setting. Off by default,
matching the backend: some systems want to see when each member was added,
others find it noise.

The toggle lives in Settings > Profile under a Display heading, saved with the
rest of that form rather than applying instantly, which is how the web client
does it too. Saving writes the updated system through to the local cache so the
profile picks the change up immediately instead of waiting for a Home refresh.

On the profile itself the date is a row in the details card, next to birthday
and privacy. Web shows it as muted text under the name, but on Android that is
where facts like this already live. Rendered date-only in the resolved display
timezone: the hour a member was added is noise on a profile.

The flag is read from the cached system rather than its own request, because
this screen's loads are sequential and a fifth call would add a round-trip to
every profile open for a setting that changes about never. A missing field (old
cached payload, or a server predating the setting) reads as off, so the date
stays hidden rather than appearing unasked.

Wire-contract tests cover the snake_case name in both directions, the
absent-means-off default, and that switching the toggle back off still reaches
the wire instead of being dropped as a null.
@SiteRelEnby
SiteRelEnby enabled auto-merge August 11, 2026 21:16
@SiteRelEnby
SiteRelEnby merged commit ed9f0c3 into main Aug 11, 2026
1 check passed
@SiteRelEnby
SiteRelEnby deleted the feat/member-created-date branch August 11, 2026 21:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant