diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index abca6601..994daa1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -104,7 +104,7 @@ release-notes: # release-notes.md is the full section (summary + bulleted lists), used as # the GitLab Release description. release-notes-summary.txt is the leading # plaintext paragraph only, used as the App Store / Play Store release - # blurb. Falls back to "Ditto vX.Y.Z" when the section has no summary. + # blurb. Falls back to "Agora vX.Y.Z" when the section has no summary. - mkdir -p artifacts - node scripts/extract-release-notes.mjs "$CI_COMMIT_TAG" > artifacts/release-notes.md - node scripts/extract-release-notes.mjs "$CI_COMMIT_TAG" --summary > artifacts/release-notes-summary.txt @@ -280,27 +280,27 @@ build-ipa: ios/App/App.xcodeproj/project.pbxproj # Run match (cert verify + decrypt) and build_app to produce the IPA. - # build_app writes ./artifacts/Ditto.ipa relative to the project root. + # build_app writes ./artifacts/Agora.ipa relative to the project root. - cd ios - fastlane build_ipa - cd .. # Move the IPA to a stable name in the artifact directory. - ls -lh artifacts/ - - test -f artifacts/Ditto.ipa + - test -f artifacts/Agora.ipa # Upload to the Generic Packages registry for a stable public download URL, # mirroring how build-apk publishes the APK and AAB. - | curl --fail --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ - --upload-file "artifacts/Ditto.ipa" \ - "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.ipa" + --upload-file "artifacts/Agora.ipa" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.ipa" after_script: # Wipe the API key so nothing sensitive sticks around between jobs. - rm -f "$HOME/.private_keys"/AuthKey_*.p8 || true artifacts: paths: - - artifacts/Ditto.ipa + - artifacts/Agora.ipa expire_in: 90 days release: @@ -333,8 +333,8 @@ release: - name: Agora-${CI_COMMIT_TAG}.aab url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.aab link_type: package - - name: Ditto-${CI_COMMIT_TAG}.ipa - url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ditto/${CI_COMMIT_TAG}/Ditto-${CI_COMMIT_TAG}.ipa + - name: Agora-${CI_COMMIT_TAG}.ipa + url: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/agora/${CI_COMMIT_TAG}/Agora-${CI_COMMIT_TAG}.ipa link_type: package publish-zapstore: @@ -395,7 +395,7 @@ publish-google-play: - >- fastlane supply --aab artifacts/Agora.aab - --package_name pub.agora.app + --package_name spot.agora.app --track production --json_key /tmp/play-service-account.json --metadata_path android/fastlane/metadata/android @@ -446,7 +446,7 @@ publish-app-store: # a JSON descriptor; we pass the API key inline via the Fastfile. - unset APP_STORE_CONNECT_API_KEY_PATH || true script: - - test -f artifacts/Ditto.ipa + - test -f artifacts/Agora.ipa - test -f artifacts/release-notes-summary.txt # Use the release summary paragraph as the App Store "What's New" text. @@ -458,7 +458,7 @@ publish-app-store: - echo "-------------------------" # Submit the prebuilt IPA from build-ipa to App Store Connect for review. - - export IPA_PATH="$CI_PROJECT_DIR/artifacts/Ditto.ipa" + - export IPA_PATH="$CI_PROJECT_DIR/artifacts/Agora.ipa" - cd ios - fastlane submit_release after_script: diff --git a/android/app/build.gradle b/android/app/build.gradle index b8bf596e..7ded4c48 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,10 +7,10 @@ if (keystorePropertiesFile.exists()) { } android { - namespace = "pub.agora.app" + namespace = "spot.agora.app" compileSdk = rootProject.ext.compileSdkVersion defaultConfig { - applicationId "pub.agora.app" + applicationId "spot.agora.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index fc10e2f8..276b8ce2 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -10,6 +10,7 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-app') + implementation project(':capacitor-barcode-scanner') implementation project(':capacitor-filesystem') implementation project(':capacitor-haptics') implementation project(':capacitor-keyboard') diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 2b72043e..956f8283 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -7,7 +7,7 @@ # Keep Capacitor classes (WebView JS bridge) -keep class com.getcapacitor.** { *; } --keep class pub.ditto.app.** { *; } +-keep class spot.agora.app.** { *; } # Keep WebView JS interfaces -keepclassmembers class * { diff --git a/android/app/src/main/java/pub/ditto/app/DittoNotificationPlugin.java b/android/app/src/main/java/spot/agora/app/DittoNotificationPlugin.java similarity index 99% rename from android/app/src/main/java/pub/ditto/app/DittoNotificationPlugin.java rename to android/app/src/main/java/spot/agora/app/DittoNotificationPlugin.java index 6b8d1664..f7ef0f8b 100644 --- a/android/app/src/main/java/pub/ditto/app/DittoNotificationPlugin.java +++ b/android/app/src/main/java/spot/agora/app/DittoNotificationPlugin.java @@ -1,4 +1,4 @@ -package pub.ditto.app; +package spot.agora.app; import android.app.ForegroundServiceStartNotAllowedException; import android.content.Context; diff --git a/android/app/src/main/java/pub/ditto/app/MainActivity.java b/android/app/src/main/java/spot/agora/app/MainActivity.java similarity index 99% rename from android/app/src/main/java/pub/ditto/app/MainActivity.java rename to android/app/src/main/java/spot/agora/app/MainActivity.java index 961d1f8d..ba6309ca 100644 --- a/android/app/src/main/java/pub/ditto/app/MainActivity.java +++ b/android/app/src/main/java/spot/agora/app/MainActivity.java @@ -1,4 +1,4 @@ -package pub.ditto.app; +package spot.agora.app; import android.app.ForegroundServiceStartNotAllowedException; import android.content.Context; diff --git a/android/app/src/main/java/pub/ditto/app/NostrPoller.java b/android/app/src/main/java/spot/agora/app/NostrPoller.java similarity index 99% rename from android/app/src/main/java/pub/ditto/app/NostrPoller.java rename to android/app/src/main/java/spot/agora/app/NostrPoller.java index dd297d01..2c7b97d7 100644 --- a/android/app/src/main/java/pub/ditto/app/NostrPoller.java +++ b/android/app/src/main/java/spot/agora/app/NostrPoller.java @@ -1,4 +1,4 @@ -package pub.ditto.app; +package spot.agora.app; import android.app.NotificationChannel; import android.app.NotificationManager; diff --git a/android/app/src/main/java/pub/ditto/app/NotificationRelayService.java b/android/app/src/main/java/spot/agora/app/NotificationRelayService.java similarity index 99% rename from android/app/src/main/java/pub/ditto/app/NotificationRelayService.java rename to android/app/src/main/java/spot/agora/app/NotificationRelayService.java index fc420b3a..b12c9fc8 100644 --- a/android/app/src/main/java/pub/ditto/app/NotificationRelayService.java +++ b/android/app/src/main/java/spot/agora/app/NotificationRelayService.java @@ -1,4 +1,4 @@ -package pub.ditto.app; +package spot.agora.app; import android.app.AlarmManager; import android.app.ForegroundServiceStartNotAllowedException; @@ -83,7 +83,7 @@ public class NotificationRelayService extends Service { // + REQ + up to 5 events + EOSE + metadata fetch + disconnect. private static final long FETCH_WAKELOCK_TIMEOUT_MS = 30_000; - private static final String ACTION_FETCH = "pub.ditto.app.ACTION_FETCH"; + private static final String ACTION_FETCH = "spot.agora.app.ACTION_FETCH"; // Backoff bounds for relay connect failures (separate from alarm interval). private static final long INITIAL_BACKOFF_MS = 1_000; diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index de9e93bf..062d0f92 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -2,6 +2,6 @@ Agora Agora - pub.agora.app - pub.agora.app + spot.agora.app + spot.agora.app diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 70eb5817..a7a255e7 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -5,6 +5,9 @@ project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/ include ':capacitor-app' project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') +include ':capacitor-barcode-scanner' +project(':capacitor-barcode-scanner').projectDir = new File('../node_modules/@capacitor/barcode-scanner/android') + include ':capacitor-filesystem' project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') diff --git a/capacitor.config.ts b/capacitor.config.ts index bc552296..414c0aca 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,7 +1,7 @@ import type { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { - appId: 'pub.agora.app', + appId: 'spot.agora.app', appName: 'Agora', webDir: 'dist', server: { diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index aca6d2a7..c08e453d 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -325,7 +325,7 @@ ); MARKETING_VERSION = 2.14.4; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = pub.agora.app; + PRODUCT_BUNDLE_IDENTIFIER = spot.agora.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; @@ -348,7 +348,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 2.8.0; - PRODUCT_BUNDLE_IDENTIFIER = pub.agora.app; + PRODUCT_BUNDLE_IDENTIFIER = spot.agora.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_VERSION = 5.0; diff --git a/ios/App/App/DittoNotificationPlugin.swift b/ios/App/App/DittoNotificationPlugin.swift index 40ce4855..2fc91d52 100644 --- a/ios/App/App/DittoNotificationPlugin.swift +++ b/ios/App/App/DittoNotificationPlugin.swift @@ -33,7 +33,7 @@ public class DittoNotificationPlugin: CAPPlugin, CAPBridgedPlugin { // MARK: - Constants - static let bgTaskIdentifier = "pub.ditto.app.notification-refresh" + static let bgTaskIdentifier = "spot.agora.app.notification-refresh" private static let prefsKey = "ditto_notification_config" // MARK: - Plugin Methods diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist index 2d0a48b3..c6f07b3b 100644 --- a/ios/App/App/Info.plist +++ b/ios/App/App/Info.plist @@ -61,7 +61,7 @@ BGTaskSchedulerPermittedIdentifiers - pub.agora.app.notification-refresh + spot.agora.app.notification-refresh diff --git a/ios/App/CapApp-SPM/Package.swift b/ios/App/CapApp-SPM/Package.swift index 2d76ea82..fe633de6 100644 --- a/ios/App/CapApp-SPM/Package.swift +++ b/ios/App/CapApp-SPM/Package.swift @@ -13,6 +13,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", exact: "8.2.0"), .package(name: "CapacitorApp", path: "../../../node_modules/@capacitor/app"), + .package(name: "CapacitorBarcodeScanner", path: "../../../node_modules/@capacitor/barcode-scanner"), .package(name: "CapacitorFilesystem", path: "../../../node_modules/@capacitor/filesystem"), .package(name: "CapacitorHaptics", path: "../../../node_modules/@capacitor/haptics"), .package(name: "CapacitorKeyboard", path: "../../../node_modules/@capacitor/keyboard"), @@ -28,6 +29,7 @@ let package = Package( .product(name: "Capacitor", package: "capacitor-swift-pm"), .product(name: "Cordova", package: "capacitor-swift-pm"), .product(name: "CapacitorApp", package: "CapacitorApp"), + .product(name: "CapacitorBarcodeScanner", package: "CapacitorBarcodeScanner"), .product(name: "CapacitorFilesystem", package: "CapacitorFilesystem"), .product(name: "CapacitorHaptics", package: "CapacitorHaptics"), .product(name: "CapacitorKeyboard", package: "CapacitorKeyboard"), diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile index 54d9ebee..c072fc46 100644 --- a/ios/fastlane/Appfile +++ b/ios/fastlane/Appfile @@ -1,2 +1,2 @@ -app_identifier("pub.ditto.app") +app_identifier("spot.agora.app") team_id("GZLTTH5DLM") diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index 22ccf2da..93be84ff 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -3,7 +3,7 @@ default_platform(:ios) platform :ios do # ─── Lanes ──────────────────────────────────────────────────────────── - desc "Build and sign the App Store IPA. Output at ../artifacts/Ditto.ipa." + desc "Build and sign the App Store IPA. Output at ../artifacts/Agora.ipa." lane :build_ipa do setup_lane_signing! build_release_ipa! @@ -19,7 +19,7 @@ platform :ios do submit_release_for_review!(ipa_path) end - desc "Build, sign, and submit Ditto to the App Store for review (single-step convenience)." + desc "Build, sign, and submit Agora to the App Store for review (single-step convenience)." lane :release do setup_lane_signing! build_release_ipa! @@ -83,7 +83,7 @@ platform :ios do configuration: "Release", export_method: "app-store", output_directory: "../artifacts", - output_name: "Ditto.ipa", + output_name: "Agora.ipa", clean: true, # Override the Xcode project's Automatic signing for this build only. # Match has already installed the AppStore cert + profile into the @@ -93,7 +93,7 @@ platform :ios do xcargs: [ "CODE_SIGN_STYLE=Manual", "CODE_SIGN_IDENTITY='Apple Distribution'", - "PROVISIONING_PROFILE_SPECIFIER='match AppStore pub.ditto.app'", + "PROVISIONING_PROFILE_SPECIFIER='match AppStore spot.agora.app'", "DEVELOPMENT_TEAM=GZLTTH5DLM", ].join(" "), export_options: { @@ -101,7 +101,7 @@ platform :ios do signingStyle: "manual", teamID: "GZLTTH5DLM", provisioningProfiles: { - "pub.ditto.app" => "match AppStore pub.ditto.app", + "spot.agora.app" => "match AppStore spot.agora.app", }, }, ) diff --git a/ios/fastlane/Matchfile b/ios/fastlane/Matchfile index c5cab67e..e2805416 100644 --- a/ios/fastlane/Matchfile +++ b/ios/fastlane/Matchfile @@ -1,5 +1,5 @@ git_url("https://gitlab.com/soapbox-pub/certificates.git") storage_mode("git") type("appstore") -app_identifier(["pub.ditto.app"]) +app_identifier(["spot.agora.app"]) team_id("GZLTTH5DLM") diff --git a/public/.well-known/apple-app-site-association b/public/.well-known/apple-app-site-association index c7f69b3f..7c464c8d 100644 --- a/public/.well-known/apple-app-site-association +++ b/public/.well-known/apple-app-site-association @@ -1,7 +1,7 @@ { "webcredentials": { "apps": [ - "GZLTTH5DLM.pub.agora.app" + "GZLTTH5DLM.spot.agora.app" ] } } diff --git a/public/.well-known/assetlinks.json b/public/.well-known/assetlinks.json index 048cb44d..001dc120 100644 --- a/public/.well-known/assetlinks.json +++ b/public/.well-known/assetlinks.json @@ -5,7 +5,7 @@ ], "target": { "namespace": "android_app", - "package_name": "pub.agora.app", + "package_name": "spot.agora.app", "sha256_cert_fingerprints": [ "7C:05:A8:5A:07:0F:84:AE:43:DE:85:67:A4:5F:7F:FB:42:0A:05:05:27:CE:B6:8C:DA:AF:A5:E0:12:E0:9E:71", "E5:B1:A9:13:C9:37:35:3C:A5:E7:27:89:C0:9D:3D:0D:A5:4F:F5:26:88:06:BD:24:46:21:AB:61:6B:CC:C5:E5" diff --git a/public/manifest.webmanifest b/public/manifest.webmanifest index 3396581c..469ffb5a 100644 --- a/public/manifest.webmanifest +++ b/public/manifest.webmanifest @@ -91,13 +91,8 @@ "related_applications": [ { "platform": "play", - "url": "https://play.google.com/store/apps/details?id=pub.ditto.app", - "id": "pub.ditto.app" - }, - { - "platform": "itunes", - "url": "https://apps.apple.com/us/app/ditto-fun-social-media/id6761851821", - "id": "6761851821" + "url": "https://play.google.com/store/apps/details?id=spot.agora.app", + "id": "spot.agora.app" } ], "prefer_related_applications": false diff --git a/scripts/extract-release-notes.mjs b/scripts/extract-release-notes.mjs index 4c034478..d6fe58d1 100755 --- a/scripts/extract-release-notes.mjs +++ b/scripts/extract-release-notes.mjs @@ -25,7 +25,7 @@ * node scripts/extract-release-notes.mjs [--summary] [--changelog ] * * --summary Print only the summary paragraph (no headings, no bullets). - * Falls back to "Ditto vX.Y.Z" if the section has no summary. + * Falls back to "Agora vX.Y.Z" if the section has no summary. * --changelog Path to the changelog file. Defaults to CHANGELOG.md. * * Exits 0 with the extracted text on stdout. Exits non-zero if the version is @@ -128,7 +128,7 @@ if (!section) { if (summary) { const text = extractSummary(section); - stdout.write(text ?? `Ditto v${version}`); + stdout.write(text ?? `Agora v${version}`); stdout.write('\n'); } else { const body = trimBlankEdges(section).join('\n'); @@ -136,6 +136,6 @@ if (summary) { stdout.write(body); stdout.write('\n'); } else { - stdout.write(`Ditto v${version}\n`); + stdout.write(`Agora v${version}\n`); } } diff --git a/src/lib/helpContent.ts b/src/lib/helpContent.ts index 69650e93..2b2efb92 100644 --- a/src/lib/helpContent.ts +++ b/src/lib/helpContent.ts @@ -121,7 +121,7 @@ const FAQ_TEMPLATE: FAQCategory[] = [ question: 'Can I download this on the App Store or Google Play?', answer: [ 'This site works as a web app right from your browser \u2014 no download needed! You can also "Add to Home Screen" on your phone to get an app-like experience.', - 'On Android, you can download {appName} from [Zap Store](https://zapstore.dev/apps/pub.agora.app), a community-driven app store for the Nostr ecosystem. iOS support is planned for the future \u2014 stay tuned!', + 'On Android, you can download {appName} from [Zap Store](https://zapstore.dev/apps/spot.agora.app), a community-driven app store for the Nostr ecosystem. iOS support is planned for the future \u2014 stay tuned!', ], }, { @@ -136,7 +136,7 @@ const FAQ_TEMPLATE: FAQCategory[] = [ id: 'nostr-app-store', question: 'Is there a Nostr-specific app store?', answer: [ - 'Yes! [Zap Store](https://zapstore.dev/) is a community-driven app store built specifically for the Nostr ecosystem. You can discover and download Nostr apps, and the apps are verified by the community rather than a corporation. {appName} is listed there \u2014 [get it on Zap Store](https://zapstore.dev/apps/pub.agora.app).', + 'Yes! [Zap Store](https://zapstore.dev/) is a community-driven app store built specifically for the Nostr ecosystem. You can discover and download Nostr apps, and the apps are verified by the community rather than a corporation. {appName} is listed there \u2014 [get it on Zap Store](https://zapstore.dev/apps/spot.agora.app).', 'You can also browse a directory of Nostr apps at [nostrapps.com](https://nostrapps.com/).', ], },