initial version

master
Nilo Roberto C Paim 2023-08-23 10:11:10 -03:00
commit 304f895d25
23 changed files with 970 additions and 0 deletions

44
.gitignore vendored Normal file
View File

@ -0,0 +1,44 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

45
.metadata Normal file
View File

@ -0,0 +1,45 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "efbf63d9c66b9f6ec30e9ad4611189aa80003d31"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: android
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: ios
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: linux
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: macos
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: web
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: windows
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

16
README.md Normal file
View File

@ -0,0 +1,16 @@
# pcasttv
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

28
analysis_options.yaml Normal file
View File

@ -0,0 +1,28 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

BIN
assets/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

12
lib/globals.dart Normal file
View File

@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
final GlobalKey<ScaffoldMessengerState> snackbarKey = GlobalKey<ScaffoldMessengerState>();
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
String baseURL = '';
String apiVersion = '';
class Endpoints {
static final String version = '$baseURL/version';
static final String login = '$baseURL/login';
}

33
lib/main.dart Normal file
View File

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:pcasttv/globals.dart';
import 'package:pcasttv/pages/main_page.dart';
import 'package:pcasttv/stores/login_store.dart';
import 'package:velocity_x/velocity_x.dart';
void main() {
runApp(
VxState(
store: LoginStore(),
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'PCastTV',
debugShowCheckedModeBanner: false,
scaffoldMessengerKey: snackbarKey,
navigatorKey: navigatorKey,
theme: ThemeData(
useMaterial3: true,
),
home: const MainPage(),
).animate().fadeIn(duration: const Duration(milliseconds: 400));
}
}

View File

@ -0,0 +1,53 @@
import 'dart:convert';
class LoginModel {
String? message;
String? token;
int? userId;
String? userName;
String? userType;
LoginModel._();
bool get isLogged => token != null && token!.isNotEmpty;
String get loginMessage => message ?? "";
String get userRole => userType == "A"
? "Administrador"
: userType == "R"
? "Revendedor"
: "Usuário";
Map<String, dynamic> toMap() {
return <String, dynamic>{
'token': token,
};
}
static LoginModel instance = LoginModel._();
factory LoginModel.fromMap(Map<String, dynamic> map) {
var authModel = LoginModel._();
authModel.message = map['message'] as String;
authModel.token = map['token'] as String;
authModel.userId = map['userId'] as int;
authModel.userName = map['userName'] as String;
authModel.userType = map['userType'] as String;
return authModel;
}
String toJson() => json.encode(toMap());
factory LoginModel.fromJson(String source) => LoginModel.fromMap(json.decode(source) as Map<String, dynamic>);
@override
bool operator ==(covariant LoginModel other) {
if (identical(this, other)) return true;
return other.token == token;
}
@override
int get hashCode => token.hashCode;
}

78
lib/pages/main_page.dart Normal file
View File

@ -0,0 +1,78 @@
import 'package:flutter/material.dart';
import 'package:pcasttv/globals.dart';
class MainPage extends StatefulWidget {
const MainPage({super.key});
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async {
showLoginDialog();
});
super.initState();
}
@override
Widget build(BuildContext context) {
return const Scaffold(
backgroundColor: Color.fromRGBO(166, 0, 249, 1),
body: Column(),
);
}
Future<dynamic> showLoginDialog() {
return showDialog(
context: navigatorKey.currentContext!,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
scrollable: true,
elevation: 20,
insetPadding: const EdgeInsets.all(20),
title: const Text('Login'),
content: SizedBox(
width: 500,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Form(
child: Column(
children: <Widget>[
TextFormField(
decoration: const InputDecoration(
labelText: 'Email',
icon: Icon(Icons.email),
),
),
TextFormField(
decoration: const InputDecoration(
labelText: 'Senha',
icon: Icon(Icons.lock),
),
),
],
),
),
),
),
actions: <Widget>[
ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Cancelar'),
),
ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Entrar'),
),
]);
});
}
}

View File

@ -0,0 +1,37 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:pcasttv/globals.dart';
import 'package:pcasttv/models/login_model.dart';
class AuthService {
Future<LoginModel> login(String email, String password) async {
http.Response response;
final data = {
"email": email,
"password": password,
};
try {
response = await http.post(
Uri.parse(Endpoints.login),
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'application/json',
},
body: jsonEncode(data),
);
switch (response.statusCode) {
case 200:
var authModel = LoginModel.fromJson(utf8.decode(response.bodyBytes).toString());
return authModel;
default:
throw Exception('Erro inesperado no login: ${response.statusCode} - ${response.body.toString()}');
}
} on Exception catch (e) {
throw Exception('Exception inesperada no login: $e');
}
}
}

View File

@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:pcasttv/globals.dart';
class SnackBarService {
static void showSnackBar({required String content, bool error = false}) {
snackbarKey.currentState?.showSnackBar(
SnackBar(
content: Text(
content,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.black,
),
),
backgroundColor: error ? Colors.red : Colors.green,
duration: const Duration(seconds: 3),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
elevation: 8.0,
),
);
}
}

View File

@ -0,0 +1,84 @@
import 'package:pcasttv/services/auth_service.dart';
import 'package:velocity_x/velocity_x.dart';
class LoginStore extends VxStore {
AuthService service = AuthService();
var isLogged = false;
String? message = '';
String email = '';
String password = '';
String? token;
int? userId;
String? userName;
String? userType;
Future<void> login() async {
try {
var response = await service.login(email, password);
AuthMessage(response.message!);
if (response.token != '' || response.message == '') {
token = response.token;
userId = response.userId;
userName = response.userName;
userType = response.userType;
isLogged = true;
AuthLogged(true);
}
} catch (e) {
AuthMessage("SETEI NA STORE UMA EXCEPTION: $e");
}
}
Future<void> logout() async {
message = null;
token = null;
userId = null;
userName = null;
userType = null;
isLogged = false;
}
}
class AuthLogged extends VxMutation<LoginStore> {
final bool value;
AuthLogged(this.value);
@override
perform() {
store!.isLogged = value;
}
}
class AuthMessage extends VxMutation<LoginStore> {
final String value;
AuthMessage(this.value);
@override
perform() {
store!.message = value;
}
}
class AuthEmail extends VxMutation<LoginStore> {
final String value;
AuthEmail(this.value);
@override
perform() {
store!.email = value;
}
}
class AuthPassword extends VxMutation<LoginStore> {
final String value;
AuthPassword(this.value);
@override
perform() {
store!.password = value;
}
}

View File

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:velocity_x/velocity_x.dart';
class PublicEventsView extends StatefulWidget {
const PublicEventsView({super.key});
@override
State<PublicEventsView> createState() => _PublicEventsViewState();
}
class _PublicEventsViewState extends State<PublicEventsView> {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
'Eventos públicos previstos para hoje'.text.white.xl4.bold.wider.make(),
],
),
);
}
}

258
pubspec.lock Normal file
View File

@ -0,0 +1,258 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.11.0"
auto_size_text_pk:
dependency: transitive
description:
name: auto_size_text_pk
sha256: ced55de5336fa7f438c1f5a9aa234e25d7a120c1d40d376a7cdc2af28cdb6995
url: "https://pub.dev"
source: hosted
version: "3.0.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev"
source: hosted
version: "1.17.2"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
url: "https://pub.dev"
source: hosted
version: "1.0.5"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_animate:
dependency: "direct main"
description:
name: flutter_animate
sha256: "62f346340a96192070e31e3f2a1bd30a28530f1fe8be978821e06cd56b74d6d2"
url: "https://pub.dev"
source: hosted
version: "4.2.0+1"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4"
url: "https://pub.dev"
source: hosted
version: "2.0.2"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http:
dependency: "direct main"
description:
name: http
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
intl:
dependency: transitive
description:
name: intl
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev"
source: hosted
version: "0.18.1"
lints:
dependency: transitive
description:
name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev"
source: hosted
version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev"
source: hosted
version: "0.5.0"
meta:
dependency: transitive
description:
name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path:
dependency: transitive
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.3"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
source: hosted
version: "1.11.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev"
source: hosted
version: "1.3.2"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
velocity_x:
dependency: "direct main"
description:
name: velocity_x
sha256: "41734c40f1609aaafa5337fd9a9e7e9aaf3464dce8ee2cad18be4226b184e5ca"
url: "https://pub.dev"
source: hosted
version: "4.1.1"
vxstate:
dependency: transitive
description:
name: vxstate
sha256: ed5a880018191c5cfed8528bd77f2a942b04847168ca12636a306c323d311086
url: "https://pub.dev"
source: hosted
version: "2.3.0"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
sdks:
dart: ">=3.1.0 <4.0.0"
flutter: ">=2.0.0"

46
pubspec.yaml Normal file
View File

@ -0,0 +1,46 @@
name: pcasttv
description: PCastTV site.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: '>=3.1.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
flutter_animate: ^4.2.0+1
velocity_x: ^4.1.1
http: ^1.1.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- assets/images/
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#

BIN
web/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
web/icons/Icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
web/icons/Icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

152
web/index.html Normal file
View File

@ -0,0 +1,152 @@
<!DOCTYPE html>
<html>
<head>
<!--
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.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
<base href="$FLUTTER_BASE_HREF">
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="A new Flutter project.">
<!-- iOS meta tags & icons -->
<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-title" content="pcasttv">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png" />
<title>pcasttv</title>
<link rel="manifest" href="manifest.json">
<script>
// The value below is injected by flutter build, do not touch.
const serviceWorkerVersion = null;
</script>
<!-- This script adds the flutter initialization JS code -->
<script src="flutter.js" defer></script>
</head>
<body>
<style>
body {
margin: 0;
background-color: #a600f9;
height: 100vh;
width: 100vw;
margin: 0px;
}
.main-content {
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
transition: opacity 0.4s ease-out;
}
img {
width: 300px;
height: 300px;
position: absolute;
}
.loader {
position: relative;
width: 250px;
height: 250px;
border-radius: 50%;
background: linear-gradient(#f07e6e, #84cdfa, #5ad1cd);
animation: animate 1.2s linear infinite;
}
@keyframes animate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loader span {
position: absolute;
width: 100%;
height: 100%;
border-radius: 60%;
background: linear-gradient(#f07e6e, #84cdfa, #5ad1cd);
}
.loader span:nth-child(1) {
filter: blur(5px);
}
.loader span:nth-child(2) {
filter: blur(10px);
}
.loader span:nth-child(3) {
filter: blur(25px);
}
.loader span:nth-child(4) {
filter: blur(50px);
}
.loader:after {
content: "";
position: absolute;
top: 10px;
left: 10px;
right: 10px;
bottom: 10px;
background: #191919;
border-radius: 50%;
}
</style>
<script>
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time));
}
window.addEventListener('load', function (ev) {
var loaderContent = document.querySelector('#loader-content');
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
},
onEntrypointLoaded: function (engineInitializer) {
engineInitializer.initializeEngine().then(async function (appRunner) {
loaderContent.style.opacity = 0;
await delay(400);
appRunner.runApp();
});
}
});
});
</script>
<div class="main-content" id="loader-content">
<img src="logo.png" alt="PCastTV Logo" />
</div>
</body>
</html>

BIN
web/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

35
web/manifest.json Normal file
View File

@ -0,0 +1,35 @@
{
"name": "pcasttv",
"short_name": "pcasttv",
"start_url": ".",
"display": "standalone",
"background_color": "#0175C2",
"theme_color": "#0175C2",
"description": "A new Flutter project.",
"orientation": "portrait-primary",
"prefer_related_applications": false,
"icons": [
{
"src": "icons/Icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/Icon-512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "icons/Icon-maskable-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "icons/Icon-maskable-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}