Skip to content

Pubky profile & contacts — outstanding work (Android + iOS) #902

@piotr-iohk

Description

@piotr-iohk

Pubky profile & contacts — outstanding work

Purpose: Issue planning and AI context for what is still open after the big Pubky PRs (e.g. bitkit-android#824, bitkit-ios#476). Each [ ] is a candidate ticket or subtask.

Explicitly closed / do not re-file (unless product changes): Android “Deriving your keys” on create; contact import count / no obvious hard cap in PubkyRepo.prepareImport; blocking add-self + invalid pubky (logic works); “Your Pubky” on profile edit vs “Pubky” on contact edit (intentional); contacts list section layout; iOS Continue on create profile is disabled when name is empty (CreateProfileView); iOS simulator paste garbling; testing blocked by homegate/network; Disconnect / profile__sign_out_* only on rare empty or failed profile load on Profile (not the normal loaded-profile path).


Shared (both apps)

  • Wallet backup → restore → Pubky still disconnected
    Flow: create profile → backup → reset wallet → restore. Expected eventually: same wallet seed should restore on-chain + LN state and Pubky session/credentials (or clear product rule + UI). Today: user lands disconnected; needs backup/restore + Pubky migration work (not done in the feature PRs; author pointed to a follow-up PR for restore).

  • Delete profile — confirm copy parity (iOS shorter than Android)

    • Android: profile__delete_confirm_title + profile__delete_confirm_description (longer: current profile data, can create again for this pubky later) in values/strings.xml.
    • iOS: profile__delete_title + profile__delete_description — e.g. “This will delete your Pubky profile.” in en.lproj/Localizable.stringsless detail than Android. Align body copy and Transifex.
    • Note, I think the Andorid description is better, also added note in Figma
  • Add contact — same messages for invalid key and add-self (cross-platform + E2E)

    • Android: contacts__add_error_invalid_key, contacts__add_error_self (AddContactScreen / AddContactViewModel).
    • iOS add-contact sheet: still uses slashtags__contact_error_key, slashtags__contact_error_yourself in AddContactSheetdifferent keys and tone (e.g. “This is not a valid key.” vs Android wording). Unify English and translation keys for parity and stable E2E selectors.
  • Empty contacts list (only “My profile”) — layout + CTA vs Figma and each other
    Screenshot-level gaps: order of empty copy vs primary button (iOS: text then button, centered; Android: ContactsScreen EmptyState — button contacts__intro_add_contact then contacts__empty_state, top-biased). Label: iOS empty CTA often uses contacts__add_button“Add”; Android “Add Contact”. Reconcile to one Figma spec and matching strings. 👇

Image
  • Contact edit — notes/bio placeholder is still the profile one
    Shared form: Android ProfileEditForm uses profile__edit_bio_placeholder“Short note. Tell a bit about yourself.” for all users of the form; iOS ProfileEditFormView bioSection uses profile__create_bio_placeholder (same first-person idea). For editing another user’s contact, that copy is wrong. Add e.g. contacts__edit_bio_placeholder (or equivalent) and pass it from EditContactScreen / EditContactView only. 👇
Image
  • Contact delete — Figma: trash+primary in shared form
    • Android: ProfileEditForm.kt — delete block uses PrimaryButton with ic_trash + deleteLabel (red). Used for both profile and contact edit.
    • iOS: ProfileEditFormView deleteSectionCustomButton with Image("trash") + label. Review asked for contact delete without this pattern; align contact (and if needed profile) to current Figma. 👇
Image
  • “Please note…” / public profile line — copy + placement (Figma) on profile edit and contact edit

    • Copy: Wording (the “please note your profile is public” style line) on Edit profile and Edit contact must match Figma, not a placeholder or outdated draft. Android: ProfileEditForm + EditProfileScreen / EditContactScreen use footerNote / profile__edit_public_note (and contact may pass a different or no footer — verify what contact edit should show in Figma). iOS: EditProfileView sets footerNote: t("profile__edit_public_note"); EditContactView uses footerNote: nil for the form — if Figma shows a line on both, add the right key(s) to Localizable.strings and wire.
    • iOS placement bug: In ProfileEditFormView, the footnote is rendered in footerBar (safeAreaInset Stacked above Cancel / Save). Figma’s order / region is wrong here (user: note is incorrectly above the action buttons). Fix: Move the public note to the position in the Figma file (often in the scroll with the form, or a specific margin relative to actions — not stuck in the bottom chrome above CTA). Android: footerNote currently sits in the scrolling column with showFooterNote before the in-form Save/Cancel row — still reconcile text + vertical position with the same Figma as iOS.
    • Add-contact flow has a separate “please note” / privacy string (contacts__add_privacy_notice on Android, contacts__add_disclaimer on iOS) — if Figma also changed that line, include in the same design pass or a linked ticket.
  • Product / QA follow-ups (if not shipped): profile QR and home
    From Android QA: e.g. tap profile QR to copy pubkey (like other sheets); paste pubkey on home to decode/handle (like other deep flows). Backlog until implemented; confirm scope with product.

  • Figma pass — other gaps (not covered by the “Please note / footnote” item above)
    Do not reopen closed nits. Re-check: dialog chrome, any remaining “please note” on add-contact if split from edit, one-off dialog/sheet treatments. Tracked as one sweep or split by screen.


Android-only nuance (same tickets as above, implementation detail)

  • Empty state implementation lives in ContactsScreen.kt EmptyState (button-then-text, top spacing). iOS: ContactsListView emptyContent.

  • After adding link we get back to edit profile and the keyboard becomes active - seems unnecesary.

  • link rows look disabled;

  • post–delete profile navigation vs Figma


iOS-only nuance (same tickets as above, implementation detail)

  • Delete/placeholder/validation items above touch EditProfileView / EditContactView + ProfileEditFormView + Localizable.strings.

  • bottom gradient on long edit; link field affordance; import avatar stack;

  • post–delete profile navigation vs Figma


Not work items (context for AIs / triage)

  • Sim-only clipboard weirdness.
  • Homegate down → cannot test “create in Bitkit”. (only local docker-homegate supported atm. see: https://github.com/synonymdev/bitkit-e2e-tests/tree/main/docker)
  • profile__sign_out = “Disconnect” on empty/failed profile screen — different from Delete profile on edit; not visible on happy path.

Re-verify on your target branch before closing tasks.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions