L-Sun
2025-02-28 08:23:26 +00:00
parent f1df774188
commit d476d3b1df
27 changed files with 356 additions and 528 deletions

View File

@@ -18,7 +18,7 @@ export const AppTabs = ({
fixed?: boolean;
}) => {
const virtualKeyboardService = useService(VirtualKeyboardService);
const virtualKeyboardVisible = useLiveData(virtualKeyboardService.show$);
const virtualKeyboardVisible = useLiveData(virtualKeyboardService.visible$);
const tab = (
<SafeArea

View File

@@ -6,8 +6,5 @@ import { VirtualKeyboardService } from './services/virtual-keyboard';
export { VirtualKeyboardProvider, VirtualKeyboardService };
export function configureMobileVirtualKeyboardModule(framework: Framework) {
framework.service(
VirtualKeyboardService,
f => new VirtualKeyboardService(f.getOptional(VirtualKeyboardProvider))
);
framework.service(VirtualKeyboardService, [VirtualKeyboardProvider]);
}

View File

@@ -1,23 +1,28 @@
import { createIdentifier } from '@toeverything/infra';
export type VirtualKeyboardEvent =
| 'keyboardWillShow'
| 'keyboardDidShow'
| 'keyboardWillHide'
| 'keyboardDidHide';
export interface VirtualKeyboardEventInfo {
keyboardHeight: number;
interface VirtualKeyboardInfo {
visible: boolean;
height: number;
}
type VirtualKeyboardEventListener = (info: VirtualKeyboardEventInfo) => void;
export interface VirtualKeyboardProvider {
addEventListener: (
event: VirtualKeyboardEvent,
callback: VirtualKeyboardEventListener
) => void;
removeAllListeners: () => void;
}
type VirtualKeyboardAction = {
/**
* Open the virtual keyboard, the focused element should not be changed
*/
show: () => void;
/**
* Hide the virtual keyboard, the focused element should not be changed
*/
hide: () => void;
};
type VirtualKeyboardEvent = {
onChange: (callback: (info: VirtualKeyboardInfo) => void) => () => void;
};
export type VirtualKeyboardProvider =
| (VirtualKeyboardEvent & VirtualKeyboardAction)
| VirtualKeyboardEvent;
export const VirtualKeyboardProvider =
createIdentifier<VirtualKeyboardProvider>('VirtualKeyboardProvider');

View File

@@ -3,32 +3,23 @@ import { LiveData, Service } from '@toeverything/infra';
import type { VirtualKeyboardProvider } from '../providers/virtual-keyboard';
export class VirtualKeyboardService extends Service {
show$ = new LiveData(false);
height$ = new LiveData(0);
readonly visible$ = new LiveData(false);
readonly height$ = new LiveData(0);
constructor(
private readonly virtualKeyboardProvider?: VirtualKeyboardProvider
private readonly virtualKeyboardProvider: VirtualKeyboardProvider
) {
super();
this._observe();
}
override dispose() {
super.dispose();
this.virtualKeyboardProvider?.removeAllListeners();
}
private _observe() {
this.virtualKeyboardProvider?.addEventListener(
'keyboardWillShow',
({ keyboardHeight }) => {
this.show$.next(true);
this.height$.next(keyboardHeight);
}
this.disposables.push(
this.virtualKeyboardProvider.onChange(info => {
this.visible$.next(info.visible);
this.height$.next(info.height);
})
);
this.virtualKeyboardProvider?.addEventListener('keyboardWillHide', () => {
this.show$.next(false);
this.height$.next(0);
});
}
}

View File

@@ -23,9 +23,6 @@ globalStyle('body', {
globalStyle('body:has(> #app-tabs)', {
paddingBottom: globalVars.appTabSafeArea,
});
globalStyle('body:has(#app-tabs) affine-keyboard-toolbar[data-shrink="true"]', {
paddingBottom: globalVars.appTabSafeArea,
});
globalStyle('body:has(#app-tabs) affine-keyboard-tool-panel', {
paddingBottom: `calc(${globalVars.appTabHeight} + env(safe-area-inset-bottom) + 8px)`,
});