diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml deleted file mode 100644 index 2b06373..0000000 --- a/.github/workflows/claude-code-review.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Claude Code Review - -on: - pull_request: - types: [opened, synchronize, ready_for_review, reopened] - # Optional: Only run on specific file changes - # paths: - # - "src/**/*.ts" - # - "src/**/*.tsx" - # - "src/**/*.js" - # - "src/**/*.jsx" - -jobs: - claude-review: - # Skip for bot PRs and fork PRs due to OIDC token limitations in pull_request_target - # Fork PRs fail because the actor in OIDC context is the fork contributor (read-only) - if: | - github.event.pull_request.draft == false && - github.event.pull_request.user.type != 'Bot' && - github.event.pull_request.head.repo.full_name == github.repository - - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - id: claude-review - uses: anthropics/claude-code-action@v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - plugin_marketplaces: "https://github.com/anthropics/claude-code.git" - plugins: "code-review@claude-code-plugins" - prompt: "/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}" - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options - track_progress: true - claude_args: | - --model 'claude-opus-4-6' - --allowedTools 'mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)' diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml deleted file mode 100644 index 08e2eba..0000000 --- a/.github/workflows/claude.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Claude Code - -on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - issues: - types: [opened, assigned] - pull_request_review: - types: [submitted] - -jobs: - claude: - if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - actions: read # Required for Claude to read CI results on PRs - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code - id: claude - uses: anthropics/claude-code-action@v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - - # This is an optional setting that allows Claude to read CI results on PRs - additional_permissions: | - actions: read - - # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. - # prompt: 'Update the pull request description to include a summary of changes.' - - # Optional: Add claude_args to customize behavior and configuration - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options - claude_args: "--model claude-opus-4-6" diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 0b6c29f..f422b3a 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -19,10 +19,10 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'push' steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Upload sources to Crowdin - uses: crowdin/github-action@v2 + uses: crowdin/github-action@v3 with: upload_sources: true upload_translations: false @@ -37,10 +37,10 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Download translations from Crowdin - uses: crowdin/github-action@v2 + uses: crowdin/github-action@v3 with: upload_sources: false upload_translations: false diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 18dbef1..94b7d79 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -30,23 +30,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to GHCR - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ vars.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -57,7 +57,7 @@ jobs: - name: Docker metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: | ${{ env.GHCR_IMAGE }} @@ -70,7 +70,7 @@ jobs: type=sha,prefix=sha- - name: Build and push - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/eas-build.yml b/.github/workflows/eas-build.yml index e4d170d..3dbbc05 100644 --- a/.github/workflows/eas-build.yml +++ b/.github/workflows/eas-build.yml @@ -30,16 +30,16 @@ jobs: name: EAS Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 - uses: oven-sh/setup-bun@v2 - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} diff --git a/.github/workflows/eas-submit.yml b/.github/workflows/eas-submit.yml index 4a18388..21b6827 100644 --- a/.github/workflows/eas-submit.yml +++ b/.github/workflows/eas-submit.yml @@ -17,16 +17,16 @@ jobs: name: EAS Submit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 22 - uses: oven-sh/setup-bun@v2 - name: Setup EAS - uses: expo/expo-github-action@v8 + uses: expo/expo-github-action@v9 with: eas-version: latest token: ${{ secrets.EXPO_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index de79f9a..5dd8361 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,10 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 24 @@ -43,6 +43,6 @@ jobs: run: bunx turbo run test -- --coverage - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 5341e15..389d7ae 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ node_modules # Build outputs dist build +.build *.tsbuildinfo .tanstack diff --git a/.oxlintrc.json b/.oxlintrc.json index 967e0ca..ab453a1 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,7 +1,6 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", "plugins": ["oxc", "eslint", "typescript", "react", "import", "unicorn", "vitest", "jsx-a11y"], - "jsPlugins": ["@e18e/eslint-plugin"], "env": { "builtin": true }, @@ -15,30 +14,27 @@ "react/style-prop-object": "off", "import/no-unassigned-import": "off", "import/no-named-as-default-member": "off", + "no-underscore-dangle": ["warn", { "allow": ["__APP_VERSION__", "__GIT_COMMIT_SHA__"] }], "oxc/no-barrel-file": ["warn", { "threshold": 0 }], "unicorn/no-array-sort": "off", "unicorn/consistent-function-scoping": "off", + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ], "no-new": "off", "no-await-in-loop": "off", "react/no-array-index-key": "off", "react/jsx-no-useless-fragment": "error", "react/rules-of-hooks": "error", - "e18e/prefer-array-at": "error", - "e18e/prefer-array-fill": "error", - "e18e/prefer-array-from-map": "error", - "e18e/prefer-array-some": "error", - "e18e/prefer-array-to-reversed": "error", - "e18e/prefer-array-to-sorted": "error", - "e18e/prefer-array-to-spliced": "error", - "e18e/prefer-date-now": "error", - "e18e/prefer-includes": "error", - "e18e/prefer-nullish-coalescing": "error", - "e18e/prefer-object-has-own": "error", - "e18e/prefer-regex-test": "error", - "e18e/prefer-spread-syntax": "off", - "e18e/prefer-static-regex": "error", - "e18e/prefer-timer-args": "error", - "e18e/prefer-url-canparse": "error" + "react/preserve-manual-memoization": "off", + "react/capitalized-calls": "off" }, "ignorePatterns": ["node_modules", "dist", "build", "docs", "**/routeTree.gen.ts"] } diff --git a/apps/native/app.json b/apps/native/app.json index c02d3ad..f4bd09e 100644 --- a/apps/native/app.json +++ b/apps/native/app.json @@ -10,6 +10,7 @@ "config": { "usesNonExemptEncryption": false }, + "deploymentTarget": "16.4", "icon": "./assets/images/sofa.icon", "bundleIdentifier": "com.jakejarvis.sofa", "appleTeamId": "B5ZWKBCUTU", @@ -65,14 +66,6 @@ "package": "com.jakejarvis.sofa" }, "plugins": [ - [ - "expo-build-properties", - { - "ios": { - "deploymentTarget": "16.2" - } - } - ], "expo-router", "expo-secure-store", [ @@ -177,7 +170,9 @@ "organization": "jarvis-0a", "project": "sofa-native" } - ] + ], + "expo-image", + "expo-status-bar" ], "experiments": { "typedRoutes": true, diff --git a/apps/native/package.json b/apps/native/package.json index 825ddda..f14d3ce 100644 --- a/apps/native/package.json +++ b/apps/native/package.json @@ -17,76 +17,70 @@ }, "dependencies": { "@better-auth/expo": "catalog:", - "@expo/metro-runtime": "55.0.6", - "@expo/ui": "55.0.5", - "@formatjs/intl-datetimeformat": "7.3.1", - "@formatjs/intl-getcanonicallocales": "3.2.2", - "@formatjs/intl-locale": "5.3.1", - "@formatjs/intl-numberformat": "9.3.1", - "@formatjs/intl-pluralrules": "6.3.1", - "@formatjs/intl-relativetimeformat": "12.3.1", + "@expo/material-symbols": "0.1.1", + "@expo/metro-runtime": "~57.0.16", + "@expo/ui": "~57.0.21", + "@formatjs/intl-datetimeformat": "7.8.0", + "@formatjs/intl-getcanonicallocales": "3.2.12", + "@formatjs/intl-locale": "5.3.12", + "@formatjs/intl-numberformat": "9.4.3", + "@formatjs/intl-pluralrules": "6.3.15", + "@formatjs/intl-relativetimeformat": "12.3.15", "@lingui/core": "catalog:", "@lingui/react": "catalog:", "@orpc/client": "catalog:", "@orpc/contract": "catalog:", "@orpc/tanstack-query": "catalog:", - "@react-native-menu/menu": "2.0.0", - "@react-navigation/elements": "2.9.11", - "@react-navigation/native": "7.1.34", - "@sentry/react-native": "8.6.0", + "@sentry/react-native": "~8.29.0", "@shopify/flash-list": "2.0.2", "@sofa/api": "workspace:*", "@sofa/i18n": "workspace:*", - "@tabler/icons-react-native": "3.40.0", - "@tanstack/query-async-storage-persister": "5.95.2", + "@tabler/icons-react-native": "3.48.0", + "@tanstack/query-async-storage-persister": "5.104.1", "@tanstack/react-form": "catalog:", "@tanstack/react-query": "catalog:", - "@tanstack/react-query-persist-client": "5.95.2", + "@tanstack/react-query-persist-client": "5.104.1", "better-auth": "catalog:", "burnt": "0.13.0", - "expo": "55.0.8", - "expo-application": "55.0.10", - "expo-build-properties": "55.0.10", - "expo-clipboard": "55.0.9", - "expo-constants": "55.0.9", - "expo-dev-client": "55.0.18", - "expo-device": "55.0.10", - "expo-font": "55.0.4", - "expo-glass-effect": "55.0.8", - "expo-haptics": "55.0.9", - "expo-image": "55.0.6", - "expo-image-picker": "55.0.13", - "expo-linear-gradient": "55.0.9", - "expo-linking": "55.0.8", - "expo-localization": "55.0.9", - "expo-network": "55.0.9", - "expo-router": "55.0.7", - "expo-secure-store": "55.0.9", - "expo-splash-screen": "55.0.12", - "expo-status-bar": "55.0.4", - "expo-system-ui": "55.0.10", - "expo-updates": "55.0.15", - "expo-web-browser": "55.0.10", - "expo-widgets": "55.0.7", - "posthog-react-native": "4.37.6", + "expo": "~57.0.26", + "expo-application": "~57.0.3", + "expo-clipboard": "~57.0.2", + "expo-constants": "~57.0.20", + "expo-dev-client": "~57.0.19", + "expo-device": "~57.0.2", + "expo-font": "~57.0.4", + "expo-glass-effect": "~57.0.4", + "expo-haptics": "~57.0.3", + "expo-image": "~57.0.5", + "expo-image-picker": "~57.0.20", + "expo-linear-gradient": "~57.0.2", + "expo-linking": "~57.0.11", + "expo-localization": "~57.0.2", + "expo-network": "~57.0.2", + "expo-router": "~57.0.24", + "expo-secure-store": "~57.0.4", + "expo-splash-screen": "~57.0.9", + "expo-status-bar": "~57.0.1", + "expo-system-ui": "~57.0.4", + "expo-updates": "~57.0.24", + "expo-web-browser": "~57.0.3", + "expo-widgets": "~57.0.22", + "posthog-react-native": "4.78.4", "react": "catalog:", "react-dom": "catalog:", - "react-native": "0.83.2", - "react-native-gesture-handler": "2.30.0", - "react-native-ios-context-menu": "3.2.0", - "react-native-ios-utilities": "5.2.0", - "react-native-keyboard-controller": "1.20.7", - "react-native-mmkv": "4.2.0", - "react-native-nitro-modules": "0.35.0", - "react-native-reanimated": "4.2.1", - "react-native-safe-area-context": "5.6.2", - "react-native-screens": "4.23.0", - "react-native-svg": "15.15.3", - "react-native-worklets": "0.7.2", + "react-native": "0.86.3", + "react-native-gesture-handler": "~2.32.0", + "react-native-keyboard-controller": "1.21.9", + "react-native-mmkv": "~4.3.2", + "react-native-nitro-modules": "~0.37.1", + "react-native-reanimated": "4.5.1", + "react-native-safe-area-context": "~5.7.0", + "react-native-screens": "~4.26.0", + "react-native-svg": "15.15.4", + "react-native-worklets": "0.10.1", "tailwind-merge": "catalog:", "tailwindcss": "catalog:", - "uniwind": "1.6.1", - "zeego": "3.0.6", + "uniwind": "1.12.1", "zod": "catalog:" }, "devDependencies": { @@ -95,5 +89,13 @@ "@types/node": "catalog:", "@types/react": "catalog:", "typescript": "catalog:" + }, + "expo": { + "install": { + "exclude": [ + "@sentry/react-native", + "typescript" + ] + } } } diff --git a/apps/native/src/app/(auth)/login.tsx b/apps/native/src/app/(auth)/login.tsx index c8f0a1f..3d9bdae 100644 --- a/apps/native/src/app/(auth)/login.tsx +++ b/apps/native/src/app/(auth)/login.tsx @@ -99,8 +99,8 @@ export default function LoginScreen() {