remove unnecessary permissions, use useEffect instead of useMemo for filtering professions

This commit is contained in:
Dawid Wysokiński 2021-04-21 19:46:04 +02:00
parent 43d85a8b67
commit 33bf925ea8
3 changed files with 55 additions and 30 deletions

View File

@ -1,27 +1,36 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.dawidwysokinski.zdamegzaminzawodowy">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:node="remove" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
tools:node="remove" />
<application
android:name=".MainApplication"
android:allowBackup="false"
android:icon="@mipmap/bootsplash_logo"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
</activity>
android:windowSoftInputMode="adjustResize"></activity>
<activity
android:name="com.zoontek.rnbootsplash.RNBootSplashActivity"
android:theme="@style/BootTheme"
android:launchMode="singleTask">
android:launchMode="singleTask"
android:theme="@style/BootTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

View File

@ -2,7 +2,6 @@ import React, { useMemo, useState } from 'react';
import { NetworkStatus, useQuery } from '@apollo/client';
import { useUpdateEffect } from 'react-use';
import { useVariables } from 'libs/native-base';
import { useSavedQualifications } from 'libs/savedqualifications';
import { Query, QueryProfessionsArgs } from 'libs/graphql';
import { EMAIL } from 'config/app';
import { QUERY_PROFESSIONS } from './queries';
@ -18,7 +17,6 @@ const HomeScreen = () => {
const [search, setSearch] = useState('');
const [mode, setMode] = useState(Mode.All);
const variables = useVariables();
const { isSaved } = useSavedQualifications();
const { loading, data, refetch, networkStatus, error } = useQuery<
Pick<Query, 'professions'>,
QueryProfessionsArgs
@ -32,23 +30,6 @@ const HomeScreen = () => {
profession => profession.qualifications.length > 0,
);
}, [data]);
const filteredProfessions = useMemo(() => {
if (!search && mode === Mode.All) {
return professions;
}
return professions
.map(profession => ({
...profession,
qualifications: profession.qualifications.filter(
qualification =>
(!search ||
qualification.name.toLowerCase().includes(search) ||
qualification.code.toLowerCase().includes(search)) &&
(mode === Mode.All || isSaved(qualification.id)),
),
}))
.filter(profession => profession.qualifications.length > 0);
}, [search, professions, mode, isSaved]);
useUpdateEffect(() => {
if (error && error.networkError) {
Alert.alert(
@ -75,9 +56,11 @@ const HomeScreen = () => {
</Content>
) : (
<Professions
professions={filteredProfessions}
professions={professions}
refreshing={networkStatus === NetworkStatus.refetch}
onRefresh={refetch}
mode={mode}
search={search}
/>
)}
</Container>

View File

@ -1,6 +1,8 @@
import React, { useCallback, useRef, useState } from 'react';
import { useUpdateEffect } from 'react-use';
import { useSavedQualifications } from 'libs/savedqualifications';
import { Maybe, Profession, Qualification } from 'libs/graphql';
import { Mode } from '../ModeSelector/ModeSelector';
import { FlatListProps, RefreshControl, StyleSheet } from 'react-native';
import { List, View } from 'native-base';
@ -11,21 +13,52 @@ import ListEmpty from './ListEmpty';
export interface ProfessionsProps
extends Pick<FlatListProps<Profession>, 'refreshing' | 'onRefresh'> {
professions: Profession[];
mode: Mode;
search: string;
}
const noop = () => {};
const Professions = ({
professions,
refreshing,
onRefresh,
mode,
search,
}: ProfessionsProps) => {
const listRef = useRef<any>(null);
const { isSaved } = useSavedQualifications();
const [filteredProfessions, setFilteredProfessions] = useState<
Maybe<Profession[]>
>(null);
const [selectedQualification, setSelectedQualification] = useState<
Maybe<Qualification>
>(null);
const [showModal, setShowModal] = useState(false);
useUpdateEffect(() => {
listRef.current?._root?.scrollToOffset({ offset: 0, animated: false });
}, [professions]);
}, [mode]);
useUpdateEffect(() => {
if (!search && mode === Mode.All && filteredProfessions) {
setFilteredProfessions(null);
return;
}
const newFilteredProfessions: Profession[] = [];
professions.forEach(profession => {
const qualifications = profession.qualifications.filter(
qualification =>
(!search ||
qualification.name.toLowerCase().includes(search) ||
qualification.code.toLowerCase().includes(search)) &&
(mode === Mode.All || isSaved(qualification.id)),
);
if (qualifications.length > 0) {
newFilteredProfessions.push({ ...profession, qualifications });
}
});
setFilteredProfessions(newFilteredProfessions);
}, [professions, search, mode, isSaved]);
const handlePress = useCallback(
(qualification: Qualification) => {
@ -46,7 +79,7 @@ const Professions = ({
<View style={styles.container}>
<List
ref={listRef}
dataArray={professions}
dataArray={filteredProfessions ?? professions}
contentContainerStyle={styles.contentContainer}
renderItem={renderItem}
ListEmptyComponent={<ListEmpty />}
@ -55,7 +88,7 @@ const Professions = ({
refreshControl={
<RefreshControl
refreshing={refreshing ?? false}
onRefresh={onRefresh ?? (() => {})}
onRefresh={onRefresh ?? noop}
/>
}
initialNumToRender={5}