Add searchbar autofocus

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2023-07-29 23:23:22 +03:00
parent e794832f38
commit 7b39d80c9b
10 changed files with 72 additions and 6 deletions

View File

@@ -79,7 +79,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1 versionCode 1
versionName "0.0.3" versionName "0.0.4"
} }
signingConfigs { signingConfigs {
debug { debug {

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "@karaolidis/terminally-online", "name": "@karaolidis/terminally-online",
"version": "0.0.3", "version": "0.0.4",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@karaolidis/terminally-online", "name": "@karaolidis/terminally-online",
"version": "0.0.3", "version": "0.0.4",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@bankify/redux-persist-realm": "^0.1.3", "@bankify/redux-persist-realm": "^0.1.3",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@karaolidis/terminally-online", "name": "@karaolidis/terminally-online",
"version": "0.0.3", "version": "0.0.4",
"private": true, "private": true,
"scripts": { "scripts": {
"postinstall": "patch-package", "postinstall": "patch-package",

View File

@@ -41,10 +41,12 @@ const memesHeaderStyles = StyleSheet.create({
const MemesHeader = ({ const MemesHeader = ({
search, search,
setSearch, setSearch,
autoFocus,
...props ...props
}: { }: {
search: string; search: string;
setSearch: (search: string) => void; setSearch: (search: string) => void;
autoFocus: boolean;
} & ComponentProps<typeof View>) => { } & ComponentProps<typeof View>) => {
const { colors } = useTheme(); const { colors } = useTheme();
const sort = useSelector((state: RootState) => state.memes.sort); const sort = useSelector((state: RootState) => state.memes.sort);
@@ -86,6 +88,7 @@ const MemesHeader = ({
placeholder="Search Memes" placeholder="Search Memes"
value={search} value={search}
onChangeText={setSearch} onChangeText={setSearch}
autoFocus={autoFocus}
/> />
<View style={memesHeaderStyles.buttonView}> <View style={memesHeaderStyles.buttonView}>
<View style={memesHeaderStyles.buttonSection}> <View style={memesHeaderStyles.buttonSection}>

View File

@@ -25,10 +25,12 @@ const tagsHeaderStyles = StyleSheet.create({
const TagsHeader = ({ const TagsHeader = ({
search, search,
setSearch, setSearch,
autoFocus,
...props ...props
}: { }: {
search: string; search: string;
setSearch: (search: string) => void; setSearch: (search: string) => void;
autoFocus: boolean;
} & ComponentProps<typeof View>) => { } & ComponentProps<typeof View>) => {
const sort = useSelector((state: RootState) => state.tags.sort); const sort = useSelector((state: RootState) => state.tags.sort);
const sortDirection = useSelector( const sortDirection = useSelector(
@@ -60,6 +62,7 @@ const TagsHeader = ({
onChangeText={(value: string) => { onChangeText={(value: string) => {
setSearch(value); setSearch(value);
}} }}
autoFocus={autoFocus}
/> />
<View style={tagsHeaderStyles.buttonView}> <View style={tagsHeaderStyles.buttonView}>
<Menu <Menu

View File

@@ -48,6 +48,9 @@ const Memes = () => {
const navVisisble = useSelector( const navVisisble = useSelector(
(state: RootState) => state.navigation.navVisible, (state: RootState) => state.navigation.navVisible,
); );
const autoFocus = useSelector(
(state: RootState) => state.settings.autoFocusMemesSearch,
);
const dispatch = useDispatch(); const dispatch = useDispatch();
const [flashListPadding, setFlashListPadding] = useState(0); const [flashListPadding, setFlashListPadding] = useState(0);
@@ -141,6 +144,7 @@ const Memes = () => {
<MemesHeader <MemesHeader
search={search} search={search}
setSearch={setSearch} setSearch={setSearch}
autoFocus={autoFocus}
onLayout={event => { onLayout={event => {
setFlashListPadding( setFlashListPadding(
event.nativeEvent.layout.height + event.nativeEvent.layout.height +

View File

@@ -13,6 +13,8 @@ import { useDispatch, useSelector } from 'react-redux';
import type {} from 'redux-thunk/extend-redux'; import type {} from 'redux-thunk/extend-redux';
import { import {
RootState, RootState,
setAutofocusMemesSearch,
setAutofocusTagsSearch,
setGridColumns, setGridColumns,
setMasonryColumns, setMasonryColumns,
setNoMedia, setNoMedia,
@@ -34,6 +36,12 @@ const settingsStyles = StyleSheet.create({
marginBottom: 15, marginBottom: 15,
paddingHorizontal: '2%', paddingHorizontal: '2%',
}, },
autoFocusSwitch: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingHorizontal: '2%',
marginBottom: 15,
},
hideMediaSwitch: { hideMediaSwitch: {
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'space-between', justifyContent: 'space-between',
@@ -44,6 +52,12 @@ const settingsStyles = StyleSheet.create({
const Settings = () => { const Settings = () => {
const { colors } = useTheme(); const { colors } = useTheme();
const noMedia = useSelector((state: RootState) => state.settings.noMedia); const noMedia = useSelector((state: RootState) => state.settings.noMedia);
const autoFocusMemesSearch = useSelector(
(state: RootState) => state.settings.autoFocusMemesSearch,
);
const autoFocusTagsSearch = useSelector(
(state: RootState) => state.settings.autoFocusTagsSearch,
);
const masonryColumns = useSelector( const masonryColumns = useSelector(
(state: RootState) => state.settings.masonryColumns, (state: RootState) => state.settings.masonryColumns,
); );
@@ -89,6 +103,24 @@ const Settings = () => {
]}> ]}>
<List.Section> <List.Section>
<List.Subheader>Views</List.Subheader> <List.Subheader>Views</List.Subheader>
<View style={settingsStyles.autoFocusSwitch}>
<Text>Autofocus Memes Searchbar</Text>
<Switch
value={autoFocusMemesSearch}
onValueChange={value => {
void dispatch(setAutofocusMemesSearch(value));
}}
/>
</View>
<View style={settingsStyles.autoFocusSwitch}>
<Text>Autofocus Tags Searchbar</Text>
<Switch
value={autoFocusTagsSearch}
onValueChange={value => {
void dispatch(setAutofocusTagsSearch(value));
}}
/>
</View>
<Text style={settingsStyles.columnSegmentedButtons}> <Text style={settingsStyles.columnSegmentedButtons}>
Masonry Columns Masonry Columns
</Text> </Text>

View File

@@ -44,6 +44,9 @@ const Tags = () => {
const navVisisble = useSelector( const navVisisble = useSelector(
(state: RootState) => state.navigation.navVisible, (state: RootState) => state.navigation.navVisible,
); );
const autoFocus = useSelector(
(state: RootState) => state.settings.autoFocusTagsSearch,
);
const dispatch = useDispatch(); const dispatch = useDispatch();
const [flashListPadding, setFlashListPadding] = useState(0); const [flashListPadding, setFlashListPadding] = useState(0);
@@ -114,6 +117,7 @@ const Tags = () => {
<TagsHeader <TagsHeader
search={search} search={search}
setSearch={setSearch} setSearch={setSearch}
autoFocus={autoFocus}
onLayout={event => { onLayout={event => {
setFlashListPadding(event.nativeEvent.layout.height); setFlashListPadding(event.nativeEvent.layout.height);
}} }}

View File

@@ -54,6 +54,8 @@ export {
type SettingsState, type SettingsState,
setStorageUri, setStorageUri,
setNoMedia, setNoMedia,
setAutofocusMemesSearch,
setAutofocusTagsSearch,
setMasonryColumns, setMasonryColumns,
setGridColumns, setGridColumns,
validateSettings, validateSettings,

View File

@@ -11,6 +11,8 @@ import { RootState } from '.';
interface SettingsState { interface SettingsState {
storageUri: string | undefined; storageUri: string | undefined;
noMedia: boolean; noMedia: boolean;
autoFocusMemesSearch: boolean;
autoFocusTagsSearch: boolean;
masonryColumns: 1 | 2 | 3 | 4; masonryColumns: 1 | 2 | 3 | 4;
gridColumns: 1 | 2 | 3 | 4; gridColumns: 1 | 2 | 3 | 4;
} }
@@ -18,6 +20,8 @@ interface SettingsState {
const initialState: SettingsState = { const initialState: SettingsState = {
storageUri: undefined, storageUri: undefined,
noMedia: false, noMedia: false,
autoFocusMemesSearch: false,
autoFocusTagsSearch: false,
masonryColumns: 2, masonryColumns: 2,
gridColumns: 3, gridColumns: 3,
}; };
@@ -32,6 +36,12 @@ const settingsSlice = createSlice({
setNoMedia: (state, action: PayloadAction<boolean>) => { setNoMedia: (state, action: PayloadAction<boolean>) => {
state.noMedia = action.payload; state.noMedia = action.payload;
}, },
setAutofocusMemesSearch: (state, action: PayloadAction<boolean>) => {
state.autoFocusMemesSearch = action.payload;
},
setAutofocusTagsSearch: (state, action: PayloadAction<boolean>) => {
state.autoFocusTagsSearch = action.payload;
},
setMasonryColumns: (state, action: PayloadAction<1 | 2 | 3 | 4>) => { setMasonryColumns: (state, action: PayloadAction<1 | 2 | 3 | 4>) => {
state.masonryColumns = action.payload; state.masonryColumns = action.payload;
}, },
@@ -41,8 +51,14 @@ const settingsSlice = createSlice({
}, },
}); });
const { setStorageUri, setNoMedia, setMasonryColumns, setGridColumns } = const {
settingsSlice.actions; setStorageUri,
setNoMedia,
setAutofocusMemesSearch,
setAutofocusTagsSearch,
setMasonryColumns,
setGridColumns,
} = settingsSlice.actions;
const updateStorageUri = createAsyncThunk( const updateStorageUri = createAsyncThunk(
'settings/updateStorageUri', 'settings/updateStorageUri',
@@ -122,6 +138,8 @@ export {
type SettingsState, type SettingsState,
updateStorageUri as setStorageUri, updateStorageUri as setStorageUri,
updateNoMedia as setNoMedia, updateNoMedia as setNoMedia,
setAutofocusMemesSearch,
setAutofocusTagsSearch,
setMasonryColumns, setMasonryColumns,
setGridColumns, setGridColumns,
validateSettings, validateSettings,