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

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions