diff --git a/native/account/registration/keyserver-selection.react.js b/native/account/registration/keyserver-selection.react.js
index ee308f7da..07deed61d 100644
--- a/native/account/registration/keyserver-selection.react.js
+++ b/native/account/registration/keyserver-selection.react.js
@@ -1,97 +1,113 @@
// @flow
import * as React from 'react';
import { Text, TextInput } from 'react-native';
import RegistrationContainer from './registration-container.react.js';
import type { RegistrationNavigationProp } from './registration-navigator.react.js';
import {
RegistrationTile,
RegistrationTileHeader,
} from './registration-tile.react.js';
import CommIcon from '../../components/comm-icon.react.js';
import type { NavigationRoute } from '../../navigation/route-names.js';
import { useStyles, useColors } from '../../themes/colors.js';
+type Selection = 'ashoat' | 'custom';
+
type Props = {
+navigation: RegistrationNavigationProp<'KeyserverSelection'>,
+route: NavigationRoute<'KeyserverSelection'>,
};
// eslint-disable-next-line no-unused-vars
function KeyserverSelection(props: Props): React.Node {
+ const [currentSelection, setCurrentSelection] = React.useState();
+ const selectAshoat = React.useCallback(() => {
+ setCurrentSelection('ashoat');
+ }, []);
+ const selectCustom = React.useCallback(() => {
+ setCurrentSelection('custom');
+ }, []);
+
const styles = useStyles(unboundStyles);
const colors = useColors();
return (
Select a keyserver to join
Chat communities on Comm are hosted on keyservers, which are
user-operated backends.
Keyservers allow Comm to offer strong privacy guarantees without
sacrificing functionality.
-
+
ashoat
Ashoat is Comm’s founder, and his keyserver currently hosts most of
the communities on Comm.
-
+
Enter a keyserver
);
}
const unboundStyles = {
header: {
fontSize: 24,
color: 'panelForegroundLabel',
paddingBottom: 16,
},
body: {
fontSize: 15,
lineHeight: 20,
color: 'panelForegroundSecondaryLabel',
paddingBottom: 16,
},
tileTitleText: {
flex: 1,
fontSize: 18,
color: 'panelForegroundLabel',
},
tileBody: {
fontSize: 13,
color: 'panelForegroundSecondaryLabel',
},
cloud: {
marginRight: 8,
},
keyserverInput: {
color: 'panelForegroundLabel',
borderColor: 'panelSecondaryForegroundBorder',
borderWidth: 1,
borderRadius: 4,
padding: 12,
},
};
export default KeyserverSelection;
diff --git a/native/account/registration/registration-tile.react.js b/native/account/registration/registration-tile.react.js
index 92a38832a..965c3880e 100644
--- a/native/account/registration/registration-tile.react.js
+++ b/native/account/registration/registration-tile.react.js
@@ -1,76 +1,131 @@
// @flow
import * as React from 'react';
-import { View } from 'react-native';
+import { View, TouchableOpacity } from 'react-native';
import { useStyles } from '../../themes/colors.js';
+type RegistrationTileContextType = { +selected: boolean };
+const defaultRegistrationTileContext = { selected: false };
+const RegistrationTileContext =
+ React.createContext(
+ defaultRegistrationTileContext,
+ );
+
type TileProps = {
+children: React.Node,
+ +selected: boolean,
+ +onSelect: () => mixed,
};
function RegistrationTile(props: TileProps): React.Node {
- const { children } = props;
+ const { children, selected, onSelect } = props;
const [body, header] = React.useMemo(() => {
let registrationBody = children;
let registrationHeader;
if (Array.isArray(children)) {
registrationBody = [];
for (const child of children) {
if (child.type.name === RegistrationTileHeader.name) {
registrationHeader = React.cloneElement(child);
} else {
registrationBody.push(child);
}
}
}
return [registrationBody, registrationHeader];
}, [children]);
+ const registrationTileContext = React.useMemo(
+ () => ({ selected }),
+ [selected],
+ );
+
const styles = useStyles(unboundStyles);
+ const tileStyle = React.useMemo(
+ () => (selected ? [styles.tile, styles.selectedTile] : styles.tile),
+ [styles, selected],
+ );
+
return (
-
- {header}
- {body}
-
+
+
+ {header}
+ {body}
+
+
);
}
type HeaderProps = {
+children: React.Node,
};
function RegistrationTileHeader(props: HeaderProps): React.Node {
const { children } = props;
+ const { selected } = React.useContext(RegistrationTileContext);
const styles = useStyles(unboundStyles);
+ const tileRadioStyle = React.useMemo(
+ () =>
+ selected
+ ? [styles.tileRadio, styles.selectedTileRadio]
+ : styles.tileRadio,
+ [styles, selected],
+ );
+ const tileRadioInnerStyle = React.useMemo(
+ () => (selected ? styles.tileRadioInner : undefined),
+ [styles, selected],
+ );
+
return (
{children}
-
+
+
+
);
}
const unboundStyles = {
tile: {
- backgroundColor: 'panelForeground',
paddingHorizontal: 16,
paddingVertical: 20,
borderRadius: 8,
marginTop: 24,
+ borderWidth: 1,
+ backgroundColor: 'panelForeground',
+ },
+ selectedTile: {
+ borderColor: 'panelForegroundLabel',
},
tileTitle: {
paddingBottom: 16,
flexDirection: 'row',
alignItems: 'center',
},
tileRadio: {
borderColor: 'panelSecondaryForegroundBorder',
borderWidth: 1,
height: 24,
width: 24,
borderRadius: 12,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ tileRadioInner: {
+ backgroundColor: 'panelForegroundLabel',
+ height: 16,
+ width: 16,
+ borderRadius: 8,
+ },
+ selectedTileRadio: {
+ borderColor: 'panelForegroundLabel',
},
};
export { RegistrationTile, RegistrationTileHeader };