Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 38 additions & 46 deletions src/components/Channel/styling/Channel.scss
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,13 @@
}

.str-chat__loading-channel {
$text-height: calc(var(--str-chat__spacing-px) * 20);
$header-bar-height: calc(var(--str-chat__spacing-px) * 16);
$metadata-bar-height: calc(var(--str-chat__spacing-px) * 16);
$composer-control-height: calc(var(--str-chat__spacing-px) * 48);
--str-chat__loading-channel-content-max-width: calc(
var(--str-chat__message-composer-max-width) +
var(--str-chat__message-composer-padding)
);
height: 100%;
display: flex;
flex-direction: column;
Expand All @@ -56,8 +62,8 @@
}

.str-chat__loading-channel-header-name {
height: $text-height;
width: calc(var(--str-chat__spacing-px) * 112);
height: $header-bar-height;
width: calc(var(--str-chat__spacing-px) * 120);
}

.str-chat__loading-channel-header-avatar {
Expand All @@ -74,6 +80,8 @@
.str-chat__message-list-scroll {
width: 100%;
height: 100%;
max-width: var(--str-chat__loading-channel-content-max-width);
margin-inline: auto;
}
}

Expand All @@ -82,18 +90,19 @@
width: 100%;
display: flex;
flex-direction: column;
padding-block: var(--spacing-lg) var(--spacing-md);
gap: calc(var(--str-chat__spacing-px) * 28);
padding-block: calc(var(--str-chat__spacing-px) * 32)
calc(var(--str-chat__spacing-px) * 24);

.str-chat__loading-channel-message {
display: flex;
width: 100%;
column-gap: var(--spacing-sm);
padding-block: var(--spacing-xs);

.str-chat__loading-channel-message-avatar {
flex-shrink: 0;
width: calc(var(--str-chat__spacing-px) * 32);
height: calc(var(--str-chat__spacing-px) * 32);
width: calc(var(--str-chat__spacing-px) * 36);
height: calc(var(--str-chat__spacing-px) * 36);
border-radius: 50%;
align-self: end;
}
Expand All @@ -103,43 +112,37 @@
flex-direction: column;
width: min(100%, var(--str-chat__message-max-width));
max-width: var(--str-chat__message-max-width);
row-gap: var(--spacing-xxs);
row-gap: calc(var(--str-chat__spacing-px) * 12);
min-width: 0;
}

.str-chat__loading-channel-message-bubble {
min-height: calc(var(--str-chat__spacing-px) * 52);
width: min(100%, var(--str-chat__message-max-width));
border-radius: var(--message-bubble-radius-group-bottom);
}

.str-chat__loading-channel-message-bubble--sm {
width: min(54%, calc(var(--str-chat__spacing-px) * 216));
border-radius: var(--radius-3xl);
}

.str-chat__loading-channel-message-bubble--md {
width: min(68%, calc(var(--str-chat__spacing-px) * 272));
height: calc(var(--str-chat__spacing-px) * 64);
width: min(58%, calc(var(--str-chat__spacing-px) * 272));
}

.str-chat__loading-channel-message-bubble--lg {
width: min(82%, calc(var(--str-chat__spacing-px) * 328));
height: calc(var(--str-chat__spacing-px) * 84);
width: min(72%, calc(var(--str-chat__spacing-px) * 352));
}

.str-chat__loading-channel-message-metadata {
display: flex;
align-items: center;
gap: var(--spacing-xs);
min-width: 0;
height: $metadata-bar-height;
width: min(100%, var(--str-chat__message-max-width));
border-radius: 999px;
}

.str-chat__loading-channel-message-sender {
height: calc(var(--str-chat__spacing-px) * 14);
width: calc(var(--str-chat__spacing-px) * 72);
.str-chat__loading-channel-message-metadata--sm {
width: calc(var(--str-chat__spacing-px) * 88);
}

.str-chat__loading-channel-message-date {
height: calc(var(--str-chat__spacing-px) * 14);
width: calc(var(--str-chat__spacing-px) * 48);
.str-chat__loading-channel-message-metadata--md {
width: calc(var(--str-chat__spacing-px) * 124);
}

&.str-chat__loading-channel-message--outgoing {
Expand All @@ -148,39 +151,29 @@
.str-chat__loading-channel-message-content {
align-items: flex-end;
}

.str-chat__loading-channel-message-bubble {
border-end-end-radius: var(--message-bubble-radius-tail);
}

.str-chat__loading-channel-message-metadata {
justify-content: flex-end;
}
}

&.str-chat__loading-channel-message--incoming {
.str-chat__loading-channel-message-bubble {
border-end-start-radius: var(--message-bubble-radius-tail);
}
}
}
}

.str-chat__message-composer-container--loading {
pointer-events: none;

.str-chat__message-composer {
align-items: center;
}

.str-chat__loading-channel-message-input-button {
flex-shrink: 0;
width: var(--button-visual-height-md);
height: var(--button-visual-height-md);
width: $composer-control-height;
height: $composer-control-height;
border-radius: var(--button-radius-full);
}

.str-chat__loading-channel-message-input-pill {
flex: 1;
min-width: 0;
height: var(--button-visual-height-md);
border-radius: var(--str-chat__message-input-border-radius);
height: $composer-control-height;
border-radius: 999px;
}
}
}
Expand Down Expand Up @@ -275,8 +268,7 @@
@include channel-loading-shimmer;
}

.str-chat__loading-channel-message-sender,
.str-chat__loading-channel-message-date {
.str-chat__loading-channel-message-metadata {
@include channel-loading-faded-bar;
}
}
Expand Down
22 changes: 13 additions & 9 deletions src/components/Loading/LoadingChannel.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import React from 'react';

type LoadingMessageProps = {
bubbleSize: 'sm' | 'md' | 'lg';
bubbleSize: 'md' | 'lg';
metadataSize: 'sm' | 'md';
outgoing?: boolean;
};

const LoadingMessage = ({ bubbleSize, outgoing = false }: LoadingMessageProps) => (
const LoadingMessage = ({
bubbleSize,
metadataSize,
outgoing = false,
}: LoadingMessageProps) => (
<div
className={`str-chat__loading-channel-message ${
outgoing
Expand All @@ -18,10 +23,9 @@ const LoadingMessage = ({ bubbleSize, outgoing = false }: LoadingMessageProps) =
<div
className={`str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--${bubbleSize}`}
></div>
<div className='str-chat__loading-channel-message-metadata'>
<div className='str-chat__loading-channel-message-sender'></div>
<div className='str-chat__loading-channel-message-date'></div>
</div>
<div
className={`str-chat__loading-channel-message-metadata str-chat__loading-channel-message-metadata--${metadataSize}`}
></div>
</div>
</div>
);
Expand Down Expand Up @@ -50,9 +54,9 @@ export const LoadingChannel = () => (
<div className='str-chat__message-list str-chat__message-list--loading'>
<div className='str-chat__message-list-scroll'>
<div className='str-chat__loading-channel-message-list'>
<LoadingMessage bubbleSize='lg' />
<LoadingMessage bubbleSize='sm' outgoing />
<LoadingMessage bubbleSize='md' />
<LoadingMessage bubbleSize='lg' metadataSize='md' />
<LoadingMessage bubbleSize='md' metadataSize='sm' outgoing />
<LoadingMessage bubbleSize='lg' metadataSize='md' />
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,8 @@ exports[`LoadingChannel should render component with default props 1`] = `
class="str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--lg"
/>
<div
class="str-chat__loading-channel-message-metadata"
>
<div
class="str-chat__loading-channel-message-sender"
/>
<div
class="str-chat__loading-channel-message-date"
/>
</div>
class="str-chat__loading-channel-message-metadata str-chat__loading-channel-message-metadata--md"
/>
</div>
</div>
<div
Expand All @@ -59,18 +52,11 @@ exports[`LoadingChannel should render component with default props 1`] = `
class="str-chat__loading-channel-message-content"
>
<div
class="str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--sm"
class="str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--md"
/>
<div
class="str-chat__loading-channel-message-metadata"
>
<div
class="str-chat__loading-channel-message-sender"
/>
<div
class="str-chat__loading-channel-message-date"
/>
</div>
class="str-chat__loading-channel-message-metadata str-chat__loading-channel-message-metadata--sm"
/>
</div>
</div>
<div
Expand All @@ -83,18 +69,11 @@ exports[`LoadingChannel should render component with default props 1`] = `
class="str-chat__loading-channel-message-content"
>
<div
class="str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--md"
class="str-chat__loading-channel-message-bubble str-chat__loading-channel-message-bubble--lg"
/>
<div
class="str-chat__loading-channel-message-metadata"
>
<div
class="str-chat__loading-channel-message-sender"
/>
<div
class="str-chat__loading-channel-message-date"
/>
</div>
class="str-chat__loading-channel-message-metadata str-chat__loading-channel-message-metadata--md"
/>
</div>
</div>
</div>
Expand Down
23 changes: 21 additions & 2 deletions src/components/Threads/ThreadList/ThreadList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ import { ThreadListItem as DefaultThreadListItem } from './ThreadListItem';
import { ThreadListEmptyPlaceholder as DefaultThreadListEmptyPlaceholder } from './ThreadListEmptyPlaceholder';
import { ThreadListUnseenThreadsBanner as DefaultThreadListUnseenThreadsBanner } from './ThreadListUnseenThreadsBanner';
import { ThreadListLoadingIndicator as DefaultThreadListLoadingIndicator } from './ThreadListLoadingIndicator';
import { LoadingChannels } from '../../Loading';
import { useChatContext, useComponentContext } from '../../../context';
import { useStateStore } from '../../../store';
import { ThreadListHeader } from './ThreadListHeader';

const selector = (nextValue: ThreadManagerState) => ({ threads: nextValue.threads });
const selector = (nextValue: ThreadManagerState) => ({
isLoading: nextValue.pagination.isLoading,
threads: nextValue.threads,
});

const computeItemKey: ComputeItemKey<Thread, unknown> = (_, item) => item.id;

Expand Down Expand Up @@ -52,10 +56,25 @@ export const ThreadList = ({ virtuosoProps }: ThreadListProps) => {
ThreadListLoadingIndicator = DefaultThreadListLoadingIndicator,
ThreadListUnseenThreadsBanner = DefaultThreadListUnseenThreadsBanner,
} = useComponentContext();
const { threads } = useStateStore(client.threads.state, selector);
const { isLoading, threads } = useStateStore(client.threads.state, selector);

useThreadList();

if (isLoading && !threads.length) {
return (
<div
className={clsx('str-chat__thread-list-container', {
'str-chat__thread-list-container--open': navOpen,
})}
>
<ThreadListHeader />
<div className='str-chat__thread-list str-chat__thread-list--loading'>
<LoadingChannels />
</div>
</div>
);
}

return (
<div
className={clsx('str-chat__thread-list-container', {
Expand Down
Loading
Loading