3
0

CoreSystem.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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() {
  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. }
  17. loadFonts(){
  18. Font.loadAsync({
  19. 'black': require('../assets/fonts/SFCompactDisplay-Black_0.otf'),
  20. 'bold': require('../assets/fonts/SFCompactDisplay-Bold_0.otf'),
  21. 'heavy': require('../assets/fonts/SFCompactDisplay-Heavy_0.otf'),
  22. 'light': require('../assets/fonts/SFCompactDisplay-Light_0.otf'),
  23. 'medium': require('../assets/fonts/SFCompactDisplay-Medium_0.otf'),
  24. 'regular': require('../assets/fonts/SFCompactDisplay-Regular_0.otf'),
  25. 'semibold': require('../assets/fonts/SFCompactDisplay-Semibold_0.otf'),
  26. 'thin': require('../assets/fonts/SFCompactDisplay-Thin_0.otf'),
  27. 'ultralight': require('../assets/fonts/SFCompactDisplay-Ultralight_0.otf')
  28. });
  29. }
  30. getCurrentView() {
  31. return this.ViewSystem.getView(this.Routing.getCurrentView());
  32. }
  33. setHome( route , View ) {
  34. this.Routing.setHome(route);
  35. return this;
  36. }
  37. goto( route ) {
  38. return this.Routing.goTo(route);
  39. }
  40. addPage( route , View, ViewID = Math.random()) {
  41. this.Routing.addRoute(route,route);
  42. this.Routing.setView(route,ViewID);
  43. this.ViewSystem.addView(ViewID, View);
  44. return this;
  45. }
  46. goBack() {
  47. }
  48. __loadModules() {
  49. this.ModuleSystem.load(Modules);
  50. }
  51. addModule(mod, namespace) {
  52. this.ModuleSystem.loadModule(mod.name, mod, namespace);
  53. return this;
  54. }
  55. render() {
  56. let ViewID = this.Routing.getCurrentView();
  57. return this.ViewSystem.render(ViewID);
  58. }
  59. import(data) {
  60. // Perform dependency injection here!
  61. // must Convert Data to Structures before importing
  62. // Import Systems Seperately from leaf to root
  63. let {
  64. Routing,
  65. Views
  66. } = data;
  67. try {
  68. this.Routing.import(Routing);
  69. this.ViewSystem.import(Views);
  70. } catch(e) {
  71. throw new Error("CoreSystem cannot import data : ", e);
  72. }
  73. console.log("Successful import");
  74. }
  75. export() {
  76. let RS = this.Routing.export();
  77. let VS = this.ViewSystem.export();
  78. return {
  79. Routing: RS,
  80. Views: VS
  81. };
  82. }
  83. ray(data) {
  84. let {
  85. event
  86. } = data;
  87. let targets = event.path.map(item => findReactElement(item));
  88. let resViewNode = null;
  89. for (var i in targets) {
  90. if(targets[i] && targets[i].ID) {
  91. resViewNode = targets[i].ID;
  92. break;
  93. }
  94. }
  95. let ViewID = this.Routing.getCurrentView();
  96. return this.ViewSystem.getNode(ViewID, resViewNode);
  97. }
  98. }
  99. const findReactElement = (node) => {
  100. for (var key in node) {
  101. if (key.startsWith("__reactInternalInstance$")) {
  102. return (node[key]._debugOwner && node[key]._debugOwner.stateNode.props) || (node[key].return.memoizedProps);
  103. }
  104. }
  105. return null;
  106. };