Compare commits
145 Commits
AD_LDE_EKA
...
master
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 844 KiB |
@ -0,0 +1,5 @@
|
||||
{
|
||||
"projects": {
|
||||
"default": "justmusic-435d5"
|
||||
}
|
||||
}
|
@ -1,30 +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.
|
||||
|
||||
version:
|
||||
revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
|
||||
base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
|
||||
- platform: android
|
||||
create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
|
||||
base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
|
||||
|
||||
# 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'
|
||||
# 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: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: android
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: ios
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: linux
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: macos
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: web
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
- platform: windows
|
||||
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
|
||||
|
||||
# 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'
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.justmusic
|
||||
package com.justdev.justmusic
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 983 B |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 9.2 KiB |
@ -0,0 +1,17 @@
|
||||
{
|
||||
"hosting": {
|
||||
"site": "justmusic-435d5",
|
||||
"public": "build/web",
|
||||
"ignore": [
|
||||
"firebase.json",
|
||||
"**/.*",
|
||||
"**/node_modules/**"
|
||||
],
|
||||
"rewrites": [
|
||||
{
|
||||
"source": "**",
|
||||
"destination": "/index.html"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -1 +1,2 @@
|
||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||
#include "Generated.xcconfig"
|
||||
|
@ -1 +1,2 @@
|
||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||
#include "Generated.xcconfig"
|
||||
|
@ -0,0 +1,44 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
platform :ios, '11.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
project 'Runner', {
|
||||
'Debug' => :debug,
|
||||
'Profile' => :release,
|
||||
'Release' => :release,
|
||||
}
|
||||
|
||||
def flutter_root
|
||||
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
|
||||
unless File.exist?(generated_xcode_build_settings_path)
|
||||
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
|
||||
end
|
||||
|
||||
File.foreach(generated_xcode_build_settings_path) do |line|
|
||||
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
||||
return matches[1].strip if matches
|
||||
end
|
||||
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
|
||||
end
|
||||
|
||||
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
||||
|
||||
flutter_ios_podfile_setup
|
||||
|
||||
target 'Runner' do
|
||||
use_frameworks!
|
||||
use_modular_headers!
|
||||
|
||||
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
||||
target 'RunnerTests' do
|
||||
inherit! :search_paths
|
||||
end
|
||||
end
|
||||
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
flutter_additional_ios_build_settings(target)
|
||||
end
|
||||
end
|
@ -0,0 +1,958 @@
|
||||
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
|
||||
- AppAuth (1.6.2):
|
||||
- AppAuth/Core (= 1.6.2)
|
||||
- AppAuth/ExternalUserAgent (= 1.6.2)
|
||||
- AppAuth/Core (1.6.2)
|
||||
- AppAuth/ExternalUserAgent (1.6.2):
|
||||
- AppAuth/Core
|
||||
- audioplayers_darwin (0.0.1):
|
||||
- Flutter
|
||||
- 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.8.4):
|
||||
- Firebase/Firestore (= 10.12.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- Firebase/Auth (10.12.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAuth (~> 10.12.0)
|
||||
- Firebase/CoreOnly (10.12.0):
|
||||
- FirebaseCore (= 10.12.0)
|
||||
- Firebase/Firestore (10.12.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseFirestore (~> 10.12.0)
|
||||
- Firebase/Messaging (10.12.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseMessaging (~> 10.12.0)
|
||||
- Firebase/Storage (10.12.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseStorage (~> 10.12.0)
|
||||
- firebase_auth (4.7.2):
|
||||
- Firebase/Auth (= 10.12.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (2.15.0):
|
||||
- Firebase/CoreOnly (= 10.12.0)
|
||||
- Flutter
|
||||
- firebase_messaging (14.6.5):
|
||||
- Firebase/Messaging (= 10.12.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_storage (11.2.5):
|
||||
- Firebase/Storage (= 10.12.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseAppCheckInterop (10.14.0)
|
||||
- FirebaseAuth (10.12.0):
|
||||
- FirebaseAppCheckInterop (~> 10.0)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
|
||||
- FirebaseAuthInterop (10.14.0)
|
||||
- FirebaseCore (10.12.0):
|
||||
- FirebaseCoreInternal (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/Logger (~> 7.8)
|
||||
- FirebaseCoreExtension (10.14.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseCoreInternal (10.14.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
||||
- FirebaseFirestore (10.12.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)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- "gRPC-C++ (~> 1.50.1)"
|
||||
- leveldb-library (~> 1.22)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- FirebaseInstallations (10.14.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||
- PromisesObjC (~> 2.1)
|
||||
- FirebaseMessaging (10.12.0):
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseInstallations (~> 10.0)
|
||||
- GoogleDataTransport (~> 9.2)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GoogleUtilities/Reachability (~> 7.8)
|
||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- FirebaseStorage (10.12.0):
|
||||
- FirebaseAppCheckInterop (~> 10.0)
|
||||
- FirebaseAuthInterop (~> 10.0)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- FirebaseCoreExtension (~> 10.0)
|
||||
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
|
||||
- Flutter (1.0.0)
|
||||
- flutter_keyboard_visibility (0.0.1):
|
||||
- Flutter
|
||||
- FMDB (2.7.5):
|
||||
- FMDB/standard (= 2.7.5)
|
||||
- FMDB/standard (2.7.5)
|
||||
- geolocator_apple (1.2.0):
|
||||
- Flutter
|
||||
- google_sign_in_ios (0.0.1):
|
||||
- Flutter
|
||||
- GoogleSignIn (~> 6.2)
|
||||
- GoogleDataTransport (9.2.5):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleSignIn (6.2.4):
|
||||
- AppAuth (~> 1.5)
|
||||
- GTMAppAuth (~> 1.3)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.11.5):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (7.11.5):
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.11.5):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Network (7.11.5):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.11.5)"
|
||||
- GoogleUtilities/Reachability (7.11.5):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/UserDefaults (7.11.5):
|
||||
- GoogleUtilities/Logger
|
||||
- "gRPC-C++ (1.50.1)":
|
||||
- "gRPC-C++/Implementation (= 1.50.1)"
|
||||
- "gRPC-C++/Interface (= 1.50.1)"
|
||||
- "gRPC-C++/Implementation (1.50.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.50.1)"
|
||||
- gRPC-Core (= 1.50.1)
|
||||
- "gRPC-C++/Interface (1.50.1)"
|
||||
- gRPC-Core (1.50.1):
|
||||
- gRPC-Core/Implementation (= 1.50.1)
|
||||
- gRPC-Core/Interface (= 1.50.1)
|
||||
- gRPC-Core/Implementation (1.50.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.50.1)
|
||||
- gRPC-Core/Interface (1.50.1)
|
||||
- GTMAppAuth (1.3.1):
|
||||
- AppAuth/Core (~> 1.6)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
|
||||
- GTMSessionFetcher/Core (2.3.0)
|
||||
- image_picker_ios (0.0.1):
|
||||
- Flutter
|
||||
- leveldb-library (1.22.2)
|
||||
- nanopb (2.30909.0):
|
||||
- nanopb/decode (= 2.30909.0)
|
||||
- nanopb/encode (= 2.30909.0)
|
||||
- nanopb/decode (2.30909.0)
|
||||
- nanopb/encode (2.30909.0)
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- PromisesObjC (2.3.1)
|
||||
- sqflite (0.0.3):
|
||||
- Flutter
|
||||
- FMDB (>= 2.7.5)
|
||||
|
||||
DEPENDENCIES:
|
||||
- audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`)
|
||||
- cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)
|
||||
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
|
||||
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
||||
- firebase_storage (from `.symlinks/plugins/firebase_storage/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
|
||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
|
||||
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`)
|
||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- abseil
|
||||
- AppAuth
|
||||
- BoringSSL-GRPC
|
||||
- Firebase
|
||||
- FirebaseAppCheckInterop
|
||||
- FirebaseAuth
|
||||
- FirebaseAuthInterop
|
||||
- FirebaseCore
|
||||
- FirebaseCoreExtension
|
||||
- FirebaseCoreInternal
|
||||
- FirebaseFirestore
|
||||
- FirebaseInstallations
|
||||
- FirebaseMessaging
|
||||
- FirebaseStorage
|
||||
- FMDB
|
||||
- GoogleDataTransport
|
||||
- GoogleSignIn
|
||||
- GoogleUtilities
|
||||
- "gRPC-C++"
|
||||
- gRPC-Core
|
||||
- GTMAppAuth
|
||||
- GTMSessionFetcher
|
||||
- leveldb-library
|
||||
- nanopb
|
||||
- PromisesObjC
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
audioplayers_darwin:
|
||||
:path: ".symlinks/plugins/audioplayers_darwin/ios"
|
||||
cloud_firestore:
|
||||
:path: ".symlinks/plugins/cloud_firestore/ios"
|
||||
firebase_auth:
|
||||
:path: ".symlinks/plugins/firebase_auth/ios"
|
||||
firebase_core:
|
||||
:path: ".symlinks/plugins/firebase_core/ios"
|
||||
firebase_messaging:
|
||||
:path: ".symlinks/plugins/firebase_messaging/ios"
|
||||
firebase_storage:
|
||||
:path: ".symlinks/plugins/firebase_storage/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_keyboard_visibility:
|
||||
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
|
||||
geolocator_apple:
|
||||
:path: ".symlinks/plugins/geolocator_apple/ios"
|
||||
google_sign_in_ios:
|
||||
:path: ".symlinks/plugins/google_sign_in_ios/ios"
|
||||
image_picker_ios:
|
||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||
sqflite:
|
||||
:path: ".symlinks/plugins/sqflite/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46
|
||||
AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570
|
||||
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
|
||||
BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33
|
||||
cloud_firestore: 005e157ad342dbfb2e461cb111a9020aa71bfb22
|
||||
Firebase: 07150e75d142fb9399f6777fa56a187b17f833a0
|
||||
firebase_auth: 3f7820b22557dd4a1b024f4d86947d1a0ff8a10f
|
||||
firebase_core: e477125798fc37cd4ab43ca6a8536bf7e0929c00
|
||||
firebase_messaging: 334d68c3a36b6d4d5cd91e4f42509e0d4ae49828
|
||||
firebase_storage: d5c1b95383db1230d9fed88c76cb257d8d1ec1d6
|
||||
FirebaseAppCheckInterop: c87f1d5421c852413dd936b2b2340b21e62501a0
|
||||
FirebaseAuth: a66c1e14ec58f41d154a4b41ce1a23ea00ad4805
|
||||
FirebaseAuthInterop: 23be77be1ca68e4bd15214f403f807a6ca70d7e0
|
||||
FirebaseCore: f86a1394906b97ac445ae49c92552a9425831bed
|
||||
FirebaseCoreExtension: 976638051b1a46b503afce7ec80277f9161f2040
|
||||
FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3
|
||||
FirebaseFirestore: f94c9541515fa4a49af52269bbc50349009424b4
|
||||
FirebaseInstallations: f672b1eda64e6381c21d424a2f680a943fd83f3b
|
||||
FirebaseMessaging: bb2c4f6422a753038fe137d90ae7c1af57251316
|
||||
FirebaseStorage: 1d7ca8c8953fc61ccacaa7c612696b5402968a0d
|
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
geolocator_apple: cc556e6844d508c95df1e87e3ea6fa4e58c50401
|
||||
google_sign_in_ios: 1256ff9d941db546373826966720b0c24804bcdd
|
||||
GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
|
||||
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
|
||||
GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084
|
||||
"gRPC-C++": 0968bace703459fd3e5dcb0b2bed4c573dbff046
|
||||
gRPC-Core: 17108291d84332196d3c8466b48f016fc17d816d
|
||||
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
|
||||
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
|
||||
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
|
||||
leveldb-library: f03246171cce0484482ec291f88b6d563699ee06
|
||||
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
|
||||
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
|
||||
PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
|
||||
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
|
||||
|
||||
PODFILE CHECKSUM: 6b9eb94e9f98a329f2ef624b852a6e42d090af2b
|
||||
|
||||
COCOAPODS: 1.14.3
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 564 B After Width: | Height: | Size: 421 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 729 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 8.6 KiB |
@ -1,34 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CLIENT_ID</key>
|
||||
<string>994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf.apps.googleusercontent.com</string>
|
||||
<key>REVERSED_CLIENT_ID</key>
|
||||
<string>com.googleusercontent.apps.994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf</string>
|
||||
<key>API_KEY</key>
|
||||
<string>AIzaSyBbYqsR6t7JTi8_XFNEHd43IRuKlYGeI3U</string>
|
||||
<key>GCM_SENDER_ID</key>
|
||||
<string>994903990520</string>
|
||||
<key>PLIST_VERSION</key>
|
||||
<string>1</string>
|
||||
<key>BUNDLE_ID</key>
|
||||
<string>com.example.justmusic</string>
|
||||
<key>PROJECT_ID</key>
|
||||
<string>justmusic-435d5</string>
|
||||
<key>STORAGE_BUCKET</key>
|
||||
<string>justmusic-435d5.appspot.com</string>
|
||||
<key>IS_ADS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_ANALYTICS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_APPINVITE_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_GCM_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_SIGNIN_ENABLED</key>
|
||||
<true></true>
|
||||
<key>GOOGLE_APP_ID</key>
|
||||
<string>1:994903990520:ios:93188f32e320babe0a9b0d</string>
|
||||
</dict>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CLIENT_ID</key>
|
||||
<string>994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf.apps.googleusercontent.com</string>
|
||||
<key>REVERSED_CLIENT_ID</key>
|
||||
<string>com.googleusercontent.apps.994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf</string>
|
||||
<key>ANDROID_CLIENT_ID</key>
|
||||
<string>994903990520-073l30b0afj0uq7apsvc8p8ukantpu6q.apps.googleusercontent.com</string>
|
||||
<key>API_KEY</key>
|
||||
<string>AIzaSyBbYqsR6t7JTi8_XFNEHd43IRuKlYGeI3U</string>
|
||||
<key>GCM_SENDER_ID</key>
|
||||
<string>994903990520</string>
|
||||
<key>PLIST_VERSION</key>
|
||||
<string>1</string>
|
||||
<key>BUNDLE_ID</key>
|
||||
<string>com.example.justmusic</string>
|
||||
<key>PROJECT_ID</key>
|
||||
<string>justmusic-435d5</string>
|
||||
<key>STORAGE_BUCKET</key>
|
||||
<string>justmusic-435d5.appspot.com</string>
|
||||
<key>IS_ADS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_ANALYTICS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_APPINVITE_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_GCM_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_SIGNIN_ENABLED</key>
|
||||
<true></true>
|
||||
<key>GOOGLE_APP_ID</key>
|
||||
<string>1:994903990520:ios:93188f32e320babe0a9b0d</string>
|
||||
</dict>
|
||||
</plist>
|
@ -0,0 +1,12 @@
|
||||
import Flutter
|
||||
import UIKit
|
||||
import XCTest
|
||||
|
||||
class RunnerTests: XCTestCase {
|
||||
|
||||
func testExample() {
|
||||
// If you add code to the Runner application, consider adding tests here.
|
||||
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
{
|
||||
"file_generated_by": "FlutterFire CLI",
|
||||
"purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
|
||||
"GOOGLE_APP_ID": "1:994903990520:ios:93188f32e320babe0a9b0d",
|
||||
"FIREBASE_PROJECT_ID": "justmusic-435d5",
|
||||
"GCM_SENDER_ID": "994903990520"
|
||||
}
|
@ -0,0 +1,105 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/main.dart';
|
||||
import 'package:justmusic/values/constants.dart';
|
||||
import 'package:tuple/tuple.dart';
|
||||
|
||||
import '../model/Music.dart';
|
||||
|
||||
class HistoricComponent extends StatefulWidget {
|
||||
final int month;
|
||||
final int year;
|
||||
const HistoricComponent({super.key, required this.month, required this.year});
|
||||
|
||||
@override
|
||||
State<HistoricComponent> createState() => _HistoricComponentState();
|
||||
}
|
||||
|
||||
class _HistoricComponentState extends State<HistoricComponent> {
|
||||
int getNumberOfDaysInMonth(int year, int month) {
|
||||
if (month < 1 || month > 12) {
|
||||
throw ArgumentError("Le numéro de mois doit être compris entre 1 et 12.");
|
||||
}
|
||||
|
||||
return DateTime(year, month + 1, 0).day;
|
||||
}
|
||||
|
||||
getHistoric() {}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return FutureBuilder(
|
||||
future: MyApp.musicViewModel
|
||||
.getHistoryCapsulesMonthWhitIdUser(MyApp.userViewModel.userCurrent.id, widget.month, widget.year),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return Container(
|
||||
constraints: const BoxConstraints( maxWidth: 600),
|
||||
child: Wrap(
|
||||
spacing: 14,
|
||||
runSpacing: 14,
|
||||
children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) {
|
||||
Tuple2<int, Music>? checkCapsule;
|
||||
if (snapshot.data != null) {
|
||||
for (var element in snapshot.data!) {
|
||||
if (element.item1 == index + 1) {
|
||||
checkCapsule = element;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) ||
|
||||
(widget.year == DateTime.now().year &&
|
||||
widget.month == DateTime.now().month &&
|
||||
index > DateTime.now().day)) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(colors: [
|
||||
Color(0xFF1E1E1E).withOpacity(0.7),
|
||||
Color(0xFF1E1E1E).withOpacity(0),
|
||||
], begin: Alignment.topCenter, end: Alignment.bottomCenter),
|
||||
borderRadius: BorderRadius.circular(5)),
|
||||
height: 60,
|
||||
width: 60,
|
||||
);
|
||||
}
|
||||
if (checkCapsule != null) {
|
||||
return Tooltip(
|
||||
message: "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}".length < 30? "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}": "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}".substring(0,30)+"...",
|
||||
decoration: const BoxDecoration(
|
||||
border: Border.fromBorderSide(BorderSide(color: Color(0xFF3A3A3A), width: 1)),
|
||||
color: tooltipBackground, borderRadius: BorderRadius.all(Radius.circular(20))
|
||||
),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(image: NetworkImage((checkCapsule.item2.cover)!)),
|
||||
borderRadius: BorderRadius.circular(5)),
|
||||
height: 60,
|
||||
width: 60,
|
||||
));
|
||||
} else {
|
||||
return Container(
|
||||
color: bgColor,
|
||||
height: 60,
|
||||
width: 60,
|
||||
child: Center(
|
||||
child: Text(
|
||||
(index + 1).toString(),
|
||||
style:
|
||||
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Generate widgets
|
||||
}),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return CupertinoActivityIndicator();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,242 +1,254 @@
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:gradient_borders/box_borders/gradient_box_border.dart';
|
||||
import 'package:justmusic/components/profil_picture_component.dart';
|
||||
import 'package:text_scroll/text_scroll.dart';
|
||||
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
|
||||
|
||||
import '../model/Post.dart';
|
||||
|
||||
class PostComponent extends StatefulWidget {
|
||||
final Function(Post)? callback;
|
||||
final Post post;
|
||||
final int index;
|
||||
|
||||
PostComponent({Key? key, required this.callback, required this.post, required this.index}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PostComponent> createState() => _PostComponentState();
|
||||
}
|
||||
|
||||
class _PostComponentState extends State<PostComponent> with TickerProviderStateMixin {
|
||||
bool choice = false;
|
||||
DateTime today = DateTime.now();
|
||||
|
||||
void switchChoice() {
|
||||
setState(() {
|
||||
choice = !choice;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
print("post: ${widget.post.date.toString()}");
|
||||
print("ajrd: ${DateTime.now().toString()}");
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: switchChoice,
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
ProfilPictureComponent(user: widget.post.user),
|
||||
Expanded(
|
||||
flex: 8,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(left: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
widget.post.user.pseudo,
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600),
|
||||
),
|
||||
widget.post.location.item2 != null
|
||||
? Text(
|
||||
"${widget.post.location.item1}, ${widget.post.location.item2}",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4),
|
||||
fontWeight: FontWeight.w300,
|
||||
fontSize: 13),
|
||||
)
|
||||
: Text(
|
||||
"",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4),
|
||||
fontWeight: FontWeight.w300,
|
||||
fontSize: 13),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
DateTime(today.year, today.month, today.day).isAtSameMomentAs(
|
||||
DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day))
|
||||
? Text(
|
||||
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
|
||||
)
|
||||
: Text(
|
||||
"hier, ${widget.post.date.hour}:${widget.post.date.minute}",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
ZoomTapAnimation(
|
||||
onTap: () {
|
||||
widget.callback!(widget.post);
|
||||
},
|
||||
enableLongTapRepeatEvent: false,
|
||||
longTapRepeatDuration: const Duration(milliseconds: 100),
|
||||
begin: 1.0,
|
||||
end: 0.99,
|
||||
beginDuration: const Duration(milliseconds: 70),
|
||||
endDuration: const Duration(milliseconds: 100),
|
||||
beginCurve: Curves.decelerate,
|
||||
endCurve: Curves.easeInOutSine,
|
||||
child: AspectRatio(
|
||||
aspectRatio: 1 / 1,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
// add border
|
||||
border: const GradientBoxBorder(
|
||||
gradient: LinearGradient(colors: [
|
||||
Colors.transparent,
|
||||
Color(0xFF323232),
|
||||
], begin: Alignment.topCenter, end: Alignment.bottomCenter),
|
||||
width: 2.5,
|
||||
),
|
||||
// set border radius
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(18),
|
||||
// implement image
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: widget.post.music.cover!,
|
||||
fadeInDuration: const Duration(milliseconds: 200),
|
||||
placeholder: (context, url) => Image(
|
||||
image: AssetImage("assets/images/loadingPlaceholder.gif"),
|
||||
),
|
||||
errorWidget: (context, url, error) => Icon(Icons.error),
|
||||
),
|
||||
),
|
||||
Image(
|
||||
image: AssetImage("assets/images/shadow_post.png"),
|
||||
opacity: AnimationController(vsync: this, value: 0.7),
|
||||
fit: BoxFit.fitHeight,
|
||||
width: double.infinity,
|
||||
),
|
||||
widget.post.description == null
|
||||
? Container()
|
||||
: Padding(
|
||||
padding: EdgeInsets.all(15),
|
||||
child: AutoSizeText(
|
||||
'“${widget.post.description}”',
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.sp),
|
||||
maxFontSize: 20,
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
widget.post.selfie != null
|
||||
? Positioned(
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Container(
|
||||
constraints: BoxConstraints(maxWidth: 140, maxHeight: 140),
|
||||
width: 90.sp,
|
||||
height: 90.sp,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
// add border
|
||||
border: Border.all(width: 3, color: Colors.white),
|
||||
// set border radius
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(13),
|
||||
// implement image
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: widget.post.selfie!,
|
||||
fit: BoxFit.cover,
|
||||
fadeInDuration: const Duration(milliseconds: 200),
|
||||
placeholder: (context, url) => Image(
|
||||
image: AssetImage("assets/images/loadingPlaceholder.gif"),
|
||||
),
|
||||
errorWidget: (context, url, error) => Icon(Icons.error),
|
||||
),
|
||||
),
|
||||
),
|
||||
))
|
||||
: Container(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 15),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 8,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: 2),
|
||||
child: TextScroll(
|
||||
widget.post.music.title!,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h),
|
||||
mode: TextScrollMode.endless,
|
||||
velocity: Velocity(pixelsPerSecond: Offset(50, 20)),
|
||||
pauseBetween: Duration(milliseconds: 500),
|
||||
),
|
||||
)),
|
||||
Container(width: 10),
|
||||
AutoSizeText(
|
||||
widget.post.music.date.toString(),
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h),
|
||||
textAlign: TextAlign.end,
|
||||
maxFontSize: 20,
|
||||
),
|
||||
],
|
||||
),
|
||||
TextScroll(
|
||||
widget.post.music.artists.first.name!,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
height: 1, color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h),
|
||||
mode: TextScrollMode.endless,
|
||||
pauseBetween: Duration(milliseconds: 500),
|
||||
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)));
|
||||
}
|
||||
}
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:gradient_borders/box_borders/gradient_box_border.dart';
|
||||
import 'package:justmusic/components/profil_picture_component.dart';
|
||||
import 'package:text_scroll/text_scroll.dart';
|
||||
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
|
||||
|
||||
import '../model/Post.dart';
|
||||
|
||||
class PostComponent extends StatefulWidget {
|
||||
final Function(Post)? callback;
|
||||
final Post post;
|
||||
final int index;
|
||||
|
||||
PostComponent({Key? key, required this.callback, required this.post, required this.index}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PostComponent> createState() => _PostComponentState();
|
||||
}
|
||||
|
||||
class _PostComponentState extends State<PostComponent> with TickerProviderStateMixin {
|
||||
bool choice = false;
|
||||
DateTime today = DateTime.now();
|
||||
|
||||
void switchChoice() {
|
||||
setState(() {
|
||||
choice = !choice;
|
||||
});
|
||||
}
|
||||
String formatPostDate(DateTime postDate) {
|
||||
DateTime now = DateTime.now();
|
||||
DateTime yesterday = DateTime(now.year, now.month, now.day - 1);
|
||||
|
||||
if (postDate.year == now.year && postDate.month == now.month && postDate.day == now.day) {
|
||||
// Aujourd'hui
|
||||
return "Aujourd'hui, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}";
|
||||
} else if (postDate.year == yesterday.year && postDate.month == yesterday.month && postDate.day == yesterday.day) {
|
||||
// Hier
|
||||
return 'hier, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
|
||||
} else {
|
||||
// Autre date
|
||||
return '${postDate.day} ${_getMonthAbbreviation(postDate.month)} ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
|
||||
}
|
||||
}
|
||||
|
||||
String _getMonthAbbreviation(int month) {
|
||||
const List<String> monthsAbbreviation = [
|
||||
'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.',
|
||||
];
|
||||
|
||||
return monthsAbbreviation[month - 1];
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
print("post: ${widget.post.date.toString()}");
|
||||
print("ajrd: ${DateTime.now().toString()}");
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var mins = "0";
|
||||
if (widget.post.date.minute < 10) {
|
||||
mins = "0${widget.post.date.minute}";
|
||||
} else {
|
||||
mins = widget.post.date.minute.toString();
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
onTap: switchChoice,
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
ProfilPictureComponent(user: widget.post.user),
|
||||
Expanded(
|
||||
flex: 8,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(left: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
widget.post.user.pseudo,
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600),
|
||||
),
|
||||
widget.post.location.item2 != null
|
||||
? Text(
|
||||
"${widget.post.location.item1}, ${widget.post.location.item2}",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4),
|
||||
fontWeight: FontWeight.w300,
|
||||
fontSize: 13),
|
||||
)
|
||||
: Text(
|
||||
"",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4),
|
||||
fontWeight: FontWeight.w300,
|
||||
fontSize: 13),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
formatPostDate(widget.post.date),
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
ZoomTapAnimation(
|
||||
onTap: () {
|
||||
widget.callback!(widget.post);
|
||||
},
|
||||
enableLongTapRepeatEvent: false,
|
||||
longTapRepeatDuration: const Duration(milliseconds: 100),
|
||||
begin: 1.0,
|
||||
end: 0.99,
|
||||
beginDuration: const Duration(milliseconds: 70),
|
||||
endDuration: const Duration(milliseconds: 100),
|
||||
beginCurve: Curves.decelerate,
|
||||
endCurve: Curves.easeInOutSine,
|
||||
child: AspectRatio(
|
||||
aspectRatio: 1 / 1,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
// add border
|
||||
border: const GradientBoxBorder(
|
||||
gradient: LinearGradient(colors: [
|
||||
Colors.transparent,
|
||||
Color(0xFF323232),
|
||||
], begin: Alignment.topCenter, end: Alignment.bottomCenter),
|
||||
width: 2.5,
|
||||
),
|
||||
// set border radius
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(18),
|
||||
// implement image
|
||||
child: Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: Image.network(
|
||||
widget.post.music.cover!,
|
||||
),
|
||||
),
|
||||
Image(
|
||||
image: AssetImage("assets/images/shadow_post.png"),
|
||||
opacity: AnimationController(vsync: this, value: 0.7),
|
||||
fit: BoxFit.fitHeight,
|
||||
width: double.infinity,
|
||||
),
|
||||
widget.post.description == null
|
||||
? Container()
|
||||
: Padding(
|
||||
padding: EdgeInsets.all(15),
|
||||
child: AutoSizeText(
|
||||
'“${widget.post.description}”',
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.sp),
|
||||
maxFontSize: 20,
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
widget.post.selfie != null
|
||||
? Positioned(
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Container(
|
||||
constraints: BoxConstraints(maxWidth: 140, maxHeight: 140),
|
||||
width: 90.sp,
|
||||
height: 90.sp,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
// add border
|
||||
border: Border.all(width: 3, color: Colors.white),
|
||||
// set border radius
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(13),
|
||||
// implement image
|
||||
child: Image.network(
|
||||
widget.post.selfie!,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
),
|
||||
))
|
||||
: Container(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 15),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 8,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: 2),
|
||||
child: TextScroll(
|
||||
widget.post.music.title!,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h),
|
||||
mode: TextScrollMode.endless,
|
||||
velocity: Velocity(pixelsPerSecond: Offset(50, 20)),
|
||||
pauseBetween: Duration(milliseconds: 500),
|
||||
),
|
||||
)),
|
||||
Container(width: 10),
|
||||
AutoSizeText(
|
||||
widget.post.music.date.toString(),
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h),
|
||||
textAlign: TextAlign.end,
|
||||
maxFontSize: 20,
|
||||
),
|
||||
],
|
||||
),
|
||||
TextScroll(
|
||||
widget.post.music.artists.first.name!,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
height: 1, color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h),
|
||||
mode: TextScrollMode.endless,
|
||||
pauseBetween: Duration(milliseconds: 500),
|
||||
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,6 @@
|
||||
class UserException implements Exception {
|
||||
String code;
|
||||
String description;
|
||||
|
||||
UserException(this.code,this.description);
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
import 'package:tuple/tuple.dart';
|
||||
|
||||
import 'Music.dart';
|
||||
|
||||
class Capsule {
|
||||
final String _id;
|
||||
late Music _music;
|
||||
Tuple2<String?,String?> _location;
|
||||
DateTime _date;
|
||||
|
||||
// Constructor
|
||||
Capsule(this._id, this._location, this._date);
|
||||
|
||||
//Getters and setters
|
||||
String get id => _id;
|
||||
|
||||
Music get music => _music;
|
||||
|
||||
set music(Music value) {
|
||||
_music = value;
|
||||
}
|
||||
|
||||
Tuple2<String?, String?> get location => _location;
|
||||
|
||||
set location(Tuple2<String?, String?> value) {
|
||||
_location = value;
|
||||
}
|
||||
|
||||
DateTime get date => _date;
|
||||
|
||||
set date(DateTime value) {
|
||||
_date = value;
|
||||
}
|
||||
}
|
@ -0,0 +1,151 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
import '../components/historic_component.dart';
|
||||
import '../values/constants.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
class CapsuleHistoricScreen extends StatefulWidget {
|
||||
const CapsuleHistoricScreen({super.key});
|
||||
|
||||
@override
|
||||
State<CapsuleHistoricScreen> createState() => _CapsuleHistoricScreenState();
|
||||
}
|
||||
|
||||
class _CapsuleHistoricScreenState extends State<CapsuleHistoricScreen> {
|
||||
DateTime date = DateTime.now();
|
||||
|
||||
_reduceMonth() {
|
||||
setState(() {
|
||||
date = DateTime(date.year, date.month - 1, date.day);
|
||||
});
|
||||
}
|
||||
|
||||
_addMonth() {
|
||||
setState(() {
|
||||
date = DateTime(date.year, date.month + 1, date.day);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size(double.infinity, 58),
|
||||
child: Container(
|
||||
height: double.infinity,
|
||||
color: bgAppBar,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
|
||||
child: Stack(
|
||||
alignment: Alignment.centerLeft,
|
||||
children: [
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
Navigator.pop(context, true);
|
||||
},
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 30,
|
||||
width: 30,
|
||||
child: Image(
|
||||
image: AssetImage("assets/images/return_icon.png"),
|
||||
height: 8,
|
||||
),
|
||||
)),
|
||||
Align(
|
||||
child: Text(
|
||||
"Historique des capsules",
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
color: bgColor,
|
||||
child: SingleChildScrollView(
|
||||
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.only(top: 80, left: 30, right: 30),
|
||||
constraints: const BoxConstraints( maxWidth: 700),
|
||||
child: Align(
|
||||
alignment: Alignment.center,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 30,
|
||||
width: 30,
|
||||
child: Image(
|
||||
image: AssetImage("assets/images/return_icon.png"),
|
||||
height: 8,
|
||||
),
|
||||
),
|
||||
onTap: _reduceMonth,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 30),
|
||||
child: Text(
|
||||
'${DateFormat.MMMM('fr_FR').format(date)[0].toUpperCase()}${DateFormat.MMMM('fr_FR').format(date).substring(1)} ${date.year}',
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 16),
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: _addMonth,
|
||||
child: Transform(
|
||||
alignment: Alignment.center,
|
||||
transform: Matrix4.rotationY(3.14159265),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 30,
|
||||
width: 30,
|
||||
child: Image(
|
||||
image: AssetImage("assets/images/return_icon.png"),
|
||||
height: 8,
|
||||
),
|
||||
)),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 30, bottom: 40),
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Container(
|
||||
child: Column(
|
||||
children: [
|
||||
HistoricComponent(
|
||||
month: date.month,
|
||||
year: date.year,
|
||||
),
|
||||
],
|
||||
),
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,311 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/main.dart';
|
||||
|
||||
import '../values/constants.dart';
|
||||
|
||||
class ChangePasswordScreen extends StatefulWidget {
|
||||
const ChangePasswordScreen({super.key});
|
||||
|
||||
@override
|
||||
State<ChangePasswordScreen> createState() => _ChangePasswordScreenState();
|
||||
}
|
||||
|
||||
class _ChangePasswordScreenState extends State<ChangePasswordScreen> {
|
||||
final _currentPasswordTextField = TextEditingController();
|
||||
final _newPasswordTextField = TextEditingController();
|
||||
final _confirmPasswordTextField = TextEditingController();
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
Future<void> resetFullScreen() async {
|
||||
await SystemChannels.platform.invokeMethod<void>(
|
||||
'SystemChrome.restoreSystemUIOverlays',
|
||||
);
|
||||
}
|
||||
|
||||
handleChange() async {
|
||||
print("test");
|
||||
if (_formKey.currentState!.validate()) {
|
||||
var error;
|
||||
try {
|
||||
await FirebaseAuth.instance.signInWithEmailAndPassword(
|
||||
email: MyApp.userViewModel.userCurrent.mail,
|
||||
password: _currentPasswordTextField.text,
|
||||
);
|
||||
if (_newPasswordTextField.text == _confirmPasswordTextField.text) {
|
||||
await FirebaseAuth.instance.currentUser?.updatePassword(_confirmPasswordTextField.text);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
"Mot de passe mis à jour",
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
|
||||
),
|
||||
backgroundColor: primaryColor,
|
||||
closeIconColor: Colors.white,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
throw FirebaseAuthException(code: "not-same", message: "Les mots de passe ne correspondent pas");
|
||||
}
|
||||
} on FirebaseAuthException catch (e) {
|
||||
if (e.code == "wrong-password") {
|
||||
error = "Mot de passe incorrect";
|
||||
} else if (e.code == "too-many-requests") {
|
||||
error = "Trop de tentatives infructueuses. Veuillez réessayer plus tard";
|
||||
} else if (e.code == "channel-error") {
|
||||
error = "Impossible de vérifier le mot de passe";
|
||||
} else if (e.code == "weak-password") {
|
||||
error = "Le mot de passe doit contenir 6 caractères minimum";
|
||||
}
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
error ?? e.message,
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
|
||||
),
|
||||
backgroundColor: Colors.red,
|
||||
closeIconColor: Colors.white,
|
||||
),
|
||||
);
|
||||
}
|
||||
setState(() {
|
||||
_currentPasswordTextField.clear();
|
||||
_newPasswordTextField.clear();
|
||||
_confirmPasswordTextField.clear();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
FocusScopeNode currentFocus = FocusScope.of(context);
|
||||
if (!currentFocus.hasPrimaryFocus) {
|
||||
currentFocus.unfocus();
|
||||
resetFullScreen();
|
||||
}
|
||||
},
|
||||
child: Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size(double.infinity, 58),
|
||||
child: Container(
|
||||
height: double.infinity,
|
||||
color: bgAppBar,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
|
||||
child: Stack(
|
||||
alignment: Alignment.centerLeft,
|
||||
children: [
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
Navigator.pop(context, true);
|
||||
},
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 30,
|
||||
width: 30,
|
||||
child: Image(
|
||||
image: AssetImage("assets/images/return_icon.png"),
|
||||
height: 8,
|
||||
),
|
||||
)),
|
||||
Align(
|
||||
child: Text(
|
||||
"Mettre le mot de passe à jour",
|
||||
style:
|
||||
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
color: bgColor,
|
||||
child: SingleChildScrollView(
|
||||
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 30, bottom: 40),
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Container(
|
||||
constraints: BoxConstraints(maxWidth: 600),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
child: Text(
|
||||
"Mot de passe actuel",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
|
||||
),
|
||||
)),
|
||||
Expanded(
|
||||
child: TextFormField(
|
||||
controller: _currentPasswordTextField,
|
||||
decoration: InputDecoration(
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when you click the TextField
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when the TextField is disabled
|
||||
disabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
filled: true,
|
||||
hintText: '6 caractères minimum',
|
||||
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
|
||||
maxLines: 1,
|
||||
obscureText: true,
|
||||
cursorColor: primaryColor,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
child: Text(
|
||||
"Nouveau mot de passe",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
|
||||
),
|
||||
)),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _newPasswordTextField,
|
||||
decoration: InputDecoration(
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when you click the TextField
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when the TextField is disabled
|
||||
disabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
filled: true,
|
||||
hintText: '6 caractères minimum',
|
||||
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
|
||||
maxLines: 1,
|
||||
obscureText: true,
|
||||
cursorColor: primaryColor,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
child: Text(
|
||||
"Confirmer",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
|
||||
),
|
||||
)),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
obscureText: true,
|
||||
controller: _confirmPasswordTextField,
|
||||
decoration: InputDecoration(
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when you click the TextField
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
// Hides the border when the TextField is disabled
|
||||
disabledBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(color: Colors.transparent),
|
||||
),
|
||||
filled: true,
|
||||
hintText: '6 caractères minimum',
|
||||
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
|
||||
maxLines: 1,
|
||||
cursorColor: primaryColor,
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: handleChange,
|
||||
child: Align(
|
||||
child: Container(
|
||||
height: 35,
|
||||
width: 160,
|
||||
decoration:
|
||||
BoxDecoration(color: primaryColor, borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"Mettre à jour",
|
||||
style: GoogleFonts.plusJakartaSans(color: Colors.white),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,208 +1,418 @@
|
||||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/Material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/model/Music.dart';
|
||||
|
||||
import '../components/music_list_component.dart';
|
||||
import '../values/constants.dart';
|
||||
import '../main.dart';
|
||||
|
||||
class SearchSongScreen extends StatefulWidget {
|
||||
final Function callback;
|
||||
const SearchSongScreen({Key? key, required this.callback}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SearchSongScreen> createState() => _SearchSongScreenState();
|
||||
}
|
||||
|
||||
class _SearchSongScreenState extends State<SearchSongScreen> {
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
final TextEditingController _textEditingController = TextEditingController();
|
||||
|
||||
int? playingIndex;
|
||||
|
||||
Future<void> resetFullScreen() async {
|
||||
await SystemChannels.platform.invokeMethod<void>(
|
||||
'SystemChrome.restoreSystemUIOverlays',
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
fetchTrendingMusic();
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
Future<void> fetchTrendingMusic() async {
|
||||
await MyApp.musicViewModel.getMusicsWithPlaylistId('37i9dQZF1DX1X23oiQRTB5').then((value) {
|
||||
setState(() {
|
||||
filteredData = value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _scrollListener() async {
|
||||
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
|
||||
filteredData.addAll(await MyApp.musicViewModel
|
||||
.getMusicsWithName(_textEditingController.text, limit: 10, offset: filteredData.length));
|
||||
setState(() {
|
||||
filteredData = filteredData;
|
||||
});
|
||||
}
|
||||
if (_scrollController.offset >= _scrollController.position.maxScrollExtent &&
|
||||
!_scrollController.position.outOfRange) {
|
||||
setState(() {
|
||||
//you can do anything here
|
||||
});
|
||||
}
|
||||
if (_scrollController.offset <= _scrollController.position.minScrollExtent &&
|
||||
!_scrollController.position.outOfRange) {
|
||||
setState(() {
|
||||
Timer(Duration(milliseconds: 1), () => _scrollController.jumpTo(0));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
List<Music> filteredData = [];
|
||||
|
||||
void playMusic(int index) {
|
||||
if (playingIndex == index) {
|
||||
setState(() {
|
||||
playingIndex = null;
|
||||
});
|
||||
} else {
|
||||
setState(() {
|
||||
playingIndex = index;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
MyApp.audioPlayer.pause();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
double screenHeight = MediaQuery.of(context).size.height;
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
FocusScopeNode currentFocus = FocusScope.of(context);
|
||||
if (!currentFocus.hasPrimaryFocus) {
|
||||
currentFocus.unfocus();
|
||||
resetFullScreen();
|
||||
}
|
||||
},
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(
|
||||
sigmaX: 60.0,
|
||||
sigmaY: 60.0,
|
||||
),
|
||||
child: Container(
|
||||
color: bgAppBar.withOpacity(0.5),
|
||||
height: screenHeight - 50,
|
||||
padding: const EdgeInsets.only(top: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Align(
|
||||
child: Container(
|
||||
width: 60,
|
||||
height: 5,
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF3A3A3A).withOpacity(0.6), borderRadius: BorderRadius.circular(20))),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 10, left: 20, right: 20),
|
||||
child: SizedBox(
|
||||
height: 40,
|
||||
child: TextField(
|
||||
autofocus: true,
|
||||
controller: _textEditingController,
|
||||
keyboardAppearance: Brightness.dark,
|
||||
onEditingComplete: resetFullScreen,
|
||||
onSubmitted: (value) async {
|
||||
if (_textEditingController.text.isEmpty) {
|
||||
fetchTrendingMusic();
|
||||
} else {
|
||||
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
|
||||
setState(() {
|
||||
filteredData = filteredData;
|
||||
});
|
||||
}
|
||||
},
|
||||
cursorColor: Colors.white,
|
||||
keyboardType: TextInputType.text,
|
||||
style: GoogleFonts.plusJakartaSans(color: grayText),
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: const Icon(
|
||||
Icons.search,
|
||||
color: grayColor,
|
||||
),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide(width: 1, color: grayColor),
|
||||
borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||
contentPadding:
|
||||
const EdgeInsets.only(top: 0, bottom: 0, left: defaultPadding, right: defaultPadding),
|
||||
fillColor: searchBarColor,
|
||||
filled: true,
|
||||
focusColor: grayText,
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide(width: 1, color: grayColor),
|
||||
borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||
hintText: 'Chercher un son',
|
||||
hintStyle: GoogleFonts.plusJakartaSans(color: grayHint)),
|
||||
),
|
||||
),
|
||||
),
|
||||
Flexible(
|
||||
child: ScrollConfiguration(
|
||||
behavior: ScrollBehavior().copyWith(scrollbars: true),
|
||||
child: ListView.builder(
|
||||
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
|
||||
controller: _scrollController,
|
||||
itemCount: filteredData.length,
|
||||
itemBuilder: (context, index) {
|
||||
if (playingIndex == index) {
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback(filteredData[index]);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: filteredData[index],
|
||||
playing: true,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
}
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback(filteredData[index]);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: filteredData[index],
|
||||
playing: false,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
}),
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/model/Music.dart';
|
||||
|
||||
import '../components/music_list_component.dart';
|
||||
import '../values/constants.dart';
|
||||
import '../main.dart';
|
||||
|
||||
class SearchSongScreen extends StatefulWidget {
|
||||
final Function callback;
|
||||
const SearchSongScreen({Key? key, required this.callback}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SearchSongScreen> createState() => _SearchSongScreenState();
|
||||
}
|
||||
|
||||
class _SearchSongScreenState extends State<SearchSongScreen> {
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
final TextEditingController _textEditingController = TextEditingController();
|
||||
PageController controller = PageController();
|
||||
bool isCollectionSelected = false;
|
||||
|
||||
int? playingIndex;
|
||||
|
||||
Future<void> resetFullScreen() async {
|
||||
await SystemChannels.platform.invokeMethod<void>(
|
||||
'SystemChrome.restoreSystemUIOverlays',
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
fetchTrendingMusic();
|
||||
_scrollController.addListener(_scrollListener);
|
||||
}
|
||||
|
||||
Future<void> fetchTrendingMusic() async {
|
||||
await MyApp.musicViewModel.getMusicsWithPlaylistId('37i9dQZF1DX1X23oiQRTB5').then((value) {
|
||||
setState(() {
|
||||
filteredData = value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _scrollListener() async {
|
||||
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
|
||||
filteredData.addAll(await MyApp.musicViewModel
|
||||
.getMusicsWithName(_textEditingController.text, limit: 10, offset: filteredData.length));
|
||||
setState(() {
|
||||
filteredData = filteredData;
|
||||
});
|
||||
}
|
||||
if (_scrollController.offset >= _scrollController.position.maxScrollExtent &&
|
||||
!_scrollController.position.outOfRange) {
|
||||
setState(() {
|
||||
//you can do anything here
|
||||
});
|
||||
}
|
||||
if (_scrollController.offset <= _scrollController.position.minScrollExtent &&
|
||||
!_scrollController.position.outOfRange) {
|
||||
setState(() {
|
||||
Timer(Duration(milliseconds: 1), () => _scrollController.jumpTo(0));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
List<Music> filteredData = [];
|
||||
|
||||
void playMusic(int index) {
|
||||
if (playingIndex == index) {
|
||||
setState(() {
|
||||
playingIndex = null;
|
||||
});
|
||||
} else {
|
||||
setState(() {
|
||||
playingIndex = index;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_changePage(int index) {
|
||||
/*if (isCollectionSelected) {
|
||||
setState(() {
|
||||
isCollectionSelected = !isCollectionSelected;
|
||||
controller.animateTo(1, duration: Duration(milliseconds: 200), curve: Curves.easeOut);
|
||||
});
|
||||
} else {
|
||||
setState(() {
|
||||
isCollectionSelected = !isCollectionSelected;
|
||||
controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.easeOut);
|
||||
});
|
||||
}*/
|
||||
}
|
||||
|
||||
Future<List<Music>> _fetchSavedSong() async {
|
||||
return await MyApp.musicViewModel.getFavoriteMusicsByUserId(MyApp.userViewModel.userCurrent.id);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
MyApp.audioPlayer.pause();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
double screenHeight = MediaQuery.of(context).size.height;
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
FocusScopeNode currentFocus = FocusScope.of(context);
|
||||
if (!currentFocus.hasPrimaryFocus) {
|
||||
currentFocus.unfocus();
|
||||
resetFullScreen();
|
||||
}
|
||||
},
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(
|
||||
sigmaX: 60.0,
|
||||
sigmaY: 60.0,
|
||||
),
|
||||
child: Container(
|
||||
color: bgAppBar.withOpacity(0.5),
|
||||
height: screenHeight - 50,
|
||||
padding: const EdgeInsets.only(top: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Align(
|
||||
child: Container(
|
||||
width: 60,
|
||||
height: 5,
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF3A3A3A).withOpacity(0.6), borderRadius: BorderRadius.circular(20))),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 10, left: 20, right: 20),
|
||||
child: SizedBox(
|
||||
height: 40,
|
||||
child: TextField(
|
||||
controller: _textEditingController,
|
||||
keyboardAppearance: Brightness.dark,
|
||||
onEditingComplete: resetFullScreen,
|
||||
onSubmitted: (value) async {
|
||||
if (_textEditingController.text.isEmpty) {
|
||||
fetchTrendingMusic();
|
||||
} else {
|
||||
setState(() {
|
||||
filteredData = [];
|
||||
});
|
||||
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
|
||||
setState(() {
|
||||
filteredData = filteredData;
|
||||
});
|
||||
}
|
||||
controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.easeIn);
|
||||
},
|
||||
cursorColor: Colors.white,
|
||||
keyboardType: TextInputType.text,
|
||||
style: GoogleFonts.plusJakartaSans(color: grayText),
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: const Icon(
|
||||
Icons.search,
|
||||
color: grayColor,
|
||||
),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide(width: 1, color: grayColor),
|
||||
borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||
contentPadding:
|
||||
const EdgeInsets.only(top: 0, bottom: 0, left: defaultPadding, right: defaultPadding),
|
||||
fillColor: searchBarColor,
|
||||
filled: true,
|
||||
focusColor: grayText,
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide: BorderSide(width: 1, color: grayColor),
|
||||
borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||
hintText: 'Chercher un son',
|
||||
hintStyle: GoogleFonts.plusJakartaSans(color: grayHint)),
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 10, bottom: 20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: _changePage(0),
|
||||
child: Text(
|
||||
"Recherche",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: isCollectionSelected ? Color(0xFF9A9A9A) : Colors.white,
|
||||
fontWeight: isCollectionSelected ? FontWeight.w500 : FontWeight.w700),
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: _changePage(1),
|
||||
child: Text("Collection",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: isCollectionSelected ? Colors.white : Color(0xFF9A9A9A),
|
||||
fontWeight: isCollectionSelected ? FontWeight.w700 : FontWeight.w500)),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Flexible(
|
||||
child: PageView(
|
||||
controller: controller,
|
||||
physics: BouncingScrollPhysics(),
|
||||
onPageChanged: (index) {
|
||||
setState(() {
|
||||
if (index == 1) {
|
||||
isCollectionSelected = true;
|
||||
} else {
|
||||
isCollectionSelected = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
children: [
|
||||
ScrollConfiguration(
|
||||
behavior: ScrollBehavior().copyWith(scrollbars: true),
|
||||
child: ListView.builder(
|
||||
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
|
||||
controller: _scrollController,
|
||||
itemCount: filteredData.length,
|
||||
itemBuilder: (context, index) {
|
||||
if (playingIndex == index) {
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback(filteredData[index]);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: filteredData[index],
|
||||
playing: true,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
}
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback(filteredData[index]);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: filteredData[index],
|
||||
playing: false,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
}),
|
||||
),
|
||||
ScrollConfiguration(
|
||||
behavior: ScrollBehavior().copyWith(scrollbars: true),
|
||||
child: FutureBuilder(
|
||||
future: _fetchSavedSong(),
|
||||
builder: (BuildContext context, AsyncSnapshot<List<Music>> snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
if (snapshot.data?.length == 0) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
"Votre collection est vide.",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 18),
|
||||
),
|
||||
),
|
||||
Image.asset(
|
||||
"assets/images/empty_collection.png",
|
||||
width: 300,
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return ListView.builder(
|
||||
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
|
||||
controller: _scrollController,
|
||||
itemCount: snapshot.data?.length,
|
||||
itemBuilder: (context, index) {
|
||||
if (playingIndex == index) {
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback((snapshot.data?[index])!);
|
||||
},
|
||||
onLongPress: () {
|
||||
showCupertinoModalPopup<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) => CupertinoAlertDialog(
|
||||
title: const Text('Supprimer la musique'),
|
||||
content: Text(
|
||||
'Etes-vous sur de vouloir supprimer ${(snapshot.data?[index])!.title} de votre collection?'),
|
||||
actions: <CupertinoDialogAction>[
|
||||
CupertinoDialogAction(
|
||||
/// This parameter indicates this action is the default,
|
||||
/// and turns the action's text to bold text.
|
||||
isDefaultAction: true,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: const Text('Annuler'),
|
||||
),
|
||||
CupertinoDialogAction(
|
||||
/// This parameter indicates the action would perform
|
||||
/// a destructive action such as deletion, and turns
|
||||
/// the action's text color to red.
|
||||
isDestructiveAction: true,
|
||||
onPressed: () async {
|
||||
Navigator.pop(context);
|
||||
await MyApp.musicViewModel
|
||||
.addOrDeleteFavoriteMusic((snapshot.data?[index])!.id);
|
||||
MyApp.userViewModel.userCurrent.musicsLikes
|
||||
.remove((snapshot.data?[index])!.id);
|
||||
|
||||
MyApp.audioPlayer.release();
|
||||
setState(() {
|
||||
playingIndex = null;
|
||||
});
|
||||
},
|
||||
child: const Text('Supprimer'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: (snapshot.data?[index])!,
|
||||
playing: true,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
}
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
widget.callback((snapshot.data?[index])!);
|
||||
},
|
||||
onLongPress: () {
|
||||
showCupertinoModalPopup<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) => CupertinoAlertDialog(
|
||||
title: const Text('Supprimer la musique'),
|
||||
content: Text(
|
||||
'Etes-vous sur de vouloir supprimer ${(snapshot.data?[index])!.title} de votre collection?'),
|
||||
actions: <CupertinoDialogAction>[
|
||||
CupertinoDialogAction(
|
||||
/// This parameter indicates this action is the default,
|
||||
/// and turns the action's text to bold text.
|
||||
isDefaultAction: true,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
child: const Text('Annuler'),
|
||||
),
|
||||
CupertinoDialogAction(
|
||||
/// This parameter indicates the action would perform
|
||||
/// a destructive action such as deletion, and turns
|
||||
/// the action's text color to red.
|
||||
isDestructiveAction: true,
|
||||
onPressed: () async {
|
||||
Navigator.pop(context);
|
||||
await MyApp.musicViewModel
|
||||
.addOrDeleteFavoriteMusic((snapshot.data?[index])!.id);
|
||||
MyApp.userViewModel.userCurrent.musicsLikes
|
||||
.remove((snapshot.data?[index])!.id);
|
||||
setState(() {});
|
||||
},
|
||||
child: const Text('Supprimer'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: MusicListComponent(
|
||||
music: (snapshot.data?[index])!,
|
||||
playing: false,
|
||||
callback: playMusic,
|
||||
index: index,
|
||||
),
|
||||
));
|
||||
});
|
||||
}
|
||||
} else {
|
||||
return CupertinoActivityIndicator();
|
||||
}
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -1,98 +1,98 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/values/constants.dart';
|
||||
|
||||
import '../components/join_button.dart';
|
||||
|
||||
class WellcomeScreen extends StatelessWidget {
|
||||
const WellcomeScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
padding: EdgeInsets.all(defaultPadding),
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("assets/images/wellcome_background.png"),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
child: Align(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 10,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: 100),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Bienvenue sur,",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 34),
|
||||
),
|
||||
Image(
|
||||
image: AssetImage("assets/images/logo.png"),
|
||||
width: 230,
|
||||
),
|
||||
SizedBox(
|
||||
height: 25,
|
||||
),
|
||||
ConstrainedBox(
|
||||
constraints: BoxConstraints(maxWidth: 520),
|
||||
child: Text(
|
||||
"Explore les nouvelles découvertes musicales de tes amis, et partage leur ton mood.",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w200,
|
||||
fontSize: 15),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
JoinButton(),
|
||||
SizedBox(
|
||||
height: defaultPadding,
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.pushNamed(context, '/login');
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(3.0),
|
||||
child: Text(
|
||||
"Tu as déja un compte? Connexion",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w400,
|
||||
fontSize: 15),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
) /* add child content here */,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:justmusic/values/constants.dart';
|
||||
|
||||
import '../components/join_button.dart';
|
||||
|
||||
class WellcomeScreen extends StatelessWidget {
|
||||
const WellcomeScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
padding: EdgeInsets.all(defaultPadding),
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("assets/images/wellcome_background.png"),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
child: Align(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 10,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: 100),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"Bienvenue sur,",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 34),
|
||||
),
|
||||
Image(
|
||||
image: AssetImage("assets/images/logo.png"),
|
||||
width: 230,
|
||||
),
|
||||
SizedBox(
|
||||
height: 25,
|
||||
),
|
||||
ConstrainedBox(
|
||||
constraints: BoxConstraints(maxWidth: 520),
|
||||
child: Text(
|
||||
"Explore les nouvelles découvertes musicales de tes amis, et partage leur ton mood.",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w200,
|
||||
fontSize: 15),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 3,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
JoinButton(),
|
||||
SizedBox(
|
||||
height: defaultPadding,
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.pushNamed(context, '/login');
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(3.0),
|
||||
child: Text(
|
||||
"Tu as déja un compte ? Connexion",
|
||||
style: GoogleFonts.plusJakartaSans(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w400,
|
||||
fontSize: 15),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
) /* add child content here */,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,33 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
|
||||
class CapsuleService {
|
||||
Future<List<bool>> recapSevenDays(String id) async {
|
||||
List<bool> recapList = [];
|
||||
|
||||
DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6));
|
||||
|
||||
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore
|
||||
.instance
|
||||
.collection("capsules")
|
||||
.where("user_id", isEqualTo: id)
|
||||
.get();
|
||||
|
||||
List<Map<String, dynamic>?> capsuleList = response.docs
|
||||
.map((DocumentSnapshot<Map<String, dynamic>> doc) => doc.data())
|
||||
.toList();
|
||||
|
||||
for (int i = 0; i < 7; i++) {
|
||||
DateTime date = sevenDaysAgo.add(Duration(days: i));
|
||||
bool capsuleExists = capsuleList.any((post) =>
|
||||
post?["date"] != null &&
|
||||
post?["date"].toDate().year == date.year &&
|
||||
post?["date"].toDate().month == date.month &&
|
||||
post?["date"].toDate().day == date.day);
|
||||
|
||||
recapList.add(capsuleExists);
|
||||
}
|
||||
|
||||
return recapList;
|
||||
}
|
||||
|
||||
}
|
@ -1,49 +1,53 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:tuple/tuple.dart';
|
||||
|
||||
import '../main.dart';
|
||||
|
||||
class MusicService {
|
||||
Future<dynamic> getFavoriteMusicsByUserId(String id) async {
|
||||
var response =
|
||||
await FirebaseFirestore.instance.collection("users").doc(id).get();
|
||||
var response = await FirebaseFirestore.instance.collection("users").doc(id).get();
|
||||
if (response.exists) {
|
||||
var musicFavorite = response.get("musics_likes");
|
||||
var musicFavorite = response.get("saved_musics");
|
||||
return List.from(musicFavorite);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
deleteFavoriteMusic(String id) async {
|
||||
var userRef = await FirebaseFirestore.instance
|
||||
.collection("users")
|
||||
.doc(MyApp.userViewModel.userCurrent.id);
|
||||
var response = await userRef.get();
|
||||
|
||||
List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
|
||||
if (!musicFavorite.contains(id)) {
|
||||
musicFavorite.remove(id);
|
||||
await userRef.update({"musics_likes": musicFavorite});
|
||||
} else {
|
||||
print("Delete error: The music is not in the user's favorite music list");
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> addOrDeleteFavoriteMusic(String id) async {
|
||||
var userRef = await FirebaseFirestore.instance
|
||||
.collection("users")
|
||||
.doc(MyApp.userViewModel.userCurrent.id);
|
||||
var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
|
||||
var response = await userRef.get();
|
||||
|
||||
List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
|
||||
List<String> musicFavorite = List.from(response.get("musics_likes"));
|
||||
|
||||
if (!musicFavorite.contains(id)) {
|
||||
musicFavorite.add(id);
|
||||
await userRef.update({"musics_likes": musicFavorite});
|
||||
MyApp.userViewModel.userCurrent.musicsLikes.add(id);
|
||||
return false;
|
||||
} else {
|
||||
musicFavorite.remove(id);
|
||||
await userRef.update({"musics_likes": musicFavorite});
|
||||
MyApp.userViewModel.userCurrent.musicsLikes.remove(id);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<Tuple2<int, String>>> getHistoryCapsulesMonthWhitIdUser(String idUser, int month, int year) async {
|
||||
List<Tuple2<int, String>> capsules = [];
|
||||
|
||||
var querySnapshot = await FirebaseFirestore.instance
|
||||
.collection('capsules')
|
||||
.where('user_id', isEqualTo: idUser)
|
||||
.where('date', isGreaterThanOrEqualTo: DateTime(year, month))
|
||||
.where('date', isLessThan: DateTime(year, month + 1))
|
||||
.orderBy('date')
|
||||
.get();
|
||||
|
||||
for (var document in querySnapshot.docs) {
|
||||
capsules.add(Tuple2(document.data()['date'].toDate().day, document.data()['song_id']));
|
||||
}
|
||||
|
||||
return capsules;
|
||||
}
|
||||
}
|
||||
|