// screens/moves/MoveFormScreen.tsx import React, { useState } from 'react'; import { Button, StyleSheet, Text, TextInput } from 'react-native'; import { StackNavigationProp } from '@react-navigation/stack'; import { RootStackParamList } from "../../navigation/navigationTypes"; import { useDispatch, useSelector } from 'react-redux'; import { createMove, updateMove } from '../../redux/actions/moveActions'; import { AppDispatch, RootState } from "../../redux/store"; import { Move } from "../../entities/Move"; import { RouteProp } from "@react-navigation/native"; import { MOVE_FORM } from "../../navigation/constants"; import { Picker } from "@react-native-community/picker"; import { ItemValue } from "@react-native-community/picker/typings/Picker"; import { MoveCategoryName } from "../../entities/MoveCategoryName"; import { TypeName } from "../../entities/TypeName"; import MultiSelect from "react-native-multiple-select"; import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; import AlertModal from "../../components/AlertModal"; import { MOVE_ERROR } from "../../redux/constants"; type MoveFormScreenNavigationProp = StackNavigationProp; type MoveFormScreenRouteProp = RouteProp; type Props = { navigation: MoveFormScreenNavigationProp; route: MoveFormScreenRouteProp }; const MoveFormScreen = ({ navigation, route }: Props) => { const error = useSelector((state: RootState) => state.move.error); const dispatch = useDispatch(); const [move, setMove] = useState(route.params?.move || { id: null, name: '', category: MoveCategoryName.PHYSICAL, power: 0, accuracy: 0, type: { name: TypeName.NORMAL, weakAgainst: [], effectiveAgainst: [], }, schemaVersion: 2 }); const [selectedWeakAgainst, setSelectedWeakAgainst] = useState(move.type.weakAgainst); const [selectedEffectiveAgainst, setSelectedEffectiveAgainst] = useState(move.type.effectiveAgainst); const handleSelectType = (selectedTypes: string[], setTypes: React.Dispatch>, otherSelectedTypes: string[]) => { const uniqueSelectedTypes = Array.from(new Set(selectedTypes)); const withoutDuplicatesFromOtherColumn = uniqueSelectedTypes.filter(type => !otherSelectedTypes.includes(type)); setTypes(withoutDuplicatesFromOtherColumn); }; const handleSave = () => { if (route.params?.move) { (dispatch as AppDispatch)(updateMove(route.params.move.id!, { ...move, type: { ...move.type, weakAgainst: selectedWeakAgainst, effectiveAgainst: selectedEffectiveAgainst } })); } else { (dispatch as AppDispatch)(createMove({ ...move, type: { ...move.type, weakAgainst: selectedWeakAgainst, effectiveAgainst: selectedEffectiveAgainst } })); } navigation.goBack(); }; return ( dispatch({ type: MOVE_ERROR, payload: null })} /> Name: setMove({ ...move, name: text })} style={styles.input} /> Category: setMove({ ...move, category: itemValue as MoveCategoryName }) }> {Object.values(MoveCategoryName).map((value) => )} Power: setMove({ ...move, power: Number(text) })} style={styles.input} keyboardType="numeric" /> Accuracy: setMove({ ...move, accuracy: Number(text) })} style={styles.input} keyboardType="numeric" /> Type: setMove({ ...move, type: { ...move.type, name: itemValue as TypeName } }) }> {Object.values(TypeName).map((value) => )} Weak Against: ({ id: value, name: value })) } uniqueKey="id" onSelectedItemsChange={ (selectedItems) => handleSelectType(selectedItems, setSelectedWeakAgainst, selectedEffectiveAgainst) } selectedItems={selectedWeakAgainst} displayKey="name" /> Effective Against: ({ id: value, name: value })) } uniqueKey="id" onSelectedItemsChange={ (selectedItems) => handleSelectType(selectedItems, setSelectedEffectiveAgainst, selectedWeakAgainst) } selectedItems={selectedEffectiveAgainst} displayKey="name" />