Move appearance settings to settings page
parent
b2ef6bde00
commit
3c15f6ba02
|
@ -1,6 +1,7 @@
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {
|
import {
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
|
Pressable,
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
TextStyle,
|
TextStyle,
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
|
@ -282,6 +283,34 @@ export const SettingsScreen = withAuthRequired(
|
||||||
</Text>
|
</Text>
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
<View style={styles.spacer20} />
|
||||||
|
<Text type="xl-bold" style={[pal.text, styles.heading]}>
|
||||||
|
Appearance
|
||||||
|
</Text>
|
||||||
|
<View>
|
||||||
|
<View style={[styles.linkCard, pal.view, styles.selectableBtns]}>
|
||||||
|
<SelectableBtn
|
||||||
|
current={store.shell.colorMode}
|
||||||
|
value="system"
|
||||||
|
label="System"
|
||||||
|
left
|
||||||
|
onChange={(v: string) => store.shell.setColorMode(v)}
|
||||||
|
/>
|
||||||
|
<SelectableBtn
|
||||||
|
current={store.shell.colorMode}
|
||||||
|
value="light"
|
||||||
|
label="Light"
|
||||||
|
onChange={(v: string) => store.shell.setColorMode(v)}
|
||||||
|
/>
|
||||||
|
<SelectableBtn
|
||||||
|
current={store.shell.colorMode}
|
||||||
|
value="dark"
|
||||||
|
label="Dark"
|
||||||
|
right
|
||||||
|
onChange={(v: string) => store.shell.setColorMode(v)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
<View style={styles.spacer20} />
|
<View style={styles.spacer20} />
|
||||||
|
|
||||||
<Text type="xl-bold" style={[pal.text, styles.heading]}>
|
<Text type="xl-bold" style={[pal.text, styles.heading]}>
|
||||||
|
@ -411,6 +440,45 @@ function AccountDropdownBtn({handle}: {handle: string}) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface SelectableBtnProps {
|
||||||
|
current: string
|
||||||
|
value: string
|
||||||
|
label: string
|
||||||
|
left?: boolean
|
||||||
|
right?: boolean
|
||||||
|
onChange: (v: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectableBtn({
|
||||||
|
current,
|
||||||
|
value,
|
||||||
|
label,
|
||||||
|
left,
|
||||||
|
right,
|
||||||
|
onChange,
|
||||||
|
}: SelectableBtnProps) {
|
||||||
|
const pal = usePalette('default')
|
||||||
|
const palPrimary = usePalette('inverted')
|
||||||
|
return (
|
||||||
|
<Pressable
|
||||||
|
style={[
|
||||||
|
styles.selectableBtn,
|
||||||
|
left && styles.selectableBtnLeft,
|
||||||
|
right && styles.selectableBtnRight,
|
||||||
|
pal.border,
|
||||||
|
current === value ? palPrimary.view : pal.view,
|
||||||
|
]}
|
||||||
|
onPress={() => onChange(value)}
|
||||||
|
accessibilityRole="button"
|
||||||
|
accessibilityLabel={value}
|
||||||
|
accessibilityHint={`Set color theme to ${value}`}>
|
||||||
|
<Text style={current === value ? palPrimary.text : pal.text}>
|
||||||
|
{label}
|
||||||
|
</Text>
|
||||||
|
</Pressable>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
dimmed: {
|
dimmed: {
|
||||||
opacity: 0.5,
|
opacity: 0.5,
|
||||||
|
@ -462,4 +530,43 @@ const styles = StyleSheet.create({
|
||||||
paddingVertical: 8,
|
paddingVertical: 8,
|
||||||
paddingHorizontal: 18,
|
paddingHorizontal: 18,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
colorModeText: {
|
||||||
|
marginLeft: 10,
|
||||||
|
marginBottom: 6,
|
||||||
|
},
|
||||||
|
|
||||||
|
selectableBtns: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
},
|
||||||
|
selectableBtn: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
borderWidth: 1,
|
||||||
|
borderLeftWidth: 0,
|
||||||
|
paddingHorizontal: 10,
|
||||||
|
paddingVertical: 10,
|
||||||
|
},
|
||||||
|
selectableBtnLeft: {
|
||||||
|
borderTopLeftRadius: 8,
|
||||||
|
borderBottomLeftRadius: 8,
|
||||||
|
borderLeftWidth: 1,
|
||||||
|
},
|
||||||
|
selectableBtnRight: {
|
||||||
|
borderTopRightRadius: 8,
|
||||||
|
borderBottomRightRadius: 8,
|
||||||
|
},
|
||||||
|
|
||||||
|
btn: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
width: '100%',
|
||||||
|
borderRadius: 32,
|
||||||
|
padding: 14,
|
||||||
|
backgroundColor: colors.gray1,
|
||||||
|
},
|
||||||
|
toggleBtn: {
|
||||||
|
paddingHorizontal: 0,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import React, {ComponentProps} from 'react'
|
import React, {ComponentProps} from 'react'
|
||||||
import {
|
import {
|
||||||
Linking,
|
Linking,
|
||||||
Pressable,
|
|
||||||
SafeAreaView,
|
SafeAreaView,
|
||||||
StyleProp,
|
StyleProp,
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
|
@ -54,19 +53,6 @@ export const DrawerContent = observer(() => {
|
||||||
|
|
||||||
const {notifications} = store.me
|
const {notifications} = store.me
|
||||||
|
|
||||||
const colorModes = ['light', 'dark', 'system']
|
|
||||||
const modeAccessibilityText = {
|
|
||||||
light: 'Sets display to light mode',
|
|
||||||
dark: 'Sets display to dark mode',
|
|
||||||
system: 'Sets display to system default',
|
|
||||||
}
|
|
||||||
|
|
||||||
const nextColorMode = () => {
|
|
||||||
return colorModes[
|
|
||||||
(colorModes.indexOf(store.shell.colorMode) + 1) % colorModes.length
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
// events
|
// events
|
||||||
// =
|
// =
|
||||||
|
|
||||||
|
@ -125,15 +111,6 @@ export const DrawerContent = observer(() => {
|
||||||
track('Menu:FeedbackClicked')
|
track('Menu:FeedbackClicked')
|
||||||
Linking.openURL(FEEDBACK_FORM_URL)
|
Linking.openURL(FEEDBACK_FORM_URL)
|
||||||
}, [track])
|
}, [track])
|
||||||
|
|
||||||
const onColorModePress = React.useCallback(
|
|
||||||
(mode: string) => {
|
|
||||||
track('Menu:ItemClicked', {url: '#cycleColorMode'})
|
|
||||||
store.shell.setColorMode(mode)
|
|
||||||
},
|
|
||||||
[track, store],
|
|
||||||
)
|
|
||||||
|
|
||||||
// rendering
|
// rendering
|
||||||
// =
|
// =
|
||||||
|
|
||||||
|
@ -294,33 +271,6 @@ export const DrawerContent = observer(() => {
|
||||||
</View>
|
</View>
|
||||||
<View style={s.flex1} />
|
<View style={s.flex1} />
|
||||||
<View style={styles.footer}>
|
<View style={styles.footer}>
|
||||||
<View>
|
|
||||||
<Text type="sm" style={[pal.textLight, styles.colorModeText]}>
|
|
||||||
Set color theme
|
|
||||||
</Text>
|
|
||||||
<View style={styles.selectableBtns}>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="system"
|
|
||||||
label="System"
|
|
||||||
left
|
|
||||||
onChange={onColorModePress}
|
|
||||||
/>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="light"
|
|
||||||
label="Light"
|
|
||||||
onChange={onColorModePress}
|
|
||||||
/>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="dark"
|
|
||||||
label="Dark"
|
|
||||||
right
|
|
||||||
onChange={onColorModePress}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
accessibilityRole="link"
|
accessibilityRole="link"
|
||||||
accessibilityLabel="Send feedback"
|
accessibilityLabel="Send feedback"
|
||||||
|
@ -440,45 +390,6 @@ const InviteCodes = observer(() => {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
interface SelectableBtnProps {
|
|
||||||
current: string
|
|
||||||
value: string
|
|
||||||
label: string
|
|
||||||
left?: boolean
|
|
||||||
right?: boolean
|
|
||||||
onChange: (v: string) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
function SelectableBtn({
|
|
||||||
current,
|
|
||||||
value,
|
|
||||||
label,
|
|
||||||
left,
|
|
||||||
right,
|
|
||||||
onChange,
|
|
||||||
}: SelectableBtnProps) {
|
|
||||||
const pal = usePalette('default')
|
|
||||||
const palPrimary = usePalette('inverted')
|
|
||||||
return (
|
|
||||||
<Pressable
|
|
||||||
style={[
|
|
||||||
styles.selectableBtn,
|
|
||||||
left && styles.selectableBtnLeft,
|
|
||||||
right && styles.selectableBtnRight,
|
|
||||||
pal.border,
|
|
||||||
current === value ? palPrimary.view : pal.view,
|
|
||||||
]}
|
|
||||||
onPress={() => onChange(value)}
|
|
||||||
accessibilityRole="button"
|
|
||||||
accessibilityLabel={value}
|
|
||||||
accessibilityHint={`Set color theme to ${value}`}>
|
|
||||||
<Text style={current === value ? palPrimary.text : pal.text}>
|
|
||||||
{label}
|
|
||||||
</Text>
|
|
||||||
</Pressable>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
view: {
|
view: {
|
||||||
flex: 1,
|
flex: 1,
|
||||||
|
@ -553,49 +464,8 @@ const styles = StyleSheet.create({
|
||||||
marginRight: 6,
|
marginRight: 6,
|
||||||
},
|
},
|
||||||
|
|
||||||
colorModeText: {
|
|
||||||
marginLeft: 10,
|
|
||||||
marginBottom: 6,
|
|
||||||
},
|
|
||||||
|
|
||||||
selectableBtns: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
marginLeft: 10,
|
|
||||||
},
|
|
||||||
selectableBtn: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
justifyContent: 'center',
|
|
||||||
borderWidth: 1,
|
|
||||||
borderLeftWidth: 0,
|
|
||||||
paddingHorizontal: 10,
|
|
||||||
paddingVertical: 10,
|
|
||||||
},
|
|
||||||
selectableBtnLeft: {
|
|
||||||
borderTopLeftRadius: 8,
|
|
||||||
borderBottomLeftRadius: 8,
|
|
||||||
borderLeftWidth: 1,
|
|
||||||
},
|
|
||||||
selectableBtnRight: {
|
|
||||||
borderTopRightRadius: 8,
|
|
||||||
borderBottomRightRadius: 8,
|
|
||||||
},
|
|
||||||
|
|
||||||
btn: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
width: '100%',
|
|
||||||
borderRadius: 32,
|
|
||||||
padding: 14,
|
|
||||||
backgroundColor: colors.gray1,
|
|
||||||
},
|
|
||||||
toggleBtn: {
|
|
||||||
paddingHorizontal: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
footer: {
|
footer: {
|
||||||
flexDirection: 'column',
|
flexDirection: 'row',
|
||||||
rowGap: 10,
|
|
||||||
justifyContent: 'space-between',
|
justifyContent: 'space-between',
|
||||||
paddingRight: 30,
|
paddingRight: 30,
|
||||||
paddingTop: 20,
|
paddingTop: 20,
|
||||||
|
@ -607,9 +477,6 @@ const styles = StyleSheet.create({
|
||||||
padding: 10,
|
padding: 10,
|
||||||
borderRadius: 25,
|
borderRadius: 25,
|
||||||
},
|
},
|
||||||
footerBtnDarkMode: {
|
|
||||||
backgroundColor: colors.black,
|
|
||||||
},
|
|
||||||
footerBtnFeedback: {
|
footerBtnFeedback: {
|
||||||
paddingHorizontal: 24,
|
paddingHorizontal: 24,
|
||||||
},
|
},
|
||||||
|
|
|
@ -52,33 +52,6 @@ export const DesktopRightNav = observer(function DesktopRightNav() {
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
<InviteCodes />
|
<InviteCodes />
|
||||||
<View>
|
|
||||||
<Text type="sm" style={[pal.textLight, styles.colorModeText]}>
|
|
||||||
Set color theme
|
|
||||||
</Text>
|
|
||||||
<View style={styles.selectableBtns}>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="system"
|
|
||||||
label="System"
|
|
||||||
left
|
|
||||||
onChange={(v: string) => store.shell.setColorMode(v)}
|
|
||||||
/>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="light"
|
|
||||||
label="Light"
|
|
||||||
onChange={(v: string) => store.shell.setColorMode(v)}
|
|
||||||
/>
|
|
||||||
<SelectableBtn
|
|
||||||
current={store.shell.colorMode}
|
|
||||||
value="dark"
|
|
||||||
label="Dark"
|
|
||||||
right
|
|
||||||
onChange={(v: string) => store.shell.setColorMode(v)}
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
@ -121,45 +94,6 @@ const InviteCodes = observer(() => {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
interface SelectableBtnProps {
|
|
||||||
current: string
|
|
||||||
value: string
|
|
||||||
label: string
|
|
||||||
left?: boolean
|
|
||||||
right?: boolean
|
|
||||||
onChange: (v: string) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
function SelectableBtn({
|
|
||||||
current,
|
|
||||||
value,
|
|
||||||
label,
|
|
||||||
left,
|
|
||||||
right,
|
|
||||||
onChange,
|
|
||||||
}: SelectableBtnProps) {
|
|
||||||
const pal = usePalette('default')
|
|
||||||
const palPrimary = usePalette('inverted')
|
|
||||||
return (
|
|
||||||
<Pressable
|
|
||||||
style={[
|
|
||||||
styles.selectableBtn,
|
|
||||||
left && styles.selectableBtnLeft,
|
|
||||||
right && styles.selectableBtnRight,
|
|
||||||
pal.border,
|
|
||||||
current === value ? palPrimary.view : pal.view,
|
|
||||||
]}
|
|
||||||
onPress={() => onChange(value)}
|
|
||||||
accessibilityRole="button"
|
|
||||||
accessibilityLabel={value}
|
|
||||||
accessibilityHint={`Set color theme to ${value}`}>
|
|
||||||
<Text style={current === value ? palPrimary.text : pal.text}>
|
|
||||||
{label}
|
|
||||||
</Text>
|
|
||||||
</Pressable>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
rightNav: {
|
rightNav: {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
|
@ -187,59 +121,4 @@ const styles = StyleSheet.create({
|
||||||
inviteCodesIcon: {
|
inviteCodesIcon: {
|
||||||
marginRight: 6,
|
marginRight: 6,
|
||||||
},
|
},
|
||||||
|
|
||||||
cycleColorModeToggle: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
gap: 8,
|
|
||||||
marginHorizontal: 12,
|
|
||||||
},
|
|
||||||
cycleColorModeToggleIcon: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
width: 26,
|
|
||||||
height: 26,
|
|
||||||
borderRadius: 15,
|
|
||||||
},
|
|
||||||
|
|
||||||
colorModeText: {
|
|
||||||
marginLeft: 10,
|
|
||||||
marginBottom: 6,
|
|
||||||
},
|
|
||||||
|
|
||||||
selectableBtns: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
marginLeft: 10,
|
|
||||||
},
|
|
||||||
selectableBtn: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
justifyContent: 'center',
|
|
||||||
borderWidth: 1,
|
|
||||||
borderLeftWidth: 0,
|
|
||||||
paddingHorizontal: 10,
|
|
||||||
paddingVertical: 10,
|
|
||||||
},
|
|
||||||
selectableBtnLeft: {
|
|
||||||
borderTopLeftRadius: 8,
|
|
||||||
borderBottomLeftRadius: 8,
|
|
||||||
borderLeftWidth: 1,
|
|
||||||
},
|
|
||||||
selectableBtnRight: {
|
|
||||||
borderTopRightRadius: 8,
|
|
||||||
borderBottomRightRadius: 8,
|
|
||||||
},
|
|
||||||
|
|
||||||
btn: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
justifyContent: 'center',
|
|
||||||
width: '100%',
|
|
||||||
borderRadius: 32,
|
|
||||||
padding: 14,
|
|
||||||
backgroundColor: colors.gray1,
|
|
||||||
},
|
|
||||||
toggleBtn: {
|
|
||||||
paddingHorizontal: 0,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue