Files
AFFiNE/libs/components/layout/src/header/Title.tsx
T
b35c9b2c14 Feat/land page (#391)
* feat: update landing page

* feat: update landing page

* fix: react warning

* feat(route): rename variables

* feat(route): better refresh

* fix: update logo and i18n

* feat(code): remove unused comment

* refactor(workspace): rename workspaceId

* refactor(page): rename pageId

* feat(edit): more robust editing experience

* fix: landing page mobile

* fix: landing page mobile

Co-authored-by: tzhangchi <terry.zhangchi@outlook.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2022-09-09 02:56:10 +00:00

90 lines
2.8 KiB
TypeScript

import { styled, Typography } from '@toeverything/components/ui';
import { useCallback, useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import { services } from '@toeverything/datasource/db-service';
import { useUserAndSpaces } from '@toeverything/datasource/state';
/* card.7: Demand changes, temporarily closed, see https://github.com/toeverything/AFFiNE/issues/522 */
// import { usePageTree} from '@toeverything/components/layout';
// import { pickPath } from './utils';
export const CurrentPageTitle = () => {
const { user } = useUserAndSpaces();
const params = useParams();
const { workspaceId } = params;
const [pageId, setPageId] = useState<string>('');
const [pageTitle, setPageTitle] = useState<string | undefined>();
/* card.7 */
// const { items } = usePageTree();
useEffect(() => {
if (params['*']) {
setPageId(params['*'].split('/')[0]);
}
}, [params]);
const fetchPageTitle = useCallback(async () => {
if (!workspaceId || !pageId) return;
const [pageEditorBlock] = await services.api.editorBlock.get({
workspace: workspaceId,
ids: [pageId],
});
/* card.7 */
/* If the id is unique, only one path will be matched */
// const routes = pickPath(items, pageId).filter(item => item.length)?.[0];
setPageTitle(
pageEditorBlock?.properties?.text?.value
?.map(v => v.text)
.join('') ?? 'Untitled'
);
}, [pageId, workspaceId]);
useEffect(() => {
if (user) fetchPageTitle();
}, [fetchPageTitle, user]);
useEffect(() => {
if (!user || !workspaceId || !pageId || pageTitle === undefined)
return () => {};
let unobserve: () => void;
const auto_update_title = async () => {
// console.log(';; title registration auto update');
unobserve = await services.api.editorBlock.observe(
{ workspace: workspaceId, id: pageId },
businessBlock => {
// console.log(';; auto_update_title', businessBlock);
fetchPageTitle();
}
);
};
auto_update_title();
return () => {
// unobserve?.();
};
}, [fetchPageTitle, pageId, pageTitle, user, workspaceId]);
useEffect(() => {
document.title = pageTitle || '';
}, [pageTitle]);
return pageTitle ? (
<ContentText type="sm" title={pageTitle}>
{pageTitle}
</ContentText>
) : null;
};
const ContentText = styled(Typography)(({ theme }) => {
return {
color: theme.affine.palette.primaryText,
maxWidth: '240px',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
};
});