Commit Graph
100 Commits
Author SHA1 Message Date
makiolajandClaude Opus 4.6 1fbd9bc609 fix: inject db context for /s/* short share URL route
CI / ci (push) Successful in 1m22s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
The /s/:token route was registered outside the /api/* db middleware
scope, causing db to be undefined and a 500 error on share link access.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:01:48 +02:00
makiolajandClaude Opus 4.6 e21e1ec523 fix: allow visibility-only setup updates without name
CI / ci (push) Successful in 1m24s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
updateSetupSchema required name as mandatory, causing ZodError when
ShareModal sent visibility-only updates. Made name optional in update
schema and guarded against setting undefined name in service layer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:43:10 +02:00
makiolajandClaude Opus 4.6 8d7a668da4 fix: resolve lint errors from phase 32/33/34 execution
CI / ci (push) Successful in 1m23s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m20s
Auto-fixed formatting issues and removed unused imports introduced
by background execution agents across currency, i18n, and sharing code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:32:32 +02:00
makiolaj ceee6c0f13 docs(phase-34): complete i18n foundation phase execution
CI / ci (push) Failing after 11s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-13 18:24:22 +02:00
makiolaj 5e731b436b feat(i18n): add German translations and key parity test
- Create all 6 German namespace JSON files (common, collection, threads, setups, onboarding, settings)
- Register German locale in i18n configuration with supportedLngs
- Add key parity test ensuring en/de have identical key structures
- All 19 locale parity tests pass, all 15 formatter tests pass

Phase 34, Plan 05
2026-04-13 18:23:45 +02:00
makiolaj 46715cc793 feat(i18n): add language picker to settings and sync i18n with persisted preference
- Add language picker (English/Deutsch) to settings page using pill-toggle pattern
- Import useLanguage hook and i18n instance in settings
- Language change persists via updateSetting and calls i18n.changeLanguage
- Add useEffect in RootLayout to sync i18n language with DB setting on load
- Language labels use native names (English, Deutsch) for identification

Phase 34, Plan 04
2026-04-13 18:21:30 +02:00
makiolaj f759dd0fde feat(i18n): locale-aware formatters and useLanguage hook
- Create useLanguage() hook following useCurrency/useWeightUnit pattern
- Update formatPrice() to use Intl.NumberFormat for locale-aware currency display
- Update formatWeight() to use Intl.NumberFormat for locale-aware number formatting
- Update formatDualPrice() to pass locale through
- Update useFormatters() to pass locale to all formatters
- Add formatter tests for en/de locales (15 tests passing)

Phase 34, Plan 03
2026-04-13 18:20:23 +02:00
makiolaj 672b17fd13 feat(i18n): extract strings from navigation, dialogs, onboarding, settings, and login
- Add useTranslation() to TopNav, BottomTabBar, FabMenu, UserMenu
- Internationalize ConfirmDialog, AuthPromptModal, ExternalLinkDialog
- Extract all onboarding flow strings (Welcome, HobbyPicker, ItemBrowser, Review, Done)
- Internationalize settings page (weight unit, currency, API keys, import/export)
- Internationalize login page and root error boundary
- All dialogs in __root.tsx use t() for UI chrome

Phase 34, Plan 02 (core navigation and global UI)
2026-04-13 18:19:29 +02:00
makiolaj 8c0fb31df2 feat(i18n): install react-i18next, create English locale files, and initialize i18n framework
- Install i18next, react-i18next, i18next-browser-languagedetector
- Create 6 namespace JSON files (common, collection, threads, setups, onboarding, settings)
- Initialize i18n with language detection (localStorage + navigator)
- Wire i18n import in main.tsx before React rendering

Phase 34, Plan 01
2026-04-13 18:13:55 +02:00
makiolajandClaude Opus 4.6 de82eefa74 docs(phase-33): complete phase execution
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:10:47 +02:00
makiolaj 24304aa8aa docs(34): create phase plans for i18n foundation 2026-04-13 18:10:36 +02:00
makiolajandClaude Opus 4.6 e2127ebb84 docs(33): add summaries for plans 05 and 06 (wave 3 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:10:24 +02:00
makiolajandClaude Opus 4.6 37edd0edfd feat(33-06): add market prices section to catalog detail page
- Add useGlobalItemPrices and useGlobalItemCommunityStats hooks
- Add MarketPricesSection component with user's market MSRP prominent
- Show community price stats per market with median and report count
- Collapsible "Other Markets" section (collapsed by default)
- Import useCurrency, useExchangeRates, formatPrice for market display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:09:56 +02:00
makiolajandClaude Opus 4.6 02fcae12f0 feat(33-05): market/currency selector, dual price format, conversion toggle
- Add formatDualPrice() with ~prefix for approximate conversions (D-14)
- Evolve useCurrency() to return CurrencyContext with currency, market, showConversions
- Create useExchangeRates hook + convertClientPrice utility
- Redesign settings: Market & Currency selector, Show Converted Prices toggle
- Add locale-based auto-suggestion banner for first-time currency selection (D-13)
- Update useFormatters to destructure from new CurrencyContext

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:08:53 +02:00
makiolajandClaude Opus 4.6 d0bbf48bb5 docs(33): add summaries for plans 03 and 04 (wave 2 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:07:16 +02:00
makiolajandClaude Opus 4.6 3df9eece83 feat(33-04): add community price service, API routes, and setup currency metadata
- Create community-price.service.ts with ownership validation, upsert, median aggregation
- Create community-prices route (GET stats public, POST requires auth + ownership)
- Register community-prices route with public GET access
- Add priceCurrency to both getSetupWithItems and getSetupWithItemsById
- Aggregation uses PERCENTILE_CONT(0.5) with 3-report minimum threshold

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:06:48 +02:00
makiolajandClaude Opus 4.6 7d6c548811 docs: add phase 32 decisions to STATE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:54 +02:00
makiolajandClaude Opus 4.6 52dce7b72b feat(33-03): add market prices API, exchange rates endpoint, currency context
- Create market-price.service.ts with getMarketPrices, upsertMarketPrice
- Create exchange-rates route (GET /api/exchange-rates, public)
- Create market-prices route (GET/POST /api/market-prices/global-items/:id/prices)
- Register new routes in server index with public GET access
- Add priceCurrency to item service getAllItems/getItemById/createItem
- Add foundPriceCents/Currency/Date to thread candidate select and create/update

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:24 +02:00
makiolajandClaude Opus 4.6 7eb5335a88 docs: add phase 32 plan summaries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:24 +02:00
makiolajandClaude Opus 4.6 0b46eff243 feat: add shared setup viewer with token detection and read-only mode
Detect ?share=token query param on setup detail page, fetch via
/api/shared/:token, and display read-only view with "Shared setup"
banner. Hide all owner controls (add items, share, delete, classification)
in shared view. Show "Link not available" error for invalid tokens.

Plan: 32-04 (Setup Sharing System - Shared Setup Viewer)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:04:41 +02:00
makiolaj a531581623 docs(34): add research and validation strategy 2026-04-13 18:03:57 +02:00
makiolajandClaude Opus 4.6 f8ab69684a docs(33): add summaries for plans 01 and 02 (wave 1 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:57 +02:00
makiolajandClaude Opus 4.6 7003e998f9 feat: add share modal with visibility picker and link management
Create ShareModal component with three-tier visibility picker
(private/link/public), share link creation with configurable expiration,
clipboard copy, and link revocation. Wire into setup detail page
replacing the static visibility badge with an interactive share button.

Plan: 32-03 (Setup Sharing System - Share Modal UI)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:41 +02:00
makiolajandClaude Opus 4.6 e10f0eda3d feat(33-02): generate migration for market_prices, community_prices tables
- CREATE TABLE market_prices with unique(global_item_id, market, currency)
- CREATE TABLE community_prices with unique(global_item_id, user_id, source_type)
- ALTER TABLE items ADD COLUMN price_currency
- ALTER TABLE thread_candidates ADD COLUMN found_price_cents, found_price_currency, found_price_date
- Note: db:push requires running PostgreSQL — apply on deployment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:40 +02:00
makiolajandClaude Opus 4.6 50bc11c7ed feat(33-01): add currency conversion service with exchange rate caching
- Create currency.service.ts with frankfurter.app ECB rate fetching
- 24h in-memory cache with stale-serve fallback on fetch failure
- convertPrice() handles EUR-base cross-currency conversion
- CURRENCY_MARKET_MAP maps currencies to market regions
- 12 unit tests covering conversion, rounding, unknowns, and mapping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:06 +02:00
makiolajandClaude Opus 4.6 298fa6d586 feat(33-01): add market_prices, community_prices tables and currency columns
- Add marketPrices table with unique(globalItemId, market, currency) constraint
- Add communityPrices table with unique(globalItemId, userId, sourceType) constraint
- Add priceCurrency column to items table (default EUR)
- Add foundPriceCents, foundPriceCurrency, foundPriceDate to threadCandidates
- Add Zod schemas for market price upsert and community price submission
- Export new types from shared/types.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:00 +02:00
makiolaj 1d15d4b336 docs(state): record phase 34 context session 2026-04-13 18:00:10 +02:00
makiolaj 1992778ce6 docs(34): capture phase context 2026-04-13 18:00:10 +02:00
makiolajandClaude Opus 4.6 da159d10b8 feat: add share link service, API routes, and short URL redirect
Create share.service.ts with token generation (128-bit base64url),
CRUD operations, validation, and visibility transition side effects.
Add share endpoints under /api/setups/:id/shares, shared access at
/api/shared/:token, and /s/:token short URL redirect.

Plan: 32-02 (Setup Sharing System - Share Link Backend)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:59:39 +02:00
makiolajandClaude Opus 4.6 7a696f39a5 docs(33): create phase plans for currency system
6 plans across 3 waves covering market-aware pricing, exchange rates,
community price data, and currency-normalized display.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:58:37 +02:00
makiolajandClaude Opus 4.6 edc9793c2d feat: migrate setup visibility from boolean to three-tier system
Replace isPublic boolean with visibility enum (private/link/public) across
the full stack. Add shares table to schema for future share link support.
Update all services, routes, schemas, hooks, components, and tests.

Plan: 32-01 (Setup Sharing System - Schema Migration)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:55:46 +02:00
makiolajandClaude Opus 4.6 727abf1528 docs(33): add research, validation strategy, and UI design contract
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:52:18 +02:00
makiolaj d928634e57 docs(state): record phase 33 context session 2026-04-13 17:45:50 +02:00
makiolaj 634ac298d1 docs(33): capture phase context 2026-04-13 17:45:45 +02:00
makiolajandClaude Opus 4.6 338a78122d docs(32): fix wave assignment — Plan 04 bumped to wave 4
Plans 03 and 04 both modify setups/$setupId.tsx. Per wave assignment
rules, file overlap requires sequential execution. Plan 04 now depends
on Plan 03 and runs in Wave 4.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:06:39 +02:00
makiolajandClaude Opus 4.6 81a654085d docs(32): create phase plans for setup sharing system
4 plans in 3 waves:
- Wave 1: Schema migration (isPublic→visibility) + shares table
- Wave 2: Share link service + API routes
- Wave 3: Share modal UI + shared setup viewer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:05:36 +02:00
makiolajandClaude Opus 4.6 9965e356de docs(32): add research and validation strategy for setup sharing system
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:59:54 +02:00
makiolaj cb0c1e8c9a docs(32): UI design contract 2026-04-13 16:59:25 +02:00
makiolaj 49c59fded9 docs(state): record phase 32 context session 2026-04-13 16:51:32 +02:00
makiolaj 6833b90795 docs(32): capture phase context 2026-04-13 16:51:23 +02:00
makiolajandClaude Opus 4.6 2853477a75 chore: archive v2.2 User Experience Polish milestone
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Phases 28-31 archived to milestones/v2.2-phases/
Requirements and roadmap snapshots archived to milestones/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:00:35 +02:00
makiolaj 92b84d2cd6 docs: capture todo - Auth prompt sign-in should redirect directly to Logto 2026-04-13 15:53:07 +02:00
makiolajandClaude Opus 4.6 ebf031a62c fix: cap onboarding to 5 categories with 4 items each
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:23:10 +02:00
makiolajandClaude Opus 4.6 03e0fe99fa feat: group onboarding items by category
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:19:02 +02:00
makiolajandClaude Opus 4.6 adbc13eb15 fix: SelectableItemCard used wrong formatter names, globalItems imageFilename→imageUrl
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:13:23 +02:00
makiolajandClaude Opus 4.6 2beabe88f9 fix: popular-items query referenced non-existent imageFilename on globalItems
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 16s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:07:38 +02:00
makiolajandClaude Opus 4.6 29f925027c chore: one-liner fixing script for docker exec
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:58:19 +02:00
makiolajandClaude Opus 4.6 32fa261ec2 chore: diagnostic and fix script for catalog seeding
CI / deploy (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / ci (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:57:27 +02:00
makiolajandClaude Opus 4.6 9864a09fc1 chore: shell script for nuke-and-reseed (runs inside container)
CI / ci (push) Successful in 1m16s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:20:03 +02:00
makiolajandClaude Opus 4.6 c3874d031a chore: temp script to nuke dev seed user
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:15:54 +02:00
makiolaj cd55f3c282 fix: seedTags inserts missing tags instead of skipping when any exist
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
2026-04-13 14:09:28 +02:00
makiolaj 80f4d1d9ae fix: lint formatting for seed data and item detail page
CI / ci (push) Successful in 1m14s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 17s
2026-04-13 14:03:25 +02:00
makiolaj ba13fa8ded docs: update roadmap, config, and UAT state
CI / ci (push) Failing after 20s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-13 13:56:56 +02:00
makiolaj 13883ea14d fix: add hobby tags to catalog seed data for onboarding discovery 2026-04-13 13:48:40 +02:00
makiolaj bedef04581 test(30): re-test UAT - 3 passed, 1 cosmetic, 3 blocked (catalog seed) 2026-04-13 13:45:47 +02:00
makiolaj c1177764ef docs(29-05): add execution summary 2026-04-13 13:42:20 +02:00
makiolaj ded6bf521e fix(29-05): add local crop state to ImageUpload for immediate preview 2026-04-13 13:42:06 +02:00
makiolaj d91d32deaf docs: capture todo - Fix Add Candidate button shows wrong modal on thread page 2026-04-13 13:39:58 +02:00
makiolaj c98ac6e46f docs(29): create gap closure plan for crop preview state 2026-04-13 13:37:57 +02:00
makiolaj e536f68bd1 docs(29): diagnose crop preview gap - ImageUpload missing local crop state 2026-04-13 13:36:50 +02:00
makiolaj 80cb313b08 test(29): re-test UAT - 4 passed, 2 issues (crop conflicts) 2026-04-13 13:34:00 +02:00
makiolajandClaude Opus 4.6 159ff824b2 fix: position crop button as overlay next to trash icon on image
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Moved the crop button from below the image into the ImageUpload
component as an absolute-positioned overlay next to the trash icon,
matching the visual pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:49:10 +02:00
makiolajandClaude Opus 4.6 09952e37b4 fix: move crop button into edit mode so it's reachable
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The crop icon button was in the view-mode branch but conditioned on
isEditing, making it unreachable. Moved it below ImageUpload in the
edit-mode branch where it belongs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:44:56 +02:00
makiolajandClaude Opus 4.6 fe5bd49b75 fix: save dominant color from image upload to item record
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
ImageUpload was discarding the dominantColor returned by the upload
API. Now it passes the color through onChange and the item detail
page saves it to the item record immediately after upload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:39:13 +02:00
makiolajandClaude Opus 4.6 ef531f79b2 fix: update email display in UI after email change
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The OIDC session token retains the old email after a Logto email
change. Now the server returns the new email in the response and
the frontend optimistically updates the auth cache.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:31:24 +02:00
makiolajandClaude Opus 4.6 6108db3dab debug: add detailed error logging for Logto M2M token request failures
CI / ci (push) Successful in 1m10s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Logs the URL, resource, app ID prefix, and response body when the
token request fails — helps diagnose 400 errors from Logto.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:18:05 +02:00
makiolajandClaude Opus 4.6 af58145fe1 feat: show avatar image in top nav when user has one
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
UserMenu now fetches the user's profile and displays their avatar
image in the nav button instead of the default circle-user icon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:07:28 +02:00
makiolajandClaude Opus 4.6 b647e23f91 fix: use presigned S3 URLs for avatar images instead of /uploads/ paths
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Avatar images were rendered via /uploads/ which doesn't exist since
the S3 migration. Now the server enriches profile responses with
avatarImageUrl (presigned S3 URL) and the frontend uses it directly.
Also fixed the public profile page at /users/:id.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:02:45 +02:00
makiolajandClaude Opus 4.6 62916a8397 fix(F-08): stronger selected state on hobby picker cards + biome formatting
CI / ci (push) Successful in 1m13s
CI / deploy (push) Successful in 13s
CI / e2e (push) Has been skipped
Selected hobby cards now use dark gray fill with inverted white
text/icon for clear visual distinction. Also fixes biome formatting
across all changed files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:37:19 +02:00
makiolajandClaude Opus 4.6 596872d942 fix(F-05): use icon button for crop trigger and trash icon for image removal
Changed "Adjust framing" text to a crop icon button visible only in
edit mode. Replaced the X icon on the image remove button with a
trash icon for clearer semantics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:36:40 +02:00
makiolajandClaude Opus 4.6 da5ce7da1d fix(F-06): auto-open crop editor after image upload on item detail
Added onCropChange and dominantColor props to ImageUpload in the item
detail page, so the crop editor opens automatically after uploading
a new image.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:35:59 +02:00
makiolajandClaude Opus 4.6 452928760a fix(F-01): fix avatar upload persistence on profile page
Replaced the one-shot initialized flag with a dirty flag that allows
the useEffect to re-sync local state from server data after a
successful save. Previously, once initialized was set to true, the
effect never ran again so avatar changes were lost on refetch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:35:35 +02:00
makiolajandClaude Opus 4.6 957d661567 fix(F-03): pass imageUrl and crop/color props to ItemCard in CollectionView
The flat list was missing dominantColor/crop props, and the grouped
view was also missing imageUrl entirely — causing images not to render
on collection cards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:34:47 +02:00
makiolajandClaude Opus 4.6 e3124e49c9 fix(F-04): include crop/color fields in item queries and use dominantColor in GearImage
getAllItems and getItemById were not selecting dominantColor, cropZoom,
cropX, cropY from the database. GearImage was ignoring the dominantColor
prop. Now the fields flow end-to-end from DB to UI background fill.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:34:19 +02:00
makiolajandClaude Opus 4.6 581872b534 fix(F-07): add crop/color fields to updateItem service type
The updateItem function's TypeScript type was missing dominantColor,
cropZoom, cropX, and cropY fields, causing crop settings to silently
fail to save despite the Zod schema and DB schema supporting them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:33:28 +02:00
makiolaj ce48121b2b test(31): complete UAT - 2 passed, 0 issues 2026-04-12 22:23:46 +02:00
makiolaj 2948cc5848 test(30): complete UAT - 3 passed, 1 cosmetic, 3 blocked 2026-04-12 22:22:03 +02:00
makiolajandClaude Opus 4.6 9318bc56ac style: fix biome formatting in logout redirect
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:06:58 +02:00
makiolajandClaude Opus 4.6 4241023950 fix: use GEARBOX_URL for post-logout redirect URI
CI / ci (push) Failing after 12s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Behind a reverse proxy, c.req.url resolves to internal URL which
doesn't match the registered post_logout_redirect_uri in Logto.
Use GEARBOX_URL env var (already required for OAuth) as the
redirect target.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:05:53 +02:00
makiolajandClaude Opus 4.6 cba3804b31 fix: include client_id in Logto end-session redirect
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Logto needs client_id to validate the post_logout_redirect_uri and
auto-redirect back to the app. Without it, user gets stuck on
Logto's end-session success page.

Note: post_logout_redirect_uri must be registered in Logto Console
under the app's "Post sign-out redirect URIs".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:58:27 +02:00
makiolajandClaude Opus 4.6 23cfbf7e4b fix: redirect to Logto end-session endpoint on logout
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 20s
After revoking the local session, redirect to Logto's /session/end
so the OIDC session is cleared too. Previously redirected to /login
which immediately re-authenticated via the still-valid Logto session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:54:49 +02:00
makiolajandClaude Opus 4.6 ddb76fd229 fix: destructure useLogout correctly in UserMenu
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
useLogout() returns { logout } but was assigned directly, causing
"r is not a function" when clicking sign out.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:47:55 +02:00
makiolaj 84205563a7 test(29): complete UAT - 2 passed, 4 issues 2026-04-12 21:41:24 +02:00
makiolaj 094301cc92 test(28): complete UAT - 4 passed, 1 issue, 3 blocked 2026-04-12 21:30:53 +02:00
makiolajandClaude Opus 4.6 d749e41f7b fix: allow null avatarUrl in updateProfileSchema
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
The Zod schema rejected null for avatarUrl, but the client sends null
when the avatar is removed. Changed to z.string().nullable().optional().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:24:11 +02:00
makiolajandClaude Opus 4.6 a0c01d388c fix: remove duplicate statements from migration 0004 and orphan migration file
CI / ci (push) Successful in 1m9s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m19s
Migration 0004 contained CREATE TABLE and ALTER TABLE statements already
applied in migrations 0002 and 0003, causing PGlite test DB initialization
to fail (311 test failures). Stripped to only the new dominant_color and
crop_* columns. Also removed orphan 0000_fuzzy_shiva.sql.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:07:18 +02:00
makiolajandClaude Opus 4.6 15c9f94d67 docs(phase-30): complete phase execution — onboarding redesign
CI / ci (push) Failing after 17s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:50:09 +02:00
makiolajandClaude Opus 4.6 3870662dc6 docs(30): complete plan execution summaries for plans 02 and 03
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:48:59 +02:00
makiolajandClaude Opus 4.6 115766cf60 feat(30-03): replace OnboardingWizard with catalog-driven OnboardingFlow
Swap old 4-step modal wizard with new full-screen, hobby-personalized
onboarding experience. Delete OnboardingWizard.tsx.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:48:41 +02:00
makiolajandClaude Opus 4.6 0db8771574 fix(30-02): fix biome formatting in onboarding components
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:47:47 +02:00
makiolajandClaude Opus 4.6 5c18a3cd6c feat(30-02): build full-screen catalog-driven onboarding flow UI
Implements 5-step onboarding: Welcome, Hobby Picker, Item Browser,
Review, and Done. Includes hobby card selection, popular item grid
with check/uncheck, review list with remove, CSS step transitions,
and responsive grid layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:46:55 +02:00
makiolajandClaude Opus 4.6 1de91bc024 docs(30-01): complete plan execution summary
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:44:42 +02:00
makiolajandClaude Opus 4.6 9448571993 fix(30-01): fix import ordering for biome lint compliance
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:44:13 +02:00
makiolajandClaude Opus 4.6 5b35e60477 feat(30-01): create onboarding route with Zod validation and register
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:43:29 +02:00
makiolajandClaude Opus 4.6 9da4c8435c feat(30-01): create onboarding service with batch item creation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:42:59 +02:00
makiolajandClaude Opus 4.6 d64708056f feat(30-01): add popular-items-by-tags endpoint to discovery routes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:42:29 +02:00
makiolajandClaude Opus 4.6 2347d49b69 feat(30-01): add popular-items-by-tags query to discovery service
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:41:03 +02:00
makiolajandClaude Opus 4.6 d37e64e71c feat(30-01): add shared hobby configuration with tag mappings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:40:43 +02:00
makiolajandClaude Opus 4.6 edd1cdde68 docs(30): create onboarding redesign plans (3 plans, 2 waves)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:38:14 +02:00
makiolaj 3906273a10 docs: update authentication.md with Logto setup checklist
CI / ci (push) Failing after 18s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-12 20:31:45 +02:00