chahinebrini 5d6c322129 wip: KeyboardAwareSheet migrations + Snake/Tetris UI + iron.png + useMe live-update
Sheets via neuer KeyboardAwareSheet-Composable (in Modal pattern, auto-grow
mit Tastatur, paddingBottom-Lift): EditMail, AddDomain, CreateRoom, ConnectMail.
GameOverScreen behält Spring-Slide-In, nutzt RN Keyboard.addListener für Lift.

- KeyboardAwareSheet.tsx — universal modal with sheet-grow + keyboard-padding
- react-native-keyboard-controller installiert + KeyboardProvider in Root
- Snake: time + ScoreProgressBar + useSnakeSounds (haptic, audio TODO)
- Tetris: title weg, Buttons zentriert, kein Pressable mit style-fn
- DPad-Buttons 60→48, more bg, no scale
- useMe: pub-sub listener pattern für app-weite avatar/nickname-Updates
- dm.tsx: resolveAvatar wrap (iron.png-Warning)
- Mail-error-humanizer + locales

Recovery-Doc-Update in docs/internal/RECOVERY_LOG_2026-05-10.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 23:59:25 +02:00

80 lines
2.6 KiB
TypeScript

const IPHONE_MAP: Record<string, string> = {
'iPhone10,1': 'iPhone 8',
'iPhone10,4': 'iPhone 8',
'iPhone10,2': 'iPhone 8 Plus',
'iPhone10,5': 'iPhone 8 Plus',
'iPhone10,3': 'iPhone X',
'iPhone10,6': 'iPhone X',
'iPhone11,2': 'iPhone XS',
'iPhone11,4': 'iPhone XS Max',
'iPhone11,6': 'iPhone XS Max',
'iPhone11,8': 'iPhone XR',
'iPhone12,1': 'iPhone 11',
'iPhone12,3': 'iPhone 11 Pro',
'iPhone12,5': 'iPhone 11 Pro Max',
'iPhone12,8': 'iPhone SE (2. Gen.)',
'iPhone13,1': 'iPhone 12 mini',
'iPhone13,2': 'iPhone 12',
'iPhone13,3': 'iPhone 12 Pro',
'iPhone13,4': 'iPhone 12 Pro Max',
'iPhone14,2': 'iPhone 13 Pro',
'iPhone14,3': 'iPhone 13 Pro Max',
'iPhone14,4': 'iPhone 13 mini',
'iPhone14,5': 'iPhone 13',
'iPhone14,6': 'iPhone SE (3. Gen.)',
'iPhone14,7': 'iPhone 14',
'iPhone14,8': 'iPhone 14 Plus',
'iPhone15,2': 'iPhone 14 Pro',
'iPhone15,3': 'iPhone 14 Pro Max',
'iPhone15,4': 'iPhone 15',
'iPhone15,5': 'iPhone 15 Plus',
'iPhone16,1': 'iPhone 15 Pro',
'iPhone16,2': 'iPhone 15 Pro Max',
'iPhone17,1': 'iPhone 16 Pro',
'iPhone17,2': 'iPhone 16 Pro Max',
'iPhone17,3': 'iPhone 16',
'iPhone17,4': 'iPhone 16 Plus',
'iPhone17,5': 'iPhone 16e',
'iPhone18,1': 'iPhone 17 Pro',
'iPhone18,2': 'iPhone 17 Pro Max',
'iPhone18,3': 'iPhone 17',
'iPhone18,4': 'iPhone Air',
};
const IPAD_MAP: Record<string, string> = {
'iPad13,4': 'iPad Pro 11" (M1)',
'iPad13,5': 'iPad Pro 11" (M1)',
'iPad13,6': 'iPad Pro 11" (M1)',
'iPad13,7': 'iPad Pro 11" (M1)',
'iPad13,8': 'iPad Pro 12.9" (M1)',
'iPad13,9': 'iPad Pro 12.9" (M1)',
'iPad13,10': 'iPad Pro 12.9" (M1)',
'iPad13,11': 'iPad Pro 12.9" (M1)',
'iPad13,16': 'iPad Air (5. Gen.)',
'iPad13,17': 'iPad Air (5. Gen.)',
'iPad13,18': 'iPad (10. Gen.)',
'iPad13,19': 'iPad (10. Gen.)',
'iPad14,1': 'iPad mini (6. Gen.)',
'iPad14,2': 'iPad mini (6. Gen.)',
'iPad14,3': 'iPad Pro 11" (M2)',
'iPad14,4': 'iPad Pro 11" (M2)',
'iPad14,5': 'iPad Pro 12.9" (M2)',
'iPad14,6': 'iPad Pro 12.9" (M2)',
'iPad14,8': 'iPad Air 11" (M2)',
'iPad14,9': 'iPad Air 11" (M2)',
'iPad14,10': 'iPad Air 13" (M2)',
'iPad14,11': 'iPad Air 13" (M2)',
'iPad16,1': 'iPad mini (A17 Pro)',
'iPad16,2': 'iPad mini (A17 Pro)',
'iPad16,3': 'iPad Pro 11" (M4)',
'iPad16,4': 'iPad Pro 11" (M4)',
'iPad16,5': 'iPad Pro 13" (M4)',
'iPad16,6': 'iPad Pro 13" (M4)',
};
export function decodeAppleModel(modelCode: string | null | undefined): string {
if (!modelCode) return '';
const trimmed = modelCode.trim();
return IPHONE_MAP[trimmed] ?? IPAD_MAP[trimmed] ?? trimmed;
}