* WIP - adding expo * WIP - adding expo 2 * Fix tsc * Finish adding expo * Disable the 'require cycle' warning * Tweak plist * Modify some dependency versions to make expo happy * Fix icon fill * Get Web compiling for expo * 1.7 * Switch to react-navigation in expo2 (#287) * WIP Switch to react-navigation * WIP Switch to react-navigation 2 * WIP Switch to react-navigation 3 * Convert all screens to react navigation * Update BottomBar for react navigation * Update mobile menu to be react-native drawer * Fixes to drawer and bottombar * Factor out some helpers * Replace the navigation model with react-navigation * Restructure the shell folder and fix the header positioning * Restore the error boundary * Fix tsc * Implement not-found page * Remove react-native-gesture-handler (no longer used) * Handle notifee card presses * Handle all navigations from the state layer * Fix drawer behaviors * Fix two linking issues * Switch to our react-native-progress fork to fix an svg rendering issue * Get Web working with react-navigation * Refactor routes and navigation for a bit more clarity * Remove dead code * Rework Web shell to left/right nav to make this easier * Fix ViewHeader for desktop web * Hide profileheader back btn on desktop web * Move the compose button to the left nav * Implement reply prompt in threads for desktop web * Composer refactors * Factor out all platform-specific text input behaviors from the composer * Small fix * Update the web build to use tiptap for the composer * Tune up the mention autocomplete dropdown * Simplify the default avatar and banner * Fixes to link cards in web composer * Fix dropdowns on web * Tweak load latest on desktop * Add web beta message and feedback link * Fix up links in desktop web
158 lines
4.4 KiB
TypeScript
158 lines
4.4 KiB
TypeScript
import React, {useState} from 'react'
|
|
import {Platform, StyleSheet, TouchableOpacity, View} from 'react-native'
|
|
import {
|
|
FontAwesomeIcon,
|
|
FontAwesomeIconStyle,
|
|
} from '@fortawesome/react-native-fontawesome'
|
|
import {ScrollView, TextInput} from './util'
|
|
import {Text} from '../util/text/Text'
|
|
import {useStores} from 'state/index'
|
|
import {s, colors} from 'lib/styles'
|
|
import {useTheme} from 'lib/ThemeContext'
|
|
import {LOCAL_DEV_SERVICE, STAGING_SERVICE, PROD_SERVICE} from 'state/index'
|
|
import {LOGIN_INCLUDE_DEV_SERVERS} from 'lib/build-flags'
|
|
|
|
export const snapPoints = ['80%']
|
|
|
|
export function Component({onSelect}: {onSelect: (url: string) => void}) {
|
|
const theme = useTheme()
|
|
const store = useStores()
|
|
const [customUrl, setCustomUrl] = useState<string>('')
|
|
|
|
const doSelect = (url: string) => {
|
|
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
|
url = `https://${url}`
|
|
}
|
|
store.shell.closeModal()
|
|
onSelect(url)
|
|
}
|
|
|
|
return (
|
|
<View style={s.flex1} testID="serverInputModal">
|
|
<Text style={[s.textCenter, s.bold, s.f18]}>Choose Service</Text>
|
|
<ScrollView style={styles.inner}>
|
|
<View style={styles.group}>
|
|
{LOGIN_INCLUDE_DEV_SERVERS ? (
|
|
<>
|
|
<TouchableOpacity
|
|
testID="localDevServerButton"
|
|
style={styles.btn}
|
|
onPress={() => doSelect(LOCAL_DEV_SERVICE)}>
|
|
<Text style={styles.btnText}>Local dev server</Text>
|
|
<FontAwesomeIcon
|
|
icon="arrow-right"
|
|
style={s.white as FontAwesomeIconStyle}
|
|
/>
|
|
</TouchableOpacity>
|
|
<TouchableOpacity
|
|
style={styles.btn}
|
|
onPress={() => doSelect(STAGING_SERVICE)}>
|
|
<Text style={styles.btnText}>Staging</Text>
|
|
<FontAwesomeIcon
|
|
icon="arrow-right"
|
|
style={s.white as FontAwesomeIconStyle}
|
|
/>
|
|
</TouchableOpacity>
|
|
</>
|
|
) : undefined}
|
|
<TouchableOpacity
|
|
style={styles.btn}
|
|
onPress={() => doSelect(PROD_SERVICE)}>
|
|
<Text style={styles.btnText}>Bluesky.Social</Text>
|
|
<FontAwesomeIcon
|
|
icon="arrow-right"
|
|
style={s.white as FontAwesomeIconStyle}
|
|
/>
|
|
</TouchableOpacity>
|
|
</View>
|
|
<View style={styles.group}>
|
|
<Text style={styles.label}>Other service</Text>
|
|
<View style={s.flexRow}>
|
|
<TextInput
|
|
testID="customServerTextInput"
|
|
style={styles.textInput}
|
|
placeholder="e.g. https://bsky.app"
|
|
placeholderTextColor={colors.gray4}
|
|
autoCapitalize="none"
|
|
autoComplete="off"
|
|
autoCorrect={false}
|
|
keyboardAppearance={theme.colorScheme}
|
|
value={customUrl}
|
|
onChangeText={setCustomUrl}
|
|
/>
|
|
<TouchableOpacity
|
|
testID="customServerSelectBtn"
|
|
style={styles.textInputBtn}
|
|
onPress={() => doSelect(customUrl)}>
|
|
<FontAwesomeIcon
|
|
icon="check"
|
|
style={[s.black as FontAwesomeIconStyle, styles.checkIcon]}
|
|
size={18}
|
|
/>
|
|
</TouchableOpacity>
|
|
</View>
|
|
</View>
|
|
</ScrollView>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
inner: {
|
|
padding: 14,
|
|
},
|
|
group: {
|
|
marginBottom: 20,
|
|
},
|
|
label: {
|
|
fontWeight: 'bold',
|
|
paddingHorizontal: 4,
|
|
paddingBottom: 4,
|
|
},
|
|
textInput: {
|
|
flex: 1,
|
|
borderWidth: 1,
|
|
borderColor: colors.gray3,
|
|
borderTopLeftRadius: 6,
|
|
borderBottomLeftRadius: 6,
|
|
paddingHorizontal: 14,
|
|
paddingVertical: 12,
|
|
fontSize: 16,
|
|
color: colors.black,
|
|
},
|
|
textInputBtn: {
|
|
borderWidth: 1,
|
|
borderLeftWidth: 0,
|
|
borderColor: colors.gray3,
|
|
borderTopRightRadius: 6,
|
|
borderBottomRightRadius: 6,
|
|
paddingHorizontal: 14,
|
|
paddingVertical: 10,
|
|
},
|
|
btn: {
|
|
flexDirection: 'row',
|
|
alignItems: 'center',
|
|
backgroundColor: colors.blue3,
|
|
borderRadius: 6,
|
|
paddingHorizontal: 14,
|
|
paddingVertical: 10,
|
|
marginBottom: 6,
|
|
},
|
|
btnText: {
|
|
flex: 1,
|
|
fontSize: 18,
|
|
fontWeight: '500',
|
|
color: colors.white,
|
|
},
|
|
checkIcon: {
|
|
position: 'relative',
|
|
...Platform.select({
|
|
android: {
|
|
top: 8,
|
|
},
|
|
ios: {
|
|
top: 2,
|
|
},
|
|
}),
|
|
},
|
|
})
|