v3.2.0
This commit is contained in:
parent
f9745a792a
commit
fa0bfd8746
|
|
@ -40,6 +40,9 @@ end
|
|||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
flutter_additional_ios_build_settings(target)
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'NO'
|
||||
end
|
||||
end
|
||||
|
||||
# ################ Awesome Notifications pod modification ###################
|
||||
|
|
|
|||
|
|
@ -15,18 +15,33 @@ PODS:
|
|||
- HLSCachingReverseProxyServer
|
||||
- PINCache
|
||||
- Cache (6.0.0)
|
||||
- Firebase/Auth (10.25.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAuth (~> 10.25.0)
|
||||
- Firebase/CoreOnly (10.25.0):
|
||||
- FirebaseCore (= 10.25.0)
|
||||
- Firebase/Messaging (10.25.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseMessaging (~> 10.25.0)
|
||||
- firebase_core (2.31.0):
|
||||
- firebase_auth (4.19.6):
|
||||
- Firebase/Auth (= 10.25.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (2.31.1):
|
||||
- Firebase/CoreOnly (= 10.25.0)
|
||||
- Flutter
|
||||
- firebase_messaging (14.9.2):
|
||||
- Firebase/Messaging (= 10.25.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseAppCheckInterop (10.25.0)
|
||||
- FirebaseAuth (10.25.0):
|
||||
- FirebaseAppCheckInterop (~> 10.17)
|
||||
- FirebaseCore (~> 10.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
||||
- GoogleUtilities/Environment (~> 7.8)
|
||||
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
|
||||
- RecaptchaInterop (~> 100.0)
|
||||
- FirebaseCore (10.25.0):
|
||||
- FirebaseCoreInternal (~> 10.0)
|
||||
- GoogleUtilities/Environment (~> 7.12)
|
||||
|
|
@ -86,6 +101,7 @@ PODS:
|
|||
- GoogleUtilities/UserDefaults (7.13.3):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GTMSessionFetcher/Core (3.4.1)
|
||||
- HLSCachingReverseProxyServer (0.1.0):
|
||||
- GCDWebServer (~> 3.5)
|
||||
- PINCache (>= 3.0.1-beta.3)
|
||||
|
|
@ -116,6 +132,7 @@ PODS:
|
|||
- PINOperation (~> 1.2.3)
|
||||
- PINOperation (1.2.3)
|
||||
- PromisesObjC (2.4.0)
|
||||
- RecaptchaInterop (100.0.0)
|
||||
- record (0.0.1):
|
||||
- Flutter
|
||||
- rive_common (0.0.1):
|
||||
|
|
@ -137,6 +154,7 @@ DEPENDENCIES:
|
|||
- awesome_notifications (from `.symlinks/plugins/awesome_notifications/ios`)
|
||||
- awesome_notifications_core (from `.symlinks/plugins/awesome_notifications_core/ios`)
|
||||
- better_player (from `.symlinks/plugins/better_player/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`)
|
||||
- Flutter (from `Flutter`)
|
||||
|
|
@ -159,6 +177,8 @@ SPEC REPOS:
|
|||
trunk:
|
||||
- Cache
|
||||
- Firebase
|
||||
- FirebaseAppCheckInterop
|
||||
- FirebaseAuth
|
||||
- FirebaseCore
|
||||
- FirebaseCoreInternal
|
||||
- FirebaseInstallations
|
||||
|
|
@ -166,12 +186,14 @@ SPEC REPOS:
|
|||
- GCDWebServer
|
||||
- GoogleDataTransport
|
||||
- GoogleUtilities
|
||||
- GTMSessionFetcher
|
||||
- HLSCachingReverseProxyServer
|
||||
- IosAwnCore
|
||||
- nanopb
|
||||
- PINCache
|
||||
- PINOperation
|
||||
- PromisesObjC
|
||||
- RecaptchaInterop
|
||||
- TOCropViewController
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
|
|
@ -185,6 +207,8 @@ EXTERNAL SOURCES:
|
|||
:path: ".symlinks/plugins/awesome_notifications_core/ios"
|
||||
better_player:
|
||||
:path: ".symlinks/plugins/better_player/ios"
|
||||
firebase_auth:
|
||||
:path: ".symlinks/plugins/firebase_auth/ios"
|
||||
firebase_core:
|
||||
:path: ".symlinks/plugins/firebase_core/ios"
|
||||
firebase_messaging:
|
||||
|
|
@ -228,8 +252,11 @@ SPEC CHECKSUMS:
|
|||
better_player: 2406bfe8175203c7a46fa15f9d778d73b12e1646
|
||||
Cache: 4ca7e00363fca5455f26534e5607634c820ffc2d
|
||||
Firebase: 0312a2352584f782ea56f66d91606891d4607f06
|
||||
firebase_core: 0b39f4f424e02eecabb2356ddf331fa07b772af8
|
||||
firebase_auth: 193301a23be35329120526c6a83672ea40676472
|
||||
firebase_core: 22e117a2e0dec3cb318c8f53f2dd01c140375617
|
||||
firebase_messaging: 8999827b6efc9c3ab4b1f9dc246deaa7f13dbf88
|
||||
FirebaseAppCheckInterop: 5da5ce93e8797a215e3f677fb0654b74e736c8b8
|
||||
FirebaseAuth: c0f93dcc570c9da2bffb576969d793e95c344fbb
|
||||
FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483
|
||||
FirebaseCoreInternal: 910a81992c33715fec9263ca7381d59ab3a750b7
|
||||
FirebaseInstallations: 91950fe859846fff0fbd296180909dd273103b09
|
||||
|
|
@ -241,6 +268,7 @@ SPEC CHECKSUMS:
|
|||
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
|
||||
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
|
||||
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
|
||||
GTMSessionFetcher: 8000756fc1c19d2e5697b90311f7832d2e33f6cd
|
||||
HLSCachingReverseProxyServer: 59935e1e0244ad7f3375d75b5ef46e8eb26ab181
|
||||
home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
|
||||
image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98
|
||||
|
|
@ -252,6 +280,7 @@ SPEC CHECKSUMS:
|
|||
PINCache: d9a87a0ff397acffe9e2f0db972ac14680441158
|
||||
PINOperation: fb563bcc9c32c26d6c78aaff967d405aa2ee74a7
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
|
||||
record: cae05d8dd3cdb1dea3511b20e5a5811a1ae00d0d
|
||||
rive_common: c537b4eed761e903a9403d93c347b69bd7a4762f
|
||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||
|
|
@ -260,6 +289,6 @@ SPEC CHECKSUMS:
|
|||
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
|
||||
webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36
|
||||
|
||||
PODFILE CHECKSUM: 43b7f04e2401bb5f4734fd7bf7644eef34165887
|
||||
PODFILE CHECKSUM: d9825a12b7b9489d4776b9c9434f6b977b656841
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@
|
|||
98ACB01D5FA5A78DB2686183 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
B2EEE8F55C4C405BB5B4B0F1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||
C97DED20C4A171F16FB949CD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
D143FC822BFF1A95002238F7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
|
||||
D167C7BB2BFE275B0039A883 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D167C7BD2BFE275B0039A883 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||
D194CE3D27D4A4740049AFC7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
|
||||
|
|
@ -146,6 +147,7 @@
|
|||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D143FC822BFF1A95002238F7 /* Runner.entitlements */,
|
||||
D194CE3D27D4A4740049AFC7 /* GoogleService-Info.plist */,
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
|
|
@ -241,6 +243,8 @@
|
|||
Base,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
packageReferences = (
|
||||
);
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
|
|
@ -488,15 +492,18 @@
|
|||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 9YUQA68P22;
|
||||
DEVELOPMENT_TEAM = MB63F4VV5H;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Didvan;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
|
@ -623,15 +630,18 @@
|
|||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 9YUQA68P22;
|
||||
DEVELOPMENT_TEAM = MB63F4VV5H;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Didvan;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
|
@ -652,15 +662,18 @@
|
|||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 9YUQA68P22;
|
||||
DEVELOPMENT_TEAM = MB63F4VV5H;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Didvan;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.news";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
|
|
@ -680,6 +693,7 @@
|
|||
baseConfigurationReference = D5C8C888FE458FD90D3E41DB /* Pods-RunnerTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
|
|
@ -714,6 +728,7 @@
|
|||
baseConfigurationReference = B2EEE8F55C4C405BB5B4B0F1 /* Pods-RunnerTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
|
|
@ -746,6 +761,7 @@
|
|||
baseConfigurationReference = F9A8A938029FFAC4FD6CE33B /* Pods-RunnerTests.profile.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,123 @@
|
|||
{
|
||||
"originHash" : "c63c63846d9c539229e96de38d6af51417e28c0ee9a0bc48bd0f0f19d923c329",
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "abseil-cpp-binary",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/abseil-cpp-binary.git",
|
||||
"state" : {
|
||||
"revision" : "748c7837511d0e6a507737353af268484e1745e2",
|
||||
"version" : "1.2024011601.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "app-check",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/app-check.git",
|
||||
"state" : {
|
||||
"revision" : "076b241a625e25eac22f8849be256dfb960fcdfe",
|
||||
"version" : "10.19.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "firebase-ios-sdk",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/firebase-ios-sdk",
|
||||
"state" : {
|
||||
"revision" : "9d17b500cd98d9a7009751ad62f802e152e97021",
|
||||
"version" : "10.26.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googleappmeasurement",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleAppMeasurement.git",
|
||||
"state" : {
|
||||
"revision" : "16244d177c4e989f87b25e9db1012b382cfedc55",
|
||||
"version" : "10.25.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googledatatransport",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleDataTransport.git",
|
||||
"state" : {
|
||||
"revision" : "a637d318ae7ae246b02d7305121275bc75ed5565",
|
||||
"version" : "9.4.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "googleutilities",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/GoogleUtilities.git",
|
||||
"state" : {
|
||||
"revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6",
|
||||
"version" : "7.13.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "grpc-binary",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/grpc-binary.git",
|
||||
"state" : {
|
||||
"revision" : "e9fad491d0673bdda7063a0341fb6b47a30c5359",
|
||||
"version" : "1.62.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "gtm-session-fetcher",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/gtm-session-fetcher.git",
|
||||
"state" : {
|
||||
"revision" : "0382ca27f22fb3494cf657d8dc356dc282cd1193",
|
||||
"version" : "3.4.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "interop-ios-for-google-sdks",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/interop-ios-for-google-sdks.git",
|
||||
"state" : {
|
||||
"revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
|
||||
"version" : "100.0.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "leveldb",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/leveldb.git",
|
||||
"state" : {
|
||||
"revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
|
||||
"version" : "1.22.5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "nanopb",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/firebase/nanopb.git",
|
||||
"state" : {
|
||||
"revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
|
||||
"version" : "2.30910.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "promises",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/google/promises.git",
|
||||
"state" : {
|
||||
"revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
|
||||
"version" : "2.4.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-protobuf",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-protobuf.git",
|
||||
"state" : {
|
||||
"revision" : "9f0c76544701845ad98716f3f6a774a892152bcb",
|
||||
"version" : "1.26.0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 3
|
||||
}
|
||||
|
|
@ -70,6 +70,16 @@
|
|||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<CommandLineArguments>
|
||||
<CommandLineArgument
|
||||
argument = "--vm-service-host=0.0.0.0"
|
||||
isEnabled = "YES">
|
||||
</CommandLineArgument>
|
||||
<CommandLineArgument
|
||||
argument = ""
|
||||
isEnabled = "YES">
|
||||
</CommandLineArgument>
|
||||
</CommandLineArguments>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import UIKit
|
||||
import Flutter
|
||||
import Firebase
|
||||
|
||||
import FirebaseCore
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate, MessagingDelegate {
|
||||
|
|
@ -12,6 +12,7 @@ import Firebase
|
|||
FirebaseApp.configure()
|
||||
Messaging.messaging().delegate = self
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
|
||||
if #available(iOS 10.0, *) {
|
||||
// For iOS 10 display notification (sent via APNS)
|
||||
UNUserNotificationCenter.current().delegate = self
|
||||
|
|
@ -27,4 +28,4 @@ import Firebase
|
|||
application.registerForRemoteNotifications()
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,58 +1,60 @@
|
|||
<?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>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>didvan</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>FirebaseAppDelegateProxyEnabled</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>We need to access to the user gallery to add user profile photo</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>We need to access to the microphone to record audio file</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>We need to access to the user gallery to add user profile photo</string>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>audio</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>UNNotificationServiceExtension</key>
|
||||
<array>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER).MyNotificationServiceExtension</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>didvan</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>FirebaseAppDelegateProxyEnabled</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>We need to access to the user gallery to add user profile photo</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>We need to access to the microphone to record audio file</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>We need to access to the user gallery to add user profile photo</string>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>audio</string>
|
||||
<string>fetch</string>
|
||||
<string>remote-notification</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>UNNotificationServiceExtension</key>
|
||||
<array>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER).MyNotificationServiceExtension</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
<?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>aps-environment</key>
|
||||
<string>development</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -1,12 +1,18 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:android_intent_plus/android_intent.dart';
|
||||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:didvan/config/theme_data.dart';
|
||||
import 'package:didvan/models/notification_message.dart';
|
||||
import 'package:didvan/providers/media.dart';
|
||||
import 'package:didvan/providers/theme.dart';
|
||||
import 'package:didvan/providers/user.dart';
|
||||
import 'package:didvan/routes/route_generator.dart';
|
||||
import 'package:didvan/routes/routes.dart';
|
||||
import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
|
||||
import 'package:didvan/services/app_initalizer.dart';
|
||||
import 'package:didvan/services/notification/awsome/awsome_notification_controller.dart';
|
||||
import 'package:didvan/services/notification/awsome/awsome_notification_handler.dart';
|
||||
import 'package:didvan/services/notification/fcm/firebase_notification_handler.dart';
|
||||
import 'package:didvan/views/podcasts/podcasts_state.dart';
|
||||
|
|
@ -24,24 +30,10 @@ final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|||
@pragma('vm:entry-point')
|
||||
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await Firebase.initializeApp(
|
||||
options: kIsWeb
|
||||
? const FirebaseOptions(
|
||||
apiKey: "AIzaSyA0HZjKpRuPOi1SC3f_EZTvlS3mcj9UVo0",
|
||||
authDomain: "didvan-9b7da.firebaseapp.com",
|
||||
projectId: "didvan-9b7da",
|
||||
storageBucket: "didvan-9b7da.appspot.com",
|
||||
messagingSenderId: "935017686266",
|
||||
appId: "1:935017686266:web:a93f7a19bed23c51d2d543",
|
||||
measurementId: "G-80B4H9E8Y0")
|
||||
: const FirebaseOptions(
|
||||
apiKey: 'AIzaSyBp-UHjWeM0H0UHtX5yguFKG-riMzvvCzw',
|
||||
appId: '1:935017686266:android:f9cbc9aba8e3d65ed2d543',
|
||||
messagingSenderId: '935017686266',
|
||||
projectId: 'didvan-9b7da',
|
||||
),
|
||||
);
|
||||
AwsomeNotificationHandler().show(message);
|
||||
await AppInitializer.initializeFirebase();
|
||||
await AwsomeNotificationHandler.startListeningNotificationEvents();
|
||||
await AwsomeNotificationHandler().show(message);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -66,8 +58,8 @@ void main() async {
|
|||
//ignore: deprecated_member_use
|
||||
HomeWidget.registerBackgroundCallback(_backgroundCallbackHomeWidget);
|
||||
HomeWidget.registerInteractivityCallback(_backgroundCallbackHomeWidget);
|
||||
AwsomeNotificationHandler().alarm();
|
||||
FirebaseNotificationHandler().initial();
|
||||
await AwsomeNotificationHandler().alarm();
|
||||
await AppInitializer.initializeFirebase();
|
||||
} catch (e) {
|
||||
debugPrintStack();
|
||||
}
|
||||
|
|
@ -90,6 +82,8 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
|
|||
|
||||
@override
|
||||
void initState() {
|
||||
AwsomeNotificationHandler.startListeningNotificationEvents();
|
||||
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
}
|
||||
|
|
@ -108,6 +102,12 @@ class _DidvanState extends State<Didvan> with WidgetsBindingObserver {
|
|||
var r = await HomeWidget.getWidgetData("cRoute", defaultValue: '');
|
||||
if (r!.toString() != Routes.splash) {
|
||||
await HomeWidgetRepository.decideWhereToGo();
|
||||
|
||||
NotificationMessage? data = HomeWidgetRepository.data;
|
||||
print("hhhhshahahjsfghasgfhjgfsahjghgfhgsahfghsag $data");
|
||||
if (data != null) {
|
||||
await HomeWidgetRepository.decideWhereToGoNotif();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'news_attachment.dart';
|
|||
import 'radar_attachment.dart';
|
||||
|
||||
class MessageData {
|
||||
final int id;
|
||||
int id;
|
||||
final String? text;
|
||||
final String? audio;
|
||||
final bool writedByAdmin;
|
||||
|
|
@ -16,7 +16,7 @@ class MessageData {
|
|||
final File? audioFile;
|
||||
final int? audioDuration;
|
||||
|
||||
const MessageData({
|
||||
MessageData({
|
||||
required this.id,
|
||||
required this.writedByAdmin,
|
||||
required this.readed,
|
||||
|
|
|
|||
|
|
@ -32,12 +32,16 @@ class UserProvider extends CoreProvier {
|
|||
static final List<Map> _itemMarkQueue = [];
|
||||
|
||||
Future<String?> setAndGetToken({String? newToken}) async {
|
||||
if (newToken == null) {
|
||||
final token = await StorageService.getValue(key: 'token');
|
||||
return token;
|
||||
try {
|
||||
if (newToken == null) {
|
||||
final token = await StorageService.getValue(key: 'token');
|
||||
return token;
|
||||
}
|
||||
await StorageService.setValue(key: 'token', value: newToken);
|
||||
return null;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
await StorageService.setValue(key: 'token', value: newToken);
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<bool> getUserInfo() async {
|
||||
|
|
@ -49,18 +53,27 @@ class UserProvider extends CoreProvier {
|
|||
return false;
|
||||
}
|
||||
if (service.isSuccess) {
|
||||
user = User.fromJson(service.result['user']);
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeStart',
|
||||
value: service.result['user']['start'],
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeEnd',
|
||||
value: service.result['user']['end'],
|
||||
);
|
||||
AppInitializer.initializeFirebase().then((_) => _registerFirebaseToken());
|
||||
return true;
|
||||
try {
|
||||
user = User.fromJson(service.result['user']);
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeStart',
|
||||
value: service.result['user']['start'],
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeEnd',
|
||||
value: service.result['user']['end'],
|
||||
);
|
||||
|
||||
AppInitializer.initializeFirebase().then((_) {
|
||||
_registerFirebaseToken();
|
||||
}).catchError((err) {});
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
throw 'Getting user from API failed!';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -137,11 +137,16 @@ class RouteGenerator {
|
|||
);
|
||||
case Routes.podcasts:
|
||||
return _createRoute(
|
||||
const Podcasts(viewPodcasts: true),
|
||||
Podcasts(
|
||||
viewPodcasts: true,
|
||||
pageData: settings.arguments as Map<String, dynamic>?,
|
||||
),
|
||||
);
|
||||
case Routes.videocasts:
|
||||
return _createRoute(
|
||||
const Podcasts(),
|
||||
Podcasts(
|
||||
pageData: settings.arguments as Map<String, dynamic>?,
|
||||
),
|
||||
);
|
||||
case Routes.radars:
|
||||
return _createRoute(
|
||||
|
|
@ -160,7 +165,9 @@ class RouteGenerator {
|
|||
case Routes.infography:
|
||||
return _createRoute(ChangeNotifierProvider<InfographyScreenState>(
|
||||
create: (context) => InfographyScreenState(),
|
||||
child: const InfographyScreen(),
|
||||
child: InfographyScreen(
|
||||
pageData: settings.arguments as Map<String, dynamic>?,
|
||||
),
|
||||
));
|
||||
|
||||
case Routes.radarDetails:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:didvan/models/notification_message.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:home_widget/home_widget.dart';
|
||||
import 'package:persian_number_utility/persian_number_utility.dart';
|
||||
|
|
@ -90,54 +91,53 @@ class HomeWidgetRepository {
|
|||
'${data.link}',
|
||||
mode: LaunchMode.inAppWebView,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (data.type!) {
|
||||
case "infography":
|
||||
route = Routes.infography;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const InfographyRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "news":
|
||||
route = Routes.newsDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const NewsRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "radar":
|
||||
route = Routes.radarDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const RadarRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "video":
|
||||
route = Routes.studioDetails;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': data.id,
|
||||
};
|
||||
break;
|
||||
case "podcast":
|
||||
route = Routes.podcasts;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': data.id,
|
||||
};
|
||||
break;
|
||||
} else {
|
||||
switch (data.type!) {
|
||||
case "infography":
|
||||
route = Routes.infography;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const InfographyRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "news":
|
||||
route = Routes.newsDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const NewsRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "radar":
|
||||
route = Routes.radarDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': data.id,
|
||||
'args': const RadarRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
};
|
||||
break;
|
||||
case "video":
|
||||
route = Routes.studioDetails;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': data.id,
|
||||
};
|
||||
break;
|
||||
case "podcast":
|
||||
route = Routes.podcasts;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': data.id,
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -151,4 +151,78 @@ class HomeWidgetRepository {
|
|||
await HomeWidget.saveWidgetData("uri", "");
|
||||
return;
|
||||
}
|
||||
|
||||
static NotificationMessage? data;
|
||||
static Future<void> decideWhereToGoNotif() async {
|
||||
NotificationMessage? data = HomeWidgetRepository.data;
|
||||
// Navigate into pages, avoiding to open the notification details page over another details page already opened
|
||||
String route = "";
|
||||
dynamic args;
|
||||
bool openComments = data!.notificationType.toString() == "2";
|
||||
|
||||
if (data.link.toString().isEmpty) {
|
||||
switch (data.type!) {
|
||||
case "infography":
|
||||
route = Routes.infography;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const InfographyRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "news":
|
||||
route = Routes.newsDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const NewsRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "radar":
|
||||
route = Routes.radarDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const RadarRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "video":
|
||||
route = Routes.studioDetails;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': int.parse(data.id.toString()),
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "podcast":
|
||||
route = Routes.podcasts;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': int.parse(data.id.toString()),
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (data.link!.startsWith('http')) {
|
||||
launchUrlString(
|
||||
'${data.link}',
|
||||
mode: LaunchMode.inAppWebView,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (route.isNotEmpty) {
|
||||
navigatorKey.currentState!.pushNamed(route, arguments: args);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,19 +43,49 @@ class AppInitializer {
|
|||
}
|
||||
|
||||
static Future<SettingsData> initilizeSettings() async {
|
||||
final brightness = await StorageService.getValue(key: 'brightness');
|
||||
if (brightness != null) {
|
||||
final themeMode = brightness == 'dark' ? ThemeMode.dark : ThemeMode.light;
|
||||
final fontFamily = await StorageService.getValue(key: 'fontFamily');
|
||||
final fontScale = double.parse(
|
||||
await StorageService.getValue(key: 'fontSizeScale'),
|
||||
);
|
||||
return SettingsData(
|
||||
fontFamily: fontFamily,
|
||||
fontScale: fontScale,
|
||||
themeMode: themeMode,
|
||||
);
|
||||
} else {
|
||||
try {
|
||||
final brightness = await StorageService.getValue(key: 'brightness');
|
||||
|
||||
if (brightness != null) {
|
||||
final themeMode =
|
||||
brightness == 'dark' ? ThemeMode.dark : ThemeMode.light;
|
||||
final fontFamily = await StorageService.getValue(key: 'fontFamily');
|
||||
final fontScale = double.parse(
|
||||
await StorageService.getValue(key: 'fontSizeScale'),
|
||||
);
|
||||
return SettingsData(
|
||||
fontFamily: fontFamily,
|
||||
fontScale: fontScale,
|
||||
themeMode: themeMode,
|
||||
);
|
||||
} else {
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeStart',
|
||||
value: '0',
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeEnd',
|
||||
value: '24',
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'fontFamily',
|
||||
value: 'Dana-FA',
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'fontSizeScale',
|
||||
value: '1',
|
||||
);
|
||||
await StorageService.setValue(
|
||||
key: 'brightness',
|
||||
value: 'light',
|
||||
);
|
||||
return SettingsData(
|
||||
fontFamily: 'Dana-FA',
|
||||
fontScale: 1,
|
||||
themeMode: ThemeMode.light,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
await StorageService.setValue(
|
||||
key: 'notificationTimeRangeStart',
|
||||
value: '0',
|
||||
|
|
@ -141,18 +171,26 @@ class AppInitializer {
|
|||
appId: '1:935017686266:ios:de47638bd662463fd2d543',
|
||||
messagingSenderId: '935017686266',
|
||||
projectId: 'didvan-9b7da',
|
||||
// iosBundleId: "com.didvan.didvanapp",
|
||||
// storageBucket: "didvan-9b7da.appspot.com",
|
||||
// iosClientId:
|
||||
// "935017686266-54hu01v9cc5pqpgofo1gk2n3hegj4r2m.apps.googleusercontent.com"
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
Firebase.app();
|
||||
}
|
||||
|
||||
final initMsg = await FirebaseMessaging.instance.getInitialMessage();
|
||||
|
||||
if (initMsg != null) {
|
||||
print("aaaaaaaaaa: ${initMsg.data}");
|
||||
clickAction = initMsg.data['click_action'].replaceAll(
|
||||
'navigate-',
|
||||
'',
|
||||
);
|
||||
}
|
||||
|
||||
final FirebaseMessaging fcm = FirebaseMessaging.instance;
|
||||
fcmToken = await fcm.getToken(
|
||||
vapidKey: kIsWeb
|
||||
|
|
|
|||
|
|
@ -1,12 +1,6 @@
|
|||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:didvan/main.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:didvan/services/app_home_widget/home_widget_repository.dart';
|
||||
import '../../../models/notification_message.dart';
|
||||
import '../../../models/requests/infography.dart';
|
||||
import '../../../models/requests/news.dart';
|
||||
import '../../../models/requests/radar.dart';
|
||||
import '../../../routes/routes.dart';
|
||||
|
||||
class NotificationController {
|
||||
/// Use this method to detect when a new notification or a schedule is created
|
||||
|
|
@ -14,7 +8,8 @@ class NotificationController {
|
|||
static Future<void> onNotificationCreatedMethod(
|
||||
ReceivedNotification receivedNotification) async {
|
||||
// Your code goes here
|
||||
// print("onNotificationCreatedMethod--------------------------------------------------------------");
|
||||
print(
|
||||
"onNotificationCreatedMethod--------------------------------------------------------------");
|
||||
}
|
||||
|
||||
/// Use this method to detect every time that a new notification is displayed
|
||||
|
|
@ -22,7 +17,8 @@ class NotificationController {
|
|||
static Future<void> onNotificationDisplayedMethod(
|
||||
ReceivedNotification receivedNotification) async {
|
||||
// Your code goes here
|
||||
// print("onNotificationDisplayedMethod--------------------------------------------------------------");
|
||||
print(
|
||||
"onNotificationDisplayedMethod--------------------------------------------------------------");
|
||||
}
|
||||
|
||||
/// Use this method to detect if the user dismissed a notification
|
||||
|
|
@ -30,88 +26,25 @@ class NotificationController {
|
|||
static Future<void> onDismissActionReceivedMethod(
|
||||
ReceivedAction receivedAction) async {
|
||||
// Your code goes here
|
||||
// print("onDismissActionReceivedMethod--------------------------------------------------------------");
|
||||
print(
|
||||
"onDismissActionReceivedMethod--------------------------------------------------------------");
|
||||
}
|
||||
|
||||
/// Use this method to detect when the user taps on a notification or action button
|
||||
@pragma("vm:entry-point")
|
||||
static Future<void> onActionReceivedMethod(
|
||||
ReceivedAction receivedAction) async {
|
||||
print("obiiiiiiiiiiiiiiii $receivedAction");
|
||||
NotificationMessage data =
|
||||
NotificationMessage.fromJson(receivedAction.payload!);
|
||||
// Your code goes here
|
||||
|
||||
// Navigate into pages, avoiding to open the notification details page over another details page already opened
|
||||
String route = "";
|
||||
dynamic args;
|
||||
bool openComments = data.notificationType.toString() == "2";
|
||||
|
||||
if (data.link.toString().isEmpty) {
|
||||
switch (data.type!) {
|
||||
case "infography":
|
||||
route = Routes.infography;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const InfographyRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "news":
|
||||
route = Routes.newsDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const NewsRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "radar":
|
||||
route = Routes.radarDetails;
|
||||
args = {
|
||||
// 'onMarkChanged': (id, value) =>
|
||||
// markChangeHandler(data.type, id, value),
|
||||
'id': int.parse(data.id.toString()),
|
||||
'args': const RadarRequestArgs(page: 0),
|
||||
'hasUnmarkConfirmation': false,
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "video":
|
||||
route = Routes.studioDetails;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': int.parse(data.id.toString()),
|
||||
'goToComment': openComments
|
||||
};
|
||||
break;
|
||||
case "podcast":
|
||||
route = Routes.podcasts;
|
||||
args = {
|
||||
'type': 'podcast',
|
||||
'id': data.id,
|
||||
};
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (data.link!.startsWith('http')) {
|
||||
launchUrlString(
|
||||
'${data.link}',
|
||||
mode: LaunchMode.inAppWebView,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (route.isNotEmpty) {
|
||||
navigatorKey.currentState!.pushNamed(route, arguments: args);
|
||||
}
|
||||
|
||||
HomeWidgetRepository.data = data;
|
||||
return;
|
||||
// MyApp.navigatorKey.currentState?.pushNamedAndRemoveUntil('/notification-page',
|
||||
// (route) => (route.settings.name != '/notification-page') || route.isFirst,
|
||||
// arguments: receivedAction);
|
||||
// print("onActionReceivedMethod--------------------------------------------------------------");
|
||||
print(
|
||||
"onActionReceivedMethod--------------------------------------------------------------");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:didvan/services/storage/storage.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:home_widget/home_widget.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import '../../../models/notification_message.dart';
|
||||
|
|
@ -11,24 +13,26 @@ import '../../network/request_helper.dart';
|
|||
import 'awsome_notification_controller.dart';
|
||||
|
||||
class AwsomeNotificationHandler {
|
||||
alarm() async {
|
||||
static ReceivedAction? initialAction;
|
||||
|
||||
alarm() async {
|
||||
AwesomeNotifications().initialize(
|
||||
// set the icon to null if you want to use the default app icon
|
||||
null,
|
||||
[
|
||||
NotificationChannel(
|
||||
channelKey: 'alerts',
|
||||
channelName: 'Alerts',
|
||||
channelDescription: 'Notification tests as alerts',
|
||||
playSound: true,
|
||||
onlyAlertOnce: true,
|
||||
groupAlertBehavior: GroupAlertBehavior.Children,
|
||||
importance: NotificationImportance.High,
|
||||
defaultPrivacy: NotificationPrivacy.Public,
|
||||
defaultColor: const Color(0xFF007EA7),
|
||||
criticalAlerts: true,
|
||||
ledColor: Colors.white)
|
||||
channelKey: 'alerts',
|
||||
channelName: 'Alerts',
|
||||
channelDescription: 'Notification tests as alerts',
|
||||
playSound: true,
|
||||
onlyAlertOnce: true,
|
||||
groupAlertBehavior: GroupAlertBehavior.Children,
|
||||
importance: NotificationImportance.High,
|
||||
defaultPrivacy: NotificationPrivacy.Public,
|
||||
defaultColor: const Color(0xFF007EA7),
|
||||
criticalAlerts: true,
|
||||
ledColor: Colors.white,
|
||||
)
|
||||
],
|
||||
|
||||
// Channel groups are only visual and are not required
|
||||
|
|
@ -39,15 +43,10 @@ class AwsomeNotificationHandler {
|
|||
// ],
|
||||
debug: true);
|
||||
|
||||
|
||||
AwesomeNotifications().setListeners(
|
||||
onActionReceivedMethod: NotificationController.onActionReceivedMethod,
|
||||
onNotificationCreatedMethod:
|
||||
NotificationController.onNotificationCreatedMethod,
|
||||
onNotificationDisplayedMethod:
|
||||
NotificationController.onNotificationDisplayedMethod,
|
||||
onDismissActionReceivedMethod:
|
||||
NotificationController.onDismissActionReceivedMethod);
|
||||
startListeningNotificationEvents();
|
||||
// Get initial notification action is optional
|
||||
initialAction = await AwesomeNotifications()
|
||||
.getInitialNotificationAction(removeFromActionEvents: false);
|
||||
|
||||
AwesomeNotifications().isNotificationAllowed().then((isAllowed) {
|
||||
//It would be more appropriate if you can show your own dialog
|
||||
|
|
@ -67,6 +66,19 @@ class AwsomeNotificationHandler {
|
|||
});
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
static Future<void> startListeningNotificationEvents() async {
|
||||
await AwesomeNotifications().setListeners(
|
||||
onActionReceivedMethod: NotificationController.onActionReceivedMethod,
|
||||
onNotificationCreatedMethod:
|
||||
NotificationController.onNotificationCreatedMethod,
|
||||
onNotificationDisplayedMethod:
|
||||
NotificationController.onNotificationDisplayedMethod,
|
||||
onDismissActionReceivedMethod:
|
||||
NotificationController.onDismissActionReceivedMethod);
|
||||
return;
|
||||
}
|
||||
|
||||
show(RemoteMessage message) async {
|
||||
NotificationMessage notificationMessage =
|
||||
NotificationMessage.fromJson(message.data);
|
||||
|
|
@ -103,8 +115,11 @@ class AwsomeNotificationHandler {
|
|||
actionType: ActionType.Default,
|
||||
title: "\u200f ${message.title} \u200f",
|
||||
// body: message.body.toString(),
|
||||
notificationLayout: NotificationLayout.Default,
|
||||
notificationLayout: Platform.isAndroid
|
||||
? NotificationLayout.Default
|
||||
: NotificationLayout.BigPicture,
|
||||
largeIcon: message.image.toString(),
|
||||
bigPicture: Platform.isAndroid ? null : message.image.toString(),
|
||||
payload: message.toPayload(),
|
||||
color: const Color(0xFF007EA7)),
|
||||
);
|
||||
|
|
@ -116,8 +131,11 @@ class AwsomeNotificationHandler {
|
|||
actionType: ActionType.Default,
|
||||
title: "\u200f ${message.title} \u200f",
|
||||
// body: message.body.toString(),
|
||||
notificationLayout: NotificationLayout.Default,
|
||||
notificationLayout: Platform.isAndroid
|
||||
? NotificationLayout.Default
|
||||
: NotificationLayout.BigPicture,
|
||||
largeIcon: message.image.toString(),
|
||||
bigPicture: Platform.isAndroid ? null : message.image.toString(),
|
||||
payload: message.toPayload(),
|
||||
color: const Color(0xFF007EA7)),
|
||||
schedule: NotificationCalendar(
|
||||
|
|
@ -153,16 +171,18 @@ class AwsomeNotificationHandler {
|
|||
actionType: ActionType.Default,
|
||||
body:
|
||||
"<b>${message.title.toString()}</b> ${message.body.toString()}",
|
||||
largeIcon: message.photo.toString(),
|
||||
largeIcon: Platform.isAndroid
|
||||
? message.photo.toString()
|
||||
: message.image.toString(),
|
||||
roundedLargeIcon: true,
|
||||
bigPicture: message.image.toString(),
|
||||
payload: message.toPayload(),
|
||||
notificationLayout: NotificationLayout.BigPicture,
|
||||
color: const Color(0xFF007EA7)),
|
||||
schedule: NotificationCalendar(
|
||||
hour: time.hour,
|
||||
minute: time.minute,
|
||||
));
|
||||
hour: time.hour,
|
||||
minute: time.minute,
|
||||
));
|
||||
}
|
||||
|
||||
// actionButtons: [
|
||||
|
|
@ -190,7 +210,7 @@ class AwsomeNotificationHandler {
|
|||
'Simple body with a bunch of Emojis! ${Emojis.transport_police_car} ${Emojis.animals_dog} ${Emojis.flag_UnitedStates} ${Emojis.person_baby}',
|
||||
largeIcon:
|
||||
'https://cdn.britannica.com/72/232772-050-4E3D86CC/mind-blown-emoji-head-exploding-emoticon.jpg',
|
||||
notificationLayout: NotificationLayout.BigPicture,
|
||||
notificationLayout: NotificationLayout.Default,
|
||||
payload: {
|
||||
'title': 'Notification Title',
|
||||
'body': 'Notification Body',
|
||||
|
|
@ -200,28 +220,26 @@ class AwsomeNotificationHandler {
|
|||
}
|
||||
|
||||
Future<DateTime?> _getTime() async {
|
||||
await HomeWidget.getWidgetData<String>('token', defaultValue: "")
|
||||
.then((value) async {
|
||||
final service = RequestService(RequestHelper.notificationTime(),
|
||||
useAutherization: false,
|
||||
requestHeaders: {
|
||||
"accept": "*/*",
|
||||
"Content-Type": "application/json; charset=UTF-8",
|
||||
'Authorization': 'Bearer $value'
|
||||
});
|
||||
await service.httpGet();
|
||||
if (service.isSuccess) {
|
||||
final time = service.data('time');
|
||||
DateTime result = DateTime.now();
|
||||
if (time.toString().isNotEmpty) {
|
||||
DateFormat format = DateFormat("HH:mm");
|
||||
DateTime dateTime = format.parse(time);
|
||||
result = DateTime.now().copyWith(hour: dateTime.hour, minute: dateTime.minute);
|
||||
}
|
||||
|
||||
final token = await StorageService.getValue(key: 'token');
|
||||
final service = RequestService(RequestHelper.notificationTime(),
|
||||
useAutherization: false,
|
||||
requestHeaders: {
|
||||
"accept": "*/*",
|
||||
"Content-Type": "application/json; charset=UTF-8",
|
||||
'Authorization': 'Bearer $token'
|
||||
});
|
||||
await service.httpGet();
|
||||
if (service.isSuccess) {
|
||||
final time = service.data('time');
|
||||
DateTime result = DateTime.now();
|
||||
if (time.toString().isNotEmpty) {
|
||||
DateFormat format = DateFormat("HH:mm");
|
||||
DateTime dateTime = format.parse(time);
|
||||
result = DateTime.now()
|
||||
.copyWith(hour: dateTime.hour, minute: dateTime.minute);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
|
@ -20,12 +22,23 @@ class FirebaseNotificationHandler {
|
|||
messagingSenderId: "935017686266",
|
||||
appId: "1:935017686266:web:a93f7a19bed23c51d2d543",
|
||||
measurementId: "G-80B4H9E8Y0")
|
||||
: const FirebaseOptions(
|
||||
apiKey: 'AIzaSyBp-UHjWeM0H0UHtX5yguFKG-riMzvvCzw',
|
||||
appId: '1:935017686266:android:f9cbc9aba8e3d65ed2d543',
|
||||
messagingSenderId: '935017686266',
|
||||
projectId: 'didvan-9b7da',
|
||||
),
|
||||
: Platform.isAndroid
|
||||
? const FirebaseOptions(
|
||||
apiKey: 'AIzaSyBp-UHjWeM0H0UHtX5yguFKG-riMzvvCzw',
|
||||
appId: '1:935017686266:android:f9cbc9aba8e3d65ed2d543',
|
||||
messagingSenderId: '935017686266',
|
||||
projectId: 'didvan-9b7da',
|
||||
)
|
||||
: const FirebaseOptions(
|
||||
apiKey: 'AIzaSyCMa-zg_uVhOfTnea5Klz6aPZlgHwVGj7U',
|
||||
appId: '1:935017686266:ios:de47638bd662463fd2d543',
|
||||
messagingSenderId: '935017686266',
|
||||
projectId: 'didvan-9b7da',
|
||||
// iosBundleId: "com.didvan.didvanapp",
|
||||
// storageBucket: "didvan-9b7da.appspot.com",
|
||||
// iosClientId:
|
||||
// "935017686266-54hu01v9cc5pqpgofo1gk2n3hegj4r2m.apps.googleusercontent.com"
|
||||
),
|
||||
);
|
||||
final initMsg = await FirebaseMessaging.instance.getInitialMessage();
|
||||
if (initMsg != null) {
|
||||
|
|
@ -56,5 +69,4 @@ class FirebaseNotificationHandler {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ class _AuthenticationState extends State<Authentication> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
body: Consumer<AuthenticationState>(
|
||||
builder: (context, state, child) => WillPopScope(
|
||||
onWillPop: () async {
|
||||
|
|
|
|||
|
|
@ -48,11 +48,11 @@ class AuthenticationState extends CoreProvier {
|
|||
await service.post();
|
||||
if (service.isSuccess && service.result['loggedIn']) {
|
||||
final token = service.result['token'];
|
||||
appState = AppState.idle;
|
||||
await userProvider.setAndGetToken(newToken: token);
|
||||
RequestService.token = token;
|
||||
HomeWidget.saveWidgetData("token", token.toString());
|
||||
await userProvider.getUserInfo();
|
||||
appState = AppState.idle;
|
||||
return token;
|
||||
} else {
|
||||
appState = AppState.failed;
|
||||
|
|
|
|||
|
|
@ -76,12 +76,12 @@ class _PasswordInputState extends State<PasswordInput> {
|
|||
final userProvider = context.read<UserProvider>();
|
||||
final token = await state.login(userProvider);
|
||||
if (token != null) {
|
||||
ActionSheetUtils.showLogoLoadingIndicator();
|
||||
await ServerDataProvider.getData();
|
||||
ActionSheetUtils.pop();
|
||||
|
||||
if (mounted) {
|
||||
Navigator.of(context).pushReplacementNamed(Routes.home);
|
||||
}
|
||||
|
||||
_showResetPasswordDialog();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ class DirectState extends CoreProvier {
|
|||
replyRadar = null;
|
||||
replyNews = null;
|
||||
notifyListeners();
|
||||
|
||||
final service =
|
||||
RequestService(RequestHelper.sendDirectMessage(typeId), body: body);
|
||||
|
||||
|
|
@ -147,7 +148,30 @@ class DirectState extends CoreProvier {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
service.multipart(
|
||||
messages.insert(
|
||||
0,
|
||||
MessageData(
|
||||
id: 0,
|
||||
writedByAdmin: false,
|
||||
readed: false,
|
||||
createdAt:
|
||||
DateTime.now().subtract(const Duration(minutes: 210)).toString(),
|
||||
text: text,
|
||||
audio: null,
|
||||
audioFile: uploadFile,
|
||||
radar: replyRadar,
|
||||
news: replyNews,
|
||||
audioDuration: audioDuration,
|
||||
),
|
||||
);
|
||||
|
||||
dailyMessages.clear();
|
||||
|
||||
for (var i = 0; i < messages.length; i++) {
|
||||
_addToDailyGrouped(messages[i]);
|
||||
}
|
||||
|
||||
await service.multipart(
|
||||
file: Platform.isIOS
|
||||
? File(uploadFile.path.replaceAll('file://', ''))
|
||||
: uploadFile,
|
||||
|
|
@ -157,6 +181,11 @@ class DirectState extends CoreProvier {
|
|||
mediaExtension: 'm4a',
|
||||
mediaFormat: 'audio',
|
||||
);
|
||||
|
||||
if (service.isSuccess) {
|
||||
final message = service.result['message'];
|
||||
messages[0].id = MessageData.fromJson(message).id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,7 +98,9 @@ class _AudioControllerButton extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
}
|
||||
if (snapshot.data == null && _nowPlaying) {
|
||||
if (snapshot.data == null &&
|
||||
_nowPlaying &&
|
||||
MediaService.audioPlayer.isPlaying.value) {
|
||||
return;
|
||||
}
|
||||
if (audioMetaData != null) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:didvan/config/design_config.dart';
|
||||
import 'package:didvan/models/notification_message.dart';
|
||||
import 'package:didvan/providers/theme.dart';
|
||||
import 'package:didvan/services/app_initalizer.dart';
|
||||
import 'package:didvan/services/notification/awsome/awsome_notification_controller.dart';
|
||||
import 'package:didvan/services/notification/awsome/awsome_notification_handler.dart';
|
||||
import 'package:didvan/views/home/bookmarks/bookmarks.dart';
|
||||
import 'package:didvan/views/home/categories/categories_page.dart';
|
||||
import 'package:didvan/views/home/main/main_page.dart';
|
||||
|
|
@ -26,6 +30,8 @@ class _HomeState extends State<Home>
|
|||
|
||||
@override
|
||||
void initState() {
|
||||
AwsomeNotificationHandler.startListeningNotificationEvents();
|
||||
|
||||
final state = context.read<HomeState>();
|
||||
DesignConfig.updateSystemUiOverlayStyle();
|
||||
_tabController = TabController(length: 4, vsync: this, initialIndex: 0);
|
||||
|
|
@ -33,9 +39,14 @@ class _HomeState extends State<Home>
|
|||
_tabController.addListener(() {
|
||||
state.currentPageIndex = _tabController.index;
|
||||
});
|
||||
|
||||
Future.delayed(Duration.zero, () {
|
||||
HomeWidgetRepository.fetchWidget();
|
||||
HomeWidgetRepository.decideWhereToGo();
|
||||
NotificationMessage? data = HomeWidgetRepository.data;
|
||||
if (data != null) {
|
||||
HomeWidgetRepository.decideWhereToGoNotif();
|
||||
}
|
||||
AppInitializer.handleCLick(state, _tabController);
|
||||
});
|
||||
state.refresh();
|
||||
|
|
|
|||
|
|
@ -142,6 +142,11 @@ class HomeState extends CoreProvier {
|
|||
|
||||
void refresh() async {
|
||||
menuItems = [
|
||||
MenuItemType(
|
||||
label: 'آمار و داده',
|
||||
asset: Assets.stats,
|
||||
link: 'tab-0',
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'دنیای فولاد',
|
||||
asset: Assets.fooladWorld,
|
||||
|
|
@ -153,19 +158,19 @@ class HomeState extends CoreProvier {
|
|||
link: Routes.radars,
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'آمار و داده',
|
||||
asset: Assets.stats,
|
||||
link: 'tab-0',
|
||||
label: 'ویدیوکست',
|
||||
asset: Assets.videocast,
|
||||
link: Routes.videocasts,
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'سها',
|
||||
asset: Assets.saha,
|
||||
link: 'https://saha.didvan.app',
|
||||
label: 'پادکست',
|
||||
asset: Assets.podcast,
|
||||
link: Routes.podcasts,
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'رادار استارتآپ',
|
||||
asset: Assets.startup,
|
||||
link: 'https://startup.didvan.app/',
|
||||
label: 'اینفوگرافی',
|
||||
asset: Assets.infography,
|
||||
link: Routes.infography,
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'رادار روند',
|
||||
|
|
@ -183,19 +188,14 @@ class HomeState extends CoreProvier {
|
|||
link: 'https://risk.didvan.app/',
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'اینفوگرافی',
|
||||
asset: Assets.infography,
|
||||
link: Routes.infography,
|
||||
label: 'رادار استارتآپ',
|
||||
asset: Assets.startup,
|
||||
link: 'https://startup.didvan.app/',
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'ویدیوکست',
|
||||
asset: Assets.videocast,
|
||||
link: Routes.videocasts,
|
||||
),
|
||||
MenuItemType(
|
||||
label: 'پادکست',
|
||||
asset: Assets.podcast,
|
||||
link: Routes.podcasts,
|
||||
label: 'سها',
|
||||
asset: Assets.saha,
|
||||
link: 'https://saha.didvan.app',
|
||||
),
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import 'dart:async';
|
|||
import 'package:didvan/constants/app_icons.dart';
|
||||
import 'package:didvan/models/infography/info_tag.dart';
|
||||
import 'package:didvan/models/view/action_sheet_data.dart';
|
||||
import 'package:didvan/routes/routes.dart';
|
||||
import 'package:didvan/utils/action_sheet.dart';
|
||||
import 'package:didvan/views/home/infography/infography_screen_state.dart';
|
||||
import 'package:didvan/views/home/main/widgets/infography_item.dart';
|
||||
|
|
@ -20,7 +21,8 @@ import 'package:provider/provider.dart';
|
|||
import 'package:animated_custom_dropdown/custom_dropdown.dart';
|
||||
|
||||
class InfographyScreen extends StatefulWidget {
|
||||
const InfographyScreen({super.key});
|
||||
final Map<String, dynamic>? pageData;
|
||||
const InfographyScreen({super.key, this.pageData});
|
||||
|
||||
@override
|
||||
State<InfographyScreen> createState() => _InfographyScreenState();
|
||||
|
|
@ -36,6 +38,25 @@ class _InfographyScreenState extends State<InfographyScreen> {
|
|||
void initState() {
|
||||
context.read<InfographyScreenState>().init();
|
||||
_scrollController.addListener(_onScroll);
|
||||
|
||||
if (widget.pageData?['goToComment'] != null) {
|
||||
var openComments = widget.pageData?['goToComment'];
|
||||
|
||||
if (openComments) {
|
||||
Future.delayed(
|
||||
const Duration(seconds: 1),
|
||||
() => Navigator.of(context).pushNamed(
|
||||
Routes.mentions,
|
||||
arguments: {
|
||||
'id': widget.pageData?['id'],
|
||||
'type': 'banner',
|
||||
'title': '',
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ class Mentions extends StatefulWidget {
|
|||
|
||||
class _MentionsState extends State<Mentions> {
|
||||
final _focusNode = FocusNode();
|
||||
final _focusNodeMention = FocusNode();
|
||||
double _bottomPadding = 0;
|
||||
|
||||
@override
|
||||
|
|
@ -142,7 +143,7 @@ class _MentionsState extends State<Mentions> {
|
|||
enableEmptyState: state.users.isEmpty,
|
||||
emptyState: EmptyState(
|
||||
asset: Assets.emptyBookmark,
|
||||
title: 'لیست خالی است',
|
||||
title: 'لیست افراد خالی است',
|
||||
),
|
||||
builder: (context, state, index) {
|
||||
return UserMention(
|
||||
|
|
@ -158,6 +159,7 @@ class _MentionsState extends State<Mentions> {
|
|||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
focusNode: _focusNodeMention,
|
||||
keyboardType: TextInputType.multiline,
|
||||
textInputAction: TextInputAction.send,
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
|
|
@ -166,7 +168,7 @@ class _MentionsState extends State<Mentions> {
|
|||
decoration: InputDecoration(
|
||||
icon: const Icon(DidvanIcons.search_regular),
|
||||
border: InputBorder.none,
|
||||
hintText: 'جستجو کنید...',
|
||||
hintText: 'نام فرد مورد نظر را بنویسید...',
|
||||
hintStyle: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
|
|
@ -204,7 +206,10 @@ class _MentionsState extends State<Mentions> {
|
|||
left: 0,
|
||||
right: 0,
|
||||
bottom: MediaQuery.of(context).viewInsets.bottom,
|
||||
child: _MessageBox(focusNode: _focusNode),
|
||||
child: _MessageBox(
|
||||
focusNode: _focusNode,
|
||||
focusNodeMention: _focusNodeMention,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
@ -214,8 +219,11 @@ class _MentionsState extends State<Mentions> {
|
|||
|
||||
class _MessageBox extends StatefulWidget {
|
||||
final FocusNode focusNode;
|
||||
final FocusNode focusNodeMention;
|
||||
|
||||
const _MessageBox({Key? key, required this.focusNode}) : super(key: key);
|
||||
const _MessageBox(
|
||||
{Key? key, required this.focusNode, required this.focusNodeMention})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<_MessageBox> createState() => _MessageBoxState();
|
||||
|
|
@ -379,12 +387,23 @@ class _MessageBoxState extends State<_MessageBox> {
|
|||
),
|
||||
child: Row(
|
||||
children: [
|
||||
DidvanIconButton(
|
||||
onPressed: () => _onSend(state),
|
||||
icon: DidvanIcons.send_solid,
|
||||
size: 24,
|
||||
color: Theme.of(context).colorScheme.focusedBorder,
|
||||
),
|
||||
state.mentionedUsers.isEmpty
|
||||
? DidvanIconButton(
|
||||
onPressed: () {
|
||||
state.showUsersForMentionsLayout = true;
|
||||
widget.focusNodeMention.requestFocus();
|
||||
state.update();
|
||||
},
|
||||
icon: DidvanIcons.mention_icon,
|
||||
size: 24,
|
||||
color: Theme.of(context).colorScheme.focusedBorder,
|
||||
)
|
||||
: DidvanIconButton(
|
||||
onPressed: () => _onSend(state),
|
||||
icon: DidvanIcons.send_solid,
|
||||
size: 24,
|
||||
color: Theme.of(context).colorScheme.focusedBorder,
|
||||
),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
focusNode: widget.focusNode,
|
||||
|
|
@ -392,21 +411,32 @@ class _MessageBoxState extends State<_MessageBox> {
|
|||
keyboardType: TextInputType.multiline,
|
||||
textInputAction: TextInputAction.send,
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
onTap: () {
|
||||
if (state.mentionedUsers.isEmpty) {
|
||||
state.showUsersForMentionsLayout = true;
|
||||
widget.focusNodeMention.requestFocus();
|
||||
state.update();
|
||||
}
|
||||
},
|
||||
onEditingComplete: () {},
|
||||
onSubmitted: (value) => _onSend(state),
|
||||
decoration: InputDecoration(
|
||||
border: InputBorder.none,
|
||||
hintText: 'پیام خود را ارسال کنید',
|
||||
hintMaxLines: 2,
|
||||
hintText: state.mentionedUsers.isEmpty
|
||||
? 'همکاران خود را فراخوانی کنید'
|
||||
: 'پیام خود را ارسال کنید',
|
||||
hintStyle: Theme.of(context).textTheme.bodySmall!.copyWith(
|
||||
color: Theme.of(context).colorScheme.disabledText),
|
||||
),
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
if (!state.showUsersForMentionsLayout)
|
||||
if (!state.showUsersForMentionsLayout &&
|
||||
state.mentionedUsers.isNotEmpty)
|
||||
DidvanIconButton(
|
||||
onPressed: () {
|
||||
state.showUsersForMentionsLayout = true;
|
||||
widget.focusNodeMention.requestFocus();
|
||||
state.update();
|
||||
},
|
||||
icon: DidvanIcons.mention_icon,
|
||||
|
|
|
|||
|
|
@ -85,12 +85,14 @@ class MentionState extends State<Mention> {
|
|||
color: Theme.of(context).colorScheme.caption,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
DidvanIconButton(
|
||||
size: 18,
|
||||
gestureSize: 24,
|
||||
icon: DidvanIcons.menu_light,
|
||||
onPressed: () => _showCommentActions(comment),
|
||||
),
|
||||
if (comment.user.id ==
|
||||
context.read<UserProvider>().user.id)
|
||||
DidvanIconButton(
|
||||
size: 18,
|
||||
gestureSize: 24,
|
||||
icon: DidvanIcons.menu_light,
|
||||
onPressed: () => _showCommentActions(comment),
|
||||
),
|
||||
],
|
||||
),
|
||||
DidvanText(
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import 'package:didvan/models/enums.dart';
|
|||
import 'package:didvan/models/requests/studio.dart';
|
||||
import 'package:didvan/models/view/action_sheet_data.dart';
|
||||
import 'package:didvan/models/view/app_bar_data.dart';
|
||||
import 'package:didvan/routes/routes.dart';
|
||||
import 'package:didvan/utils/action_sheet.dart';
|
||||
import 'package:didvan/views/podcasts/podcasts_state.dart';
|
||||
import 'package:didvan/views/podcasts/widgets/slider.dart';
|
||||
|
|
@ -26,8 +27,11 @@ import 'package:flutter/material.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
|
||||
class Podcasts extends StatefulWidget {
|
||||
final Map<String, dynamic>? pageData;
|
||||
final bool? viewPodcasts;
|
||||
const Podcasts({Key? key, this.viewPodcasts}) : super(key: key);
|
||||
|
||||
const Podcasts({Key? key, this.viewPodcasts, this.pageData})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<Podcasts> createState() => _PodcastsState();
|
||||
|
|
@ -40,6 +44,25 @@ class _PodcastsState extends State<Podcasts> {
|
|||
@override
|
||||
void initState() {
|
||||
context.read<PodcastsState>().init(widget.viewPodcasts);
|
||||
|
||||
if (widget.pageData?['goToComment'] != null) {
|
||||
var openComments = widget.pageData?['goToComment'];
|
||||
|
||||
if (openComments) {
|
||||
Future.delayed(
|
||||
const Duration(seconds: 1),
|
||||
() => Navigator.of(context).pushNamed(
|
||||
Routes.mentions,
|
||||
arguments: {
|
||||
'id': widget.pageData?['id'],
|
||||
'type': 'studio',
|
||||
'title': '',
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import 'package:didvan/views/widgets/didvan/app_bar.dart';
|
|||
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:didvan/routes/routes.dart';
|
||||
|
||||
class StudioDetails extends StatefulWidget {
|
||||
final Map<String, dynamic> pageData;
|
||||
|
|
@ -36,14 +37,27 @@ class _StudioDetailsState extends State<StudioDetails> {
|
|||
);
|
||||
final state = context.read<StudioDetailsState>();
|
||||
state.args = widget.pageData['args'];
|
||||
|
||||
Future.delayed(
|
||||
Duration.zero,
|
||||
() => state.getStudioDetails(widget.pageData['id']),
|
||||
);
|
||||
|
||||
if (widget.pageData['goToComment'] != null) {
|
||||
var openComments = widget.pageData['goToComment'];
|
||||
|
||||
if (openComments) {
|
||||
state.selectedDetailsIndex = 1;
|
||||
Future.delayed(
|
||||
const Duration(seconds: 1),
|
||||
() => Navigator.of(context).pushNamed(
|
||||
Routes.mentions,
|
||||
arguments: {
|
||||
'id': state.studio.id,
|
||||
'type': 'studio',
|
||||
'title': state.studio.title,
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
super.initState();
|
||||
|
|
|
|||
|
|
@ -48,100 +48,102 @@ class _EditProfileState extends State<EditProfile> {
|
|||
builder: (context, state, child) => Material(
|
||||
child: Stack(
|
||||
children: [
|
||||
Form(
|
||||
key: _formKey,
|
||||
child: DidvanScaffold(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 16,
|
||||
left: 16,
|
||||
right: 16,
|
||||
bottom: 92,
|
||||
),
|
||||
appBarData: AppBarData(title: 'ویرایش پروفایل'),
|
||||
children: [
|
||||
const ProfilePhoto(),
|
||||
const SizedBox(height: 16),
|
||||
DidvanCard(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
DidvanTextField(
|
||||
title: 'نام و نام خانوادگی',
|
||||
hintText: 'نام و نام خانوادگی',
|
||||
initialValue: state.user.fullName,
|
||||
onChanged: (value) {
|
||||
_setButtonState();
|
||||
fullName = value;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'موبایل',
|
||||
enabled: false,
|
||||
hintText: state.user.phoneNumber,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'نام کاربری',
|
||||
hintText: 'انتخاب نام کاربری (اختیاری)',
|
||||
onChanged: _onUsernameChanged,
|
||||
initialValue: state.user.username,
|
||||
acceptSpace: false,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: DidvanText(
|
||||
'نام کاربری میتواند شامل کاراکترهای کوچک و بزرگ انگلیسی و اعداد باشد.',
|
||||
style: Theme.of(context).textTheme.labelSmall,
|
||||
),
|
||||
),
|
||||
AnimatedVisibility(
|
||||
duration: DesignConfig.lowAnimationDuration,
|
||||
isVisible: !_usernameIsAvailible,
|
||||
child: DidvanText(
|
||||
'نام کاربری در دسترس نمیباشد',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
color: Theme.of(context).colorScheme.error,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'ایمیل',
|
||||
hintText: 'مثال: example@email.com',
|
||||
onChanged: (value) {
|
||||
_setButtonState();
|
||||
email = value;
|
||||
},
|
||||
initialValue: state.user.email,
|
||||
validator: (value) {
|
||||
if (value.isEmpty) return null;
|
||||
bool emailValid = RegExp(
|
||||
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
|
||||
.hasMatch(value);
|
||||
if (!emailValid) {
|
||||
return 'ایمیل وارد شده معتبر نمیباشد';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
// const SizedBox(height: 16),
|
||||
// DidvanSwitch(
|
||||
// value: true,
|
||||
// title: 'ورود با اثر انگشت',
|
||||
// onChanged: (value) => {},
|
||||
// ),
|
||||
const DidvanDivider(),
|
||||
MenuOption(
|
||||
title: 'تغییر رمز عبور',
|
||||
onTap: () => Navigator.of(context).pushNamed(
|
||||
Routes.authenticaion,
|
||||
arguments: true,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.only(bottom: 80),
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
child: DidvanScaffold(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 16,
|
||||
left: 16,
|
||||
right: 16,
|
||||
),
|
||||
],
|
||||
appBarData: AppBarData(title: 'ویرایش پروفایل'),
|
||||
children: [
|
||||
const ProfilePhoto(),
|
||||
const SizedBox(height: 16),
|
||||
DidvanCard(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
DidvanTextField(
|
||||
title: 'نام و نام خانوادگی',
|
||||
hintText: 'نام و نام خانوادگی',
|
||||
initialValue: state.user.fullName,
|
||||
onChanged: (value) {
|
||||
_setButtonState();
|
||||
fullName = value;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'موبایل',
|
||||
enabled: false,
|
||||
hintText: state.user.phoneNumber,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'نام کاربری',
|
||||
hintText: 'انتخاب نام کاربری (اختیاری)',
|
||||
onChanged: _onUsernameChanged,
|
||||
initialValue: state.user.username,
|
||||
acceptSpace: false,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: DidvanText(
|
||||
'نام کاربری میتواند شامل کاراکترهای کوچک و بزرگ انگلیسی و اعداد باشد.',
|
||||
style: Theme.of(context).textTheme.labelSmall,
|
||||
),
|
||||
),
|
||||
AnimatedVisibility(
|
||||
duration: DesignConfig.lowAnimationDuration,
|
||||
isVisible: !_usernameIsAvailible,
|
||||
child: DidvanText(
|
||||
'نام کاربری در دسترس نمیباشد',
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
color: Theme.of(context).colorScheme.error,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DidvanTextField(
|
||||
title: 'ایمیل',
|
||||
hintText: 'مثال: example@email.com',
|
||||
onChanged: (value) {
|
||||
_setButtonState();
|
||||
email = value;
|
||||
},
|
||||
initialValue: state.user.email,
|
||||
validator: (value) {
|
||||
if (value.isEmpty) return null;
|
||||
bool emailValid = RegExp(
|
||||
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
|
||||
.hasMatch(value);
|
||||
if (!emailValid) {
|
||||
return 'ایمیل وارد شده معتبر نمیباشد';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
// const SizedBox(height: 16),
|
||||
// DidvanSwitch(
|
||||
// value: true,
|
||||
// title: 'ورود با اثر انگشت',
|
||||
// onChanged: (value) => {},
|
||||
// ),
|
||||
const DidvanDivider(),
|
||||
MenuOption(
|
||||
title: 'تغییر رمز عبور',
|
||||
onTap: () => Navigator.of(context).pushNamed(
|
||||
Routes.authenticaion,
|
||||
arguments: true,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
import 'package:didvan/config/design_config.dart';
|
||||
import 'package:didvan/constants/assets.dart';
|
||||
import 'package:didvan/main.dart';
|
||||
|
|
@ -19,7 +18,6 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
|
||||
class Splash extends StatefulWidget {
|
||||
const Splash({Key? key}) : super(key: key);
|
||||
|
||||
|
|
@ -28,24 +26,24 @@ class Splash extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _SplashState extends State<Splash> {
|
||||
bool _isGettingThemeData = true;
|
||||
bool _errorOccured = false;
|
||||
late ThemeProvider themeProvider;
|
||||
late UserProvider userProvider;
|
||||
late MediaProvider mediaProvider;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_initialize();
|
||||
super.initState();
|
||||
|
||||
themeProvider = context.read<ThemeProvider>();
|
||||
userProvider = context.read<UserProvider>();
|
||||
mediaProvider = context.read<MediaProvider>();
|
||||
|
||||
_initialize(themeProvider, userProvider, mediaProvider);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_isGettingThemeData) {
|
||||
return Container(
|
||||
color: Colors.transparent,
|
||||
height: double.infinity,
|
||||
width: double.infinity,
|
||||
);
|
||||
}
|
||||
return AnnotatedRegion<SystemUiOverlayStyle>(
|
||||
value: DesignConfig.systemUiOverlayStyle.copyWith(
|
||||
systemNavigationBarColor: Theme.of(context).colorScheme.background,
|
||||
|
|
@ -77,7 +75,7 @@ class _SplashState extends State<Splash> {
|
|||
setState(() {
|
||||
_errorOccured = false;
|
||||
});
|
||||
_initialize();
|
||||
_initialize(themeProvider, userProvider, mediaProvider);
|
||||
},
|
||||
),
|
||||
],
|
||||
|
|
@ -87,73 +85,70 @@ class _SplashState extends State<Splash> {
|
|||
);
|
||||
}
|
||||
|
||||
Future<void> _initialize() async {
|
||||
Future<void> _initialize(ThemeProvider themeProvider,
|
||||
UserProvider userProvider, MediaProvider mediaProvider) async {
|
||||
try {
|
||||
var v = navigatorKey.currentContext;
|
||||
ActionSheetUtils.context = navigatorKey.currentContext!;
|
||||
|
||||
if (kIsWeb) {
|
||||
html.window.onBeforeUnload.listen((event) {
|
||||
StorageService.webStorage
|
||||
.removeWhere((key, value) => key == 'image-cache');
|
||||
});
|
||||
}
|
||||
|
||||
final settingsData = await AppInitializer.initilizeSettings();
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
final themeProvider = context.read<ThemeProvider>();
|
||||
|
||||
themeProvider.themeMode = settingsData.themeMode;
|
||||
themeProvider.fontFamily = settingsData.fontFamily;
|
||||
themeProvider.fontScale = settingsData.fontScale;
|
||||
await Future.delayed(
|
||||
const Duration(milliseconds: 200),
|
||||
() => setState(() {
|
||||
_isGettingThemeData = false;
|
||||
}),
|
||||
);
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
await AppInitializer.setupServices(context);
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
final userProvider = context.read<UserProvider>();
|
||||
|
||||
await AppInitializer.setupServices(navigatorKey.currentContext!);
|
||||
|
||||
final String? token = await userProvider.setAndGetToken();
|
||||
|
||||
if (token != null) {
|
||||
if (!kIsWeb && mounted) {
|
||||
context.read<MediaProvider>().getDownloadsList();
|
||||
if (!kIsWeb) {
|
||||
await mediaProvider.getDownloadsList();
|
||||
}
|
||||
|
||||
RequestService.token = token;
|
||||
|
||||
final result = await userProvider.getUserInfo();
|
||||
if (!result && mounted) {
|
||||
StorageService.delete(key: 'token');
|
||||
Navigator.of(context).pushNamedAndRemoveUntil(
|
||||
|
||||
if (!result) {
|
||||
try {
|
||||
StorageService.delete(key: 'token');
|
||||
} catch (e) {
|
||||
// catch
|
||||
}
|
||||
|
||||
navigatorKey.currentState!.pushNamedAndRemoveUntil(
|
||||
Routes.splash,
|
||||
(_) => false,
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
await ServerDataProvider.getData();
|
||||
}
|
||||
if (mounted) {
|
||||
Navigator.of(context).pushReplacementNamed(
|
||||
token == null ? Routes.authenticaion : Routes.home,
|
||||
arguments: token == null ? false : null,
|
||||
);
|
||||
|
||||
navigatorKey.currentState!.pushReplacementNamed(
|
||||
token == null ? Routes.authenticaion : Routes.home,
|
||||
arguments: token == null ? false : null,
|
||||
);
|
||||
|
||||
return;
|
||||
|
||||
return;
|
||||
// await HomeWidget.getWidgetData<String>("cRouteGoTo", defaultValue: '')
|
||||
// .then((cRouteGoTo) async {
|
||||
// if (cRouteGoTo!.isNotEmpty) {
|
||||
// navigatorKey.currentState!
|
||||
// .pushNamed(cRouteGoTo.toString(), arguments:cRouteArgs );
|
||||
// HomeWidget.saveWidgetData("cRouteGoTo", '');
|
||||
// }
|
||||
// });
|
||||
}
|
||||
// await HomeWidget.getWidgetData<String>("cRouteGoTo", defaultValue: '')
|
||||
// .then((cRouteGoTo) async {
|
||||
// if (cRouteGoTo!.isNotEmpty) {
|
||||
// navigatorKey.currentState!
|
||||
// .pushNamed(cRouteGoTo.toString(), arguments:cRouteArgs );
|
||||
// HomeWidget.saveWidgetData("cRouteGoTo", '');
|
||||
// }
|
||||
// });
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_errorOccured = true;
|
||||
|
|
|
|||
|
|
@ -51,12 +51,11 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
|
|||
Future.delayed(
|
||||
const Duration(seconds: 1),
|
||||
() => Navigator.of(context).pushNamed(
|
||||
Routes.comments,
|
||||
Routes.mentions,
|
||||
arguments: {
|
||||
'id': widget.item.id,
|
||||
'type': widget.isRadar ? 'radar' : 'news',
|
||||
'title': widget.item.title,
|
||||
'onCommentsChanged': widget.onCommentsChanged,
|
||||
},
|
||||
),
|
||||
);
|
||||
|
|
@ -77,12 +76,11 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
|
|||
Future.delayed(
|
||||
const Duration(seconds: 1),
|
||||
() => Navigator.of(context).pushNamed(
|
||||
Routes.comments,
|
||||
Routes.mentions,
|
||||
arguments: {
|
||||
'id': widget.item.id,
|
||||
'type': widget.isRadar ? 'radar' : 'news',
|
||||
'title': widget.item.title,
|
||||
'onCommentsChanged': widget.onCommentsChanged,
|
||||
},
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
|
|||
builder: (context, state, child) => SearchField(
|
||||
key: state.search.isEmpty ? ValueKey(state.search) : null,
|
||||
value: state.search,
|
||||
title: state.currentPageIndex == 3 ? 'رصدهای من' : 'دیدوان',
|
||||
title: 'دیدوان',
|
||||
onChanged: (value) => _onChanged(value, context),
|
||||
focusNode: state.searchFieldFocusNode,
|
||||
onFilterButtonPressed: () => _showFilterBottomSheet(context),
|
||||
|
|
|
|||
36
pubspec.lock
36
pubspec.lock
|
|
@ -5,18 +5,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _flutterfire_internals
|
||||
sha256: "2350805d7afefb0efe7acd325cb19d3ae8ba4039b906eade3807ffb69938a01f"
|
||||
sha256: e4be6711f96d3d4eebe79728897d645b7a5585bbfdd6d534878d202c171266d7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.33"
|
||||
version: "1.3.34"
|
||||
android_intent_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: android_intent_plus
|
||||
sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074"
|
||||
sha256: bfb29839be3886fa48faa631aa0123cd8531205df1abb80ee804935c75dd3cdb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.2"
|
||||
version: "5.0.0"
|
||||
animated_custom_dropdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
@ -298,14 +298,38 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3+1"
|
||||
firebase_auth:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_auth
|
||||
sha256: ea95cd29e27e8ec1971af263d74b208ce85dbc7df9197d8b5eab2aa7de7cfea8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.19.6"
|
||||
firebase_auth_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_platform_interface
|
||||
sha256: c252d2c97a02cf03fbf3595c5f7edf2a731062356b09d2c338f0b3d63567239f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.2.7"
|
||||
firebase_auth_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_auth_web
|
||||
sha256: "5db2319d59b4bb08cf0cc26e0f110f9ae1cf9cf775ce516e5cc38cd6704253de"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.11.6"
|
||||
firebase_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_core
|
||||
sha256: "372d94ced114b9c40cb85e18c50ac94a7e998c8eec630c50d7aec047847d27bf"
|
||||
sha256: "4b5100e2dbc3fe72c2d4241a046d3f01457fe11293283a324f5c52575e3406f8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.31.0"
|
||||
version: "2.31.1"
|
||||
firebase_core_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -82,8 +82,9 @@ dependencies:
|
|||
awesome_notifications_core: ^0.9.0
|
||||
awesome_notifications: any
|
||||
home_widget: ^0.5.0
|
||||
android_intent_plus: ^5.0.2
|
||||
android_intent_plus: ^5.0.0
|
||||
get: ^4.6.6
|
||||
firebase_auth: ^4.19.6
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
|
|||
Loading…
Reference in New Issue