diff --git a/packages/frontend/core/src/components/affine/setting-modal/setting-sidebar/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/setting-sidebar/index.tsx index 2bcac594d..0ad9d09b6 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/setting-sidebar/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/setting-sidebar/index.tsx @@ -240,7 +240,7 @@ const WorkspaceListItem = ({ const isCurrent = currentWorkspace.id === meta.id; const t = useAFFiNEI18N(); const isOwner = useIsWorkspaceOwner(meta); - const availableFeatures = useWorkspaceAvailableFeatures(); + const availableFeatures = useWorkspaceAvailableFeatures(meta); const onClickPreference = useCallback(() => { onClick('preference'); diff --git a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/experimental-features/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/experimental-features/index.tsx index c45b8ef38..a3aab5f82 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/experimental-features/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/experimental-features/index.tsx @@ -8,6 +8,7 @@ import { } from '@affine/core/hooks/use-workspace-features'; import { FeatureType } from '@affine/graphql'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; +import type { WorkspaceMetadata } from '@affine/workspace/metadata'; import { useAtom } from 'jotai'; import { atomWithStorage } from 'jotai/utils'; import { Suspense, useCallback, useState } from 'react'; @@ -74,16 +75,18 @@ const ExperimentalFeaturesPrompt = ({ interface ExperimentalFeaturesItemProps { feature: FeatureType; title: React.ReactNode; + workspaceMetadata: WorkspaceMetadata; } const ExperimentalFeaturesItem = ({ feature, title, + workspaceMetadata, }: ExperimentalFeaturesItemProps) => { - const enabledFeatures = useWorkspaceEnabledFeatures(); + const enabledFeatures = useWorkspaceEnabledFeatures(workspaceMetadata); const enabled = enabledFeatures.includes(feature); const [localEnabled, setLocalEnabled] = useState(enabled); - const { trigger, isMutating } = useSetWorkspaceFeature(); + const { trigger, isMutating } = useSetWorkspaceFeature(workspaceMetadata); const onChange = useCallback( (checked: boolean) => { setLocalEnabled(checked); @@ -104,9 +107,13 @@ const ExperimentalFeaturesItem = ({ ); }; -const ExperimentalFeaturesMain = () => { +const ExperimentalFeaturesMain = ({ + workspaceMetadata, +}: { + workspaceMetadata: WorkspaceMetadata; +}) => { const t = useAFFiNEI18N(); - const features = useWorkspaceAvailableFeatures(); + const features = useWorkspaceAvailableFeatures(workspaceMetadata); return ( <> @@ -119,6 +126,7 @@ const ExperimentalFeaturesMain = () => { {features.includes(FeatureType.Copilot) ? ( ) : null} @@ -132,7 +140,11 @@ const experimentalFeaturesDisclaimerAtom = atomWithStorage( false ); -export const ExperimentalFeatures = () => { +export const ExperimentalFeatures = ({ + workspaceMetadata, +}: { + workspaceMetadata: WorkspaceMetadata; +}) => { const [enabled, setEnabled] = useAtom(experimentalFeaturesDisclaimerAtom); const handleConfirm = useAsyncCallback(async () => { setEnabled(true); @@ -142,7 +154,7 @@ export const ExperimentalFeatures = () => { } else { return ( }> - + ); } diff --git a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx index 9bca67907..03fc5da7b 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/index.tsx @@ -22,6 +22,6 @@ export const WorkspaceSetting = ({ /> ); case 'experimental-features': - return ; + return ; } }; diff --git a/packages/frontend/core/src/hooks/use-workspace-features.ts b/packages/frontend/core/src/hooks/use-workspace-features.ts index c207cc1ef..aa234e3b5 100644 --- a/packages/frontend/core/src/hooks/use-workspace-features.ts +++ b/packages/frontend/core/src/hooks/use-workspace-features.ts @@ -5,25 +5,25 @@ import { enabledFeaturesQuery, setWorkspaceExperimentalFeatureMutation, } from '@affine/graphql'; -import { useAtomValue } from 'jotai'; +import type { WorkspaceMetadata } from '@affine/workspace/metadata'; -import { waitForCurrentWorkspaceAtom } from '../modules/workspace'; import { useAsyncCallback } from './affine-async-hooks'; import { useMutateQueryResource, useMutation } from './use-mutation'; import { useQueryImmutable } from './use-query'; const emptyFeatures: FeatureType[] = []; -export const useWorkspaceAvailableFeatures = () => { - const currentWorkspace = useAtomValue(waitForCurrentWorkspaceAtom); +export const useWorkspaceAvailableFeatures = ( + workspaceMetadata: WorkspaceMetadata +) => { const isCloudWorkspace = - currentWorkspace.flavour === WorkspaceFlavour.AFFINE_CLOUD; + workspaceMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD; const { data } = useQueryImmutable( isCloudWorkspace ? { query: availableFeaturesQuery, variables: { - id: currentWorkspace.id, + id: workspaceMetadata.id, }, } : undefined @@ -31,16 +31,17 @@ export const useWorkspaceAvailableFeatures = () => { return data?.workspace.availableFeatures ?? emptyFeatures; }; -export const useWorkspaceEnabledFeatures = () => { - const currentWorkspace = useAtomValue(waitForCurrentWorkspaceAtom); +export const useWorkspaceEnabledFeatures = ( + workspaceMetadata: WorkspaceMetadata +) => { const isCloudWorkspace = - currentWorkspace.flavour === WorkspaceFlavour.AFFINE_CLOUD; + workspaceMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD; const { data } = useQueryImmutable( isCloudWorkspace ? { query: enabledFeaturesQuery, variables: { - id: currentWorkspace.id, + id: workspaceMetadata.id, }, } : undefined @@ -48,8 +49,9 @@ export const useWorkspaceEnabledFeatures = () => { return data?.workspace.features ?? emptyFeatures; }; -export const useSetWorkspaceFeature = () => { - const currentWorkspace = useAtomValue(waitForCurrentWorkspaceAtom); +export const useSetWorkspaceFeature = ( + workspaceMetadata: WorkspaceMetadata +) => { const { trigger, isMutating } = useMutation({ mutation: setWorkspaceExperimentalFeatureMutation, }); @@ -59,15 +61,15 @@ export const useSetWorkspaceFeature = () => { trigger: useAsyncCallback( async (feature: FeatureType, enable: boolean) => { await trigger({ - workspaceId: currentWorkspace.id, + workspaceId: workspaceMetadata.id, feature, enable, }); await revalidate(enabledFeaturesQuery, vars => { - return vars.id === currentWorkspace.id; + return vars.id === workspaceMetadata.id; }); }, - [currentWorkspace.id, revalidate, trigger] + [workspaceMetadata.id, revalidate, trigger] ), isMutating, }; diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx index e6f3c1e86..ec52a136a 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx @@ -11,7 +11,6 @@ import { JournalTodayButton } from '@affine/core/components/blocksuite/block-sui import { PageHeaderMenuButton } from '@affine/core/components/blocksuite/block-suite-header/menu'; import { EditorModeSwitch } from '@affine/core/components/blocksuite/block-suite-mode-switch'; import { useJournalInfoHelper } from '@affine/core/hooks/use-journal'; -import type { BlockSuiteWorkspace } from '@affine/core/shared'; import type { Workspace } from '@affine/workspace'; import { RightSidebarIcon } from '@blocksuite/icons'; import type { Page } from '@blocksuite/store'; @@ -189,7 +188,7 @@ export function DetailPageHeader(props: PageHeaderProps) { } interface SidebarHeaderProps { - workspace: BlockSuiteWorkspace; + workspace: Workspace; page: Page; } function WindowsSidebarHeader(props: SidebarHeaderProps) { diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx index 4d56cdbb4..3cab12137 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx @@ -206,7 +206,7 @@ const DetailPageImpl = memo(function DetailPageImpl({ page }: { page: Page }) { sidebar={ !isInTrash ? (
- +
) : null diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx index b3a1b8ed0..2132a0fed 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx @@ -1,8 +1,8 @@ import { IconButton } from '@affine/component'; import { useJournalInfoHelper } from '@affine/core/hooks/use-journal'; import { useWorkspaceEnabledFeatures } from '@affine/core/hooks/use-workspace-features'; -import type { BlockSuiteWorkspace } from '@affine/core/shared'; import { FeatureType } from '@affine/graphql'; +import type { Workspace } from '@affine/workspace/workspace'; import type { Page } from '@blocksuite/store'; import { assignInlineVars } from '@vanilla-extract/dynamic'; import { useAtom, useAtomValue } from 'jotai'; @@ -15,15 +15,15 @@ import { import * as styles from './extensions.css'; export interface ExtensionTabsProps { - workspace: BlockSuiteWorkspace; + workspace: Workspace; page: Page; } // provide a switcher for active extensions // will be used in global top header (MacOS) or sidebar (Windows) -export const ExtensionTabs = ({ page }: ExtensionTabsProps) => { +export const ExtensionTabs = ({ page, workspace }: ExtensionTabsProps) => { // todo: filter in editorExtensionsAtom instead? - const copilotEnabled = useWorkspaceEnabledFeatures().includes( + const copilotEnabled = useWorkspaceEnabledFeatures(workspace.meta).includes( FeatureType.Copilot );