mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-12-06 03:53:02 +00:00
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
import Editor from '$app/components/editor/Editor';
|
|
import { DocumentHeader } from 'src/appflowy_app/components/document/document_header';
|
|
import { useAppDispatch, useAppSelector } from '$app/stores/store';
|
|
import { updatePageName } from '$app_reducers/pages/async_actions';
|
|
import { PageCover } from '$app_reducers/pages/slice';
|
|
|
|
export function Document({ id }: { id: string }) {
|
|
const page = useAppSelector((state) => state.pages.pageMap[id]);
|
|
|
|
const [cover, setCover] = useState<PageCover | undefined>(undefined);
|
|
const dispatch = useAppDispatch();
|
|
|
|
const onTitleChange = useCallback(
|
|
(newTitle: string) => {
|
|
void dispatch(
|
|
updatePageName({
|
|
id,
|
|
name: newTitle,
|
|
})
|
|
);
|
|
},
|
|
[dispatch, id]
|
|
);
|
|
|
|
const view = useMemo(() => {
|
|
return {
|
|
...page,
|
|
cover,
|
|
};
|
|
}, [page, cover]);
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
setCover(undefined);
|
|
};
|
|
}, [id]);
|
|
|
|
if (!page) return null;
|
|
|
|
return (
|
|
<div className={'relative w-full'}>
|
|
<DocumentHeader onUpdateCover={setCover} page={view} />
|
|
<div className={'flex w-full justify-center'}>
|
|
<div className={'max-w-screen w-[964px] min-w-0'}>
|
|
<Editor id={id} cover={cover} onCoverChange={setCover} onTitleChange={onTitleChange} title={page.name} />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default Document;
|