feat(ios): add intelligents button (#9281)

Co-authored-by: 砍砍 <git@qaq.wiki>
This commit is contained in:
EYHN
2024-12-24 15:51:11 +08:00
committed by GitHub
parent fbe3e08769
commit 3cf4bcf651
78 changed files with 3283 additions and 114 deletions

View File

@@ -0,0 +1,13 @@
export { AIButtonProvider } from './provider/ai-button';
export { AIButtonService } from './services/ai-button';
import type { Framework } from '@toeverything/infra';
import { AIButtonProvider } from './provider/ai-button';
import { AIButtonService } from './services/ai-button';
export const configureAIButtonModule = (framework: Framework) => {
framework.service(AIButtonService, container => {
return new AIButtonService(container.getOptional(AIButtonProvider));
});
};

View File

@@ -0,0 +1,9 @@
import { createIdentifier } from '@toeverything/infra';
export interface AIButtonProvider {
presentAIButton: () => Promise<void>;
dismissAIButton: () => Promise<void>;
}
export const AIButtonProvider =
createIdentifier<AIButtonProvider>('AIButtonProvider');

View File

@@ -0,0 +1,48 @@
import { DebugLogger } from '@affine/debug';
import {
effect,
exhaustMapWithTrailing,
fromPromise,
Service,
} from '@toeverything/infra';
import {
catchError,
distinctUntilChanged,
EMPTY,
mergeMap,
throttleTime,
} from 'rxjs';
import type { AIButtonProvider } from '../provider/ai-button';
const logger = new DebugLogger('AIButtonService');
export class AIButtonService extends Service {
constructor(private readonly aiButtonProvider?: AIButtonProvider) {
super();
}
presentAIButton = effect(
distinctUntilChanged(),
throttleTime<boolean>(1000), // throttle time to avoid frequent calls
exhaustMapWithTrailing((present: boolean) => {
return fromPromise(async () => {
if (!this.aiButtonProvider) {
return;
}
if (present) {
await this.aiButtonProvider.presentAIButton();
} else {
await this.aiButtonProvider.dismissAIButton();
}
return;
}).pipe(
mergeMap(() => EMPTY),
catchError(err => {
logger.error('presentAIButton error', err);
return EMPTY;
})
);
})
);
}