mirror of
				https://github.com/NativeScript/NativeScript.git
				synced 2025-11-04 04:18:52 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { EventData, EventDataValue } from '../data/observable';
 | 
						|
import type { View } from '../ui/core/view';
 | 
						|
import type { Page } from '../ui/page';
 | 
						|
 | 
						|
const lastFocusedViewOnPageKeyName = '__lastFocusedViewOnPage';
 | 
						|
 | 
						|
export const accessibilityBlurEvent = 'accessibilityBlur';
 | 
						|
export const accessibilityFocusEvent = 'accessibilityFocus';
 | 
						|
export const accessibilityFocusChangedEvent = 'accessibilityFocusChanged';
 | 
						|
export const accessibilityPerformEscapeEvent = 'accessibilityPerformEscape';
 | 
						|
 | 
						|
/**
 | 
						|
 * Send notification when accessibility focus state changes.
 | 
						|
 * If either receivedFocus or lostFocus is true, 'accessibilityFocusChanged' is send with value true if element received focus
 | 
						|
 * If receivedFocus, 'accessibilityFocus' is send
 | 
						|
 * if lostFocus, 'accessibilityBlur' is send
 | 
						|
 *
 | 
						|
 * @param {View} view
 | 
						|
 * @param {boolean} receivedFocus
 | 
						|
 * @param {boolean} lostFocus
 | 
						|
 */
 | 
						|
export function notifyAccessibilityFocusState(view: View, receivedFocus: boolean, lostFocus: boolean): void {
 | 
						|
	if (!receivedFocus && !lostFocus) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	view.notify({
 | 
						|
		eventName: accessibilityFocusChangedEvent,
 | 
						|
		object: view,
 | 
						|
		value: !!receivedFocus,
 | 
						|
	} as EventDataValue);
 | 
						|
 | 
						|
	if (receivedFocus) {
 | 
						|
		if (view.page) {
 | 
						|
			view.page[lastFocusedViewOnPageKeyName] = new WeakRef(view);
 | 
						|
		}
 | 
						|
 | 
						|
		view.notify({
 | 
						|
			eventName: accessibilityFocusEvent,
 | 
						|
			object: view,
 | 
						|
		} as EventData);
 | 
						|
	} else if (lostFocus) {
 | 
						|
		view.notify({
 | 
						|
			eventName: accessibilityBlurEvent,
 | 
						|
			object: view,
 | 
						|
		} as EventData);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
export function getLastFocusedViewOnPage(page: Page): View | null {
 | 
						|
	try {
 | 
						|
		const lastFocusedViewRef = page[lastFocusedViewOnPageKeyName] as WeakRef<View>;
 | 
						|
		if (!lastFocusedViewRef) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		const lastFocusedView = lastFocusedViewRef.deref();
 | 
						|
		if (!lastFocusedView) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		if (!lastFocusedView.parent || lastFocusedView.page !== page) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		return lastFocusedView;
 | 
						|
	} catch {
 | 
						|
		// ignore
 | 
						|
	} finally {
 | 
						|
		delete page[lastFocusedViewOnPageKeyName];
 | 
						|
	}
 | 
						|
 | 
						|
	return null;
 | 
						|
}
 |