Skip to content

feat: group conversations UI#31

Merged
osmaczko merged 4 commits into
masterfrom
feat/groupv2
Jul 10, 2026
Merged

feat: group conversations UI#31
osmaczko merged 4 commits into
masterfrom
feat/groupv2

Conversation

@osmaczko

@osmaczko osmaczko commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

feat: group conversations UI

feat: group conversations UI

The UI surfaced only 1:1 conversations, but chat_module now exposes GroupV2
groups, so the UI needs to create them, display their roster, and grow them.

  • ChatBackend gains create_group_conversation / add_group_member and exposes
    the current conversation's group view state (currentIsGroup,
    currentDisplayName, memberCount) as replicated backend properties: across
    the QtRO boundary a model replica carries roles and data() but not the
    source model's custom Q_INVOKABLE methods or a reliable rowCount(), so that
    whole-model state is derived on the source side and pushed as properties.
    refreshMembers reads the roster as [GroupMember] records.
  • MemberListModel drives the members panel; a member with no confirmed
    account renders as "unknown_account".
  • ConversationListModel marks group rows; ChatView shows the members panel
    and per-message sender labels only for groups; MembersPane hosts the roster
    and the add-member field.
  • Pin chat_module to the GroupV2 rev (chat-module #43): its GroupV2 contract
    (create_group_conversation, add_group_member, list_group_members, the
    conversation kind and message sender fields) isn't in a released line yet,
    so pin it so the contract can't shift under a nix flake update.

test: add a three-party group-chat doc-test and CI gate

Exercise the group UI end to end: three headless app instances form a group,
grow it member by member, and render the roster, captured as a screenshot.

  • doctests/chat-ui-group.test.yaml plus doctests/group/ drive three instances
    on ports distinct from the exchange spec, so both specs can run in one job
    without their module hosts colliding; nix run .#group launches the
    screenshot app.
  • doctests.yml runs the group spec alongside exchange; group-chat.yml is a
    dedicated Ubuntu gate that runs the three-party driver from the checkout.

Note (not part of the commit history): chat_module is rev-pinned to its
feat/groupv2 tip (logos-co/logos-chat-module#43), which itself sits on merged
libchat main, because the GroupV2 contract has no chat_module release yet; re-thread
to a tag once one is cut. Base is master.

@github-actions

github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown

📊 Doc-test report

The chat UI built against this commit, driven headless to connect and share its address, rendered alongside the commands actually run and their output (updated each run, commit 6b7649f):

Pages can take a minute to update after the run finishes.

@osmaczko osmaczko force-pushed the feat/groupv2 branch 3 times, most recently from 568deb9 to f30da76 Compare July 5, 2026 17:20
@osmaczko osmaczko force-pushed the feat/bump-chat-module-threaded-client branch 2 times, most recently from 775aed0 to 6a19cbc Compare July 6, 2026 10:11
@osmaczko osmaczko changed the title feat: group conversations UI (contract 0.3.0) feat: group conversations UI Jul 6, 2026
@osmaczko osmaczko force-pushed the feat/bump-chat-module-threaded-client branch 2 times, most recently from 6024ca3 to 6928e5d Compare July 6, 2026 14:38
Base automatically changed from feat/bump-chat-module-threaded-client to master July 6, 2026 15:41
@osmaczko osmaczko force-pushed the feat/groupv2 branch 4 times, most recently from 39b4c9a to 3d6f1e3 Compare July 9, 2026 19:48
@osmaczko osmaczko marked this pull request as ready for review July 9, 2026 20:15
@osmaczko osmaczko requested review from igor-sirotin and jazzz July 9, 2026 20:16
@osmaczko osmaczko force-pushed the feat/groupv2 branch 2 times, most recently from 1470750 to e1c4e85 Compare July 10, 2026 08:07

@jazzz jazzz left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 👍

osmaczko added 4 commits July 10, 2026 10:34
The UI surfaced only 1:1 conversations, but chat_module now exposes GroupV2
groups, so the UI needs to create them, display their roster, and grow them.

- ChatBackend gains create_group_conversation / add_group_member and exposes
  the current conversation's group view state (currentIsGroup,
  currentDisplayName, memberCount) as replicated backend properties: across
  the QtRO boundary a model replica carries roles and data() but not the
  source model's custom Q_INVOKABLE methods or a reliable rowCount(), so that
  whole-model state is derived on the source side and pushed as properties.
  refreshMembers reads the roster as [GroupMember] records.
- MemberListModel drives the members panel; a member with no confirmed
  account renders as "unknown_account".
- ConversationListModel marks group rows; ChatView shows the members panel
  and per-message sender labels only for groups; MembersPane hosts the roster
  and the add-member field.
- Pin chat_module to the merged GroupV2 commit on chat-module master (#43): its
  GroupV2 contract (create_group_conversation, add_group_member,
  list_group_members, the conversation kind and message sender fields) isn't in
  a released tag yet, so pin the exact commit and re-pin as chat_module advances.
Exercise the group UI end to end: three headless app instances form a group,
grow it member by member, and render the roster, captured as a screenshot.

- doctests/chat-ui-group.test.yaml plus doctests/group/ drive three instances
  on ports distinct from the exchange spec, so both specs can run in one job
  without their module hosts colliding; nix run .#group launches the
  screenshot app.
- doctests.yml runs the group spec alongside exchange; group-chat.yml is a
  dedicated Ubuntu gate that runs the three-party driver from the checkout.
Running side-by-side instances was only covered in the linked
two-instance-exchange doc. Add it to the README's How to Run directly: the
per-instance env vars (CHAT_MODULE_INSTANCE_PATH, CHAT_MODULE_DELIVERY_PORT, and
QML_INSPECTOR_PORT when driving an instance via the inspector), a copy-paste
two-window example and how to scale to more, with the exchange/group drivers
linked for the full flow.
The Dependencies and Related Repositories tables listed the delivery-module
runtime pin as v0.1.2; the flake pins v0.1.3. Match them.
@osmaczko osmaczko merged commit 2732086 into master Jul 10, 2026
5 checks passed
@osmaczko osmaczko deleted the feat/groupv2 branch July 10, 2026 09:17
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.

3 participants