Skip to content

chore: land v15 on master - #3304

Merged
MartinCupela merged 36 commits into
masterfrom
chore/land-v15-on-master
Sep 28, 2026
Merged

MartinCupela merged 36 commits into
masterfrom
chore/land-v15-on-master

Conversation

@MartinCupela

@MartinCupela MartinCupela commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Do not use the merge button

Land this with a fast-forward push, not through GitHub:

git push origin chore/land-v15-on-master:master
  • "Squash and merge" would flatten the 35 v15 commits into one.
  • "Rebase and merge" would copy them with new hashes and lose the merge that takes release-v15's files.
  • "Create a merge commit" keeps the history, but adds a second, redundant merge commit.

The push adds exactly one merge commit to master, and GitHub then marks this PR as merged. master is frozen until then. If it moves, this merge has to be redone.

🎯 Goal

Land v15 on master:

The full release-v15 history comes along: 35 commits, with their original hashes, authors and messages. After this lands, release-v15 can be retired.

🛠 Implementation details

One merge commit (9b7c9e0ae), with parents master (0fb5ac306, 14.12.0) and release-v15 (a6ed6aa35).

Every v14 change since the fork at 14.10.0 was ported to release-v15 as its own commit (REACT-1180), or ruled out (#3257). So all 170 conflicts resolve to release-v15's version, and the merged files are release-v15's except for five:

File Change
CHANGELOG.md Keeps master's 14.11.0, 14.11.1 and 14.12.0 entries, which release-v15's changelog lacks
.releaserc.json Same branch list as release-v14: release-v14 → latest, master → rc prerelease. The version-picking plugin switches from angular to conventionalcommits, so ! marks a breaking change (as in GetStream/stream-chat-js#1837). It also gets a { "breaking": true, "release": "major" } rule
AGENTS.md v15 is developed on master and published as release candidates; v14 fixes go to release-v14
developers/BRANCHES.md Describes the two base branches, and forbids breaking changes on release-v14
.github/workflows/size.yml release-v15 → release-v14

Why the extra breaking rule. This repo has a custom rule "refactor → patch". Under conventionalcommits, a refactor!: commit is parsed as type refactor, that custom rule matches, and semantic-release never checks whether the commit is breaking. Without the extra rule, #3289, #3288 and #3016 would drop from major to patch. When several rules match, the highest wins.

Replay of both presets through the real version-picking plugin, over 432 commits (the last 400 on master plus the 35 from v15):

release-v14 keeps angular on purpose. It publishes to latest and can't be capped at 14.x, so a stray feat!: there is ignored instead of publishing 15.0.0.

✅ Verification

A local dry run of semantic-release 25.0.3 on this exact merge proposes 15.0.0-rc.1 on the rc channel: it found v14.12.0, 36 new commits, and a major release.

After it lands

  1. Pushing to master redeploys the vite example to Vercel production, for both the Development and Public projects. Those sites then run v15.
  2. Run the Release workflow on master in dry-run mode, then for real. That publishes 15.0.0-rc.1 to rc and commits its CHANGELOG.md entry.
  3. The rc.1 release notes will be long. Some squash-merged commit messages carry whole PR descriptions after a BREAKING CHANGE: footer. Tidy the GitHub release and the CHANGELOG.md entry afterwards.
  4. Retire release-v15, which has no open PRs, and unfreeze master.

🎨 UI Changes

None beyond v15 itself.

MartinCupela and others added 30 commits July 3, 2026 11:37
…xt to StateStore instances (#3237)

BREAKING CHANGE: requires stream-chat v10.
* Removed `ChannelStateContext` and `ChannelActionContext` along with
  `useChannelStateContext()`, `useChannelActionContext()`,
  `useCreateChannelStateContext()` and `useCreateChannelActionContext()`.
  Read the channel via `useChannel()` and message state via
  `useMessagePaginator()`; both are backed by LLC `StateStore`s.
* `ChatContext` no longer exposes the active channel or `setActiveChannel()`.
  Channel/thread routing is slot-driven — use `useChatViewNavigation()` from
  `stream-chat-react/slot-layout` (`openChannel`, `openThread`, `closeThread`).
* The `TypingContext` provider path was removed from the `Channel` runtime.
  `TypingIndicator` now derives its state from LLC stores and takes
  `isMessageListScrolledToBottom` and `scrollToBottom` props.
* Context mutation/pagination helpers were replaced by paginator methods:
  `updateMessage`/`removeMessage` -> `ingestItem`/`removeItem`;
  `loadMore`/`loadMoreNewer` -> `toTail()`/`toHead()`;
  `jumpToMessage`/`jumpToFirstUnreadMessage` -> `messagePaginator.jumpToMessage()`/
  `jumpToTheFirstUnreadMessage()`. Messages are no longer in `channel.state`.
* Custom send/update/delete/markRead overrides move from ChannelActionContext
  callbacks to `channel.configState.requestHandlers` /
  `thread.configState.requestHandlers`.
* `ChatView` is a navigation landmark, not a WAI-ARIA Tabs widget: the selector
  is `role="navigation"` with `aria-current` on the active button. There is no
  `role="tab"`/`"tablist"`/`"tabpanel"`. `activeChatView` renamed to `activeView`.
* `ChannelList` renders a `role="listbox"` whose items are `role="option"`.
* v10 data shapes: channel name/image read from `channel.data.custom.name`/
  `.custom.image`; user custom fields from `user.custom` (e.g. `username`);
  attachment `duration`/`file_size`/`mime_type`/`waveform_data` from
  `attachment.custom`. Message moderation uses `message.moderation`
  (`moderation_details` is gone).
# Conflicts:
#	examples/tutorial/package.json
#	examples/vite/package.json
#	package.json
#	src/components/Message/MessageRepliesCountButton.tsx
#	src/components/Threads/ThreadList/ThreadListItemUI.tsx
#	src/components/TypingIndicator/TypingIndicator.tsx
#	src/components/TypingIndicator/hooks/useDebouncedTypingActive.ts
#	src/context/index.ts
#	src/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.tsx
#	yarn.lock
BREAKING CHANGE: the <Chat> prop and the ChatContext field channelPaginatorsOrchestrator are renamed to channelManager, and the types ChannelPaginatorsOrchestrator / ChannelPaginatorsOrchestratorState are now ChannelManager / ChannelManagerState. Every useChatContext() consumer reading the old field, and any test that builds a partial ChatContext value, has to be updated. No deprecated prop or type aliases are exported.
…tion keys (#3261)

### 🎯 Goal

Closes
[REACT-1028](https://linear.app/stream/issue/REACT-1028/i18n-keep-the-english-translations-only).

Two problems with i18n in v14, both fixed here.

**The 11 non-English locales shipped whether you used them or not.**
They were statically imported and copied into `Streami18n` at
construction, so they were un-treeshakeable even for an English-only app
— ~112 KB gzip (27% of the bundle), plus 11 `dayjs/locale/*` side-effect
imports and ~150 lines of calendar config.

**Translation keys _were_ the English copy.** `t('Send Message')` meant
375 of 706 `en.json` entries were `"X": "X"` duplication, any copy edit
silently orphaned all 12 translations, and the same word in two contexts
couldn't be disambiguated — the codebase had already grown an ad-hoc
`aria/` prefix to work around exactly that.

v15 is the one window where renaming public translation keys is cheap,
so both land together.

### 🛠 Implementation details

Keys are now stable dotted identifiers, with the English copy inline as
i18next's `defaultValue`:

```ts
const { t } = useTranslationContext();

t('message.status.sent.text', 'Sent');

t('channel.memberCount.title', {
  count,
  defaultValue_one: '{{ count }} member',
  defaultValue_other: '{{ count }} members',
});
```

Namespaces follow the source tree (`message.*`, `messageComposer.*`,
`poll.*`), with shared copy under `common.*` and the modality as the
leaf (`.label`, `.ariaLabel`, `.placeholder`, `.title`, `.text`). 633
keys across 724 call sites.

Keeping the copy inline is what makes a partial dictionary safe — an
unsupplied key still renders English rather than a raw key path — and it
means **only 71 keys ship as data** (`timestamp.*`, `duration.*`,
`language.*`, and one postProcessor directive: the ones that can't carry
an inline default). The other 562 render from the `defaultValue` at
their call site, removing a further 39,915 raw bytes of duplicated
strings.

`src/i18n/keys.ts` is generated from the call sites and is
**type-only**, so the typed key surface costs nothing at runtime. `yarn
build-translations` regenerates it and hard-fails on a key used with two
different copies, a key with no inline default and no bundled entry, or
a key defined in both places. CI re-runs it and fails on any diff.

---

## Modifying existing copy

Pass overrides for the built-in English. Everything you don't mention is
untouched:

```ts
import { Streami18n } from 'stream-chat-react';
import type { TranslationDictionary } from 'stream-chat-react';

const i18n = new Streami18n({
  translationsForLanguage: {
    'textareaComposer.textareaPlaceholder.sendMessage.label': 'Write something…',
  } satisfies TranslationDictionary,
});

<Chat client={client} i18nInstance={i18n}>…</Chat>
```

```
placeholder      → "Write something…"   (overridden)
common.cancel    → "Cancel"             (untouched, from the inline default)
message timestamp→ "10:30"              (untouched, from runtimeDefaults)
```

`registerTranslation('en', {…})` does the same thing after construction.
Every language is layered over the bundled defaults — however you select
it, and even with no dictionary at all — so overriding one string can't
knock out timestamps.

## Catching unknown keys at compile time

Key names are checked against the catalog, so a typo or a leftover v14
key is a compile error:

```ts
const good: TranslationDictionary = { 'common.cancel.label': 'Dismiss' };

const typo: TranslationDictionary = { 'common.cancel.lable': 'Dismiss' };
//                                          ^ TS2353 — not a key in the catalog

const stale: TranslationDictionary = { Cancel: 'Dismiss' };
//                                           ^ TS2353 — v14 key, no longer exists
```

(TypeScript reports the first unknown property per object literal, so
fix them one at a time.)

No annotation needed — the parameters are typed, so a dictionary written
straight into the call is checked too:

```ts
i18n.registerTranslation('de', { 'common.cancel.lable': 'Abbrechen' });
//                                ^ TS2353 — not a key in the catalog
```

This matters because the failure is otherwise silent: a key that doesn't
match simply never applies, and you get English with no error.

Which type to use:

| | plural `_one`/`_other` | extra categories (`_few`, `_many`, `_zero`)
| plural suffix on a non-plural key | stale v14 key | your own keys |
| --- | --- | --- | --- | --- | --- |
| `TranslationDictionary` | ✅ | ✅ | ❌ rejected | ❌ rejected | ❌ rejected
|
| `LooseTranslationDictionary` | ✅ | ✅ | ⚠️ permitted | ⚠️ permitted | ✅
|

`registerTranslation()` and `translationsForLanguage` take the strict
`TranslationDictionary`, so a key written inline is checked — that is
where a typo used to slip through. `LooseTranslationDictionary` is the
escape hatch for keys the SDK does not define; annotate the variable you
pass to opt into it, at the cost of not catching a stale key.

Reaching for it is rarely necessary: `TranslationDictionary` accepts any
category `Intl.PluralRules` can select, so Russian or Arabic can supply
`_few` / `_many` / `_zero` and stay fully checked.

`TranslationKey` is the union `t()` accepts; use it to type a `t`
parameter. It is **not** the right key type for a dictionary, because
plural entries live in the catalog as `_one`/`_other` while `t()` takes
the bare handle.

Discovering keys: `TranslationKey` autocompletes in any editor,
`TranslationCatalog` maps each key to its English copy (hover to see
what a key renders, or index it —
`TranslationCatalog['common.cancel.label']` is `'Cancel'`), and `yarn
i18n:export` writes the 619 translatable keys as JSON for a translator
or TMS. The 14 formatter expressions are left out — a TMS that localises
`{{value, notification}}` breaks notifications — with `--all` for the
full catalog.

## Registering a new language

```ts
import { Streami18n } from 'stream-chat-react';
import type { TranslationDictionary } from 'stream-chat-react';
import 'dayjs/locale/de.js';

const de: TranslationDictionary = {
  'common.cancel.label': 'Abbrechen',
  'channelDetail.channelMembersView.members.title_one': '{{ count }} Mitglied',
  'channelDetail.channelMembersView.members.title_other': '{{ count }} Mitglieder',
};

const i18n = new Streami18n({
  language: 'de',
  dayjsLocaleConfigForLanguage: {
    calendar: { sameDay: '[heute um] LT', lastDay: '[gestern um] LT' /* … */ },
  },
});

i18n.registerTranslation('de', de);
```

```
common.cancel.label  → "Abbrechen"
members.title, n=1   → "1 Mitglied"      ← Intl.PluralRules picks the form
members.title, n=4   → "4 Mitglieder"
common.back.label    → "Back"            ← not supplied, falls back to English
message timestamp    → "10:30"           ← inherited from runtimeDefaults
```

Plurals are stored as `_one` / `_other`; supply whichever categories
your language needs and i18next selects between them, so Russian or
Arabic can add `_few`, `_many`, `_zero` — all of them type-checked.

Date formats are the one thing you must supply yourself now, and it
takes two steps.

**1.** Only the `en` dayjs locale is bundled, so import your locale and
pass `dayjsLocaleConfigForLanguage` (including its `calendar` block), or
pass your own preconfigured `DateTimeParser`. That covers month and
weekday names, the plain formats, and the keys that format against the
locale's own calendar.

**2.** Override the four `timestamp.*` keys that pass their own
`calendarFormats`: `DateSeparator`, `ReminderNotification`,
`ChannelPreviewTimestamp`, `ChannelDetailPinnedMessageTimestamp`. dayjs
takes the calendar wording as part of the format string, so these carry
English day words — and a per-key `calendarFormats` replaces the
locale's calendar wholesale, so step 1 never reaches them. Skip this and
a fully configured German app still renders "Today" in its date
separators. [Date and time](ai-docs/i18n-v15-migration.md#date-and-time)
has the copy-pasteable German version.

---

### Migration

Every v14 key maps to exactly one v15 key. The full 603-row table is
[`ai-docs/i18n-v15-key-map.json`](ai-docs/i18n-v15-key-map.json); the
integrator-facing guide is
[`ai-docs/i18n-v15-migration.md`](ai-docs/i18n-v15-migration.md).
Nothing to do if you use the SDK in English and never touched i18n.

A later release adding a key will **not** break a custom dictionary —
`TranslationDictionary` is `Partial`, so the new string renders its
inline English until it is translated. [Keeping a language up to
date](ai-docs/i18n-v15-migration.md#keeping-a-language-up-to-date-across-upgrades)
shows how to turn that into a compile-time diff of what is still
untranslated, and a CI gate for completeness.

Also removed: the `deTranslations` … `trTranslations` exports, and the
misspelled `geti18Instance()` accessor (use the public `i18nInstance`
field).

Bundled along the way: **i18next 25 → 26**. None of its breaking changes
apply to us — we never used `interpolation.format` (formatters already
go through `services.formatter.add`), `initImmediate`, or
`i18next.format`. One undocumented v26 change worth knowing: an
undefined interpolation value now short-circuits before the formatter
runs. No effect on the SDK, but a custom formatter that produced output
from an undefined value will stop being called.

### 🎨 UI Changes

**None.** Every rendered string is byte-identical — the English copy
moved from `en.json` into an inline `defaultValue` at the same call
site. The existing suite is the evidence: ~808 assertions on rendered
English text, all passing unchanged.

<details>
<summary>Verification</summary>

- `yarn test` — 2789 passed, 227 files
- `tsc -p tsconfig.lib.json --noEmit` — clean
- `yarn types:scripts` — clean
- `yarn lint` — clean
- `yarn validate-translations` — clean (regenerates `keys.ts`
byte-identically)
- `examples/vite` and `examples/tutorial` — `tsc` clean

</details>
…3267)

### 🎯 Goal


[REACT-1026](https://linear.app/stream/issue/REACT-1026/drop-componentname-param-from-context-consumer-hooks)

Context hooks accepted a `componentName` argument used only to name a
component in a `console.warn` when the hook was called outside its
provider. React DevTools does that better, and the diagnostic was mostly
inert: of the 7 hooks accepting it, 3 ignored it and
`useTranslationContext` could never reach its warn branch. Meanwhile it
was threaded through 138 call sites and often wrong — 11 passed a hook
name, several were stale, and 5 passed `Component.name`, which minifies
away.

BREAKING CHANGE:
- **Context hooks no longer accept a `componentName` argument.**
`useChatContext('X')` and friends stop type-checking; drop the argument.
- **Required contexts throw when used outside their provider**, instead
of logging a warning and returning `{}`. Affects the 14 hooks listed
above. Components must be rendered within the provider they read from —
e.g. anything calling `useChatContext` needs a `<Chat>` ancestor.
- **`useChannelInstanceContext` returns
`Partial<ChannelInstanceContextValue>`** — `channel` is now typed as
possibly `undefined`.
- **`ChatViewContext` has no default value** (typed `| undefined`), so
`useContext(ChatViewContext)` may return `undefined`.
- **`MessageComposerContext` is typed as `MessageComposerContextValue |
undefined`**, correcting a narrower declaration that was papered over
with casts.
- **The gallery header no longer uses the
`ComponentContext.MessageTimestamp` override**; it renders the item's
own timestamp.

### 🛠 Implementation details

Parameter removed from all 7 hooks and their 138 call sites.

Missing-provider behaviour also normalized, since `src/` had three
competing conventions (warn + `{} as T`, throw, silent cast). The `{} as
T` fallback deferred failures to a downstream `Cannot read properties of
undefined` several frames away. Everything now goes through
`requireContext` (`src/context/requireContext.ts`):

- **Required → throw**, naming hook and provider: `useChatContext`,
`useMessageContext`, `useMessageComposerContext`,
`useMessageListContext`, `useVirtualizedMessageListContext`,
`useMessageBounceContext`, `usePollContext`, `useDialogManager`,
`useSearchContext`, `useSearchSourceResultsContext`,
`useContextMenuContext`, `useChannelListItemContext`,
`useGalleryContext`, `useChatViewContext`
- **Optional by design → keep default, honest type**:
`useTranslationContext`, `useComponentContext`,
`useChannelInstanceContext` (now `Partial`), `useModalContext`,
`useAriaLiveAnnouncer`, `useMessageTranslationViewContext`
- **Renders both inside and outside a provider → read the raw context**:
`Audio`, `VoiceRecording`, `CardAudio`, `Timestamp`,
`MessageRepliesCountButton`, `MessageComposerUI`, `ModalGallery`

Two changes were needed before their hooks could throw:

- `WithDragAndDropUpload` detected the composer via
`Object.keys(ctx).length > 0`; now uses a
`useIsWithinMessageComposerContext()` predicate. Adds the test file this
component lacked.
- `GalleryHeader` read message context while rendering outside any
`MessageProvider`. `GalleryItem` now carries `user` and `createdAt` —
wrapping the call sites would be wrong, since `ChannelMediaView`
flattens many messages into one list. Adds a
`timestamp.GalleryTimestamp` key.

`ChatViewContext` also loses its module-level `LayoutController`
default, which let unrelated subtrees write to one shared instance.

`src/context/__tests__/missingProviderContract.test.tsx` pins the
required/optional split.

### 🎨 UI Changes

The channel-media gallery header now shows a per-item sender and
timestamp, which it previously couldn't display at all.

No screenshots: the demo users on the shared environment have no
channels, and seeding one would write test data others would see.
Covered by unit tests in `GalleryUI.test.tsx` — worth a manual look.
…#3268)

### Goal


[REACT-1027](https://linear.app/stream/issue/REACT-1027/remove-the-deprecated-message-component-override-from-componentcontext)

`ComponentContext.Message` was deprecated in favour of `MessageUI`
during v14 but never removed. Removing it surfaced four more ways to
reach the same component — a `Message` prop on `Message`, `MessageList`,
`VirtualizedMessageList` and `Thread` — now all collapsed onto the
`MessageUI` slot.

BREAKING CHANGES:
- **`ComponentContext.Message` removed** → use the `MessageUI` slot.
- **The `Message` prop is removed from `Message`, `MessageList`,
`VirtualizedMessageList` and `Thread`**, and therefore from
`additionalMessageListProps`, `additionalVirtualizedMessageListProps`
and `additionalParentMessageProps`. To replace a per-component prop,
scope the slot to that subtree:

  ```tsx
  // before
  <Thread Message={CustomThreadMessage} />

  // after
  <WithComponents overrides={{ MessageUI: CustomThreadMessage }}>
    <Thread />
  </WithComponents>
  ```

- **`areMessagePropsEqual` no longer compares the message UI component**
— it comes from context, and context updates re-render consumers
regardless of `React.memo`.

`VirtualMessage` is unchanged and still wins inside
`VirtualizedMessageList`, but now only within that list. Full migration
detail: `ai-docs/ai-migration-v14-v15.md`.

### Implementation details

`MessageProps.Message` was the transport `VirtualizedMessageList` and
`Thread` used to inject their resolved component, so deleting it naively
would have silently broken the `VirtualMessage` slot. Instead,
`VirtualizedMessageList` applies `VirtualMessage` to its own subtree's
`ComponentContext` — wrapping only when the slot is set — which also
retires `VirtuosoContext.Message`. `Thread`'s three-step resolution
collapses entirely; context already carries the component.
`WithComponents` now memoizes its merged override map: required, not
cosmetic, since an unmemoized provider on the list's render path would
defeat per-message memoization.

`VirtualMessage` had no test coverage, which is what made this risky.
Added three tests — precedence, subtree scoping, unset fallback — and
the precedence one fails on `release-v15`. They assert what
`useComponentContext()` resolves to rather than inspecting rendered
items, because Virtuoso renders zero items under jsdom and an item-level
assertion would pass either way.

Verified: `tsc -p tsconfig.lib.json --noEmit` clean · `yarn test` 231
files, 2828 passed / 1 skipped · `yarn lint-fix` clean. Each documented
failure mode was compiled to confirm it errors (`TS2322` for props,
`TS2561` for override keys).

**Unrelated change:** the v14 → v15 guide also gains a section on the
context-hook `componentName` removal from #3267, included at the
author's request rather than split out.

### UI Changes

None — override plumbing only; the default message UI and every existing
`MessageUI` / `VirtualMessage` override render exactly as before.
…3269)

### Goal

The ESM build collapsed the whole source tree into a single chunk, which
defeats tree-shaking in consumer apps: importing only `Chat` pulled
405kB.

### Implementation details

- `preserveModules` on the ESM output only, so `dist/es` mirrors `src`
one file per module (11 files -> 516). Consumer bundlers drop unused
modules first, guided by our `sideEffects` field, and only then attempt
statement-level elimination -- a merged chunk leaves nothing to drop.
CJS stays chunked, since consumers do not tree-shake CJS.
- Entry filenames and the `package.json` exports map are unchanged.
- Measured consumer bundles: `import { Chat }` 405.1 -> 33.1 kB, `Chat +
Channel + MessageList` 451.7 -> 332.6 kB,
`stream-chat-react/slot-layout` 426.1 -> 160.4 kB. Whole-SDK import
unchanged. Published package grows ~199kB raw.
- Dropped the `browserslist` field: nothing in the repo reads it and its
query contradicted the ES2022 output floor. Fixed the stale ES2020
target note in CLAUDE.md and recorded why `emptyOutDir` must stay
`false`.

Verified: `yarn build` green, 231 test files / 2825 tests pass, ESM and
CJS entries both load with 611 exports and a single shared
`ChatContext`.

### UI Changes

None, build output only.
### 🎯 Goal

Relevant stream-chat-js PR:
GetStream/stream-chat-js#1832

### 🛠 Implementation details

_Provide a description of the implementation_

### 🎨 UI Changes

_Add relevant screenshots_
…3271)

Adopts the shared i18n layer from `stream-chat/i18n`, deleting ~1,100
lines of runtime this package no longer needs to own: `Streami18n`, the
formatter/date half of `i18n/utils.ts`,
`TranslationBuilder/TranslationBuilder.ts`, `externalStrings.ts`, and
most of the codegen script (249 lines → ~40, over the generator core now
ships).

What stays here is what is genuinely this SDK's: the generated key
catalog, `runtimeDefaults`, and the notification translation topic.

**Behaviour changes**

- Notification copy is a `Record<CoreNotificationType, Translator>`, so
a new identifier in `stream-chat` is a compile error until mapped. Dead
rows for identifiers this SDK never emits are gone; three
previously-unmapped core identifiers now translate instead of rendering
untranslated English.
- The 57 `language.*` entries move to core, generated from
`TranslationLanguage`, so `MessageTranslationIndicator` drops its
`asDynamicKey` + string-compare miss detection.
- Reactivity is core's `StateStore`. `setLanguage()` returns `void`;
`getTranslators()` is now `init()`. **No deprecated aliases** —
`Streami18n` keeps its name, so integrator code is unchanged there.
- Two timestamp edge cases render differently; both documented in
`ai-docs/i18n-v15-migration.md`.
- Drops `i18next` / `dayjs` / `moment-timezone` from `dependencies` —
core supplies the first two, and the third's type leak into the
published `.d.ts` is replaced by core's structural `DateTimeLike`.

Also adds a `catalogRenders` test (this package had no equivalent of
RN's regression net) and puts `release-v15` in `size.yml`'s branch
filter, which was only running on `master`.

**Verified** against a locally packed core: 2,829 tests, `validate-esm`,
`validate-cjs`, lint. Adopting the shared layer surfaced seven real
defects in it, all fixed in the core PR with regression tests.

⚠️ **Blocked:** needs `stream-chat@10.0.0-rc.3`
(GetStream/stream-chat-js#1830). The lockfile is deliberately untouched
and must be regenerated once that publishes — until then `yarn install
--immutable` fails, hence draft.

Pre-existing and not from this PR: `yarn build`'s `tsc` step fails on 3
imports (`APIErrorResponse`, `EventAPIResponse`) removed from core after
rc.2. Needs fixing when this package bumps its core range.
Not yet ready to be merged

Relevant stream-chat-js PR:
GetStream/stream-chat-js#1836

### 🎯 Goal

_Describe why we are making this change_

### 🛠 Implementation details

_Provide a description of the implementation_

### 🎨 UI Changes

_Add relevant screenshots_

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
BREAKING CHANGE: request-handler props are removed from `Channel` and
`Thread`.
`doSendMessageRequest`, `doUpdateMessageRequest`,
`doDeleteMessageRequest` and
`doMarkReadRequest` are gone, along with `useChannelRequestHandlers`,
`useThreadRequestHandlers` and `useEditMessageHandler`. Register once on
the client:

```
  // v14
  <Channel channel={channel} doSendMessageRequest={mySend}>

  // v15
  client.config.set({
    channel: {
      requestHandlers: {
        sendMessageRequest: async ({ localMessage, message, options }) => ({
          message: await mySend(message, options),
        }),
      },
    },
  });
```

Three differences: handlers take a single params object and return `{
message }`; thread
flows register under the `thread` key; and registration is per CLIENT,
not per mounted
subtree — the one thing the props could do that this cannot. Per-channel
behaviour now
needs a branch inside one handler on the `cid` it receives.

BREAKING CHANGE: `useChannelConfig` returns the channel's RESOLVED
configuration instead
of the channel type's raw server config, so field names change:

channelConfig?.typing_events → channelConfig?.typingEvents.enabled
channelConfig?.read_events → channelConfig?.readEvents.enabled
channelConfig?.replies → channelConfig?.replies.enabled
channelConfig?.user_message_reminders →
channelConfig?.userMessageReminders.enabled
channelConfig?.commands → channelConfig?.availableCommands

Every gate is now the server flag ANDed with what is registered through
`client.config`,
which is what the client actually enforces. The hook also subscribes:
these were getters,
so a `client.config.set()` previously never reached the screen. No
component reads
`channel.serverConfig` any more.

BREAKING CHANGE: `useAttachmentManagerState` replaces
`hasCustomDoUploadRequest` with
`customCdn`, and gains `attachmentsEnabled`, `locationEnabled` and
`pollsEnabled`.

BREAKING CHANGE: the per-domain stores on `channel.state` are removed —
`readStore`,
`typingStore`, `membersStore`, `watcherStore`, `ownCapabilitiesStore`,
`mutedUsersStore`.
Subscribe to `channel.state` itself; the selector is unchanged, because
`ChannelStateData`
is flat and keeps the same top-level keys:

useStateStore(channel.state.ownCapabilitiesStore, sel) →
useStateStore(channel.state, sel)

`WatcherState` is renamed `ChannelWatchState`, and
`channel.disconnected` is renamed
`channel.pendingDisposal` (removed outright — no deprecated alias).

BREAKING CHANGE: `AIStates` is no longer exported from
`stream-chat-react` — import it
from `stream-chat`. The values are unchanged, but it is now
literal-typed, so an inferred
array of its members no longer accepts the wide `AIState`:

const STOPPABLE: readonly AIState[] = [AIStates.Thinking,
AIStates.Generating];

BREAKING CHANGE: `<Channel>` marks its channel active while mounted and
reloads it on
`connection.recovered`. The client skips re-seeding an active channel's
message list on
hydration and reconnect, so the consumer owns that window. A custom
channel surface that
does not render `<Channel>` must call `channel.activate()` /
`deactivate()` and
`channel.reload()` itself, or its list goes stale after a reconnect.
Relevant stream-chat-js PR:
GetStream/stream-chat-js#1849

## Breaking changes
- `MessageListProps.headerPosition` is now nanoseconds
- `ChatContextValue. latestMessageDatesByChannels` record now stores
nanoseconds instead of Dates
- `VirtualizedMessageListProps. lastReadDate` is now nanoseconds instead
of Date
- `ProcessMessagesContext.lastRead` is now nanoseconds instead of Date
- `ProcessMessagesParams.lastRead` is now nanoseconds instead of Date

The change can produce runtime errors not caught by TS compiler;
integrators should check their code for these potential issues:

```
# the idioms that now fail silently
grep -rn "isDate(\|instanceof Date\|\.getTime?\?\.\?(\|as string | Date" src

# raw timestamps interpolated into translations
grep -rn "t(.*timestamp\|t(.*date" src

# every surviving `new Date(x)` with an argument
grep -rn "new Date([^)]" src

```

---------

Co-authored-by: Oliver Lazoroski <oliver.lazoroski@gmail.com>
> Tracked in
[REACT-1172](https://linear.app/stream/issue/REACT-1172/extract-the-i18n-foundation-into-stream-ioi18n)

Retargets every `stream-chat/i18n` import to
[`@stream-io/i18n`](GetStream/js-toolkit#51),
where the shared runtime now lives. The API is unchanged — only the
specifier moves.

> **BREAKING** — requires `@stream-io/i18n` and
`stream-chat@^10.0.0-rc.10`.

## ⚠️ CI will fail the install step until the dependencies publish

`@stream-io/i18n@1.0.0` and `stream-chat@10.0.0-rc.10` are not on npm
yet, so `yarn.lock` **cannot be regenerated** and is deliberately left
untouched in this PR. Everything else is reviewable now. Locally this
was verified against packed tarballs of both.

## What changed

- Every `stream-chat/i18n` import → `@stream-io/i18n` (5 files plus the
codegen script).
- `languageNameDefaults` / `LanguageNameCatalog` now come from
`stream-chat`'s **root** barrel — they enumerate the languages the Chat
API can auto-translate a message into, so they stayed with Chat.
- `TranslationContext` and `useStreami18n` are built on the shared
bindings in `@stream-io/i18n/react`, so this SDK and React Native stop
carrying two copies of the same context plumbing and store subscription.

What stays this SDK's own: the catalog-typed `t`, the notification
translation topic, and supplying a context **default** rather than
throwing — which is what lets a primitive render outside `<Chat>` (React
Native throws instead, which is why the shared factory takes that as an
option).

`@stream-io/i18n` is a **regular dependency, not a peer**: an integrator
never imports it — they import the `Streami18n` this package subclasses
and re-exports.

## Also fixes: `yarn types` checked nothing

It ran `tsc` with no `--project`, so it picked up the root solution file
(`"files": []`) and exited 0 **even with a deliberate type error in
`src/`**. It is now `tsc -p tsconfig.lib.json --noEmit`, verified to
fail on a planted error, and added to CI — which previously typechecked
only the build scripts, so a library type error could reach `master`.
`CLAUDE.md` / `AGENTS.md` updated accordingly (they documented the trap
rather than fixing it).

## Verification

`yarn types` (the real one), `yarn lint`, and **2,769 tests** all pass
against locally-linked builds of `@stream-io/i18n` and `stream-chat`.
Also verified end-to-end in the Vite example: switching language at
runtime updates copy, plurals, placeholders, aria-labels **and** dates —
`Tue, 2 Aug` → `Di., 2. Aug.`, `08/02/2022` → `02.08.2022` — with no
reload.

## Merge order

After [js-toolkit#51](GetStream/js-toolkit#51)
and
[stream-chat-js#1861](GetStream/stream-chat-js#1861),
then rerun `yarn install` to commit a real lockfile.
…ow its responsibilities (#3286)

BREAKING CHANGE: `ChannelProps.channel` is now required and
`EmptyPlaceholder` is removed.
Render the exported `ChannelPlaceholder` to fill the same
`.str-chat__channel` layout slot
while no channel is selected.

BREAKING CHANGE: `Channel` no longer queries the channel;
`initializeOnMount` and
`channelQueryOptions` are removed. Whoever supplies the channel
initializes it — use the
exported `getChannel({ channel, client })`, which watches and
de-duplicates concurrent calls.
Channels from `ChannelList` or any `queryChannels` call arrive watched
already. `Channel` no
longer renders `LoadingIndicator` or `LoadingErrorIndicator` for a query
it does not make, and
an uninitialized channel renders as an empty channel with no error.

BREAKING CHANGE: `Channel` no longer writes `document.title`, and
`activeUnreadHandler` is
removed. See `examples/vite/src/DocumentTitleManager` for a working
replacement in application
code.

BREAKING CHANGE: the `channel.channelMissing.text` translation key is
removed. This is a
compile error (TS2353) for any dictionary typed with the exact
`TranslationDictionary` —
delete the entry from custom locale files.

BREAKING CHANGE: `ChatContext.latestMessageDatesByChannels` is removed.
Slow-mode cooldown now
lives on `channel.cooldownTimer` (`useCooldownRemaining` /
`useIsCooldownActive`), and the
channel's latest message on
`channel.messagePaginator.aggregateState.lastMessage`.

BREAKING CHANGE: `Channel` no longer jumps to a message focused from
search. Selecting a search
result calls `channel.messagePaginator.jumpToMessage(id)` directly, and
the highlight is read
from `channel.messagePaginator.messageFocusSignal`. A custom message
list that relied on
`Channel` performing the jump must call `jumpToMessage` itself.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…ole app (#3287)

BREAKING CHANGE: `ChannelProps.allowConcurrentAudioPlayback`,
`ThreadProps.allowConcurrentAudioPlayback` and
`WithAudioPlaybackProps.allowConcurrentPlayback`
are removed, with no replacement. If you passed `true`, delete it:
starting a player now pauses
whichever was playing and takes the shared element over. If you passed
`false` or nothing, the
only change is that playback is exclusive across surfaces rather than
within one.

BREAKING CHANGE: `useActiveAudioPlayer()` now reports the app-wide
active player rather than the
calling surface's.
…sage lists (#3288)

BREAKING CHANGE: the `messageActions` prop is removed from `Channel`,
`MessageList`, `VirtualizedMessageList`, `Thread` and `Message`. Filter
`defaultMessageActionSet` and pass the result as `messageActionSet`
instead.

BREAKING CHANGE: `MESSAGE_ACTIONS`, `OPTIONAL_MESSAGE_ACTIONS`,
`getMessageActions()`, and the `MessageActionsArray` and `Capabilities`
types are no longer exported. Use the new `DefaultMessageActionType`
union for the action types the SDK ships.

BREAKING CHANGE: `MessageContext` no longer carries `getMessageActions`
or `actionsEnabled`. The rendered action set is decided by
`messageActionSet` and each item's own `isVisible` predicate.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…ren (#3289)

BREAKING CHANGE: `Thread` requires a `thread` prop and renders `children`.
`additionalMessageComposerProps`, `additionalMessageListProps`,
`additionalParentMessageProps`, `additionalVirtualizedMessageListProps`, `autoFocus` and
`virtualized` are removed — pass those props to the children you render. `Thread`
provides the thread itself, so it no longer needs to be wrapped in `ThreadProvider`. The
`str-chat__thread--virtualized` class is gone; `Thread` cannot know which list you chose.

BREAKING CHANGE: `Thread.enableDateSeparator` is removed with nothing in its place. A
`MessageList` in a thread now follows its own default and shows date separators unless
you pass `withDateSeparator={false}`.

BREAKING CHANGE: `disableDateSeparator` is renamed to `withDateSeparator` on
`MessageList` (default `true`, was `disableDateSeparator={false}`) and
`VirtualizedMessageList` (default `false`, was `disableDateSeparator={true}`). The rename
also reaches `processMessages`, `useEnrichedMessages`, `FloatingDateSeparator`,
`useFloatingDateSeparator` and `useFloatingDateSeparatorMessageList`.

BREAKING CHANGE: the `head` prop is removed from `MessageList` and
`VirtualizedMessageList`. Both render the thread's parent message from context; override
it with a `ThreadHead` component on `ComponentContext`.

BREAKING CHANGE: `ThreadHeaderProps` is down to `overrideTitle`. `thread` comes from the
thread in context, and `closeThread` goes through workspace navigation — customize it
centrally via `ChatView`'s `deriveWorkspaceNavigation`, or call the new `useCloseThread()`
hook from a header of your own. `ComponentContext.ThreadHeader` is removed; compose the
header you want.

BREAKING CHANGE: `ThreadSlot` wraps its children in `<Thread>` instead of letting them
replace the whole panel, mirroring `ChannelSlot`. Markup that must sit outside the thread
container moves outside `ThreadSlot`; anything needing thread context must sit inside.

BREAKING CHANGE: `Thread` no longer rebuilds its subtree when the thread changes. A
custom component rendered inside `Thread` that relied on being remounted per thread — to
reset local state, or to re-run a mount effect — must depend on the thread instead. The
SDK's own message list does this by keying on the thread; `WithAudioPlayback` by taking
`playbackScope`.

BREAKING CHANGE: `LegacyThreadContext` and its `legacyThread` value are removed. The
thread composer resolves its composition context from the `Thread` instance in
`ThreadContext`.
…ches the live head (#3290)

Jumping to a search result deep in history and then scrolling down
teleported the user to the newest message. Scrolling closes the gap page
by page, and when the last one lands the loaded window merges into the
live head -- `hasMoreNewer` turns false. Two autoscroll paths read that
as "we are at the head now, pin to bottom": the layout effect that keeps
`hasMoreNewer` in its dependencies so a list mounting before its first
page still autoscrolls, and the scroll manager's append branch, which
sees the merged page as messages added below.

Neither is right here. The user is reading where they jumped to, and the
merged page lands below them -- nothing about that transition asks for
the viewport to move.

`useScrollLocationLogic` now derives `justReachedLatestMessageSet` from
the `hasMoreNewer` transition itself and suppresses both paths for that
one render. A trailing layout effect advances the ref afterwards,
declared after the autoscroll effects and the scroll manager's own so
all three observe the transition before it is consumed.

`useMessageListScrollManager` has accepted this flag since #3027 and
returns early on it, but nothing ever passed it -- that branch was dead
until now.
BREAKING CHANGE: the `stream-chat` peer range moves to `^10.0.0-rc.12`. That release removes
`connection.changed`, changes `client.wsConnection` from the socket itself to a wrapper, and moves
the socket's settings into configuration. See GetStream/stream-chat-js PR 1859 for the full list;
an application on an earlier `stream-chat` will not typecheck against this version.

BREAKING CHANGE: connectivity is read from state stores rather than events. Code that listened for
`connection.changed` — to render its own banner, to refetch on reconnect — must subscribe to
`client.wsConnection.state` or `client.networkConnection.state` instead, or use the new
`useWSConnectionState` / `useNetworkConnectionState` hooks. Nothing in this package dispatches or
forwards the old event. Note the two stores name their fields differently: the socket's `isHealthy`
is always a boolean, while the network's `isOnline` is `boolean | undefined`, where `undefined`
means no platform reporter has reported yet and must be tested with `=== false`.

BREAKING CHANGE: `Channel` no longer reloads its channel on `connection.recovered`. The client
reloads every active channel itself and dispatches the event afterwards, so handling it here
reloaded each open channel twice per reconnect. Anything relying on the component to refresh a
channel after a reconnect should rely on the client instead.

BREAKING CHANGE: a socket drop on a working network now renders "Reconnecting…" rather than
"Waiting for network…", from the new `chat.reportLostConnection.reconnecting.text` key. Tests and
dictionaries keyed on the old copy for that case need updating; the `waitingNetwork` key is
unchanged and still used when the device network is down. The delay before either banner appears
now comes from `client.wsConnection.config.offlineNotificationDisplayDelayMs` (5s default) rather
than from a fixed hold inside the client, so changing that config changes when the banner shows.
The `system:network:connection:lost` notification type is unchanged.
…3295)

BREAKING CHANGE: `useSendMessageFn` and `useUpdateMessageFn` are removed. Call
`messageComposer.send()` and `messageComposer.update()` instead. They resolve
`'sent' | 'nothing-to-send' | 'failed'` rather than a boolean, so a truthiness
check on the result now passes for every outcome — compare against `'sent'`.

BREAKING CHANGE: the two message submission failure notifications changed key.
`messageComposer.sendMessageFn.sendMessageRequestFailed.text` is now
`notification.messageSendFailed`, and
`messageComposer.updateMessageFn.editMessageRequestFailed.text` is now
`notification.messageUpdateFailed`. A typed custom translation dictionary fails
to compile until both are renamed.

BREAKING CHANGE: `RetryHandler` takes `Omit<OperationParams<'retry'>, 'message'>`
instead of `RetrySendMessageWithLocalUpdateParams`, which stream-chat removed in
GetStream/stream-chat-js#1882. Code that names the old type must be updated.
### 🎯 Goal

Adopt stream-chat's branded `TimestampNS`
(GetStream/stream-chat-js#1884,
[REACT-1179](https://linear.app/stream/issue/REACT-1179)). stream-chat
now types every server-sent date as `TimestampNS`, a branded
unix-nanosecond `number`. Its published types also make `new
Date(timestamp)` a compile error, because a nanosecond value is out of
`Date`'s range and silently becomes an Invalid Date.

An audit of this SDK found **no runtime unit bugs**: every server
timestamp that becomes a `Date`, gets formatted, or meets `Date.now()`
already goes through `convertTimestampToDate` / `nsToDate` / `nsToMs`.
The work is closing the type gaps so the brand, and with it the guard,
reaches the public props and the tests.

> **Requires `stream-chat@^10.0.0-rc.14`**, the first release with
GetStream/stream-chat-js#1884 (`TimestampNS`, `asTimestampNS`, the
`DateConstructor` guard); this PR bumps the dependency.


### 🛠 Implementation details

**Public types (breaking)**

These now take `TimestampNS`, so a millisecond `number` no longer
compiles:

- `ProcessMessagesParams.lastRead` (`processMessages`)
- `MessageList` `headerPosition` / `insertIntro`. It already had to be
in nanoseconds, but was typed `number`.
- the `VirtualizedMessageList` `lastReadDate` render prop
- `ChannelFilesView.utils`'s internal `normalizeTimestamp`

**Tests and fixtures**

- `mock-builders/generator/time.ts` `convertDateToTimestamp` returns
`TimestampNS`, which makes the generated fixtures assignable (about 50
test errors fixed in one place).
- The reminder, reaction and delivered-event builders brand their
values.
- Hand-written literals (epoch `0`, `NaN`, `now - msToNs(…)`) go through
`asTimestampNS`.
- `MessageList/__tests__/utils.test.ts` passed a `Date` as `lastRead`
through an untyped helper; it now passes `nowNs()`, and the helper is
typed.
- `NotificationAnnouncer.test.tsx` imported a type from the sibling
`../stream-chat-js/src` checkout; it now imports from `stream-chat`.
That removes 17 errors from `yarn types:tests`.

**Other**

- The Vite example's WebSocket event templates type their timestamps
`TimestampNS`.
- `ai-docs/ai-migration-v14-v15.md` now documents:
  - the brand and the Date guard;
- what the guard does not catch: date libraries, `ts ?? Date.now()`,
`Math.max(…)`, and unit mix-ups;
  - `asTimestampNS` and the updated type table.
- The same doc previously listed `latestMessageDatesByChannels` as
retyped; it now points to the section that records its removal.
`i18n-v15-migration.md` no longer destructures it from `useChat`.
- A stale comment on `ChatContextValue.mutes` is fixed.

**Verification** (against the published `stream-chat@10.0.0-rc.14`,
after merging the latest `release-v15`)

- `yarn types`: clean. The unrelated errors this PR described earlier
(`RetrySendMessageWithLocalUpdateParams`, the notification translators)
were fixed on `release-v15` by #3295 / #3296.
- `yarn test`: 2840 passing, 252 files. The `Channel.test.tsx` failure
is gone too.
- `yarn lint` and `yarn validate-translations`: clean.
- I ran the Vite example. Channel list, message list, date separators,
search results and a simulated `message.new` all render correct dates,
with no "Invalid Date" and no console errors.

### 🎨 UI Changes

None. Types, tests and docs only.
MartinCupela and others added 6 commits September 25, 2026 12:04
BREAKING CHANGE: `ChannelListItemProps.channelUpdateCount` is removed.
The unread badge now updates without it.

BREAKING CHANGE: `ChannelListItemProps.key` is removed. React's own
`key` prop is unaffected.

BREAKING CHANGE: `ChannelListItemProps.watchers` is removed. It had no
effect in v15.
…mposer edits (#3299)

BREAKING CHANGE: the `preventClearingOnUnmount` prop is removed from
`MessageComposer`. Drop it. If you relied on unmounting to clear a
composer supplied through `MessageComposerControllerProvider`, call
`clear()` on it yourself when your UI is done with it.
Merge `release-v15` into `master`, so that `master` carries the v15 line
and publishes it as release candidates, while `release-v14` carries v14.

The merged tree is `release-v15`'s, except for:

- `CHANGELOG.md`, which keeps `master`'s entries for 14.11.0 to 14.12.0;
- `.releaserc.json`, which publishes `release-v14` to npm `latest` and
  `master` to npm `rc`, and analyzes commits with the
  `conventionalcommits` preset so a `!` marks a breaking change, plus a
  `breaking` rule so breaking refactors are not held to a patch;
- `AGENTS.md`, `developers/BRANCHES.md` and `size.yml`, which name
  `master` and `release-v14` instead of `release-v15`.

Every v14 change since the fork was ported to `release-v15` as its own
commit, so every conflict resolves to `release-v15`'s version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 783 files, which is 633 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 560f0a80-6a6d-404b-9fad-8f7975a7cf5d

📥 Commits

Reviewing files that changed from the base of the PR and between 0fb5ac3 and 9b7c9e0.

⛔ Files ignored due to path filters (8)
  • src/components/Channel/__tests__/__snapshots__/Channel.test.tsx.snap is excluded by !**/*.snap
  • src/components/ChannelList/__tests__/__snapshots__/ChannelListUI.test.tsx.snap is excluded by !**/*.snap
  • src/components/ChannelListItem/__tests__/__snapshots__/ChannelListItemUI.test.tsx.snap is excluded by !**/*.snap
  • src/components/MediaRecorder/AudioRecorder/__tests__/__snapshots__/AudioRecorder.test.tsx.snap is excluded by !**/*.snap
  • src/components/MessageComposer/__tests__/__snapshots__/AttachmentPreviewList.test.tsx.snap is excluded by !**/*.snap
  • src/components/MessageList/__tests__/__snapshots__/VirtualizedMessageList.test.tsx.snap is excluded by !**/*.snap
  • tsconfig.test.tsbuildinfo is excluded by !**/*.tsbuildinfo
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (783)
  • .claude/launch.json
  • .github/workflows/ci.yml
  • .github/workflows/size.yml
  • .gitignore
  • .lintstagedrc.json
  • .releaserc.json
  • AGENTS.md
  • ai-docs/ai-migration-v14-v15.md
  • ai-docs/ai-migration.md
  • ai-docs/breaking-changes.md
  • ai-docs/i18n-v15-key-map.json
  • ai-docs/i18n-v15-migration.md
  • ai-docs/instance-configuration.md
  • developers/BRANCHES.md
  • eslint.config.mjs
  • examples/tutorial/.env.example
  • examples/tutorial/README.md
  • examples/tutorial/package.json
  • examples/tutorial/src/2-client-setup/commandMiddlewares.ts
  • examples/tutorial/src/2-client-setup/credentials.ts
  • examples/tutorial/src/3-core-component-setup/App.tsx
  • examples/tutorial/src/4-channel-list/App.tsx
  • examples/tutorial/src/4-channel-list/layout.css
  • examples/tutorial/src/5-theming/App.tsx
  • examples/tutorial/src/5-theming/layout.css
  • examples/tutorial/src/6-custom-ui-components/App.tsx
  • examples/tutorial/src/6-custom-ui-components/layout.css
  • examples/tutorial/src/7-emoji-picker/App.tsx
  • examples/tutorial/src/7-emoji-picker/layout.css
  • examples/tutorial/src/optional-custom-attachment-type/App.tsx
  • examples/tutorial/src/optional-livestream/App.tsx
  • examples/tutorial/src/tutorial-main.css
  • examples/vite/docs-playwright/screenshot-misc.ts
  • examples/vite/docs-playwright/screenshot-system-message.ts
  • examples/vite/docs-playwright/take-tier1-screenshots.mjs
  • examples/vite/index.html
  • examples/vite/package.json
  • examples/vite/src/App.tsx
  • examples/vite/src/AppSettings/ActionsMenu/ActionsMenu.tsx
  • examples/vite/src/AppSettings/ActionsMenu/AttachmentPromptDialog.tsx
  • examples/vite/src/AppSettings/ActionsMenu/DraggableDialog.tsx
  • examples/vite/src/AppSettings/ActionsMenu/ServerSideClientPromptDialog/ServerSideClientPromptDialog.tsx
  • examples/vite/src/AppSettings/ActionsMenu/ServerSideClientPromptDialog/index.ts
  • examples/vite/src/AppSettings/ActionsMenu/ServerSideClientPromptDialog/serverSideClient.ts
  • examples/vite/src/AppSettings/ActionsMenu/ServerSideClientPromptDialog/serverSideClientFlag.ts
  • examples/vite/src/AppSettings/ActionsMenu/ServerSideClientPromptDialog/serverSideMethods.ts
  • examples/vite/src/AppSettings/ActionsMenu/WebSocketEventPromptDialog/WebSocketEventPromptDialog.tsx
  • examples/vite/src/AppSettings/ActionsMenu/WebSocketEventPromptDialog/websocketEventAutomation.ts
  • examples/vite/src/AppSettings/ActionsMenu/WebSocketEventPromptDialog/websocketEventTemplates.ts
  • examples/vite/src/AppSettings/AppSettings.scss
  • examples/vite/src/AppSettings/AppSettings.tsx
  • examples/vite/src/AppSettings/SearchableSelect.tsx
  • examples/vite/src/AppSettings/fullscreen.tsx
  • examples/vite/src/AppSettings/state.ts
  • examples/vite/src/AppSettings/tabs/ChannelDetail/removeMembersHeaderActions.tsx
  • examples/vite/src/AppSettings/tabs/Configuration/ConfigurationTab.tsx
  • examples/vite/src/AppSettings/tabs/Configuration/ReferenceValueEditor.tsx
  • examples/vite/src/AppSettings/tabs/Configuration/configurationTree.ts
  • examples/vite/src/AppSettings/tabs/Configuration/index.ts
  • examples/vite/src/AppSettings/tabs/General/GeneralTab.tsx
  • examples/vite/src/AppSettings/tabs/MessageActions/MessageActionsTab.tsx
  • examples/vite/src/AppSettings/tabs/Reactions/ReactionsTab.tsx
  • examples/vite/src/AppSettings/tabs/Reactions/reactionsExampleData.ts
  • examples/vite/src/AppSettings/tabs/SettingsTabLayoutComponents.tsx
  • examples/vite/src/ChannelPreviewOverlay/ChannelPreviewOverlay.tsx
  • examples/vite/src/ChatLayout/AlsoSentInChannelIndicator.tsx
  • examples/vite/src/ChatLayout/ChannelMembersRemoveView.tsx
  • examples/vite/src/ChatLayout/ConfiguredChannelDetail.tsx
  • examples/vite/src/ChatLayout/Panels.tsx
  • examples/vite/src/ChatLayout/Resize.tsx
  • examples/vite/src/ChatLayout/ScrollToActiveChannelButton.tsx
  • examples/vite/src/ChatLayout/SwitchableChannelNavigation.tsx
  • examples/vite/src/ChatLayout/Sync.tsx
  • examples/vite/src/ChatLayout/WorkspaceUrlSync.tsx
  • examples/vite/src/ChatLayout/constants.ts
  • examples/vite/src/ChatLayout/focusUrlParam.ts
  • examples/vite/src/ChatLayout/useAdditiveWorkspaceNavigation.ts
  • examples/vite/src/ConnectionDevPanel/ConnectionDevPanel.scss
  • examples/vite/src/ConnectionDevPanel/ConnectionDevPanel.tsx
  • examples/vite/src/CustomMessageActions/ConfigurableMessageActions.tsx
  • examples/vite/src/CustomMessageUi/system-message-variants.css
  • examples/vite/src/CustomMessageUi/variants.css
  • examples/vite/src/CustomMessageUi/variants.tsx
  • examples/vite/src/Debug/ComposerStateDialog.tsx
  • examples/vite/src/Debug/StreamDebugHandles.tsx
  • examples/vite/src/Debug/composerRegistry.ts
  • examples/vite/src/DocumentTitleManager/DocumentTitleManager.tsx
  • examples/vite/src/DocumentTitleManager/index.ts
  • examples/vite/src/DocumentTitleManager/useTotalUnreadChannelMessageCount.ts
  • examples/vite/src/InlineEditMessage/InlineEditMessage.scss
  • examples/vite/src/InlineEditMessage/InlineEditMessage.tsx
  • examples/vite/src/InlineEditMessage/index.ts
  • examples/vite/src/LoadingScreen/LoadingScreen.tsx
  • examples/vite/src/PublicChannelOverlay/PublicChannelOverlay.tsx
  • examples/vite/src/Sidebar/ChatViewSelectorItemSet.tsx
  • examples/vite/src/Sidebar/HeaderContent.tsx
  • examples/vite/src/Sidebar/SidebarToggle.tsx
  • examples/vite/src/SingleChannel/SingleChannel.scss
  • examples/vite/src/SingleChannel/SingleChannelApp.tsx
  • examples/vite/src/i18n/de.ts
  • examples/vite/src/i18n/index.ts
  • examples/vite/src/i18n/it.ts
  • examples/vite/src/icons.tsx
  • examples/vite/src/index.scss
  • examples/vite/src/stream-chat-custom-data.d.ts
  • examples/vite/vite.config.ts
  • i18next.config.ts
  • package.json
  • scripts/generate-i18n-keys.mts
  • scripts/validate-translations.js
  • specs/channel-instance-axis/spec.md
  • specs/layout-controller/decisions.md
  • specs/layout-controller/plan.md
  • specs/layout-controller/spec.md
  • specs/layout-controller/state.json
  • specs/message-pagination/decisions.md
  • specs/message-pagination/plan.md
  • specs/message-pagination/spec.md
  • specs/message-pagination/state.json
  • src/a11y/accessibleLabel.ts
  • src/components/AIStateIndicator/AIStateIndicator.tsx
  • src/components/AIStateIndicator/hooks/useAIState.ts
  • src/components/Accessibility/NotificationAnnouncer.tsx
  • src/components/Accessibility/__tests__/NotificationAnnouncer.test.tsx
  • src/components/Accessibility/hooks/__tests__/useIncomingMessageAnnouncements.test.tsx
  • src/components/Accessibility/hooks/__tests__/useInteractionAnnouncements.test.tsx
  • src/components/Accessibility/hooks/useIncomingMessageAnnouncements.ts
  • src/components/Accessibility/hooks/useInteractionAnnouncements.ts
  • src/components/Accessibility/useAriaLiveAnnouncer.ts
  • src/components/Attachment/Attachment.tsx
  • src/components/Attachment/AttachmentActions.tsx
  • src/components/Attachment/AttachmentContainer.tsx
  • src/components/Attachment/Audio.tsx
  • src/components/Attachment/FileAttachment.tsx
  • src/components/Attachment/Geolocation.tsx
  • src/components/Attachment/Giphy.tsx
  • src/components/Attachment/LinkPreview/Card.tsx
  • src/components/Attachment/LinkPreview/CardAudio.tsx
  • src/components/Attachment/LinkPreview/UnableToRenderCard.tsx
  • src/components/Attachment/ModalGallery.tsx
  • src/components/Attachment/UnsupportedAttachment.tsx
  • src/components/Attachment/VideoAttachment.tsx
  • src/components/Attachment/VisibilityDisclaimer.tsx
  • src/components/Attachment/VoiceRecording.tsx
  • src/components/Attachment/__tests__/Attachment.test.tsx
  • src/components/Attachment/__tests__/AttachmentActions.test.tsx
  • src/components/Attachment/__tests__/AttachmentScopedConfig.test.tsx
  • src/components/Attachment/__tests__/AttachmentUploadProgressIndicator.test.tsx
  • src/components/Attachment/__tests__/Audio.test.tsx
  • src/components/Attachment/__tests__/Card.test.tsx
  • src/components/Attachment/__tests__/File.test.tsx
  • src/components/Attachment/__tests__/Geolocation.test.tsx
  • src/components/Attachment/__tests__/Giphy.test.tsx
  • src/components/Attachment/__tests__/VideoAttachment.test.tsx
  • src/components/Attachment/__tests__/VoiceRecording.test.tsx
  • src/components/Attachment/__tests__/WaveProgressBar.test.tsx
  • src/components/Attachment/components/DownloadButton.tsx
  • src/components/Attachment/components/index.ts
  • src/components/Attachment/hooks/useAttachmentUploadState.ts
  • src/components/Attachment/index.ts
  • src/components/Attachment/styling/ModalGallery.scss
  • src/components/Attachment/styling/index.scss
  • src/components/Attachment/utils.tsx
  • src/components/AudioPlayback/AudioPlaybackArbiter.ts
  • src/components/AudioPlayback/AudioPlayer.ts
  • src/components/AudioPlayback/AudioPlayerPool.ts
  • src/components/AudioPlayback/WithAudioPlayback.tsx
  • src/components/AudioPlayback/__tests__/AudioPlayerPool.test.ts
  • src/components/AudioPlayback/__tests__/ProgressBar.test.tsx
  • src/components/AudioPlayback/__tests__/WithAudioPlayback.test.tsx
  • src/components/AudioPlayback/components/ProgressBar.tsx
  • src/components/AudioPlayback/components/WaveProgressBar.tsx
  • src/components/AudioPlayback/components/progressBarA11y.ts
  • src/components/AudioPlayback/index.ts
  • src/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.ts
  • src/components/AudioPlayback/plugins/__tests__/AudioPlayerNotificationsPlugin.test.ts
  • src/components/Avatar/Avatar.tsx
  • src/components/Avatar/AvatarStack.tsx
  • src/components/Badge/Badge.tsx
  • src/components/Badge/MediaBadge.tsx
  • src/components/BaseImage/ImagePlaceholder.tsx
  • src/components/Button/PlayButton.tsx
  • src/components/Button/WorkspaceNavigationButtons.tsx
  • src/components/Button/__tests__/WorkspaceNavigationButtons.test.tsx
  • src/components/Button/index.ts
  • src/components/Channel/Channel.tsx
  • src/components/Channel/__tests__/Channel.test.tsx
  • src/components/Channel/__tests__/channelInstanceAxis.test.tsx
  • src/components/Channel/__tests__/channelSwitchReset.test.tsx
  • src/components/Channel/channelState.ts
  • src/components/Channel/hooks/useChannelCapabilities.ts
  • src/components/Channel/hooks/useChannelContainerClasses.ts
  • src/components/Channel/hooks/useCreateChannelStateContext.ts
  • src/components/Channel/hooks/useCreateTypingContext.ts
  • src/components/Channel/hooks/useEditMessageHandler.ts
  • src/components/Channel/hooks/useMentionsHandlers.ts
  • src/components/Channel/index.ts
  • src/components/Channel/styling/Channel.scss
  • src/components/Channel/utils.ts
  • src/components/ChannelHeader/ChannelHeader.tsx
  • src/components/ChannelHeader/__tests__/ChannelHeader.test.tsx
  • src/components/ChannelHeader/hooks/__tests__/useChannelHasMembersOnline.test.ts
  • src/components/ChannelHeader/hooks/__tests__/useChannelHasMembersOnline.test.tsx
  • src/components/ChannelHeader/hooks/useChannelHasMembersOnline.ts
  • src/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.ts
  • src/components/ChannelHeader/styling/ChannelHeader.scss
  • src/components/ChannelList/ChannelList.tsx
  • src/components/ChannelList/ChannelListHeader.tsx
  • src/components/ChannelList/ChannelListUI.tsx
  • src/components/ChannelList/ChannelLists.tsx
  • src/components/ChannelList/ChannelNavigation.tsx
  • src/components/ChannelList/__tests__/ChannelList.test.tsx
  • src/components/ChannelList/__tests__/ChannelListHeader.test.tsx
  • src/components/ChannelList/__tests__/ChannelListUI.test.tsx
  • src/components/ChannelList/__tests__/ChannelLists.test.tsx
  • src/components/ChannelList/hooks/index.ts
  • src/components/ChannelList/hooks/useChannelListShape.ts
  • src/components/ChannelList/hooks/useChannelMembersState.ts
  • src/components/ChannelList/hooks/useChannelMembershipState.ts
  • src/components/ChannelList/hooks/useChannelPaginatorState.ts
  • src/components/ChannelList/hooks/useConnectionRecoveredListener.ts
  • src/components/ChannelList/hooks/usePaginatedChannels.ts
  • src/components/ChannelList/hooks/useSelectedChannelState.ts
  • src/components/ChannelList/index.ts
  • src/components/ChannelList/styling/ChannelList.scss
  • src/components/ChannelList/utils.ts
  • src/components/ChannelListItem/ChannelListItem.tsx
  • src/components/ChannelListItem/ChannelListItemActionButtons.defaults.tsx
  • src/components/ChannelListItem/ChannelListItemActionButtons.tsx
  • src/components/ChannelListItem/ChannelListItemTimestamp.tsx
  • src/components/ChannelListItem/ChannelListItemUI.tsx
  • src/components/ChannelListItem/__tests__/ChannelListItem.test.tsx
  • src/components/ChannelListItem/__tests__/ChannelListItemActionButtons.defaults.test.tsx
  • src/components/ChannelListItem/__tests__/ChannelListItemUI.test.tsx
  • src/components/ChannelListItem/__tests__/utils.test.ts
  • src/components/ChannelListItem/hooks/__tests__/useChannelPreviewInfo.test.tsx
  • src/components/ChannelListItem/hooks/__tests__/useIsChannelMuted.test.tsx
  • src/components/ChannelListItem/hooks/__tests__/useMessageDeliveryStatus.test.tsx
  • src/components/ChannelListItem/hooks/useChannelDisplayName.ts
  • src/components/ChannelListItem/hooks/useIsChannelMuted.ts
  • src/components/ChannelListItem/hooks/useIsUserMuted.ts
  • src/components/ChannelListItem/hooks/useMessageDeliveryStatus.ts
  • src/components/ChannelListItem/styling/ChannelListItem.scss
  • src/components/ChannelListItem/utils.a11y.ts
  • src/components/ChannelListItem/utils.tsx
  • src/components/Chat/Chat.tsx
  • src/components/Chat/__tests__/Chat.test.tsx
  • src/components/Chat/hooks/__tests__/connectionStateHooks.test.tsx
  • src/components/Chat/hooks/useChannelsQueryState.ts
  • src/components/Chat/hooks/useChat.ts
  • src/components/Chat/hooks/useCreateChatClient.ts
  • src/components/Chat/hooks/useCreateChatContext.ts
  • src/components/Chat/hooks/useNetworkConnectionState.ts
  • src/components/Chat/hooks/useReportLostConnectionSystemNotification.ts
  • src/components/Chat/hooks/useWSConnectionState.ts
  • src/components/Chat/index.ts
  • src/components/ChatView/ChatView.tsx
  • src/components/ChatView/__tests__/ChatView.test.tsx
  • src/components/ChatView/index.tsx
  • src/components/DateSeparator/DateSeparator.tsx
  • src/components/DateSeparator/__tests__/DateSeparator.test.tsx
  • src/components/Dialog/__tests__/ContextMenu.test.tsx
  • src/components/Dialog/__tests__/DialogPortal.test.tsx
  • src/components/Dialog/components/Callout.tsx
  • src/components/Dialog/components/ContextMenu.tsx
  • src/components/Dialog/components/Prompt.tsx
  • src/components/Dialog/components/Viewer.tsx
  • src/components/Dialog/hooks/usePopoverPosition.ts
  • src/components/Dialog/service/DialogManager.ts
  • src/components/EmptyStateIndicator/EmptyStateIndicator.tsx
  • src/components/EventComponent/__tests__/EventComponent.test.tsx
  • src/components/Form/Dropdown.tsx
  • src/components/Form/NumericInput.tsx
  • src/components/Form/SwitchField.tsx
  • src/components/Form/__tests__/NumericInput.test.tsx
  • src/components/Form/__tests__/SwitchField.test.tsx
  • src/components/Form/styling/NumericInput.scss
  • src/components/Gallery/GalleryContext.tsx
  • src/components/Gallery/GalleryHeader.tsx
  • src/components/Gallery/GalleryUI.tsx
  • src/components/Gallery/__tests__/Gallery.test.tsx
  • src/components/Gallery/__tests__/GalleryContext.test.tsx
  • src/components/Gallery/__tests__/GalleryUI.test.tsx
  • src/components/Gallery/__tests__/Image.test.tsx
  • src/components/Gallery/__tests__/ModalGallery.test.tsx
  • src/components/Gallery/decisions.md
  • src/components/Icons/index.ts
  • src/components/Icons/slots.ts
  • src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx
  • src/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.tsx
  • src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts
  • src/components/LoadMore/LoadMoreButton.tsx
  • src/components/Loading/AttachmentUploadedSizeIndicator.tsx
  • src/components/Loading/LoadingErrorIndicator.tsx
  • src/components/Loading/LoadingIndicator.tsx
  • src/components/Loading/UploadProgressIndicator.tsx
  • src/components/Loading/__tests__/LoadingErrorIndicator.test.tsx
  • src/components/Loading/index.ts
  • src/components/Loading/progress-indicators.tsx
  • src/components/Location/ShareLocationDialog.tsx
  • src/components/Location/__tests__/ShareLocationDialog.test.tsx
  • src/components/Location/hooks/__tests__/useLiveLocationSharingManager.test.tsx
  • src/components/Location/hooks/useLiveLocationSharingManager.ts
  • src/components/MediaRecorder/AudioRecorder/AudioRecorder.tsx
  • src/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.tsx
  • src/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.tsx
  • src/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.tsx
  • src/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.tsx
  • src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.tsx
  • src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecordingPreview.test.tsx
  • src/components/MediaRecorder/RecordingPermissionDeniedNotification.tsx
  • src/components/MediaRecorder/classes/MediaRecorderController.ts
  • src/components/MediaRecorder/classes/__tests__/MediaRecorderController.test.ts
  • src/components/MediaRecorder/hooks/__tests__/useMediaRecorder.test.tsx
  • src/components/MediaRecorder/hooks/useMediaRecorder.ts
  • src/components/Message/Message.tsx
  • src/components/Message/MessageAlsoSentInChannelIndicator.tsx
  • src/components/Message/MessageBlocked.tsx
  • src/components/Message/MessageDeletedBubble.tsx
  • src/components/Message/MessageEditedIndicator.tsx
  • src/components/Message/MessageRepliesCountButton.tsx
  • src/components/Message/MessageStatus.tsx
  • src/components/Message/MessageText.tsx
  • src/components/Message/MessageTimestamp.tsx
  • src/components/Message/MessageTranslationIndicator.tsx
  • src/components/Message/MessageUI.tsx
  • src/components/Message/PinIndicator.tsx
  • src/components/Message/QuotedMessage.tsx
  • src/components/Message/ReminderNotification.tsx
  • src/components/Message/StreamedMessageText.tsx
  • src/components/Message/Timestamp.tsx
  • src/components/Message/__tests__/Message.test.tsx
  • src/components/Message/__tests__/MessageDeleted.test.tsx
  • src/components/Message/__tests__/MessageRepliesCountButton.test.tsx
  • src/components/Message/__tests__/MessageStatus.test.tsx
  • src/components/Message/__tests__/MessageText.test.tsx
  • src/components/Message/__tests__/MessageTimestamp.test.tsx
  • src/components/Message/__tests__/MessageTranslationIndicator.test.tsx
  • src/components/Message/__tests__/MessageUI.test.tsx
  • src/components/Message/__tests__/QuotedMessage.test.tsx
  • src/components/Message/__tests__/ReminderNotification.test.tsx
  • src/components/Message/__tests__/utils.test.ts
  • src/components/Message/hooks/__tests__/useActionHandler.test.tsx
  • src/components/Message/hooks/__tests__/useDeleteHandler.test.tsx
  • src/components/Message/hooks/__tests__/useFlagHandler.test.tsx
  • src/components/Message/hooks/__tests__/useMentionsHandler.test.tsx
  • src/components/Message/hooks/__tests__/useMessageAlsoSentInChannelNavigation.test.tsx
  • src/components/Message/hooks/__tests__/useMuteHandler.test.tsx
  • src/components/Message/hooks/__tests__/useOpenThreadHandler.test.tsx
  • src/components/Message/hooks/__tests__/useReactionHandler.test.tsx
  • src/components/Message/hooks/__tests__/useReactionsFetcher.jsx
  • src/components/Message/hooks/__tests__/useReactionsFetcher.test.tsx
  • src/components/Message/hooks/__tests__/useRetryHandler.test.tsx
  • src/components/Message/hooks/__tests__/useUserRole.test.tsx
  • src/components/Message/hooks/__tests__/userMarkUnreadHandler.test.tsx
  • src/components/Message/hooks/index.ts
  • src/components/Message/hooks/useActionHandler.ts
  • src/components/Message/hooks/useDeleteHandler.ts
  • src/components/Message/hooks/useFlagHandler.ts
  • src/components/Message/hooks/useMarkUnreadHandler.ts
  • src/components/Message/hooks/useMentionsHandler.ts
  • src/components/Message/hooks/useMessageAlsoSentInChannelNavigation.ts
  • src/components/Message/hooks/useMuteHandler.ts
  • src/components/Message/hooks/useOpenThreadHandler.ts
  • src/components/Message/hooks/usePinHandler.ts
  • src/components/Message/hooks/useReactionHandler.ts
  • src/components/Message/hooks/useReactionsFetcher.ts
  • src/components/Message/hooks/useRetryHandler.ts
  • src/components/Message/hooks/useUserRole.ts
  • src/components/Message/styling/QuotedMessage.scss
  • src/components/Message/types.ts
  • src/components/Message/utils.tsx
  • src/components/MessageActions/DeleteMessageAlert.tsx
  • src/components/MessageActions/DownloadSubmenu.tsx
  • src/components/MessageActions/MessageActions.defaults.tsx
  • src/components/MessageActions/MessageActions.tsx
  • src/components/MessageActions/RemindMeSubmenu.tsx
  • src/components/MessageActions/__tests__/MessageActions.test.tsx
  • src/components/MessageActions/hooks/useBaseMessageActionSetFilter.ts
  • src/components/MessageBounce/MessageBouncePrompt.tsx
  • src/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.tsx
  • src/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.tsx
  • src/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.tsx
  • src/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.tsx
  • src/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.tsx
  • src/components/MessageComposer/AttachmentPreviewList/index.ts
  • src/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.tsx
  • src/components/MessageComposer/AttachmentSelector/AttachmentSelector.tsx
  • src/components/MessageComposer/AttachmentSelector/CommandsMenu.tsx
  • src/components/MessageComposer/AttachmentSelector/__tests__/CommandsMenu.test.tsx
  • src/components/MessageComposer/CommandChip.tsx
  • src/components/MessageComposer/EditMessageForm.tsx
  • src/components/MessageComposer/EditedMessagePreview.tsx
  • src/components/MessageComposer/MessageComposer.tsx
  • src/components/MessageComposer/MessageComposerActions.tsx
  • src/components/MessageComposer/MessageComposerUI.tsx
  • src/components/MessageComposer/QuotedMessagePreview.tsx
  • src/components/MessageComposer/RemoveAttachmentPreviewButton.tsx
  • src/components/MessageComposer/SendButton.tsx
  • src/components/MessageComposer/SendToChannelCheckbox.tsx
  • src/components/MessageComposer/StopAIGenerationButton.tsx
  • src/components/MessageComposer/WithDragAndDropUpload.tsx
  • src/components/MessageComposer/__tests__/AttachmentPreviewList.test.tsx
  • src/components/MessageComposer/__tests__/AttachmentSelector.test.tsx
  • src/components/MessageComposer/__tests__/CommandChip.test.tsx
  • src/components/MessageComposer/__tests__/MessageInput.test.tsx
  • src/components/MessageComposer/__tests__/ThreadMessageInput.test.tsx
  • src/components/MessageComposer/__tests__/WithDragAndDropUpload.test.tsx
  • src/components/MessageComposer/__tests__/useAttachmentManagerState.test.tsx
  • src/components/MessageComposer/hooks/__tests__/useCooldownRemaining.test.tsx
  • src/components/MessageComposer/hooks/__tests__/useMessageComposerCommands.test.tsx
  • src/components/MessageComposer/hooks/__tests__/useMessageComposerController.test.tsx
  • src/components/MessageComposer/hooks/__tests__/useSubmitHandler.test.tsx
  • src/components/MessageComposer/hooks/index.ts
  • src/components/MessageComposer/hooks/useAttachmentManagerState.ts
  • src/components/MessageComposer/hooks/useCooldownRemaining.tsx
  • src/components/MessageComposer/hooks/useCreateMessageComposerContext.ts
  • src/components/MessageComposer/hooks/useIsCooldownActive.ts
  • src/components/MessageComposer/hooks/useMessageComposerBindings.ts
  • src/components/MessageComposer/hooks/useMessageComposerCommands.ts
  • src/components/MessageComposer/hooks/useMessageComposerController.ts
  • src/components/MessageComposer/hooks/useMessageComposerHasSendableData.ts
  • src/components/MessageComposer/hooks/useMessageComposerSubmitFn.ts
  • src/components/MessageComposer/hooks/useSubmitHandler.ts
  • src/components/MessageComposer/hooks/utils.ts
  • src/components/MessageComposer/icons.tsx
  • src/components/MessageComposer/index.ts
  • src/components/MessageComposer/styling/QuotedMessagePreview.scss
  • src/components/MessageList/FloatingDateSeparator.tsx
  • src/components/MessageList/MessageList.tsx
  • src/components/MessageList/NewMessageNotification.tsx
  • src/components/MessageList/ScrollToLatestMessageButton.tsx
  • src/components/MessageList/UnreadMessagesNotification.tsx
  • src/components/MessageList/UnreadMessagesSeparator.tsx
  • src/components/MessageList/VirtualizedMessageList.tsx
  • src/components/MessageList/VirtualizedMessageListComponents.tsx
  • src/components/MessageList/__tests__/MessageList.test.tsx
  • src/components/MessageList/__tests__/ScrollToLatestMessageButton.test.tsx
  • src/components/MessageList/__tests__/VirtualizedMessageList.test.tsx
  • src/components/MessageList/__tests__/VirtualizedMessageListComponents.test.tsx
  • src/components/MessageList/__tests__/messageSourceKey.test.ts
  • src/components/MessageList/__tests__/utils.test.ts
  • src/components/MessageList/hooks/MessageList/__tests__/useFloatingDateSeparatorMessageList.test.ts
  • src/components/MessageList/hooks/MessageList/useEnrichedMessages.ts
  • src/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.ts
  • src/components/MessageList/hooks/MessageList/useMessageListElements.tsx
  • src/components/MessageList/hooks/MessageList/useMessageListScrollManager.ts
  • src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx
  • src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts
  • src/components/MessageList/hooks/VirtualizedMessageList/__tests__/useFloatingDateSeparator.test.ts
  • src/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.ts
  • src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts
  • src/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.ts
  • src/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.ts
  • src/components/MessageList/hooks/__tests__/useCanPaginateReplies.test.tsx
  • src/components/MessageList/hooks/__tests__/useMarkRead.test.tsx
  • src/components/MessageList/hooks/__tests__/useMessageListScrollManager.test.tsx
  • src/components/MessageList/hooks/__tests__/useReceiptsByMessageId.test.ts
  • src/components/MessageList/hooks/__tests__/useScrollLocationLogic.test.tsx
  • src/components/MessageList/hooks/__tests__/useThreadHead.test.tsx
  • src/components/MessageList/hooks/__tests__/useUnreadMessagesNotificationVirtualized.test.tsx
  • src/components/MessageList/hooks/useCanPaginateReplies.ts
  • src/components/MessageList/hooks/useLastDeliveredData.ts
  • src/components/MessageList/hooks/useLastReadData.ts
  • src/components/MessageList/hooks/useMarkRead.ts
  • src/components/MessageList/hooks/useReceiptsByMessageId.ts
  • src/components/MessageList/hooks/useThreadHead.tsx
  • src/components/MessageList/messageSourceKey.ts
  • src/components/MessageList/renderMessages.tsx
  • src/components/MessageList/styling/MessageList.scss
  • src/components/MessageList/utils.ts
  • src/components/Modal/CloseButtonOnModalOverlay.tsx
  • src/components/Notifications/Notification.tsx
  • src/components/Notifications/NotificationList.tsx
  • src/components/Notifications/__tests__/Notification.test.tsx
  • src/components/Notifications/__tests__/NotificationList.test.tsx
  • src/components/Notifications/__tests__/notificationOrigin.test.ts
  • src/components/Notifications/hooks/__tests__/useNotificationApi.test.ts
  • src/components/Notifications/hooks/__tests__/useNotificationApi.test.tsx
  • src/components/Notifications/hooks/__tests__/useNotificationTarget.test.ts
  • src/components/Notifications/hooks/__tests__/useNotifications.test.tsx
  • src/components/Notifications/hooks/useNotificationApi.ts
  • src/components/Notifications/hooks/useNotificationTarget.ts
  • src/components/Notifications/notificationTarget.ts
  • src/components/Poll/PollActions/AddCommentPrompt.tsx
  • src/components/Poll/PollActions/EndPollAlert.tsx
  • src/components/Poll/PollActions/PollActions.tsx
  • src/components/Poll/PollActions/PollAnswerList.tsx
  • src/components/Poll/PollActions/PollOptionsFullList.tsx
  • src/components/Poll/PollActions/PollQuestion.tsx
  • src/components/Poll/PollActions/PollResults/PollOptionWithVotes.tsx
  • src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx
  • src/components/Poll/PollActions/PollResults/PollOptionWithVotesList.tsx
  • src/components/Poll/PollActions/PollResults/PollResults.tsx
  • src/components/Poll/PollActions/SuggestPollOptionPrompt.tsx
  • src/components/Poll/PollActions/__tests__/EndPollAlert.test.tsx
  • src/components/Poll/PollCreationDialog/MultipleAnswersField.tsx
  • src/components/Poll/PollCreationDialog/NameField.tsx
  • src/components/Poll/PollCreationDialog/OptionFieldSet.tsx
  • src/components/Poll/PollCreationDialog/PollCreationDialog.tsx
  • src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx
  • src/components/Poll/PollCreationDialog/PollOptionReorderHandle.tsx
  • src/components/Poll/PollCreationDialog/__tests__/validationErrors.test.tsx
  • src/components/Poll/PollHeader.tsx
  • src/components/Poll/PollOptionList.tsx
  • src/components/Poll/PollOptionSelector.tsx
  • src/components/Poll/PollVote.tsx
  • src/components/Poll/__tests__/AddCommentForm.test.tsx
  • src/components/Poll/__tests__/Poll.test.tsx
  • src/components/Poll/__tests__/PollActions.test.tsx
  • src/components/Poll/__tests__/PollCreationDialog.test.tsx
  • src/components/Poll/__tests__/PollHeader.test.tsx
  • src/components/Poll/__tests__/PollOptionList.test.tsx
  • src/components/Poll/__tests__/SuggestPollOptionForm.test.tsx
  • src/components/Poll/hooks/useManagePollVotesRealtime.ts
  • src/components/Poll/hooks/usePollAnswerPagination.ts
  • src/components/Poll/hooks/usePollOptionVotesPagination.ts
  • src/components/ReactFileUtilities/UploadButton.tsx
  • src/components/Reactions/MessageReactions.tsx
  • src/components/Reactions/MessageReactionsDetail.tsx
  • src/components/Reactions/ReactionSelector.tsx
  • src/components/Reactions/ReactionSelectorWithButton.tsx
  • src/components/Reactions/__tests__/MessageReactions.test.tsx
  • src/components/Reactions/__tests__/MessageReactionsDetail.test.tsx
  • src/components/Reactions/__tests__/ReactionSelector.test.tsx
  • src/components/Reactions/__tests__/ReactionSelectorWithButton.test.tsx
  • src/components/Reactions/hooks/useFetchReactions.ts
  • src/components/Reactions/hooks/useProcessReactions.tsx
  • src/components/Search/SearchBar/SearchBar.tsx
  • src/components/Search/SearchContext.tsx
  • src/components/Search/SearchResults/SearchResultItem.tsx
  • src/components/Search/SearchResults/SearchResults.tsx
  • src/components/Search/SearchResults/SearchResultsHeader.tsx
  • src/components/Search/SearchResults/SearchResultsPresearch.tsx
  • src/components/Search/SearchResults/SearchSourceResultListFooter.tsx
  • src/components/Search/SearchResults/SearchSourceResultsEmpty.tsx
  • src/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.tsx
  • src/components/Search/SearchSourceResultsContext.tsx
  • src/components/Search/__tests__/Search.test.tsx
  • src/components/Search/__tests__/SearchBar.test.tsx
  • src/components/Search/__tests__/SearchResultItem.test.tsx
  • src/components/Search/__tests__/SearchResults.test.tsx
  • src/components/Search/__tests__/SearchResultsHeader.test.tsx
  • src/components/Search/__tests__/SearchSourceResultListFooter.test.tsx
  • src/components/Search/hooks/index.ts
  • src/components/Search/hooks/useSearchFocusedMessage.ts
  • src/components/Search/styling/Search.scss
  • src/components/SummarizedMessagePreview/SummarizedMessagePreview.tsx
  • src/components/SummarizedMessagePreview/__tests__/useLatestMessagePreview.test.tsx
  • src/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.ts
  • src/components/TextareaComposer/SuggestionList/CommandItem.tsx
  • src/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.tsx
  • src/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.tsx
  • src/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.tsx
  • src/components/TextareaComposer/SuggestionList/SuggestionList.tsx
  • src/components/TextareaComposer/TextareaComposer.tsx
  • src/components/TextareaComposer/__tests__/CommandItem.test.tsx
  • src/components/TextareaComposer/__tests__/MentionItem.test.tsx
  • src/components/TextareaComposer/__tests__/SuggestionList.test.tsx
  • src/components/TextareaComposer/__tests__/TextareaComposer.test.tsx
  • src/components/TextareaComposer/hooks/useTextareaPlaceholder.ts
  • src/components/Thread/LegacyThreadContext.ts
  • src/components/Thread/Thread.tsx
  • src/components/Thread/ThreadHead.tsx
  • src/components/Thread/ThreadHeader.tsx
  • src/components/Thread/ThreadStart.tsx
  • src/components/Thread/__tests__/Thread.test.tsx
  • src/components/Thread/__tests__/ThreadHeader.test.tsx
  • src/components/Thread/__tests__/ThreadStart.test.tsx
  • src/components/Thread/__tests__/threadSwitchReset.test.tsx
  • src/components/Thread/index.ts
  • src/components/Thread/styling/Thread.scss
  • src/components/Thread/styling/ThreadHeader.scss
  • src/components/Threads/ThreadContext.tsx
  • src/components/Threads/ThreadList/ThreadList.tsx
  • src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx
  • src/components/Threads/ThreadList/ThreadListHeader.tsx
  • src/components/Threads/ThreadList/ThreadListItemUI.tsx
  • src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx
  • src/components/Threads/ThreadList/__tests__/ThreadList.test.tsx
  • src/components/Threads/ThreadList/__tests__/ThreadListHeader.test.tsx
  • src/components/Threads/ThreadList/__tests__/ThreadListItemUI.test.tsx
  • src/components/Threads/ThreadList/__tests__/useThreadHighlighting.test.ts
  • src/components/Threads/ThreadList/__tests__/utils.a11y.test.ts
  • src/components/Threads/ThreadList/styling/ThreadListItemUI.scss
  • src/components/Threads/ThreadList/useThreadHighlighting.ts
  • src/components/Threads/ThreadList/utils.a11y.ts
  • src/components/Threads/hooks/__tests__/useCloseThread.test.tsx
  • src/components/Threads/hooks/useCloseThread.ts
  • src/components/Threads/index.ts
  • src/components/TypingIndicator/TypingIndicator.tsx
  • src/components/TypingIndicator/TypingIndicatorHeader.tsx
  • src/components/TypingIndicator/__tests__/TypingIndicator.test.tsx
  • src/components/TypingIndicator/hooks/useDebouncedTypingActive.ts
  • src/components/TypingIndicator/utils/__tests__/getTypingStatusMessage.test.ts
  • src/components/TypingIndicator/utils/getTypingStatusMessage.ts
  • src/components/VideoPlayer/VideoThumbnail.tsx
  • src/components/Window/Window.tsx
  • src/components/Window/__tests__/Window.test.tsx
  • src/components/Window/index.ts
  • src/components/index.ts
  • src/context/AttachmentContext.tsx
  • src/context/ChannelActionContext.tsx
  • src/context/ChannelInstanceContext.tsx
  • src/context/ChannelListContext.tsx
  • src/context/ChannelStateContext.tsx
  • src/context/ChatContext.tsx
  • src/context/ComponentContext.tsx
  • src/context/DialogManagerContext.tsx
  • src/context/MessageBounceContext.tsx
  • src/context/MessageComposerContext.tsx
  • src/context/MessageComposerControllerContext.tsx
  • src/context/MessageContext.tsx
  • src/context/MessageListContext.tsx
  • src/context/MessageTranslationViewContext.tsx
  • src/context/ModalContext.tsx
  • src/context/PollContext.tsx
  • src/context/TranslationContext.tsx
  • src/context/TypingContext.tsx
  • src/context/VirtualizedMessageListContext.tsx
  • src/context/WithComponents.tsx
  • src/context/WorkspaceNavigationContext.tsx
  • src/context/__tests__/WorkspaceNavigationContext.test.tsx
  • src/context/__tests__/iconSlotIntegration.test.tsx
  • src/context/__tests__/missingProviderContract.test.tsx
  • src/context/__tests__/useComponentContextIcons.test.tsx
  • src/context/index.ts
  • src/context/requireContext.ts
  • src/context/useChannel.ts
  • src/context/useComponentContextIcons.ts
  • src/hooks/__tests__/useIsDmChannel.test.tsx
  • src/hooks/index.ts
  • src/hooks/useIsDmChannel.ts
  • src/hooks/useMessagePaginator.ts
  • src/i18n/Streami18n.ts
  • src/i18n/TranslationBuilder/TranslationBuilder.ts
  • src/i18n/TranslationBuilder/index.ts
  • src/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.ts
  • src/i18n/TranslationBuilder/notifications/translators.ts
  • src/i18n/TranslationBuilder/notifications/translatorsByNotificationType.ts
  • src/i18n/__tests__/NotificationTranslationBuilder.test.ts
  • src/i18n/__tests__/Streami18n.test.ts
  • src/i18n/__tests__/TranslationBuilder.test.ts
  • src/i18n/__tests__/catalog.fixture.json
  • src/i18n/__tests__/catalogRenders.test.ts
  • src/i18n/__tests__/relativeCompactThresholds.test.ts
  • src/i18n/__tests__/useStreami18n.test.tsx
  • src/i18n/__tests__/utils.test.ts
  • src/i18n/de.json
  • src/i18n/en.json
  • src/i18n/es.json
  • src/i18n/fr.json
  • src/i18n/hi.json
  • src/i18n/index.ts
  • src/i18n/it.json
  • src/i18n/ja.json
  • src/i18n/keys.ts
  • src/i18n/ko.json
  • src/i18n/nl.json
  • src/i18n/pt.json
  • src/i18n/ru.json
  • src/i18n/runtimeDefaults.ts
  • src/i18n/tr.json
  • src/i18n/translations.ts
  • src/i18n/types.ts
  • src/i18n/useStreami18n.ts
  • src/i18n/utils.ts
  • src/mock-builders/__test__/translator.test.ts
  • src/mock-builders/api/error.ts
  • src/mock-builders/api/index.ts
  • src/mock-builders/api/markRead.ts
  • src/mock-builders/context.ts
  • src/mock-builders/event/connectionChanged.ts
  • src/mock-builders/event/connectionRecovered.ts
  • src/mock-builders/event/connectionStatus.ts
  • src/mock-builders/event/draftDeleted.ts
  • src/mock-builders/event/draftUpdated.ts
  • src/mock-builders/event/index.ts
  • src/mock-builders/event/messageDeleted.ts
  • src/mock-builders/event/messageDelivered.ts
  • src/mock-builders/event/messageNew.ts
  • src/mock-builders/event/messageRead.ts
  • src/mock-builders/event/messageUpdated.ts
  • src/mock-builders/event/notificationMarkRead.ts
  • src/mock-builders/event/notificationMarkUnread.ts
  • src/mock-builders/event/notificationMutesUpdated.ts
  • src/mock-builders/event/userMessagesDeleted.ts
  • src/mock-builders/event/userUpdated.ts
  • src/mock-builders/event/utils.ts
  • src/mock-builders/generator/attachment.ts
  • src/mock-builders/generator/channel.ts
  • src/mock-builders/generator/channelState.ts
  • src/mock-builders/generator/index.ts
  • src/mock-builders/generator/message.ts
  • src/mock-builders/generator/messageDraft.ts
  • src/mock-builders/generator/poll.ts
  • src/mock-builders/generator/reaction.ts
  • src/mock-builders/generator/reminder.ts
  • src/mock-builders/generator/sharedLocation.ts
  • src/mock-builders/generator/time.ts
  • src/mock-builders/generator/user.ts
  • src/mock-builders/index.ts
  • src/mock-builders/translator.ts
  • src/mock-builders/utils.ts
  • src/plugins/ChannelDetail/AvatarWithChannelDetail.tsx
  • src/plugins/ChannelDetail/ChannelDetail.tsx
  • src/plugins/ChannelDetail/ChannelDetailEmptyList.tsx
  • src/plugins/ChannelDetail/ChannelDetailSearchInput.tsx
  • src/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.tsx
  • src/plugins/ChannelDetail/SectionNavigator/__tests__/SectionNavigatorHeader.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.tsx
  • src/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.tsx
  • src/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.ts
  • src/plugins/ChannelDetail/Views/ChannelFilesView/__tests__/ChannelFilesView.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.tsx
  • src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.tsx
  • src/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.tsx
  • src/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.tsx
  • src/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.ts
  • src/plugins/ChannelDetail/Views/ChannelMediaView/__tests__/ChannelMediaView.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.tsx
  • src/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.tsx
  • src/plugins/ChannelDetail/Views/ChannelMemberDetailView/__tests__/ChannelMemberDetail.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.ts
  • src/plugins/ChannelDetail/Views/ChannelMembersView/__tests__/ChannelMembersAddView.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/__tests__/ChannelMembersBrowseView.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/__tests__/ChannelMembersHeaderActions.defaults.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/__tests__/ChannelMembersView.test.tsx
  • src/plugins/ChannelDetail/Views/ChannelMembersView/__tests__/ChannelMembersView.utils.test.ts
  • src/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.tsx
  • src/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.tsx
  • src/plugins/ChannelDetail/Views/PinnedMessagesView/__tests__/PinnedMessagesView.test.tsx
  • src/plugins/ChannelDetail/Views/PinnedMessagesView/__tests__/usePinnedMessagesCount.test.ts
  • src/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.ts
  • src/plugins/ChannelDetail/__tests__/ChannelManagementActions.defaults.test.tsx
  • src/plugins/ChannelDetail/__tests__/ChannelManagementView.test.tsx
  • src/plugins/Emojis/EmojiPicker.tsx
  • src/plugins/SlotGeometry/SlotGeometry.tsx
  • src/plugins/SlotGeometry/__tests__/SlotGeometry.test.tsx
  • src/plugins/SlotGeometry/index.ts
  • src/plugins/SlotLayout/ChannelSlot.tsx
  • src/plugins/SlotLayout/ChatView.a11y.utility.ts
  • src/plugins/SlotLayout/ChatView.tsx
  • src/plugins/SlotLayout/ChatViewNavigationContext.tsx
  • src/plugins/SlotLayout/ThreadListSlot.tsx
  • src/plugins/SlotLayout/ThreadSlot.tsx
  • src/plugins/SlotLayout/__tests__/ChatView.test.tsx
  • src/plugins/SlotLayout/__tests__/ChatViewNavigation.test.tsx
  • src/plugins/SlotLayout/__tests__/layoutController.test.ts
  • src/plugins/SlotLayout/__tests__/useSlotEntity.test.tsx
  • src/plugins/SlotLayout/hooks/index.ts
  • src/plugins/SlotLayout/hooks/useLayoutViewState.ts
  • src/plugins/SlotLayout/hooks/useSlotEntity.ts
  • src/plugins/SlotLayout/index.tsx
  • src/plugins/SlotLayout/layout/Slot.tsx
  • src/plugins/SlotLayout/layout/WorkspaceLayout.tsx
  • src/plugins/SlotLayout/layoutController/LayoutController.ts
  • src/plugins/SlotLayout/layoutController/layoutControllerTypes.ts
  • src/plugins/SlotLayout/layoutController/serialization.ts
  • src/plugins/SlotLayout/slotBinding.ts
  • src/plugins/SlotLayout/slotRegistry.tsx
  • src/plugins/SlotLayout/styling/ChatView.scss
  • src/plugins/SlotLayout/styling/index.scss
  • src/plugins/SlotLayout/workspaceNavigationAdapter.tsx
  • src/store/hooks/useStateStore.ts
  • src/styling/_utils.scss
  • src/styling/dark.scss
  • src/styling/index.scss
  • src/types/index.ts
  • src/types/types.ts
  • src/utils/__tests__/getChannelConfig.test.ts
  • src/utils/getChannel.ts
  • src/utils/getChannelConfig.ts
  • src/utils/useStableCallback.ts
  • tsconfig.lib.json
  • tsconfig.scripts.json
  • tsconfig.test.json
  • vite.config.ts
  • vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Size Change: -244 kB (-22.26%) 🎉

Total Size: 850 kB

📦 View Changed
Filename Size Change
dist/cjs/channel-detail.js 24.9 kB +1.65 kB (+7.09%) 🔍
dist/cjs/emojis.js 2.66 kB +7 B (+0.26%)
dist/cjs/index.js 153 kB -92.1 kB (-37.64%) 🎉
dist/cjs/ListItemLayout.js 21.8 kB +21.8 kB (new file) 🆕
dist/cjs/NotificationList.js 0 B -91 kB (removed) 🏆
dist/cjs/ReactPlayerWrapper.js 555 B +6 B (+1.09%)
dist/cjs/slot-js 2.32 kB +2.32 kB (new file) 🆕
dist/cjs/slot-layout.js 505 B +505 B (new file) 🆕
dist/cjs/SlotLayout.js 13.3 kB +13.3 kB (new file) 🆕
dist/cjs/Thread.js 64.4 kB +64.4 kB (new file) 🆕
dist/cjs/useChannel.js 415 B +415 B (new file) 🆕
dist/cjs/useChannelHeaderOnlineStatus.js 0 B -9.44 kB (removed) 🏆
dist/cjs/useComponentContextIcons.js 24.3 kB +24.3 kB (new file) 🆕
dist/cjs/useInertWhenHidden.js 0 B -56.8 kB (removed) 🏆
dist/cjs/useIsCooldownActive.js 1.18 kB +1.18 kB (new file) 🆕
dist/css/index.css 43.3 kB +1.22 kB (+2.9%)
dist/es/a11y/accessibleLabel.mjs 764 B +43 B (+5.96%) 🔍
dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs 1.26 kB +69 B (+5.81%) 🔍
dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs 3.31 kB +288 B (+9.53%) ⚠️
dist/es/components/Accessibility/NotificationAnnouncer.mjs 1.36 kB -38 B (-2.72%)
dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs 293 B -7 B (-2.33%)
dist/es/components/AIStateIndicator/AIStateIndicator.mjs 475 B +17 B (+3.71%)
dist/es/components/AIStateIndicator/hooks/useAIState.mjs 444 B -172 B (-27.92%) 🎉
dist/es/components/Attachment/Attachment.mjs 1.15 kB +179 B (+18.47%) ⚠️
dist/es/components/Attachment/AttachmentActions.mjs 1.65 kB +61 B (+3.85%)
dist/es/components/Attachment/AttachmentContainer.mjs 2.45 kB -18 B (-0.73%)
dist/es/components/Attachment/Audio.mjs 1.51 kB +30 B (+2.03%)
dist/es/components/Attachment/components/AttachmentUploadProgressIndicator.mjs 824 B -1 B (-0.12%)
dist/es/components/Attachment/components/DownloadButton.mjs 687 B +18 B (+2.69%)
dist/es/components/Attachment/FileAttachment.mjs 642 B -2 B (-0.31%)
dist/es/components/Attachment/Geolocation.mjs 1.42 kB +348 B (+32.4%) 🚨
dist/es/components/Attachment/Giphy.mjs 1.05 kB +18 B (+1.75%)
dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs 1.82 kB -492 B (-21.32%) 🎉
dist/es/components/Attachment/LinkPreview/Card.mjs 1.03 kB -4 B (-0.39%)
dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs 411 B +9 B (+2.24%)
dist/es/components/Attachment/ModalGallery.mjs 2.08 kB +212 B (+11.32%) ⚠️
dist/es/components/Attachment/UnsupportedAttachment.mjs 413 B +10 B (+2.48%)
dist/es/components/Attachment/VideoAttachment.mjs 926 B -10 B (-1.07%)
dist/es/components/Attachment/VisibilityDisclaimer.mjs 373 B +19 B (+5.37%) 🔍
dist/es/components/Attachment/VoiceRecording.mjs 1.8 kB +50 B (+2.86%)
dist/es/components/AudioPlayback/AudioPlaybackArbiter.mjs 964 B +964 B (new file) 🆕
dist/es/components/AudioPlayback/AudioPlayer.mjs 3.85 kB +265 B (+7.4%) 🔍
dist/es/components/AudioPlayback/AudioPlayerPool.mjs 815 B -192 B (-19.07%) 👏
dist/es/components/AudioPlayback/components/ProgressBar.mjs 833 B +14 B (+1.71%)
dist/es/components/AudioPlayback/components/progressBarA11y.mjs 484 B +24 B (+5.22%) 🔍
dist/es/components/AudioPlayback/components/WaveProgressBar.mjs 1.74 kB +17 B (+0.99%)
dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs 659 B +46 B (+7.5%) 🔍
dist/es/components/AudioPlayback/WithAudioPlayback.mjs 1.18 kB +176 B (+17.51%) ⚠️
dist/es/components/Avatar/AvatarStack.mjs 665 B -4 B (-0.6%)
dist/es/components/Badge/MediaBadge.mjs 439 B +13 B (+3.05%)
dist/es/components/BaseImage/ImagePlaceholder.mjs 416 B +19 B (+4.79%) 🔍
dist/es/components/Button/PlayButton.mjs 493 B +18 B (+3.79%)
dist/es/components/Button/WorkspaceNavigationButtons.mjs 1.03 kB +1.03 kB (new file) 🆕
dist/es/components/Channel/Channel.mjs 949 B -6.18 kB (-86.69%) 🏆
dist/es/components/Channel/channelState.mjs 0 B -978 B (removed) 🏆
dist/es/components/Channel/hooks/useChannelCapabilities.mjs 350 B +350 B (new file) 🆕
dist/es/components/Channel/hooks/useChannelContainerClasses.mjs 388 B -3 B (-0.77%)
dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs 0 B -1.1 kB (removed) 🏆
dist/es/components/Channel/hooks/useCreateTypingContext.mjs 0 B -229 B (removed) 🏆
dist/es/components/Channel/hooks/useEditMessageHandler.mjs 0 B -297 B (removed) 🏆
dist/es/components/Channel/hooks/useIsMounted.mjs 0 B -235 B (removed) 🏆
dist/es/components/Channel/hooks/useMentionsHandlers.mjs 0 B -448 B (removed) 🏆
dist/es/components/Channel/utils.mjs 0 B -2.12 kB (removed) 🏆
dist/es/components/ChannelHeader/ChannelHeader.mjs 1.05 kB +128 B (+13.81%) ⚠️
dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs 624 B -27 B (-4.15%)
dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs 681 B +82 B (+13.69%) ⚠️
dist/es/components/ChannelList/ChannelList.mjs 1.19 kB -1.09 kB (-47.86%) 🎉
dist/es/components/ChannelList/ChannelListHeader.mjs 430 B +50 B (+13.16%) ⚠️
dist/es/components/ChannelList/ChannelLists.mjs 693 B +693 B (new file) 🆕
dist/es/components/ChannelList/ChannelListUI.mjs 0 B -607 B (removed) 🏆
dist/es/components/ChannelList/ChannelNavigation.mjs 684 B +684 B (new file) 🆕
dist/es/components/ChannelList/hooks/useChannelListShape.mjs 0 B -2.14 kB (removed) 🏆
dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs 540 B +540 B (new file) 🆕
dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs 0 B -306 B (removed) 🏆
dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs 0 B -1.59 kB (removed) 🏆
dist/es/components/ChannelList/utils.mjs 0 B -1.05 kB (removed) 🏆
dist/es/components/ChannelListItem/ChannelListItem.mjs 1.06 kB -244 B (-18.7%) 👏
dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs 2.61 kB +152 B (+6.18%) 🔍
dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs 518 B +13 B (+2.57%)
dist/es/components/ChannelListItem/ChannelListItemUI.mjs 1.52 kB +19 B (+1.26%)
dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs 831 B +14 B (+1.71%)
dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs 399 B -272 B (-40.54%) 🎉
dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs 271 B +2 B (+0.74%)
dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs 657 B -173 B (-20.84%) 🎉
dist/es/components/ChannelListItem/utils.a11y.mjs 2.63 kB +260 B (+10.97%) ⚠️
dist/es/components/ChannelListItem/utils.mjs 2.75 kB +160 B (+6.18%) 🔍
dist/es/components/Chat/Chat.mjs 1.24 kB -10 B (-0.8%)
dist/es/components/Chat/hooks/useChannelsQueryState.mjs 0 B -250 B (removed) 🏆
dist/es/components/Chat/hooks/useChat.mjs 556 B -497 B (-47.2%) 🎉
dist/es/components/Chat/hooks/useCreateChatClient.mjs 526 B -7 B (-1.31%)
dist/es/components/Chat/hooks/useCreateChatContext.mjs 444 B -95 B (-17.63%) 👏
dist/es/components/Chat/hooks/useNetworkConnectionState.mjs 931 B +931 B (new file) 🆕
dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs 2.23 kB +1.56 kB (+229.84%) 🆘
dist/es/components/Chat/hooks/useSplitActionSet.mjs 317 B -2 B (-0.63%)
dist/es/components/Chat/hooks/useWSConnectionState.mjs 857 B +857 B (new file) 🆕
dist/es/components/ChatView/a11y.utility.mjs 0 B -291 B (removed) 🏆
dist/es/components/ChatView/mjs 0 B -2.24 kB (removed) 🏆
dist/es/components/DateSeparator/DateSeparator.mjs 572 B -3 B (-0.52%)
dist/es/components/Dialog/components/Callout.mjs 837 B +18 B (+2.2%)
dist/es/components/Dialog/components/ContextMenu.mjs 5.55 kB +57 B (+1.04%)
dist/es/components/Dialog/components/Prompt.mjs 1.09 kB +25 B (+2.34%)
dist/es/components/Dialog/components/Viewer.mjs 990 B +27 B (+2.8%)
dist/es/components/Dialog/hooks/usePopoverPosition.mjs 925 B +86 B (+10.25%) ⚠️
dist/es/components/Dialog/service/DialogManager.mjs 1.34 kB +58 B (+4.51%) 🔍
dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs 614 B +67 B (+12.25%) ⚠️
dist/es/components/Form/mjs 1.58 kB +21 B (+1.35%)
dist/es/components/Form/NumericInput.mjs 1.37 kB +37 B (+2.77%)
dist/es/components/Form/SwitchField.mjs 1.54 kB +12 B (+0.78%)
dist/es/components/Gallery/GalleryContext.mjs 335 B -87 B (-20.62%) 🎉
dist/es/components/Gallery/GalleryHeader.mjs 1.22 kB +281 B (+29.93%) 🚨
dist/es/components/Gallery/GalleryUI.mjs 2.03 kB +19 B (+0.94%)
dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs 598 B +7 B (+1.18%)
dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs 1.14 kB +113 B (+11.01%) ⚠️
dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs 826 B +826 B (new file) 🆕
dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs 523 B -111 B (-17.51%) 👏
dist/es/components/Loading/LoadingErrorIndicator.mjs 405 B +10 B (+2.53%)
dist/es/components/Loading/progress-indicators.mjs 734 B +20 B (+2.8%)
dist/es/components/LoadMore/LoadMoreButton.mjs 503 B +11 B (+2.24%)
dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs 640 B +9 B (+1.43%)
dist/es/components/Location/ShareLocationDialog.mjs 2.27 kB +71 B (+3.23%)
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs 627 B +6 B (+0.97%)
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs 1.04 kB +40 B (+4%)
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs 1.06 kB +21 B (+2.03%)
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs 1.01 kB +20 B (+2.02%)
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs 910 B +1 B (+0.11%)
dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs 1.07 kB +12 B (+1.14%)
dist/es/components/MediaRecorder/classes/BrowserPermission.mjs 758 B +9 B (+1.2%)
dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs 2.58 kB +58 B (+2.3%)
dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs 911 B -51 B (-5.3%) ✅
dist/es/components/MediaRecorder/observable/Observable.mjs 315 B +5 B (+1.61%)
dist/es/components/MediaRecorder/observable/Subject.mjs 550 B +2 B (+0.36%)
dist/es/components/MediaRecorder/observable/Subscription.mjs 211 B +5 B (+2.43%)
dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs 503 B +22 B (+4.57%) 🔍
dist/es/components/Message/hooks/useActionHandler.mjs 604 B +8 B (+1.34%)
dist/es/components/Message/hooks/useDeleteHandler.mjs 617 B +254 B (+69.97%) 🆘
dist/es/components/Message/hooks/useFlagHandler.mjs 383 B +1 B (+0.26%)
dist/es/components/Message/hooks/useMarkUnreadHandler.mjs 414 B +90 B (+27.78%) 🚨
dist/es/components/Message/hooks/useMentionsHandler.mjs 377 B -78 B (-17.14%) 👏
dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs 1.01 kB +1.01 kB (new file) 🆕
dist/es/components/Message/hooks/useMessageReminder.mjs 299 B -1 B (-0.33%)
dist/es/components/Message/hooks/useMuteHandler.mjs 704 B +271 B (+62.59%) 🆘
dist/es/components/Message/hooks/useOpenThreadHandler.mjs 352 B +19 B (+5.71%) 🔍
dist/es/components/Message/hooks/usePinHandler.mjs 608 B +132 B (+27.73%) 🚨
dist/es/components/Message/hooks/useReactionHandler.mjs 1.33 kB -26 B (-1.91%)
dist/es/components/Message/hooks/useReactionsFetcher.mjs 498 B +6 B (+1.22%)
dist/es/components/Message/hooks/useRetryHandler.mjs 301 B +35 B (+13.16%) ⚠️
dist/es/components/Message/hooks/useUserRole.mjs 746 B +28 B (+3.9%)
dist/es/components/Message/Message.mjs 1.39 kB -417 B (-23.03%) 🎉
dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs 665 B -436 B (-39.6%) 🎉
dist/es/components/Message/MessageBlocked.mjs 451 B +7 B (+1.58%)
dist/es/components/Message/MessageDeletedBubble.mjs 412 B +13 B (+3.26%)
dist/es/components/Message/MessageEditedIndicator.mjs 722 B +30 B (+4.34%)
dist/es/components/Message/MessageRepliesCountButton.mjs 1.08 kB +335 B (+45.03%) 🚨
dist/es/components/Message/MessageStatus.mjs 1.29 kB +41 B (+3.27%)
dist/es/components/Message/MessageText.mjs 1.63 kB +14 B (+0.87%)
dist/es/components/Message/MessageTimestamp.mjs 383 B +22 B (+6.09%) 🔍
dist/es/components/Message/MessageTranslationIndicator.mjs 896 B +30 B (+3.46%)
dist/es/components/Message/MessageUI.mjs 2.78 kB +16 B (+0.58%)
dist/es/components/Message/PinIndicator.mjs 638 B +28 B (+4.59%) 🔍
dist/es/components/Message/QuotedMessage.mjs 427 B +3 B (+0.71%)
dist/es/components/Message/ReminderNotification.mjs 1.02 kB +72 B (+7.6%) 🔍
dist/es/components/Message/renderText/renderText.mjs 1.58 kB -1 B (-0.06%)
dist/es/components/Message/StreamedMessageText.mjs 500 B +16 B (+3.31%)
dist/es/components/Message/Timestamp.mjs 525 B +8 B (+1.55%)
dist/es/components/Message/utils.mjs 2.15 kB -491 B (-18.56%) 👏
dist/es/components/MessageActions/DeleteMessageAlert.mjs 616 B +35 B (+6.02%) 🔍
dist/es/components/MessageActions/DownloadSubmenu.mjs 857 B +45 B (+5.54%) 🔍
dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs 1.29 kB +61 B (+4.97%) 🔍
dist/es/components/MessageActions/MessageActions.mjs 4.23 kB +325 B (+8.33%) 🔍
dist/es/components/MessageActions/RemindMeSubmenu.mjs 1.01 kB +14 B (+1.4%)
dist/es/components/MessageBounce/MessageBounceModal.mjs 347 B -1 B (-0.29%)
dist/es/components/MessageBounce/MessageBouncePrompt.mjs 817 B +45 B (+5.83%) 🔍
dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs 1.19 kB -1 B (-0.08%)
dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs 1.85 kB +96 B (+5.47%) 🔍
dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs 1.11 kB +59 B (+5.62%) 🔍
dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs 771 B +56 B (+7.83%) 🔍
dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs 1.33 kB +5 B (+0.38%)
dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs 541 B +12 B (+2.27%)
dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs 919 B +35 B (+3.96%)
dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs 545 B -3 B (-0.55%)
dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs 3.32 kB +91 B (+2.82%)
dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs 1.39 kB +103 B (+7.98%) 🔍
dist/es/components/MessageComposer/CommandChip.mjs 569 B +19 B (+3.45%)
dist/es/components/MessageComposer/EditedMessagePreview.mjs 334 B +16 B (+5.03%) 🔍
dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs 542 B +137 B (+33.83%) 🚨
dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs 429 B -20 B (-4.45%)
dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs 419 B -10 B (-2.33%)
dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs 274 B -20 B (-6.8%) ✅
dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs 348 B -26 B (-6.95%) ✅
dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs 467 B -213 B (-31.32%) 🎉
dist/es/components/MessageComposer/hooks/useMessageComposerSubmitFn.mjs 404 B +404 B (new file) 🆕
dist/es/components/MessageComposer/hooks/usePasteHandler.mjs 579 B +2 B (+0.35%)
dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs 0 B -1.04 kB (removed) 🏆
dist/es/components/MessageComposer/icons.mjs 1.28 kB +14 B (+1.11%)
dist/es/components/MessageComposer/LinkPreviewList.mjs 1.08 kB +4 B (+0.37%)
dist/es/components/MessageComposer/MessageComposer.mjs 894 B -114 B (-11.31%) 👏
dist/es/components/MessageComposer/MessageComposerActions.mjs 1.36 kB +45 B (+3.43%)
dist/es/components/MessageComposer/MessageComposerUI.mjs 1.43 kB +14 B (+0.99%)
dist/es/components/MessageComposer/preEditSnapshot.mjs 575 B -52 B (-8.29%) ✅
dist/es/components/MessageComposer/QuotedMessagePreview.mjs 3.1 kB +163 B (+5.56%) 🔍
dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs 609 B +23 B (+3.92%)
dist/es/components/MessageComposer/SendButton.mjs 499 B +16 B (+3.31%)
dist/es/components/MessageComposer/SendToChannelCheckbox.mjs 773 B +25 B (+3.34%)
dist/es/components/MessageComposer/StopAIGenerationButton.mjs 373 B +19 B (+5.37%) 🔍
dist/es/components/MessageComposer/WithDragAndDropUpload.mjs 1.58 kB -12 B (-0.75%)
dist/es/components/MessageList/FloatingDateSeparator.mjs 679 B -8 B (-1.16%)
dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs 629 B -19 B (-2.93%)
dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs 932 B -1 B (-0.11%)
dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs 624 B +53 B (+9.28%) 🔍
dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs 1.72 kB +40 B (+2.38%)
dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs 1.05 kB -1.83 kB (-63.61%) 🏆
dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs 1.21 kB +89 B (+7.92%) 🔍
dist/es/components/MessageList/hooks/useCanPaginateReplies.mjs 1.26 kB +1.26 kB (new file) 🆕
dist/es/components/MessageList/hooks/useLastDeliveredData.mjs 251 B -288 B (-53.43%) 🏆
dist/es/components/MessageList/hooks/useLastReadData.mjs 247 B -150 B (-37.78%) 🎉
dist/es/components/MessageList/hooks/useMarkRead.mjs 1.29 kB +170 B (+15.15%) ⚠️
dist/es/components/MessageList/hooks/useReceiptsByMessageId.mjs 1.17 kB +1.17 kB (new file) 🆕
dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs 0 B -475 B (removed) 🏆
dist/es/components/MessageList/hooks/useThreadHead.mjs 564 B +564 B (new file) 🆕
dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs 969 B +14 B (+1.47%)
dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs 434 B +7 B (+1.64%)
dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs 636 B +103 B (+19.32%) ⚠️
dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs 808 B +87 B (+12.07%) ⚠️
dist/es/components/MessageList/MessageList.mjs 3.35 kB -398 B (-10.6%) 👏
dist/es/components/MessageList/messageSourceKey.mjs 876 B +876 B (new file) 🆕
dist/es/components/MessageList/NewMessageNotification.mjs 561 B +42 B (+8.09%) 🔍
dist/es/components/MessageList/ScrollToLatestMessageButton.mjs 1.18 kB +91 B (+8.36%) 🔍
dist/es/components/MessageList/UnreadMessagesNotification.mjs 862 B +246 B (+39.94%) 🚨
dist/es/components/MessageList/UnreadMessagesSeparator.mjs 752 B +151 B (+25.12%) 🚨
dist/es/components/MessageList/utils.mjs 2.26 kB +73 B (+3.34%)
dist/es/components/MessageList/VirtualizedMessageList.mjs 4.34 kB +214 B (+5.19%) 🔍
dist/es/components/MessageList/VirtualizedMessageListComponents.mjs 1.64 kB +8 B (+0.49%)
dist/es/components/Modal/GlobalModal.mjs 1.81 kB +1 B (+0.06%)
dist/es/components/Notifications/hooks/useNotificationApi.mjs 1.3 kB +35 B (+2.76%)
dist/es/components/Notifications/hooks/useNotificationTarget.mjs 377 B -45 B (-10.66%) 👏
dist/es/components/Notifications/hooks/useSystemNotifications.mjs 457 B -1 B (-0.22%)
dist/es/components/Notifications/Notification.mjs 1.24 kB +26 B (+2.14%)
dist/es/components/Notifications/NotificationList.mjs 3.06 kB -114 B (-3.6%)
dist/es/components/Notifications/notificationTarget.mjs 917 B +281 B (+44.18%) 🚨
dist/es/components/Poll/hooks/usePollAnswerPagination.mjs 586 B +20 B (+3.53%)
dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs 601 B +29 B (+5.07%) 🔍
dist/es/components/Poll/mjs 926 B +54 B (+6.19%) 🔍
dist/es/components/Poll/PollActions/AddCommentPrompt.mjs 1.32 kB +79 B (+6.35%) 🔍
dist/es/components/Poll/PollActions/EndPollAlert.mjs 820 B +56 B (+7.33%) 🔍
dist/es/components/Poll/PollActions/PollActions.mjs 1.37 kB +105 B (+8.32%) 🔍
dist/es/components/Poll/PollActions/PollAnswerList.mjs 1.05 kB +40 B (+3.95%)
dist/es/components/Poll/PollActions/PollOptionsFullList.mjs 583 B +22 B (+3.92%)
dist/es/components/Poll/PollActions/PollQuestion.mjs 346 B +11 B (+3.28%)
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs 852 B +37 B (+4.54%) 🔍
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs 723 B +39 B (+5.7%) 🔍
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs 614 B -1 B (-0.16%)
dist/es/components/Poll/PollActions/PollResults/PollResults.mjs 1.11 kB +85 B (+8.28%) 🔍
dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs 1.31 kB +84 B (+6.82%) 🔍
dist/es/components/Poll/PollContent.mjs 489 B +1 B (+0.2%)
dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs 1.44 kB +192 B (+15.45%) ⚠️
dist/es/components/Poll/PollCreationDialog/NameField.mjs 761 B +84 B (+12.41%) ⚠️
dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs 2.36 kB +119 B (+5.3%) 🔍
dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs 1.1 kB +81 B (+7.93%) 🔍
dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs 1.02 kB +43 B (+4.38%)
dist/es/components/Poll/PollHeader.mjs 683 B +48 B (+7.56%) 🔍
dist/es/components/Poll/PollOptionList.mjs 845 B +31 B (+3.81%)
dist/es/components/Poll/PollOptionSelector.mjs 1.52 kB +49 B (+3.32%)
dist/es/components/ReactFileUtilities/UploadButton.mjs 813 B +10 B (+1.25%)
dist/es/components/Reactions/hooks/useFetchReactions.mjs 714 B +13 B (+1.85%)
dist/es/components/Reactions/hooks/useProcessReactions.mjs 1.25 kB +13 B (+1.05%)
dist/es/components/Reactions/MessageReactions.mjs 2.08 kB +18 B (+0.87%)
dist/es/components/Reactions/MessageReactionsDetail.mjs 1.99 kB +95 B (+5.02%) 🔍
dist/es/components/Reactions/ReactionSelector.mjs 1.57 kB -9 B (-0.57%)
dist/es/components/Reactions/ReactionSelectorWithButton.mjs 915 B +5 B (+0.55%)
dist/es/components/Search/hooks/useSearchFocusedMessage.mjs 0 B -296 B (removed) 🏆
dist/es/components/Search/Search.mjs 642 B -1 B (-0.16%)
dist/es/components/Search/SearchBar/SearchBar.mjs 1.36 kB +39 B (+2.96%)
dist/es/components/Search/SearchContext.mjs 331 B +25 B (+8.17%) 🔍
dist/es/components/Search/SearchResults/SearchResultItem.mjs 1.39 kB +114 B (+8.96%) 🔍
dist/es/components/Search/SearchResults/SearchResults.mjs 716 B +5 B (+0.7%)
dist/es/components/Search/SearchResults/SearchResultsHeader.mjs 910 B +54 B (+6.31%) 🔍
dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs 322 B +17 B (+5.57%) 🔍
dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs 562 B +15 B (+2.74%)
dist/es/components/Search/SearchResults/SearchSourceResults.mjs 561 B -1 B (-0.18%)
dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs 326 B +18 B (+5.84%) 🔍
dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs 390 B +15 B (+4%)
dist/es/components/Search/SearchSourceResultsContext.mjs 344 B +28 B (+8.86%) 🔍
dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs 1.52 kB +161 B (+11.86%) ⚠️
dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs 685 B +85 B (+14.17%) ⚠️
dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs 480 B -1 B (-0.21%)
dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs 643 B +29 B (+4.72%) 🔍
dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs 2.42 kB +32 B (+1.34%)
dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs 649 B +1 B (+0.15%)
dist/es/components/TextareaComposer/TextareaComposer.mjs 3.8 kB +20 B (+0.53%)
dist/es/components/Thread/LegacyThreadContext.mjs 0 B -198 B (removed) 🏆
dist/es/components/Thread/Thread.mjs 1.37 kB -19 B (-1.37%)
dist/es/components/Thread/ThreadHead.mjs 453 B +37 B (+8.89%) 🔍
dist/es/components/Thread/ThreadHeader.mjs 1.27 kB -70 B (-5.22%) ✅
dist/es/components/Thread/ThreadStart.mjs 458 B -3 B (-0.65%)
dist/es/components/Threads/hooks/useCloseThread.mjs 519 B +519 B (new file) 🆕
dist/es/components/Threads/ThreadContext.mjs 265 B -40 B (-13.11%) 👏
dist/es/components/Threads/ThreadList/ThreadList.mjs 1.44 kB -83 B (-5.45%) ✅
dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs 397 B +7 B (+1.79%)
dist/es/components/Threads/ThreadList/ThreadListHeader.mjs 428 B +33 B (+8.35%) 🔍
dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs 1.87 kB +145 B (+8.43%) 🔍
dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs 674 B +49 B (+7.84%) 🔍
dist/es/components/Threads/ThreadList/useThreadHighlighting.mjs 893 B +893 B (new file) 🆕
dist/es/components/Threads/ThreadList/utils.a11y.mjs 1.83 kB +86 B (+4.94%) 🔍
dist/es/components/TypingIndicator/TypingIndicator.mjs 1.35 kB +127 B (+10.38%) ⚠️
dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs 946 B +108 B (+12.89%) ⚠️
dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs 442 B +58 B (+15.1%) ⚠️
dist/es/components/UtilityComponents/NullComponent.mjs 0 B -138 B (removed) 🏆
dist/es/components/VideoPlayer/VideoThumbnail.mjs 569 B +19 B (+3.45%)
dist/es/components/Window/Window.mjs 0 B -406 B (removed) 🏆
dist/es/context/AttachmentContext.mjs 344 B +344 B (new file) 🆕
dist/es/context/ChannelActionContext.mjs 0 B -412 B (removed) 🏆
dist/es/context/ChannelInstanceContext.mjs 385 B +385 B (new file) 🆕
dist/es/context/ChannelListContext.mjs 369 B +35 B (+10.48%) ⚠️
dist/es/context/ChannelStateContext.mjs 0 B -453 B (removed) 🏆
dist/es/context/ChatContext.mjs 282 B -120 B (-29.85%) 🎉
dist/es/context/ComponentContext.mjs 257 B -6 B (-2.28%)
dist/es/context/DialogManagerContext.mjs 1.42 kB +43 B (+3.13%)
dist/es/context/MessageBounceContext.mjs 712 B -27 B (-3.65%)
dist/es/context/MessageComposerContext.mjs 408 B +102 B (+33.33%) 🚨
dist/es/context/MessageComposerControllerContext.mjs 445 B +445 B (new file) 🆕
dist/es/context/MessageContext.mjs 285 B -20 B (-6.56%) ✅
dist/es/context/MessageListContext.mjs 325 B -109 B (-25.12%) 🎉
dist/es/context/MessageTranslationViewContext.mjs 1.53 kB -22 B (-1.42%)
dist/es/context/ModalContext.mjs 403 B +18 B (+4.68%) 🔍
dist/es/context/PollContext.mjs 300 B +22 B (+7.91%) 🔍
dist/es/context/requireContext.mjs 440 B +440 B (new file) 🆕
dist/es/context/TranslationContext.mjs 425 B -119 B (-21.88%) 🎉
dist/es/context/TypingContext.mjs 0 B -408 B (removed) 🏆
dist/es/context/useChannel.mjs 333 B +333 B (new file) 🆕
dist/es/context/useComponentContextIcons.mjs 501 B -63 B (-11.17%) 👏
dist/es/context/VirtualizedMessageListContext.mjs 338 B +28 B (+9.03%) 🔍
dist/es/context/WithComponents.mjs 331 B +23 B (+7.47%) 🔍
dist/es/context/WorkspaceNavigationContext.mjs 752 B +752 B (new file) 🆕
dist/es/hooks/useIsDmChannel.mjs 503 B +503 B (new file) 🆕
dist/es/hooks/useMessagePaginator.mjs 275 B +275 B (new file) 🆕
dist/es/i18n/de.mjs 0 B -11.6 kB (removed) 🏆
dist/es/i18n/en.mjs 0 B -8.6 kB (removed) 🏆
dist/es/i18n/es.mjs 0 B -11.8 kB (removed) 🏆
dist/es/i18n/fr.mjs 0 B -12 kB (removed) 🏆
dist/es/i18n/hi.mjs 0 B -12.8 kB (removed) 🏆
dist/es/i18n/it.mjs 0 B -11.7 kB (removed) 🏆
dist/es/i18n/ja.mjs 0 B -12.1 kB (removed) 🏆
dist/es/i18n/ko.mjs 0 B -11.8 kB (removed) 🏆
dist/es/i18n/nl.mjs 0 B -11.3 kB (removed) 🏆
dist/es/i18n/pt.mjs 0 B -11.7 kB (removed) 🏆
dist/es/i18n/ru.mjs 0 B -13.9 kB (removed) 🏆
dist/es/i18n/runtimeDefaults.mjs 1.1 kB +1.1 kB (new file) 🆕
dist/es/i18n/Streami18n.mjs 1.01 kB -4.07 kB (-80.15%) 🏆
dist/es/i18n/tr.mjs 0 B -11.4 kB (removed) 🏆
dist/es/i18n/TranslationBuilder/index.mjs 122 B +122 B (new file) 🆕
dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs 563 B -25 B (-4.25%)
dist/es/i18n/TranslationBuilder/notifications/translators.mjs 669 B +1 B (+0.15%)
dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs 1.23 kB +639 B (+107.94%) 🆘
dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs 0 B -741 B (removed) 🏆
dist/es/i18n/useStreami18n.mjs 708 B +708 B (new file) 🆕
dist/es/i18n/utils.mjs 466 B -1.57 kB (-77.15%) 🏆
dist/es/index.mjs 7.96 kB -606 B (-7.07%) ✅
dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs 726 B +23 B (+3.27%)
dist/es/plugins/ChannelDetail/ChannelDetail.mjs 942 B -2 B (-0.21%)
dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs 585 B +18 B (+3.17%)
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs 846 B +14 B (+1.68%)
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs 465 B +20 B (+4.49%)
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs 1.5 kB +26 B (+1.76%)
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs 1.22 kB +125 B (+11.38%) ⚠️
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs 723 B -3 B (-0.41%)
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.mjs 3.92 kB +249 B (+6.78%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs 3.67 kB +139 B (+3.93%)
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs 482 B +28 B (+6.17%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs 2.34 kB +51 B (+2.23%)
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs 726 B +61 B (+9.17%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs 720 B -3 B (-0.41%)
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.mjs 3.47 kB +209 B (+6.41%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs 1.08 kB +74 B (+7.36%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs 2.31 kB +100 B (+4.52%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs 1.67 kB +106 B (+6.8%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.mjs 1.65 kB +45 B (+2.8%)
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs 1.31 kB +61 B (+4.88%) 🔍
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs 369 B +8 B (+2.22%)
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs 475 B +28 B (+6.26%) 🔍
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs 1.85 kB +184 B (+11.06%) ⚠️
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs 404 B -43 B (-9.62%) 👏
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs 879 B -2 B (-0.23%)
dist/es/plugins/Emojis/EmojiPicker.mjs 1.32 kB +18 B (+1.38%)
dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs 1.38 kB +5 B (+0.36%)
dist/es/plugins/SlotGeometry/SlotGeometry.mjs 2.26 kB +2.26 kB (new file) 🆕
dist/es/plugins/SlotLayout/a11y.utility.mjs 295 B +295 B (new file) 🆕
dist/es/plugins/SlotLayout/ChannelSlot.mjs 624 B +624 B (new file) 🆕
dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs 2.51 kB +2.51 kB (new file) 🆕
dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs 470 B +470 B (new file) 🆕
dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs 1.85 kB +1.85 kB (new file) 🆕
dist/es/plugins/SlotLayout/layout/Slot.mjs 781 B +781 B (new file) 🆕
dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs 394 B +394 B (new file) 🆕
dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs 2.91 kB +2.91 kB (new file) 🆕
dist/es/plugins/SlotLayout/layoutController/serialization.mjs 805 B +805 B (new file) 🆕
dist/es/plugins/SlotLayout/mjs 3.34 kB +3.34 kB (new file) 🆕
dist/es/plugins/SlotLayout/slotBinding.mjs 331 B +331 B (new file) 🆕
dist/es/plugins/SlotLayout/slotRegistry.mjs 1.09 kB +1.09 kB (new file) 🆕
dist/es/plugins/SlotLayout/ThreadListSlot.mjs 680 B +680 B (new file) 🆕
dist/es/plugins/SlotLayout/ThreadSlot.mjs 515 B +515 B (new file) 🆕
dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs 1.77 kB +1.77 kB (new file) 🆕
dist/es/slot-layout.mjs 478 B +478 B (new file) 🆕
dist/es/slot-mjs 125 B +125 B (new file) 🆕
dist/es/utils/getChannel.mjs 720 B +30 B (+4.35%)
dist/es/utils/getChannelConfig.mjs 0 B -266 B (removed) 🏆
ℹ️ View Unchanged
Filename Size
dist/cjs/audioProcessing.js 1.74 kB
dist/cjs/mp3-encoder.js 814 B
dist/css/channel-detail.css 2.84 kB
dist/css/emoji-picker.css 178 B
dist/css/emoji-replacement.css 456 B
dist/es/_virtual/_rolldown/runtime.mjs 252 B
dist/es/a11y/a11yUtils.mjs 630 B
dist/es/a11y/hooks/useAriaIdentifiers.mjs 540 B
dist/es/a11y/hooks/useListboxKeyboardNavigation.mjs 1.52 kB
dist/es/a11y/hooks/useResolvedModalAriaProps.mjs 497 B
dist/es/a11y/hooks/useVirtualizedListboxKeyboardNavigation.mjs 1.39 kB
dist/es/channel-detail.mjs 802 B
dist/es/components/Accessibility/AriaLiveAnnouncerProvider.mjs 1.65 kB
dist/es/components/Accessibility/AriaLiveOutlet.mjs 964 B
dist/es/components/Accessibility/AriaLiveOutletContext.mjs 194 B
dist/es/components/Accessibility/hooks/useAudioPlaybackChangeAnnouncements.mjs 425 B
dist/es/components/Accessibility/hooks/useFocusReturn.mjs 916 B
dist/es/components/Accessibility/hooks/useInertWhenHidden.mjs 1.62 kB
dist/es/components/Accessibility/scheduling/useAnnouncementQueue.mjs 793 B
dist/es/components/Accessibility/scheduling/useDebouncedAnnounce.mjs 1.68 kB
dist/es/components/Accessibility/scheduling/useSettledAnnouncement.mjs 1.84 kB
dist/es/components/Attachment/attachment-sizing.mjs 1.05 kB
dist/es/components/Attachment/audioSampling.mjs 1.29 kB
dist/es/components/Attachment/components/FileSizeIndicator.mjs 436 B
dist/es/components/Attachment/giphyAccessibility.mjs 481 B
dist/es/components/Attachment/hooks/useLocalVideoDimensions.mjs 1.43 kB
dist/es/components/Attachment/icons.mjs 411 B
dist/es/components/Attachment/Image.mjs 346 B
dist/es/components/Attachment/utils.mjs 740 B
dist/es/components/AudioPlayback/components/DurationDisplay.mjs 596 B
dist/es/components/AudioPlayback/components/formatTime.mjs 339 B
dist/es/components/AudioPlayback/components/keyboardSeek.mjs 524 B
dist/es/components/AudioPlayback/components/PlaybackRateButton.mjs 300 B
dist/es/components/AudioPlayback/components/useInteractiveProgressBar.mjs 1.07 kB
dist/es/components/Avatar/Avatar.mjs 1.02 kB
dist/es/components/Avatar/ChannelAvatar.mjs 344 B
dist/es/components/Avatar/GroupAvatar.mjs 868 B
dist/es/components/Avatar/utils.mjs 183 B
dist/es/components/Badge/Badge.mjs 509 B
dist/es/components/BaseImage/BaseImage.mjs 682 B
dist/es/components/BaseImage/toBaseImageDescriptors.mjs 547 B
dist/es/components/Button/Button.mjs 529 B
dist/es/components/Channel/constants.mjs 156 B
dist/es/components/ChannelList/hooks/useChannelListKeyboardNavigation.mjs 1.25 kB
dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs 262 B
dist/es/components/ChannelList/hooks/useChannelMembersState.mjs 300 B
dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs 403 B
dist/es/components/ChannelListItem/hooks/useChannelPreviewInfo.mjs 624 B
dist/es/components/Dialog/components/Alert.mjs 647 B
dist/es/components/Dialog/hooks/useDialog.mjs 688 B
dist/es/components/Dialog/service/DialogAnchor.mjs 2.06 kB
dist/es/components/Dialog/service/DialogPortal.mjs 1.02 kB
dist/es/components/DragAndDrop/DragAndDropContainer.mjs 1.16 kB
dist/es/components/EventComponent/EventComponent.mjs 462 B
dist/es/components/FileIcon/FileIconSet.mjs 6.71 kB
dist/es/components/FileIcon/iconMap.mjs 512 B
dist/es/components/FileIcon/mimeTypes.mjs 1.73 kB
dist/es/components/FileIcon/mjs 599 B
dist/es/components/Form/FieldError.mjs 261 B
dist/es/components/Form/hooks/useFormState.mjs 550 B
dist/es/components/Form/TextInput.mjs 1.3 kB
dist/es/components/Form/TextInputFieldSet.mjs 376 B
dist/es/components/Gallery/Gallery.mjs 654 B
dist/es/components/Icons/createIcon.mjs 429 B
dist/es/components/Icons/icons.mjs 19.3 kB
dist/es/components/Icons/mjs 378 B
dist/es/components/InfiniteScrollPaginator/InfiniteScroll.mjs 1.34 kB
dist/es/components/ListItemLayout/ListItemLayout.mjs 707 B
dist/es/components/Loading/LoadingChannel.mjs 639 B
dist/es/components/Loading/LoadingChannels.mjs 377 B
dist/es/components/Loading/LoadingIndicator.mjs 286 B
dist/es/components/Loading/UploadedSizeIndicator.mjs 413 B
dist/es/components/Loading/UploadProgressIndicator.mjs 366 B
dist/es/components/LoadMore/LoadMorePaginator.mjs 378 B
dist/es/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.mjs 434 B
dist/es/components/MediaRecorder/AudioRecorder/recordingStateIdentity.mjs 227 B
dist/es/components/MediaRecorder/AudioRecorder/RecordingTimer.mjs 322 B
dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs 353 B
dist/es/components/MediaRecorder/observable/mjs 186 B
dist/es/components/MediaRecorder/transcode/audioProcessing.mjs 758 B
dist/es/components/MediaRecorder/transcode/index.mjs 351 B
dist/es/components/MediaRecorder/transcode/wav.mjs 1.33 kB
dist/es/components/Message/emojiRegex.mjs 450 B
dist/es/components/Message/hooks/useMessageTextStreaming.mjs 783 B
dist/es/components/Message/hooks/useUserHandler.mjs 255 B
dist/es/components/Message/MessageBubble.mjs 246 B
dist/es/components/Message/renderText/componentRenderers/Anchor.mjs 406 B
dist/es/components/Message/renderText/componentRenderers/Emoji.mjs 246 B
dist/es/components/Message/renderText/componentRenderers/Mention.mjs 307 B
dist/es/components/Message/renderText/regex.mjs 440 B
dist/es/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.mjs 338 B
dist/es/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.mjs 1.47 kB
dist/es/components/Message/renderText/remarkPlugins/htmlToTextPlugin.mjs 243 B
dist/es/components/Message/renderText/remarkPlugins/imageToLink.mjs 591 B
dist/es/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.mjs 824 B
dist/es/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.mjs 962 B
dist/es/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.mjs 337 B
dist/es/components/MessageActions/downloadUtils.mjs 980 B
dist/es/components/MessageActions/QuickMessageActionButton.mjs 359 B
dist/es/components/MessageComposer/CooldownTimer.mjs 294 B
dist/es/components/MessageComposer/hooks/useAttachmentsForPreview.mjs 362 B
dist/es/components/MessageComposer/hooks/useCanCreatePoll.mjs 285 B
dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs 414 B
dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs 274 B
dist/es/components/MessageComposer/hooks/useMessageContentIsEmpty.mjs 274 B
dist/es/components/MessageComposer/hooks/useTextareaRef.mjs 252 B
dist/es/components/MessageComposer/hooks/utils.mjs 339 B
dist/es/components/MessageComposer/QuotedMessageIndicator.mjs 263 B
dist/es/components/MessageList/GiphyPreviewMessage.mjs 278 B
dist/es/components/MessageList/hooks/useLastOwnMessage.mjs 249 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.mjs 396 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.mjs 647 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.mjs 499 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.mjs 422 B
dist/es/components/MessageList/MessageListMainPanel.mjs 284 B
dist/es/components/MessageList/renderMessages.mjs 1.1 kB
dist/es/components/Notifications/hooks/useNotifications.mjs 569 B
dist/es/components/Notifications/NotificationConfigurationContext.mjs 386 B
dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs 686 B
dist/es/components/Poll/Poll.mjs 302 B
dist/es/components/Poll/PollActions/PollAction.mjs 492 B
dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs 820 B
dist/es/components/Portal/Portal.mjs 300 B
dist/es/components/ReactFileUtilities/utils.mjs 1.06 kB
dist/es/components/Reactions/reactionOptions.mjs 1.11 kB
dist/es/components/Reactions/SpriteImage.mjs 727 B
dist/es/components/Reactions/utils/utils.mjs 284 B
dist/es/components/SafeAnchor/SafeAnchor.mjs 336 B
dist/es/components/Search/hooks/useAnnounceSearchResultCount.mjs 1.31 kB
dist/es/components/Search/hooks/useSearchQueriesInProgress.mjs 450 B
dist/es/components/Search/hooks/useSearchResultsKeyboardNavigation.mjs 721 B
dist/es/components/Search/SearchResults/SearchSourceResultList.mjs 649 B
dist/es/components/Search/SearchResults/SearchSourceResultsHeader.mjs 148 B
dist/es/components/SkipNavigation/SkipNavigation.mjs 1.01 kB
dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs 821 B
dist/es/components/TextareaComposer/SuggestionList/EmoticonItem.mjs 508 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionItem.mjs 439 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionSuggestionTitle.mjs 236 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/mjs 775 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/SpecialMentionItem.mjs 161 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs 590 B
dist/es/components/TextareaComposer/SuggestionList/TokenizedSuggestionParts.mjs 608 B
dist/es/components/Threads/ThreadList/ThreadListItem.mjs 351 B
dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs 441 B
dist/es/components/Threads/UnreadCountBadge.mjs 332 B
dist/es/components/Tooltip/hooks/useEnterLeaveHandlers.mjs 296 B
dist/es/components/Tooltip/Tooltip.mjs 556 B
dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs 974 B
dist/es/components/TypingIndicator/TypingIndicatorDots.mjs 411 B
dist/es/components/UtilityComponents/ErrorBoundary.mjs 313 B
dist/es/components/UtilityComponents/hooks/useMutationObserver.mjs 798 B
dist/es/components/UtilityComponents/useStableId.mjs 455 B
dist/es/components/VideoPlayer/ReactPlayerWrapper.mjs 481 B
dist/es/components/VideoPlayer/VideoPlayer.mjs 466 B
dist/es/components/VisuallyHidden/VisuallyHidden.mjs 397 B
dist/es/constants/messageTypes.mjs 173 B
dist/es/context/AttachmentSelectorContext.mjs 272 B
dist/es/emojis.mjs 126 B
dist/es/mp3-encoder.mjs 778 B
dist/es/plugins/ChannelDetail/ChannelDetailContext.mjs 373 B
dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs 337 B
dist/es/plugins/ChannelDetail/ChannelDetailListLoadingIndicator.mjs 419 B
dist/es/plugins/ChannelDetail/ChannelDetailNavButton.mjs 505 B
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigator.mjs 1.79 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberCount.mjs 408 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberIds.mjs 430 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMembersSearch.mjs 744 B
dist/es/plugins/ChannelDetail/VirtualizedList/VirtualizedList.mjs 670 B
dist/es/plugins/Emojis/Picker.mjs 324 B
dist/es/store/hooks/useStateStore.mjs 484 B
dist/es/utils/findReverse.mjs 188 B
dist/es/utils/getTextareaCaretRect.mjs 856 B
dist/es/utils/getWholeChar.mjs 368 B
dist/es/utils/isDmChannel.mjs 247 B
dist/es/utils/mergeDeep.mjs 197 B
dist/es/utils/useStableCallback.mjs 831 B

compressed-size-action

@codecov

codecov Bot commented Sep 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 85.68%. Comparing base (cf66d0e) to head (9b7c9e0).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #3304      +/-   ##
==========================================
+ Coverage   85.51%   85.68%   +0.17%     
==========================================
  Files         512      532      +20     
  Lines       16195    15657     -538     
  Branches     5127     4943     -184     
==========================================
- Hits        13849    13416     -433     
+ Misses       2346     2241     -105     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@MartinCupela
MartinCupela merged commit 35f974c into master Sep 28, 2026
13 of 14 checks passed
@MartinCupela
MartinCupela deleted the chore/land-v15-on-master branch September 28, 2026 14:23
@stream-ci-bot

Copy link
Copy Markdown

🎉 This PR is included in version 15.0.0-rc.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

This branch was successfully deployed

2 active deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants