CoreSystem.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import RoutingSystem from './RoutingSystem.js';
  2. import ViewSystem, { View } from './ViewSystem.js';
  3. import ModuleSystem from './ModuleSystem.js';
  4. import Modules from '../../modules';
  5. import EventSystem from './EventSystem';
  6. import * as Font from 'expo-font';
  7. export default class CoreSystem {
  8. constructor(dev = false) {
  9. // TODO -- Make correct Initialization
  10. this.Routing = new RoutingSystem();
  11. this.ModuleSystem = new ModuleSystem();
  12. this.EventSystem = new EventSystem();
  13. this.ViewSystem = new ViewSystem(this);
  14. this.loadFonts()
  15. this.__loadModules(Modules);
  16. this._devMode = dev;
  17. }
  18. onUpdate(fn) {this._onUpdate = fn;}
  19. forceUpdate() {
  20. this._onUpdate && this._onUpdate();
  21. }
  22. loadFonts(){
  23. Font.loadAsync({
  24. 'black': require('../assets/fonts/SFCompactDisplay-Black_0.otf'),
  25. 'bold': require('../assets/fonts/SFCompactDisplay-Bold_0.otf'),
  26. 'heavy': require('../assets/fonts/SFCompactDisplay-Heavy_0.otf'),
  27. 'light': require('../assets/fonts/SFCompactDisplay-Light_0.otf'),
  28. 'medium': require('../assets/fonts/SFCompactDisplay-Medium_0.otf'),
  29. 'regular': require('../assets/fonts/SFCompactDisplay-Regular_0.otf'),
  30. 'semibold': require('../assets/fonts/SFCompactDisplay-Semibold_0.otf'),
  31. 'thin': require('../assets/fonts/SFCompactDisplay-Thin_0.otf'),
  32. 'ultralight': require('../assets/fonts/SFCompactDisplay-Ultralight_0.otf'),
  33. 'roboto-black':require('../assets/fonts/Roboto-Black.ttf'),
  34. 'roboto-black-italic':require('../assets/fonts/Roboto-BlackItalic.ttf'),
  35. 'roboto-bold':require('../assets/fonts/Roboto-Bold.ttf'),
  36. 'roboto-bold-italic':require('../assets/fonts/Roboto-BoldItalic.ttf'),
  37. 'roboto-light':require('../assets/fonts/Roboto-Light.ttf'),
  38. 'roboto-light-italic':require('../assets/fonts/Roboto-LightItalic.ttf'),
  39. 'roboto-medium':require('../assets/fonts/Roboto-Medium.ttf'),
  40. 'roboto-medium-italic':require('../assets/fonts/Roboto-MediumItalic.ttf'),
  41. 'roboto-regular':require('../assets/fonts/Roboto-Regular.ttf'),
  42. 'roboto-regular-italic':require('../assets/fonts/Roboto-RegularItalic.ttf'),
  43. 'roboto-thin':require('../assets/fonts/Roboto-Thin.ttf'),
  44. 'roboto-thin-italic':require('../assets/fonts/Roboto-ThinItalic.ttf')
  45. });
  46. }
  47. getCurrentView() {
  48. return this.ViewSystem.getView(this.Routing.getCurrentView());
  49. }
  50. setHome( route , View ) {
  51. this.Routing.setHome(route);
  52. return this;
  53. }
  54. goto( route ) {
  55. return this.Routing.goTo(route);
  56. }
  57. addPage( route , View, ViewID = Math.random()) {
  58. this.Routing.addRoute(route,route);
  59. this.Routing.setView(route,ViewID);
  60. this.ViewSystem.addView(ViewID, View);
  61. return this;
  62. }
  63. removePage(route) {
  64. this.Routing.removeRoute(route);
  65. return this;
  66. }
  67. goBack() {
  68. }
  69. __loadModules() {
  70. this.ModuleSystem.load(Modules);
  71. }
  72. addModule(mod, namespace) {
  73. this.ModuleSystem.loadModule(mod.name, mod, namespace);
  74. return this;
  75. }
  76. render() {
  77. let ViewID = this.Routing.getCurrentView();
  78. return this.ViewSystem.render(ViewID);
  79. }
  80. import(data) {
  81. // Perform dependency injection here!
  82. // must Convert Data to Structures before importing
  83. // Import Systems Seperately from leaf to root
  84. let {
  85. Routing,
  86. Views
  87. } = data;
  88. try {
  89. this.Routing.import(Routing);
  90. this.ViewSystem.import(Views);
  91. } catch(e) {
  92. throw new Error("CoreSystem cannot import data : ", e);
  93. }
  94. console.log("Successful import");
  95. }
  96. export() {
  97. let RS = this.Routing.export();
  98. let VS = this.ViewSystem.export();
  99. return {
  100. Routing: RS,
  101. Views: VS
  102. };
  103. }
  104. ray(data) {
  105. let {
  106. event
  107. } = data;
  108. let targets = event.path.map(item => findReactElement(item));
  109. let resViewNode = null;
  110. for (var i in targets) {
  111. if(targets[i] && targets[i].ID) {
  112. resViewNode = targets[i].ID;
  113. break;
  114. }
  115. }
  116. let ViewID = this.Routing.getCurrentView();
  117. return this.ViewSystem.getNode(ViewID, resViewNode);
  118. }
  119. }
  120. const findReactElement = (node) => {
  121. for (var key in node) {
  122. if (key.startsWith("__reactInternalInstance$")) {
  123. return (node[key]._debugOwner && node[key]._debugOwner.stateNode.props) || (node[key].return.memoizedProps);
  124. }
  125. }
  126. return null;
  127. };