Commit Graph
46 Commits
Author SHA1 Message Date
herel e5c0a1183d feat: redesign EventCard with color border, type badge, leading icons
- 4dp colored border from event.color (fallback primary)
- AssistChip badge: Match (teal) vs Entraînement (slate)
- Opponent line only for games, 'Entraînement' for practices
- Place and Schedule icons leading info lines
- Condensed time range via formatEventTimeRange
2026-08-06 17:07:11 +02:00
herel 06d2eceba3 refactor: remove unused imports from SkeletonCard
- Remove Spacer, Alignment, Color imports flagged during review
2026-08-06 17:06:33 +02:00
herel a7e3b52ca6 feat: add EmptyState, ErrorState, and SkeletonCard shared components 2026-08-06 17:04:53 +02:00
herel cf24f9c0e3 feat: add groupEventsByDate helper for schedule date headers 2026-08-06 17:03:24 +02:00
herel b7af237002 feat: add teal arctique theme with full M3 color scheme, typography, shapes, spacing tokens
- Complete light/dark color schemes (all M3 slots)
- Typography scale (headlineLarge through labelMedium)
- Shape tokens (small 8dp, medium 12dp, large 16dp)
- Dimens spacing object (xs through xxl)
- Add material-icons-extended dependency
2026-08-06 16:21:07 +02:00
herel be6e9d733a docs: add UI redesign implementation plan (10 tasks)
Plan covers: theme foundation, date grouping helper (TDD), shared
components, EventCard/FilterChips/LoginScreen/ScheduleScreen/
EventDetailScreen redesigns, App.kt transitions, desktop branding.
2026-08-06 16:19:32 +02:00
herel d4f43de933 docs: add UI redesign design spec (teal arctique, moderne & épuré)
Spec for complete visual overhaul of MyIce KMP app:
- Teal arctique color scheme (full Material 3 slots, light/dark)
- Typography scale, shape tokens, spacing tokens (Dimens)
- 4 screens redesigned (Login, Schedule, EventDetail + navigation)
- New components: SkeletonCard, EmptyState, ErrorState, FilterChips
- EventCard rework: color border, type badge, leading icons
- Sticky date headers in schedule list
- French accents corrected, hardcoded colors removed
- Branded as 'MyIce' (dropped tech codename 'K')

Refs: brainstorming session 2026-08-06
2026-08-06 15:35:22 +02:00
herel efaa93d907 chore: add targets to makefile 2026-08-06 15:28:20 +02:00
herel 418a8978f2 ref: Rename package ch.parano.myice to ch.parano.myicek
Complete the MyIceK rename by updating the Kotlin package from ch.parano.myice to ch.parano.myicek across all source sets (androidMain, commonMain, desktopMain, iosMain, commonTest), the build.gradle.kts (namespace, applicationId, mainClass, desktop packageName) and the iOS Info.plist bundle URL name. The myice:// OAuth scheme is kept unchanged as it depends on the backend.

Also add pull-to-refresh to ScheduleScreen using Material 3 PullToRefreshBox, replacing the manual loading overlay.
2026-08-06 15:20:47 +02:00
herel a2d5a57aec feat(ui): Rename app from MyIce to MyIceK
Update the app display name in all user-visible locations:
Android manifest label, desktop window title, login screen,
and schedule screen top bar.

Refs #2
2026-08-06 13:49:35 +02:00
herel ea15c0423c feat(ui): Display staff in single card with aligned columns
Replace per-staff cards with a single card listing all staff. Each
line shows the name on the left and role in muted color on the right,
matching the players section style.
2026-08-06 11:39:50 +02:00
herel 3dc5890a7a feat(ui): Display players in single card with aligned columns
Replace per-player cards with a single card listing all players. Each
player shows on one line: number, name, position, and birth year in
muted color. Add Makefile with android and desktop targets.
2026-08-04 12:24:51 +02:00
herel fd8fcb9b4c fix(ui): Wire system back gesture to in-app navigation
Add PlatformBackHandler (expect/actual) to intercept the back gesture
on Android via BackHandler, and enable OnBackInvokedCallback in the
manifest so the swipe-back gesture triggers onBack instead of exiting
the app.

Fixes the back gesture exiting to home from the event detail screen.
2026-08-04 12:02:30 +02:00
herel 1e5c2fd864 chore: remove mention of myice_mobile 2026-08-04 11:15:05 +02:00
herel 9524bc93ca feat: show nice dates in events 2026-08-04 11:14:51 +02:00
herel a8905327f0 fix(ui): Show event dates in card view
The EventCard had a fixed 120dp height that clipped the date line.
Remove the height constraint so the card grows to fit all content,
and format ISO datetime strings into readable dd.MM.yyyy HH:mm format.
2026-08-04 09:57:47 +02:00
herel ed97b2a1f0 license: add GPL-3.0-or-later license
- Add full LICENSE file (GPL-3.0)
- Add SPDX headers to all 44 Kotlin source files
- Add SPDX headers to 3 iOS Swift/Info.plist files
- Update README.md and AGENTS.md with license info
2026-07-09 16:19:38 +02:00
herel 64ba5aea5d docs: add AGENTS.md with build commands, architecture, and conventions 2026-07-09 16:07:30 +02:00
herel de107a4295 docs: add README with project overview, build instructions, and architecture 2026-07-09 16:06:52 +02:00
herel 8c2de8b475 build: configure release signing for Android APK
Reads keystore credentials from keystore.properties (gitignored).
Keystore file (myice.keystore) is also gitignored.
2026-07-09 16:05:49 +02:00
herel 765fe51720 ui: make filter card collapsible with 2x2 grid layout
- Collapsed: compact row showing 'Filtres' + active filter count + expand arrow
- Expanded: 2x2 grid (Compte+Type, Age+Sous-groupe) halves vertical space
- Animated expand/collapse with AnimatedVisibility
- FilterDropdown now respects weight() modifier for row layout
2026-07-08 18:20:40 +02:00
herel c4bf05d728 feat: add app launcher icon from Flutter project 2026-07-08 18:16:33 +02:00
herel b291277d4f build: remove iosX64 target (unsupported by Compose MP 1.11.1) 2026-07-08 18:12:53 +02:00
herel cc4b0a1ecf fix: chunk large cached events to avoid Preferences 8KB limit on desktop
java.util.prefs.Preferences (desktop Settings backend) has an 8KB
per-value limit. Schedule JSON exceeds this. Now splits into 8000-char
chunks stored as cached_events_chunk_<account>_<i>, with a count key.
Maintains backward compat with old single-value format.
2026-07-08 18:12:19 +02:00
herel d93cae0816 fix: trigger loadAccounts() on auth and loadCachedSchedule() on account selection
The schedule screen was never loading data because no LaunchedEffect
called loadAccounts() when the user became authenticated. Now:
- App.kt: calls scheduleViewModel.loadAccounts() when authState becomes Authenticated
- ScheduleScreen.kt: calls loadCachedSchedule() when selectedAccount is set
2026-07-08 18:07:21 +02:00
herel b676c768fe fix: add back navigation from EventDetailScreen to Schedule 2026-07-08 18:02:14 +02:00
herel 28de93263b feat: wire up app root, navigation, and platform entry points
- Add App.kt root composable with state-based routing
  (Login -> Schedule -> EventDetail) driven by AuthViewModel.state
- Update MainActivity (Android), MainViewController (iOS), and
  Main.kt (Desktop) to host App() with their platform OAuthClient
- Add iOS Xcode source files (MyIceApp.swift, ContentView.swift)
  and Info.plist with myice:// URL scheme
- Delete Placeholder.kt
- Add kotlinx-coroutines-swing to desktopMain to provide
  Dispatchers.Main for viewModelScope (app crashed on desktop
  without it)
2026-07-08 18:00:57 +02:00
herel 88aa9de4ad fix: use French labels for refresh/logout buttons in ScheduleScreen 2026-07-08 17:56:01 +02:00
herel 38d420524a feat: add LoginScreen, ScheduleScreen, and EventDetailScreen
Add 3 Compose Multiplatform screens consuming Task 6 ViewModels and
Task 8 components:
- LoginScreen: MyIce title, login button, loading/error states
- ScheduleScreen: AppBar + filter card (4 dropdowns) + event list
  with loading/error/empty/refreshing states
- EventDetailScreen: AppBar + recap card + players/staff sections
  with amber empty-state card

Use TextButton for Refresh/Logout actions (material-icons-core not
available in this Compose Multiplatform setup). Guard setAccount call
against nullable onSelect callback.
2026-07-08 17:54:19 +02:00
herel 277517bf7e fix: make parseHexColor crash-safe, clean up imports in EventCard 2026-07-08 17:53:04 +02:00
herel af85605dd4 feat: add Material 3 theme and UI components (EventCard, FilterDropdown, LoadingIndicator) 2026-07-08 17:52:04 +02:00
herel 5aa264c2a7 fix: add Desktop OAuth timeout, restore iOS keyWindow filter 2026-07-08 17:51:27 +02:00
herel 00e7a7456f fix: address OAuth review findings (redirect_uri, binding, timeout, CRLF, DRY) 2026-07-08 17:46:40 +02:00
herel 5dc206ae72 feat: add platform OAuth implementations (Android, iOS, Desktop)
- AndroidOAuthClient: ACTION_VIEW + OAuthCallbackActivity (myice://callback)
- IosOAuthClient: ASWebAuthenticationSession with presentation context provider
- DesktopOAuthClient: local HTTP server + system browser
- AndroidManifest: register OAuthCallbackActivity intent filter
- Align Kotlin to 2.3.20 (required by Compose MP 1.11.1 klibs) and
  compileSdk to 36 (required by activity-compose 1.13.0); fix missing
  Text import and stray brace in placeholder iOS/Android entry points
2026-07-08 17:42:44 +02:00
herel 294aebd0b4 feat: add AuthViewModel, ScheduleViewModel, and EventDetailViewModel with StateFlow 2026-07-08 17:25:41 +02:00
herel bb13a12d00 feat: add event filtering logic, TypeFilter enum, AuthSettings, and OAuthClient interface 2026-07-08 17:16:01 +02:00
herel b61b6408f3 fix: bump kotlinx-datetime to 0.7.1, scope ExperimentalTime opt-in to saveEvents 2026-07-08 17:14:56 +02:00
herel 11c0a92421 feat: add ScheduleCache with multiplatform-settings for offline caching 2026-07-08 17:10:45 +02:00
herel b1661aaa4f feat: add Ktor networking layer with ApiService and auth token holder
Add ApiConfig, AuthTokenHolder singleton, expect/actual HttpClient
engine factories (CIO for Android/Desktop, Darwin for iOS), and
ApiService with four GET endpoints. Bearer token from AuthTokenHolder
is injected as Authorization header on each request.

Adjusted for Ktor 3.5.1: HttpClientEngineFactory lives in
io.ktor.client.engine; the timeout plugin is HttpTimeout (package
io.ktor.client.plugins), not HttpTimeoutPlugin. Tests wrap suspend
calls in runTest and assert request URLs without a trailing '?'.
2026-07-08 17:07:20 +02:00
herel a24297f821 feat: add serializable data models with FlexibleStringSerializer for number coercion 2026-07-08 17:02:31 +02:00
herel c931ec7143 fix: add missing Text import in desktop Main.kt
Task 1 scaffold omitted the material3 Text import, blocking desktop
compilation. Required to run common tests via desktopTest.
2026-07-08 17:02:29 +02:00
herel c1b9a60317 docs: update plan with corrected tooling versions 2026-07-08 16:59:32 +02:00
herel 9ee5b1c415 fix: correct tooling versions (Gradle 9.5.1, AGP 8.13.2) and add Kotlin Compose plugin
- AGP 2.1.3 doesn't exist; use 8.13.2 (latest stable 8.x)
- Gradle 9.6.1 incompatible with AGP 8.x; use 9.5.1
- Add org.jetbrains.kotlin.plugin.compose (required since Compose MP 1.6.10)
- Fix source set access (by getting) and iOS Darwin dependency injection
- Remove instrumentedTestVariant (KotlinSourceSetTree unresolved)
2026-07-08 16:59:26 +02:00
herel 15ae8cd046 feat: scaffold KMP project with Compose Multiplatform (Android, iOS, Desktop) 2026-07-08 16:53:13 +02:00
herel 3b6fae1b95 docs: add MyIce KMP implementation plan
10-task TDD plan covering: project scaffolding, data models, networking
(Ktor), caching, filtering logic, viewmodels, platform OAuth, UI theme
and components, screens, and app root with entry points for Android,
iOS, and Desktop.
2026-07-08 16:48:09 +02:00
herel 0098abd15b docs: add MyIce KMP app design spec
Design for porting the MyIce Flutter app to Kotlin Multiplatform
(Android + iOS + Desktop) using Compose Multiplatform. Mirrors the
3-screen structure (Login, Schedule, Event Detail) and 4 GET endpoints
with Bearer auth via Infomaniak OIDC. Adds a type filter to surface
practices alongside games.
2026-07-08 16:42:03 +02:00