Initial commit
43
.gitignore
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
30
.metadata
Normal file
|
@ -0,0 +1,30 @@
|
|||
# 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: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: android
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
|
||||
# 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'
|
25
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "haveno_flutter_app",
|
||||
"request": "launch",
|
||||
"type": "dart"
|
||||
},
|
||||
{
|
||||
"name": "haveno_flutter_app (profile mode)",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"flutterMode": "profile"
|
||||
},
|
||||
{
|
||||
"name": "haveno_flutter_app (release mode)",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"flutterMode": "release"
|
||||
}
|
||||
]
|
||||
}
|
3
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"cmake.configureOnOpen": false
|
||||
}
|
16
README.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
# haveno_flutter_app
|
||||
|
||||
A new Flutter project.
|
||||
|
||||
## Getting Started
|
||||
|
||||
This project is a starting point for a Flutter application.
|
||||
|
||||
A few resources to get you started if this is your first Flutter project:
|
||||
|
||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
||||
|
||||
For help getting started with Flutter development, view the
|
||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
31
analysis_options.yaml
Normal file
|
@ -0,0 +1,31 @@
|
|||
# This file configures the analyzer, which statically analyzes Dart code to
|
||||
# check for errors, warnings, and lints.
|
||||
#
|
||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||
# invoked from the command line by running `flutter analyze`.
|
||||
|
||||
# The following line activates a set of recommended lints for Flutter apps,
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
analyzer:
|
||||
errors:
|
||||
avoid_print: ignore
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at https://dart.dev/lints.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
13
android/.gitignore
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
gradle-wrapper.jar
|
||||
/.gradle
|
||||
/captures/
|
||||
/gradlew
|
||||
/gradlew.bat
|
||||
/local.properties
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
key.properties
|
||||
**/*.keystore
|
||||
**/*.jks
|
58
android/app/build.gradle
Normal file
|
@ -0,0 +1,58 @@
|
|||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file("local.properties")
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader("UTF-8") { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = "1"
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty("flutter.versionName")
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = "1.0"
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.example.haveno_flutter_app"
|
||||
compileSdk = flutter.compileSdkVersion
|
||||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId = "com.example.haveno_flutter_app"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdk = flutter.minSdkVersion
|
||||
targetSdk = flutter.targetSdkVersion
|
||||
versionCode = flutterVersionCode.toInteger()
|
||||
versionName = flutterVersionName
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig = signingConfigs.debug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source = "../.."
|
||||
}
|
7
android/app/src/debug/AndroidManifest.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
45
android/app/src/main/AndroidManifest.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<application
|
||||
android:label="haveno_flutter_app"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:taskAffinity=""
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
</application>
|
||||
<!-- Required to query activities that can process text, see:
|
||||
https://developer.android.com/training/package-visibility and
|
||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||
|
||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
||||
<data android:mimeType="text/plain"/>
|
||||
</intent>
|
||||
</queries>
|
||||
</manifest>
|
|
@ -0,0 +1,5 @@
|
|||
package com.example.haveno_flutter_app
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity()
|
12
android/app/src/main/res/drawable-v21/launch_background.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="?android:colorBackground" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
12
android/app/src/main/res/drawable-v214e19131
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="?android:colorBackground" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
12
android/app/src/main/res/drawable/launch_background.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@android:color/white" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 544 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 442 B |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 721 B |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
18
android/app/src/main/res/values-night/styles.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
18
android/app/src/main/res/values/styles.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
7
android/app/src/profile/AndroidManifest.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
18
android/build.gradle
Normal file
|
@ -0,0 +1,18 @@
|
|||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = "../build"
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(":app")
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
3
android/gradle.properties
Normal file
|
@ -0,0 +1,3 @@
|
|||
org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
5
android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
25
android/settings.gradle
Normal file
|
@ -0,0 +1,25 @@
|
|||
pluginManagement {
|
||||
def flutterSdkPath = {
|
||||
def properties = new Properties()
|
||||
file("local.properties").withInputStream { properties.load(it) }
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
return flutterSdkPath
|
||||
}()
|
||||
|
||||
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
BIN
assets/haveno-logo.png
Normal file
After Width: | Height: | Size: 24 KiB |
3
devtools_options.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
description: This file stores settings for Dart & Flutter DevTools.
|
||||
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
||||
extensions:
|
BIN
flutter_01.png
Normal file
After Width: | Height: | Size: 68 KiB |
34
ios/.gitignore
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
**/dgph
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.moved-aside
|
||||
*.pbxuser
|
||||
*.perspectivev3
|
||||
**/*sync/
|
||||
.sconsign.dblite
|
||||
.tags*
|
||||
**/.vagrant/
|
||||
**/DerivedData/
|
||||
Icon?
|
||||
**/Pods/
|
||||
**/.symlinks/
|
||||
profile
|
||||
xcuserdata
|
||||
**/.generated/
|
||||
Flutter/App.framework
|
||||
Flutter/Flutter.framework
|
||||
Flutter/Flutter.podspec
|
||||
Flutter/Generated.xcconfig
|
||||
Flutter/ephemeral/
|
||||
Flutter/app.flx
|
||||
Flutter/app.zip
|
||||
Flutter/flutter_assets/
|
||||
Flutter/flutter_export_environment.sh
|
||||
ServiceDefinitions.json
|
||||
Runner/GeneratedPluginRegistrant.*
|
||||
|
||||
# Exceptions to above rules.
|
||||
!default.mode1v3
|
||||
!default.mode2v3
|
||||
!default.pbxuser
|
||||
!default.perspectivev3
|
26
ios/Flutter/AppFrameworkInfo.plist
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?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>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>App</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>io.flutter.flutter.app</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>App</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
1
ios/Flutter/Debug.xcconfig
Normal file
|
@ -0,0 +1 @@
|
|||
#include "Generated.xcconfig"
|
1
ios/Flutter/Release.xcconfig
Normal file
|
@ -0,0 +1 @@
|
|||
#include "Generated.xcconfig"
|
616
ios/Runner.xcodeproj/project.pbxproj
Normal file
|
@ -0,0 +1,616 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
|
||||
remoteInfo = Runner;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
||||
);
|
||||
path = RunnerTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||
);
|
||||
name = Flutter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146E51CF9000F007C117D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146EF1CF9000F007C117D /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
|
||||
97C147021CF9000F007C117D /* Info.plist */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
|
||||
);
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
331C8080294A63A400263BE5 /* RunnerTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||
buildPhases = (
|
||||
331C807D294A63A400263BE5 /* Sources */,
|
||||
331C807F294A63A400263BE5 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */,
|
||||
);
|
||||
name = RunnerTests;
|
||||
productName = RunnerTests;
|
||||
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Runner;
|
||||
productName = Runner;
|
||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 1510;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
331C8080294A63A400263BE5 = {
|
||||
CreatedOnToolsVersion = 14.0;
|
||||
TestTargetID = 97C146ED1CF9000F007C117D;
|
||||
};
|
||||
97C146ED1CF9000F007C117D = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
LastSwiftMigration = 1100;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
97C146ED1CF9000F007C117D /* Runner */,
|
||||
331C8080294A63A400263BE5 /* RunnerTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
331C807F294A63A400263BE5 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
97C146EC1CF9000F007C117D /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
||||
);
|
||||
name = "Thin Binary";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
331C807D294A63A400263BE5 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
97C146EA1CF9000F007C117D /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 97C146ED1CF9000F007C117D /* Runner */;
|
||||
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C146FB1CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C147001CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
249021D4217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
331C8088294A63A400263BE5 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
331C8089294A63A400263BE5 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
331C808A294A63A400263BE5 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
97C147031CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147041CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
97C147061CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147071CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.havenoFlutterApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
331C8088294A63A400263BE5 /* Debug */,
|
||||
331C8089294A63A400263BE5 /* Release */,
|
||||
331C808A294A63A400263BE5 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147031CF9000F007C117D /* Debug */,
|
||||
97C147041CF9000F007C117D /* Release */,
|
||||
249021D3217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147061CF9000F007C117D /* Debug */,
|
||||
97C147071CF9000F007C117D /* Release */,
|
||||
249021D4217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||
}
|
7
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -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>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</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>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
98
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
Normal file
|
@ -0,0 +1,98 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1510"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO"
|
||||
parallelizable = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "331C8080294A63A400263BE5"
|
||||
BuildableName = "RunnerTests.xctest"
|
||||
BlueprintName = "RunnerTests"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
7
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
|
@ -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>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</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>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
13
ios/Runner/AppDelegate.swift
Normal file
|
@ -0,0 +1,13 @@
|
|||
import Flutter
|
||||
import UIKit
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
}
|
122
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
Normal file
|
@ -0,0 +1,122 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "Icon-App-1024x1024@1x.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 295 B |
After Width: | Height: | Size: 406 B |
After Width: | Height: | Size: 450 B |
After Width: | Height: | Size: 282 B |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 704 B |
After Width: | Height: | Size: 406 B |
After Width: | Height: | Size: 586 B |
After Width: | Height: | Size: 862 B |
After Width: | Height: | Size: 862 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 762 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
23
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "LaunchImage@3x.png",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
vendored
Normal file
After Width: | Height: | Size: 68 B |
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
vendored
Normal file
After Width: | Height: | Size: 68 B |
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
vendored
Normal file
After Width: | Height: | Size: 68 B |
5
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Launch Screen Assets
|
||||
|
||||
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
|
||||
|
||||
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
|
37
ios/Runner/Base.lproj/LaunchScreen.storyboard
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
|
||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="LaunchImage" width="168" height="185"/>
|
||||
</resources>
|
||||
</document>
|
26
ios/Runner/Base.lproj/Main.storyboard
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Flutter View Controller-->
|
||||
<scene sceneID="tne-QT-ifu">
|
||||
<objects>
|
||||
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
49
ios/Runner/Info.plist
Normal file
|
@ -0,0 +1,49 @@
|
|||
<?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>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Haveno Flutter App</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>haveno_flutter_app</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>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
1
ios/Runner/Runner-Bridging-Header.h
Normal file
|
@ -0,0 +1 @@
|
|||
#import "GeneratedPluginRegistrant.h"
|
12
ios/RunnerTests/RunnerTests.swift
Normal file
|
@ -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.
|
||||
}
|
||||
|
||||
}
|
10
lib/data/crypto_currencies.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
[
|
||||
{
|
||||
"code": "BTC",
|
||||
"label": "Bitcoin"
|
||||
},
|
||||
{
|
||||
"code": "LTC",
|
||||
"label": "Litecoin"
|
||||
}
|
||||
]
|
0
lib/data/fiat_currencies.json
Normal file
64
lib/data/public_monero_nodes.json
Normal file
|
@ -0,0 +1,64 @@
|
|||
{
|
||||
"nodes": [
|
||||
"http://xmrnode2fjwmltxetalulcryyvdos437fnyoj5gzg3ecn22uhnwxgyad.onion:18081",
|
||||
"http://moneronodeuomqv3jcb2jqslmcnrtkiqslv6hwh3cu57ugk6t55xchid.onion:18081",
|
||||
"http://sneed5kqm3m2jlt2j3shagzz7zmsppicmuf4fmfwryy45kmsrvjfpdid.onion:18089",
|
||||
"http://monerob2hm5lns5m4maiv3dauroadpofdrpftp5wd2cfqt332ydyeyid.onion:18089",
|
||||
"http://3qnnb5zicqahxtn7bie6sizdjru3pmtwmzzgwhei7v66s36tafdjp7ad.onion:18081",
|
||||
"http://l72pup26odlrbhsx543m3f5s4m6opwpkeklvbddddwo6b4qyche7zcyd.onion:18081",
|
||||
"http://rd4mzz6vxhchnbhz66w6u76632yhgkzypmvpcfbgrfbacmr5ob2f4zqd.onion:18089",
|
||||
"http://aclc4e2jhhtr44guufbnwk5bzwhaecinax4yip4wr4tjn27sjsfg6zqd.onion:18089",
|
||||
"http://n7jagir3cwgylxhhwc63hu5ptlj6kunofckf25fv5pizx2rmjvlholid.onion:18089",
|
||||
"http://monerof5eqykw3hfrjmb66v7r4ft4hlilfzjw5q4huwolttutjuc5dyd.onion:18089",
|
||||
"http://zqitog3olj5jmeu76jcpthuksplnzlcoucyhska74ny2vdcyeln33bid.onion:18089",
|
||||
"http://gtbjuomix62tppqmpnb65ak2vqv2fxaca4g3ijmxboy5j6bseu5d4sad.onion:18089",
|
||||
"http://mexymskdcpunttj3kozziuw62aryumjggulew2kafk7rmvkmegrrgfyd.onion:18081",
|
||||
"http://fkb5pynm4nr5mb54fw6eep3os7ux5ax7v36jgjcrq7cpilehwd5lgiad.onion:18083",
|
||||
"http://4egxv4e3idoh2xihko5wkhx5s2i5mmrw3cc3bia3cgc5ttwgqhtgi7ad.onion:18089",
|
||||
"http://xrft3jrcdrfwvry4aocxcswvwturaqxelesmtdk34j4646tajmc6rxyd.onion:18089",
|
||||
"http://lrtrju7tz72422sjmwakygfu7xgskaawiqmfulmssfzx7aofatfkmvid.onion:18089",
|
||||
"http://monerujods7mbghwe6cobdr6ujih6c22zu5rl7zshmizz2udf7v7fsad.onion:18081",
|
||||
"http://hn3lysds52kplnso5eyiimbmakr67c3owqhakimc7xio5nzb5plbl6yd.onion:18089",
|
||||
"http://so55gc5hiftcat5xagflyiuyaw3uc7jtj7ornxf757xwxhyea2clvzqd.onion:18089",
|
||||
"http://fz2lbxvjob6ifeonngaep2xvf2ypxjjn23i3ncblcxjreovev56ubyyd.onion:18089",
|
||||
"https://libertytmtitynvmnto2k42liys5fenb3wabaozmmmksyrc7jvgmjiqd.onion:18089",
|
||||
"http://glnoqirjvs4cofkj3zy3ttq2s7fzcj67dfcletshrh6gwpkkhtbulpyd.onion:18089",
|
||||
"http://libertytmtitynvmnto2k42liys5fenb3wabaozmmmksyrc7jvgmjiqd.onion:18089",
|
||||
"http://ncbkcouzbqzcskr3dy26bvgzztpt7ywtjd2ly2bpv5c5zfxoht7gthad.onion:18081",
|
||||
"http://moneroexnovtlp4datcwbgjznnulgm7q34wcl6r4gcvccruhkceb2xyd.onion:18089",
|
||||
"http://plowsof3t5hogddwabaeiyrno25efmzfxyro2vligremt7sxpsclfaid.onion:18089",
|
||||
"http://plowsoffjexmxalw73tkjmf422gq6575fc7vicuu4javzn2ynnte6tyd.onion:18089",
|
||||
"http://ode6i5zdrm4xjqeubacrwmgnihzpfsfvpdf4kvcphhnrqkmrhq5idxyd.onion:18089",
|
||||
"http://r6ou6dckycorsauaelpej2k4z2e2jkk62pbkskco34anmnkgl2tlaiqd.onion:18081",
|
||||
"http://ulmlrardljg3r6urejlm6c2tikp3krvkupmdnueahmj33vl5ztez7jqd.onion:18081",
|
||||
"http://2wi527wss2ysexkmyjveki7ypaikz5x567eiqnnl76om2zuyd4d3dpqd.onion:18081",
|
||||
"http://43n3jitkea7hvx72xjj5ey2yxhevdlwmv3nail5fp7wzigt6ptega5qd.onion:18089",
|
||||
"http://sneedxmr3mur3ypoto7o3xzqyvodidto5zlosxeesu4upunax5xnskid.onion:18089",
|
||||
"https://plowsof3t5hogddwabaeiyrno25efmzfxyro2vligremt7sxpsclfaid.onion:18089",
|
||||
"http://v5zluoefmjk6c24r3o4qsjzzyux233c5v332vrozu454xoohron5moid.onion:18089",
|
||||
"http://zkvdadvagi5r757w7ewvpomhjgxab3d4xh3npo5rcxc4d7mwuee635qd.onion:18081",
|
||||
"http://daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion:18081",
|
||||
"http://plowsofe6cleftfmk2raiw5h2x66atrik3nja4bfd3zrfa2hdlgworad.onion:18089",
|
||||
"http://3brwzfhssrqacnufjwvr2vpbawpx6ifzqhd7nzfwa3twaivn443z4nad.onion:18089",
|
||||
"http://6jvn5tinwxnp723vnsvekroaniq7qkag7nkdqmcwlbinxnpeonaowayd.onion:18089",
|
||||
"http://kbs3vzc6cwxmrw7ig5r4wgt5brxl6km2ccr7y2mqf3aznriz42pvwgyd.onion:18089",
|
||||
"http://waovyhgbeorma64p6cbomev4zfydua4s35gd3xdc5igtjqetzvwbtkyd.onion:18089",
|
||||
"http://twiy7ceov5gskxlsqfsmlubbivse5duo3ro7xmrimrgfp3whwfmzi4id.onion:18081",
|
||||
"http://rlz6pa5tfs6hxbnsvzad32gt3ck3ahvgs5a73clfztezz42eo664mzid.onion:18089",
|
||||
"http://azj7425hcyxzw6jxtvf3a4aw6t4rbdazywngq7jtrsoysk24btfycvad.onion:18089",
|
||||
"http://dtrnd4in2igrtfx2c45ghf2drns3doddmcsfy6b5gjw5iinukd33slqd.onion:18081",
|
||||
"http://moneronkvv2hu2anvcc5b4qd5y7strnc2ob6khqsrtikmhocyvjpdjyd.onion:18089",
|
||||
"http://xmrpoker6fqd7kh6gxv4dtr4kaue3pdmuzbaqorvlan4as3oh3f2ftqd.onion:18081",
|
||||
"http://vfp7tc36qcyd2x7r3k4twsixkrubvipp3zm5zt7wgzrjrbaon7vwgkyd.onion:18081",
|
||||
"http://nj4lnfbo2mkguxv6wvzpmnjwibz2jipy7kyma4qkposr6qef7suqf3ad.onion:18081",
|
||||
"http://csxmritzk2qdgqmou2vwyrwu65xabimvmeniestaartks4fhlocfoeyd.onion:18081",
|
||||
"http://qvb4rowgpqzz2m4vayovmtx2ag6l2lsdjhhbzb2nvg3ikybclb4ttdad.onion:18081",
|
||||
"http://monero3x5yrb7tsalxx64tr2qhfw54xy3eudhswvpaskfvsdk2tzb3id.onion:18089",
|
||||
"http://6dsdenp6vjkvqzy4wzsnzn6wixkdzihx3khiumyzieauxuxslmcaeiad.onion:18081",
|
||||
"http://h5oepjpydwyacbks5vnanx2qw4rboqz53eksljflbkn5zrwcz2575xqd.onion:18089",
|
||||
"http://hashvaultsvg2rinvxz7kos77hdfm6zrd5yco3tx2yh2linsmusfwyad.onion:18081",
|
||||
"http://nrf3tly3ypsow73lfijhpx4cqll3l4xiuf3r4xbfzkdkgzy4gq642sad.onion:18089",
|
||||
"http://27ihnchx3loqzue7hekggodxpazfb3npcosfxzrar5fom4zapd6rgcad.onion:18081",
|
||||
"http://4kzkwyooeth3lxajxs7pmcriq6cgvnbex2vojum2uqflczsci4dlreyd.onion:18089"
|
||||
]
|
||||
}
|
20
lib/haveno_service_clients/account_service_client.dart
Normal file
|
@ -0,0 +1,20 @@
|
|||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class AccountServiceClient {
|
||||
final AccountClient _accountClient;
|
||||
|
||||
AccountServiceClient(HavenoService service)
|
||||
: _accountClient = service.accountClient;
|
||||
|
||||
Future<bool> accountExists() async {
|
||||
try {
|
||||
final response =
|
||||
await _accountClient.accountExists(AccountExistsRequest());
|
||||
return response.accountExists;
|
||||
} catch (e) {
|
||||
print('Caught error: $e');
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
1
lib/json/PaymentAccountForm.json
Normal file
304
lib/main.dart
Normal file
|
@ -0,0 +1,304 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/providers/offers_provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/payment_accounts_provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/prices_provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/trades_provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/wallets_provider.dart';
|
||||
import 'package:haveno_flutter_app/screens/accounts_screen.dart';
|
||||
import 'package:haveno_flutter_app/screens/settings_screen.dart';
|
||||
import 'package:haveno_flutter_app/tabs/trades_tab.dart';
|
||||
import 'package:haveno_flutter_app/tabs/buy_tab.dart';
|
||||
import 'package:haveno_flutter_app/tabs/sell_tab.dart';
|
||||
import 'package:haveno_flutter_app/screens/wallet_screen.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
import 'package:haveno_flutter_app/services/http_service.dart';
|
||||
import 'package:haveno_flutter_app/services/monero_service.dart';
|
||||
import 'package:haveno_flutter_app/services/tor_service.dart';
|
||||
import 'package:haveno_flutter_app/providers/get_version_provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/account_provider.dart';
|
||||
import 'dart:async';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
// Setup logging
|
||||
_setupLogging();
|
||||
|
||||
// Initialize services
|
||||
final torService = TorService();
|
||||
await torService.initializeTor();
|
||||
|
||||
final httpService = HttpService();
|
||||
final moneroService = MoneroService();
|
||||
|
||||
final havenoService = HavenoService('192.168.0.18', 3201, 'apitest');
|
||||
|
||||
runApp(
|
||||
MultiProvider(
|
||||
providers: [
|
||||
Provider(create: (_) => torService),
|
||||
Provider(create: (_) => httpService),
|
||||
Provider(create: (_) => moneroService),
|
||||
Provider(create: (_) => havenoService),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => GetVersionProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => AccountProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => WalletsProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => OffersProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => TradesProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => PaymentAccountsProvider(havenoService),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (context) => PricesProvider(havenoService),
|
||||
),
|
||||
],
|
||||
child: MyApp(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _setupLogging() async {
|
||||
Logger.root.level = Level.ALL; // Capture all log levels
|
||||
|
||||
// Get the application documents directory
|
||||
final directory = await getApplicationDocumentsDirectory();
|
||||
final logFile = File('${directory.path}/app.log');
|
||||
|
||||
// Setup the logger to write to the file and print to console
|
||||
Logger.root.onRecord.listen((record) {
|
||||
final logMessage =
|
||||
'${record.level.name}: ${record.time}: ${record.loggerName}: ${record.message}\n';
|
||||
logFile.writeAsStringSync(logMessage,
|
||||
mode: FileMode.append, flush: true); // Ensure it's flushed to file
|
||||
print(logMessage); // Also print to console
|
||||
});
|
||||
}
|
||||
|
||||
final Logger _logger = Logger('Haveno');
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
primary: Color(0xFFF4511E),
|
||||
seedColor: Color(0xFFF4511E), // Reddish-orange primary color
|
||||
brightness: Brightness.dark,
|
||||
// Ensures dark mode with light text
|
||||
),
|
||||
scaffoldBackgroundColor: Color(0xFF303030),
|
||||
appBarTheme: AppBarTheme(
|
||||
backgroundColor: Color(0xFF303030),
|
||||
),
|
||||
drawerTheme: DrawerThemeData(
|
||||
backgroundColor: Color(0xFF303030),
|
||||
),
|
||||
bottomNavigationBarTheme: BottomNavigationBarThemeData(
|
||||
backgroundColor: Color(0xFF303030),
|
||||
selectedItemColor: Color(0xFFF4511E),
|
||||
unselectedItemColor: Colors.white,
|
||||
),
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Color(0xFFF4511E), // Button background color
|
||||
foregroundColor: Colors.white, // Button text color
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(5), // Button border radius
|
||||
),
|
||||
),
|
||||
),
|
||||
cardTheme: CardTheme(
|
||||
color: Color(0xFF424242), // Card background color
|
||||
),
|
||||
),
|
||||
home: HomeScreen(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
@override
|
||||
_HomeScreenState createState() => _HomeScreenState();
|
||||
}
|
||||
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
String _statusMessage = "Connecting to Tor...";
|
||||
Timer? _timer;
|
||||
int _selectedIndex = 0;
|
||||
|
||||
static final List<Widget> _widgetOptions = <Widget>[
|
||||
BuyTab(),
|
||||
SellTab(),
|
||||
TradesTab(),
|
||||
];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
final torService = context.read<TorService>();
|
||||
torService.statusStream.listen((String status) {
|
||||
print(status);
|
||||
setState(() {
|
||||
if (status.contains("started")) {
|
||||
_statusMessage = "Connecting to the Monero network...";
|
||||
} else {
|
||||
_statusMessage = status;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
_initializeServices();
|
||||
}
|
||||
|
||||
Future<void> _initializeServices() async {
|
||||
try {
|
||||
await context.read<GetVersionProvider>().fetchVersion();
|
||||
await context.read<AccountProvider>().checkAccountExists();
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_statusMessage = "Initialization failed: ${e.toString()}";
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _onItemTapped(int index) {
|
||||
setState(() {
|
||||
_selectedIndex = index;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> checkMoneroConnection() async {
|
||||
try {
|
||||
final info = await context.read<MoneroService>().getInfo();
|
||||
setState(() {
|
||||
_statusMessage =
|
||||
"Connected to Monero Mainnet (via Tor) at block ${info['height']}";
|
||||
});
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_statusMessage =
|
||||
"Failed to connect to the Monero network: ${e.toString()}";
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
context.read<TorService>().dispose();
|
||||
context.read<HttpService>().close();
|
||||
context.read<MoneroService>().close();
|
||||
_timer?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
appBar: AppBar(
|
||||
title: Text('Haveno'),
|
||||
),
|
||||
drawer: _buildDrawer(context),
|
||||
body: Center(
|
||||
child: _widgetOptions.elementAt(_selectedIndex),
|
||||
),
|
||||
bottomNavigationBar: NavigationBar(
|
||||
selectedIndex: _selectedIndex,
|
||||
onDestinationSelected: _onItemTapped,
|
||||
destinations: const <NavigationDestination>[
|
||||
NavigationDestination(
|
||||
icon: Icon(Icons.shopping_cart),
|
||||
label: 'Buy',
|
||||
),
|
||||
NavigationDestination(
|
||||
icon: Icon(Icons.sell),
|
||||
label: 'Sell',
|
||||
),
|
||||
NavigationDestination(
|
||||
icon: Icon(Icons.swap_vert),
|
||||
label: 'Trades',
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildDrawer(BuildContext context) {
|
||||
return Drawer(
|
||||
child: ListView(
|
||||
padding: EdgeInsets.zero,
|
||||
children: <Widget>[
|
||||
DrawerHeader(
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
'assets/haveno-logo.png',
|
||||
height: 60,
|
||||
),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF303030), // Header background color
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(Icons.account_balance_wallet, color: Colors.white),
|
||||
title: Text('Wallet', style: TextStyle(color: Colors.white)),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => WalletScreen()),
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(Icons.account_circle, color: Colors.white),
|
||||
title:
|
||||
Text('Payment Accounts', style: TextStyle(color: Colors.white)),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => AccountsScreen()),
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(Icons.settings, color: Colors.white),
|
||||
title: Text('Settings', style: TextStyle(color: Colors.white)),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => SettingsScreen()),
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(Icons.sync, color: Colors.white),
|
||||
title: Text('Daemons', style: TextStyle(color: Colors.white)),
|
||||
onTap: () {
|
||||
// Handle logout
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
0
lib/models/haveno_node.dart
Normal file
0
lib/models/haveno_peer.dart
Normal file
187
lib/models/monero_node.dart
Normal file
|
@ -0,0 +1,187 @@
|
|||
class MoneroNode {
|
||||
final int adjustedTime;
|
||||
final int altBlocksCount;
|
||||
final int blockSizeLimit;
|
||||
final int blockSizeMedian;
|
||||
final int blockWeightLimit;
|
||||
final int blockWeightMedian;
|
||||
final String bootstrapDaemonAddress;
|
||||
final bool busySyncing;
|
||||
final int credits;
|
||||
final int cumulativeDifficulty;
|
||||
final int cumulativeDifficultyTop64;
|
||||
final int databaseSize;
|
||||
final int difficulty;
|
||||
final int difficultyTop64;
|
||||
final int freeSpace;
|
||||
final int greyPeerlistSize;
|
||||
final int height;
|
||||
final int heightWithoutBootstrap;
|
||||
final int incomingConnectionsCount;
|
||||
final bool mainnet;
|
||||
final String nettype;
|
||||
final bool offline;
|
||||
final int outgoingConnectionsCount;
|
||||
final bool restricted;
|
||||
final int rpcConnectionsCount;
|
||||
final bool stagenet;
|
||||
final int startTime;
|
||||
final String status;
|
||||
final bool synchronized;
|
||||
final int target;
|
||||
final int targetHeight;
|
||||
final bool testnet;
|
||||
final String topBlockHash;
|
||||
final String topHash;
|
||||
final int txCount;
|
||||
final int txPoolSize;
|
||||
final bool untrusted;
|
||||
final bool updateAvailable;
|
||||
final String version;
|
||||
final bool wasBootstrapEverUsed;
|
||||
final int whitePeerlistSize;
|
||||
final String wideCumulativeDifficulty;
|
||||
final String wideDifficulty;
|
||||
|
||||
MoneroNode({
|
||||
required this.adjustedTime,
|
||||
required this.altBlocksCount,
|
||||
required this.blockSizeLimit,
|
||||
required this.blockSizeMedian,
|
||||
required this.blockWeightLimit,
|
||||
required this.blockWeightMedian,
|
||||
required this.bootstrapDaemonAddress,
|
||||
required this.busySyncing,
|
||||
required this.credits,
|
||||
required this.cumulativeDifficulty,
|
||||
required this.cumulativeDifficultyTop64,
|
||||
required this.databaseSize,
|
||||
required this.difficulty,
|
||||
required this.difficultyTop64,
|
||||
required this.freeSpace,
|
||||
required this.greyPeerlistSize,
|
||||
required this.height,
|
||||
required this.heightWithoutBootstrap,
|
||||
required this.incomingConnectionsCount,
|
||||
required this.mainnet,
|
||||
required this.nettype,
|
||||
required this.offline,
|
||||
required this.outgoingConnectionsCount,
|
||||
required this.restricted,
|
||||
required this.rpcConnectionsCount,
|
||||
required this.stagenet,
|
||||
required this.startTime,
|
||||
required this.status,
|
||||
required this.synchronized,
|
||||
required this.target,
|
||||
required this.targetHeight,
|
||||
required this.testnet,
|
||||
required this.topBlockHash,
|
||||
required this.topHash,
|
||||
required this.txCount,
|
||||
required this.txPoolSize,
|
||||
required this.untrusted,
|
||||
required this.updateAvailable,
|
||||
required this.version,
|
||||
required this.wasBootstrapEverUsed,
|
||||
required this.whitePeerlistSize,
|
||||
required this.wideCumulativeDifficulty,
|
||||
required this.wideDifficulty,
|
||||
});
|
||||
|
||||
factory MoneroNode.fromJson(Map<String, dynamic> json) {
|
||||
return MoneroNode(
|
||||
adjustedTime: json['adjusted_time'],
|
||||
altBlocksCount: json['alt_blocks_count'],
|
||||
blockSizeLimit: json['block_size_limit'],
|
||||
blockSizeMedian: json['block_size_median'],
|
||||
blockWeightLimit: json['block_weight_limit'],
|
||||
blockWeightMedian: json['block_weight_median'],
|
||||
bootstrapDaemonAddress: json['bootstrap_daemon_address'],
|
||||
busySyncing: json['busy_syncing'],
|
||||
credits: json['credits'],
|
||||
cumulativeDifficulty: json['cumulative_difficulty'],
|
||||
cumulativeDifficultyTop64: json['cumulative_difficulty_top64'],
|
||||
databaseSize: json['database_size'],
|
||||
difficulty: json['difficulty'],
|
||||
difficultyTop64: json['difficulty_top64'],
|
||||
freeSpace: json['free_space'],
|
||||
greyPeerlistSize: json['grey_peerlist_size'],
|
||||
height: json['height'],
|
||||
heightWithoutBootstrap: json['height_without_bootstrap'],
|
||||
incomingConnectionsCount: json['incoming_connections_count'],
|
||||
mainnet: json['mainnet'],
|
||||
nettype: json['nettype'],
|
||||
offline: json['offline'],
|
||||
outgoingConnectionsCount: json['outgoing_connections_count'],
|
||||
restricted: json['restricted'],
|
||||
rpcConnectionsCount: json['rpc_connections_count'],
|
||||
stagenet: json['stagenet'],
|
||||
startTime: json['start_time'],
|
||||
status: json['status'],
|
||||
synchronized: json['synchronized'],
|
||||
target: json['target'],
|
||||
targetHeight: json['target_height'],
|
||||
testnet: json['testnet'],
|
||||
topBlockHash: json['top_block_hash'],
|
||||
topHash: json['top_hash'],
|
||||
txCount: json['tx_count'],
|
||||
txPoolSize: json['tx_pool_size'],
|
||||
untrusted: json['untrusted'],
|
||||
updateAvailable: json['update_available'],
|
||||
version: json['version'],
|
||||
wasBootstrapEverUsed: json['was_bootstrap_ever_used'],
|
||||
whitePeerlistSize: json['white_peerlist_size'],
|
||||
wideCumulativeDifficulty: json['wide_cumulative_difficulty'],
|
||||
wideDifficulty: json['wide_difficulty'],
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'adjusted_time': adjustedTime,
|
||||
'alt_blocks_count': altBlocksCount,
|
||||
'block_size_limit': blockSizeLimit,
|
||||
'block_size_median': blockSizeMedian,
|
||||
'block_weight_limit': blockWeightLimit,
|
||||
'block_weight_median': blockWeightMedian,
|
||||
'bootstrap_daemon_address': bootstrapDaemonAddress,
|
||||
'busy_syncing': busySyncing,
|
||||
'credits': credits,
|
||||
'cumulative_difficulty': cumulativeDifficulty,
|
||||
'cumulative_difficulty_top64': cumulativeDifficultyTop64,
|
||||
'database_size': databaseSize,
|
||||
'difficulty': difficulty,
|
||||
'difficulty_top64': difficultyTop64,
|
||||
'free_space': freeSpace,
|
||||
'grey_peerlist_size': greyPeerlistSize,
|
||||
'height': height,
|
||||
'height_without_bootstrap': heightWithoutBootstrap,
|
||||
'incoming_connections_count': incomingConnectionsCount,
|
||||
'mainnet': mainnet,
|
||||
'nettype': nettype,
|
||||
'offline': offline,
|
||||
'outgoing_connections_count': outgoingConnectionsCount,
|
||||
'restricted': restricted,
|
||||
'rpc_connections_count': rpcConnectionsCount,
|
||||
'stagenet': stagenet,
|
||||
'start_time': startTime,
|
||||
'status': status,
|
||||
'synchronized': synchronized,
|
||||
'target': target,
|
||||
'target_height': targetHeight,
|
||||
'testnet': testnet,
|
||||
'top_block_hash': topBlockHash,
|
||||
'top_hash': topHash,
|
||||
'tx_count': txCount,
|
||||
'tx_pool_size': txPoolSize,
|
||||
'untrusted': untrusted,
|
||||
'update_available': updateAvailable,
|
||||
'version': version,
|
||||
'was_bootstrap_ever_used': wasBootstrapEverUsed,
|
||||
'white_peerlist_size': whitePeerlistSize,
|
||||
'wide_cumulative_difficulty': wideCumulativeDifficulty,
|
||||
'wide_difficulty': wideDifficulty,
|
||||
};
|
||||
}
|
||||
}
|
0
lib/models/tor_config.dart
Normal file
9638
lib/proto/compiled/grpc.pb.dart
Normal file
90
lib/proto/compiled/grpc.pbenum.dart
Normal file
|
@ -0,0 +1,90 @@
|
|||
//
|
||||
// Generated code. Do not modify.
|
||||
// source: grpc.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
|
||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
import 'dart:core' as $core;
|
||||
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class NotificationMessage_NotificationType extends $pb.ProtobufEnum {
|
||||
static const NotificationMessage_NotificationType ERROR = NotificationMessage_NotificationType._(0, _omitEnumNames ? '' : 'ERROR');
|
||||
static const NotificationMessage_NotificationType APP_INITIALIZED = NotificationMessage_NotificationType._(1, _omitEnumNames ? '' : 'APP_INITIALIZED');
|
||||
static const NotificationMessage_NotificationType KEEP_ALIVE = NotificationMessage_NotificationType._(2, _omitEnumNames ? '' : 'KEEP_ALIVE');
|
||||
static const NotificationMessage_NotificationType TRADE_UPDATE = NotificationMessage_NotificationType._(3, _omitEnumNames ? '' : 'TRADE_UPDATE');
|
||||
static const NotificationMessage_NotificationType CHAT_MESSAGE = NotificationMessage_NotificationType._(4, _omitEnumNames ? '' : 'CHAT_MESSAGE');
|
||||
|
||||
static const $core.List<NotificationMessage_NotificationType> values = <NotificationMessage_NotificationType> [
|
||||
ERROR,
|
||||
APP_INITIALIZED,
|
||||
KEEP_ALIVE,
|
||||
TRADE_UPDATE,
|
||||
CHAT_MESSAGE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, NotificationMessage_NotificationType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static NotificationMessage_NotificationType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const NotificationMessage_NotificationType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class UrlConnection_OnlineStatus extends $pb.ProtobufEnum {
|
||||
static const UrlConnection_OnlineStatus UNKNOWN = UrlConnection_OnlineStatus._(0, _omitEnumNames ? '' : 'UNKNOWN');
|
||||
static const UrlConnection_OnlineStatus ONLINE = UrlConnection_OnlineStatus._(1, _omitEnumNames ? '' : 'ONLINE');
|
||||
static const UrlConnection_OnlineStatus OFFLINE = UrlConnection_OnlineStatus._(2, _omitEnumNames ? '' : 'OFFLINE');
|
||||
|
||||
static const $core.List<UrlConnection_OnlineStatus> values = <UrlConnection_OnlineStatus> [
|
||||
UNKNOWN,
|
||||
ONLINE,
|
||||
OFFLINE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, UrlConnection_OnlineStatus> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static UrlConnection_OnlineStatus? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const UrlConnection_OnlineStatus._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class UrlConnection_AuthenticationStatus extends $pb.ProtobufEnum {
|
||||
static const UrlConnection_AuthenticationStatus NO_AUTHENTICATION = UrlConnection_AuthenticationStatus._(0, _omitEnumNames ? '' : 'NO_AUTHENTICATION');
|
||||
static const UrlConnection_AuthenticationStatus AUTHENTICATED = UrlConnection_AuthenticationStatus._(1, _omitEnumNames ? '' : 'AUTHENTICATED');
|
||||
static const UrlConnection_AuthenticationStatus NOT_AUTHENTICATED = UrlConnection_AuthenticationStatus._(2, _omitEnumNames ? '' : 'NOT_AUTHENTICATED');
|
||||
|
||||
static const $core.List<UrlConnection_AuthenticationStatus> values = <UrlConnection_AuthenticationStatus> [
|
||||
NO_AUTHENTICATION,
|
||||
AUTHENTICATED,
|
||||
NOT_AUTHENTICATED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, UrlConnection_AuthenticationStatus> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static UrlConnection_AuthenticationStatus? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const UrlConnection_AuthenticationStatus._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
/// Rpc method GetTrades parameter determining what category of trade list is is being requested.
|
||||
class GetTradesRequest_Category extends $pb.ProtobufEnum {
|
||||
static const GetTradesRequest_Category OPEN = GetTradesRequest_Category._(0, _omitEnumNames ? '' : 'OPEN');
|
||||
static const GetTradesRequest_Category CLOSED = GetTradesRequest_Category._(1, _omitEnumNames ? '' : 'CLOSED');
|
||||
static const GetTradesRequest_Category FAILED = GetTradesRequest_Category._(2, _omitEnumNames ? '' : 'FAILED');
|
||||
|
||||
static const $core.List<GetTradesRequest_Category> values = <GetTradesRequest_Category> [
|
||||
OPEN,
|
||||
CLOSED,
|
||||
FAILED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, GetTradesRequest_Category> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static GetTradesRequest_Category? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const GetTradesRequest_Category._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
|
||||
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');
|
1831
lib/proto/compiled/grpc.pbgrpc.dart
Normal file
2454
lib/proto/compiled/grpc.pbjson.dart
Normal file
20884
lib/proto/compiled/pb.pb.dart
Normal file
745
lib/proto/compiled/pb.pbenum.dart
Normal file
|
@ -0,0 +1,745 @@
|
|||
//
|
||||
// Generated code. Do not modify.
|
||||
// source: pb.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
|
||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||
|
||||
import 'dart:core' as $core;
|
||||
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class TradeProtocolVersion extends $pb.ProtobufEnum {
|
||||
static const TradeProtocolVersion MULTISIG_2_3 = TradeProtocolVersion._(0, _omitEnumNames ? '' : 'MULTISIG_2_3');
|
||||
|
||||
static const $core.List<TradeProtocolVersion> values = <TradeProtocolVersion> [
|
||||
MULTISIG_2_3,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, TradeProtocolVersion> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static TradeProtocolVersion? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const TradeProtocolVersion._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class SupportType extends $pb.ProtobufEnum {
|
||||
static const SupportType ARBITRATION = SupportType._(0, _omitEnumNames ? '' : 'ARBITRATION');
|
||||
static const SupportType MEDIATION = SupportType._(1, _omitEnumNames ? '' : 'MEDIATION');
|
||||
static const SupportType TRADE = SupportType._(2, _omitEnumNames ? '' : 'TRADE');
|
||||
static const SupportType REFUND = SupportType._(3, _omitEnumNames ? '' : 'REFUND');
|
||||
|
||||
static const $core.List<SupportType> values = <SupportType> [
|
||||
ARBITRATION,
|
||||
MEDIATION,
|
||||
TRADE,
|
||||
REFUND,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, SupportType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static SupportType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const SupportType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class OfferDirection extends $pb.ProtobufEnum {
|
||||
static const OfferDirection OFFER_DIRECTION_UNDEFINED = OfferDirection._(0, _omitEnumNames ? '' : 'OFFER_DIRECTION_UNDEFINED');
|
||||
static const OfferDirection BUY = OfferDirection._(1, _omitEnumNames ? '' : 'BUY');
|
||||
static const OfferDirection SELL = OfferDirection._(2, _omitEnumNames ? '' : 'SELL');
|
||||
|
||||
static const $core.List<OfferDirection> values = <OfferDirection> [
|
||||
OFFER_DIRECTION_UNDEFINED,
|
||||
BUY,
|
||||
SELL,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, OfferDirection> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static OfferDirection? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const OfferDirection._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class AvailabilityResult extends $pb.ProtobufEnum {
|
||||
static const AvailabilityResult PB_ERROR = AvailabilityResult._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const AvailabilityResult UNKNOWN_FAILURE = AvailabilityResult._(1, _omitEnumNames ? '' : 'UNKNOWN_FAILURE');
|
||||
static const AvailabilityResult AVAILABLE = AvailabilityResult._(2, _omitEnumNames ? '' : 'AVAILABLE');
|
||||
static const AvailabilityResult OFFER_TAKEN = AvailabilityResult._(3, _omitEnumNames ? '' : 'OFFER_TAKEN');
|
||||
static const AvailabilityResult PRICE_OUT_OF_TOLERANCE = AvailabilityResult._(4, _omitEnumNames ? '' : 'PRICE_OUT_OF_TOLERANCE');
|
||||
static const AvailabilityResult MARKET_PRICE_NOT_AVAILABLE = AvailabilityResult._(5, _omitEnumNames ? '' : 'MARKET_PRICE_NOT_AVAILABLE');
|
||||
static const AvailabilityResult NO_ARBITRATORS = AvailabilityResult._(6, _omitEnumNames ? '' : 'NO_ARBITRATORS');
|
||||
static const AvailabilityResult NO_MEDIATORS = AvailabilityResult._(7, _omitEnumNames ? '' : 'NO_MEDIATORS');
|
||||
static const AvailabilityResult USER_IGNORED = AvailabilityResult._(8, _omitEnumNames ? '' : 'USER_IGNORED');
|
||||
static const AvailabilityResult MISSING_MANDATORY_CAPABILITY = AvailabilityResult._(9, _omitEnumNames ? '' : 'MISSING_MANDATORY_CAPABILITY');
|
||||
static const AvailabilityResult NO_REFUND_AGENTS = AvailabilityResult._(10, _omitEnumNames ? '' : 'NO_REFUND_AGENTS');
|
||||
static const AvailabilityResult UNCONF_TX_LIMIT_HIT = AvailabilityResult._(11, _omitEnumNames ? '' : 'UNCONF_TX_LIMIT_HIT');
|
||||
static const AvailabilityResult MAKER_DENIED_API_USER = AvailabilityResult._(12, _omitEnumNames ? '' : 'MAKER_DENIED_API_USER');
|
||||
static const AvailabilityResult PRICE_CHECK_FAILED = AvailabilityResult._(13, _omitEnumNames ? '' : 'PRICE_CHECK_FAILED');
|
||||
static const AvailabilityResult MAKER_DENIED_TAKER = AvailabilityResult._(14, _omitEnumNames ? '' : 'MAKER_DENIED_TAKER');
|
||||
|
||||
static const $core.List<AvailabilityResult> values = <AvailabilityResult> [
|
||||
PB_ERROR,
|
||||
UNKNOWN_FAILURE,
|
||||
AVAILABLE,
|
||||
OFFER_TAKEN,
|
||||
PRICE_OUT_OF_TOLERANCE,
|
||||
MARKET_PRICE_NOT_AVAILABLE,
|
||||
NO_ARBITRATORS,
|
||||
NO_MEDIATORS,
|
||||
USER_IGNORED,
|
||||
MISSING_MANDATORY_CAPABILITY,
|
||||
NO_REFUND_AGENTS,
|
||||
UNCONF_TX_LIMIT_HIT,
|
||||
MAKER_DENIED_API_USER,
|
||||
PRICE_CHECK_FAILED,
|
||||
MAKER_DENIED_TAKER,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, AvailabilityResult> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static AvailabilityResult? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const AvailabilityResult._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class MediationResultState extends $pb.ProtobufEnum {
|
||||
static const MediationResultState PB_ERROR_MEDIATION_RESULT = MediationResultState._(0, _omitEnumNames ? '' : 'PB_ERROR_MEDIATION_RESULT');
|
||||
static const MediationResultState UNDEFINED_MEDIATION_RESULT = MediationResultState._(1, _omitEnumNames ? '' : 'UNDEFINED_MEDIATION_RESULT');
|
||||
static const MediationResultState MEDIATION_RESULT_ACCEPTED = MediationResultState._(2, _omitEnumNames ? '' : 'MEDIATION_RESULT_ACCEPTED');
|
||||
static const MediationResultState MEDIATION_RESULT_REJECTED = MediationResultState._(3, _omitEnumNames ? '' : 'MEDIATION_RESULT_REJECTED');
|
||||
static const MediationResultState SIG_MSG_SENT = MediationResultState._(4, _omitEnumNames ? '' : 'SIG_MSG_SENT');
|
||||
static const MediationResultState SIG_MSG_ARRIVED = MediationResultState._(5, _omitEnumNames ? '' : 'SIG_MSG_ARRIVED');
|
||||
static const MediationResultState SIG_MSG_IN_MAILBOX = MediationResultState._(6, _omitEnumNames ? '' : 'SIG_MSG_IN_MAILBOX');
|
||||
static const MediationResultState SIG_MSG_SEND_FAILED = MediationResultState._(7, _omitEnumNames ? '' : 'SIG_MSG_SEND_FAILED');
|
||||
static const MediationResultState RECEIVED_SIG_MSG = MediationResultState._(8, _omitEnumNames ? '' : 'RECEIVED_SIG_MSG');
|
||||
static const MediationResultState PAYOUT_TX_PUBLISHED = MediationResultState._(9, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED');
|
||||
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_SENT = MediationResultState._(10, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_SENT');
|
||||
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_ARRIVED = MediationResultState._(11, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_ARRIVED');
|
||||
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX = MediationResultState._(12, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX');
|
||||
static const MediationResultState PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED = MediationResultState._(13, _omitEnumNames ? '' : 'PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED');
|
||||
static const MediationResultState RECEIVED_PAYOUT_TX_PUBLISHED_MSG = MediationResultState._(14, _omitEnumNames ? '' : 'RECEIVED_PAYOUT_TX_PUBLISHED_MSG');
|
||||
static const MediationResultState PAYOUT_TX_SEEN_IN_NETWORK = MediationResultState._(15, _omitEnumNames ? '' : 'PAYOUT_TX_SEEN_IN_NETWORK');
|
||||
|
||||
static const $core.List<MediationResultState> values = <MediationResultState> [
|
||||
PB_ERROR_MEDIATION_RESULT,
|
||||
UNDEFINED_MEDIATION_RESULT,
|
||||
MEDIATION_RESULT_ACCEPTED,
|
||||
MEDIATION_RESULT_REJECTED,
|
||||
SIG_MSG_SENT,
|
||||
SIG_MSG_ARRIVED,
|
||||
SIG_MSG_IN_MAILBOX,
|
||||
SIG_MSG_SEND_FAILED,
|
||||
RECEIVED_SIG_MSG,
|
||||
PAYOUT_TX_PUBLISHED,
|
||||
PAYOUT_TX_PUBLISHED_MSG_SENT,
|
||||
PAYOUT_TX_PUBLISHED_MSG_ARRIVED,
|
||||
PAYOUT_TX_PUBLISHED_MSG_IN_MAILBOX,
|
||||
PAYOUT_TX_PUBLISHED_MSG_SEND_FAILED,
|
||||
RECEIVED_PAYOUT_TX_PUBLISHED_MSG,
|
||||
PAYOUT_TX_SEEN_IN_NETWORK,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, MediationResultState> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static MediationResultState? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const MediationResultState._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
/// todo
|
||||
class RefundResultState extends $pb.ProtobufEnum {
|
||||
static const RefundResultState PB_ERROR_REFUND_RESULT = RefundResultState._(0, _omitEnumNames ? '' : 'PB_ERROR_REFUND_RESULT');
|
||||
static const RefundResultState UNDEFINED_REFUND_RESULT = RefundResultState._(1, _omitEnumNames ? '' : 'UNDEFINED_REFUND_RESULT');
|
||||
|
||||
static const $core.List<RefundResultState> values = <RefundResultState> [
|
||||
PB_ERROR_REFUND_RESULT,
|
||||
UNDEFINED_REFUND_RESULT,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, RefundResultState> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static RefundResultState? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const RefundResultState._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class SignedWitness_VerificationMethod extends $pb.ProtobufEnum {
|
||||
static const SignedWitness_VerificationMethod PB_ERROR = SignedWitness_VerificationMethod._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const SignedWitness_VerificationMethod ARBITRATOR = SignedWitness_VerificationMethod._(1, _omitEnumNames ? '' : 'ARBITRATOR');
|
||||
static const SignedWitness_VerificationMethod TRADE = SignedWitness_VerificationMethod._(2, _omitEnumNames ? '' : 'TRADE');
|
||||
|
||||
static const $core.List<SignedWitness_VerificationMethod> values = <SignedWitness_VerificationMethod> [
|
||||
PB_ERROR,
|
||||
ARBITRATOR,
|
||||
TRADE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, SignedWitness_VerificationMethod> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static SignedWitness_VerificationMethod? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const SignedWitness_VerificationMethod._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Dispute_State extends $pb.ProtobufEnum {
|
||||
static const Dispute_State NEEDS_UPGRADE = Dispute_State._(0, _omitEnumNames ? '' : 'NEEDS_UPGRADE');
|
||||
static const Dispute_State NEW = Dispute_State._(1, _omitEnumNames ? '' : 'NEW');
|
||||
static const Dispute_State OPEN = Dispute_State._(2, _omitEnumNames ? '' : 'OPEN');
|
||||
static const Dispute_State REOPENED = Dispute_State._(3, _omitEnumNames ? '' : 'REOPENED');
|
||||
static const Dispute_State CLOSED = Dispute_State._(4, _omitEnumNames ? '' : 'CLOSED');
|
||||
|
||||
static const $core.List<Dispute_State> values = <Dispute_State> [
|
||||
NEEDS_UPGRADE,
|
||||
NEW,
|
||||
OPEN,
|
||||
REOPENED,
|
||||
CLOSED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Dispute_State> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Dispute_State? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Dispute_State._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class DisputeResult_Winner extends $pb.ProtobufEnum {
|
||||
static const DisputeResult_Winner PB_ERROR_WINNER = DisputeResult_Winner._(0, _omitEnumNames ? '' : 'PB_ERROR_WINNER');
|
||||
static const DisputeResult_Winner BUYER = DisputeResult_Winner._(1, _omitEnumNames ? '' : 'BUYER');
|
||||
static const DisputeResult_Winner SELLER = DisputeResult_Winner._(2, _omitEnumNames ? '' : 'SELLER');
|
||||
|
||||
static const $core.List<DisputeResult_Winner> values = <DisputeResult_Winner> [
|
||||
PB_ERROR_WINNER,
|
||||
BUYER,
|
||||
SELLER,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, DisputeResult_Winner> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static DisputeResult_Winner? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const DisputeResult_Winner._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class DisputeResult_Reason extends $pb.ProtobufEnum {
|
||||
static const DisputeResult_Reason PB_ERROR_REASON = DisputeResult_Reason._(0, _omitEnumNames ? '' : 'PB_ERROR_REASON');
|
||||
static const DisputeResult_Reason OTHER = DisputeResult_Reason._(1, _omitEnumNames ? '' : 'OTHER');
|
||||
static const DisputeResult_Reason BUG = DisputeResult_Reason._(2, _omitEnumNames ? '' : 'BUG');
|
||||
static const DisputeResult_Reason USABILITY = DisputeResult_Reason._(3, _omitEnumNames ? '' : 'USABILITY');
|
||||
static const DisputeResult_Reason SCAM = DisputeResult_Reason._(4, _omitEnumNames ? '' : 'SCAM');
|
||||
static const DisputeResult_Reason PROTOCOL_VIOLATION = DisputeResult_Reason._(5, _omitEnumNames ? '' : 'PROTOCOL_VIOLATION');
|
||||
static const DisputeResult_Reason NO_REPLY = DisputeResult_Reason._(6, _omitEnumNames ? '' : 'NO_REPLY');
|
||||
static const DisputeResult_Reason BANK_PROBLEMS = DisputeResult_Reason._(7, _omitEnumNames ? '' : 'BANK_PROBLEMS');
|
||||
static const DisputeResult_Reason OPTION_TRADE = DisputeResult_Reason._(8, _omitEnumNames ? '' : 'OPTION_TRADE');
|
||||
static const DisputeResult_Reason SELLER_NOT_RESPONDING = DisputeResult_Reason._(9, _omitEnumNames ? '' : 'SELLER_NOT_RESPONDING');
|
||||
static const DisputeResult_Reason WRONG_SENDER_ACCOUNT = DisputeResult_Reason._(10, _omitEnumNames ? '' : 'WRONG_SENDER_ACCOUNT');
|
||||
static const DisputeResult_Reason TRADE_ALREADY_SETTLED = DisputeResult_Reason._(11, _omitEnumNames ? '' : 'TRADE_ALREADY_SETTLED');
|
||||
static const DisputeResult_Reason PEER_WAS_LATE = DisputeResult_Reason._(12, _omitEnumNames ? '' : 'PEER_WAS_LATE');
|
||||
|
||||
static const $core.List<DisputeResult_Reason> values = <DisputeResult_Reason> [
|
||||
PB_ERROR_REASON,
|
||||
OTHER,
|
||||
BUG,
|
||||
USABILITY,
|
||||
SCAM,
|
||||
PROTOCOL_VIOLATION,
|
||||
NO_REPLY,
|
||||
BANK_PROBLEMS,
|
||||
OPTION_TRADE,
|
||||
SELLER_NOT_RESPONDING,
|
||||
WRONG_SENDER_ACCOUNT,
|
||||
TRADE_ALREADY_SETTLED,
|
||||
PEER_WAS_LATE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, DisputeResult_Reason> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static DisputeResult_Reason? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const DisputeResult_Reason._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class DisputeResult_SubtractFeeFrom extends $pb.ProtobufEnum {
|
||||
static const DisputeResult_SubtractFeeFrom BUYER_ONLY = DisputeResult_SubtractFeeFrom._(0, _omitEnumNames ? '' : 'BUYER_ONLY');
|
||||
static const DisputeResult_SubtractFeeFrom SELLER_ONLY = DisputeResult_SubtractFeeFrom._(1, _omitEnumNames ? '' : 'SELLER_ONLY');
|
||||
static const DisputeResult_SubtractFeeFrom BUYER_AND_SELLER = DisputeResult_SubtractFeeFrom._(2, _omitEnumNames ? '' : 'BUYER_AND_SELLER');
|
||||
|
||||
static const $core.List<DisputeResult_SubtractFeeFrom> values = <DisputeResult_SubtractFeeFrom> [
|
||||
BUYER_ONLY,
|
||||
SELLER_ONLY,
|
||||
BUYER_AND_SELLER,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, DisputeResult_SubtractFeeFrom> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static DisputeResult_SubtractFeeFrom? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const DisputeResult_SubtractFeeFrom._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class AddressEntry_Context extends $pb.ProtobufEnum {
|
||||
static const AddressEntry_Context PB_ERROR = AddressEntry_Context._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const AddressEntry_Context ARBITRATOR = AddressEntry_Context._(1, _omitEnumNames ? '' : 'ARBITRATOR');
|
||||
static const AddressEntry_Context AVAILABLE = AddressEntry_Context._(2, _omitEnumNames ? '' : 'AVAILABLE');
|
||||
static const AddressEntry_Context OFFER_FUNDING = AddressEntry_Context._(3, _omitEnumNames ? '' : 'OFFER_FUNDING');
|
||||
static const AddressEntry_Context RESERVED_FOR_TRADE = AddressEntry_Context._(4, _omitEnumNames ? '' : 'RESERVED_FOR_TRADE');
|
||||
static const AddressEntry_Context MULTI_SIG = AddressEntry_Context._(5, _omitEnumNames ? '' : 'MULTI_SIG');
|
||||
static const AddressEntry_Context TRADE_PAYOUT = AddressEntry_Context._(6, _omitEnumNames ? '' : 'TRADE_PAYOUT');
|
||||
|
||||
static const $core.List<AddressEntry_Context> values = <AddressEntry_Context> [
|
||||
PB_ERROR,
|
||||
ARBITRATOR,
|
||||
AVAILABLE,
|
||||
OFFER_FUNDING,
|
||||
RESERVED_FOR_TRADE,
|
||||
MULTI_SIG,
|
||||
TRADE_PAYOUT,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, AddressEntry_Context> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static AddressEntry_Context? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const AddressEntry_Context._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class XmrAddressEntry_Context extends $pb.ProtobufEnum {
|
||||
static const XmrAddressEntry_Context PB_ERROR = XmrAddressEntry_Context._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const XmrAddressEntry_Context ARBITRATOR = XmrAddressEntry_Context._(1, _omitEnumNames ? '' : 'ARBITRATOR');
|
||||
static const XmrAddressEntry_Context BASE_ADDRESS = XmrAddressEntry_Context._(2, _omitEnumNames ? '' : 'BASE_ADDRESS');
|
||||
static const XmrAddressEntry_Context AVAILABLE = XmrAddressEntry_Context._(3, _omitEnumNames ? '' : 'AVAILABLE');
|
||||
static const XmrAddressEntry_Context OFFER_FUNDING = XmrAddressEntry_Context._(4, _omitEnumNames ? '' : 'OFFER_FUNDING');
|
||||
static const XmrAddressEntry_Context TRADE_PAYOUT = XmrAddressEntry_Context._(5, _omitEnumNames ? '' : 'TRADE_PAYOUT');
|
||||
|
||||
static const $core.List<XmrAddressEntry_Context> values = <XmrAddressEntry_Context> [
|
||||
PB_ERROR,
|
||||
ARBITRATOR,
|
||||
BASE_ADDRESS,
|
||||
AVAILABLE,
|
||||
OFFER_FUNDING,
|
||||
TRADE_PAYOUT,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, XmrAddressEntry_Context> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static XmrAddressEntry_Context? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const XmrAddressEntry_Context._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Offer_State extends $pb.ProtobufEnum {
|
||||
static const Offer_State PB_ERROR = Offer_State._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const Offer_State UNKNOWN = Offer_State._(1, _omitEnumNames ? '' : 'UNKNOWN');
|
||||
static const Offer_State OFFER_FEE_RESERVED = Offer_State._(2, _omitEnumNames ? '' : 'OFFER_FEE_RESERVED');
|
||||
static const Offer_State AVAILABLE = Offer_State._(3, _omitEnumNames ? '' : 'AVAILABLE');
|
||||
static const Offer_State NOT_AVAILABLE = Offer_State._(4, _omitEnumNames ? '' : 'NOT_AVAILABLE');
|
||||
static const Offer_State REMOVED = Offer_State._(5, _omitEnumNames ? '' : 'REMOVED');
|
||||
static const Offer_State MAKER_OFFLINE = Offer_State._(6, _omitEnumNames ? '' : 'MAKER_OFFLINE');
|
||||
static const Offer_State INVALID = Offer_State._(7, _omitEnumNames ? '' : 'INVALID');
|
||||
|
||||
static const $core.List<Offer_State> values = <Offer_State> [
|
||||
PB_ERROR,
|
||||
UNKNOWN,
|
||||
OFFER_FEE_RESERVED,
|
||||
AVAILABLE,
|
||||
NOT_AVAILABLE,
|
||||
REMOVED,
|
||||
MAKER_OFFLINE,
|
||||
INVALID,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Offer_State> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Offer_State? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Offer_State._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class OpenOffer_State extends $pb.ProtobufEnum {
|
||||
static const OpenOffer_State PB_ERROR = OpenOffer_State._(0, _omitEnumNames ? '' : 'PB_ERROR');
|
||||
static const OpenOffer_State SCHEDULED = OpenOffer_State._(1, _omitEnumNames ? '' : 'SCHEDULED');
|
||||
static const OpenOffer_State AVAILABLE = OpenOffer_State._(2, _omitEnumNames ? '' : 'AVAILABLE');
|
||||
static const OpenOffer_State RESERVED = OpenOffer_State._(3, _omitEnumNames ? '' : 'RESERVED');
|
||||
static const OpenOffer_State CLOSED = OpenOffer_State._(4, _omitEnumNames ? '' : 'CLOSED');
|
||||
static const OpenOffer_State CANCELED = OpenOffer_State._(5, _omitEnumNames ? '' : 'CANCELED');
|
||||
static const OpenOffer_State DEACTIVATED = OpenOffer_State._(6, _omitEnumNames ? '' : 'DEACTIVATED');
|
||||
|
||||
static const $core.List<OpenOffer_State> values = <OpenOffer_State> [
|
||||
PB_ERROR,
|
||||
SCHEDULED,
|
||||
AVAILABLE,
|
||||
RESERVED,
|
||||
CLOSED,
|
||||
CANCELED,
|
||||
DEACTIVATED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, OpenOffer_State> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static OpenOffer_State? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const OpenOffer_State._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Trade_State extends $pb.ProtobufEnum {
|
||||
static const Trade_State PB_ERROR_STATE = Trade_State._(0, _omitEnumNames ? '' : 'PB_ERROR_STATE');
|
||||
static const Trade_State PREPARATION = Trade_State._(1, _omitEnumNames ? '' : 'PREPARATION');
|
||||
static const Trade_State MULTISIG_PREPARED = Trade_State._(2, _omitEnumNames ? '' : 'MULTISIG_PREPARED');
|
||||
static const Trade_State MULTISIG_MADE = Trade_State._(3, _omitEnumNames ? '' : 'MULTISIG_MADE');
|
||||
static const Trade_State MULTISIG_EXCHANGED = Trade_State._(4, _omitEnumNames ? '' : 'MULTISIG_EXCHANGED');
|
||||
static const Trade_State MULTISIG_COMPLETED = Trade_State._(5, _omitEnumNames ? '' : 'MULTISIG_COMPLETED');
|
||||
static const Trade_State CONTRACT_SIGNATURE_REQUESTED = Trade_State._(6, _omitEnumNames ? '' : 'CONTRACT_SIGNATURE_REQUESTED');
|
||||
static const Trade_State CONTRACT_SIGNED = Trade_State._(7, _omitEnumNames ? '' : 'CONTRACT_SIGNED');
|
||||
static const Trade_State SENT_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(8, _omitEnumNames ? '' : 'SENT_PUBLISH_DEPOSIT_TX_REQUEST');
|
||||
static const Trade_State SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(9, _omitEnumNames ? '' : 'SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST');
|
||||
static const Trade_State SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST = Trade_State._(10, _omitEnumNames ? '' : 'SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST');
|
||||
static const Trade_State PUBLISH_DEPOSIT_TX_REQUEST_FAILED = Trade_State._(11, _omitEnumNames ? '' : 'PUBLISH_DEPOSIT_TX_REQUEST_FAILED');
|
||||
static const Trade_State ARBITRATOR_PUBLISHED_DEPOSIT_TXS = Trade_State._(12, _omitEnumNames ? '' : 'ARBITRATOR_PUBLISHED_DEPOSIT_TXS');
|
||||
static const Trade_State DEPOSIT_TXS_SEEN_IN_NETWORK = Trade_State._(13, _omitEnumNames ? '' : 'DEPOSIT_TXS_SEEN_IN_NETWORK');
|
||||
static const Trade_State DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN = Trade_State._(14, _omitEnumNames ? '' : 'DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN');
|
||||
static const Trade_State DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN = Trade_State._(15, _omitEnumNames ? '' : 'DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN');
|
||||
static const Trade_State BUYER_CONFIRMED_PAYMENT_SENT = Trade_State._(16, _omitEnumNames ? '' : 'BUYER_CONFIRMED_PAYMENT_SENT');
|
||||
static const Trade_State BUYER_SENT_PAYMENT_SENT_MSG = Trade_State._(17, _omitEnumNames ? '' : 'BUYER_SENT_PAYMENT_SENT_MSG');
|
||||
static const Trade_State BUYER_SEND_FAILED_PAYMENT_SENT_MSG = Trade_State._(18, _omitEnumNames ? '' : 'BUYER_SEND_FAILED_PAYMENT_SENT_MSG');
|
||||
static const Trade_State BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG = Trade_State._(19, _omitEnumNames ? '' : 'BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG');
|
||||
static const Trade_State BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG = Trade_State._(20, _omitEnumNames ? '' : 'BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG');
|
||||
static const Trade_State SELLER_RECEIVED_PAYMENT_SENT_MSG = Trade_State._(21, _omitEnumNames ? '' : 'SELLER_RECEIVED_PAYMENT_SENT_MSG');
|
||||
static const Trade_State SELLER_CONFIRMED_PAYMENT_RECEIPT = Trade_State._(22, _omitEnumNames ? '' : 'SELLER_CONFIRMED_PAYMENT_RECEIPT');
|
||||
static const Trade_State SELLER_SENT_PAYMENT_RECEIVED_MSG = Trade_State._(23, _omitEnumNames ? '' : 'SELLER_SENT_PAYMENT_RECEIVED_MSG');
|
||||
static const Trade_State SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG = Trade_State._(24, _omitEnumNames ? '' : 'SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG');
|
||||
static const Trade_State SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG = Trade_State._(25, _omitEnumNames ? '' : 'SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG');
|
||||
static const Trade_State SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG = Trade_State._(26, _omitEnumNames ? '' : 'SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG');
|
||||
|
||||
static const $core.List<Trade_State> values = <Trade_State> [
|
||||
PB_ERROR_STATE,
|
||||
PREPARATION,
|
||||
MULTISIG_PREPARED,
|
||||
MULTISIG_MADE,
|
||||
MULTISIG_EXCHANGED,
|
||||
MULTISIG_COMPLETED,
|
||||
CONTRACT_SIGNATURE_REQUESTED,
|
||||
CONTRACT_SIGNED,
|
||||
SENT_PUBLISH_DEPOSIT_TX_REQUEST,
|
||||
SEND_FAILED_PUBLISH_DEPOSIT_TX_REQUEST,
|
||||
SAW_ARRIVED_PUBLISH_DEPOSIT_TX_REQUEST,
|
||||
PUBLISH_DEPOSIT_TX_REQUEST_FAILED,
|
||||
ARBITRATOR_PUBLISHED_DEPOSIT_TXS,
|
||||
DEPOSIT_TXS_SEEN_IN_NETWORK,
|
||||
DEPOSIT_TXS_CONFIRMED_IN_BLOCKCHAIN,
|
||||
DEPOSIT_TXS_UNLOCKED_IN_BLOCKCHAIN,
|
||||
BUYER_CONFIRMED_PAYMENT_SENT,
|
||||
BUYER_SENT_PAYMENT_SENT_MSG,
|
||||
BUYER_SEND_FAILED_PAYMENT_SENT_MSG,
|
||||
BUYER_STORED_IN_MAILBOX_PAYMENT_SENT_MSG,
|
||||
BUYER_SAW_ARRIVED_PAYMENT_SENT_MSG,
|
||||
SELLER_RECEIVED_PAYMENT_SENT_MSG,
|
||||
SELLER_CONFIRMED_PAYMENT_RECEIPT,
|
||||
SELLER_SENT_PAYMENT_RECEIVED_MSG,
|
||||
SELLER_SEND_FAILED_PAYMENT_RECEIVED_MSG,
|
||||
SELLER_STORED_IN_MAILBOX_PAYMENT_RECEIVED_MSG,
|
||||
SELLER_SAW_ARRIVED_PAYMENT_RECEIVED_MSG,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Trade_State> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Trade_State? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Trade_State._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Trade_Phase extends $pb.ProtobufEnum {
|
||||
static const Trade_Phase PB_ERROR_PHASE = Trade_Phase._(0, _omitEnumNames ? '' : 'PB_ERROR_PHASE');
|
||||
static const Trade_Phase INIT = Trade_Phase._(1, _omitEnumNames ? '' : 'INIT');
|
||||
static const Trade_Phase DEPOSIT_REQUESTED = Trade_Phase._(2, _omitEnumNames ? '' : 'DEPOSIT_REQUESTED');
|
||||
static const Trade_Phase DEPOSITS_PUBLISHED = Trade_Phase._(3, _omitEnumNames ? '' : 'DEPOSITS_PUBLISHED');
|
||||
static const Trade_Phase DEPOSITS_CONFIRMED = Trade_Phase._(4, _omitEnumNames ? '' : 'DEPOSITS_CONFIRMED');
|
||||
static const Trade_Phase DEPOSITS_UNLOCKED = Trade_Phase._(5, _omitEnumNames ? '' : 'DEPOSITS_UNLOCKED');
|
||||
static const Trade_Phase PAYMENT_SENT = Trade_Phase._(6, _omitEnumNames ? '' : 'PAYMENT_SENT');
|
||||
static const Trade_Phase PAYMENT_RECEIVED = Trade_Phase._(7, _omitEnumNames ? '' : 'PAYMENT_RECEIVED');
|
||||
|
||||
static const $core.List<Trade_Phase> values = <Trade_Phase> [
|
||||
PB_ERROR_PHASE,
|
||||
INIT,
|
||||
DEPOSIT_REQUESTED,
|
||||
DEPOSITS_PUBLISHED,
|
||||
DEPOSITS_CONFIRMED,
|
||||
DEPOSITS_UNLOCKED,
|
||||
PAYMENT_SENT,
|
||||
PAYMENT_RECEIVED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Trade_Phase> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Trade_Phase? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Trade_Phase._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Trade_PayoutState extends $pb.ProtobufEnum {
|
||||
static const Trade_PayoutState PAYOUT_UNPUBLISHED = Trade_PayoutState._(0, _omitEnumNames ? '' : 'PAYOUT_UNPUBLISHED');
|
||||
static const Trade_PayoutState PAYOUT_PUBLISHED = Trade_PayoutState._(1, _omitEnumNames ? '' : 'PAYOUT_PUBLISHED');
|
||||
static const Trade_PayoutState PAYOUT_CONFIRMED = Trade_PayoutState._(2, _omitEnumNames ? '' : 'PAYOUT_CONFIRMED');
|
||||
static const Trade_PayoutState PAYOUT_UNLOCKED = Trade_PayoutState._(3, _omitEnumNames ? '' : 'PAYOUT_UNLOCKED');
|
||||
|
||||
static const $core.List<Trade_PayoutState> values = <Trade_PayoutState> [
|
||||
PAYOUT_UNPUBLISHED,
|
||||
PAYOUT_PUBLISHED,
|
||||
PAYOUT_CONFIRMED,
|
||||
PAYOUT_UNLOCKED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Trade_PayoutState> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Trade_PayoutState? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Trade_PayoutState._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Trade_DisputeState extends $pb.ProtobufEnum {
|
||||
static const Trade_DisputeState PB_ERROR_DISPUTE_STATE = Trade_DisputeState._(0, _omitEnumNames ? '' : 'PB_ERROR_DISPUTE_STATE');
|
||||
static const Trade_DisputeState NO_DISPUTE = Trade_DisputeState._(1, _omitEnumNames ? '' : 'NO_DISPUTE');
|
||||
static const Trade_DisputeState DISPUTE_REQUESTED = Trade_DisputeState._(2, _omitEnumNames ? '' : 'DISPUTE_REQUESTED');
|
||||
static const Trade_DisputeState DISPUTE_OPENED = Trade_DisputeState._(3, _omitEnumNames ? '' : 'DISPUTE_OPENED');
|
||||
static const Trade_DisputeState ARBITRATOR_SENT_DISPUTE_CLOSED_MSG = Trade_DisputeState._(4, _omitEnumNames ? '' : 'ARBITRATOR_SENT_DISPUTE_CLOSED_MSG');
|
||||
static const Trade_DisputeState ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG = Trade_DisputeState._(5, _omitEnumNames ? '' : 'ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG');
|
||||
static const Trade_DisputeState ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG = Trade_DisputeState._(6, _omitEnumNames ? '' : 'ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG');
|
||||
static const Trade_DisputeState ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG = Trade_DisputeState._(7, _omitEnumNames ? '' : 'ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG');
|
||||
static const Trade_DisputeState DISPUTE_CLOSED = Trade_DisputeState._(8, _omitEnumNames ? '' : 'DISPUTE_CLOSED');
|
||||
static const Trade_DisputeState MEDIATION_REQUESTED = Trade_DisputeState._(9, _omitEnumNames ? '' : 'MEDIATION_REQUESTED');
|
||||
static const Trade_DisputeState MEDIATION_STARTED_BY_PEER = Trade_DisputeState._(10, _omitEnumNames ? '' : 'MEDIATION_STARTED_BY_PEER');
|
||||
static const Trade_DisputeState MEDIATION_CLOSED = Trade_DisputeState._(11, _omitEnumNames ? '' : 'MEDIATION_CLOSED');
|
||||
static const Trade_DisputeState REFUND_REQUESTED = Trade_DisputeState._(12, _omitEnumNames ? '' : 'REFUND_REQUESTED');
|
||||
static const Trade_DisputeState REFUND_REQUEST_STARTED_BY_PEER = Trade_DisputeState._(13, _omitEnumNames ? '' : 'REFUND_REQUEST_STARTED_BY_PEER');
|
||||
static const Trade_DisputeState REFUND_REQUEST_CLOSED = Trade_DisputeState._(14, _omitEnumNames ? '' : 'REFUND_REQUEST_CLOSED');
|
||||
|
||||
static const $core.List<Trade_DisputeState> values = <Trade_DisputeState> [
|
||||
PB_ERROR_DISPUTE_STATE,
|
||||
NO_DISPUTE,
|
||||
DISPUTE_REQUESTED,
|
||||
DISPUTE_OPENED,
|
||||
ARBITRATOR_SENT_DISPUTE_CLOSED_MSG,
|
||||
ARBITRATOR_SEND_FAILED_DISPUTE_CLOSED_MSG,
|
||||
ARBITRATOR_STORED_IN_MAILBOX_DISPUTE_CLOSED_MSG,
|
||||
ARBITRATOR_SAW_ARRIVED_DISPUTE_CLOSED_MSG,
|
||||
DISPUTE_CLOSED,
|
||||
MEDIATION_REQUESTED,
|
||||
MEDIATION_STARTED_BY_PEER,
|
||||
MEDIATION_CLOSED,
|
||||
REFUND_REQUESTED,
|
||||
REFUND_REQUEST_STARTED_BY_PEER,
|
||||
REFUND_REQUEST_CLOSED,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Trade_DisputeState> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Trade_DisputeState? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Trade_DisputeState._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class Trade_TradePeriodState extends $pb.ProtobufEnum {
|
||||
static const Trade_TradePeriodState PB_ERROR_TRADE_PERIOD_STATE = Trade_TradePeriodState._(0, _omitEnumNames ? '' : 'PB_ERROR_TRADE_PERIOD_STATE');
|
||||
static const Trade_TradePeriodState FIRST_HALF = Trade_TradePeriodState._(1, _omitEnumNames ? '' : 'FIRST_HALF');
|
||||
static const Trade_TradePeriodState SECOND_HALF = Trade_TradePeriodState._(2, _omitEnumNames ? '' : 'SECOND_HALF');
|
||||
static const Trade_TradePeriodState TRADE_PERIOD_OVER = Trade_TradePeriodState._(3, _omitEnumNames ? '' : 'TRADE_PERIOD_OVER');
|
||||
|
||||
static const $core.List<Trade_TradePeriodState> values = <Trade_TradePeriodState> [
|
||||
PB_ERROR_TRADE_PERIOD_STATE,
|
||||
FIRST_HALF,
|
||||
SECOND_HALF,
|
||||
TRADE_PERIOD_OVER,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, Trade_TradePeriodState> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static Trade_TradePeriodState? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const Trade_TradePeriodState._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class PaymentAccountForm_FormId extends $pb.ProtobufEnum {
|
||||
static const PaymentAccountForm_FormId BLOCK_CHAINS = PaymentAccountForm_FormId._(0, _omitEnumNames ? '' : 'BLOCK_CHAINS');
|
||||
static const PaymentAccountForm_FormId REVOLUT = PaymentAccountForm_FormId._(1, _omitEnumNames ? '' : 'REVOLUT');
|
||||
static const PaymentAccountForm_FormId SEPA = PaymentAccountForm_FormId._(2, _omitEnumNames ? '' : 'SEPA');
|
||||
static const PaymentAccountForm_FormId SEPA_INSTANT = PaymentAccountForm_FormId._(3, _omitEnumNames ? '' : 'SEPA_INSTANT');
|
||||
static const PaymentAccountForm_FormId TRANSFERWISE = PaymentAccountForm_FormId._(4, _omitEnumNames ? '' : 'TRANSFERWISE');
|
||||
static const PaymentAccountForm_FormId ZELLE = PaymentAccountForm_FormId._(5, _omitEnumNames ? '' : 'ZELLE');
|
||||
static const PaymentAccountForm_FormId SWIFT = PaymentAccountForm_FormId._(6, _omitEnumNames ? '' : 'SWIFT');
|
||||
static const PaymentAccountForm_FormId F2F = PaymentAccountForm_FormId._(7, _omitEnumNames ? '' : 'F2F');
|
||||
static const PaymentAccountForm_FormId STRIKE = PaymentAccountForm_FormId._(8, _omitEnumNames ? '' : 'STRIKE');
|
||||
static const PaymentAccountForm_FormId MONEY_GRAM = PaymentAccountForm_FormId._(9, _omitEnumNames ? '' : 'MONEY_GRAM');
|
||||
static const PaymentAccountForm_FormId FASTER_PAYMENTS = PaymentAccountForm_FormId._(10, _omitEnumNames ? '' : 'FASTER_PAYMENTS');
|
||||
static const PaymentAccountForm_FormId UPHOLD = PaymentAccountForm_FormId._(11, _omitEnumNames ? '' : 'UPHOLD');
|
||||
static const PaymentAccountForm_FormId PAXUM = PaymentAccountForm_FormId._(12, _omitEnumNames ? '' : 'PAXUM');
|
||||
static const PaymentAccountForm_FormId PAY_BY_MAIL = PaymentAccountForm_FormId._(13, _omitEnumNames ? '' : 'PAY_BY_MAIL');
|
||||
static const PaymentAccountForm_FormId CASH_AT_ATM = PaymentAccountForm_FormId._(14, _omitEnumNames ? '' : 'CASH_AT_ATM');
|
||||
static const PaymentAccountForm_FormId AUSTRALIA_PAYID = PaymentAccountForm_FormId._(15, _omitEnumNames ? '' : 'AUSTRALIA_PAYID');
|
||||
static const PaymentAccountForm_FormId CASH_APP = PaymentAccountForm_FormId._(16, _omitEnumNames ? '' : 'CASH_APP');
|
||||
static const PaymentAccountForm_FormId PAYPAL = PaymentAccountForm_FormId._(17, _omitEnumNames ? '' : 'PAYPAL');
|
||||
static const PaymentAccountForm_FormId VENMO = PaymentAccountForm_FormId._(18, _omitEnumNames ? '' : 'VENMO');
|
||||
|
||||
static const $core.List<PaymentAccountForm_FormId> values = <PaymentAccountForm_FormId> [
|
||||
BLOCK_CHAINS,
|
||||
REVOLUT,
|
||||
SEPA,
|
||||
SEPA_INSTANT,
|
||||
TRANSFERWISE,
|
||||
ZELLE,
|
||||
SWIFT,
|
||||
F2F,
|
||||
STRIKE,
|
||||
MONEY_GRAM,
|
||||
FASTER_PAYMENTS,
|
||||
UPHOLD,
|
||||
PAXUM,
|
||||
PAY_BY_MAIL,
|
||||
CASH_AT_ATM,
|
||||
AUSTRALIA_PAYID,
|
||||
CASH_APP,
|
||||
PAYPAL,
|
||||
VENMO,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, PaymentAccountForm_FormId> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static PaymentAccountForm_FormId? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const PaymentAccountForm_FormId._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class PaymentAccountFormField_FieldId extends $pb.ProtobufEnum {
|
||||
static const PaymentAccountFormField_FieldId ADDRESS = PaymentAccountFormField_FieldId._(0, _omitEnumNames ? '' : 'ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId ACCEPTED_COUNTRY_CODES = PaymentAccountFormField_FieldId._(1, _omitEnumNames ? '' : 'ACCEPTED_COUNTRY_CODES');
|
||||
static const PaymentAccountFormField_FieldId ACCOUNT_ID = PaymentAccountFormField_FieldId._(2, _omitEnumNames ? '' : 'ACCOUNT_ID');
|
||||
static const PaymentAccountFormField_FieldId ACCOUNT_NAME = PaymentAccountFormField_FieldId._(3, _omitEnumNames ? '' : 'ACCOUNT_NAME');
|
||||
static const PaymentAccountFormField_FieldId ACCOUNT_NR = PaymentAccountFormField_FieldId._(4, _omitEnumNames ? '' : 'ACCOUNT_NR');
|
||||
static const PaymentAccountFormField_FieldId ACCOUNT_OWNER = PaymentAccountFormField_FieldId._(5, _omitEnumNames ? '' : 'ACCOUNT_OWNER');
|
||||
static const PaymentAccountFormField_FieldId ACCOUNT_TYPE = PaymentAccountFormField_FieldId._(6, _omitEnumNames ? '' : 'ACCOUNT_TYPE');
|
||||
static const PaymentAccountFormField_FieldId ANSWER = PaymentAccountFormField_FieldId._(7, _omitEnumNames ? '' : 'ANSWER');
|
||||
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_NAME = PaymentAccountFormField_FieldId._(8, _omitEnumNames ? '' : 'BANK_ACCOUNT_NAME');
|
||||
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_NUMBER = PaymentAccountFormField_FieldId._(9, _omitEnumNames ? '' : 'BANK_ACCOUNT_NUMBER');
|
||||
static const PaymentAccountFormField_FieldId BANK_ACCOUNT_TYPE = PaymentAccountFormField_FieldId._(10, _omitEnumNames ? '' : 'BANK_ACCOUNT_TYPE');
|
||||
static const PaymentAccountFormField_FieldId BANK_ADDRESS = PaymentAccountFormField_FieldId._(11, _omitEnumNames ? '' : 'BANK_ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId BANK_BRANCH = PaymentAccountFormField_FieldId._(12, _omitEnumNames ? '' : 'BANK_BRANCH');
|
||||
static const PaymentAccountFormField_FieldId BANK_BRANCH_CODE = PaymentAccountFormField_FieldId._(13, _omitEnumNames ? '' : 'BANK_BRANCH_CODE');
|
||||
static const PaymentAccountFormField_FieldId BANK_BRANCH_NAME = PaymentAccountFormField_FieldId._(14, _omitEnumNames ? '' : 'BANK_BRANCH_NAME');
|
||||
static const PaymentAccountFormField_FieldId BANK_CODE = PaymentAccountFormField_FieldId._(15, _omitEnumNames ? '' : 'BANK_CODE');
|
||||
static const PaymentAccountFormField_FieldId BANK_COUNTRY_CODE = PaymentAccountFormField_FieldId._(16, _omitEnumNames ? '' : 'BANK_COUNTRY_CODE');
|
||||
static const PaymentAccountFormField_FieldId BANK_ID = PaymentAccountFormField_FieldId._(17, _omitEnumNames ? '' : 'BANK_ID');
|
||||
static const PaymentAccountFormField_FieldId BANK_NAME = PaymentAccountFormField_FieldId._(18, _omitEnumNames ? '' : 'BANK_NAME');
|
||||
static const PaymentAccountFormField_FieldId BANK_SWIFT_CODE = PaymentAccountFormField_FieldId._(19, _omitEnumNames ? '' : 'BANK_SWIFT_CODE');
|
||||
static const PaymentAccountFormField_FieldId BENEFICIARY_ACCOUNT_NR = PaymentAccountFormField_FieldId._(20, _omitEnumNames ? '' : 'BENEFICIARY_ACCOUNT_NR');
|
||||
static const PaymentAccountFormField_FieldId BENEFICIARY_ADDRESS = PaymentAccountFormField_FieldId._(21, _omitEnumNames ? '' : 'BENEFICIARY_ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId BENEFICIARY_CITY = PaymentAccountFormField_FieldId._(22, _omitEnumNames ? '' : 'BENEFICIARY_CITY');
|
||||
static const PaymentAccountFormField_FieldId BENEFICIARY_NAME = PaymentAccountFormField_FieldId._(23, _omitEnumNames ? '' : 'BENEFICIARY_NAME');
|
||||
static const PaymentAccountFormField_FieldId BENEFICIARY_PHONE = PaymentAccountFormField_FieldId._(24, _omitEnumNames ? '' : 'BENEFICIARY_PHONE');
|
||||
static const PaymentAccountFormField_FieldId BIC = PaymentAccountFormField_FieldId._(25, _omitEnumNames ? '' : 'BIC');
|
||||
static const PaymentAccountFormField_FieldId BRANCH_ID = PaymentAccountFormField_FieldId._(26, _omitEnumNames ? '' : 'BRANCH_ID');
|
||||
static const PaymentAccountFormField_FieldId CITY = PaymentAccountFormField_FieldId._(27, _omitEnumNames ? '' : 'CITY');
|
||||
static const PaymentAccountFormField_FieldId CONTACT = PaymentAccountFormField_FieldId._(28, _omitEnumNames ? '' : 'CONTACT');
|
||||
static const PaymentAccountFormField_FieldId COUNTRY = PaymentAccountFormField_FieldId._(29, _omitEnumNames ? '' : 'COUNTRY');
|
||||
static const PaymentAccountFormField_FieldId EMAIL = PaymentAccountFormField_FieldId._(30, _omitEnumNames ? '' : 'EMAIL');
|
||||
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR = PaymentAccountFormField_FieldId._(31, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR');
|
||||
static const PaymentAccountFormField_FieldId EXTRA_INFO = PaymentAccountFormField_FieldId._(32, _omitEnumNames ? '' : 'EXTRA_INFO');
|
||||
static const PaymentAccountFormField_FieldId HOLDER_ADDRESS = PaymentAccountFormField_FieldId._(33, _omitEnumNames ? '' : 'HOLDER_ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId HOLDER_EMAIL = PaymentAccountFormField_FieldId._(34, _omitEnumNames ? '' : 'HOLDER_EMAIL');
|
||||
static const PaymentAccountFormField_FieldId HOLDER_NAME = PaymentAccountFormField_FieldId._(35, _omitEnumNames ? '' : 'HOLDER_NAME');
|
||||
static const PaymentAccountFormField_FieldId HOLDER_TAX_ID = PaymentAccountFormField_FieldId._(36, _omitEnumNames ? '' : 'HOLDER_TAX_ID');
|
||||
static const PaymentAccountFormField_FieldId IBAN = PaymentAccountFormField_FieldId._(37, _omitEnumNames ? '' : 'IBAN');
|
||||
static const PaymentAccountFormField_FieldId IFSC = PaymentAccountFormField_FieldId._(38, _omitEnumNames ? '' : 'IFSC');
|
||||
static const PaymentAccountFormField_FieldId INTERMEDIARY_ADDRESS = PaymentAccountFormField_FieldId._(39, _omitEnumNames ? '' : 'INTERMEDIARY_ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId INTERMEDIARY_BRANCH = PaymentAccountFormField_FieldId._(40, _omitEnumNames ? '' : 'INTERMEDIARY_BRANCH');
|
||||
static const PaymentAccountFormField_FieldId INTERMEDIARY_COUNTRY_CODE = PaymentAccountFormField_FieldId._(41, _omitEnumNames ? '' : 'INTERMEDIARY_COUNTRY_CODE');
|
||||
static const PaymentAccountFormField_FieldId INTERMEDIARY_NAME = PaymentAccountFormField_FieldId._(42, _omitEnumNames ? '' : 'INTERMEDIARY_NAME');
|
||||
static const PaymentAccountFormField_FieldId INTERMEDIARY_SWIFT_CODE = PaymentAccountFormField_FieldId._(43, _omitEnumNames ? '' : 'INTERMEDIARY_SWIFT_CODE');
|
||||
static const PaymentAccountFormField_FieldId MOBILE_NR = PaymentAccountFormField_FieldId._(44, _omitEnumNames ? '' : 'MOBILE_NR');
|
||||
static const PaymentAccountFormField_FieldId NATIONAL_ACCOUNT_ID = PaymentAccountFormField_FieldId._(45, _omitEnumNames ? '' : 'NATIONAL_ACCOUNT_ID');
|
||||
static const PaymentAccountFormField_FieldId PAYID = PaymentAccountFormField_FieldId._(46, _omitEnumNames ? '' : 'PAYID');
|
||||
static const PaymentAccountFormField_FieldId PIX_KEY = PaymentAccountFormField_FieldId._(47, _omitEnumNames ? '' : 'PIX_KEY');
|
||||
static const PaymentAccountFormField_FieldId POSTAL_ADDRESS = PaymentAccountFormField_FieldId._(48, _omitEnumNames ? '' : 'POSTAL_ADDRESS');
|
||||
static const PaymentAccountFormField_FieldId PROMPT_PAY_ID = PaymentAccountFormField_FieldId._(49, _omitEnumNames ? '' : 'PROMPT_PAY_ID');
|
||||
static const PaymentAccountFormField_FieldId QUESTION = PaymentAccountFormField_FieldId._(50, _omitEnumNames ? '' : 'QUESTION');
|
||||
static const PaymentAccountFormField_FieldId REQUIREMENTS = PaymentAccountFormField_FieldId._(51, _omitEnumNames ? '' : 'REQUIREMENTS');
|
||||
static const PaymentAccountFormField_FieldId SALT = PaymentAccountFormField_FieldId._(52, _omitEnumNames ? '' : 'SALT');
|
||||
static const PaymentAccountFormField_FieldId SORT_CODE = PaymentAccountFormField_FieldId._(53, _omitEnumNames ? '' : 'SORT_CODE');
|
||||
static const PaymentAccountFormField_FieldId SPECIAL_INSTRUCTIONS = PaymentAccountFormField_FieldId._(54, _omitEnumNames ? '' : 'SPECIAL_INSTRUCTIONS');
|
||||
static const PaymentAccountFormField_FieldId STATE = PaymentAccountFormField_FieldId._(55, _omitEnumNames ? '' : 'STATE');
|
||||
static const PaymentAccountFormField_FieldId TRADE_CURRENCIES = PaymentAccountFormField_FieldId._(56, _omitEnumNames ? '' : 'TRADE_CURRENCIES');
|
||||
static const PaymentAccountFormField_FieldId USERNAME = PaymentAccountFormField_FieldId._(57, _omitEnumNames ? '' : 'USERNAME');
|
||||
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR_OR_USERNAME = PaymentAccountFormField_FieldId._(58, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR_OR_USERNAME');
|
||||
static const PaymentAccountFormField_FieldId EMAIL_OR_MOBILE_NR_OR_CASHTAG = PaymentAccountFormField_FieldId._(59, _omitEnumNames ? '' : 'EMAIL_OR_MOBILE_NR_OR_CASHTAG');
|
||||
|
||||
static const $core.List<PaymentAccountFormField_FieldId> values = <PaymentAccountFormField_FieldId> [
|
||||
ADDRESS,
|
||||
ACCEPTED_COUNTRY_CODES,
|
||||
ACCOUNT_ID,
|
||||
ACCOUNT_NAME,
|
||||
ACCOUNT_NR,
|
||||
ACCOUNT_OWNER,
|
||||
ACCOUNT_TYPE,
|
||||
ANSWER,
|
||||
BANK_ACCOUNT_NAME,
|
||||
BANK_ACCOUNT_NUMBER,
|
||||
BANK_ACCOUNT_TYPE,
|
||||
BANK_ADDRESS,
|
||||
BANK_BRANCH,
|
||||
BANK_BRANCH_CODE,
|
||||
BANK_BRANCH_NAME,
|
||||
BANK_CODE,
|
||||
BANK_COUNTRY_CODE,
|
||||
BANK_ID,
|
||||
BANK_NAME,
|
||||
BANK_SWIFT_CODE,
|
||||
BENEFICIARY_ACCOUNT_NR,
|
||||
BENEFICIARY_ADDRESS,
|
||||
BENEFICIARY_CITY,
|
||||
BENEFICIARY_NAME,
|
||||
BENEFICIARY_PHONE,
|
||||
BIC,
|
||||
BRANCH_ID,
|
||||
CITY,
|
||||
CONTACT,
|
||||
COUNTRY,
|
||||
EMAIL,
|
||||
EMAIL_OR_MOBILE_NR,
|
||||
EXTRA_INFO,
|
||||
HOLDER_ADDRESS,
|
||||
HOLDER_EMAIL,
|
||||
HOLDER_NAME,
|
||||
HOLDER_TAX_ID,
|
||||
IBAN,
|
||||
IFSC,
|
||||
INTERMEDIARY_ADDRESS,
|
||||
INTERMEDIARY_BRANCH,
|
||||
INTERMEDIARY_COUNTRY_CODE,
|
||||
INTERMEDIARY_NAME,
|
||||
INTERMEDIARY_SWIFT_CODE,
|
||||
MOBILE_NR,
|
||||
NATIONAL_ACCOUNT_ID,
|
||||
PAYID,
|
||||
PIX_KEY,
|
||||
POSTAL_ADDRESS,
|
||||
PROMPT_PAY_ID,
|
||||
QUESTION,
|
||||
REQUIREMENTS,
|
||||
SALT,
|
||||
SORT_CODE,
|
||||
SPECIAL_INSTRUCTIONS,
|
||||
STATE,
|
||||
TRADE_CURRENCIES,
|
||||
USERNAME,
|
||||
EMAIL_OR_MOBILE_NR_OR_USERNAME,
|
||||
EMAIL_OR_MOBILE_NR_OR_CASHTAG,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, PaymentAccountFormField_FieldId> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static PaymentAccountFormField_FieldId? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const PaymentAccountFormField_FieldId._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class PaymentAccountFormField_Component extends $pb.ProtobufEnum {
|
||||
static const PaymentAccountFormField_Component TEXT = PaymentAccountFormField_Component._(0, _omitEnumNames ? '' : 'TEXT');
|
||||
static const PaymentAccountFormField_Component TEXTAREA = PaymentAccountFormField_Component._(1, _omitEnumNames ? '' : 'TEXTAREA');
|
||||
static const PaymentAccountFormField_Component SELECT_ONE = PaymentAccountFormField_Component._(2, _omitEnumNames ? '' : 'SELECT_ONE');
|
||||
static const PaymentAccountFormField_Component SELECT_MULTIPLE = PaymentAccountFormField_Component._(3, _omitEnumNames ? '' : 'SELECT_MULTIPLE');
|
||||
|
||||
static const $core.List<PaymentAccountFormField_Component> values = <PaymentAccountFormField_Component> [
|
||||
TEXT,
|
||||
TEXTAREA,
|
||||
SELECT_ONE,
|
||||
SELECT_MULTIPLE,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, PaymentAccountFormField_Component> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static PaymentAccountFormField_Component? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const PaymentAccountFormField_Component._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
|
||||
const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');
|
4822
lib/proto/compiled/pb.pbjson.dart
Normal file
1101
lib/proto/src/grpc.proto
Normal file
1965
lib/proto/src/pb.proto
Normal file
23
lib/providers/account_provider.dart
Normal file
|
@ -0,0 +1,23 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class AccountProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
bool? _accountExists;
|
||||
|
||||
AccountProvider(this._havenoService);
|
||||
|
||||
bool? get accountExists => _accountExists;
|
||||
|
||||
Future<void> checkAccountExists() async {
|
||||
try {
|
||||
final accountExistsReply = await _havenoService.accountClient
|
||||
.accountExists(AccountExistsRequest());
|
||||
_accountExists = accountExistsReply.accountExists;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to check if account exists: $e");
|
||||
}
|
||||
}
|
||||
}
|
23
lib/providers/get_version_provider.dart
Normal file
|
@ -0,0 +1,23 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class GetVersionProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
String? _version;
|
||||
|
||||
GetVersionProvider(this._havenoService);
|
||||
|
||||
String? get version => _version;
|
||||
|
||||
Future<void> fetchVersion() async {
|
||||
try {
|
||||
final versionReply =
|
||||
await _havenoService.getVersionClient.getVersion(GetVersionRequest());
|
||||
_version = versionReply.version;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get Haveno version: $e");
|
||||
}
|
||||
}
|
||||
}
|
108
lib/providers/offers_provider.dart
Normal file
|
@ -0,0 +1,108 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
import 'package:fixnum/fixnum.dart' as fixnum;
|
||||
|
||||
class OffersProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
List<OfferInfo>? _offers;
|
||||
List<OfferInfo>? _createdOffers = [];
|
||||
OfferInfo? _lastCreatedOffer;
|
||||
String? _lastCancelledOfferId;
|
||||
List<OfferInfo>? _myOffers = [];
|
||||
|
||||
OffersProvider(this._havenoService);
|
||||
|
||||
List<OfferInfo>? get offers => _offers;
|
||||
List<OfferInfo>? get marketBuyOffers =>
|
||||
_offers?.where((offer) => offer.direction == 'SELL').toList();
|
||||
List<OfferInfo>? get marketSellOffers =>
|
||||
_offers?.where((offer) => offer.direction == 'BUY').toList();
|
||||
List<OfferInfo>? get createdOffers => _createdOffers;
|
||||
OfferInfo? get lastCreatedOffer => _lastCreatedOffer;
|
||||
String? get lastCancelledOffer => _lastCancelledOfferId;
|
||||
List<OfferInfo>? get myOffers => _myOffers;
|
||||
List<OfferInfo>? get mySellOffers =>
|
||||
_myOffers?.where((offer) => offer.direction == 'BUY').toList();
|
||||
List<OfferInfo>? get myBuyOffers =>
|
||||
_myOffers?.where((offer) => offer.direction == 'SELL').toList();
|
||||
|
||||
Future<void> getOffers() async {
|
||||
try {
|
||||
final getOffersReply =
|
||||
await _havenoService.offersClient.getOffers(GetOffersRequest());
|
||||
_offers = getOffersReply.offers;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get offers: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getMyOffers() async {
|
||||
try {
|
||||
final getMyOffersReply =
|
||||
await _havenoService.offersClient.getMyOffers(GetMyOffersRequest());
|
||||
_myOffers = getMyOffersReply.offers;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get offers: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> postOffer({
|
||||
required String currencyCode,
|
||||
required String direction,
|
||||
required String price,
|
||||
required bool useMarketBasedPrice,
|
||||
required double marketPriceMarginPct,
|
||||
required fixnum.Int64 amount,
|
||||
required fixnum.Int64 minAmount,
|
||||
required double buyerSecurityDepositPct,
|
||||
required String triggerPrice,
|
||||
required bool reserveExactAmount,
|
||||
required String paymentAccountId,
|
||||
}) async {
|
||||
try {
|
||||
final postOfferResponse = await _havenoService.offersClient.postOffer(
|
||||
PostOfferRequest(
|
||||
currencyCode: currencyCode,
|
||||
direction: direction,
|
||||
price: price,
|
||||
useMarketBasedPrice: useMarketBasedPrice,
|
||||
marketPriceMarginPct: marketPriceMarginPct,
|
||||
amount: amount,
|
||||
minAmount: minAmount,
|
||||
buyerSecurityDepositPct: buyerSecurityDepositPct,
|
||||
triggerPrice: triggerPrice,
|
||||
reserveExactAmount: reserveExactAmount,
|
||||
paymentAccountId: paymentAccountId,
|
||||
),
|
||||
);
|
||||
final postedOffer = postOfferResponse.offer;
|
||||
_createdOffers?.add(postedOffer);
|
||||
_lastCreatedOffer = postedOffer;
|
||||
_myOffers?.add(postedOffer);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to post offer: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> cancelOffer(String offerId) async {
|
||||
try {
|
||||
await _havenoService.offersClient
|
||||
.cancelOffer(CancelOfferRequest(id: offerId));
|
||||
_lastCancelledOfferId = offerId;
|
||||
_myOffers?.removeWhere((offer) => offer.id == offerId);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to cancel offer: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
String offerToString(OfferInfo offer) {
|
||||
return 'Offer(id: ${offer.id}, direction: ${offer.direction}, price: ${offer.price}, amount: ${offer.amount}, minAmount: ${offer.minAmount}, volume: ${offer.volume}, minVolume: ${offer.minVolume}, baseCurrencyCode: ${offer.baseCurrencyCode}, date: ${offer.date}, state: ${offer.state}, paymentAccountId: ${offer.paymentAccountId}, paymentMethodId: ${offer.paymentMethodId})';
|
||||
}
|
||||
}
|
144
lib/providers/payment_accounts_provider.dart
Normal file
|
@ -0,0 +1,144 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/pb.pb.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pb.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class PaymentAccountsProvider with ChangeNotifier {
|
||||
final Logger _logger = Logger('PaymentAccountsProvider');
|
||||
final HavenoService _havenoService;
|
||||
List<PaymentMethod>? _paymentMethods;
|
||||
List<PaymentAccount>? _paymentAccounts;
|
||||
PaymentAccountForm _paymentAccountForm = PaymentAccountForm();
|
||||
bool _isLoadingPaymentMethods = false;
|
||||
bool _isLoadingPaymentAccounts = false;
|
||||
bool _isCreatingPaymentAccount = false;
|
||||
|
||||
String _paymentAccountFormJson = '';
|
||||
|
||||
PaymentAccountsProvider(this._havenoService) {
|
||||
_initializeProvider();
|
||||
}
|
||||
|
||||
Future<void> _initializeProvider() async {
|
||||
await _validateAndLoadJsonFiles();
|
||||
}
|
||||
|
||||
Future<void> _validateAndLoadJsonFiles() async {
|
||||
try {
|
||||
final directory = await getApplicationDocumentsDirectory();
|
||||
final paymentMethodsFile =
|
||||
File('${directory.path}/json/forms/PaymentAcountForm.json');
|
||||
final paymentAccountsFile =
|
||||
File('${directory.path}/json/forms/PaymentAcountForm.json');
|
||||
|
||||
if (await paymentMethodsFile.exists()) {
|
||||
final paymentMethodsJson =
|
||||
jsonDecode(await paymentMethodsFile.readAsString());
|
||||
_paymentMethods = (paymentMethodsJson as List)
|
||||
.map((json) => PaymentMethod.fromJson(json))
|
||||
.toList();
|
||||
} else {
|
||||
_paymentMethods = [];
|
||||
}
|
||||
if (await paymentAccountsFile.exists()) {
|
||||
final paymentAccountsJson =
|
||||
jsonDecode(await paymentAccountsFile.readAsString());
|
||||
_paymentAccounts = (paymentAccountsJson as List)
|
||||
.map((json) => PaymentAccount.fromJson(json))
|
||||
.toList();
|
||||
} else {
|
||||
_paymentAccounts = [];
|
||||
}
|
||||
} catch (e) {
|
||||
print("Failed to load or validate JSON files: $e");
|
||||
}
|
||||
}
|
||||
|
||||
List<PaymentMethod>? get paymentMethods => _paymentMethods;
|
||||
List<PaymentAccount>? get paymentAccounts => _paymentAccounts;
|
||||
PaymentAccountForm get paymentAccountForm => _paymentAccountForm;
|
||||
bool get isLoadingPaymentMethods => _isLoadingPaymentMethods;
|
||||
bool get isLoadingPaymentAccounts => _isLoadingPaymentAccounts;
|
||||
bool get isCreatingPaymentAccount => _isCreatingPaymentAccount;
|
||||
|
||||
Future<List<PaymentMethod>?> getPaymentMethods() async {
|
||||
_isLoadingPaymentMethods = true;
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
final getPaymentMethodsReply = await _havenoService.paymentAccountsClient
|
||||
.getPaymentMethods(GetPaymentMethodsRequest());
|
||||
_paymentMethods = getPaymentMethodsReply.paymentMethods;
|
||||
} catch (e) {
|
||||
print("Failed to get payment methods: $e");
|
||||
} finally {
|
||||
_isLoadingPaymentMethods = false;
|
||||
notifyListeners();
|
||||
}
|
||||
return _paymentMethods;
|
||||
}
|
||||
|
||||
Future<List<PaymentAccount>?> getPaymentAccounts() async {
|
||||
_isLoadingPaymentAccounts = true;
|
||||
notifyListeners();
|
||||
try {
|
||||
final getPaymentAccountsReply = await _havenoService.paymentAccountsClient
|
||||
.getPaymentAccounts(GetPaymentAccountsRequest());
|
||||
_paymentAccounts = getPaymentAccountsReply.paymentAccounts;
|
||||
_paymentAccounts?.forEach((account) {
|
||||
debugPrint(jsonEncode(account.toProto3Json()));
|
||||
});
|
||||
} catch (e) {
|
||||
print("Failed to get payment accounts: $e");
|
||||
} finally {
|
||||
_isLoadingPaymentAccounts = false;
|
||||
notifyListeners();
|
||||
}
|
||||
return paymentAccounts;
|
||||
}
|
||||
|
||||
Future<PaymentAccountForm> getPaymentAcountForm(
|
||||
String paymentMethodId) async {
|
||||
final traditionalCurrencyPaymentAccountForm =
|
||||
await _havenoService.paymentAccountsClient.getPaymentAccountForm(
|
||||
GetPaymentAccountFormRequest(paymentMethodId: paymentMethodId));
|
||||
_paymentAccountForm =
|
||||
traditionalCurrencyPaymentAccountForm.paymentAccountForm;
|
||||
print("Right after grabbing form");
|
||||
_paymentAccountForm.fields.forEach((field) {
|
||||
debugPrint(
|
||||
"${field.component ?? ''} : ${field.label ?? ''} : ${field.type ?? ''} ");
|
||||
debugPrint(jsonEncode(field.toProto3Json()));
|
||||
});
|
||||
debugPrint(_paymentAccountFormJson);
|
||||
return _paymentAccountForm;
|
||||
}
|
||||
|
||||
Future<PaymentAccount?> createPaymentAccount(
|
||||
String paymentMethodId, PaymentAccountForm form) async {
|
||||
try {
|
||||
_isCreatingPaymentAccount = true;
|
||||
notifyListeners();
|
||||
final createdPaymentAccount = await _havenoService.paymentAccountsClient
|
||||
.createPaymentAccount(
|
||||
CreatePaymentAccountRequest(paymentAccountForm: form));
|
||||
var paymentAccount = createdPaymentAccount.paymentAccount;
|
||||
print("Created Payment Account: $paymentAccount");
|
||||
_isCreatingPaymentAccount = false;
|
||||
notifyListeners();
|
||||
return paymentAccount;
|
||||
} catch (e) {
|
||||
print("Failed to create payment account: $e");
|
||||
_isCreatingPaymentAccount = false;
|
||||
notifyListeners();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
26
lib/providers/prices_provider.dart
Normal file
|
@ -0,0 +1,26 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class PricesProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
List<MarketPriceInfo>? _marketPrices;
|
||||
|
||||
PricesProvider(this._havenoService);
|
||||
|
||||
List<MarketPriceInfo>? get prices => _marketPrices;
|
||||
|
||||
Future<void> getPrices() async {
|
||||
try {
|
||||
final getMarketPricesReply = await _havenoService.priceClient
|
||||
.getMarketPrices(MarketPricesRequest());
|
||||
_marketPrices = getMarketPricesReply.marketPrice;
|
||||
_marketPrices?.forEach((price) {
|
||||
print("Price: $price");
|
||||
});
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get prices: $e");
|
||||
}
|
||||
}
|
||||
}
|
110
lib/providers/trades_provider.dart
Normal file
|
@ -0,0 +1,110 @@
|
|||
import 'package:fixnum/fixnum.dart' as fixnum;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/pb.pb.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class TradesProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
List<TradeInfo>? _trades;
|
||||
TradeInfo? _currentTrade;
|
||||
Map<String, List<ChatMessage>> _chatMessages = {};
|
||||
|
||||
TradesProvider(this._havenoService);
|
||||
|
||||
List<TradeInfo>? get trades => _trades;
|
||||
TradeInfo? get currentTrade => _currentTrade;
|
||||
Map<String, List<ChatMessage>> get chatMessages => _chatMessages;
|
||||
|
||||
Future<void> getTrades() async {
|
||||
try {
|
||||
final getTradesReply =
|
||||
await _havenoService.tradesClient.getTrades(GetTradesRequest());
|
||||
_trades = getTradesReply.trades;
|
||||
_trades?.forEach((trade) {
|
||||
print("Trade: $trade");
|
||||
});
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get trades: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<TradeInfo?> getTrade(String? tradeId) async {
|
||||
try {
|
||||
final getTradeReply = await _havenoService.tradesClient
|
||||
.getTrade(GetTradeRequest(tradeId: tradeId));
|
||||
return getTradeReply.trade;
|
||||
} catch (e) {
|
||||
debugPrint("Failed to get trade: $e");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<void> takeOffer(
|
||||
String? offerId, String? paymentAccountId, fixnum.Int64 amount) async {
|
||||
try {
|
||||
final takeOfferReply = await _havenoService.tradesClient.takeOffer(
|
||||
TakeOfferRequest(
|
||||
offerId: offerId,
|
||||
paymentAccountId: paymentAccountId,
|
||||
amount: amount));
|
||||
_currentTrade = takeOfferReply.trade;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to take trades: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> sendChatMessage(String? tradeId, String? message) async {
|
||||
try {
|
||||
await _havenoService.tradesClient.sendChatMessage(
|
||||
SendChatMessageRequest(tradeId: tradeId, message: message));
|
||||
} catch (e) {
|
||||
debugPrint("Failed to send trade chat message: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getChatMessages(String tradeId) async {
|
||||
try {
|
||||
final getChatMessagesReply = await _havenoService.tradesClient
|
||||
.getChatMessages(GetChatMessagesRequest(tradeId: tradeId));
|
||||
_chatMessages[tradeId] = getChatMessagesReply.message;
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
debugPrint("Failed to get trade chat messages: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> confirmPaymentSent(String tradeId) async {
|
||||
try {
|
||||
await _havenoService.tradesClient
|
||||
.confirmPaymentSent(ConfirmPaymentSentRequest(tradeId: tradeId));
|
||||
} catch (e) {
|
||||
debugPrint("Failed to confirm payment sent: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> confirmPaymentReceived(String tradeId) async {
|
||||
try {
|
||||
await _havenoService.tradesClient.confirmPaymentReceived(
|
||||
ConfirmPaymentReceivedRequest(tradeId: tradeId));
|
||||
} catch (e) {
|
||||
debugPrint("Failed to confirm payment sent: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> completeTrade(String? tradeId) async {
|
||||
try {
|
||||
await _havenoService.tradesClient
|
||||
.completeTrade(CompleteTradeRequest(tradeId: tradeId));
|
||||
} catch (e) {
|
||||
debugPrint("Failed to complete trade: $e");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
65
lib/providers/wallets_provider.dart
Normal file
|
@ -0,0 +1,65 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:haveno_flutter_app/services/haveno_service.dart';
|
||||
|
||||
class WalletsProvider with ChangeNotifier {
|
||||
final HavenoService _havenoService;
|
||||
BalancesInfo? _balances;
|
||||
List<XmrTx>? _xmrTxs;
|
||||
String? _xmrPrimaryAddress;
|
||||
List<XmrIncomingTransfer> _xmrIncomingTransfers = [];
|
||||
List<XmrOutgoingTransfer> _xmrOutgoingTransfers = [];
|
||||
|
||||
WalletsProvider(this._havenoService);
|
||||
|
||||
BalancesInfo? get balances => _balances;
|
||||
String? get xmrPrimaryAddress => _xmrPrimaryAddress;
|
||||
List<XmrTx>? get xmrTxs => _xmrTxs;
|
||||
List<XmrIncomingTransfer> get xmrIncomingTransfers => _xmrIncomingTransfers;
|
||||
List<XmrOutgoingTransfer> get xmrOutgoingTransfers => _xmrOutgoingTransfers;
|
||||
|
||||
Future<void> getBalances() async {
|
||||
try {
|
||||
final getBalancesReply =
|
||||
await _havenoService.walletsClient.getBalances(GetBalancesRequest());
|
||||
_balances = getBalancesReply.balances;
|
||||
print("Balances: $_balances");
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get balances: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getXmrPrimaryAddress() async {
|
||||
try {
|
||||
final getXmrPrimaryAddressReply = await _havenoService.walletsClient
|
||||
.getXmrPrimaryAddress(GetXmrPrimaryAddressRequest());
|
||||
_xmrPrimaryAddress = getXmrPrimaryAddressReply.primaryAddress;
|
||||
print("Primary Address: $_xmrPrimaryAddress");
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
print("Failed to get primary address: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getXmrTxs() async {
|
||||
try {
|
||||
final getXmrTxsReply =
|
||||
await _havenoService.walletsClient.getXmrTxs(GetXmrTxsRequest());
|
||||
_xmrTxs = getXmrTxsReply.txs;
|
||||
_xmrIncomingTransfers = [];
|
||||
_xmrOutgoingTransfers = [];
|
||||
|
||||
_xmrTxs?.forEach((xmrTx) {
|
||||
_xmrIncomingTransfers.addAll(xmrTx.incomingTransfers);
|
||||
if (xmrTx.hasOutgoingTransfer()) {
|
||||
_xmrOutgoingTransfers.add(xmrTx.outgoingTransfer);
|
||||
}
|
||||
});
|
||||
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
debugPrint("Failed to get XMR transactions: $e");
|
||||
}
|
||||
}
|
||||
}
|
0
lib/repositories/haveno_node_repository.dart
Normal file
0
lib/repositories/monero_node_repository.dart
Normal file
99
lib/screens/accounts_screen.dart
Normal file
|
@ -0,0 +1,99 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/widgets/payment_method_form.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/payment_accounts_provider.dart';
|
||||
|
||||
class AccountsScreen extends StatefulWidget {
|
||||
@override
|
||||
_AccountsScreenState createState() => _AccountsScreenState();
|
||||
}
|
||||
|
||||
class _AccountsScreenState extends State<AccountsScreen> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
final paymentAccountsProvider =
|
||||
Provider.of<PaymentAccountsProvider>(context, listen: false);
|
||||
paymentAccountsProvider.getPaymentAccounts();
|
||||
}
|
||||
|
||||
void _showCreateAccountForm(BuildContext context) {
|
||||
final paymentAccountsProvider =
|
||||
Provider.of<PaymentAccountsProvider>(context, listen: false);
|
||||
|
||||
paymentAccountsProvider.getPaymentMethods().then((_) {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (BuildContext context) {
|
||||
return PaymentMethodSelectionForm();
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final paymentAccountsProvider =
|
||||
Provider.of<PaymentAccountsProvider>(context);
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
appBar: AppBar(
|
||||
title: const Text('Accounts'),
|
||||
),
|
||||
body: Consumer<PaymentAccountsProvider>(
|
||||
builder: (context, provider, child) {
|
||||
if (provider.isLoadingPaymentAccounts) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
} else if (provider.paymentAccounts?.isEmpty ?? true) {
|
||||
return const Center(
|
||||
child: Text(
|
||||
'You do not currently have any accounts',
|
||||
style: TextStyle(color: Colors.white70, fontSize: 18),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: ListView.builder(
|
||||
itemCount: provider.paymentAccounts?.length ?? 0,
|
||||
itemBuilder: (context, index) {
|
||||
final account = provider.paymentAccounts![index];
|
||||
return Card(
|
||||
color: Theme.of(context).cardTheme.color,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'${account.accountName}',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(height: 8.0),
|
||||
Text(
|
||||
account.paymentMethod.id,
|
||||
style: const TextStyle(color: Colors.white70),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () => _showCreateAccountForm(context),
|
||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||
child: Icon(Icons.add),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
346
lib/screens/active_buyer_trade_timeline_screen.dart
Normal file
|
@ -0,0 +1,346 @@
|
|||
import 'dart:convert';
|
||||
import 'package:fixnum/fixnum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/utils/check_fiat.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/trades_provider.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class ActiveBuyerTradeTimelineScreen extends StatefulWidget {
|
||||
final TradeInfo trade;
|
||||
|
||||
const ActiveBuyerTradeTimelineScreen({required this.trade});
|
||||
|
||||
@override
|
||||
_ActiveBuyerTradeTimelineScreenState createState() =>
|
||||
_ActiveBuyerTradeTimelineScreenState();
|
||||
}
|
||||
|
||||
class _ActiveBuyerTradeTimelineScreenState
|
||||
extends State<ActiveBuyerTradeTimelineScreen> {
|
||||
PageController _pageController = PageController();
|
||||
int _currentPage = 0;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initializePage();
|
||||
_listenToPhaseUpdates();
|
||||
}
|
||||
|
||||
void _initializePage() {
|
||||
setState(() {
|
||||
_currentPage = _getPhaseIndex(widget.trade.phase);
|
||||
_pageController = PageController(initialPage: _currentPage);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _completeTrade() async {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
await tradesProvider.completeTrade(widget.trade.tradeId);
|
||||
//final fetchedTrade = await tradesProvider.getTrade(widget.trade.tradeId);
|
||||
|
||||
//debugPrint("Fetched Trade ${fetchedTrade?.role}");
|
||||
}
|
||||
|
||||
void _listenToPhaseUpdates() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
debugPrint(
|
||||
"From getTrades() function: ${tradesProvider.trades?.last.amount}");
|
||||
tradesProvider.addListener(() {
|
||||
final updatedTrade = tradesProvider.trades
|
||||
?.firstWhere((trade) => trade.tradeId == widget.trade.tradeId);
|
||||
if (updatedTrade != null && updatedTrade.phase != widget.trade.phase) {
|
||||
setState(() {
|
||||
widget.trade.phase = updatedTrade.phase;
|
||||
_currentPage = _getPhaseIndex(updatedTrade.phase);
|
||||
_pageController.animateToPage(
|
||||
_currentPage,
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
String _getPhaseText(String phase) {
|
||||
switch (phase) {
|
||||
case 'INIT':
|
||||
return "Initializing Trade";
|
||||
case 'DEPOSITS_PUBLISHED':
|
||||
return "Transferring to Escrow";
|
||||
case 'DEPOSITS_CONFIRMED':
|
||||
return "Deposit Received";
|
||||
case 'DEPOSITS_UNLOCKED':
|
||||
return "Awaiting Your Payment";
|
||||
case 'PAYMENT_SENT':
|
||||
return "Seller Confirming Payment";
|
||||
case 'PAYMENT_RECEIVED':
|
||||
return "Payment Received";
|
||||
default:
|
||||
return phase;
|
||||
}
|
||||
}
|
||||
|
||||
int _getPhaseIndex(String phase) {
|
||||
switch (phase) {
|
||||
case 'INIT':
|
||||
return 0;
|
||||
case 'DEPOSITS_PUBLISHED':
|
||||
return 1;
|
||||
case 'DEPOSITS_CONFIRMED':
|
||||
return 2;
|
||||
case 'DEPOSITS_UNLOCKED':
|
||||
return 3;
|
||||
case 'PAYMENT_SENT':
|
||||
return 4;
|
||||
case 'PAYMENT_RECEIVED':
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildPaymentDetails(String title, Map<String, dynamic> payload) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
...payload.entries.map((entry) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: TextFormField(
|
||||
initialValue: entry.value,
|
||||
readOnly: true,
|
||||
decoration: InputDecoration(
|
||||
labelText: entry.key,
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCopyablePaymentDetails(
|
||||
String title, Map<String, dynamic> payload) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
...payload.entries.map((entry) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: TextFormField(
|
||||
initialValue: entry.value,
|
||||
readOnly: true,
|
||||
decoration: InputDecoration(
|
||||
labelText: entry.key,
|
||||
border: OutlineInputBorder(),
|
||||
suffixIcon: IconButton(
|
||||
icon: Icon(Icons.copy),
|
||||
onPressed: () {
|
||||
Clipboard.setData(ClipboardData(text: entry.value));
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('Copied to clipboard')),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> _extractAccountPayload(Map<String, dynamic> json) {
|
||||
return json.entries
|
||||
.firstWhere((entry) => entry.key.contains('AccountPayload'))
|
||||
.value as Map<String, dynamic>;
|
||||
}
|
||||
|
||||
void _onPaidInFull() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
tradesProvider.confirmPaymentSent(widget.trade.tradeId).catchError((error) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
'Failed to confirm payment, please try again in a moment.')),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final phases = [
|
||||
'INIT',
|
||||
'DEPOSITS_PUBLISHED',
|
||||
'DEPOSITS_CONFIRMED',
|
||||
'DEPOSITS_UNLOCKED',
|
||||
'PAYMENT_SENT',
|
||||
'PAYMENT_RECEIVED',
|
||||
];
|
||||
|
||||
final int totalPages = phases.length;
|
||||
|
||||
final price = double.parse(widget.trade.price);
|
||||
final amount =
|
||||
formatXmr(widget.trade.amount, returnString: false) as double;
|
||||
final totalAmount = amount * price;
|
||||
final totalAmountFormatted =
|
||||
formatFiat(totalAmount, widget.trade.offer.counterCurrencyCode);
|
||||
final String currencyCode = widget.trade.offer.counterCurrencyCode;
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('Active Trade Details'),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
itemCount: totalPages,
|
||||
itemBuilder: (context, index) {
|
||||
final phase = phases[index];
|
||||
if (phase == 'DEPOSITS_UNLOCKED') {
|
||||
final takerPaymentAccountJson = widget
|
||||
.trade.contract.takerPaymentAccountPayload
|
||||
.toProto3Json();
|
||||
final makerPaymentAccountJson = widget
|
||||
.trade.contract.makerPaymentAccountPayload
|
||||
.toProto3Json();
|
||||
|
||||
debugPrint(jsonEncode(takerPaymentAccountJson));
|
||||
debugPrint(jsonEncode(makerPaymentAccountJson));
|
||||
|
||||
final takerPaymentAccountPayload = _extractAccountPayload(
|
||||
jsonDecode(jsonEncode(takerPaymentAccountJson)));
|
||||
final makerPaymentAccountPayload = _extractAccountPayload(
|
||||
jsonDecode(jsonEncode(makerPaymentAccountJson)));
|
||||
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularProgressIndicator(),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
_getPhaseText(phase),
|
||||
style: TextStyle(fontSize: 24),
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Text(
|
||||
'You must pay a total of $totalAmountFormatted. Please be sure the amount is exact.',
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
_buildPaymentDetails('You\'ll send from...',
|
||||
takerPaymentAccountPayload),
|
||||
_buildCopyablePaymentDetails(
|
||||
'To the sellers account...',
|
||||
makerPaymentAccountPayload),
|
||||
SizedBox(height: 20),
|
||||
ElevatedButton(
|
||||
onPressed: _onPaidInFull,
|
||||
child: Text('I have paid in full'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularProgressIndicator(),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
_getPhaseText(phase),
|
||||
style: TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 18.0, top: 8.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: List.generate(totalPages, (index) {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 4.0),
|
||||
width: 12.0,
|
||||
height: 12.0,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: index <= _currentPage ? Colors.green : Colors.grey,
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
dynamic formatXmr(Int64? atomicUnits, {bool returnString = true}) {
|
||||
if (atomicUnits == null) {
|
||||
return returnString ? 'N/A' : null;
|
||||
}
|
||||
double value = atomicUnits.toInt() / 1e12;
|
||||
return returnString ? value.toStringAsFixed(5) : value;
|
||||
}
|
||||
|
||||
String formatFiat(double amount, String currencyCode) {
|
||||
return isFiatCurrency(currencyCode)
|
||||
? '${amount.toStringAsFixed(2)} $currencyCode'
|
||||
: amount.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_pageController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
346
lib/screens/active_seller_trade_timeline_screen.dart
Normal file
|
@ -0,0 +1,346 @@
|
|||
import 'dart:convert';
|
||||
import 'package:fixnum/fixnum.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:haveno_flutter_app/utils/check_fiat.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:haveno_flutter_app/providers/trades_provider.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pbgrpc.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class ActiveSellerTradeTimelineScreen extends StatefulWidget {
|
||||
final TradeInfo trade;
|
||||
|
||||
const ActiveSellerTradeTimelineScreen({required this.trade});
|
||||
|
||||
@override
|
||||
_ActiveSellerTradeTimelineScreenState createState() =>
|
||||
_ActiveSellerTradeTimelineScreenState();
|
||||
}
|
||||
|
||||
class _ActiveSellerTradeTimelineScreenState
|
||||
extends State<ActiveSellerTradeTimelineScreen> {
|
||||
PageController _pageController = PageController();
|
||||
int _currentPage = 0;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initializePage();
|
||||
_listenToPhaseUpdates();
|
||||
}
|
||||
|
||||
void _initializePage() {
|
||||
setState(() {
|
||||
_currentPage = _getPhaseIndex(widget.trade.phase);
|
||||
_pageController = PageController(initialPage: _currentPage);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _completeTrade() async {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
await tradesProvider.completeTrade(widget.trade.tradeId);
|
||||
}
|
||||
|
||||
void _listenToPhaseUpdates() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
tradesProvider.addListener(() {
|
||||
final updatedTrade = tradesProvider.trades
|
||||
?.firstWhere((trade) => trade.tradeId == widget.trade.tradeId);
|
||||
if (updatedTrade != null && updatedTrade.phase != widget.trade.phase) {
|
||||
setState(() {
|
||||
widget.trade.phase = updatedTrade.phase;
|
||||
_currentPage = _getPhaseIndex(updatedTrade.phase);
|
||||
_pageController.animateToPage(
|
||||
_currentPage,
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
String _getPhaseText(String phase) {
|
||||
switch (phase) {
|
||||
case 'INIT':
|
||||
return "Initializing Trade";
|
||||
case 'DEPOSITS_PUBLISHED':
|
||||
return "Sending to Escrow";
|
||||
case 'DEPOSITS_CONFIRMED':
|
||||
return "Deposit Sent";
|
||||
case 'DEPOSITS_UNLOCKED':
|
||||
return "Awaiting Payment";
|
||||
case 'PAYMENT_SENT':
|
||||
return "Confirm Payment Received";
|
||||
case 'PAYMENT_RECEIVED':
|
||||
return "Completed";
|
||||
default:
|
||||
return phase;
|
||||
}
|
||||
}
|
||||
|
||||
int _getPhaseIndex(String phase) {
|
||||
switch (phase) {
|
||||
case 'INIT':
|
||||
return 0;
|
||||
case 'DEPOSITS_PUBLISHED':
|
||||
return 1;
|
||||
case 'DEPOSITS_CONFIRMED':
|
||||
return 2;
|
||||
case 'DEPOSITS_UNLOCKED':
|
||||
return 3;
|
||||
case 'PAYMENT_SENT':
|
||||
return 4;
|
||||
case 'PAYMENT_RECEIVED':
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildPaymentDetails(String title, Map<String, dynamic> payload) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
...payload.entries.map((entry) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: TextFormField(
|
||||
initialValue: entry.value,
|
||||
readOnly: true,
|
||||
decoration: InputDecoration(
|
||||
labelText: entry.key,
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCopyablePaymentDetails(
|
||||
String title, Map<String, dynamic> payload) {
|
||||
return Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
...payload.entries.map((entry) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: TextFormField(
|
||||
initialValue: entry.value,
|
||||
readOnly: true,
|
||||
decoration: InputDecoration(
|
||||
labelText: entry.key,
|
||||
border: OutlineInputBorder(),
|
||||
suffixIcon: IconButton(
|
||||
icon: Icon(Icons.copy),
|
||||
onPressed: () {
|
||||
Clipboard.setData(ClipboardData(text: entry.value));
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('Copied to clipboard')),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> _extractAccountPayload(Map<String, dynamic> json) {
|
||||
return json.entries
|
||||
.firstWhere((entry) => entry.key.contains('AccountPayload'))
|
||||
.value as Map<String, dynamic>;
|
||||
}
|
||||
|
||||
void _onConfirmPaymentReceived() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
tradesProvider
|
||||
.confirmPaymentReceived(widget.trade.tradeId)
|
||||
.catchError((error) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
'Failed to confirm payment received, please try again in a moment.')),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final phases = [
|
||||
'INIT',
|
||||
'DEPOSITS_PUBLISHED',
|
||||
'DEPOSITS_CONFIRMED',
|
||||
'DEPOSITS_UNLOCKED',
|
||||
'PAYMENT_SENT',
|
||||
'PAYMENT_RECEIVED',
|
||||
];
|
||||
|
||||
final int totalPages = phases.length;
|
||||
|
||||
final price = double.parse(widget.trade.price);
|
||||
final amount =
|
||||
formatXmr(widget.trade.amount, returnString: false) as double;
|
||||
final totalAmount = amount * price;
|
||||
final totalAmountFormatted =
|
||||
formatFiat(totalAmount, widget.trade.offer.counterCurrencyCode);
|
||||
final String currencyCode = widget.trade.offer.counterCurrencyCode;
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('Active Maker Trade Details'),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
itemCount: totalPages,
|
||||
itemBuilder: (context, index) {
|
||||
final phase = phases[index];
|
||||
if (phase == 'PAYMENT_SENT') {
|
||||
final takerPaymentAccountJson = widget
|
||||
.trade.contract.takerPaymentAccountPayload
|
||||
.toProto3Json();
|
||||
final makerPaymentAccountJson = widget
|
||||
.trade.contract.makerPaymentAccountPayload
|
||||
.toProto3Json();
|
||||
|
||||
debugPrint(jsonEncode(takerPaymentAccountJson));
|
||||
debugPrint(jsonEncode(makerPaymentAccountJson));
|
||||
|
||||
final takerPaymentAccountPayload = _extractAccountPayload(
|
||||
jsonDecode(jsonEncode(takerPaymentAccountJson)));
|
||||
final makerPaymentAccountPayload = _extractAccountPayload(
|
||||
jsonDecode(jsonEncode(makerPaymentAccountJson)));
|
||||
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularProgressIndicator(),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
_getPhaseText(phase),
|
||||
style: TextStyle(fontSize: 24),
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
Card(
|
||||
margin: const EdgeInsets.all(8.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Text(
|
||||
'You should have received a total of $totalAmountFormatted from the following account:',
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
_buildPaymentDetails(
|
||||
'From account...', takerPaymentAccountPayload),
|
||||
SizedBox(height: 20),
|
||||
ElevatedButton(
|
||||
onPressed: _onConfirmPaymentReceived,
|
||||
child: Text('Confirm Payment Received'),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
// Add your logic to open chat here
|
||||
},
|
||||
child: Text('Open Chat'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CircularProgressIndicator(),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
_getPhaseText(phase),
|
||||
style: TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 18.0, top: 8.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: List.generate(totalPages, (index) {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 4.0),
|
||||
width: 12.0,
|
||||
height: 12.0,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: index <= _currentPage ? Colors.green : Colors.grey,
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
dynamic formatXmr(Int64? atomicUnits, {bool returnString = true}) {
|
||||
if (atomicUnits == null) {
|
||||
return returnString ? 'N/A' : null;
|
||||
}
|
||||
double value = atomicUnits.toInt() / 1e12;
|
||||
return returnString ? value.toStringAsFixed(5) : value;
|
||||
}
|
||||
|
||||
String formatFiat(double amount, String currencyCode) {
|
||||
return isFiatCurrency(currencyCode)
|
||||
? '${amount.toStringAsFixed(2)} $currencyCode'
|
||||
: amount.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_pageController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
184
lib/screens/active_trade_chat_screen.dart
Normal file
|
@ -0,0 +1,184 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
|
||||
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
|
||||
import 'package:haveno_flutter_app/proto/compiled/grpc.pb.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:haveno_flutter_app/providers/trades_provider.dart';
|
||||
|
||||
class ActiveTradeChatScreen extends StatefulWidget {
|
||||
final TradeInfo trade;
|
||||
|
||||
const ActiveTradeChatScreen({required this.trade});
|
||||
|
||||
@override
|
||||
_ActiveTradeChatScreenState createState() => _ActiveTradeChatScreenState();
|
||||
}
|
||||
|
||||
class _ActiveTradeChatScreenState extends State<ActiveTradeChatScreen> {
|
||||
List<types.Message> _messages = [];
|
||||
final _user = const types.User(id: 'me');
|
||||
Timer? _timer;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_loadMessages();
|
||||
_startMessageUpdateTimer();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_timer?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _startMessageUpdateTimer() {
|
||||
_timer = Timer.periodic(Duration(seconds: 61), (timer) {
|
||||
_fetchMessages();
|
||||
});
|
||||
}
|
||||
|
||||
void _loadMessages() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
_fetchMessages();
|
||||
_messages =
|
||||
tradesProvider.chatMessages[widget.trade.tradeId]?.map((chatMessage) {
|
||||
return types.TextMessage(
|
||||
author: types.User(id: chatMessage.senderNodeAddress.hostName),
|
||||
createdAt: chatMessage.date.toInt(),
|
||||
id: chatMessage.uid,
|
||||
text: chatMessage.message,
|
||||
);
|
||||
}).toList() ??
|
||||
[];
|
||||
_messages = _messages.reversed.toList(); // Reverse the order of messages
|
||||
}
|
||||
|
||||
Future<void> _fetchMessages() async {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
await tradesProvider.getChatMessages(widget.trade.tradeId).then((_) {
|
||||
setState(() {
|
||||
_messages = tradesProvider.chatMessages[widget.trade.tradeId]
|
||||
?.map((chatMessage) {
|
||||
return types.TextMessage(
|
||||
author: types.User(id: chatMessage.senderNodeAddress.hostName),
|
||||
createdAt: chatMessage.date.toInt(),
|
||||
id: chatMessage.uid,
|
||||
text: chatMessage.message,
|
||||
);
|
||||
}).toList() ??
|
||||
[];
|
||||
_messages =
|
||||
_messages.reversed.toList(); // Reverse the order of messages
|
||||
});
|
||||
}).catchError((error) {
|
||||
setState(() {
|
||||
_messages = tradesProvider.chatMessages[widget.trade.tradeId]
|
||||
?.map((chatMessage) {
|
||||
return types.TextMessage(
|
||||
author: types.User(id: chatMessage.senderNodeAddress.hostName),
|
||||
createdAt: chatMessage.date.toInt(),
|
||||
id: chatMessage.uid,
|
||||
text: chatMessage.message,
|
||||
);
|
||||
}).toList() ??
|
||||
[];
|
||||
_messages =
|
||||
_messages.reversed.toList(); // Reverse the order of messages
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void _addMessage(types.Message message) {
|
||||
setState(() {
|
||||
_messages.add(message);
|
||||
});
|
||||
}
|
||||
|
||||
void _addSystemMessage(String text) {
|
||||
final systemMessage = types.SystemMessage(
|
||||
author: const types.User(id: 'system'),
|
||||
createdAt: DateTime.now().millisecondsSinceEpoch,
|
||||
id: const Uuid().v4(),
|
||||
text: text,
|
||||
);
|
||||
|
||||
_addMessage(systemMessage);
|
||||
}
|
||||
|
||||
void _handleSendPressed(types.PartialText message) {
|
||||
final textMessage = types.TextMessage(
|
||||
author: _user,
|
||||
createdAt: DateTime.now().millisecondsSinceEpoch,
|
||||
id: const Uuid().v4(),
|
||||
text: message.text,
|
||||
);
|
||||
|
||||
_addMessage(textMessage);
|
||||
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
try {
|
||||
tradesProvider.sendChatMessage(widget.trade.tradeId, message.text);
|
||||
} catch (e) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('You can only send 1 message per minute!')),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _handlePaymentSentPressed() {
|
||||
final tradesProvider = Provider.of<TradesProvider>(context, listen: false);
|
||||
tradesProvider.confirmPaymentSent(widget.trade.tradeId).then((_) {
|
||||
_addSystemMessage('Payment marked as sent.');
|
||||
}).catchError((error) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('Failed to confirm payment: $error')),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('Trade #${widget.trade.shortId}'),
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.check),
|
||||
onPressed: _handlePaymentSentPressed,
|
||||
tooltip: 'Confirm Transfer of Funds',
|
||||
),
|
||||
],
|
||||
),
|
||||
body: Consumer<TradesProvider>(
|
||||
builder: (context, tradesProvider, child) {
|
||||
final chatMessages =
|
||||
tradesProvider.chatMessages[widget.trade.tradeId];
|
||||
if (chatMessages != null) {
|
||||
_messages = chatMessages
|
||||
.map((chatMessage) => types.TextMessage(
|
||||
author: types.User(id: chatMessage.traderId.toString()),
|
||||
createdAt: chatMessage.date.toInt(),
|
||||
id: chatMessage.uid,
|
||||
text: chatMessage.message,
|
||||
))
|
||||
.toList();
|
||||
_messages =
|
||||
_messages.reversed.toList(); // Reverse the order of messages
|
||||
}
|
||||
return Chat(
|
||||
messages: _messages,
|
||||
onSendPressed: _handleSendPressed,
|
||||
showUserAvatars: false,
|
||||
showUserNames: false,
|
||||
user: _user,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|