tooot/src/screens/Tabs/Me/Switch/Root.tsx

140 lines
4.0 KiB
TypeScript
Raw Normal View History

2021-01-24 02:25:43 +01:00
import analytics from '@components/analytics'
2021-01-07 19:13:09 +01:00
import Button from '@components/Button'
2021-01-31 03:09:35 +01:00
import haptics from '@components/haptics'
2021-01-07 19:13:09 +01:00
import ComponentInstance from '@components/Instance'
import { useNavigation } from '@react-navigation/native'
import {
2021-02-20 19:12:44 +01:00
getInstanceActive,
getInstances,
Instance,
updateInstanceActive
2021-01-07 19:13:09 +01:00
} from '@utils/slices/instancesSlice'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
2021-01-19 01:13:45 +01:00
import { useTranslation } from 'react-i18next'
2021-01-14 00:43:35 +01:00
import {
KeyboardAvoidingView,
Platform,
StyleSheet,
Text,
View
} from 'react-native'
2021-01-07 19:13:09 +01:00
import { ScrollView } from 'react-native-gesture-handler'
import { useQueryClient } from 'react-query'
import { useDispatch, useSelector } from 'react-redux'
interface Props {
2021-02-20 19:12:44 +01:00
instance: Instance
2021-01-10 02:12:14 +01:00
disabled?: boolean
2021-01-07 19:13:09 +01:00
}
2021-02-02 22:50:38 +01:00
const AccountButton: React.FC<Props> = ({ instance, disabled = false }) => {
2021-01-07 19:13:09 +01:00
const queryClient = useQueryClient()
const navigation = useNavigation()
const dispatch = useDispatch()
return (
<Button
type='text'
2021-01-10 02:12:14 +01:00
disabled={disabled}
2021-01-07 19:13:09 +01:00
style={styles.button}
2021-01-23 02:41:50 +01:00
content={`@${instance.account.acct}@${instance.uri}${
disabled ? ' ✓' : ''
}`}
2021-01-07 19:13:09 +01:00
onPress={() => {
2021-01-31 03:09:35 +01:00
haptics('Light')
2021-01-24 02:25:43 +01:00
analytics('switch_existing_press')
2021-02-20 19:12:44 +01:00
dispatch(updateInstanceActive(instance))
2021-02-10 00:40:44 +01:00
queryClient.clear()
2021-01-07 19:13:09 +01:00
navigation.goBack()
}}
/>
)
}
2021-01-19 01:13:45 +01:00
const ScreenMeSwitchRoot: React.FC = () => {
const { t } = useTranslation('meSwitch')
2021-01-07 19:13:09 +01:00
const { theme } = useTheme()
2021-02-20 19:12:44 +01:00
const instances = useSelector(getInstances)
const instanceActive = useSelector(getInstanceActive)
2021-01-07 19:13:09 +01:00
return (
2021-01-14 00:43:35 +01:00
<KeyboardAvoidingView
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
style={{ flex: 1 }}
>
2021-01-07 19:13:09 +01:00
<ScrollView keyboardShouldPersistTaps='handled'>
2021-01-19 01:13:45 +01:00
<View
style={[styles.firstSection, { borderBottomColor: theme.border }]}
>
2021-01-07 19:13:09 +01:00
<Text style={[styles.header, { color: theme.primary }]}>
2021-01-19 01:13:45 +01:00
{t('content.existing')}
2021-01-07 19:13:09 +01:00
</Text>
<View style={styles.accountButtons}>
2021-02-20 19:12:44 +01:00
{instances.length
? instances
2021-01-31 03:09:35 +01:00
.slice()
.sort((a, b) =>
`${a.uri}${a.account.acct}`.localeCompare(
`${b.uri}${b.account.acct}`
)
)
2021-02-02 22:50:38 +01:00
.map((instance, index) => {
2021-02-20 19:12:44 +01:00
const localAccount = instances[instanceActive!]
2021-02-02 22:50:38 +01:00
return (
<AccountButton
key={index}
instance={instance}
disabled={
instance.url === localAccount.url &&
instance.token === localAccount.token &&
instance.account.id === localAccount.account.id
}
/>
)
})
2021-01-07 19:13:09 +01:00
: null}
</View>
</View>
2021-01-19 01:13:45 +01:00
<View style={styles.secondSection}>
<Text style={[styles.header, { color: theme.primary }]}>
{t('content.new')}
</Text>
2021-02-09 01:16:12 +01:00
<ComponentInstance disableHeaderImage goBack />
2021-01-19 01:13:45 +01:00
</View>
2021-01-07 19:13:09 +01:00
</ScrollView>
</KeyboardAvoidingView>
)
}
const styles = StyleSheet.create({
header: {
...StyleConstants.FontStyle.M,
textAlign: 'center',
paddingVertical: StyleConstants.Spacing.S
},
firstSection: {
2021-01-19 01:13:45 +01:00
marginTop: StyleConstants.Spacing.S,
marginHorizontal: StyleConstants.Spacing.Global.PagePadding,
paddingBottom: StyleConstants.Spacing.S,
borderBottomWidth: StyleSheet.hairlineWidth
2021-01-07 19:13:09 +01:00
},
secondSection: {
2021-01-19 01:13:45 +01:00
paddingTop: StyleConstants.Spacing.M
2021-01-07 19:13:09 +01:00
},
accountButtons: {
flex: 1,
flexDirection: 'row',
flexWrap: 'wrap',
marginTop: StyleConstants.Spacing.M
},
button: {
2021-01-22 01:34:20 +01:00
marginBottom: StyleConstants.Spacing.M,
marginRight: StyleConstants.Spacing.M
2021-01-07 19:13:09 +01:00
}
})
export default ScreenMeSwitchRoot