mirror of https://github.com/msgbyte/tailchat
feat: add discover server card and join action
parent
2709beb2d8
commit
f943edf3fe
@ -0,0 +1,142 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import {
|
||||||
|
postRequest,
|
||||||
|
useAsync,
|
||||||
|
useAsyncRequest,
|
||||||
|
getTextColorHex,
|
||||||
|
} from '@capital/common';
|
||||||
|
import { Avatar, Skeleton, Button } from '@capital/component';
|
||||||
|
import { Translate } from '../translate';
|
||||||
|
import { request } from '../request';
|
||||||
|
|
||||||
|
const Root = styled.div`
|
||||||
|
width: 100%;
|
||||||
|
height: 320px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 8px;
|
||||||
|
position: relative;
|
||||||
|
background-color: #2c3441;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
height: 143px;
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
overflow: visible;
|
||||||
|
margin-bottom: 32px;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -21px;
|
||||||
|
left: 12px;
|
||||||
|
border: 6px solid #2c3441;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
display: flex;
|
||||||
|
padding: 0 16px 16px;
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.name {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.desc {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
padding: 0 16px 16px;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
opacity: 0.8;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
* + * {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
interface DiscoverServerCardProps {
|
||||||
|
groupId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DiscoverServerCard: React.FC<DiscoverServerCardProps> = React.memo(
|
||||||
|
(props) => {
|
||||||
|
const { value: groupBasicInfo } = useAsync(async () => {
|
||||||
|
const { data } = await postRequest('/group/getGroupBasicInfo', {
|
||||||
|
groupId: props.groupId,
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}, [props.groupId]);
|
||||||
|
|
||||||
|
const [{ loading: joinLoading }, handleJoin] = useAsyncRequest(async () => {
|
||||||
|
await request.post('join', {
|
||||||
|
groupId: props.groupId,
|
||||||
|
});
|
||||||
|
}, [props.groupId]);
|
||||||
|
|
||||||
|
if (!groupBasicInfo) {
|
||||||
|
return (
|
||||||
|
<Root>
|
||||||
|
<div className="header">
|
||||||
|
<div className="icon">
|
||||||
|
<Skeleton.Avatar active={true} size={40} shape={'square'} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="body">
|
||||||
|
<Skeleton active={true} />
|
||||||
|
</div>
|
||||||
|
</Root>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Root>
|
||||||
|
<div
|
||||||
|
className="header"
|
||||||
|
style={{ background: getTextColorHex(groupBasicInfo.name) }}
|
||||||
|
>
|
||||||
|
<div className="icon">
|
||||||
|
<Avatar
|
||||||
|
shape="square"
|
||||||
|
size={40}
|
||||||
|
src={groupBasicInfo.icon}
|
||||||
|
name={groupBasicInfo.name}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="body">
|
||||||
|
<div className="name">{groupBasicInfo.name}</div>
|
||||||
|
<div className="desc"></div>
|
||||||
|
</div>
|
||||||
|
<div className="footer">
|
||||||
|
<div>
|
||||||
|
{Translate.memberCount.replace(
|
||||||
|
'{count}',
|
||||||
|
groupBasicInfo.memberCount
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
loading={joinLoading}
|
||||||
|
onClick={handleJoin}
|
||||||
|
>
|
||||||
|
{Translate.join}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</Root>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
DiscoverServerCard.displayName = 'DiscoverServerCard';
|
@ -1,14 +1,57 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useAsync } from '@capital/common';
|
import { useAsync } from '@capital/common';
|
||||||
|
import { LoadingSpinner } from '@capital/component';
|
||||||
import { request } from '../request';
|
import { request } from '../request';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import { DiscoverServerCard } from './DiscoverServerCard';
|
||||||
|
import { Translate } from '../translate';
|
||||||
|
|
||||||
|
interface DiscoverServerItem {
|
||||||
|
groupId: string;
|
||||||
|
order: number;
|
||||||
|
active: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Root = styled.div`
|
||||||
|
width: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const DiscoverServerHeader = styled.div`
|
||||||
|
font-size: 1.5rem;
|
||||||
|
padding: 32px 0;
|
||||||
|
text-align: center;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const DiscoverServerList = styled.div`
|
||||||
|
margin-top: 16px;
|
||||||
|
display: grid;
|
||||||
|
grid-gap: 16px;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(248px, 1fr));
|
||||||
|
padding: 10px;
|
||||||
|
`;
|
||||||
|
|
||||||
export const DiscoverPanel: React.FC = React.memo(() => {
|
export const DiscoverPanel: React.FC = React.memo(() => {
|
||||||
const { value: list } = useAsync(async () => {
|
const { loading, value: list = [] } = useAsync(async (): Promise<
|
||||||
|
DiscoverServerItem[]
|
||||||
|
> => {
|
||||||
const { data } = await request.get('all');
|
const { data } = await request.get('all');
|
||||||
|
|
||||||
return data.list ?? [];
|
return data.list ?? [];
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return <div>DiscoverPanel: {JSON.stringify(list)}</div>;
|
if (loading) {
|
||||||
|
return <LoadingSpinner />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Root>
|
||||||
|
<DiscoverServerHeader>{Translate.discoverHeader}</DiscoverServerHeader>
|
||||||
|
<DiscoverServerList>
|
||||||
|
{list.map((item, i) => (
|
||||||
|
<DiscoverServerCard key={i} groupId={item.groupId} />
|
||||||
|
))}
|
||||||
|
</DiscoverServerList>
|
||||||
|
</Root>
|
||||||
|
);
|
||||||
});
|
});
|
||||||
DiscoverPanel.displayName = 'DiscoverPanel';
|
DiscoverPanel.displayName = 'DiscoverPanel';
|
||||||
|
Loading…
Reference in New Issue