mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-18 10:36:22 +08:00
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
import type { Workspace, WorkspaceStatus } from '@affine/workspace';
|
|
import { useEffect, useState } from 'react';
|
|
|
|
export function useWorkspaceStatus<
|
|
Selector extends ((status: WorkspaceStatus) => any) | undefined | null,
|
|
Status = Selector extends (status: WorkspaceStatus) => any
|
|
? ReturnType<Selector>
|
|
: WorkspaceStatus,
|
|
>(workspace?: Workspace | null, selector?: Selector): Status | null {
|
|
// avoid re-render when selector is changed
|
|
const [cachedSelector] = useState(() => selector);
|
|
|
|
const [status, setStatus] = useState<Status | null>(() => {
|
|
if (!workspace) {
|
|
return null;
|
|
}
|
|
return cachedSelector ? cachedSelector(workspace.status) : workspace.status;
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (!workspace) {
|
|
setStatus(null);
|
|
return;
|
|
}
|
|
setStatus(
|
|
cachedSelector ? cachedSelector(workspace.status) : workspace.status
|
|
);
|
|
return workspace.onStatusChange.on(status =>
|
|
setStatus(cachedSelector ? cachedSelector(status) : status)
|
|
).dispose;
|
|
}, [cachedSelector, workspace]);
|
|
|
|
return status;
|
|
}
|