diff --git a/.github/workflows/build-submit-android.yml b/.github/workflows/build-submit-android.yml new file mode 100644 index 0000000000..051e951510 --- /dev/null +++ b/.github/workflows/build-submit-android.yml @@ -0,0 +1,61 @@ +--- +name: Build and Submit Android + +on: + workflow_dispatch: + inputs: + profile: + type: choice + description: Build profile to use + options: + - production + +jobs: + build: + name: Build and Submit Android + runs-on: ubuntu-latest + steps: + - name: Check for EXPO_TOKEN + run: > + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: ā¬ļø Checkout + uses: actions/checkout@v4 + + - name: š§ Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: yarn + + - name: šØ Setup EAS + uses: expo/expo-github-action@v8 + with: + expo-version: latest + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: āļø Setup EAS local builds + run: yarn global add eas-cli-local-build-plugin + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: āļø Install dependencies + run: yarn install + + - name: āļø Write environment variables + run: | + echo "${{ secrets.ENV_TOKEN }}" > .env + echo "${{ secrets.GOOGLE_SERVICES_TOKEN }}" > google-services.json + + - name: šļø EAS Build + run: yarn use-build-number eas build -p android --profile production --local --output build.aab --non-interactive + + - name: š Deploy + run: eas submit -p android --non-interactive --path build.aab diff --git a/.github/workflows/build-submit-ios.yml b/.github/workflows/build-submit-ios.yml new file mode 100644 index 0000000000..0fd691bb92 --- /dev/null +++ b/.github/workflows/build-submit-ios.yml @@ -0,0 +1,72 @@ +--- +name: Build and Submit iOS + +on: + schedule: + - cron: '0 5 * * *' + workflow_dispatch: + inputs: + profile: + type: choice + description: Build profile to use + options: + - production + +jobs: + build: + name: Build and Submit iOS + runs-on: macos-14 + steps: + - name: Check for EXPO_TOKEN + run: > + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - name: ā¬ļø Checkout + uses: actions/checkout@v4 + + - name: š§ Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: yarn + + - name: šØ Setup EAS + uses: expo/expo-github-action@v8 + with: + expo-version: latest + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: āļø Setup EAS local builds + run: yarn global add eas-cli-local-build-plugin + + - name: āļø Install dependencies + run: yarn install + + - name: āļø Setup Cocoapods + uses: maxim-lobanov/setup-cocoapods@v1 + with: + version: 1.14.3 + + - name: š¾ Cache Pods + uses: actions/cache@v3 + id: pods-cache + with: + path: ./ios/Pods + # We'll use the yarn.lock for our hash since we don't yet have a Podfile.lock. Pod versions will not + # change unless the yarn version changes as well. + key: ${{ runner.os }}-pods-${{ hashFiles('yarn.lock') }} + + - name: āļø Write environment variables + run: | + echo "${{ secrets.ENV_TOKEN }}" > .env + echo "${{ secrets.GOOGLE_SERVICES_TOKEN }}" > google-services.json + + - name: šļø EAS Build + run: yarn use-build-number eas build -p ios --profile production --local --output build.ipa --non-interactive + + - name: š Deploy + run: eas submit -p ios --non-interactive --path build.ipa diff --git a/.github/workflows/deploy-nightly-testflight.yml b/.github/workflows/deploy-nightly-testflight.yml deleted file mode 100644 index e3875899ee..0000000000 --- a/.github/workflows/deploy-nightly-testflight.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Deploy Nightly Testflight Release - -on: - schedule: - - cron: '0 5 * * *' - -jobs: - build: - name: Deploy Nightly Testflight Release - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Check for EXPO_TOKEN - run: | - if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then - echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" - exit 1 - fi - - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 18.x - cache: yarn - - - name: Setup EAS - uses: expo/expo-github-action@v8 - with: - eas-version: latest - token: ${{ secrets.EXPO_TOKEN }} - - - name: Install dependencies - run: yarn install - - - name: Bump build number - run: yarn bump:ios - - - name: EAS build and submit - run: eas build -p ios --profile production --auto-submit --non-interactive - - - name: Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Nightly iOS Build Bump - branch: main - commit_user_name: github-actions[bot] - commit_user_email: github-actions[bot]@users.noreply.github.com diff --git a/__e2e__/tests/create-account.test.ts b/__e2e__/tests/create-account.test.ts index a6724e8e45..9c56c914ea 100644 --- a/__e2e__/tests/create-account.test.ts +++ b/__e2e__/tests/create-account.test.ts @@ -18,9 +18,10 @@ describe('Create account', () => { await device.takeScreenshot('1- opened create account screen') await element(by.id('selectServiceButton')).tap() await device.takeScreenshot('2- selected other server') + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() await device.takeScreenshot('3- input test server URL') await element(by.id('emailInput')).typeText('example@test.com') await element(by.id('passwordInput')).typeText('hunter2') @@ -33,12 +34,6 @@ describe('Create account', () => { await element(by.id('nextBtn')).tap() - await expect(element(by.id('welcomeOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('homeScreen'))).toBeVisible() + await expect(element(by.id('onboardingInterests'))).toBeVisible() }) }) diff --git a/__e2e__/tests/home-screen.test.ts b/__e2e__/tests/home-screen.test.ts index 79fca1e6a5..ce7f1643bd 100644 --- a/__e2e__/tests/home-screen.test.ts +++ b/__e2e__/tests/home-screen.test.ts @@ -36,7 +36,7 @@ describe('Home screen', () => { const carlaPosts = by.id('feedItem-by-carla.test') await expect( element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('likeBtn').withAncestor(carlaPosts)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0), @@ -44,14 +44,14 @@ describe('Home screen', () => { await element(by.id('likeBtn').withAncestor(carlaPosts)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can repost posts', async () => { const carlaPosts = by.id('feedItem-by-carla.test') await expect( element(by.id('repostCount').withAncestor(carlaPosts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('repostBtn').withAncestor(carlaPosts)).atIndex(0).tap() await expect(element(by.id('repostModal'))).toBeVisible() await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap() @@ -65,7 +65,7 @@ describe('Home screen', () => { await expect(element(by.id('repostModal'))).not.toBeVisible() await expect( element(by.id('repostCount').withAncestor(carlaPosts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can report posts', async () => { diff --git a/__e2e__/tests/invite-codes.test.ts b/__e2e__/tests/invite-codes.test.ts index 7ab5b1477b..7eb8d9a3e1 100644 --- a/__e2e__/tests/invite-codes.test.ts +++ b/__e2e__/tests/invite-codes.test.ts @@ -28,9 +28,10 @@ describe('invite-codes', () => { await device.takeScreenshot('1- opened create account screen') await element(by.id('selectServiceButton')).tap() await device.takeScreenshot('2- selected other server') + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() await device.takeScreenshot('3- input test server URL') await element(by.id('inviteCodeInput')).typeText(inviteCode) await element(by.id('emailInput')).typeText('example@test.com') @@ -40,12 +41,6 @@ describe('invite-codes', () => { await element(by.id('handleInput')).typeText('e2e-test') await device.takeScreenshot('4- entered handle') await element(by.id('nextBtn')).tap() - await expect(element(by.id('welcomeOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('homeScreen'))).toBeVisible() + await expect(element(by.id('onboardingInterests'))).toBeVisible() }) }) diff --git a/__e2e__/tests/invites-and-text-verification.test.ts b/__e2e__/tests/invites-and-text-verification.test.ts index 850ca6d5c7..863b31107b 100644 --- a/__e2e__/tests/invites-and-text-verification.test.ts +++ b/__e2e__/tests/invites-and-text-verification.test.ts @@ -28,16 +28,17 @@ describe('invite-codes', () => { await device.takeScreenshot('1- opened create account screen') await element(by.id('selectServiceButton')).tap() await device.takeScreenshot('2- selected other server') + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() await device.takeScreenshot('3- input test server URL') await element(by.id('inviteCodeInput')).typeText(inviteCode) await element(by.id('emailInput')).typeText('example@test.com') await element(by.id('passwordInput')).typeText('hunter2') await device.takeScreenshot('4- entered account details') await element(by.id('nextBtn')).tap() - await element(by.id('phoneInput')).typeText('5558675309') + await element(by.id('phoneInput')).typeText('2345551234') await element(by.id('requestCodeBtn')).tap() await device.takeScreenshot('5- requested code') await element(by.id('codeInput')).typeText('000000') @@ -46,12 +47,6 @@ describe('invite-codes', () => { await element(by.id('handleInput')).typeText('e2e-test') await device.takeScreenshot('7- entered handle') await element(by.id('nextBtn')).tap() - await expect(element(by.id('welcomeOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('homeScreen'))).toBeVisible() + await expect(element(by.id('onboardingInterests'))).toBeVisible() }) }) diff --git a/__e2e__/tests/mod-lists.test.ts b/__e2e__/tests/mod-lists.test.ts index 5280920b4b..c3d4149e09 100644 --- a/__e2e__/tests/mod-lists.test.ts +++ b/__e2e__/tests/mod-lists.test.ts @@ -2,7 +2,7 @@ import {describe, beforeAll, it} from '@jest/globals' import {expect} from 'detox' -import {openApp, loginAsAlice, loginAsBob, createServer, sleep} from '../util' +import {openApp, loginAsAlice, loginAsBob, createServer} from '../util' describe('Mod lists', () => { beforeAll(async () => { @@ -62,38 +62,39 @@ describe('Mod lists', () => { .withTimeout(5000) }) - it('Set avi via the edit modlist modal', async () => { - await expect(element(by.id('userAvatarFallback'))).toExist() - await element(by.id('headerDropdownBtn')).tap() - await element(by.text('Edit list details')).tap() - await expect(element(by.id('createOrEditListModal'))).toBeVisible() - await element(by.id('changeAvatarBtn')).tap() - await element(by.text('Library')).tap() - await sleep(3e3) - await element(by.id('saveBtn')).tap() - await expect(element(by.id('createOrEditListModal'))).not.toBeVisible() - await expect(element(by.id('userAvatarImage'))).toExist() - // have to wait for the toast to clear - await waitFor(element(by.id('headerDropdownBtn'))) - .toBeVisible() - .withTimeout(5000) - }) + // DISABLED e2e environment is real finicky about avatar uploads -prf + // it('Set avi via the edit modlist modal', async () => { + // await expect(element(by.id('userAvatarFallback'))).toExist() + // await element(by.id('headerDropdownBtn')).tap() + // await element(by.text('Edit list details')).tap() + // await expect(element(by.id('createOrEditListModal'))).toBeVisible() + // await element(by.id('changeAvatarBtn')).tap() + // await element(by.text('Library')).tap() + // await sleep(3e3) + // await element(by.id('saveBtn')).tap() + // await expect(element(by.id('createOrEditListModal'))).not.toBeVisible() + // await expect(element(by.id('userAvatarImage'))).toExist() + // // have to wait for the toast to clear + // await waitFor(element(by.id('headerDropdownBtn'))) + // .toBeVisible() + // .withTimeout(5000) + // }) - it('Remove avi via the edit modlist modal', async () => { - await expect(element(by.id('userAvatarImage'))).toExist() - await element(by.id('headerDropdownBtn')).tap() - await element(by.text('Edit list details')).tap() - await expect(element(by.id('createOrEditListModal'))).toBeVisible() - await element(by.id('changeAvatarBtn')).tap() - await element(by.text('Remove')).tap() - await element(by.id('saveBtn')).tap() - await expect(element(by.id('createOrEditListModal'))).not.toBeVisible() - await expect(element(by.id('userAvatarFallback'))).toExist() - // have to wait for the toast to clear - await waitFor(element(by.id('headerDropdownBtn'))) - .toBeVisible() - .withTimeout(5000) - }) + // it('Remove avi via the edit modlist modal', async () => { + // await expect(element(by.id('userAvatarImage'))).toExist() + // await element(by.id('headerDropdownBtn')).tap() + // await element(by.text('Edit list details')).tap() + // await expect(element(by.id('createOrEditListModal'))).toBeVisible() + // await element(by.id('changeAvatarBtn')).tap() + // await element(by.text('Remove')).tap() + // await element(by.id('saveBtn')).tap() + // await expect(element(by.id('createOrEditListModal'))).not.toBeVisible() + // await expect(element(by.id('userAvatarFallback'))).toExist() + // // have to wait for the toast to clear + // await waitFor(element(by.id('headerDropdownBtn'))) + // .toBeVisible() + // .withTimeout(5000) + // }) it('Delete the modlist', async () => { await element(by.id('headerDropdownBtn')).tap() diff --git a/__e2e__/tests/profile-screen.test.ts b/__e2e__/tests/profile-screen.test.ts index b4624e4567..7ff43642f9 100644 --- a/__e2e__/tests/profile-screen.test.ts +++ b/__e2e__/tests/profile-screen.test.ts @@ -147,7 +147,7 @@ describe('Profile screen', () => { const posts = by.id('feedItem-by-bob.test') await expect( element(by.id('likeCount').withAncestor(posts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('likeBtn').withAncestor(posts)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(posts)).atIndex(0), @@ -155,14 +155,14 @@ describe('Profile screen', () => { await element(by.id('likeBtn').withAncestor(posts)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(posts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can repost posts', async () => { const posts = by.id('feedItem-by-bob.test') await expect( element(by.id('repostCount').withAncestor(posts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('repostBtn').withAncestor(posts)).atIndex(0).tap() await expect(element(by.id('repostModal'))).toBeVisible() await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap() @@ -176,7 +176,7 @@ describe('Profile screen', () => { await expect(element(by.id('repostModal'))).not.toBeVisible() await expect( element(by.id('repostCount').withAncestor(posts)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can report posts', async () => { diff --git a/__e2e__/tests/self-labeling.test.ts b/__e2e__/tests/self-labeling.test.ts index f629f91a8d..bba8ed484c 100644 --- a/__e2e__/tests/self-labeling.test.ts +++ b/__e2e__/tests/self-labeling.test.ts @@ -28,6 +28,7 @@ describe('Self-labeling', () => { await element(by.id('composerPublishBtn')).tap() await expect(element(by.id('composeFAB'))).toBeVisible() const posts = by.id('feedItem-by-alice.test') + await element(by.id('e2eRefreshHome')).tap() await expect( element(by.id('contentHider-embed').withAncestor(posts)).atIndex(0), ).toExist() diff --git a/__e2e__/tests/text-verification.test.ts b/__e2e__/tests/text-verification.test.ts index 3c556c2390..79b14aecaa 100644 --- a/__e2e__/tests/text-verification.test.ts +++ b/__e2e__/tests/text-verification.test.ts @@ -18,9 +18,10 @@ describe('Create account', () => { await device.takeScreenshot('1- opened create account screen') await element(by.id('selectServiceButton')).tap() await device.takeScreenshot('2- selected other server') + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() await device.takeScreenshot('3- input test server URL') await element(by.id('emailInput')).typeText('text-verification@test.com') await element(by.id('passwordInput')).typeText('hunter2') @@ -40,13 +41,7 @@ describe('Create account', () => { await element(by.id('nextBtn')).tap() - await expect(element(by.id('welcomeOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible() - await element(by.id('continueBtn')).tap() - await expect(element(by.id('homeScreen'))).toBeVisible() + await expect(element(by.id('onboardingInterests'))).toBeVisible() }) it('failed text verification correctly goes back to the code input screen', async () => { @@ -57,9 +52,10 @@ describe('Create account', () => { await device.takeScreenshot('1- opened create account screen') await element(by.id('selectServiceButton')).tap() await device.takeScreenshot('2- selected other server') + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() await device.takeScreenshot('3- input test server URL') await element(by.id('emailInput')).typeText('text-verification2@test.com') await element(by.id('passwordInput')).typeText('hunter2') diff --git a/__e2e__/tests/thread-screen.test.ts b/__e2e__/tests/thread-screen.test.ts index e3cff12c9f..646c828fd3 100644 --- a/__e2e__/tests/thread-screen.test.ts +++ b/__e2e__/tests/thread-screen.test.ts @@ -49,7 +49,7 @@ describe('Thread screen', () => { const post = by.id('postThreadItem-by-carla.test') await expect( element(by.id('likeCount').withAncestor(post)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(post)).atIndex(0), @@ -57,7 +57,7 @@ describe('Thread screen', () => { await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap() await expect( element(by.id('likeCount').withAncestor(post)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can repost the root post', async () => { @@ -85,7 +85,7 @@ describe('Thread screen', () => { const post = by.id('postThreadItem-by-carla.test') await expect( element(by.id('repostCount').withAncestor(post)).atIndex(0), - ).toHaveText('0') + ).not.toExist() await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap() await expect(element(by.id('repostModal'))).toBeVisible() await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap() @@ -99,7 +99,7 @@ describe('Thread screen', () => { await expect(element(by.id('repostModal'))).not.toBeVisible() await expect( element(by.id('repostCount').withAncestor(post)).atIndex(0), - ).toHaveText('0') + ).not.toExist() }) it('Can report the root post', async () => { diff --git a/__e2e__/util.ts b/__e2e__/util.ts index 8c47406c07..a7869a2e1d 100644 --- a/__e2e__/util.ts +++ b/__e2e__/util.ts @@ -56,9 +56,10 @@ export async function login( if (takeScreenshots) { await device.takeScreenshot('2- opened service selector') } + await element(by.id('customSelectBtn')).tap() await element(by.id('customServerTextInput')).typeText(service) await element(by.id('customServerTextInput')).tapReturnKey() - await element(by.id('customServerSelectBtn')).tap() + await element(by.id('doneBtn')).tap() if (takeScreenshots) { await device.takeScreenshot('3- input custom service') } diff --git a/app.config.js b/app.config.js index 701ca7fb79..e710420b09 100644 --- a/app.config.js +++ b/app.config.js @@ -11,24 +11,12 @@ const DARK_SPLASH_CONFIG = { resizeMode: 'cover', } -module.exports = function () { +module.exports = function (config) { /** * App version number. Should be incremented as part of a release cycle. */ const VERSION = pkg.version - /** - * iOS build number. Must be incremented for each TestFlight version. - * WARNING: Always leave this variable on line 24! If it is moved, you need to update ./scripts/bumpIosBuildNumber.sh - */ - const IOS_BUILD_NUMBER = '3' - - /** - * Android build number. Must be incremented for each release. - * WARNING: Always leave this variable on line 30! If it is moved, you need to update ./scripts/bumpAndroidBuildNumber.sh - */ - const ANDROID_VERSION_CODE = 61 - /** * Uses built-in Expo env vars * @@ -36,11 +24,10 @@ module.exports = function () { */ const PLATFORM = process.env.EAS_BUILD_PLATFORM - /** - * Additional granularity for the `dist` field - */ const DIST_BUILD_NUMBER = - PLATFORM === 'android' ? ANDROID_VERSION_CODE : IOS_BUILD_NUMBER + PLATFORM === 'android' + ? process.env.BSKY_ANDROID_VERSION_CODE + : process.env.BSKY_IOS_BUILD_NUMBER return { expo: { @@ -57,7 +44,6 @@ module.exports = function () { userInterfaceStyle: 'automatic', splash: SPLASH_CONFIG, ios: { - buildNumber: IOS_BUILD_NUMBER, supportsTablet: false, bundleIdentifier: 'xyz.blueskyweb.app', config: { @@ -85,7 +71,6 @@ module.exports = function () { backgroundColor: '#ffffff', }, android: { - versionCode: ANDROID_VERSION_CODE, icon: './assets/icon.png', adaptiveIcon: { foregroundImage: './assets/icon-android-foreground.png', diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 7ac62222ec..4b1a824935 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -191,7 +191,7 @@ func serve(cctx *cli.Context) error { e.GET("/settings", server.WebGeneric) e.GET("/settings/language", server.WebGeneric) e.GET("/settings/app-passwords", server.WebGeneric) - e.GET("/settings/home-feed", server.WebGeneric) + e.GET("/settings/following-feed", server.WebGeneric) e.GET("/settings/saved-feeds", server.WebGeneric) e.GET("/settings/threads", server.WebGeneric) e.GET("/settings/external-embeds", server.WebGeneric) diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html index 7513d6fd27..e29e4032bb 100644 --- a/bskyweb/templates/base.html +++ b/bskyweb/templates/base.html @@ -4,6 +4,11 @@ + + +
+
+
A basic dialog
+