mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-26 02:35:58 +08:00
feat: add publish workspace page list and workspace page
This commit is contained in:
@@ -11,10 +11,12 @@ const EDITOR_VERSION = enableDebugLocal
|
|||||||
|
|
||||||
const profileTarget = {
|
const profileTarget = {
|
||||||
ac: '100.85.73.88:12001',
|
ac: '100.85.73.88:12001',
|
||||||
dev: '100.77.180.48:11001',
|
dev: '192.168.65.20:3000',
|
||||||
local: '127.0.0.1:3000',
|
local: '127.0.0.1:3000',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 100.77.180.48:11001
|
||||||
|
|
||||||
const getRedirectConfig = profile => {
|
const getRedirectConfig = profile => {
|
||||||
const target = profileTarget[profile || 'dev'] || profileTarget['dev'];
|
const target = profileTarget[profile || 'dev'] || profileTarget['dev'];
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ export const Editor = ({ page, workspace, setEditor }: Props) => {
|
|||||||
|
|
||||||
const editor = new EditorContainer();
|
const editor = new EditorContainer();
|
||||||
editor.page = page;
|
editor.page = page;
|
||||||
|
|
||||||
editorContainer.current?.appendChild(editor);
|
editorContainer.current?.appendChild(editor);
|
||||||
if (page.isEmpty) {
|
if (page.isEmpty) {
|
||||||
const isFirstPage = workspace?.meta.pageMetas.length === 1;
|
const isFirstPage = workspace?.meta.pageMetas.length === 1;
|
||||||
|
|||||||
@@ -67,10 +67,12 @@ export const PageList = ({
|
|||||||
pageList,
|
pageList,
|
||||||
showFavoriteTag = false,
|
showFavoriteTag = false,
|
||||||
isTrash = false,
|
isTrash = false,
|
||||||
|
isPublic = false,
|
||||||
}: {
|
}: {
|
||||||
pageList: PageMeta[];
|
pageList: PageMeta[];
|
||||||
showFavoriteTag?: boolean;
|
showFavoriteTag?: boolean;
|
||||||
isTrash?: boolean;
|
isTrash?: boolean;
|
||||||
|
isPublic?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { currentWorkspace } = useAppState();
|
const { currentWorkspace } = useAppState();
|
||||||
@@ -98,9 +100,15 @@ export const PageList = ({
|
|||||||
<StyledTableRow
|
<StyledTableRow
|
||||||
key={`${pageMeta.id}-${index}`}
|
key={`${pageMeta.id}-${index}`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
router.push(
|
if (isPublic) {
|
||||||
`/workspace/${currentWorkspace?.id}/${pageMeta.id}`
|
router.push(
|
||||||
);
|
`/public-workspace/${router.query.workspaceId}/${pageMeta.id}`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
router.push(
|
||||||
|
`/workspace/${currentWorkspace?.id}/${pageMeta.id}`
|
||||||
|
);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
@@ -124,19 +132,21 @@ export const PageList = ({
|
|||||||
dateKey={isTrash ? 'trashDate' : 'updatedDate'}
|
dateKey={isTrash ? 'trashDate' : 'updatedDate'}
|
||||||
backupKey={isTrash ? 'trashDate' : 'createDate'}
|
backupKey={isTrash ? 'trashDate' : 'createDate'}
|
||||||
/>
|
/>
|
||||||
<TableCell
|
{!isPublic ? (
|
||||||
style={{ padding: 0 }}
|
<TableCell
|
||||||
data-testid={`more-actions-${pageMeta.id}`}
|
style={{ padding: 0 }}
|
||||||
onClick={e => {
|
data-testid={`more-actions-${pageMeta.id}`}
|
||||||
e.stopPropagation();
|
onClick={e => {
|
||||||
}}
|
e.stopPropagation();
|
||||||
>
|
}}
|
||||||
{isTrash ? (
|
>
|
||||||
<TrashOperationCell pageMeta={pageMeta} />
|
{isTrash ? (
|
||||||
) : (
|
<TrashOperationCell pageMeta={pageMeta} />
|
||||||
<OperationCell pageMeta={pageMeta} />
|
) : (
|
||||||
)}
|
<OperationCell pageMeta={pageMeta} />
|
||||||
</TableCell>
|
)}
|
||||||
|
</TableCell>
|
||||||
|
) : null}
|
||||||
</StyledTableRow>
|
</StyledTableRow>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -14,8 +14,7 @@ import { WorkspaceUnit } from '@affine/datacenter';
|
|||||||
import { useWorkspaceHelper } from '@/hooks/use-workspace-helper';
|
import { useWorkspaceHelper } from '@/hooks/use-workspace-helper';
|
||||||
|
|
||||||
export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => {
|
export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => {
|
||||||
const shareUrl =
|
const shareUrl = window.location.host + '/public-workspace/' + workspace.id;
|
||||||
window.location.host + '/workspace/' + workspace.id + '?share=true';
|
|
||||||
const { publishWorkspace, enableWorkspace } = useWorkspaceHelper();
|
const { publishWorkspace, enableWorkspace } = useWorkspaceHelper();
|
||||||
|
|
||||||
const togglePublic = async (flag: boolean) => {
|
const togglePublic = async (flag: boolean) => {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { styled } from '@/styles';
|
import { styled } from '@/styles';
|
||||||
import MuiAvatar from '@mui/material/Avatar';
|
import MuiAvatar from '@mui/material/Avatar';
|
||||||
import { Button } from '@/ui/button';
|
|
||||||
|
|
||||||
export const StyledMemberTitleContainer = styled('div')(() => {
|
export const StyledMemberTitleContainer = styled('div')(() => {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { styled } from '@/styles';
|
import { styled } from '@/styles';
|
||||||
import { Button } from '@/ui/button';
|
|
||||||
import MuiAvatar from '@mui/material/Avatar';
|
|
||||||
|
|
||||||
export const StyledSettingContainer = styled('div')(() => {
|
export const StyledSettingContainer = styled('div')(() => {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,37 +1,55 @@
|
|||||||
import { ReactElement, useState } from 'react';
|
import { ReactElement, useEffect, useState } from 'react';
|
||||||
import { useAppState } from '@/providers/app-state-provider';
|
import { useAppState } from '@/providers/app-state-provider';
|
||||||
import type { NextPageWithLayout } from '../..//_app';
|
import type { NextPageWithLayout } from '../..//_app';
|
||||||
|
import { styled } from '@/styles';
|
||||||
import dynamic from 'next/dynamic';
|
import dynamic from 'next/dynamic';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
|
import { Page as PageStore, Workspace } from '@blocksuite/store';
|
||||||
const DynamicBlocksuite = dynamic(() => import('@/components/editor'), {
|
const DynamicBlocksuite = dynamic(() => import('@/components/editor'), {
|
||||||
ssr: false,
|
ssr: false,
|
||||||
});
|
});
|
||||||
const Page: NextPageWithLayout = () => {
|
const Page: NextPageWithLayout = () => {
|
||||||
const [workspace, setWorkspace] = useState(null);
|
const [workspace, setWorkspace] = useState<Workspace>();
|
||||||
const [page, setPage] = useState(null);
|
const [page, setPage] = useState<PageStore>();
|
||||||
const { dataCenter } = useAppState();
|
const { dataCenter } = useAppState();
|
||||||
console.log('dataCenter: ', dataCenter);
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
useEffect(() => {
|
||||||
console.log(router.query.workspaceId);
|
dataCenter
|
||||||
dataCenter
|
.loadPublicWorkspace(router.query.workspaceId as string)
|
||||||
.loadPublicWorkspace(router.query.workspaceId as string)
|
.then(data => {
|
||||||
.then(data => {
|
if (data && data.blocksuiteWorkspace) {
|
||||||
console.log(data);
|
setWorkspace(data.blocksuiteWorkspace);
|
||||||
});
|
if (
|
||||||
|
router.query.pageId &&
|
||||||
|
data.blocksuiteWorkspace.meta.pageMetas.find(
|
||||||
|
p => p.id === router.query.pageId
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
const page = data.blocksuiteWorkspace?.getPage(
|
||||||
|
router.query.pageId as string
|
||||||
|
);
|
||||||
|
page && setPage(page);
|
||||||
|
} else {
|
||||||
|
router.push('/404');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
router.push('/404');
|
||||||
|
});
|
||||||
|
}, [router, dataCenter]);
|
||||||
return (
|
return (
|
||||||
<>
|
<PageContainer>
|
||||||
{workspace && page && (
|
{workspace && page && (
|
||||||
<DynamicBlocksuite
|
<DynamicBlocksuite
|
||||||
page={page}
|
page={page}
|
||||||
workspace={workspace}
|
workspace={workspace}
|
||||||
setEditor={() => {
|
setEditor={editor => {
|
||||||
console.log('test');
|
editor.readonly = true;
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</>
|
</PageContainer>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -40,3 +58,12 @@ Page.getLayout = function getLayout(page: ReactElement) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default Page;
|
export default Page;
|
||||||
|
|
||||||
|
export const PageContainer = styled.div(({ theme }) => {
|
||||||
|
return {
|
||||||
|
height: 'calc(100vh)',
|
||||||
|
padding: '78px 72px',
|
||||||
|
overflowY: 'auto',
|
||||||
|
backgroundColor: theme.colors.pageBackground,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,29 +1,31 @@
|
|||||||
import { PageList } from '@/components/page-list';
|
import { PageList } from '@/components/page-list';
|
||||||
import { AllPagesIcon } from '@blocksuite/icons';
|
import { ReactElement, useEffect, useState } from 'react';
|
||||||
import { PageListHeader } from '@/components/header';
|
import { PageMeta, useAppState } from '@/providers/app-state-provider';
|
||||||
import { ReactElement } from 'react';
|
|
||||||
import { useTranslation } from '@affine/i18n';
|
|
||||||
import { useAppState } from '@/providers/app-state-provider';
|
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
|
import { PageContainer } from './[pageId]';
|
||||||
const All = () => {
|
const All = () => {
|
||||||
const { pageList } = useAppState();
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const { dataCenter } = useAppState();
|
const { dataCenter } = useAppState();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const [pageList, setPageList] = useState<PageMeta[]>([]);
|
||||||
|
useEffect(() => {
|
||||||
|
dataCenter
|
||||||
|
.loadPublicWorkspace(router.query.workspaceId as string)
|
||||||
|
.then(data => {
|
||||||
|
setPageList(data.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
router.push('/404');
|
||||||
|
});
|
||||||
|
}, [router, dataCenter]);
|
||||||
|
|
||||||
console.log(router.query.workspaceId);
|
|
||||||
dataCenter
|
|
||||||
.loadPublicWorkspace(router.query.workspaceId as string)
|
|
||||||
.then(data => {
|
|
||||||
console.log(data);
|
|
||||||
});
|
|
||||||
return (
|
return (
|
||||||
<>
|
<PageContainer>
|
||||||
<PageList
|
<PageList
|
||||||
pageList={pageList.filter(p => !p.trash)}
|
pageList={pageList.filter(p => !p.trash)}
|
||||||
showFavoriteTag={true}
|
showFavoriteTag={false}
|
||||||
|
isPublic={true}
|
||||||
/>
|
/>
|
||||||
</>
|
</PageContainer>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,9 @@ export class AffineProvider extends BaseProvider {
|
|||||||
const updates = await this._apis.downloadWorkspace(workspaceId, published);
|
const updates = await this._apis.downloadWorkspace(workspaceId, published);
|
||||||
if (updates && updates.byteLength) {
|
if (updates && updates.byteLength) {
|
||||||
await new Promise(resolve => {
|
await new Promise(resolve => {
|
||||||
doc.once('update', resolve);
|
doc.once('update', () => {
|
||||||
|
setTimeout(resolve, 100);
|
||||||
|
});
|
||||||
BlocksuiteWorkspace.Y.applyUpdate(doc, new Uint8Array(updates));
|
BlocksuiteWorkspace.Y.applyUpdate(doc, new Uint8Array(updates));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user