// @flow import * as React from 'react'; import ThemeManager from "../../managers/ThemeManager"; import WebViewScreen from "../../components/Screens/WebViewScreen"; import {Avatar, Banner} from "react-native-paper"; import i18n from "i18n-js"; import {View} from "react-native"; import AsyncStorageManager from "../../managers/AsyncStorageManager"; import AlertDialog from "../../components/Dialog/AlertDialog"; import {withCollapsible} from "../../utils/withCollapsible"; import {dateToString, getTimeOnlyString} from "../../utils/Planning"; import DateManager from "../../managers/DateManager"; type Props = { navigation: Object, collapsibleStack: Object, } type State = { bannerVisible: boolean, dialogVisible: boolean, dialogTitle: string, dialogMessage: string, } const PLANEX_URL = 'http://planex.insa-toulouse.fr/'; const CUSTOM_CSS_GENERAL = 'https://etud.insa-toulouse.fr/~amicale_app/custom_css/planex/customMobile3.css'; const CUSTOM_CSS_NIGHTMODE = 'https://etud.insa-toulouse.fr/~amicale_app/custom_css/planex/customDark2.css'; // // JS + JQuery functions used to remove alpha from events. Copy paste in browser console for quick testing // // Remove alpha from given Jquery node // function removeAlpha(node) { // let bg = node.css("background-color"); // if (bg.match("^rgba")) { // let a = bg.slice(5).split(','); // // Fix for tooltips with broken background // if (parseInt(a[0]) === parseInt(a[1]) && parseInt(a[1]) === parseInt(a[2]) && parseInt(a[2]) === 0) { // a[0] = a[1] = a[2] = '255'; // } // let newBg ='rgb(' + a[0] + ',' + a[1] + ',' + a[2] + ')'; // node.css("background-color", newBg); // } // } // // Observe for planning DOM changes // let observer = new MutationObserver(function(mutations) { // for (let i = 0; i < mutations.length; i++) { // if (mutations[i]['addedNodes'].length > 0 && // ($(mutations[i]['addedNodes'][0]).hasClass("fc-event") || $(mutations[i]['addedNodes'][0]).hasClass("tooltiptopicevent"))) // removeAlpha($(mutations[i]['addedNodes'][0])) // } // }); // // observer.observe(document.querySelector(".fc-body"), {attributes: false, childList: true, characterData: false, subtree:true}); // observer.observe(document.querySelector("body"), {attributes: false, childList: true, characterData: false, subtree:true}); // // Run remove alpha a first time on whole planning. Useful when code injected after planning fully loaded. // $(".fc-event-container .fc-event").each(function(index) { // removeAlpha($(this)); // }); // Watch for changes in the calendar and call the remove alpha function const OBSERVE_MUTATIONS_INJECTED = 'function removeAlpha(node) {\n' + ' let bg = node.css("background-color");\n' + ' if (bg.match("^rgba")) {\n' + ' let a = bg.slice(5).split(\',\');\n' + ' // Fix for tooltips with broken background\n' + ' if (parseInt(a[0]) === parseInt(a[1]) && parseInt(a[1]) === parseInt(a[2]) && parseInt(a[2]) === 0) {\n' + ' a[0] = a[1] = a[2] = \'255\';\n' + ' }\n' + ' let newBg =\'rgb(\' + a[0] + \',\' + a[1] + \',\' + a[2] + \')\';\n' + ' node.css("background-color", newBg);\n' + ' }\n' + '}\n' + '// Observe for planning DOM changes\n' + 'let observer = new MutationObserver(function(mutations) {\n' + ' for (let i = 0; i < mutations.length; i++) {\n' + ' if (mutations[i][\'addedNodes\'].length > 0 &&\n' + ' ($(mutations[i][\'addedNodes\'][0]).hasClass("fc-event") || $(mutations[i][\'addedNodes\'][0]).hasClass("tooltiptopicevent")))\n' + ' removeAlpha($(mutations[i][\'addedNodes\'][0]))\n' + ' }\n' + '});\n' + '// observer.observe(document.querySelector(".fc-body"), {attributes: false, childList: true, characterData: false, subtree:true});\n' + 'observer.observe(document.querySelector("body"), {attributes: false, childList: true, characterData: false, subtree:true});\n' + '// Run remove alpha a first time on whole planning. Useful when code injected after planning fully loaded.\n' + '$(".fc-event-container .fc-event").each(function(index) {\n' + ' removeAlpha($(this));\n' + '});'; const FULL_CALENDAR_SETTINGS = `var calendar = $('#calendar').fullCalendar('getCalendar'); calendar.option({ eventClick: function (data, event, view) { var message = { title: data.title, color: data.color, start: data.start._d, end: data.end._d, }; window.ReactNativeWebView.postMessage(JSON.stringify(message)); } });`; const LISTEN_TO_MESSAGES = `document.addEventListener("message", function(event) { console.log("Received post message", event);//Get Event from React Native alert(event.data); }, false);` /** * Class defining the app's Planex screen. * This screen uses a webview to render the page */ class PlanexScreen extends React.Component { webScreenRef: Object; customInjectedJS: string; onHideBanner: Function; onGoToSettings: Function; state = { bannerVisible: AsyncStorageManager.getInstance().preferences.planexShowBanner.current === '1' && AsyncStorageManager.getInstance().preferences.defaultStartScreen.current !== 'Planex', dialogVisible: false, dialogTitle: "", dialogMessage: "", }; /** * Defines custom injected JavaScript to improve the page display on mobile */ constructor() { super(); this.webScreenRef = React.createRef(); this.customInjectedJS = "$(document).ready(function() {" + OBSERVE_MUTATIONS_INJECTED + FULL_CALENDAR_SETTINGS + LISTEN_TO_MESSAGES + "$('head').append('');" + "$('head').append('\');'; if (ThemeManager.getNightMode()) this.customInjectedJS += '$("head").append(\'\');'; this.customInjectedJS += 'removeAlpha();' + '});true;'; // Prevents crash on ios this.onHideBanner = this.onHideBanner.bind(this); this.onGoToSettings = this.onGoToSettings.bind(this); } /** * Callback used when closing the banner. * This hides the banner and saves to preferences to prevent it from reopening */ onHideBanner() { this.setState({bannerVisible: false}); AsyncStorageManager.getInstance().savePref( AsyncStorageManager.getInstance().preferences.planexShowBanner.key, '0' ); } /** * Callback used when the used click on the navigate to settings button. * This will hide the banner and open the SettingsScreen * */ onGoToSettings() { this.onHideBanner(); this.props.navigation.navigate('settings'); } sendMessage = () => { let data= 'coucou' this.webScreenRef.current.postMessage(data); } onMessage = (event: Object) => { let data = JSON.parse(event.nativeEvent.data); let startDate = dateToString(new Date(data.start), true); let endDate = dateToString(new Date(data.end), true); let msg = DateManager.getInstance().getTranslatedDate(startDate) + "\n"; msg += getTimeOnlyString(startDate) + ' - ' + getTimeOnlyString(endDate); this.showDialog(data.title, msg) }; showDialog = (title: string, message: string) => { this.setState({ dialogVisible: true, dialogTitle: title, dialogMessage: message, }); }; hideDialog = () => { this.setState({ dialogVisible: false, }); }; render() { const nav = this.props.navigation; const {containerPaddingTop} = this.props.collapsibleStack; return ( } > {i18n.t('planexScreen.enableStartScreen')} ); } } export default withCollapsible(PlanexScreen);