Ei kuvausta

WebViewShared.ts 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import escapeStringRegexp from 'escape-string-regexp';
  2. import { Linking, UIManager as NotTypedUIManager } from 'react-native';
  3. import {
  4. WebViewNavigationEvent,
  5. OnShouldStartLoadWithRequest,
  6. CustomUIManager,
  7. } from './WebViewTypes';
  8. const UIManager = NotTypedUIManager as CustomUIManager;
  9. const defaultOriginWhitelist = ['http://*', 'https://*'];
  10. const extractOrigin = (url: string): string => {
  11. const result = /^[A-Za-z][A-Za-z0-9+\-.]+:(\/\/)?[^/]*/.exec(url);
  12. return result === null ? '' : result[0];
  13. };
  14. const originWhitelistToRegex = (originWhitelist: string): string =>
  15. `^${escapeStringRegexp(originWhitelist).replace(/\\\*/g, '.*')}`;
  16. const passesWhitelist = (
  17. compiledWhitelist: ReadonlyArray<string>,
  18. url: string,
  19. ) => {
  20. const origin = extractOrigin(url);
  21. return compiledWhitelist.some(x => new RegExp(x).test(origin));
  22. };
  23. const compileWhitelist = (
  24. originWhitelist: ReadonlyArray<string>,
  25. ): ReadonlyArray<string> =>
  26. ['about:blank', ...(originWhitelist || [])].map(originWhitelistToRegex);
  27. const createOnShouldStartLoadWithRequest = (
  28. loadRequest: (
  29. shouldStart: boolean,
  30. url: string,
  31. lockIdentifier: number,
  32. ) => void,
  33. originWhitelist: ReadonlyArray<string>,
  34. onShouldStartLoadWithRequest?: OnShouldStartLoadWithRequest,
  35. ) => {
  36. return ({ nativeEvent }: WebViewNavigationEvent) => {
  37. let shouldStart = true;
  38. const { url, lockIdentifier } = nativeEvent;
  39. if (!passesWhitelist(compileWhitelist(originWhitelist), url)) {
  40. Linking.openURL(url);
  41. shouldStart = false;
  42. }
  43. if (onShouldStartLoadWithRequest) {
  44. shouldStart = onShouldStartLoadWithRequest(nativeEvent);
  45. }
  46. loadRequest(shouldStart, url, lockIdentifier);
  47. };
  48. };
  49. const getViewManagerConfig = (
  50. viewManagerName: 'RNCUIWebView' | 'RNCWKWebView' | 'RNCWebView',
  51. ) => {
  52. if (!UIManager.getViewManagerConfig) {
  53. return UIManager[viewManagerName];
  54. }
  55. return UIManager.getViewManagerConfig(viewManagerName);
  56. };
  57. export {
  58. defaultOriginWhitelist,
  59. createOnShouldStartLoadWithRequest,
  60. getViewManagerConfig,
  61. };