Skip to content

Commit ced25fb

Browse files
committed
feat(core): workspace indexing settings
1 parent f4534d3 commit ced25fb

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Entity, LiveData } from '@toeverything/infra';
2+
import type { IndexerStore } from '../stores/indexer';
3+
import type { WorkspaceService } from '@affine/core/modules/workspace';
4+
5+
export interface IndexerConfig {
6+
type: 'local' | 'cloud';
7+
lastIndexedAt?: Date;
8+
status: 'idle' | 'indexing' | 'error';
9+
error?: string;
10+
}
11+
12+
export class Indexer extends Entity {
13+
status$ = new LiveData<number>(this.store.status);
14+
15+
constructor(
16+
private readonly workspaceService: WorkspaceService,
17+
private readonly store: IndexerStore,
18+
) {
19+
super();
20+
}
21+
22+
async startIndexing() {
23+
await this.store.startIndexing();
24+
}
25+
26+
override dispose(): void {
27+
super.dispose();
28+
}
29+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { Service } from '@toeverything/infra';
2+
import { Indexer } from '../entities/indexer';
3+
4+
export class IndexerService extends Service {
5+
indexer = this.framework.createEntity(Indexer);
6+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Store, LiveData } from '@toeverything/infra';
2+
import type { WorkspaceServerService } from '@affine/core/modules/cloud';
3+
4+
export class IndexerStore extends Store {
5+
private readonly _status$ = new LiveData<number>(0);
6+
7+
constructor(private readonly workspaceServerService: WorkspaceServerService) {
8+
super();
9+
}
10+
11+
get status() {
12+
return this._status$.value;
13+
}
14+
15+
startIndexing() {
16+
if (!this.workspaceServerService.server) {
17+
throw new Error('[IndexerStore]No Server');
18+
}
19+
20+
this.workspaceServerService.server.gql({});
21+
}
22+
}

packages/frontend/core/src/modules/workspace-indexer-embedding/view/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useI18n } from '@affine/i18n';
33
import type React from 'react';
44

55
import { EmbeddingSettings } from './embedding-settings';
6+
import { IndexerSettings } from './indexer-settings';
67

78
export const IndexerEmbeddingSettings: React.FC = () => {
89
const t = useI18n();
@@ -17,6 +18,7 @@ export const IndexerEmbeddingSettings: React.FC = () => {
1718
/>
1819

1920
<EmbeddingSettings />
21+
<IndexerSettings />
2022
</>
2123
);
2224
};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import React, { useState } from 'react';
2+
import { Button, Progress } from '@affine/component';
3+
import {
4+
SettingRow,
5+
SettingWrapper,
6+
} from '@affine/component/setting-components';
7+
import { useI18n } from '@affine/i18n';
8+
9+
interface IndexerSettingsProps {}
10+
11+
export const IndexerSettings: React.FC<IndexerSettingsProps> = ({}) => {
12+
const t = useI18n();
13+
const [indexingProgress, setIndexingProgress] = useState(0);
14+
const [isIndexing, setIsIndexing] = useState(false);
15+
16+
const handleReindexClick = React.useCallback(() => {
17+
setIsIndexing(true);
18+
setIndexingProgress(0);
19+
20+
// Simulated progress for demo
21+
const interval = setInterval(() => {
22+
setIndexingProgress(prev => {
23+
if (prev >= 100) {
24+
clearInterval(interval);
25+
setIsIndexing(false);
26+
return 100;
27+
}
28+
return prev + 10;
29+
});
30+
}, 1000);
31+
}, []);
32+
33+
return (
34+
<SettingWrapper title={t['Indexer']()}>
35+
<SettingRow
36+
name=""
37+
desc={t[
38+
'The indexer can choose from cloud and local sources. If the indexer is local, it may consume more memory.'
39+
]()}
40+
></SettingRow>
41+
42+
<SettingRow
43+
name={t['Indexing Progress']()}
44+
data-testid="indexer-indexing-progress-setting-row"
45+
style={{ marginBottom: 10 }}
46+
>
47+
<Button onClick={handleReindexClick} disabled={isIndexing}>
48+
{isIndexing ? t['Indexing...']() : t['Resync Indexing']()}
49+
</Button>
50+
</SettingRow>
51+
52+
<Progress
53+
readonly
54+
value={indexingProgress}
55+
style={{ width: '100%', height: '20px' }}
56+
/>
57+
</SettingWrapper>
58+
);
59+
};

0 commit comments

Comments
 (0)