AGENT SKILL

cometchat-angular-v5-placement

Where CometChat components go in an Angular app — the chat shell layout, thread and details panels, search, routing a chat page, and the mobile one-pane fallback. Triggers: 'add a chat page', 'put chat in my dashboard', 'conversation list beside messages', 'open a thread panel', 'chat route', 'make chat responsive'.

License 许可
MIT
最近更新
2026-11-11
Stars
★ 1.6k
Forks
474

01 前言 Front Matter

name
cometchat-angular-v5-placement
license
MIT
metadata
{ "tags": "cometchat angular placement v5 layout routing panels responsive shell", "author": "CometChat", "version": "1.0.0" }
description
Where CometChat components go in an Angular app — the chat shell layout, thread and details panels, search, routing a chat page, and the mobile one-pane fallback. Triggers: 'add a chat page', 'put chat in my dashboard', 'conversation list beside messages', 'open a thread panel', 'chat route', 'make chat responsive'.
compatibility
@cometchat/chat-uikit-angular ^5 (5.1.0–5.2.0 verified); Angular 17-21

02 资源文件 2

03 SKILL.md 正文

Ground truth: @cometchat/chat-uikit-angular@5 (5.1.0–5.2.0 verified). Uses only components in the angular-v5 catalog. The layouts here are built FROM the live task guides — {DOCS_BASE}/ui-kit/angular/guides/new-chat.md, /guides/group-chat.md, /guides/threaded-messages.md, /guides/search-messages.md, plus /angular-conversation, /angular-one-to-one-chat, /angular-tab-based-chat and /api-reference/chat-state-service.md; base + paths in cometchat-angular-v5-core/references/docs-map.md. Fetch layout-specific inputs from the component's .md twin rather than reading the installed bundle. APPEND to the user's app — additive only (RULES.md).

Companion skills (read first)

  • cometchat-angular-v5-core — install, credentials, init→login→render, and references/layout.md for the sizing rules this skill assumes.
  • cometchat-angular-v5-components — which component to use and its real inputs/outputs.

Use this skill when

Deciding where chat lives: a dedicated route, a panel inside an existing dashboard, a widget, or the full multi-pane app.

Pick a placement

Ask Placement Recipe
"add chat to my app" (unscoped) Core surface — list + message pane, thread and search as panels references/core-surface.md
"the whole chat app" — users, groups, calls, details Combined app — tabbed selector + panels references/combined-app.md
"chat inside my dashboard" Embed the core surface in an existing layout slot below
"a support widget" Single conversation — header + list + composer, no list pane below

Default to the core surface for an unscoped request. Grow to the combined app only when asked.

Active item — use ChatStateService, not your own field

Angular ships an injectable source of truth for the active chat. It exposes signals and observables; prefer signals in templates. This is what satisfies "the selected row is visually reflected" and makes panel-close round-trip correctly.

import { Component, computed, inject } from '@angular/core';
import { CometChat } from '@cometchat/chat-sdk-javascript';
import { ChatStateService, CometChatUIKitConstants } from '@cometchat/chat-uikit-angular';

@Component({ selector: 'app-chat-shell', standalone: true, template: '' })
export class ChatShellComponent {
  readonly chatState = inject(ChatStateService);
  // The service's signals are `T | null`, but the kit's inputs are optional
  // (`T | undefined`) — bind the raw signal and Angular's strict template check
  // rejects it. Normalise once, here.
  readonly activeUser = computed(() => this.chatState.activeUser() ?? undefined);
  readonly activeGroup = computed(() => this.chatState.activeGroup() ?? undefined);

  // (itemClick) emits a Conversation — resolve the subject, then branch on its TYPE.
  // A Conversation has no getGuid(), so duck-typing routes groups into the user slot
  // and the message pane throws "getUid is not a function". See references/core-surface.md.
  open(conversation: CometChat.Conversation) {
    const subject = conversation.getConversationWith();
    if (conversation.getConversationType() === CometChatUIKitConstants.MessageReceiverType.group) {
      this.chatState.setActiveGroup(subject as CometChat.Group);
    } else {
      this.chatState.setActiveUser(subject as CometChat.User);
    }
  }
  closeChat() { this.chatState.clearActiveChat(); }
}

Available: activeUser activeGroup activeConversation (signals) · activeUser$ activeGroup$ activeConversation$ (observables) · setActiveUser/Group/Conversation · getActiveChatEntity() · clearActiveChat().

Keeping a separate selected field alongside this is how the two drift and the list stops highlighting the open conversation.

Panels are columns, not overlays

Thread, user/group details and search are additional columns in the same flex shell. Opening one must not resize or remount the message list, and closing must return to the exact prior layout.

<div class="cc-shell">
  <aside class="cc-side"><!-- list --></aside>
  <main class="cc-main"><!-- header · list · composer --></main>
  <aside class="cc-panel" *ngIf="threadParent()"><!-- thread --></aside>
</div>
.cc-shell { display: flex; height: 100dvh; width: 100%; min-height: 0; overflow: hidden; }
.cc-side  { width: 320px; min-height: 0; overflow: hidden; }
.cc-main  { flex: 1; display: flex; flex-direction: column; min-height: 0; overflow: hidden; }
.cc-panel { width: 360px; min-height: 0; overflow: hidden; border-left: 1px solid var(--cometchat-border-color-default); }

min-height: 0 on every column is required — see core's references/layout.md.

Routing a chat page

// app.routes.ts
import { Routes } from '@angular/router';
export const routes: Routes = [
  { path: 'chat', loadComponent: () => import('./chat/chat.component').then(m => m.ChatComponent) },
  { path: 'chat/:uid', loadComponent: () => import('./chat/chat.component').then(m => m.ChatComponent) },
];

Two rules:

  1. Do not re-init CometChat per route. Init happens once at bootstrap (core). A route guard may await login, never re-init.
  2. Tear down on leave. Every subscription in the chat component needs takeUntil(destroy$) in ngOnDestroy, or navigating away leaks listeners that keep firing.

Reading :uid into the active chat belongs in the component's ngOnInit, resolved through ChatStateService.

Embedding in an existing dashboard

Give the host slot a resolved height and let the shell fill it — do not put the kit inside a container sized by its content.

.dashboard-chat-slot { height: calc(100dvh - var(--app-header-height)); min-height: 0; display: flex; }

If the surrounding app uses transform or filter on an ancestor, the height chain breaks — core's layout.md covers why.

Mobile — one pane at a time (mandatory for any multi-pane layout)

Below ~768px show the list or the conversation, never both.

<div class="cc-shell">
  <aside class="cc-side" [hidden]="isMobile() && hasActiveChat()"><!-- list --></aside>
  <main class="cc-main" [hidden]="isMobile() && !hasActiveChat()"><!-- message pane --></main>
</div>

Drive [hidden] from the same ChatStateService state as the message components, and give the mobile conversation view a back control that calls clearActiveChat(). A multi-pane layout squeezed onto a phone is a defect, not a style choice.

Common pitfalls

  1. Two sources of truth — a local selected field plus ChatStateService. They drift; the list stops highlighting.
  2. Panels as overlays — thread rendered over the list instead of beside it, so closing does not restore layout.
  3. Re-initialising per route — init belongs at bootstrap, once.
  4. No teardown on navigate — leaked listeners keep firing against a destroyed view.
  5. Unsized embed slot — the kit collapses to zero height inside a content-sized container.
  6. Both panes on mobile — unusable at 375px.

Verify it works

Clicking a conversation opens it AND highlights the row · opening a thread does not resize the message list · closing returns to the exact prior layout · navigating away and back does not duplicate messages · at 375px only one pane is visible with a working back control · no console errors.

Explain what you built (REQUIRED close)

Tell the developer what changed, naming the files: the layout you built — which panes exist, and how the mobile one-pane fallback behaves. Flag anything dev-only as dev-only, and say what you did not touch — this is additive.

Then offer these THREE options as a SELECTABLE choice and WAIT for the pick — never auto-continue (RULES.md §19):

  1. Add another feature → a feature from features.angular-v5.json, or growing the surface — users/groups tabs, a details panel, calling. Never offer an auto entry (reactions, mentions, receipts, typing, media) — those are core in v5 and already on.
  2. Customize theming → cometchat-angular-v5-customization.
  3. Test it manually → do nothing further; hand back so the user runs it.

04 同仓库更多 Skills

hashgraph-online
hashgraph-online/awesome-codex-plugins

migrate-to-e2e

Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for /migrate-to-e2e, "migrate our tests to e2e", "port these Maestro flows", "move our TesterArmy tests", or when a project has an e2e config and an older suite still running.

★ 1.6k
hashgraph-online
hashgraph-online/awesome-codex-plugins

e2e

Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.

★ 1.6k
hashgraph-online
hashgraph-online/awesome-codex-plugins

create-verification-skill

Generate a project-local verify-<app> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for /create-verification-skill, "make a verification skill for this repo", or when a project has no scripted way to prove UI behavior.

★ 1.6k
hashgraph-online
hashgraph-online/awesome-codex-plugins

deja-search

deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.

★ 1.6k
hashgraph-online
hashgraph-online/awesome-codex-plugins

deja-reflect

End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.

★ 1.6k
hashgraph-online
hashgraph-online/awesome-codex-plugins

revid

Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.

图像与多媒体Skill与智能体开发
★ 1.6k