Lambda-School-Labs/startup-grant-database-fe

View on GitHub
src/store/filters/Filters.ts

Summary

Maintainability
A
1 hr
Test Coverage
import {Grant} from "../grants/grantTypes";
import {FilterFormState} from "./filterTypes";

export class Filters {
    private readonly keys: string[];

    constructor(private filters: FilterFormState) {
        this.keys = this.getKeys();
    }

    public filter(grants: Grant[], min: number | null, max: number | null): Grant[];
    public filter(grants: Grant[], key1: string, key2: string): Grant[];

    public filter(param1: Grant[], param2: string | number | null, param3?: string | number | null) {
        if (typeof param2 === 'string') {
            return param1.filter(grant => grant[param2] === param3);
        } else {
            if (!param2 && param3) {
                return param1.filter(grant => grant.amount < param3);
            } else if (!param3 && param2) {
                return param1.filter(grant => grant.amount > param2);
            } else if (param2 && param3) {
                return param1.filter(grant => grant.amount >= param2 && grant.amount <= param3);
            } else {
                return param1;
            }
        }
    }

    getKeys(): string[] {
        return ['amount', 'area_focus', 'geographic_region']
    }

    pristine(): boolean {
        for (let i = 0; i < this.keys.length; i++) {
            if (this.filters[this.keys[i]].filter(item => item.checked).length > 0) {
                return false;
            }
        }
        return true;
    }

    getFilters(): FilterFormState {
        const newObj: FilterFormState = {
            amount: [],
            geographic_region: [],
            area_focus: []
        };
        for (let values of this.keys) {
            newObj[values] = this.filters[values].filter(item => item.checked);
        }
        return newObj;
    }

    amount(grants: Grant[], currentFilters: any[]): Grant[] {
        const returnGrants: Grant[] = [];
        for (let values of currentFilters) {
            const {values: {min, max}} = values;
            this.filter(grants, min, max).forEach(eachGrant => returnGrants.push(eachGrant));
        }
        return returnGrants;
    }

    other(grants: Grant[], currentFilters: any[], key: string): Grant[] {
        let returnGrants: Grant[] = [];
        if (currentFilters.length > 0) {
            for (let values of currentFilters) {
                this.filter(grants, key, values.key).forEach(eachGrant => returnGrants.push(eachGrant));
            }
        } else {
            returnGrants = grants;
        }
        return returnGrants;
    }

}