Merge pull request #1 from kphanipavan/test

Lots of updates
This commit is contained in:
Phani Pavan Kambhampati
2024-10-25 17:26:30 +05:30
committed by GitHub
12 changed files with 262 additions and 74 deletions

View File

@@ -73,8 +73,8 @@ jobs:
- name: Build Web Release - name: Build Web Release
run: flutter build web --base-href "/$HREFREPLACE/" --web-renderer canvaskit --no-web-resources-cdn run: flutter build web --base-href "/$HREFREPLACE/" --web-renderer canvaskit --no-web-resources-cdn
- name: Build Android Release # - name: Build Android Release
run: flutter build apk --split-per-abi --release --no-track-widget-creation --analyze-size --target-platform "android-arm64" # run: flutter build apk --split-per-abi --release --no-track-widget-creation --analyze-size --target-platform "android-arm64"
- name: Fix PWA Offline Support - name: Fix PWA Offline Support
run: | run: |
@@ -83,15 +83,15 @@ jobs:
./fixOfflinePWA.sh ./fixOfflinePWA.sh
cat ./build/web/flutter_service_worker.js cat ./build/web/flutter_service_worker.js
- name: Create Release # - name: Create Release
uses: marvinpinto/action-automatic-releases@v1.2.1 # uses: marvinpinto/action-automatic-releases@v1.2.1
with: # with:
repo_token: "${{ secrets.GITHUB_TOKEN }}" # repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest" # automatic_release_tag: "latest"
prerelease: true # prerelease: true
draft: false # draft: false
title: "Git Build" # title: "Git Build"
files: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk # files: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
- name: Upload production-ready build files - name: Upload production-ready build files
uses: actions/upload-artifact@v3.1.2 uses: actions/upload-artifact@v3.1.2

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:iiitb_menu/models/globalModel.dart'; import 'package:iiitb_menu/models/globalModel.dart';
import 'package:iiitb_menu/views/homePage.dart'; import 'package:iiitb_menu/views/homePage.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import "package:iiitb_menu/views/about.dart";
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@@ -20,8 +21,13 @@ class MainApp extends StatelessWidget {
builder: (BuildContext context, child) { builder: (BuildContext context, child) {
return MaterialApp( return MaterialApp(
title: "IIITB Menu", title: "IIITB Menu",
home: const HomePage(), routes: {
theme: ThemeData(useMaterial3: false), "/": (context) => HomePage(),
"/info": (context) => AboutPage(),
},
initialRoute: "/",
// home: const HomePage(),
theme: ThemeData(useMaterial3: true),
); );
}, },
); );

View File

@@ -17,15 +17,27 @@ class GlobalModel extends ChangeNotifier {
GlobalModel() { GlobalModel() {
// print("In constructor"); // print("In constructor");
GlobalModel.loadData().then((value) { GlobalModel.loadData2().then((value) {
mainData = value; mainData = value;
if (this.mainData["dates"].keys.contains(this.date)) { if (this.mainData["dates"].keys.contains(this.date)) {
this.menuAvailable = DataStatus.Loaded; this.menuAvailable = DataStatus.Loaded;
} else {
this.menuAvailable = DataStatus.NotFound;
} }
notifyListeners(); notifyListeners();
}); });
} }
updateCall() async {
this.mainData = await GlobalModel.updateLocal();
if (this.mainData["dates"].keys.contains(this.date)) {
this.menuAvailable = DataStatus.Loaded;
} else {
this.menuAvailable = DataStatus.NotFound;
}
notifyListeners();
}
static Future<String> getLatestHash() async { static Future<String> getLatestHash() async {
try { try {
Response hashRequest = await get(Uri.parse(hashLink)); Response hashRequest = await get(Uri.parse(hashLink));
@@ -52,6 +64,57 @@ class GlobalModel extends ChangeNotifier {
} }
} }
static Future<Map> updateLocal() async {
// Set main data and return the data to be used in constructor
String remoteHash = await GlobalModel.getLatestHash();
final SharedPreferences prefs = await SharedPreferences.getInstance();
String? rawData = prefs.getString(storageKey);
rawData ??= "";
String rawHash = md5.convert(utf8.encode(rawData)).toString();
if (remoteHash != rawHash) {
print("Local data is out of date, updating local");
print("Old Hash: $rawHash");
print("New Hash: $remoteHash");
// Donwload new data and save it.
rawData = await getLatestData();
Map returnData = jsonDecode(rawData);
prefs.setString(storageKey, rawData);
return returnData;
} else {
// return the same data
print("Local data is up to date");
return jsonDecode(rawData);
}
}
static Future<Map> loadData2() async {
/* New flow for fetching data:
Get cached data into a var
if theres nothing:
get data
generate hash and store both the data and hash
else:
return the current data
Move the download and get hash part to new method - done
create a new method for updating the current data.
This checks for update and saves new data to sharedprefs if necessary,
*/
late Map returnData;
final SharedPreferences prefs = await SharedPreferences.getInstance();
String? rawData;
rawData = prefs.getString(storageKey);
if (rawData != null) {
print("Some data found");
returnData = jsonDecode(rawData);
return returnData;
} else {
print("Data Not Found");
return GlobalModel.updateLocal();
}
}
static Future<Map> loadData() async { static Future<Map> loadData() async {
late Map returnData; late Map returnData;
final SharedPreferences prefs = await SharedPreferences.getInstance(); final SharedPreferences prefs = await SharedPreferences.getInstance();

36
lib/views/about.dart Normal file
View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
class AboutPage extends StatelessWidget {
const AboutPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("About")),
body: const Column(
children: [
Padding(
padding: EdgeInsets.only(left: 100, right: 100, top: 50),
child: Image(image: AssetImage("assets/plate.png")),
),
Center(
child: Text(
"IIIT Bangalore's Unofficial Menu App",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 50,
),
),
),
Center(
child: Text("Proud Ass Web 1.0 App built with Flutter"),
),
Center(
child: Text(
"Menu updates every other Tuesday or when FoodComm does it."),
)
],
),
);
}
}

View File

@@ -6,6 +6,7 @@ import "package:iiitb_menu/models/globalModel.dart";
import "package:iiitb_menu/models/initialPageIndexFunction.dart"; import "package:iiitb_menu/models/initialPageIndexFunction.dart";
import "package:iiitb_menu/views/menuListView.dart"; import "package:iiitb_menu/views/menuListView.dart";
import "package:provider/provider.dart"; import "package:provider/provider.dart";
import "package:share_plus/share_plus.dart";
class HomePage extends StatelessWidget { class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key); const HomePage({Key? key}) : super(key: key);
@@ -25,13 +26,52 @@ class HomePage extends StatelessWidget {
return Consumer<GlobalModel>( return Consumer<GlobalModel>(
builder: (BuildContext context, GlobalModel data, Widget? child) { builder: (BuildContext context, GlobalModel data, Widget? child) {
return Scaffold( return Scaffold(
drawer: Drawer(
child: ListView(
children: [
ListTile(
leading: Icon(Icons.arrow_back),
title: Text("Menu"),
onTap: () {
Navigator.pop(context);
}),
// ListTile(
// leading: Icon(Icons.star),
// title: Text("Specials"),
// ),
const Divider(),
// ListTile(
// leading: Icon(Icons.settings),
// title: Text("Settings"),
// ),
ListTile(
leading: const Icon(Icons.share_rounded),
title: const Text("Share"),
onTap: () {
var ret = Share.share(
"Hey, use this to track IIITB's Mess Menu. https://kphanipavan.github.io/IIITB_Menu/",
// subject: "IIITB Menu App",
);
ret.then((value) {
print(value.status);
});
}),
ListTile(
leading: Icon(Icons.info),
title: Text("About"),
onTap: () {
Navigator.pushNamed(context, "/info");
}),
],
),
),
appBar: AppBar( appBar: AppBar(
title: Text("Daily ${data.menuTime} Menu"), title: Text(data.menuTime),
bottom: TabBar( bottom: TabBar(
controller: cont, controller: cont,
splashFactory: NoSplash.splashFactory, // splashFactory: InkSplash.splashFactory,
indicator: const UnderlineTabIndicator( // indicator: const UnderlineTabIndicator(
insets: EdgeInsets.fromLTRB(10, 3, 10, 3)), // insets: EdgeInsets.fromLTRB(10, 3, 10, 3)),
onTap: (int index) { onTap: (int index) {
data.setMenuTime(index); data.setMenuTime(index);
}, },
@@ -42,6 +82,15 @@ class HomePage extends StatelessWidget {
Tab(icon: Icon(Icons.dinner_dining_outlined)) Tab(icon: Icon(Icons.dinner_dining_outlined))
]), ]),
actions: [ actions: [
InkWell(
splashFactory: NoSplash.splashFactory,
onTap: () {
data.updateCall();
},
child: Icon(data.menuAvailable == DataStatus.Loading
? Icons.downloading_rounded
: Icons.update_rounded),
),
InkWell( InkWell(
splashFactory: NoSplash.splashFactory, splashFactory: NoSplash.splashFactory,
onTap: () { onTap: () {

View File

@@ -6,6 +6,10 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
} }

View File

@@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_linux
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@@ -6,9 +6,11 @@ import FlutterMacOS
import Foundation import Foundation
import path_provider_foundation import path_provider_foundation
import share_plus
import shared_preferences_foundation import shared_preferences_foundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
} }

View File

@@ -2,7 +2,7 @@ name: iiitb_menu
description: IIITB Bi-Weekly Menu description: IIITB Bi-Weekly Menu
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: "none" # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application. # The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43 # A version number is three numbers separated by dots, like 1.2.43
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: '>=3.1.0 <4.0.0' sdk: ">=3.1.0 <4.0.0"
# Dependencies specify other packages that your package needs in order to work. # Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions # To automatically upgrade your package dependencies to the latest versions
@@ -31,10 +31,9 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2 # cupertino_icons: ^1.0.2
provider: ^6.0.5 provider: ^6.0.5
crypto: ^3.0.3 crypto: ^3.0.3
intl: ^0.18.1 intl: ^0.18.1
@@ -43,6 +42,7 @@ dependencies:
path_provider: path_provider:
# localstorage: ^4.0.1+4 # localstorage: ^4.0.1+4
shared_preferences: ^2.2.0 shared_preferences: ^2.2.0
share_plus: ^10.1.1
# sembast: # sembast:
dev_dependencies: dev_dependencies:
@@ -61,7 +61,6 @@ dev_dependencies:
# The following section is specific to Flutter packages. # The following section is specific to Flutter packages.
flutter: flutter:
# The following line ensures that the Material Icons font is # The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in # included with your application, so that you can use the icons in
# the material Icons class. # the material Icons class.

View File

@@ -1,8 +1,7 @@
<!DOCTYPE html> <!doctype html>
<html> <html>
<head>
<head> <!--
<!--
If you are serving your web app in a path other than the root, change the If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from. href value below to reflect the base path you are serving from.
@@ -15,54 +14,75 @@
This is a placeholder for base href that will be replaced by the value of This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`. the `--base-href` argument provided to `flutter build`.
--> -->
<base href="$FLUTTER_BASE_HREF"> <base href="$FLUTTER_BASE_HREF" />
<meta charset="UTF-8"> <meta charset="UTF-8" />
<meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
<meta name="description" content="Bi-Weekly Menu"> <meta name="description" content="Bi-Weekly Menu" />
<!-- iOS meta tags & icons --> <!-- iOS meta tags & icons -->
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="apple-mobile-web-app-title" content="IIITB Menu"> <meta name="apple-mobile-web-app-title" content="IIITB Menu" />
<link rel="apple-touch-icon" sizes="180x180" href="icons/apple-touch-icon.png"> <link
rel="apple-touch-icon"
sizes="180x180"
href="icons/apple-touch-icon.png"
/>
<!-- Favicon --> <!-- Favicon -->
<link rel="icon" type="image/ico" href="favicon.ico" /> <link rel="icon" type="image/ico" href="favicon.ico" />
<link rel="mask-icon" href="icons/safari-pinned-tab.svg" color="#5bbad5"> <link
<link rel="icon" type="image/png" sizes="96x96" href="icons/favicon-96x96.png"> rel="mask-icon"
<link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32x32.png"> href="icons/safari-pinned-tab.svg"
<link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16x16.png"> color="#5bbad5"
<title>iiitb_menu</title> />
<link rel="manifest" href="manifest.json"> <link
rel="icon"
type="image/png"
sizes="96x96"
href="icons/favicon-96x96.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="icons/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="icons/favicon-16x16.png"
/>
<title>iiitb_menu</title>
<link rel="manifest" href="manifest.json" />
<script> <script>
// The value below is injected by flutter build, do not touch. // The value below is injected by flutter build, do not touch.
const serviceWorkerVersion = null; const serviceWorkerVersion = null;
</script> </script>
<!-- This script adds the flutter initialization JS code --> <!-- This script adds the flutter initialization JS code -->
<script src="flutter.js" defer></script> <script src="flutter.js" defer></script>
</head> </head>
<body>
<script>
window.addEventListener('load', function (ev)
{
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
},
onEntrypointLoaded: function (engineInitializer)
{
engineInitializer.initializeEngine().then(function (appRunner)
{
appRunner.runApp();
});
}
});
});
</script>
</body>
<body>
<script>
window.addEventListener("load", function (ev) {
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
},
onEntrypointLoaded: function (engineInitializer) {
engineInitializer
.initializeEngine()
.then(function (appRunner) {
appRunner.runApp();
});
},
});
});
</script>
</body>
</html> </html>

View File

@@ -6,6 +6,12 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
SharePlusWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
} }

View File

@@ -3,6 +3,8 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
share_plus
url_launcher_windows
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST