Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .firebaserc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"projects": {
"default": "mobus-ca8a4"
}
}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*.swp
.buildlog/
.history
.env
mobus.env

# Flutter repo-specific
/bin/cache/
Expand Down Expand Up @@ -71,3 +71,6 @@ app.*.symbols
!/dev/ci/**/Gemfile.lock

**/android/app/google-services.json


.firebase/hosting.*.cache
15 changes: 15 additions & 0 deletions firebase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hosting": {
"public": "build/web",
"ignore": [
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
72 changes: 53 additions & 19 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,24 +1,62 @@
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:firebase_core/firebase_core.dart';

import 'who_is_using.dart';


Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();

const apiKeyFromEnv = String.fromEnvironment('API_KEY');
final apiKey = apiKeyFromEnv.isEmpty ? null : apiKeyFromEnv;

const authDomainFromEnv = String.fromEnvironment('AUTH_DOMAIN');
final authDomain = authDomainFromEnv.isEmpty ? null : authDomainFromEnv;

const projectIdFromEnv = String.fromEnvironment('PROJECT_ID');
final projectId = projectIdFromEnv.isEmpty ? null : projectIdFromEnv;

const storageBucketFromEnv = String.fromEnvironment('STORAGE_BUCKET');
final storageBucket = storageBucketFromEnv.isEmpty ? null : storageBucketFromEnv;

const messagingSenderIdFromEnv = String.fromEnvironment('MESSAGING_SENDER_ID');
final messagingSenderId = messagingSenderIdFromEnv.isEmpty ? null : messagingSenderIdFromEnv;

const appIdFromEnv = String.fromEnvironment('APP_ID');
final appId = appIdFromEnv.isEmpty ? null : appIdFromEnv;

const measurementIdFromEnv = String.fromEnvironment('MEASUREMENT_ID');
final measurementId = measurementIdFromEnv.isEmpty ? null : measurementIdFromEnv;

if (apiKey == null || projectId == null || appId == null || messagingSenderId == null) {
runApp(const MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Text(
"Erro de Configuração: As chaves do Firebase (API_KEY, PROJECT_ID, APP_ID, MESSAGING_SENDER_ID) não foram encontradas. Verifique se o arquivo .env está correto e se o build foi executado com a flag '--dart-define-from-file'.",
textAlign: TextAlign.center,
),
),
),
),
));

return;
}

// Carregar variáveis do .env
await dotenv.load(fileName: ".env");

await Firebase.initializeApp(
options: FirebaseOptions(
apiKey: dotenv.env['API_KEY']!,
authDomain: dotenv.env['AUTH_DOMAIN'],
projectId: dotenv.env['PROJECT_ID']!,
storageBucket: dotenv.env['STORAGE_BUCKET'],
messagingSenderId: dotenv.env['MESSAGING_SENDER_ID']!,
appId: dotenv.env['APP_ID']!,
measurementId: dotenv.env['MEASUREMENT_ID'],
apiKey: apiKey,
appId: appId,
authDomain: authDomain,
projectId: projectId,
storageBucket: storageBucket,
messagingSenderId: messagingSenderId,
measurementId: measurementId,
),
);

Expand All @@ -37,7 +75,7 @@ class MobusApp extends StatelessWidget {
primarySwatch: Colors.blue,
scaffoldBackgroundColor: Colors.white,
),
home: StartPage(),
home: const StartPage(),
);
}
}
Expand Down Expand Up @@ -75,7 +113,6 @@ class StartPage extends StatelessWidget {
),
),
const SizedBox(height: 30),

const Text(
'Bem-vindo ao Mobus!',
style: TextStyle(
Expand All @@ -93,26 +130,22 @@ class StartPage extends StatelessWidget {
textAlign: TextAlign.center,
),
const SizedBox(height: 10),

const Text(
'Acompanhe o transporte em tempo real',
style: TextStyle(fontSize: 18, color: Colors.white70),
textAlign: TextAlign.center,
),
const SizedBox(height: 40),

ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => WhoIsUsingPage()),
MaterialPageRoute(builder: (context) => const WhoIsUsingPage()),
);
},
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 50,
vertical: 18,
),
padding:
const EdgeInsets.symmetric(horizontal: 50, vertical: 18),
backgroundColor: Colors.white,
foregroundColor: Colors.blue.shade700,
textStyle: const TextStyle(
Expand All @@ -132,3 +165,4 @@ class StartPage extends StatelessWidget {
);
}
}

33 changes: 33 additions & 0 deletions public/404.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page Not Found</title>

<style media="screen">
body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
#message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px 16px; border-radius: 3px; }
#message h3 { color: #888; font-weight: normal; font-size: 16px; margin: 16px 0 12px; }
#message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; }
#message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;}
#message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
#message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
#message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
#load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
@media (max-width: 600px) {
body, #message { margin-top: 0; background: white; box-shadow: none; }
body { border-top: 16px solid #ffa100; }
}
</style>
</head>
<body>
<div id="message">
<h2>404</h2>
<h1>Page Not Found</h1>
<p>The specified file was not found on this website. Please check the URL for mistakes and try again.</p>
<h3>Why am I seeing this?</h3>
<p>This page was generated by the Firebase Command-Line Interface. To modify it, edit the <code>404.html</code> file in your project's configured <code>public</code> directory.</p>
</div>
</body>
</html>
89 changes: 89 additions & 0 deletions public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Welcome to Firebase Hosting</title>

<!-- update the version number as needed -->
<script defer src="/__/firebase/12.4.0/firebase-app-compat.js"></script>
<!-- include only the Firebase features as you need -->
<script defer src="/__/firebase/12.4.0/firebase-auth-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-database-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-firestore-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-functions-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-messaging-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-storage-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-analytics-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-remote-config-compat.js"></script>
<script defer src="/__/firebase/12.4.0/firebase-performance-compat.js"></script>
<!--
initialize the SDK after all desired features are loaded, set useEmulator to false
to avoid connecting the SDK to running emulators.
-->
<script defer src="/__/firebase/init.js?useEmulator=true"></script>

<style media="screen">
body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
#message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px; border-radius: 3px; }
#message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; }
#message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;}
#message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
#message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
#message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
#load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
@media (max-width: 600px) {
body, #message { margin-top: 0; background: white; box-shadow: none; }
body { border-top: 16px solid #ffa100; }
}
</style>
</head>
<body>
<div id="message">
<h2>Welcome</h2>
<h1>Firebase Hosting Setup Complete</h1>
<p>You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!</p>
<a target="_blank" href="https://firebase.google.com/docs/hosting/">Open Hosting Documentation</a>
</div>
<p id="load">Firebase SDK Loading&hellip;</p>

<script>
document.addEventListener('DOMContentLoaded', function() {
const loadEl = document.querySelector('#load');
// // 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
// // The Firebase SDK is initialized and available here!
//
// firebase.auth().onAuthStateChanged(user => { });
// firebase.database().ref('/path/to/ref').on('value', snapshot => { });
// firebase.firestore().doc('/foo/bar').get().then(() => { });
// firebase.functions().httpsCallable('yourFunction')().then(() => { });
// firebase.messaging().requestPermission().then(() => { });
// firebase.storage().ref('/path/to/ref').getDownloadURL().then(() => { });
// firebase.analytics(); // call to activate
// firebase.analytics().logEvent('tutorial_completed');
// firebase.performance(); // call to activate
//
// // 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥

try {
let app = firebase.app();
let features = [
'auth',
'database',
'firestore',
'functions',
'messaging',
'storage',
'analytics',
'remoteConfig',
'performance',
].filter(feature => typeof app[feature] === 'function');
loadEl.textContent = `Firebase SDK loaded with ${features.join(', ')}`;
} catch (e) {
console.error(e);
loadEl.textContent = 'Error loading the Firebase SDK, check the console.';
}
});
</script>
</body>
</html>
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ flutter:

# Adição da seção assets para que o Flutter inclua o arquivo .env
assets:
- .env


# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
Expand Down
22 changes: 5 additions & 17 deletions web/index.html
Original file line number Diff line number Diff line change
@@ -1,38 +1,26 @@
<!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="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-title" content="mobus">
<link rel="apple-touch-icon" href="icons/Icon-192.png">

<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/>

<title>mobus</title>
<link rel="manifest" href="manifest.json">
</head>
<body>
<script>
window.flutterWebRenderer = "html";
</script>
<script src="flutter_bootstrap.js" async></script>
</body>
</html>
</html>