diff --git a/README.md b/README.md index 07265b2..c854181 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ -# TEMPLATE-base-repo +# Project Architecture -# Add Users -To add yourself to the repository, open a Pull Request modifying `COLLABORATORS`, entering your GitHub username in a newline. +![alt text](./passportArchitecture.png) -All Pull Requests must follow the Pull Request Template, with a title formatted like such `[Project Name]: ` +# Directory Structure: + +auth/ +Handles authentication of user by checking if they are logged in or not + +pages/ +All separate pages will be under this directory diff --git a/bu_passport/README.md b/bu_passport/README.md deleted file mode 100644 index b4076a6..0000000 --- a/bu_passport/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# bu_passport - -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. diff --git a/bu_passport/ios/Podfile b/bu_passport/ios/Podfile index 25f4ecc..70f0640 100644 --- a/bu_passport/ios/Podfile +++ b/bu_passport/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/bu_passport/ios/Podfile.lock b/bu_passport/ios/Podfile.lock index ef26970..36aafef 100644 --- a/bu_passport/ios/Podfile.lock +++ b/bu_passport/ios/Podfile.lock @@ -1,639 +1,4 @@ PODS: - - abseil/algorithm (1.20220623.0): - - abseil/algorithm/algorithm (= 1.20220623.0) - - abseil/algorithm/container (= 1.20220623.0) - - abseil/algorithm/algorithm (1.20220623.0): - - abseil/base/config - - abseil/algorithm/container (1.20220623.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/base (1.20220623.0): - - abseil/base/atomic_hook (= 1.20220623.0) - - abseil/base/base (= 1.20220623.0) - - abseil/base/base_internal (= 1.20220623.0) - - abseil/base/config (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/base/dynamic_annotations (= 1.20220623.0) - - abseil/base/endian (= 1.20220623.0) - - abseil/base/errno_saver (= 1.20220623.0) - - abseil/base/fast_type_id (= 1.20220623.0) - - abseil/base/log_severity (= 1.20220623.0) - - abseil/base/malloc_internal (= 1.20220623.0) - - abseil/base/prefetch (= 1.20220623.0) - - abseil/base/pretty_function (= 1.20220623.0) - - abseil/base/raw_logging_internal (= 1.20220623.0) - - abseil/base/spinlock_wait (= 1.20220623.0) - - abseil/base/strerror (= 1.20220623.0) - - abseil/base/throw_delegate (= 1.20220623.0) - - abseil/base/atomic_hook (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/base (1.20220623.0): - - abseil/base/atomic_hook - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/log_severity - - abseil/base/raw_logging_internal - - abseil/base/spinlock_wait - - abseil/meta/type_traits - - abseil/base/base_internal (1.20220623.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/base/config (1.20220623.0) - - abseil/base/core_headers (1.20220623.0): - - abseil/base/config - - abseil/base/dynamic_annotations (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/errno_saver (1.20220623.0): - - abseil/base/config - - abseil/base/fast_type_id (1.20220623.0): - - abseil/base/config - - abseil/base/log_severity (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/malloc_internal (1.20220623.0): - - abseil/base/base - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/raw_logging_internal - - abseil/base/prefetch (1.20220623.0): - - abseil/base/config - - abseil/base/pretty_function (1.20220623.0) - - abseil/base/raw_logging_internal (1.20220623.0): - - abseil/base/atomic_hook - - abseil/base/config - - abseil/base/core_headers - - abseil/base/errno_saver - - abseil/base/log_severity - - abseil/base/spinlock_wait (1.20220623.0): - - abseil/base/base_internal - - abseil/base/core_headers - - abseil/base/errno_saver - - abseil/base/strerror (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/errno_saver - - abseil/base/throw_delegate (1.20220623.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/cleanup/cleanup (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/cleanup/cleanup_internal - - abseil/cleanup/cleanup_internal (1.20220623.0): - - abseil/base/base_internal - - abseil/base/core_headers - - abseil/utility/utility - - abseil/container/common (1.20220623.0): - - abseil/meta/type_traits - - abseil/types/optional - - abseil/container/compressed_tuple (1.20220623.0): - - abseil/utility/utility - - abseil/container/container_memory (1.20220623.0): - - abseil/base/config - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/utility/utility - - abseil/container/fixed_array (1.20220623.0): - - abseil/algorithm/algorithm - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/throw_delegate - - abseil/container/compressed_tuple - - abseil/memory/memory - - abseil/container/flat_hash_map (1.20220623.0): - - abseil/algorithm/container - - abseil/base/core_headers - - abseil/container/container_memory - - abseil/container/hash_function_defaults - - abseil/container/raw_hash_map - - abseil/memory/memory - - abseil/container/flat_hash_set (1.20220623.0): - - abseil/algorithm/container - - abseil/base/core_headers - - abseil/container/container_memory - - abseil/container/hash_function_defaults - - abseil/container/raw_hash_set - - abseil/memory/memory - - abseil/container/hash_function_defaults (1.20220623.0): - - abseil/base/config - - abseil/hash/hash - - abseil/strings/cord - - abseil/strings/strings - - abseil/container/hash_policy_traits (1.20220623.0): - - abseil/meta/type_traits - - abseil/container/hashtable_debug_hooks (1.20220623.0): - - abseil/base/config - - abseil/container/hashtablez_sampler (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/debugging/stacktrace - - abseil/memory/memory - - abseil/profiling/exponential_biased - - abseil/profiling/sample_recorder - - abseil/synchronization/synchronization - - abseil/utility/utility - - abseil/container/inlined_vector (1.20220623.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/container/inlined_vector_internal - - abseil/memory/memory - - abseil/container/inlined_vector_internal (1.20220623.0): - - abseil/base/core_headers - - abseil/container/compressed_tuple - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/span - - abseil/container/layout (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/strings/strings - - abseil/types/span - - abseil/utility/utility - - abseil/container/raw_hash_map (1.20220623.0): - - abseil/base/throw_delegate - - abseil/container/container_memory - - abseil/container/raw_hash_set - - abseil/container/raw_hash_set (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/prefetch - - abseil/container/common - - abseil/container/compressed_tuple - - abseil/container/container_memory - - abseil/container/hash_policy_traits - - abseil/container/hashtable_debug_hooks - - abseil/container/hashtablez_sampler - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/utility/utility - - abseil/debugging/debugging_internal (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/errno_saver - - abseil/base/raw_logging_internal - - abseil/debugging/demangle_internal (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/debugging/stacktrace (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/debugging/debugging_internal - - abseil/debugging/symbolize (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/malloc_internal - - abseil/base/raw_logging_internal - - abseil/debugging/debugging_internal - - abseil/debugging/demangle_internal - - abseil/strings/strings - - abseil/functional/any_invocable (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/utility/utility - - abseil/functional/bind_front (1.20220623.0): - - abseil/base/base_internal - - abseil/container/compressed_tuple - - abseil/meta/type_traits - - abseil/utility/utility - - abseil/functional/function_ref (1.20220623.0): - - abseil/base/base_internal - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/hash/city (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/hash/hash (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/container/fixed_array - - abseil/functional/function_ref - - abseil/hash/city - - abseil/hash/low_level_hash - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/types/optional - - abseil/types/variant - - abseil/utility/utility - - abseil/hash/low_level_hash (1.20220623.0): - - abseil/base/config - - abseil/base/endian - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/memory (1.20220623.0): - - abseil/memory/memory (= 1.20220623.0) - - abseil/memory/memory (1.20220623.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/meta (1.20220623.0): - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/meta/type_traits (1.20220623.0): - - abseil/base/config - - abseil/numeric/bits (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/numeric/int128 (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/numeric/bits - - abseil/numeric/representation (1.20220623.0): - - abseil/base/config - - abseil/profiling/exponential_biased (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/profiling/sample_recorder (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/synchronization/synchronization - - abseil/time/time - - abseil/random/distributions (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/random/internal/distribution_caller - - abseil/random/internal/fast_uniform_bits - - abseil/random/internal/fastmath - - abseil/random/internal/generate_real - - abseil/random/internal/iostream_state_saver - - abseil/random/internal/traits - - abseil/random/internal/uniform_helper - - abseil/random/internal/wide_multiply - - abseil/strings/strings - - abseil/random/internal/distribution_caller (1.20220623.0): - - abseil/base/config - - abseil/base/fast_type_id - - abseil/utility/utility - - abseil/random/internal/fast_uniform_bits (1.20220623.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/random/internal/traits - - abseil/random/internal/fastmath (1.20220623.0): - - abseil/numeric/bits - - abseil/random/internal/generate_real (1.20220623.0): - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/random/internal/fastmath - - abseil/random/internal/traits - - abseil/random/internal/iostream_state_saver (1.20220623.0): - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/random/internal/nonsecure_base (1.20220623.0): - - abseil/base/core_headers - - abseil/container/inlined_vector - - abseil/meta/type_traits - - abseil/random/internal/pool_urbg - - abseil/random/internal/salted_seed_seq - - abseil/random/internal/seed_material - - abseil/types/span - - abseil/random/internal/pcg_engine (1.20220623.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/random/internal/fastmath - - abseil/random/internal/iostream_state_saver - - abseil/random/internal/platform (1.20220623.0): - - abseil/base/config - - abseil/random/internal/pool_urbg (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/random/internal/randen - - abseil/random/internal/seed_material - - abseil/random/internal/traits - - abseil/random/seed_gen_exception - - abseil/types/span - - abseil/random/internal/randen (1.20220623.0): - - abseil/base/raw_logging_internal - - abseil/random/internal/platform - - abseil/random/internal/randen_hwaes - - abseil/random/internal/randen_slow - - abseil/random/internal/randen_engine (1.20220623.0): - - abseil/base/endian - - abseil/meta/type_traits - - abseil/random/internal/iostream_state_saver - - abseil/random/internal/randen - - abseil/random/internal/randen_hwaes (1.20220623.0): - - abseil/base/config - - abseil/random/internal/platform - - abseil/random/internal/randen_hwaes_impl - - abseil/random/internal/randen_hwaes_impl (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/numeric/int128 - - abseil/random/internal/platform - - abseil/random/internal/randen_slow (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/numeric/int128 - - abseil/random/internal/platform - - abseil/random/internal/salted_seed_seq (1.20220623.0): - - abseil/container/inlined_vector - - abseil/meta/type_traits - - abseil/random/internal/seed_material - - abseil/types/optional - - abseil/types/span - - abseil/random/internal/seed_material (1.20220623.0): - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/raw_logging_internal - - abseil/random/internal/fast_uniform_bits - - abseil/strings/strings - - abseil/types/optional - - abseil/types/span - - abseil/random/internal/traits (1.20220623.0): - - abseil/base/config - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/random/internal/uniform_helper (1.20220623.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/random/internal/traits - - abseil/random/internal/wide_multiply (1.20220623.0): - - abseil/base/config - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/random/internal/traits - - abseil/random/random (1.20220623.0): - - abseil/random/distributions - - abseil/random/internal/nonsecure_base - - abseil/random/internal/pcg_engine - - abseil/random/internal/pool_urbg - - abseil/random/internal/randen_engine - - abseil/random/seed_sequences - - abseil/random/seed_gen_exception (1.20220623.0): - - abseil/base/config - - abseil/random/seed_sequences (1.20220623.0): - - abseil/base/config - - abseil/random/internal/pool_urbg - - abseil/random/internal/salted_seed_seq - - abseil/random/internal/seed_material - - abseil/random/seed_gen_exception - - abseil/types/span - - abseil/status/status (1.20220623.0): - - abseil/base/atomic_hook - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/base/strerror - - abseil/container/inlined_vector - - abseil/debugging/stacktrace - - abseil/debugging/symbolize - - abseil/functional/function_ref - - abseil/strings/cord - - abseil/strings/str_format - - abseil/strings/strings - - abseil/types/optional - - abseil/status/statusor (1.20220623.0): - - abseil/base/base - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/meta/type_traits - - abseil/status/status - - abseil/strings/strings - - abseil/types/variant - - abseil/utility/utility - - abseil/strings/cord (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/container/fixed_array - - abseil/container/inlined_vector - - abseil/functional/function_ref - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/strings/cord_internal - - abseil/strings/cordz_functions - - abseil/strings/cordz_info - - abseil/strings/cordz_statistics - - abseil/strings/cordz_update_scope - - abseil/strings/cordz_update_tracker - - abseil/strings/internal - - abseil/strings/str_format - - abseil/strings/strings - - abseil/types/optional - - abseil/types/span - - abseil/strings/cord_internal (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/base/throw_delegate - - abseil/container/compressed_tuple - - abseil/container/inlined_vector - - abseil/container/layout - - abseil/functional/function_ref - - abseil/meta/type_traits - - abseil/strings/strings - - abseil/types/span - - abseil/strings/cordz_functions (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/profiling/exponential_biased - - abseil/strings/cordz_handle (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/synchronization/synchronization - - abseil/strings/cordz_info (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/container/inlined_vector - - abseil/debugging/stacktrace - - abseil/strings/cord_internal - - abseil/strings/cordz_functions - - abseil/strings/cordz_handle - - abseil/strings/cordz_statistics - - abseil/strings/cordz_update_tracker - - abseil/synchronization/synchronization - - abseil/types/span - - abseil/strings/cordz_statistics (1.20220623.0): - - abseil/base/config - - abseil/strings/cordz_update_tracker - - abseil/strings/cordz_update_scope (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/strings/cord_internal - - abseil/strings/cordz_info - - abseil/strings/cordz_update_tracker - - abseil/strings/cordz_update_tracker (1.20220623.0): - - abseil/base/config - - abseil/strings/internal (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/meta/type_traits - - abseil/strings/str_format (1.20220623.0): - - abseil/strings/str_format_internal - - abseil/strings/str_format_internal (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/functional/function_ref - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/numeric/representation - - abseil/strings/strings - - abseil/types/optional - - abseil/types/span - - abseil/utility/utility - - abseil/strings/strings (1.20220623.0): - - abseil/base/base - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/base/throw_delegate - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/numeric/bits - - abseil/numeric/int128 - - abseil/strings/internal - - abseil/synchronization/graphcycles_internal (1.20220623.0): - - abseil/base/base - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/malloc_internal - - abseil/base/raw_logging_internal - - abseil/synchronization/kernel_timeout_internal (1.20220623.0): - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/time/time - - abseil/synchronization/synchronization (1.20220623.0): - - abseil/base/atomic_hook - - abseil/base/base - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/malloc_internal - - abseil/base/raw_logging_internal - - abseil/debugging/stacktrace - - abseil/debugging/symbolize - - abseil/synchronization/graphcycles_internal - - abseil/synchronization/kernel_timeout_internal - - abseil/time/time - - abseil/time (1.20220623.0): - - abseil/time/internal (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/time/internal (1.20220623.0): - - abseil/time/internal/cctz (= 1.20220623.0) - - abseil/time/internal/cctz (1.20220623.0): - - abseil/time/internal/cctz/civil_time (= 1.20220623.0) - - abseil/time/internal/cctz/time_zone (= 1.20220623.0) - - abseil/time/internal/cctz/civil_time (1.20220623.0): - - abseil/base/config - - abseil/time/internal/cctz/time_zone (1.20220623.0): - - abseil/base/config - - abseil/time/internal/cctz/civil_time - - abseil/time/time (1.20220623.0): - - abseil/base/base - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/time/internal/cctz/civil_time - - abseil/time/internal/cctz/time_zone - - abseil/types (1.20220623.0): - - abseil/types/any (= 1.20220623.0) - - abseil/types/bad_any_cast (= 1.20220623.0) - - abseil/types/bad_any_cast_impl (= 1.20220623.0) - - abseil/types/bad_optional_access (= 1.20220623.0) - - abseil/types/bad_variant_access (= 1.20220623.0) - - abseil/types/compare (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/types/any (1.20220623.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/fast_type_id - - abseil/meta/type_traits - - abseil/types/bad_any_cast - - abseil/utility/utility - - abseil/types/bad_any_cast (1.20220623.0): - - abseil/base/config - - abseil/types/bad_any_cast_impl - - abseil/types/bad_any_cast_impl (1.20220623.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_optional_access (1.20220623.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_variant_access (1.20220623.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/compare (1.20220623.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/optional (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/bad_optional_access - - abseil/utility/utility - - abseil/types/span (1.20220623.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/meta/type_traits - - abseil/types/variant (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/bad_variant_access - - abseil/utility/utility - - abseil/utility/utility (1.20220623.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/meta/type_traits - - BoringSSL-GRPC (0.0.24): - - BoringSSL-GRPC/Implementation (= 0.0.24) - - BoringSSL-GRPC/Interface (= 0.0.24) - - BoringSSL-GRPC/Implementation (0.0.24): - - BoringSSL-GRPC/Interface (= 0.0.24) - - BoringSSL-GRPC/Interface (0.0.24) - cloud_firestore (4.15.6): - Firebase/Firestore (= 10.20.0) - firebase_core @@ -654,7 +19,7 @@ PODS: - firebase_core (2.25.5): - Firebase/CoreOnly (= 10.20.0) - Flutter - - FirebaseAppCheckInterop (10.21.0) + - FirebaseAppCheckInterop (10.23.0) - FirebaseAuth (10.20.0): - FirebaseAppCheckInterop (~> 10.17) - FirebaseCore (~> 10.0) @@ -666,108 +31,56 @@ PODS: - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreExtension (10.21.0): + - FirebaseCoreExtension (10.20.0): - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.21.0): + - FirebaseCoreInternal (10.23.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - FirebaseFirestore (10.20.0): - - FirebaseCore (~> 10.0) - - FirebaseCoreExtension (~> 10.0) - - FirebaseFirestoreInternal (~> 10.17) - - FirebaseSharedSwift (~> 10.0) - - FirebaseFirestoreInternal (10.21.0): - - abseil/algorithm (~> 1.20220623.0) - - abseil/base (~> 1.20220623.0) - - abseil/container/flat_hash_map (~> 1.20220623.0) - - abseil/memory (~> 1.20220623.0) - - abseil/meta (~> 1.20220623.0) - - abseil/strings/strings (~> 1.20220623.0) - - abseil/time (~> 1.20220623.0) - - abseil/types (~> 1.20220623.0) - - FirebaseAppCheckInterop (~> 10.17) - - FirebaseCore (~> 10.0) - - "gRPC-C++ (~> 1.49.1)" + - FirebaseFirestoreBinary (= 9.20.1) + - FirebaseFirestoreAbseilBinary (1.2022062300.0) + - FirebaseFirestoreBinary (9.20.1): + - FirebaseCore (= 10.20.0) + - FirebaseCoreExtension (= 10.20.0) + - FirebaseFirestoreInternalBinary (= 10.20.0) + - FirebaseSharedSwift (= 10.20.0) + - FirebaseFirestoreGRPCBoringSSLBinary (1.49.1) + - FirebaseFirestoreGRPCCoreBinary (1.49.1): + - FirebaseFirestoreAbseilBinary (= 1.2022062300.0) + - FirebaseFirestoreGRPCBoringSSLBinary (= 1.49.1) + - FirebaseFirestoreGRPCCPPBinary (1.49.1): + - FirebaseFirestoreAbseilBinary (= 1.2022062300.0) + - FirebaseFirestoreGRPCCoreBinary (= 1.49.1) + - FirebaseFirestoreInternalBinary (10.20.0): + - FirebaseCore (= 10.20.0) + - FirebaseFirestoreAbseilBinary (= 1.2022062300.0) + - FirebaseFirestoreGRPCCPPBinary (= 1.49.1) - leveldb-library (~> 1.22) - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseSharedSwift (10.21.0) + - FirebaseSharedSwift (10.20.0) - Flutter (1.0.0) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/AppDelegateSwizzler (7.13.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.0): + - GoogleUtilities/Privacy - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Logger (7.13.0): - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): + - "GoogleUtilities/NSData+zlib (7.13.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.0) + - GoogleUtilities/Reachability (7.13.0): - GoogleUtilities/Logger - - "gRPC-C++ (1.49.1)": - - "gRPC-C++/Implementation (= 1.49.1)" - - "gRPC-C++/Interface (= 1.49.1)" - - "gRPC-C++/Implementation (1.49.1)": - - abseil/base/base (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/cleanup/cleanup (= 1.20220623.0) - - abseil/container/flat_hash_map (= 1.20220623.0) - - abseil/container/flat_hash_set (= 1.20220623.0) - - abseil/container/inlined_vector (= 1.20220623.0) - - abseil/functional/any_invocable (= 1.20220623.0) - - abseil/functional/bind_front (= 1.20220623.0) - - abseil/functional/function_ref (= 1.20220623.0) - - abseil/hash/hash (= 1.20220623.0) - - abseil/memory/memory (= 1.20220623.0) - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/random/random (= 1.20220623.0) - - abseil/status/status (= 1.20220623.0) - - abseil/status/statusor (= 1.20220623.0) - - abseil/strings/cord (= 1.20220623.0) - - abseil/strings/str_format (= 1.20220623.0) - - abseil/strings/strings (= 1.20220623.0) - - abseil/synchronization/synchronization (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/utility/utility (= 1.20220623.0) - - "gRPC-C++/Interface (= 1.49.1)" - - gRPC-Core (= 1.49.1) - - "gRPC-C++/Interface (1.49.1)" - - gRPC-Core (1.49.1): - - gRPC-Core/Implementation (= 1.49.1) - - gRPC-Core/Interface (= 1.49.1) - - gRPC-Core/Implementation (1.49.1): - - abseil/base/base (= 1.20220623.0) - - abseil/base/core_headers (= 1.20220623.0) - - abseil/container/flat_hash_map (= 1.20220623.0) - - abseil/container/flat_hash_set (= 1.20220623.0) - - abseil/container/inlined_vector (= 1.20220623.0) - - abseil/functional/any_invocable (= 1.20220623.0) - - abseil/functional/bind_front (= 1.20220623.0) - - abseil/functional/function_ref (= 1.20220623.0) - - abseil/hash/hash (= 1.20220623.0) - - abseil/memory/memory (= 1.20220623.0) - - abseil/meta/type_traits (= 1.20220623.0) - - abseil/random/random (= 1.20220623.0) - - abseil/status/status (= 1.20220623.0) - - abseil/status/statusor (= 1.20220623.0) - - abseil/strings/cord (= 1.20220623.0) - - abseil/strings/str_format (= 1.20220623.0) - - abseil/strings/strings (= 1.20220623.0) - - abseil/synchronization/synchronization (= 1.20220623.0) - - abseil/time/time (= 1.20220623.0) - - abseil/types/optional (= 1.20220623.0) - - abseil/types/span (= 1.20220623.0) - - abseil/types/variant (= 1.20220623.0) - - abseil/utility/utility (= 1.20220623.0) - - BoringSSL-GRPC (= 0.0.24) - - gRPC-Core/Interface (= 1.49.1) - - gRPC-Core/Interface (1.49.1) - - GTMSessionFetcher/Core (3.3.1) + - GoogleUtilities/Privacy + - GTMSessionFetcher/Core (3.3.2) - leveldb-library (1.22.4) - nanopb (2.30909.1): - nanopb/decode (= 2.30909.1) @@ -781,24 +94,25 @@ DEPENDENCIES: - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `10.20.0`) - Flutter (from `Flutter`) SPEC REPOS: trunk: - - abseil - - BoringSSL-GRPC - Firebase - FirebaseAppCheckInterop - FirebaseAuth - FirebaseCore - FirebaseCoreExtension - FirebaseCoreInternal - - FirebaseFirestore - - FirebaseFirestoreInternal + - FirebaseFirestoreAbseilBinary + - FirebaseFirestoreBinary + - FirebaseFirestoreGRPCBoringSSLBinary + - FirebaseFirestoreGRPCCoreBinary + - FirebaseFirestoreGRPCCPPBinary + - FirebaseFirestoreInternalBinary - FirebaseSharedSwift - GoogleUtilities - - "gRPC-C++" - - gRPC-Core - GTMSessionFetcher - leveldb-library - nanopb @@ -812,34 +126,43 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_auth/ios" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" + FirebaseFirestore: + :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git + :tag: 10.20.0 Flutter: :path: Flutter +CHECKOUT OPTIONS: + FirebaseFirestore: + :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git + :tag: 10.20.0 + SPEC CHECKSUMS: - abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46 - BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 cloud_firestore: 0f0bca4953963272e2d8cf6f15e7adce3c10b7f7 Firebase: 10c8cb12fb7ad2ae0c09ffc86cd9c1ab392a0031 firebase_auth: 7351d07504173efaf1fb31fe3ffb73b2c521eae0 firebase_core: c8628c7ce80f79439149549052bff22f6784fbf5 - FirebaseAppCheckInterop: 69fc7d8f6a1cbfa973efb8d1723651de30d12525 + FirebaseAppCheckInterop: a1955ce8c30f38f87e7d091630e871e91154d65d FirebaseAuth: 9c5c400d2c3055d8ae3a0284944c86fa95d48dac FirebaseCore: 28045c1560a2600d284b9c45a904fe322dc890b6 - FirebaseCoreExtension: 1c044fd46e95036cccb29134757c499613f3f564 - FirebaseCoreInternal: 43c1788eaeee9d1b97caaa751af567ce11010d00 - FirebaseFirestore: 21be9ea244830f6cac15464550c2975c43f9dffc - FirebaseFirestoreInternal: 7ac1e0c5b4e75aeb898dfe4b1d6d77abbac9eca3 - FirebaseSharedSwift: 19b3f709993d6fa1d84941d41c01e3c4c11eab93 + FirebaseCoreExtension: 0659f035b88c5a7a15a9763c48c2e6ca8c0a2977 + FirebaseCoreInternal: 6a292e6f0bece1243a737e81556e56e5e19282e3 + FirebaseFirestore: 979ccf1f44df221a762841e9fa10c653151e941d + FirebaseFirestoreAbseilBinary: fc2004a2da6b5978e974ca49c2e463f5e542a78f + FirebaseFirestoreBinary: 2c0e90804b11110efbac1338408a144c7928b347 + FirebaseFirestoreGRPCBoringSSLBinary: 85a615c0b7e97173d6af581c9879baac663d9743 + FirebaseFirestoreGRPCCoreBinary: bf6ed68cea8ad7b24ba091b53374e91a5211a91f + FirebaseFirestoreGRPCCPPBinary: cff111ba3ae5bea45a6562e8bd8750d4a7e2ebc6 + FirebaseFirestoreInternalBinary: fd49261dc34f45113d26d22c16d0e4ec70259b8f + FirebaseSharedSwift: 2fbf73618288b7a36b2014b957745dcdd781389e Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - "gRPC-C++": 2df8cba576898bdacd29f0266d5236fa0e26ba6a - gRPC-Core: a21a60aefc08c68c247b439a9ef97174b0c54f96 - GTMSessionFetcher: 8a1b34ad97ebe6f909fb8b9b77fba99943007556 + GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152 + GTMSessionFetcher: 0e876eea9782ec6462e91ab872711c357322c94f leveldb-library: 06a69cc7582d64b29424a63e085e683cc188230a nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 -PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 +PODFILE CHECKSUM: e628240452b7d293d6aebf94f1c2fe67662a703f COCOAPODS: 1.15.2 diff --git a/bu_passport/lib/assets/abstract.png b/bu_passport/lib/assets/abstract.png new file mode 100644 index 0000000..b4b0675 Binary files /dev/null and b/bu_passport/lib/assets/abstract.png differ diff --git a/bu_passport/lib/assets/symphony.png b/bu_passport/lib/assets/symphony.png new file mode 100644 index 0000000..4f00d39 Binary files /dev/null and b/bu_passport/lib/assets/symphony.png differ diff --git a/bu_passport/lib/auth/auth_gate.dart b/bu_passport/lib/auth/auth_gate.dart new file mode 100644 index 0000000..1c5b3cc --- /dev/null +++ b/bu_passport/lib/auth/auth_gate.dart @@ -0,0 +1,25 @@ +import 'package:bu_passport/main.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +import '../pages/navigation_page.dart'; +import '../pages/login_page.dart'; + +class AuthGate extends StatelessWidget { + const AuthGate({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return Scaffold( + body: StreamBuilder( + stream: FirebaseAuth.instance.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return const NavigationPage(); + } else { + return const LoginPage(); + } + }, + ), + ); + } +} diff --git a/bu_passport/lib/auth/main_page.dart b/bu_passport/lib/auth/main_page.dart deleted file mode 100644 index 464b60b..0000000 --- a/bu_passport/lib/auth/main_page.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; - -import '../pages/home_page.dart'; -import '../pages/login_page.dart'; - -class MainPage extends StatelessWidget { - const MainPage({Key? key}) : super(key: key); - @override - Widget build(BuildContext context) { - return Scaffold( - body: StreamBuilder( - stream: FirebaseAuth.instance.authStateChanges(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return const HomePage(); - } else { - return const LoginPage(); - } - }, - )); - } -} diff --git a/bu_passport/lib/classes/event.dart b/bu_passport/lib/classes/event.dart new file mode 100644 index 0000000..5c57999 --- /dev/null +++ b/bu_passport/lib/classes/event.dart @@ -0,0 +1,19 @@ +class Event { + final String eventId; + final String eventName; + final String eventPhoto; + final String eventLocation; + final DateTime eventTime; + final List eventTags; + final List registeredUsers; + + Event({ + required this.eventId, + required this.eventName, + required this.eventPhoto, + required this.eventLocation, + required this.eventTime, + required this.eventTags, + required this.registeredUsers, + }); +} diff --git a/bu_passport/lib/components/event_widget.dart b/bu_passport/lib/components/event_widget.dart new file mode 100644 index 0000000..b2bbd07 --- /dev/null +++ b/bu_passport/lib/components/event_widget.dart @@ -0,0 +1,70 @@ +import 'package:bu_passport/classes/event.dart'; +import 'package:bu_passport/pages/event_page.dart'; +import 'package:flutter/material.dart'; + +class EventWidget extends StatefulWidget { + final Event event; + const EventWidget({Key? key, required this.event}) : super(key: key); + + @override + _EventWidgetState createState() => _EventWidgetState(); +} + +class _EventWidgetState extends State { + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.02); + double edgeInsets = (MediaQuery.of(context).size.width * 0.02); + return GestureDetector( + onTap: () { + // Navigate to the event page + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => EventPage(event: widget.event), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(edgeInsets), + child: Stack( + children: [ + // Background image + Image.network( + widget.event.eventPhoto, + width: double.infinity, // Use full width + fit: BoxFit.cover, // Cover the container with the image + ), + // Texts overlaid on the image + Positioned( + bottom: 16.0, + left: 16.0, + right: 16.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.event.eventName, + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + color: Colors.white, // Text color on top of the image + ), + ), + SizedBox(height: sizedBoxHeight), + Text( + '${widget.event.eventLocation}', + style: TextStyle(fontSize: 16.0, color: Colors.white), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/bu_passport/lib/main.dart b/bu_passport/lib/main.dart index 91d5873..e3aa2fc 100644 --- a/bu_passport/lib/main.dart +++ b/bu_passport/lib/main.dart @@ -1,17 +1,20 @@ import 'package:bu_passport/firebase_options.dart'; +import 'package:bu_passport/pages/navigation_page.dart'; import 'package:bu_passport/pages/login_page.dart'; +import 'package:bu_passport/pages/calendar_page.dart'; +import 'package:bu_passport/pages/profile_page.dart'; import 'package:bu_passport/pages/signup_page.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'auth/main_page.dart'; +import 'auth/auth_gate.dart'; -Future main() async { +void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); - runApp(const MyApp()); + runApp(MyApp()); } class MyApp extends StatelessWidget { @@ -23,11 +26,10 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.green, ), - home: const MainPage(), + home: const AuthGate(), routes: { '/login': (context) => const LoginPage(), '/signup': (context) => const SignUpPage(), - '/home': (context) => const MainPage(), }, ); } diff --git a/bu_passport/lib/pages/calendar_page.dart b/bu_passport/lib/pages/calendar_page.dart new file mode 100644 index 0000000..f1a4646 --- /dev/null +++ b/bu_passport/lib/pages/calendar_page.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:table_calendar/table_calendar.dart'; + +class CalendarPage extends StatefulWidget { + const CalendarPage({Key? key}) : super(key: key); + + @override + _CalendarPageState createState() => _CalendarPageState(); +} + +class _CalendarPageState extends State { + late CalendarFormat _calendarFormat; + late DateTime _focusedDay; + late DateTime _selectedDay; + + @override + void initState() { + super.initState(); + _calendarFormat = CalendarFormat.month; + _focusedDay = DateTime.now(); + _selectedDay = DateTime.now(); + } + + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.05); + return Scaffold( + appBar: AppBar( + title: Text('Calendar'), + ), + body: Column( + children: [ + TableCalendar( + calendarFormat: _calendarFormat, + focusedDay: _focusedDay, + firstDay: DateTime.utc(2020, 1, 1), + lastDay: DateTime.utc(2030, 12, 31), + startingDayOfWeek: StartingDayOfWeek.sunday, + selectedDayPredicate: (day) { + return isSameDay(_selectedDay, day); + }, + onFormatChanged: (format) { + setState(() { + _calendarFormat = format; + }); + }, + onDaySelected: (selectedDay, focusedDay) { + setState(() { + _selectedDay = selectedDay; + _focusedDay = focusedDay; + }); + }, + ), + SizedBox(height: sizedBoxHeight), + Text( + 'Selected Day: $_selectedDay', + style: TextStyle(fontSize: 20), + ), + ], + ), + ); + } +} diff --git a/bu_passport/lib/pages/event_page.dart b/bu_passport/lib/pages/event_page.dart new file mode 100644 index 0000000..3916efc --- /dev/null +++ b/bu_passport/lib/pages/event_page.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:bu_passport/classes/event.dart'; + +class EventPage extends StatefulWidget { + final Event event; + + const EventPage({Key? key, required this.event}) : super(key: key); + + @override + _EventPageState createState() => _EventPageState(); +} + +class _EventPageState extends State { + bool _isRegistered = + false; // Track whether the user is registered for the event + + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.02); + double edgeInsets = (MediaQuery.of(context).size.width * 0.02); + + return Scaffold( + appBar: AppBar( + title: Text(widget.event.eventName), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Image.network( + widget.event.eventPhoto, + ), + ), + Expanded( + flex: 1, + child: Padding( + padding: EdgeInsets.all(edgeInsets), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.event.eventName, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: sizedBoxHeight), + Text( + 'Location: ${widget.event.eventLocation}', + style: TextStyle(fontSize: 16), + ), + SizedBox(height: sizedBoxHeight), + Text( + 'Time: ${widget.event.eventTime.toString()}', + style: TextStyle(fontSize: 16), + ), + // Add more event details as needed + ], + ), + ), + ), + Padding( + padding: EdgeInsets.all(edgeInsets), + child: ElevatedButton( + onPressed: () { + setState(() { + _isRegistered = !_isRegistered; // Toggle registration status + }); + }, + child: Text(_isRegistered ? 'Unregister' : 'Register'), + ), + ), + ], + ), + ); + } +} diff --git a/bu_passport/lib/pages/explore_page.dart b/bu_passport/lib/pages/explore_page.dart new file mode 100644 index 0000000..c96e442 --- /dev/null +++ b/bu_passport/lib/pages/explore_page.dart @@ -0,0 +1,94 @@ +// home page welcoming user with sign out button + +import 'package:bu_passport/classes/event.dart'; +import 'package:bu_passport/components/event_widget.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:bu_passport/services/firebase_service.dart'; + +class ExplorePage extends StatefulWidget { + const ExplorePage({Key? key}) : super(key: key); + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + final user = FirebaseAuth.instance.currentUser!; + final db = FirebaseFirestore.instance; + List eventList = []; // List to store events data + String _searchQuery = ''; + late Future> fetchEventsFuture; + int _selectedIndex = 0; + + @override + void initState() { + super.initState(); + fetchEventsFuture = FirebaseService.fetchEvents(); + } + + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.05); + + return Scaffold( + body: Center( + child: ListView( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: sizedBoxHeight), + Text( + 'Events', + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: sizedBoxHeight), + // Search bar + TextField( + onChanged: (value) { + setState(() { + _searchQuery = value; // Update search query + }); + }, + decoration: InputDecoration( + hintText: 'Search events...', + prefixIcon: Icon(Icons.search), + ), + ), + FutureBuilder>( + future: fetchEventsFuture, // Call fetchEvents() to get events + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return CircularProgressIndicator(); // Show loading indicator while fetching events + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + // If events are fetched successfully, display them + List? events = snapshot.data; + if (events != null && events.isNotEmpty) { + List filteredEvents = + FirebaseService.filterEvents(events, _searchQuery); + return ListView( + shrinkWrap: true, + physics: ClampingScrollPhysics(), + children: filteredEvents.map((event) { + return EventWidget(event: event); + }).toList(), + ); + } else { + return Text('No events found'); + } + } + }, + ), + ], + ), + ), + ); + } +} diff --git a/bu_passport/lib/pages/home_page.dart b/bu_passport/lib/pages/home_page.dart deleted file mode 100644 index 9f76c7a..0000000 --- a/bu_passport/lib/pages/home_page.dart +++ /dev/null @@ -1,34 +0,0 @@ -// home page welcoming user with sign out button - -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; - -class HomePage extends StatefulWidget { - const HomePage({Key? key}) : super(key: key); - @override - State createState() => _HomePageState(); -} - -class _HomePageState extends State { - final user = FirebaseAuth.instance.currentUser!; - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Welcome ${user.email!}'), - const SizedBox(height: 20), - ElevatedButton( - onPressed: () async { - await FirebaseAuth.instance.signOut(); - }, - child: const Text('Sign Out'), - ), - ], - ), - ), - ); - } -} diff --git a/bu_passport/lib/pages/login_page.dart b/bu_passport/lib/pages/login_page.dart index bd026d3..7eaaf6b 100644 --- a/bu_passport/lib/pages/login_page.dart +++ b/bu_passport/lib/pages/login_page.dart @@ -1,3 +1,4 @@ +import 'package:bu_passport/pages/signup_page.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -14,15 +15,18 @@ class _LoginPageState extends State { @override Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.05); + double edgeInsets = (MediaQuery.of(context).size.width * 0.02); + return MaterialApp( debugShowCheckedModeBanner: false, - theme: ThemeData( - primarySwatch: Colors.red, - ), home: Scaffold( body: Center( child: Padding( - padding: const EdgeInsets.all(20.0), + padding: EdgeInsets.all(edgeInsets), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -32,7 +36,7 @@ class _LoginPageState extends State { labelText: 'Email', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _passwordController, decoration: const InputDecoration( @@ -40,7 +44,7 @@ class _LoginPageState extends State { ), obscureText: true, ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), ElevatedButton( onPressed: () { // Implement your sign-in logic here @@ -54,7 +58,7 @@ class _LoginPageState extends State { }, child: const Text('Sign In'), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -62,7 +66,12 @@ class _LoginPageState extends State { TextButton( onPressed: () { // Navigate to sign up page - Navigator.pushNamed(context, '/signup'); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SignUpPage(), + ), + ); }, child: const Text('Sign Up'), ), diff --git a/bu_passport/lib/pages/navigation_page.dart b/bu_passport/lib/pages/navigation_page.dart new file mode 100644 index 0000000..d7b4c32 --- /dev/null +++ b/bu_passport/lib/pages/navigation_page.dart @@ -0,0 +1,68 @@ +import 'package:bu_passport/pages/explore_page.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'calendar_page.dart'; +import 'profile_page.dart'; + +class NavigationPage extends StatelessWidget { + const NavigationPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: NavigationPageContent(), + ); + } +} + +class NavigationPageContent extends StatefulWidget { + const NavigationPageContent({Key? key}) : super(key: key); + + @override + _NavigationPageContentState createState() => _NavigationPageContentState(); +} + +class _NavigationPageContentState extends State { + final user = FirebaseAuth.instance.currentUser!; + int _selectedIndex = 0; + + static const List _pages = [ + ExplorePage(), + CalendarPage(), + ProfilePage(), + ]; + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: _pages[_selectedIndex], + ), + bottomNavigationBar: BottomNavigationBar( + currentIndex: _selectedIndex, + onTap: _onItemTapped, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.search), + label: 'Events', + ), + BottomNavigationBarItem( + icon: Icon(Icons.calendar_today), + label: 'Calendar', + ), + BottomNavigationBarItem( + icon: Icon(Icons.person), + label: 'Profile', + ), + ], + ), + ); + } +} diff --git a/bu_passport/lib/pages/profile_page.dart b/bu_passport/lib/pages/profile_page.dart new file mode 100644 index 0000000..f1010e3 --- /dev/null +++ b/bu_passport/lib/pages/profile_page.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +class ProfilePage extends StatelessWidget { + const ProfilePage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Profile'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleAvatar( + radius: 50, + backgroundImage: AssetImage(''), + ), + SizedBox(height: 20), + Text( + 'John Doe', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 10), + Text( + 'john.doe@example.com', + style: TextStyle( + fontSize: 18, + color: Colors.grey, + ), + ), + SizedBox(height: 20), + ElevatedButton( + onPressed: () { + // Add action to edit profile + }, + child: Text('Edit Profile'), + ), + ], + ), + ), + ); + } +} diff --git a/bu_passport/lib/pages/signup_page.dart b/bu_passport/lib/pages/signup_page.dart index 7da13d7..5668ca6 100644 --- a/bu_passport/lib/pages/signup_page.dart +++ b/bu_passport/lib/pages/signup_page.dart @@ -18,78 +18,67 @@ class _SignUpPageState extends State { TextEditingController _userSchool = TextEditingController(); TextEditingController _userYear = TextEditingController(); - // Subject to change schools and years - - final List schools = [ - 'CAS', - 'COM', - 'CFA', - 'CEIT', - 'COS', - 'COE', - 'COB', - 'CBA', - 'CON', - 'CIT', - 'COT', - 'COP' - ]; - final List years = ['1', '2', '3', '4', '5']; - final db = FirebaseFirestore.instance; @override Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + double screenHeight = MediaQuery.of(context).size.height; + + double sizedBoxHeight = (MediaQuery.of(context).size.height * 0.05); + double edgeInsets = (MediaQuery.of(context).size.width * 0.02); + return Scaffold( + appBar: AppBar(), body: Center( child: Padding( - padding: const EdgeInsets.all(20.0), + padding: EdgeInsets.all(edgeInsets), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _firstNameController, // Controller for first name decoration: const InputDecoration( labelText: 'First Name', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _lastNameController, // Controller for last name decoration: const InputDecoration( labelText: 'Last Name', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _emailController, decoration: const InputDecoration( labelText: 'Email', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _buIDController, decoration: const InputDecoration( labelText: 'BU ID', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _userSchool, decoration: const InputDecoration( labelText: 'School', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _userYear, decoration: const InputDecoration( labelText: 'Year', ), ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), TextField( controller: _passwordController, decoration: const InputDecoration( @@ -97,7 +86,7 @@ class _SignUpPageState extends State { ), obscureText: true, ), - const SizedBox(height: 20), + SizedBox(height: sizedBoxHeight), ElevatedButton( onPressed: () async { String email = _emailController.text; diff --git a/bu_passport/lib/services/firebase_service.dart b/bu_passport/lib/services/firebase_service.dart new file mode 100644 index 0000000..94184c8 --- /dev/null +++ b/bu_passport/lib/services/firebase_service.dart @@ -0,0 +1,40 @@ +import 'package:bu_passport/classes/event.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; + + +class FirebaseService { + static Future> fetchEvents() async { + final db = FirebaseFirestore.instance; + List eventList = []; + + try { + QuerySnapshot snapshot = await db.collection('events').get(); + snapshot.docs.forEach((doc) { + final eventData = doc.data() as Map; + Event event = Event( + eventId: doc.id, + eventName: eventData['eventName'], + eventPhoto: eventData['eventPhoto'], + eventLocation: eventData['eventLocation'], + eventTime: (eventData['eventTime'] as Timestamp).toDate(), + eventTags: List.from(eventData['eventTags'] ?? []), + registeredUsers: List.from(eventData['registeredUsers'] ?? []), + ); + eventList.add(event); + }); + return eventList; + } catch (error) { + print("Failed to fetch events: $error"); + return []; + } + } + + static List filterEvents(List events, String query) { + if (query.isEmpty) { + return events; + } + return events.where((event) { + return event.eventName.toLowerCase().contains(query.toLowerCase()); + }).toList(); + } +} diff --git a/bu_passport/pubspec.lock b/bu_passport/pubspec.lock index 6af4ddb..681264c 100644 --- a/bu_passport/pubspec.lock +++ b/bu_passport/pubspec.lock @@ -168,6 +168,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" js: dependency: transitive description: @@ -248,6 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + simple_gesture_detector: + dependency: transitive + description: + name: simple_gesture_detector + sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 + url: "https://pub.dev" + source: hosted + version: "0.2.1" sky_engine: dependency: transitive description: flutter @@ -285,6 +301,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + table_calendar: + dependency: "direct main" + description: + name: table_calendar + sha256: "3f7950145168251aad4fa6c0a914b5ef4e9a82fa365bb349c3ac5378f866e771" + url: "https://pub.dev" + source: hosted + version: "3.1.0" term_glyph: dependency: transitive description: diff --git a/bu_passport/pubspec.yaml b/bu_passport/pubspec.yaml index 1ea6e62..4464cc4 100644 --- a/bu_passport/pubspec.yaml +++ b/bu_passport/pubspec.yaml @@ -38,6 +38,7 @@ dependencies: firebase_core: ^2.25.4 firebase_auth: ^4.17.5 cloud_firestore: ^4.15.6 + table_calendar: ^3.1.0 dev_dependencies: flutter_test: diff --git a/passportArchitecture.png b/passportArchitecture.png new file mode 100644 index 0000000..fbbaa45 Binary files /dev/null and b/passportArchitecture.png differ