diff --git a/client/Dockerfile b/client/Dockerfile index 72b1b3f..673ad61 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app COPY *.html *.json *.ts ./ COPY ./src ./src COPY ./public ./public -RUN npm ci --ignore-scripts --no-update-notifier --omit=dev && \ +RUN npm i --ignore-scripts --no-update-notifier --omit=dev && \ npm run build && \ rm -rf node_modules diff --git a/client/src/context/FilterContext.ts b/client/src/context/FilterContext.ts new file mode 100644 index 0000000..2682d0e --- /dev/null +++ b/client/src/context/FilterContext.ts @@ -0,0 +1,12 @@ +import { createContext } from 'react'; + +export interface FilterContextData { + filterText: string; + selectedOption: string; + setFilterText: (text: string) => void; + setSelectedOption: (option: string) => void; +} + +const FilterContext = createContext({} as FilterContextData); + +export default FilterContext; diff --git a/client/src/context/FilterProvider.tsx b/client/src/context/FilterProvider.tsx new file mode 100644 index 0000000..dd7f01a --- /dev/null +++ b/client/src/context/FilterProvider.tsx @@ -0,0 +1,49 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import FilterContext, { FilterContextData } from './FilterContext'; + +const FILTER_TEXT_KEY = 'FILTER_TEXT'; +const FILTER_OPTION_KEY = 'FILTER_OPTION'; + +interface Props { + children: React.ReactNode; +} + +const FilterProvider: React.FC = ({ children }: Props) => { + const [filterText, setFilterTextState] = useState( + () => localStorage.getItem(FILTER_TEXT_KEY) ?? '' + ); + const [selectedOption, setSelectedOptionState] = useState( + () => localStorage.getItem(FILTER_OPTION_KEY) ?? 'everything' + ); + + useEffect(() => { + localStorage.setItem(FILTER_TEXT_KEY, filterText); + }, [filterText]); + + useEffect(() => { + localStorage.setItem(FILTER_OPTION_KEY, selectedOption); + }, [selectedOption]); + + const setFilterText = (text: string): void => { + setFilterTextState(text); + }; + + const setSelectedOption = (option: string): void => { + setSelectedOptionState(option); + }; + + const contextValue: FilterContextData = useMemo(() => ({ + filterText, + selectedOption, + setFilterText, + setSelectedOption + }), [filterText, selectedOption]); + + return ( + + {children} + + ); +}; + +export default FilterProvider;