-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathCampaignMechanicsView.tsx
More file actions
84 lines (76 loc) · 3 KB
/
CampaignMechanicsView.tsx
File metadata and controls
84 lines (76 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import React, { useMemo } from 'react';
import { ScrollView } from 'react-native';
import { useNavigation, useRoute, RouteProp } from '@react-navigation/native';
import { Box } from '@metamask/design-system-react-native';
import { useTailwind } from '@metamask/design-system-twrnc-preset';
import { SafeAreaView } from 'react-native-safe-area-context';
import HeaderCompactStandard from '../../../../component-library/components-temp/HeaderCompactStandard';
import ErrorBoundary from '../../../Views/ErrorBoundary';
import CampaignHowItWorks from '../components/Campaigns/CampaignHowItWorks';
import ContentfulRichText, {
isDocument,
} from '../components/ContentfulRichText/ContentfulRichText';
import { useRewardCampaigns } from '../hooks/useRewardCampaigns';
import { strings } from '../../../../../locales/i18n';
// ParamListBase requires an index signature, which interfaces don't support
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
type CampaignMechanicsRouteParams = {
CampaignMechanics: { campaignId: string };
};
export const CAMPAIGN_MECHANICS_TEST_IDS = {
CONTAINER: 'campaign-mechanics-container',
HOW_IT_WORKS_SECTION: 'campaign-mechanics-how-it-works',
NOTES_SECTION: 'campaign-mechanics-notes',
} as const;
const CampaignMechanicsView: React.FC = () => {
const tw = useTailwind();
const navigation = useNavigation();
const route =
useRoute<RouteProp<CampaignMechanicsRouteParams, 'CampaignMechanics'>>();
const { campaignId } = route.params;
const { campaigns } = useRewardCampaigns();
const campaign = useMemo(
() => campaigns.find((c) => c.id === campaignId) ?? null,
[campaigns, campaignId],
);
const howItWorks = campaign?.details?.howItWorks ?? null;
const notes = howItWorks?.notes ?? null;
return (
<ErrorBoundary navigation={navigation} view="CampaignMechanicsView">
<SafeAreaView
edges={{ bottom: 'additive' }}
style={tw.style('flex-1 bg-default')}
testID={CAMPAIGN_MECHANICS_TEST_IDS.CONTAINER}
>
<HeaderCompactStandard
title={strings('rewards.campaign_mechanics.title')}
onBack={() => navigation.goBack()}
backButtonProps={{ testID: 'campaign-mechanics-back-button' }}
includesTopInset
/>
<ScrollView
showsVerticalScrollIndicator={false}
contentContainerStyle={tw.style('pb-4')}
>
{howItWorks && (
<Box
twClassName="px-4 py-4 border-b border-border-muted"
testID={CAMPAIGN_MECHANICS_TEST_IDS.HOW_IT_WORKS_SECTION}
>
<CampaignHowItWorks howItWorks={howItWorks} />
</Box>
)}
{isDocument(notes) && (
<Box
twClassName="px-4 py-4"
testID={CAMPAIGN_MECHANICS_TEST_IDS.NOTES_SECTION}
>
<ContentfulRichText document={notes} />
</Box>
)}
</ScrollView>
</SafeAreaView>
</ErrorBoundary>
);
};
export default CampaignMechanicsView;