|
| 1 | +import { Component, AfterViewInit, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core'; |
| 2 | + |
| 3 | +// Declare the global _flutter namespace |
| 4 | +declare var _flutter: any; |
| 5 | + |
| 6 | +@Component({ |
| 7 | + selector: 'app-wellness', |
| 8 | + standalone: true, |
| 9 | + templateUrl: './wellness.component.html', |
| 10 | + styles: [` |
| 11 | + :host div { |
| 12 | + width: 100%; |
| 13 | + height: 600px; |
| 14 | + position: relative; |
| 15 | + } |
| 16 | + .spinner { |
| 17 | + position: absolute; |
| 18 | + top: 50%; |
| 19 | + left: 50%; |
| 20 | + transform: translate(-50%, -50%); |
| 21 | + } |
| 22 | + `], |
| 23 | +}) |
| 24 | +export class WellnessComponent implements AfterViewInit { |
| 25 | + @ViewChild('flutterTarget', { static: true }) flutterTarget!: ElementRef; |
| 26 | + |
| 27 | + @Output() appLoaded: EventEmitter<Object> = new EventEmitter<Object>(); |
| 28 | + |
| 29 | + private src: string = 'assets/flutter/main.dart.js'; // Adjust path as needed |
| 30 | + private assetBase: string = 'assets/flutter/'; // Adjust path as needed |
| 31 | + |
| 32 | + // Hardcoded initial data |
| 33 | + private initialData: any = { |
| 34 | + accessToken: 'eyJraWQiOiJuSmNFMDFrVkFjMG1RMzBDSTVJMnRPUUorTmExbVRqc3FmWE1WSW9QdU9rPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIxOTRiMmQzYS04ZDdlLTQzMzgtOTEwMS0zYjY0MmVjNDZkMTMiLCJldmVudF9pZCI6ImY1NzY1MmZjLTdlZDYtNDEzYy05MTk1LTdiZDU3YzY3NjI3YSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE3MzEzOTk5NzgsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5jYS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbVwvY2EtY2VudHJhbC0xX2Z5dm9Bb25LTiIsImV4cCI6MTczMTQ4NjQwMiwiaWF0IjoxNzMxNDAwMDAyLCJqdGkiOiIzNjE1NjE5NS0yMzVhLTRhYzktOWQ3OC1iZGFiYTAyYzA1MDYiLCJjbGllbnRfaWQiOiIyb29vNDkzZHBuNWNzN3J1aW80bG1wNDcyaSIsInVzZXJuYW1lIjoiMTk0YjJkM2EtOGQ3ZS00MzM4LTkxMDEtM2I2NDJlYzQ2ZDEzIn0.paUzWsHh87ThaKeadtDy4yL_Q8k84S5IOngbZf6zuh-3Ez4Pknt-ThhUWoL9Lhy7VhUnlNUSk31_bGMp4JRFKzbqQEooxYFanRMJesNqsruBk0G1N-Kia-cG6LQDs2lXx39D6aOSiJ9_bzzOqS0Phj5uiyU8LayIpgpjdAL0CnlS2CikjM6OFhGkY_0RgU-x1-jRniqy3Zk3Gii1W3DRWEDfPovxNqVnjPrL6kQpGuQBMfr6E_xupNFAfdgw6PtgEm_RYO61N8WBaZqK3XNXT36YlJQvgn5-vWhvdqD5keTCj7FYXdElcpjP6zB1uI4zQD41Sc8H0TlA7rmx261wjQ', |
| 35 | + identityToken: 'eyJraWQiOiJIOUIxcUw2aDFwbjJnQjVoNWF3amV1a0ZOOURZMHdHYXhZaVB5Uk80bGg0PSIsImFsZyI6IlJTMjU2In0.eyJpY2FuX2VuYWJsZWQiOiJmYWxzZSIsInN1YiI6IjE5NGIyZDNhLThkN2UtNDMzOC05MTAxLTNiNjQyZWM0NmQxMyIsInVzZXJfY2xhaW1zIjoiW3tcInN5c3RlbVwiOlwiYWxheWFjYXJlXCIsXCJhdXRob3JpemVkSWRzXCI6W1wiNDYxNlwiLFwiNDY5NlwiXX1dIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImNpdHVzIjoie30iLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuY2EtY2VudHJhbC0xLmFtYXpvbmF3cy5jb21cL2NhLWNlbnRyYWwtMV9meXZvQW9uS04iLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOnRydWUsImNvZ25pdG86dXNlcm5hbWUiOiIxOTRiMmQzYS04ZDdlLTQzMzgtOTEwMS0zYjY0MmVjNDZkMTMiLCJ1c2VyX2NsYWltc192MiI6Ilt7XCJwc0lkXCI6XCI4OTcxNjYwMDA0XCIsXCJzeXN0ZW1UeXBlXCI6XCJob21lQ2FyZVwiLFwiYXV0aG9yaXplZFN5c3RlbXNcIjpbe1wiaWRcIjpcIjQ2MTZcIixcIm5hbWVcIjpcImFsYXlhY2FyZVwiLFwidXNlclR5cGVcIjpcImNsaWVudFwiLFwidGVuYW50c1wiOltcIkRlZmF1bHRcIl19XX0se1wicHNJZFwiOlwiODk3MTY2MDAxNFwiLFwic3lzdGVtVHlwZVwiOlwiaG9tZUNhcmVcIixcImF1dGhvcml6ZWRTeXN0ZW1zXCI6W3tcImlkXCI6XCI0Njk2XCIsXCJuYW1lXCI6XCJhbGF5YWNhcmVcIixcInVzZXJUeXBlXCI6XCJjbGllbnRcIixcInRlbmFudHNcIjpbXCJEZWZhdWx0XCJdfV19XSIsImN1c3RvbTphY2NlcHRlZF9kaWdpX3Rlcm1zIjoiMSIsImdpdmVuX25hbWUiOiJtYWRkeSIsImN1c3RvbTphY2NlcHRlZF90ZXJtcyI6IjEiLCJhdWQiOiIyb29vNDkzZHBuNWNzN3J1aW80bG1wNDcyaSIsImV2ZW50X2lkIjoiZjU3NjUyZmMtN2VkNi00MTNjLTkxOTUtN2JkNTdjNjc2MjdhIiwidG9rZW5fdXNlIjoiaWQiLCJhdXRoX3RpbWUiOjE3MzEzOTk5NzgsInBob25lX251bWJlciI6IisxNTE5NzIyMzQxNiIsImN1c3RvbTpsYXN0X2xvZ2luIjoiMTczMTQwMDAwMSIsImV4cCI6MTczMTQ4NjQwMiwiaWF0IjoxNzMxNDAwMDAyLCJmYW1pbHlfbmFtZSI6ImdyZWVuIiwiY3VzdG9tOnByZWZlcnJlZF9sYW5ndWFnZSI6ImVuIiwiZW1haWwiOiJncmVlbjIxQG1haWxpbmF0b3IuY29tIn0.qP7bD3L_N4saU2NneVlkRS6xFoUYHB_KEBawBE0VKEXMThyDl4vBt0411EP_nJmYJ-q-Ndrx54eY6FppUaiARUZhnp8qe_aR96OwYPzo5uyx2ultkkp0Esj4PYBEyGQAnLG5VfuSxHTEmjbifZe_96-6_Pf1yu8pJVv-HYCm3gg2t2iNG9xGhFSXyjnJLW2fPbQnnhtagxUxzBDYMGPgljNculbeidRIrT1-RWI33qznlJ8PN6jK3rAZ9dlswbgQ4cSqltHfDK0e2oUW6gqrUampvN_wLHiYLe8n8csclvJw3gIsvgK3M8WXGbpuwZzueTqRCysznBHyO7Zciwz4Ng', |
| 36 | + systemId: '8971660004', |
| 37 | + env: 'dev', |
| 38 | + }; |
| 39 | + |
| 40 | + ngAfterViewInit(): void { |
| 41 | + const target: HTMLElement = this.flutterTarget.nativeElement; |
| 42 | + console.log('Initializing Flutter app in target:', target); |
| 43 | + |
| 44 | + // Define the initial data in a global JS variable |
| 45 | + window.flutterInitialData = JSON.stringify(this.initialData); |
| 46 | + |
| 47 | + // Dynamically load flutter.js if not already loaded |
| 48 | + if (typeof _flutter === 'undefined') { |
| 49 | + console.log('flutter.js not loaded. Loading...'); |
| 50 | + const script = document.createElement('script'); |
| 51 | + script.src = `${this.assetBase}flutter.js`; |
| 52 | + script.defer = true; |
| 53 | + script.onload = () => this.initializeFlutterApp(target); |
| 54 | + script.onerror = () => console.error('Failed to load flutter.js.'); |
| 55 | + document.body.appendChild(script); |
| 56 | + } else { |
| 57 | + console.log('flutter.js already loaded.'); |
| 58 | + this.initializeFlutterApp(target); |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | + private initializeFlutterApp(target: HTMLElement) { |
| 63 | + console.log('Loading Flutter entrypoint:', this.src); |
| 64 | + |
| 65 | + _flutter.loader.loadEntrypoint({ |
| 66 | + entrypointUrl: this.src, |
| 67 | + onEntrypointLoaded: async (engineInitializer: any) => { |
| 68 | + console.log('Entrypoint loaded. Initializing engine...'); |
| 69 | + let appRunner = await engineInitializer.initializeEngine({ |
| 70 | + hostElement: target, |
| 71 | + assetBase: this.assetBase, |
| 72 | + // multiViewEnabled: true, // Uncomment if using multi-view |
| 73 | + }); |
| 74 | + console.log('Engine initialized. Running app...'); |
| 75 | + await appRunner.runApp(); |
| 76 | + } |
| 77 | + }); |
| 78 | + |
| 79 | + target.addEventListener("flutter-initialized", (event: Event) => { |
| 80 | + let state = (event as CustomEvent).detail; |
| 81 | + window._debug = state; |
| 82 | + console.log('Flutter app has loaded:', state); |
| 83 | + this.appLoaded.emit(state); |
| 84 | + }, { |
| 85 | + once: true, |
| 86 | + }); |
| 87 | + } |
| 88 | + |
| 89 | + ngOnDestroy(): void { |
| 90 | + //window.removeEventListener('flutter-button-pressed', this.flutterButtonPressedHandler); |
| 91 | + if (_flutter && _flutter.engine) { |
| 92 | + _flutter.engine.destroy(); |
| 93 | + } |
| 94 | + } |
| 95 | +} |
0 commit comments