diff --git a/.github/workflows/ios-staging.yml b/.github/workflows/ios-staging.yml
new file mode 100644
index 0000000..2097d41
--- /dev/null
+++ b/.github/workflows/ios-staging.yml
@@ -0,0 +1,88 @@
+name: Release iOS Staging
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build:
+ name: Build iOS
+ runs-on: macos-latest
+ timeout-minutes: 180
+ steps:
+ - name: Checkout source
+ uses: actions/checkout@v3
+
+ - uses: pnpm/action-setup@v2
+ name: Install pnpm
+ id: pnpm-install
+ with:
+ version: 8
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18.x
+ cache: 'pnpm'
+
+ # Install dependencies using pnpm
+ - name: Install Dependencies
+ run: pnpm install
+
+ - name: Build SolidJS app
+ env:
+ VITE_NETWORK: signet
+ VITE_PROXY: wss://p.mutinywallet.com
+ VITE_ESPLORA: https://mutinynet.com/api
+ VITE_LSP: https://signet-lsp.mutinywallet.com
+ VITE_RGS: https://rgs.mutinynet.com/snapshot/
+ VITE_AUTH: https://auth-staging.mutinywallet.com
+ VITE_SUBSCRIPTIONS: https://subscriptions-staging.mutinywallet.com
+ VITE_STORAGE: https://storage-staging.mutinywallet.com/v2
+ VITE_FEEDBACK: https://feedback-staging.mutinywallet.com
+ VITE_SCORER: https://scorer-staging.mutinywallet.com
+ VITE_PRIMAL: https://primal-cache.mutinywallet.com/api
+ run: pnpm build
+
+ - uses: actions/cache@v3
+ with:
+ path: ios/App/Pods
+ key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-pods-
+
+ - name: Capacitor sync
+ run: npx cap sync
+
+ - uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: '3.2.2'
+ bundler-cache: true
+ working-directory: 'ios/App'
+
+ - uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: '14.2.0'
+
+ - uses: maierj/fastlane-action@v3.0.0
+ env:
+ DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
+ # PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
+ KEYCHAIN_NAME: ${{ secrets.KEYCHAIN_NAME }}
+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
+ APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
+ CERTIFICATE_STORE_URL: ${{ secrets.CERTIFICATE_STORE_URL }}
+ GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
+ GIT_TOKEN: ${{ secrets.GIT_TOKEN }}
+ FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
+ MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
+ DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
+ with:
+ lane: 'beta'
+ subdirectory: 'ios/App'
+
+
diff --git a/ios/.gitignore b/ios/.gitignore
index f470299..a2957a9 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -11,3 +11,6 @@ capacitor-cordova-ios-plugins
# Generated Config files
App/App/capacitor.config.json
App/App/config.xml
+
+App/App.app.dSYM.zip
+App/App.ipa
\ No newline at end of file
diff --git a/ios/App/App.app.dSYM.zip b/ios/App/App.app.dSYM.zip
new file mode 100644
index 0000000..9b0fc85
Binary files /dev/null and b/ios/App/App.app.dSYM.zip differ
diff --git a/ios/App/App.ipa b/ios/App/App.ipa
new file mode 100644
index 0000000..4cad690
Binary files /dev/null and b/ios/App/App.ipa differ
diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj
index 37dd785..0201f01 100644
--- a/ios/App/App.xcodeproj/project.pbxproj
+++ b/ios/App/App.xcodeproj/project.pbxproj
@@ -351,7 +351,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 2;
+ CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = X773Y823TN;
INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
@@ -374,9 +374,11 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 2;
- DEVELOPMENT_TEAM = X773Y823TN;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 11;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = X773Y823TN;
INFOPLIST_FILE = App/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
@@ -385,6 +387,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.mutinywallet.mutiny;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.mutinywallet.mutiny";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist
index 10ca0f1..f39e235 100644
--- a/ios/App/App/Info.plist
+++ b/ios/App/App/Info.plist
@@ -19,7 +19,7 @@
CFBundleShortVersionString
$(MARKETING_VERSION)
CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
+ 11
LSRequiresIPhoneOS
NSCameraUsageDescription
diff --git a/ios/App/Gemfile b/ios/App/Gemfile
new file mode 100644
index 0000000..7a118b4
--- /dev/null
+++ b/ios/App/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/ios/App/Gemfile.lock b/ios/App/Gemfile.lock
new file mode 100644
index 0000000..7520d71
--- /dev/null
+++ b/ios/App/Gemfile.lock
@@ -0,0 +1,218 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.6)
+ rexml
+ addressable (2.8.5)
+ public_suffix (>= 2.0.2, < 6.0)
+ artifactory (3.0.15)
+ atomos (0.1.3)
+ aws-eventstream (1.2.0)
+ aws-partitions (1.843.0)
+ aws-sdk-core (3.185.2)
+ aws-eventstream (~> 1, >= 1.0.2)
+ aws-partitions (~> 1, >= 1.651.0)
+ aws-sigv4 (~> 1.5)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.72.0)
+ aws-sdk-core (~> 3, >= 3.184.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-s3 (1.136.0)
+ aws-sdk-core (~> 3, >= 3.181.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.6)
+ aws-sigv4 (1.6.1)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ claide (1.1.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.5.20190701)
+ unf (>= 0.0.5, < 1.0.0)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ excon (0.104.0)
+ faraday (1.10.3)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fastimage (2.2.7)
+ fastlane (2.216.0)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (~> 0.1.1)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.3)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.51.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.2)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ webrick
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.19.0)
+ google-apis-core (>= 0.9.0, < 2.a)
+ google-cloud-core (1.6.0)
+ google-cloud-env (~> 1.0)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.3.1)
+ google-cloud-storage (1.44.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.19.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.5)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.6.2)
+ json (2.6.3)
+ jwt (2.7.1)
+ mini_magick (4.12.0)
+ mini_mime (1.1.5)
+ multi_json (1.15.0)
+ multipart-post (2.3.0)
+ nanaimo (0.3.0)
+ naturally (2.2.1)
+ optparse (0.1.1)
+ os (1.1.4)
+ plist (3.7.0)
+ public_suffix (5.0.3)
+ rake (13.1.0)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.2.6)
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.3)
+ signet (0.18.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.1)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.8.2)
+ unicode-display_width (2.5.0)
+ webrick (1.8.1)
+ word_wrap (1.0.0)
+ xcodeproj (1.23.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.3.0)
+ rexml (~> 3.2.4)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-23
+ x86_64-darwin-20
+
+DEPENDENCIES
+ fastlane
+
+BUNDLED WITH
+ 2.4.10
diff --git a/ios/App/fastlane/.gitignore b/ios/App/fastlane/.gitignore
new file mode 100644
index 0000000..4dfd54d
--- /dev/null
+++ b/ios/App/fastlane/.gitignore
@@ -0,0 +1 @@
+report.xml
\ No newline at end of file
diff --git a/ios/App/fastlane/Appfile b/ios/App/fastlane/Appfile
new file mode 100644
index 0000000..a3756d9
--- /dev/null
+++ b/ios/App/fastlane/Appfile
@@ -0,0 +1,7 @@
+app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"]) # The bundle identifier of your app
+apple_id(ENV["FASTLANE_APPLE_ID"]) # Your Apple Developer Portal username
+itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"]) # App Store Connect Team ID
+team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"]) # Developer Portal Team ID
+
+# For more information about the Appfile, see:
+# https://docs.fastlane.tools/advanced/#appfile
diff --git a/ios/App/fastlane/Fastfile b/ios/App/fastlane/Fastfile
new file mode 100644
index 0000000..9698694
--- /dev/null
+++ b/ios/App/fastlane/Fastfile
@@ -0,0 +1,59 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+default_platform(:ios)
+
+ISSUER_ID = ENV["APPLE_ISSUER_ID"]
+KEY_ID = ENV["APPLE_KEY_ID"]
+KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
+
+KEYCHAIN_NAME = ENV["KEYCHAIN_NAME"]
+KEYCHAIN_PASSWORD = ENV["KEYCHAIN_PASSWORD"]
+
+platform :ios do
+ desc "Push a new beta build to TestFlight"
+ lane :beta do
+ api_key = app_store_connect_api_key(
+ key_id: KEY_ID,
+ issuer_id: ISSUER_ID,
+ key_content: KEY_CONTENT
+ )
+
+ # In CI we don't want to be prompted for a password
+ create_keychain(
+ name: KEYCHAIN_NAME,
+ password: KEYCHAIN_PASSWORD,
+ default_keychain: true,
+ unlock: true,
+ timeout: 3600,
+ add_to_search_list: true
+ )
+
+ match(
+ type: "appstore",
+ keychain_name: KEYCHAIN_NAME,
+ keychain_password: KEYCHAIN_PASSWORD,
+ readonly: is_ci
+ )
+
+ increment_build_number(xcodeproj: "App.xcodeproj")
+ build_app(
+ workspace: "App.xcworkspace",
+ scheme: "App",
+ xcargs: "-allowProvisioningUpdates"
+ )
+ upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true)
+ end
+end
diff --git a/ios/App/fastlane/Matchfile b/ios/App/fastlane/Matchfile
new file mode 100644
index 0000000..57c62ef
--- /dev/null
+++ b/ios/App/fastlane/Matchfile
@@ -0,0 +1,20 @@
+CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
+GIT_USERNAME = ENV["GIT_USERNAME"]
+GIT_TOKEN = ENV["GIT_TOKEN"]
+FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]
+
+git_url(CERTIFICATE_STORE_URL)
+
+storage_mode("git")
+type("appstore") # The default type, can be: appstore, adhoc, enterprise or development
+
+git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
+username(FASTLANE_APPLE_ID)
+
+# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
+# username("user@fastlane.tools") # Your Apple Developer Portal username
+
+# For all available options run `fastlane match --help`
+# Remove the # in the beginning of the line to enable the other options
+
+# The docs are available on https://docs.fastlane.tools/actions/match
diff --git a/ios/App/fastlane/README.md b/ios/App/fastlane/README.md
new file mode 100644
index 0000000..891747d
--- /dev/null
+++ b/ios/App/fastlane/README.md
@@ -0,0 +1,32 @@
+fastlane documentation
+----
+
+# Installation
+
+Make sure you have the latest version of the Xcode command line tools installed:
+
+```sh
+xcode-select --install
+```
+
+For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
+
+# Available Actions
+
+## iOS
+
+### ios beta
+
+```sh
+[bundle exec] fastlane ios beta
+```
+
+Push a new beta build to TestFlight
+
+----
+
+This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
+
+More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).
+
+The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/src/components/BetaWarningModal.tsx b/src/components/BetaWarningModal.tsx
index 82bc1cc..f3ca699 100644
--- a/src/components/BetaWarningModal.tsx
+++ b/src/components/BetaWarningModal.tsx
@@ -58,15 +58,17 @@ export const WarningModal: ParentComponent<{
-
- {props.title}
-
-
-
-
-
- {props.children}
-
+
+
+ {props.title}
+
+
+
+
+
+ {props.children}
+
+
diff --git a/src/utils/download.ts b/src/utils/download.ts
index 87e5576..6014884 100644
--- a/src/utils/download.ts
+++ b/src/utils/download.ts
@@ -3,6 +3,8 @@ import { Directory, Encoding, Filesystem } from "@capacitor/filesystem";
import { Share } from "@capacitor/share";
import { Toast } from "@capacitor/toast";
+import { eify } from "./eify";
+
export async function downloadTextFile(
content: string,
fileName: string,
@@ -35,10 +37,18 @@ export async function downloadTextFile(
"Error creating or sharing the file: ",
JSON.stringify(error)
);
- await Toast.show({
- text: `Error while saving or sharing file`,
- duration: "long"
- });
+
+ const err = eify(error);
+
+ if (err.message.includes("Share canceled")) {
+ // Do nothing
+ return;
+ } else {
+ await Toast.show({
+ text: `Error while saving or sharing file`,
+ duration: "long"
+ });
+ }
}
} else {
// https://stackoverflow.com/questions/34156282/how-do-i-save-json-to-local-text-file