forked from yaso_meth/mih-project
381 lines
14 KiB
HTML
381 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<base href="/">
|
|
|
|
<!-- APP Description -->
|
|
<meta charset="UTF-8">
|
|
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
|
<meta name="description"
|
|
content="MIH, the first Mzansi super app by Mzansi Innovation Hub. Streamline your life with Mzansi Profile, Wallet, Patient Manager, AI, Directory, Calendar, Calculator, & secure MIH Access. Unify social, business & personal tools.">
|
|
|
|
<!-- iOS meta tags & icons -->
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
|
<meta name="apple-mobile-web-app-title" content="MIH">
|
|
|
|
<link rel="apple-touch-icon" href="icons/apple-touch-icon.png">
|
|
|
|
<!-- Favicon -->
|
|
<link rel="icon" href="favicon.ico">
|
|
|
|
<title>MIH App: Mzansi Innovation Hub - All-in-One Super App for Business & Personal Life</title>
|
|
<link rel="manifest" href="manifest.json">
|
|
|
|
<!-- test stuff for speed -->
|
|
<link rel="preconnect" href="https://cdnjs.cloudflare.com">
|
|
<link rel="prefetch" href="flutter_bootstrap.js">
|
|
|
|
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
|
|
|
|
|
|
<!-- Splash screen -->
|
|
|
|
|
|
<!-- <script src="install_pwa.js" defer=""></script> -->
|
|
<!-- Capture PWA install prompt event -->
|
|
<script>
|
|
let deferredPrompt;
|
|
|
|
window.addEventListener('beforeinstallprompt', (e) => {
|
|
deferredPrompt = e;
|
|
});
|
|
|
|
function promptInstall() {
|
|
deferredPrompt.prompt();
|
|
}
|
|
|
|
// Listen for app install event
|
|
window.addEventListener('appinstalled', () => {
|
|
deferredPrompt = null;
|
|
appInstalled();
|
|
});
|
|
|
|
// Track how PWA was launched (either from browser or as PWA)
|
|
function getLaunchMode() {
|
|
const isStandalone = window.matchMedia('(display-mode: standalone)').matches;
|
|
if (deferredPrompt) hasPrompt();
|
|
if (document.referrer.startsWith('android-app://')) {
|
|
appLaunchedAsTWA();
|
|
} else if (navigator.standalone || isStandalone) {
|
|
appLaunchedAsPWA();
|
|
} else {
|
|
window.appLaunchedInBrowser();
|
|
}
|
|
}
|
|
</script>
|
|
<!-- Splash screen -->
|
|
<!-- <script>
|
|
var dartPdfJsBaseUrl = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.2.146/";
|
|
</script> -->
|
|
<!--------------------->
|
|
<style id="splash-screen-style">
|
|
html {
|
|
height: 100%
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
min-height: 100%;
|
|
background-color: #3A4454;
|
|
background-size: 100% 100%;
|
|
}
|
|
|
|
.center {
|
|
margin: 0;
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 50%;
|
|
-ms-transform: translate(-50%, -50%);
|
|
transform: translate(-50%, -50%);
|
|
}
|
|
|
|
.contain {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: contain;
|
|
}
|
|
|
|
.stretch {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.cover {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
|
|
.bottom {
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 50%;
|
|
-ms-transform: translate(-50%, 0);
|
|
transform: translate(-50%, 0);
|
|
}
|
|
|
|
.bottomLeft {
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
}
|
|
|
|
.bottomRight {
|
|
position: absolute;
|
|
bottom: 0;
|
|
right: 0;
|
|
}
|
|
</style>
|
|
<script id="splash-screen-script">
|
|
function removeSplashFromWeb() {
|
|
document.getElementById("splash")?.remove();
|
|
document.getElementById("splash-branding")?.remove();
|
|
document.body.style.background = "transparent";
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "http://schema.org",
|
|
"@type": "SoftwareApplication",
|
|
"name": "MIH App",
|
|
"alternateName": "Mzansi Innovation Hub App",
|
|
"applicationCategory": "ProductivityApplication",
|
|
"operatingSystem": ["Android", "iOS", "Web"],
|
|
"description": "MIH, the first super app of Mzansi, streamlines personal and business life with features like Mzansi Profile, Wallet, Patient Manager, AI, Directory, Calendar, Calculator, and MIH Access.",
|
|
"softwareRequirements": "Internet connection",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"price": "0",
|
|
"priceCurrency": "ZAR"
|
|
},
|
|
"url": "https://app.mzansi-innovation-hub.co.za/",
|
|
"sameAs": [
|
|
"https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih&hl=en_ZA",
|
|
"https://apps.apple.com/za/app/mih-app-mzansi-innovation-hub/id6743310890"
|
|
],
|
|
"featureList": [
|
|
"Mzansi Profile (Personal & Business)",
|
|
"Mzansi Wallet (Loyalty Cards)",
|
|
"Patient Manager (Appointment Scheduling)",
|
|
"Mzansi AI (Chat Assistant)",
|
|
"Mzansi Directory (People & Businesses)",
|
|
"Integrated Calendar",
|
|
"Calculator (Tips & Forex)",
|
|
"MIH Access (Profile Security Management)"
|
|
],
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "Mzansi Innovation Hub"
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<div id="seo-content" style="display:none;">
|
|
<h1>Mzansi Innovation Hub (MIH) - Your All-in-One Super App for South Africa</h1>
|
|
<p>Tired of juggling multiple apps? Mzansi Innovation Hub (MIH) presents the first super app designed specifically for the people and businesses of Mzansi. MIH is your unified online information technology system to streamline both your personal and professional life, bridging the socio-economic divide during the digital revolution.</p>
|
|
|
|
<h2>Key Features of the MIH Super App:</h2>
|
|
<ul>
|
|
<li><strong>Mzansi Profile:</strong> Effortlessly manage your professional profile, personal information, and valuable business team details. Amplify your online presence.</li>
|
|
<li><strong>Mzansi Wallet:</strong> Go digital! Securely store all your loyalty cards in one convenient place, reducing clutter.</li>
|
|
<li><strong>Patient Manager:</strong> Revolutionize medical practices with seamless patient appointment scheduling and efficient data management.</li>
|
|
<li><strong>Mzansi AI:</strong> Get instant support and quick answers with our friendly AI assistant, available 24/7.</li>
|
|
<li><li><strong>Mzansi Directory:</strong> Discover and connect with people and businesses across Mzansi.</li>
|
|
<li><strong>Calendar:</strong> Stay perfectly organized with an integrated calendar for all your personal and business appointments.</li>
|
|
<li><strong>Calculator:</strong> Perform quick calculations, including tips and forex, right within the app.</li>
|
|
<li><strong>MIH Access:</strong> Take control of your security. Easily manage and view who has access to your profile and data.</li>
|
|
</ul>
|
|
|
|
<p>MIH simplifies daily tasks, reduces costs, and helps you manage your professional profile, team, and appointments all from a single, user-friendly platform. It's the essential mobile app for business owners and individuals looking to streamline their online presence in South Africa.</p>
|
|
|
|
<h3>Download the MIH Super App Today!</h3>
|
|
<p>Available for Android and iOS. Search "Mzansi Innovation Hub" or "MIH App" on your app store.</p>
|
|
</div>
|
|
|
|
<script>
|
|
// Hide the SEO content once the Flutter app starts to load
|
|
window.addEventListener('load', function() {
|
|
const seoContent = document.getElementById('seo-content');
|
|
if (seoContent) {
|
|
seoContent.style.display = 'none'; // Or 'hidden'
|
|
}
|
|
});
|
|
// You might need to adjust this script to ensure it hides *after* the Flutter app's visual elements are fully rendered.
|
|
// A more robust solution might involve listening for a Flutter-specific event when the app is ready.
|
|
</script>
|
|
<picture id="splash-branding">
|
|
<source
|
|
srcset="splash/img/branding-1x.png 1x, splash/img/branding-2x.png 2x, splash/img/branding-3x.png 3x, splash/img/branding-4x.png 4x"
|
|
media="(prefers-color-scheme: light)">
|
|
<source
|
|
srcset="splash/img/branding-dark-1x.png 1x, splash/img/branding-dark-2x.png 2x, splash/img/branding-dark-3x.png 3x, splash/img/branding-dark-4x.png 4x"
|
|
media="(prefers-color-scheme: dark)">
|
|
<img class="bottom" aria-hidden="true" src="splash/img/branding-1x.png" alt="Mzansi Innovation Hub Branding Logo">
|
|
</picture>
|
|
<picture id="splash">
|
|
<source
|
|
srcset="splash/img/light-1x.png 1x, splash/img/light-2x.png 2x, splash/img/light-3x.png 3x, splash/img/light-4x.png 4x"
|
|
media="(prefers-color-scheme: light)">
|
|
<source
|
|
srcset="splash/img/dark-1x.png 1x, splash/img/dark-2x.png 2x, splash/img/dark-3x.png 3x, splash/img/dark-4x.png 4x"
|
|
media="(prefers-color-scheme: dark)">
|
|
<img class="center" aria-hidden="true" src="splash/img/light-1x.png" alt="MIH App Splash Screen Logo">
|
|
</picture>
|
|
|
|
|
|
|
|
<!-- Versioning -->
|
|
<!-- <script src="flutter.js" defer></script> -->
|
|
|
|
<!-- <script defer>
|
|
//var serviceWorkerVersion = '{{flutter_service_worker_version}}';
|
|
|
|
window.addEventListener('load', function (env) {
|
|
{{flutter_js}}
|
|
{{flutter_build_config}}
|
|
_flutter.loader.load({
|
|
serviceWorker: {
|
|
serviceWorkerVersion: {{flutter_service_worker_version}},
|
|
},
|
|
onEntrypointLoaded: function (engineInitializer) {
|
|
engineInitializer.initializeEngine().then(function (appRunner) {
|
|
appRunner.runApp();
|
|
});
|
|
}
|
|
});
|
|
});
|
|
</script> -->
|
|
<script>
|
|
window.addEventListener("load", function (e) {
|
|
document.addEventListener("focusin", function (event) {
|
|
if (event.target.tagName === "INPUT" || event.target.tagName === "TEXTAREA") {
|
|
event.target.setAttribute("spellcheck", "true");
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
<script defer="">
|
|
var serviceWorkerVersion = '{{flutter_service_worker_version}}';
|
|
var scriptLoaded = false;
|
|
function loadMainDartJs() {
|
|
console.log('Loading app...');
|
|
if (scriptLoaded) {
|
|
return;
|
|
}
|
|
scriptLoaded = true;
|
|
{{flutter_js}}
|
|
{{flutter_build_config}}
|
|
_flutter.loader.load({
|
|
serviceWorker: {
|
|
serviceWorkerVersion: serviceWorkerVersion,
|
|
},
|
|
onEntrypointLoaded: function (engineInitializer) {
|
|
engineInitializer.initializeEngine().then(function (appRunner) {
|
|
appRunner.runApp();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
if ('serviceWorker' in navigator) {
|
|
var startLoad = new Date();
|
|
// Service workers are supported. Use them.
|
|
window.addEventListener('load', function () {
|
|
// Wait for registration to finish before dropping the <script> tag.
|
|
// Otherwise, the browser will load the script multiple times,
|
|
// potentially different versions.
|
|
var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
|
|
navigator.serviceWorker.register(serviceWorkerUrl)
|
|
.then((reg) => {
|
|
|
|
function waitForActivation(serviceWorker) {
|
|
serviceWorker.addEventListener('statechange', () => {
|
|
if (serviceWorker.state == 'activated') {
|
|
console.log('Installed new service worker.');
|
|
loadMainDartJs();
|
|
}
|
|
});
|
|
}
|
|
|
|
console.log('Active Service Worker URL: ' + reg.active.scriptURL);
|
|
const currentSWVersion = reg.active.scriptURL.split("=")[1].replaceAll("%22", "");;
|
|
console.log('Active Service Worker Version: ' + serviceWorkerVersion.replaceAll("\"", ""));
|
|
console.log('Latest Service Worker Version: ' + currentSWVersion);
|
|
const isMatch = currentSWVersion === serviceWorkerVersion.replaceAll("\"", "");
|
|
console.log('Latest Service Worker Installed: ' + isMatch);
|
|
|
|
if (!reg.active && (reg.installing || reg.waiting)) {
|
|
// No active web worker and we have installed or are installing
|
|
// one for the first time. Simply wait for it to activate.
|
|
console.log('No Service Worker Available - Installing New Service Worker.');
|
|
waitForActivation(reg.installing || reg.waiting);
|
|
} else if (!isMatch) {
|
|
// When the app updates the serviceWorkerVersion changes, so we
|
|
// need to ask the service worker to update.
|
|
console.log('New service worker available.');
|
|
reg.update();
|
|
waitForActivation(reg.installing);
|
|
} else {
|
|
// Existing service worker is still good.
|
|
console.log('Service Worker up-to-date, Loading app.');
|
|
loadMainDartJs();
|
|
}
|
|
});
|
|
|
|
// If service worker doesn't succeed in a reasonable amount of time,
|
|
// fallback to plaint <script> tag.
|
|
setTimeout(() => {
|
|
if (!scriptLoaded) {
|
|
console.warn(
|
|
'Failed to load app from a service worker. Falling back to plain <script> tag.',
|
|
);
|
|
loadMainDartJs();
|
|
}
|
|
}, 4000);
|
|
var finishLoad = new Date();
|
|
var loadTime = (finishLoad.getTime() - startLoad.getTime());
|
|
console.log("Load Time: " + loadTime);
|
|
});
|
|
|
|
|
|
|
|
if (navigator.serviceWorker.state == 'activated') {
|
|
console.log('Installed new service worker.');
|
|
loadMainDartJs();
|
|
// if there's an existing controller (previous Service Worker), show the prompt
|
|
// you can tweak this and delay the notification once the page is load you can show a notification and ask for a new refresh
|
|
if (navigator.serviceWorker.controller) {
|
|
// you have a better UI here, reloading is not a great user experince here.
|
|
const confirmed = alert('New version of the app is available. Refresh now');
|
|
if (confirmed == true) {
|
|
window.location.reload();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else {
|
|
// Service workers not supported. Just drop the <script> tag.
|
|
console.log('Service Not Supported.');
|
|
loadMainDartJs();
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<script id="pdfjs-lib" src="//cdnjs.cloudflare.com/ajax/libs/pdf.js/3.2.146/pdf.min.js" defer=""></script>
|
|
<script id="pdfjs-worker" type="text/javascript"
|
|
src="//cdnjs.cloudflare.com/ajax/libs/pdf.js/3.2.146/pdf.worker.min.js" defer=""></script>
|
|
<!--------------------->
|
|
|
|
</body><!-- File Picker & PDF viewer -->
|
|
|
|
</html> |