Changeset View
Changeset View
Standalone View
Standalone View
native/account/log-in-panel.react.js
Show All 31 Lines | |||||
} from './native-credentials.js'; | } from './native-credentials.js'; | ||||
import { PanelButton, Panel } from './panel-components.react.js'; | import { PanelButton, Panel } from './panel-components.react.js'; | ||||
import PasswordInput from './password-input.react.js'; | import PasswordInput from './password-input.react.js'; | ||||
import SWMansionIcon from '../components/swmansion-icon.react.js'; | import SWMansionIcon from '../components/swmansion-icon.react.js'; | ||||
import { NavContext } from '../navigation/navigation-context.js'; | import { NavContext } from '../navigation/navigation-context.js'; | ||||
import { useSelector } from '../redux/redux-utils.js'; | import { useSelector } from '../redux/redux-utils.js'; | ||||
import { nativeLogInExtraInfoSelector } from '../selectors/account-selectors.js'; | import { nativeLogInExtraInfoSelector } from '../selectors/account-selectors.js'; | ||||
import type { KeyPressEvent } from '../types/react-native.js'; | import type { KeyPressEvent } from '../types/react-native.js'; | ||||
import { useInitialNotificationsEncryptedMessage } from '../utils/crypto-utils.js'; | |||||
import type { StateContainer } from '../utils/state-container.js'; | import type { StateContainer } from '../utils/state-container.js'; | ||||
export type LogInState = { | export type LogInState = { | ||||
+usernameInputText: ?string, | +usernameInputText: ?string, | ||||
+passwordInputText: ?string, | +passwordInputText: ?string, | ||||
}; | }; | ||||
type BaseProps = { | type BaseProps = { | ||||
+setActiveAlert: (activeAlert: boolean) => void, | +setActiveAlert: (activeAlert: boolean) => void, | ||||
+opacityValue: Animated.Node, | +opacityValue: Animated.Node, | ||||
+logInState: StateContainer<LogInState>, | +logInState: StateContainer<LogInState>, | ||||
}; | }; | ||||
type Props = { | type Props = { | ||||
...BaseProps, | ...BaseProps, | ||||
+loadingStatus: LoadingStatus, | +loadingStatus: LoadingStatus, | ||||
+logInExtraInfo: () => Promise<LogInExtraInfo>, | +logInExtraInfo: () => Promise<LogInExtraInfo>, | ||||
+dispatchActionPromise: DispatchActionPromise, | +dispatchActionPromise: DispatchActionPromise, | ||||
+logIn: (logInInfo: LogInInfo) => Promise<LogInResult>, | +logIn: (logInInfo: LogInInfo) => Promise<LogInResult>, | ||||
+getInitialNotificationsEncryptedMessage: () => Promise<string>, | |||||
}; | }; | ||||
class LogInPanel extends React.PureComponent<Props> { | class LogInPanel extends React.PureComponent<Props> { | ||||
usernameInput: ?TextInput; | usernameInput: ?TextInput; | ||||
passwordInput: ?PasswordInput; | passwordInput: ?PasswordInput; | ||||
componentDidMount() { | componentDidMount() { | ||||
this.attemptToFetchCredentials(); | this.attemptToFetchCredentials(); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 157 Lines • ▼ Show 20 Lines | if (this.usernameInputText.search(validEmailRegex) > -1) { | ||||
[{ text: 'OK', onPress: this.onPasswordAlertAcknowledged }], | [{ text: 'OK', onPress: this.onPasswordAlertAcknowledged }], | ||||
{ cancelable: false }, | { cancelable: false }, | ||||
); | ); | ||||
return; | return; | ||||
} | } | ||||
Keyboard.dismiss(); | Keyboard.dismiss(); | ||||
const extraInfo = await this.props.logInExtraInfo(); | const extraInfo = await this.props.logInExtraInfo(); | ||||
const initialNotificationsEncryptedMessage = | |||||
await this.props.getInitialNotificationsEncryptedMessage(); | |||||
this.props.dispatchActionPromise( | this.props.dispatchActionPromise( | ||||
logInActionTypes, | logInActionTypes, | ||||
this.logInAction(extraInfo), | this.logInAction({ ...extraInfo, initialNotificationsEncryptedMessage }), | ||||
undefined, | undefined, | ||||
({ calendarQuery: extraInfo.calendarQuery }: LogInStartingPayload), | ({ calendarQuery: extraInfo.calendarQuery }: LogInStartingPayload), | ||||
); | ); | ||||
}; | }; | ||||
async logInAction(extraInfo: LogInExtraInfo): Promise<LogInResult> { | async logInAction(extraInfo: LogInExtraInfo): Promise<LogInResult> { | ||||
try { | try { | ||||
const result = await this.props.logIn({ | const result = await this.props.logIn({ | ||||
▲ Show 20 Lines • Show All 118 Lines • ▼ Show 20 Lines | const logInExtraInfo = useSelector(state => | ||||
nativeLogInExtraInfoSelector({ | nativeLogInExtraInfoSelector({ | ||||
redux: state, | redux: state, | ||||
navContext, | navContext, | ||||
}), | }), | ||||
); | ); | ||||
const dispatchActionPromise = useDispatchActionPromise(); | const dispatchActionPromise = useDispatchActionPromise(); | ||||
const callLogIn = useServerCall(logIn); | const callLogIn = useServerCall(logIn); | ||||
const getInitialNotificationsEncryptedMessage = | |||||
useInitialNotificationsEncryptedMessage(); | |||||
return ( | return ( | ||||
<LogInPanel | <LogInPanel | ||||
{...props} | {...props} | ||||
loadingStatus={loadingStatus} | loadingStatus={loadingStatus} | ||||
logInExtraInfo={logInExtraInfo} | logInExtraInfo={logInExtraInfo} | ||||
dispatchActionPromise={dispatchActionPromise} | dispatchActionPromise={dispatchActionPromise} | ||||
logIn={callLogIn} | logIn={callLogIn} | ||||
getInitialNotificationsEncryptedMessage={ | |||||
getInitialNotificationsEncryptedMessage | |||||
} | |||||
/> | /> | ||||
); | ); | ||||
}); | }); | ||||
export default ConnectedLogInPanel; | export default ConnectedLogInPanel; |