remove unnecessary permissions, use useEffect instead of useMemo for filtering professions
This commit is contained in:
parent
43d85a8b67
commit
33bf925ea8
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}
|
||||
|
|
Reference in New Issue