# give/4.18.0/src/Promotions/sharedResources/hooks/useRecommendations.ts

GiveWP – Donation Plugin and Fundraising Platform, version 4.18.0. 58 lines.

- Page: https://pluginprobe.com/plugins/give/4.18.0/code/src/Promotions/sharedResources/hooks/useRecommendations.ts
- Raw: https://pluginprobe.com/plugins/give/4.18.0/raw/src/Promotions/sharedResources/hooks/useRecommendations.ts
- Modified: 2023-05-18T23:16:42+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/give/4.18.0/code/src/Promotions/sharedResources/hooks/useRecommendations.ts#L10-L20`.

```typescript
import {useCallback, useState} from 'react';
import dismissRecommendation from '@givewp/promotions/requests/dismissRecommendation';

type EnumValues =
    | 'givewp_donations_recurring_recommendation_dismissed'
    | 'givewp_donations_fee_recovery_recommendation_dismissed'
    | 'givewp_donations_designated_funds_recommendation_dismissed'
    | 'givewp_reports_recurring_recommendation_dismissed'
    | 'givewp_reports_fee_recovery_recommendation_dismissed'
    | 'givewp_donors_fee_recovery_recommendation_dismissed'
    | 'givewp_reports_fee_recovery_recommendation_dismissed';

export interface RecommendedProductData {
    enum: EnumValues;
    documentationPage: string;
    message: string;
    innerHtml: string;
}

/**
 * @since 2.27.1
 */
export function useRecommendations(apiSettings, options) {
    const [dismissedRecommendations, setDismissedRecommendations] = useState<string[]>(
        apiSettings.dismissedRecommendations
    );

    const getRandomRecommendation = useCallback((): RecommendedProductData | null => {
        const availableOptions = options.filter((option) => !dismissedRecommendations.includes(option.enum));

        if (availableOptions.length === 0) {
            return null;
        }

        const randomIndex = Math.floor(Math.random() * availableOptions.length);

        return availableOptions[randomIndex];
    }, [dismissedRecommendations]);

    const getRecommendation = useCallback((): RecommendedProductData | null => {
        const availableOptions = options.filter((option) => !dismissedRecommendations.includes(option.enum));

        if (availableOptions.length === 0) {
            return null;
        }

        return availableOptions[0];
    }, [dismissedRecommendations]);

    const removeRecommendation = async (data: {option: EnumValues}): Promise<void> => {
        setDismissedRecommendations((prev) => [...prev, data.option]);

        await dismissRecommendation(data.option, apiSettings.apiNonce);
    };

    return {getRecommendation, getRandomRecommendation, removeRecommendation};
}

```
