[HomeScreen]: filter by mode

This commit is contained in:
Dawid Wysokiński 2021-04-05 10:30:15 +02:00
parent d766a321c1
commit 3539e6b622
4 changed files with 30 additions and 8 deletions

View File

@ -54,12 +54,21 @@ export const SavedQualificationsProvider = ({
[setSavedQualifications],
);
const isSaved = useCallback(
(id: number) => {
return savedQualifications.includes(id);
},
[savedQualifications],
);
if (loading) {
return null;
}
return (
<Context.Provider value={{ savedQualifications, saveQualification }}>
<Context.Provider
value={{ savedQualifications, saveQualification, isSaved }}
>
{children}
</Context.Provider>
);

View File

@ -2,11 +2,13 @@ import { createContext } from 'react';
export type ContextState = {
savedQualifications: number[];
saveQualification: (id: number, save: boolean) => Promise<void> | void;
saveQualification: (id: number, save: boolean) => void;
isSaved: (id: number) => boolean;
};
export const context = createContext<ContextState>({
savedQualifications: [],
saveQualification: () => {},
isSaved: () => false,
});
context.displayName = 'SavedQualificationsContext';

View File

@ -2,6 +2,7 @@ import React, { useMemo, useState } from 'react';
import { sortBy } from 'lodash';
import { NetworkStatus, useQuery } from '@apollo/client';
import { useVariables } from 'libs/native-base';
import { useSavedQualifications } from 'libs/savedqualifications';
import { Query, QueryProfessionsArgs } from 'libs/graphql';
import { QUERY_PROFESSIONS } from './queries';
@ -14,6 +15,7 @@ const HomeScreen = () => {
const [search, setSearch] = useState('');
const [mode, setMode] = useState(Mode.All);
const variables = useVariables();
const { isSaved } = useSavedQualifications();
const { loading, data, refetch, networkStatus } = useQuery<
Pick<Query, 'professions'>,
QueryProfessionsArgs
@ -31,7 +33,7 @@ const HomeScreen = () => {
}));
}, [data]);
const filteredProfessions = useMemo(() => {
if (!search) {
if (!search && mode === Mode.All) {
return professions;
}
return professions
@ -39,12 +41,14 @@ const HomeScreen = () => {
...profession,
qualifications: profession.qualifications.filter(
qualification =>
qualification.name.toLowerCase().includes(search) ||
qualification.code.toLowerCase().includes(search),
(!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]);
}, [search, professions, mode, isSaved]);
return (
<Container>

View File

@ -1,10 +1,11 @@
import React, { useState } from 'react';
import { FlatListProps, RefreshControl } from 'react-native';
import React, { useRef, useState } from 'react';
import { Maybe, Profession, Qualification } from 'libs/graphql';
import { FlatListProps, RefreshControl } from 'react-native';
import { List, View } from 'native-base';
import Item from './Item';
import QualificationModal from './QualificationModal';
import { useUpdateEffect } from 'react-use';
export interface ProfessionsProps
extends Pick<FlatListProps<Profession>, 'refreshing' | 'onRefresh'> {
@ -16,14 +17,20 @@ const Professions = ({
refreshing,
onRefresh,
}: ProfessionsProps) => {
const listRef = useRef<any>(null);
const [selectedQualification, setSelectedQualification] = useState<
Maybe<Qualification>
>(null);
const [showModal, setShowModal] = useState(false);
useUpdateEffect(() => {
listRef.current?._root?.scrollToOffset({ offset: 0, animated: false });
}, [professions]);
return (
<View style={{ flex: 1 }}>
<List
ref={listRef}
dataArray={professions}
renderItem={({ item }: { item: Profession }) => {
return (