Add searchbar autofocus
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -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
4
package-lock.json
generated
@@ -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",
|
||||||
|
@@ -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",
|
||||||
|
@@ -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}>
|
||||||
|
@@ -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
|
||||||
|
@@ -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 +
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
}}
|
}}
|
||||||
|
@@ -54,6 +54,8 @@ export {
|
|||||||
type SettingsState,
|
type SettingsState,
|
||||||
setStorageUri,
|
setStorageUri,
|
||||||
setNoMedia,
|
setNoMedia,
|
||||||
|
setAutofocusMemesSearch,
|
||||||
|
setAutofocusTagsSearch,
|
||||||
setMasonryColumns,
|
setMasonryColumns,
|
||||||
setGridColumns,
|
setGridColumns,
|
||||||
validateSettings,
|
validateSettings,
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user