mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-15 17:42:15 +08:00
feat(platform): add ability to override platform detection methods (#23915)
resolves #19737
This commit is contained in:
@ -45,7 +45,7 @@ export * from './types/ionic-lifecycle-hooks';
|
|||||||
export { IonicModule } from './ionic-module';
|
export { IonicModule } from './ionic-module';
|
||||||
|
|
||||||
// UTILS
|
// UTILS
|
||||||
export { IonicSafeString, getPlatforms, isPlatform, createAnimation, IonicSwiper } from '@ionic/core';
|
export { PlatformConfig, IonicSafeString, getPlatforms, isPlatform, createAnimation, IonicSwiper } from '@ionic/core';
|
||||||
|
|
||||||
// CORE TYPES
|
// CORE TYPES
|
||||||
export {
|
export {
|
||||||
|
@ -21,9 +21,6 @@ export const initialize = (userConfig: IonicConfig = {}) => {
|
|||||||
Context.config = config;
|
Context.config = config;
|
||||||
const Ionic = (win as any).Ionic = (win as any).Ionic || {};
|
const Ionic = (win as any).Ionic = (win as any).Ionic || {};
|
||||||
|
|
||||||
// Setup platforms
|
|
||||||
setupPlatforms(win);
|
|
||||||
|
|
||||||
const platformHelpers: any = {};
|
const platformHelpers: any = {};
|
||||||
if (userConfig._ael) {
|
if (userConfig._ael) {
|
||||||
platformHelpers.ael = userConfig._ael;
|
platformHelpers.ael = userConfig._ael;
|
||||||
@ -51,6 +48,9 @@ export const initialize = (userConfig: IonicConfig = {}) => {
|
|||||||
saveConfig(win, configObj);
|
saveConfig(win, configObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup platforms
|
||||||
|
setupPlatforms(win);
|
||||||
|
|
||||||
// first see if the mode was set as an attribute on <html>
|
// first see if the mode was set as an attribute on <html>
|
||||||
// which could have been set by the user, or by pre-rendering
|
// which could have been set by the user, or by pre-rendering
|
||||||
// otherwise get the mode via config settings, and fallback to md
|
// otherwise get the mode via config settings, and fallback to md
|
||||||
|
@ -7,7 +7,7 @@ export { getTimeGivenProgression } from './utils/animation/cubic-bezier';
|
|||||||
export { createGesture } from './utils/gesture';
|
export { createGesture } from './utils/gesture';
|
||||||
export { initialize } from './global/ionic-global';
|
export { initialize } from './global/ionic-global';
|
||||||
export { componentOnReady } from './utils/helpers';
|
export { componentOnReady } from './utils/helpers';
|
||||||
export { isPlatform, Platforms, getPlatforms } from './utils/platform';
|
export { isPlatform, Platforms, PlatformConfig, getPlatforms } from './utils/platform';
|
||||||
export { IonicSafeString } from './utils/sanitization';
|
export { IonicSafeString } from './utils/sanitization';
|
||||||
export { IonicConfig, getMode, setupConfig } from './utils/config';
|
export { IonicConfig, getMode, setupConfig } from './utils/config';
|
||||||
export { LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_UNLOAD } from './components/nav/constants';
|
export { LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_UNLOAD } from './components/nav/constants';
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import { AnimationBuilder, Mode, SpinnerTypes, TabButtonLayout } from '../interface';
|
import { AnimationBuilder, Mode, SpinnerTypes, TabButtonLayout } from '../interface';
|
||||||
|
|
||||||
|
import { PlatformConfig } from './platform';
|
||||||
|
|
||||||
export interface IonicConfig {
|
export interface IonicConfig {
|
||||||
/**
|
/**
|
||||||
* When it's set to `false`, disables all animation and transition across the app.
|
* When it's set to `false`, disables all animation and transition across the app.
|
||||||
@ -175,6 +177,11 @@ export interface IonicConfig {
|
|||||||
*/
|
*/
|
||||||
sanitizerEnabled?: boolean;
|
sanitizerEnabled?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides the default platform detection methods.
|
||||||
|
*/
|
||||||
|
platform?: PlatformConfig;
|
||||||
|
|
||||||
// PRIVATE configs
|
// PRIVATE configs
|
||||||
keyboardHeight?: number;
|
keyboardHeight?: number;
|
||||||
inputShims?: boolean;
|
inputShims?: boolean;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { config } from '../global/config';
|
||||||
|
|
||||||
export type Platforms = keyof typeof PLATFORMS_MAP;
|
export type Platforms = keyof typeof PLATFORMS_MAP;
|
||||||
|
|
||||||
@ -29,8 +30,13 @@ export const setupPlatforms = (win: any = window) => {
|
|||||||
return platforms;
|
return platforms;
|
||||||
};
|
};
|
||||||
|
|
||||||
const detectPlatforms = (win: Window) =>
|
const detectPlatforms = (win: Window) => {
|
||||||
(Object.keys(PLATFORMS_MAP) as Platforms[]).filter(p => PLATFORMS_MAP[p](win));
|
const customPlatformMethods = config.get('platform');
|
||||||
|
return (Object.keys(PLATFORMS_MAP) as Platforms[]).filter(p => {
|
||||||
|
const customMethod = customPlatformMethods && customPlatformMethods[p];
|
||||||
|
return typeof customMethod === 'function' ? customMethod(win) : PLATFORMS_MAP[p](win);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const isMobileWeb = (win: Window): boolean =>
|
const isMobileWeb = (win: Window): boolean =>
|
||||||
isMobile(win) && !isHybrid(win);
|
isMobile(win) && !isHybrid(win);
|
||||||
@ -117,6 +123,8 @@ export const testUserAgent = (win: Window, expr: RegExp) =>
|
|||||||
const matchMedia = (win: Window, query: string): boolean =>
|
const matchMedia = (win: Window, query: string): boolean =>
|
||||||
win.matchMedia && win.matchMedia(query).matches;
|
win.matchMedia && win.matchMedia(query).matches;
|
||||||
|
|
||||||
|
export type PlatformConfig = Partial<typeof PLATFORMS_MAP>;
|
||||||
|
|
||||||
const PLATFORMS_MAP = {
|
const PLATFORMS_MAP = {
|
||||||
'ipad': isIpad,
|
'ipad': isIpad,
|
||||||
'iphone': isIphone,
|
'iphone': isIphone,
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import initialize from '../../global/ionic-global';
|
||||||
|
|
||||||
import { testUserAgent, getPlatforms, isPlatform } from '../platform';
|
import { testUserAgent, getPlatforms, isPlatform } from '../platform';
|
||||||
import { PlatformConfiguration, configureBrowser } from './platform.utils';
|
import { PlatformConfiguration, configureBrowser } from './platform.utils';
|
||||||
|
|
||||||
@ -132,4 +134,21 @@ describe('Platform Tests', () => {
|
|||||||
expect(isPlatform(win, 'android')).toEqual(false);
|
expect(isPlatform(win, 'android')).toEqual(false);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('Custom Platform Config', () => {
|
||||||
|
it('should use custom platform detection methods', () => {
|
||||||
|
const win = configureBrowser(PlatformConfiguration.DesktopSafari);
|
||||||
|
|
||||||
|
initialize({
|
||||||
|
'platform': {
|
||||||
|
'desktop': (win) => false,
|
||||||
|
'cordova': (win) => true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(isPlatform(win, 'desktop')).toEqual(false);
|
||||||
|
expect(isPlatform(win, 'cordova')).toEqual(true);
|
||||||
|
expect(getPlatforms(win).includes('cordova')).toEqual(true);
|
||||||
|
});
|
||||||
|
})
|
||||||
});
|
});
|
@ -36,6 +36,7 @@ export {
|
|||||||
setupConfig,
|
setupConfig,
|
||||||
initialize,
|
initialize,
|
||||||
IonicSwiper,
|
IonicSwiper,
|
||||||
|
PlatformConfig,
|
||||||
|
|
||||||
SpinnerTypes,
|
SpinnerTypes,
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ export {
|
|||||||
IonicSafeString,
|
IonicSafeString,
|
||||||
|
|
||||||
// Platform
|
// Platform
|
||||||
isPlatform, Platforms, getPlatforms,
|
isPlatform, Platforms, PlatformConfig, getPlatforms,
|
||||||
|
|
||||||
// Gesture
|
// Gesture
|
||||||
Gesture,
|
Gesture,
|
||||||
|
Reference in New Issue
Block a user