Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
0beaeee
feat: implement Store architecture and dynamic Koin dependency resolver
Jayamvr007 Apr 11, 2026
6f0dc00
feat: implement feature stores utilizing KMP view models alongside Sw…
Jayamvr007 Apr 11, 2026
7c556b4
feat: build PokemonList view with pagination and search functionality…
Jayamvr007 Apr 11, 2026
2defb1e
feat: add PokemonDetail screen showcasing stats, abilities, and type-…
Jayamvr007 Apr 11, 2026
7631f0d
feat: tie in Favorites and NavigationStack within ContentView and iOS…
Jayamvr007 Apr 11, 2026
6a1a6f7
test: write comprehensive unit tests asserting initial store states a…
Jayamvr007 Apr 11, 2026
2dfab0f
ci: configure GitHub Actions workflow with build verification and Swi…
Jayamvr007 Apr 11, 2026
c9a2361
chore: bootstrap Xcode project using XcodeGen and CocoaPods
Jayamvr007 Apr 11, 2026
91d8b57
feat: configure design resources, colors, and AI prompt logs
Jayamvr007 Apr 11, 2026
1419f98
chore: add gradlew scripts for CI execution
Jayamvr007 Apr 11, 2026
81c8be6
fix: ensure resilient imageUrl fetching to resolve AsyncImage bug in …
Jayamvr007 Apr 12, 2026
c740a26
fix: strictly map AsyncImage to static PokeAPI root to bypass DTO str…
Jayamvr007 Apr 12, 2026
49f1c62
fix: implement AsyncImage retry mechanism to resolve SwiftUI inactive…
Jayamvr007 Apr 12, 2026
6f88425
ci: remove brew install swiftlint to prevent runner crash on pre-inst…
Jayamvr007 Apr 12, 2026
7eedd3d
ci: resolve gradle task ambiguity by explicitly targeting assembleSha…
Jayamvr007 Apr 12, 2026
161f8e6
ci: replace CocoaPods with XcodeGen to strictly bypass shared.podspec…
Jayamvr007 Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/ios.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: iOS CI

on:
push:
branches: [ "ios/**" ]
pull_request:
branches: [ main ]

jobs:
build:
runs-on: macos-15

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Build shared XCFramework
run: ./gradlew :shared:assembleSharedDebugXCFramework

- name: Generate Xcode Project via XcodeGen
working-directory: iosApp
run: |
brew install xcodegen
xcodegen generate

- name: Run SwiftLint
working-directory: iosApp
run: swiftlint lint || echo "Linting finished with warnings"

- name: Build iOS app (simulator)
working-directory: iosApp
run: |
xcodebuild build \
-project iosApp.xcodeproj \
-scheme iosApp \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 16' \
CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

- name: Run tests
working-directory: iosApp
run: |
xcodebuild test \
-project iosApp.xcodeproj \
-scheme iosApp \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 16'
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
131 changes: 131 additions & 0 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions iosApp/AI_PROMPTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## AI Prompts Log

### Prompt 1
> "Complete the PokéDex iOS assignment — build the SwiftUI iOS app integrating the shared KMP framework. Plan first, then implement all screens (List, Detail, Favourites) with proper StateFlow bridging, Koin integration, pagination, search, favourites persistence, animations, dark mode, and CI."

**Used:** Yes — used the overall architecture plan and file structure.
**Changed:** Refined the KoinHelper implementation after inspecting generated ObjC headers from the shared framework. Adjusted FlowCollector to match the actual Kotlin/Native interop API. Modified navigation pattern to pass repository instances directly instead of environment objects for simpler lifecycle management.

### Prompt 2
> (Follow-up implementation executed within the same conversation)

All code was generated in a single iterative session. The following manual refinements were applied:
- Verified shared framework API surface by reading all Kotlin source files
- Adapted sealed class pattern matching to use `onEnum(of:)` for KMP interop
- Fixed memory management with proper `[weak self]` captures and Task cancellation
- Ensured `onCleared()` is called on KMP ViewModels in Swift `deinit`
14 changes: 14 additions & 0 deletions iosApp/Podfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use_frameworks!
platform :ios, '16.0'

target 'iosApp' do
pod 'shared', :path => '../shared'
end

post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0'
end
end
end
Loading