Phase 3 Migration - Fix keyboard handling issues across 8 screens Portofolio Screens (5): - portofolio/[id]/edit-social-media.tsx: ViewWrapper → NewWrapper_V2 - portofolio/[id]/edit-logo.tsx: ViewWrapper → NewWrapper_V2 - portofolio/[id]/edit.tsx: NewWrapper → NewWrapper_V2 + fix React error - portofolio/[id]/index.tsx: ViewWrapper → NewWrapper_V2 - screens/Portofolio/ScreenPortofolioCreate.tsx: NewWrapper → NewWrapper_V2 Maps Screens (3): - screens/Maps/ScreenMapsCreate.tsx: NewWrapper → NewWrapper_V2 - screens/Maps/ScreenMapsEdit.tsx: ViewWrapper → NewWrapper_V2 - app/(application)/(user)/maps/[id]/custom-pin.tsx: ViewWrapper → NewWrapper_V2 Changes: - Add enableKeyboardHandling to all form screens - Wrap TextInputCustom/SelectCustom/TextAreaCustom with View onStartShouldSetResponder - Fix React static flag error in portofolio edit loading state - Update TASK-004 migration task file Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
13 KiB
TASK-004: NewWrapper_V2 Gradual Migration
📋 Deskripsi
Migrasi bertahap dari NewWrapper ke NewWrapper_V2 untuk memperbaiki bug keyboard handling (footer terangkat, area putih, input terpotong).
🎯 Tujuan
- Replace
NewWrapper→NewWrapper_V2secara bertahap - Fix keyboard handling issues di semua form screens
- Zero breaking changes dengan gradual migration
- Clean up test components yang tidak diperlukan
📊 Migration Priority
Phase 1: Job Screens (Week 1) ✅ COMPLETED
screens/Job/ScreenJobCreate2.tsx→ Already using keyboard handlingscreens/Job/ScreenJobCreate.tsx→ Migrate to NewWrapper_V2screens/Job/ScreenJobEdit.tsx→ Migrate to NewWrapper_V2- Delete test files after migration
Phase 2: Profile Screens (Week 2) ✅ COMPLETED
app/(application)/(user)/profile/create.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/edit.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/index.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/detail-blocked.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/blocked-list.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/update-photo.tsx→ Migrate to NewWrapper_V2app/(application)/(user)/profile/[id]/update-background.tsx→ Migrate to NewWrapper_V2
Phase 3: Portofolio & Maps Screens (Week 3) - NEXT
app/(application)/(user)/portofolio/[id]/create.tsxapp/(application)/(user)/portofolio/[id]/edit.tsxapp/(application)/(user)/portofolio/[id]/edit-logo.tsxapp/(application)/(user)/portofolio/[id]/edit-social-media.tsxapp/(application)/(user)/portofolio/[id]/index.tsxapp/(application)/(user)/portofolio/[id]/list.tsxscreens/Maps/ScreenMapsCreate.tsxscreens/Maps/ScreenMapsEdit.tsxapp/(application)/(user)/maps/[id]/custom-pin.tsx
Phase 4: Event Screens (Week 4)
screens/Event/ScreenEventCreate.tsxscreens/Event/ScreenEventEdit.tsx
Phase 5: Other Form Screens (Week 5)
screens/Donation/- All create/edit screensscreens/Investment/- All create/edit screensscreens/Voting/- All create/edit screens
Phase 6: Complex Screens (Week 6)
screens/Forum/- Create/edit with rich textscreens/Collaboration/- Complex forms- Other complex forms
Phase 7: Cleanup (Week 7)
- Remove old
NewWrapper.tsx(or deprecate) - Rename
NewWrapper_V2.tsx→NewWrapper.tsx - Update documentation
- Delete test components
🔧 Task Details
Task 4.1: Job Screens Migration ✅ IN PROGRESS
Files to migrate:
screens/Job/ScreenJobCreate.tsxscreens/Job/ScreenJobEdit.tsx
Changes per file:
// BEFORE
import { NewWrapper } from "@/components";
<NewWrapper footerComponent={buttonSubmit()}>
<TextInputCustom label="..." />
</NewWrapper>
// AFTER
import { NewWrapper_V2 } from "@/components";
<NewWrapper_V2
enableKeyboardHandling
keyboardScrollOffset={100}
footerComponent={buttonSubmit()}
>
<View onStartShouldSetResponder={() => true}>
<TextInputCustom label="..." />
</View>
</NewWrapper_V2>
Checklist per screen:
- Replace
NewWrapper→NewWrapper_V2 - Add
enableKeyboardHandlingprop - Wrap all TextInput/TextArea with
View onStartShouldSetResponder - Test on Android (navigation buttons)
- Test on Android (gesture)
- Test on iOS
- Verify auto-scroll works
- Verify footer stays in place
- Verify no white area
Cleanup after migration:
- Delete
screens/Job/ScreenJobCreate2.tsx(test file) - Delete
screens/Job/ScreenJobEdit2.tsx(test file) - Update app routes if needed
Task 4.2: Delete Test Components
Files to delete:
components/_ShareComponent/TestWrapper.tsxcomponents/_ShareComponent/TestKeyboardInput.tsxapp/(application)/(user)/test-keyboard.tsxapp/(application)/(user)/test-keyboard-bug.tsx
Keep (useful):
- ✅
components/_ShareComponent/FormWrapper.tsx(alternative wrapper) - ✅
hooks/useKeyboardForm.ts(keyboard hook) - ✅
docs/KEYBOARD-BUG-TEST.md(documentation) - ✅
docs/NEWWRAPPER-KEYBOARD-IMPLEMENTATION.md(documentation)
Task 4.3: Update Documentation
Files to update:
QWEN.md- Update NewWrapper_V2 usagedocs/NEWWRAPPER-KEYBOARD-IMPLEMENTATION.md- Mark as completed- Create migration guide for team
📝 Migration Guide (Per Screen)
Step 1: Import NewWrapper_V2
// Change this:
import { NewWrapper } from "@/components";
// To this:
import { NewWrapper_V2 } from "@/components";
Step 2: Update Component Usage
// Change this:
<NewWrapper footerComponent={buttonSubmit()}>
<StackCustom>
<TextInputCustom label="Judul" ... />
<TextAreaCustom label="Deskripsi" ... />
</StackCustom>
</NewWrapper>
// To this:
<NewWrapper_V2
enableKeyboardHandling
keyboardScrollOffset={100}
footerComponent={buttonSubmit()}
>
<StackCustom>
<View onStartShouldSetResponder={() => true}>
<TextInputCustom label="Judul" ... />
</View>
<View onStartShouldSetResponder={() => true}>
<TextAreaCustom label="Deskripsi" ... />
</View>
</StackCustom>
</NewWrapper_V2>
Step 3: Import View
// Add this import if not already present:
import { View } from "react-native";
Step 4: Test
- Run app
- Navigate to screen
- Tap each input field
- Verify auto-scroll works
- Verify footer stays in place
- Verify no white area
- Test submit functionality
🧪 Testing Checklist
For Each Migrated Screen:
Functional Tests:
- All inputs focus correctly
- Keyboard shows when tapping input
- Auto-scroll to focused input
- Keyboard dismisses when tapping outside
- Footer stays at bottom
- No white area at bottom
- Submit button works
- Form validation works
- Data saves correctly
Platform Tests:
- Android with navigation buttons
- Android with gesture navigation
- iOS with home button
- iOS with gesture (notch)
- Different screen sizes
Edge Cases:
- Multiple inputs on screen
- Long content (scrollable)
- Loading state
- Error state
- Keyboard transition smooth
📊 Progress Tracking
| Phase | Screens | Status | Completed Date |
|---|---|---|---|
| Phase 1: Job | 6 screens | ✅ COMPLETED | 2026-04-01 |
| Phase 2: Profile | 7 screens | ✅ COMPLETED | 2026-04-04 |
| Phase 3: Portofolio & Maps | 9 screens | ⏳ Pending | - |
| Phase 4: Event | 2 screens | ⏳ Pending | - |
| Phase 5: Forms | 6-8 screens | ⏳ Pending | - |
| Phase 6: Complex | 4-6 screens | ⏳ Pending | - |
| Phase 7: Cleanup | Cleanup | ⏳ Pending | - |
✅ Phase 1: COMPLETED!
Migrated Screens:
- ✅
screens/Job/ScreenJobCreate.tsx- Form with keyboard handling - ✅
screens/Job/ScreenJobEdit.tsx- Form with keyboard handling - ✅
screens/Job/ScreenBeranda2.tsx- List (no keyboard handling needed) - ✅
screens/Job/ScreenArchive2.tsx- List (no keyboard handling needed) - ✅
screens/Job/MainViewStatus2.tsx- List (no keyboard handling needed) - ✅
app/(application)/(user)/job/[id]/[status]/detail.tsx- Detail (no keyboard handling needed)
Test Files Deleted:
- ❌
screens/Job/ScreenJobCreate2.tsx - ❌
screens/Job/ScreenJobEdit2.tsx - ❌
components/_ShareComponent/TestWrapper.tsx - ❌
components/_ShareComponent/TestKeyboardInput.tsx - ❌
app/(application)/(user)/test-keyboard.tsx - ❌
app/(application)/(user)/test-keyboard-bug.tsx
Routes Updated:
- ✅
app/(application)/(user)/job/create.tsx→ Uses ScreenJobCreate - ✅
app/(application)/(user)/job/[id]/edit.tsx→ Uses ScreenJobEdit - ✅
app/(application)/(user)/job/(tabs)/index.tsx→ Uses ScreenBeranda2 - ✅
app/(application)/(user)/job/(tabs)/archive.tsx→ Uses ScreenArchive2 - ✅
app/(application)/(user)/job/(tabs)/status.tsx→ Uses MainViewStatus2 - ✅
app/(application)/(user)/job/[id]/[status]/detail.tsx→ Migrated to NewWrapper_V2
Commits:
a9ff755- feat: Migrate Job screens to NewWrapper_V20f55244- refactor: Cleanup test files and migrate Job Detail7cb4f30- refactor: Replace NewWrapper with NewWrapper_V2 for all Job screens
Total: 6 screens migrated, 6 test files deleted, 6 routes updated
✅ Phase 2: COMPLETED!
Migrated Screens:
- ✅
app/(application)/(user)/profile/create.tsx- Form with keyboard handling - ✅
app/(application)/(user)/profile/[id]/edit.tsx- Form with keyboard handling - ✅
app/(application)/(user)/profile/[id]/index.tsx- Profile detail (list, no keyboard handling) - ✅
app/(application)/(user)/profile/[id]/detail-blocked.tsx- Blocked detail with keyboard handling - ✅
app/(application)/(user)/profile/[id]/blocked-list.tsx- Blocked list (list, no keyboard handling) - ✅
app/(application)/(user)/profile/[id]/update-photo.tsx- Photo update screen - ✅
app/(application)/(user)/profile/[id]/update-background.tsx- Background update screen
Changes Applied:
- Replaced
ViewWrapper/NewWrapper→NewWrapper_V2 - Added
enableKeyboardHandlingprop to form screens - Added
keyboardScrollOffset={100}to form screens - Wrapped all
TextInputCustom/SelectCustomwith<View onStartShouldSetResponder={() => true}> - Fixed keyboard handling issues (footer lift, white area, input cutoff)
Commits:
3382c16- refactor: Migrate Profile screens to NewWrapper_V276759cc- chore: Update layout headers and iOS build config
Total: 7 screens migrated, 2 commits pushed to branch qc/4-apr-26
🚀 Current Status
Status: 🟡 IN PROGRESS Current Phase: Phase 2 - Profile Screens ✅ COMPLETED Next Phase: Phase 3 - Portofolio & Maps Screens Started: 2026-04-01 Last Updated: 2026-04-04 Overall Progress: 13/34+ screens completed (38%)
📞 Next Actions
-
Immediate (Today):
- Migrate
app/(application)/(user)/portofolio/[id]/create.tsx - Migrate
app/(application)/(user)/portofolio/[id]/edit.tsx - Migrate
app/(application)/(user)/portofolio/[id]/edit-logo.tsx - Migrate
app/(application)/(user)/portofolio/[id]/edit-social-media.tsx - Migrate
screens/Maps/ScreenMapsCreate.tsx - Migrate
screens/Maps/ScreenMapsEdit.tsx - Migrate
app/(application)/(user)/maps/[id]/custom-pin.tsx - Test all Portofolio & Maps screens
- Migrate
-
This Week:
- Complete Phase 3 (Portofolio & Maps screens)
- Document any issues
- Prepare Phase 4
-
Next Week:
- Start Phase 4 (Event screens)
- Review Phase 2-3 results
- Adjust migration guide if needed
📚 Related Files
Components:
components/_ShareComponent/NewWrapper.tsx(Old)components/_ShareComponent/NewWrapper_V2.tsx(New)hooks/useKeyboardForm.ts(Keyboard hook)
Documentation:
docs/NEWWRAPPER-KEYBOARD-IMPLEMENTATION.md(Full analysis)docs/KEYBOARD-BUG-TEST.md(Bug investigation)tasks/TASK-004-newwrapper-migration.md(This file)
Screens to Migrate:
app/(application)/(user)/portofolio/[id]/create.tsx(Phase 3)app/(application)/(user)/portofolio/[id]/edit.tsx(Phase 3)app/(application)/(user)/portofolio/[id]/edit-logo.tsx(Phase 3)app/(application)/(user)/portofolio/[id]/edit-social-media.tsx(Phase 3)screens/Maps/ScreenMapsCreate.tsx(Phase 3)screens/Maps/ScreenMapsEdit.tsx(Phase 3)app/(application)/(user)/maps/[id]/custom-pin.tsx(Phase 3)- (More in subsequent phases)
⚠️ Risk Mitigation
If issues found during migration:
- Stop migration for that screen
- Revert changes if critical bug
- Document issue in detail
- Fix NewWrapper_V2 if needed
- Resume migration after fix
Rollback plan:
- Keep old
NewWrapperuntil all screens migrated - Easy to revert per screen
- No breaking changes to other screens
✅ Success Criteria
Phase 2 Complete when: ✅
- Profile Create migrated
- Profile Edit migrated
- Profile detail screens migrated
- All screens tested
- Commits pushed to branch
Phase 3 Complete when:
- Portofolio Create migrated
- Portofolio Edit migrated
- Portofolio edit-logo migrated
- Portofolio edit-social-media migrated
- Maps Create migrated
- Maps Edit migrated
- Maps custom-pin migrated
- All Portofolio & Maps screens tested on iOS & Android
- No critical bugs
- Documentation updated
Overall Migration Complete when:
- All form screens migrated
- All screens tested
- Old NewWrapper deprecated/removed
- Team trained on NewWrapper_V2
- Documentation complete
Last Updated: 2026-04-04 Created by: AI Assistant Status: 🟡 IN PROGRESS - Phase 2 Complete, Ready for Phase 3 (Portofolio & Maps)