From b753e0f7ca50c61735e0ccaae633a85178a92c81 Mon Sep 17 00:00:00 2001 From: Antonin Date: Tue, 23 Jul 2024 14:50:56 +0200 Subject: [PATCH] chore: fix no resolution --- app/(tabs)/actions/phoning/campaign/brief.tsx | 115 ++++---- .../actions/phoning/campaign/scoreboard.tsx | 56 ++-- app/(tabs)/actions/phoning/index.tsx | 69 ++--- .../session/[device]/call/status-picker.tsx | 245 ++++++++---------- app/(tabs)/actions/phoning/tutorial.tsx | 19 +- scripts/prepare-action-markers.ts | 2 +- src/core/entities/Profile.ts | 9 - src/core/entities/UserScope.ts | 10 - .../IdentifyUserOnErrorMonitorInteractor.ts | 15 -- src/data/LocalNotificationCenter.ts | 12 + src/data/ProfileRepository.ts | 14 +- src/data/mapper/ProfileMapper.ts | 77 ------ src/data/mapper/ProfileUpdateMapper.ts | 53 ---- src/data/mapper/UserScopeMapper.ts | 31 --- src/data/restObjects/RestUserScope.ts | 13 - src/hooks/useInit.ts | 2 - .../actions/ActionsNavigatorParamList.ts | 18 -- .../actions/ActionsNavigatorScreenProps.ts | 11 - .../AuthenticatedRootNavigatorParamList.ts | 4 - src/navigation/home/HomeNavigatorParamList.ts | 11 - .../home/HomeNavigatorScreenProps.ts | 10 - .../ListPickerModalNavigatorParamList.ts | 12 - .../tabBar/TabBarNavigatorParamList.ts | 13 - .../tabBar/TabBarNavigatorScreenProps.ts | 9 - src/screens/doorToDoor/DoorToDoorScreen.tsx | 80 ++---- .../PhoningCampaignBriefNavigationData.ts | 5 - ...honingCampaignScoreboardNavigationData.tsx | 5 - src/screens/polls/PollsScreen.tsx | 56 +--- src/screens/polls/usePollsScreen.hook.ts | 11 +- src/screens/regions/RegionScreen.tsx | 23 +- .../retaliation/RetaliationDetailScreen.tsx | 26 +- .../retaliations/RetaliationsScreen.tsx | 59 +---- .../useRetaliationsScreen.hook.ts | 14 +- 33 files changed, 282 insertions(+), 827 deletions(-) delete mode 100644 src/core/entities/Profile.ts delete mode 100644 src/core/entities/UserScope.ts delete mode 100644 src/core/interactor/IdentifyUserOnErrorMonitorInteractor.ts create mode 100644 src/data/LocalNotificationCenter.ts delete mode 100644 src/data/mapper/ProfileMapper.ts delete mode 100644 src/data/mapper/ProfileUpdateMapper.ts delete mode 100644 src/data/mapper/UserScopeMapper.ts delete mode 100644 src/data/restObjects/RestUserScope.ts delete mode 100644 src/navigation/actions/ActionsNavigatorParamList.ts delete mode 100644 src/navigation/actions/ActionsNavigatorScreenProps.ts delete mode 100644 src/navigation/home/HomeNavigatorParamList.ts delete mode 100644 src/navigation/home/HomeNavigatorScreenProps.ts delete mode 100644 src/navigation/listPickerModal/ListPickerModalNavigatorParamList.ts delete mode 100644 src/navigation/tabBar/TabBarNavigatorParamList.ts delete mode 100644 src/navigation/tabBar/TabBarNavigatorScreenProps.ts delete mode 100644 src/screens/phoningCampaignBrief/PhoningCampaignBriefNavigationData.ts delete mode 100644 src/screens/phoningCampaignScoreboard/PhoningCampaignScoreboardNavigationData.tsx diff --git a/app/(tabs)/actions/phoning/campaign/brief.tsx b/app/(tabs)/actions/phoning/campaign/brief.tsx index da5c4ade7..94d79411e 100644 --- a/app/(tabs)/actions/phoning/campaign/brief.tsx +++ b/app/(tabs)/actions/phoning/campaign/brief.tsx @@ -1,71 +1,64 @@ -import React, { FunctionComponent, useEffect } from 'react' +import React from 'react' import { ScrollView, StyleSheet, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' -import Markdown from '@ronradtke/react-native-markdown-display' -import { ActionsNavigatorScreenProps } from '@/navigation/actions/ActionsNavigatorScreenProps' +import { useCampaignStore } from '@/data/store/phoning' +import { BorderlessButton, PrimaryButton } from '@/screens/shared/Buttons' import { Colors, Spacing, Styles, Typography } from '@/styles' import i18n from '@/utils/i18n' -import { BorderlessButton, PrimaryButton } from '@/screens/shared/Buttons' -import { Stack, router } from 'expo-router' -import { useCampaignStore } from '@/data/store/phoning' - -type PhoningCampaignBriefScreenProps = - ActionsNavigatorScreenProps<'PhoningCampaignBrief'> +import Markdown from '@ronradtke/react-native-markdown-display' +import { router, Stack } from 'expo-router' -const PhoningCampaignBriefScreen: FunctionComponent< - PhoningCampaignBriefScreenProps -> = () => { - const { campaign } = useCampaignStore() - return ( - - - - - {campaign.brief} - - - - - router.push({ - pathname: '/(tabs)/actions/phoning/session/[device]/', - params: { device: 'current' }, - }) - } - /> - - router.push({ - pathname: '/(tabs)/actions/phoning/session/[device]/', - params: { device: 'external' }, - }) - } - /> - - - ) +const PhoningCampaignBriefScreen = () => { + const { campaign } = useCampaignStore() + return ( + + + + + {campaign.brief} + + + + + router.push({ + pathname: '/(tabs)/actions/phoning/session/[device]/', + params: { device: 'current' }, + }) + } + /> + + router.push({ + pathname: '/(tabs)/actions/phoning/session/[device]/', + params: { device: 'external' }, + }) + } + /> + + + ) } const styles = StyleSheet.create({ - bottomContainer: { - ...Styles.topElevatedContainerStyle, - backgroundColor: Colors.defaultBackground, - paddingHorizontal: Spacing.margin, - paddingTop: Spacing.margin, - }, - container: { - backgroundColor: Colors.defaultBackground, - flex: 1, - }, - markdownContainer: { - padding: Spacing.margin, - }, - linkText: { - ...Styles.seeMoreButtonTextStyle, - }, + bottomContainer: { + ...Styles.topElevatedContainerStyle, + backgroundColor: Colors.defaultBackground, + paddingHorizontal: Spacing.margin, + paddingTop: Spacing.margin, + }, + container: { + backgroundColor: Colors.defaultBackground, + flex: 1, + }, + markdownContainer: { + padding: Spacing.margin, + }, + linkText: { + ...Styles.seeMoreButtonTextStyle, + }, }) export default PhoningCampaignBriefScreen diff --git a/app/(tabs)/actions/phoning/campaign/scoreboard.tsx b/app/(tabs)/actions/phoning/campaign/scoreboard.tsx index 463f5080c..b8e373250 100644 --- a/app/(tabs)/actions/phoning/campaign/scoreboard.tsx +++ b/app/(tabs)/actions/phoning/campaign/scoreboard.tsx @@ -1,46 +1,36 @@ -import React, { FunctionComponent, useEffect } from 'react' +import React, { useEffect } from 'react' import { StyleSheet } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' -import { ActionsNavigatorScreenProps } from '@/navigation/actions/ActionsNavigatorScreenProps' +import { useCampaignStore } from '@/data/store/phoning' +import { PhoningScoreboardRowViewModelMapper } from '@/screens/phoningCampaignScoreboard/PhoningScoreboardRowViewModelMapper' +import { PhoningCampaignRankingView } from '@/screens/shared/PhoningCampaignRankingView' import { Colors, Spacing } from '@/styles' import i18n from '@/utils/i18n' -import { PhoningCampaignRankingView } from '@/screens/shared/PhoningCampaignRankingView' -import { PhoningScoreboardRowViewModelMapper } from '@/screens/phoningCampaignScoreboard/PhoningScoreboardRowViewModelMapper' -import {router, useLocalSearchParams, useNavigation} from 'expo-router' -import{ useCampaignStore } from '@/data/store/phoning' +import { useNavigation } from 'expo-router' -type PhoningCampaignScoreboardScreenProps = - ActionsNavigatorScreenProps<'PhoningCampaignScoreboard'> +const PhoningCampaignScoreboardScreen = () => { + const navigation = useNavigation() + const { campaign } = useCampaignStore() -const PhoningCampaignScoreboardScreen: FunctionComponent< - PhoningCampaignScoreboardScreenProps -> = () => { - const navigation = useNavigation() - const { campaign } = useCampaignStore() - - useEffect(() => { - navigation.setOptions({ - title: i18n.t('phoning.scoreboard.title'), - }) - }, [navigation]) + useEffect(() => { + navigation.setOptions({ + title: i18n.t('phoning.scoreboard.title'), + }) + }, [navigation]) - return ( - - - - ) + return ( + + + + ) } const styles = StyleSheet.create({ - container: { - backgroundColor: Colors.defaultBackground, - flex: 1, - padding: Spacing.margin, - }, + container: { + backgroundColor: Colors.defaultBackground, + flex: 1, + padding: Spacing.margin, + }, }) export default PhoningCampaignScoreboardScreen diff --git a/app/(tabs)/actions/phoning/index.tsx b/app/(tabs)/actions/phoning/index.tsx index df53bd3b7..64c57e6ec 100644 --- a/app/(tabs)/actions/phoning/index.tsx +++ b/app/(tabs)/actions/phoning/index.tsx @@ -1,53 +1,36 @@ -import React, { FunctionComponent, useCallback, useState } from 'react' -import { - FlatList, - ListRenderItemInfo, - StyleSheet, - Text, - View, -} from 'react-native' -import { useFocusEffect } from '@react-navigation/native' +import React, { useCallback, useState } from 'react' +import { FlatList, ListRenderItemInfo, StyleSheet, Text, View } from 'react-native' import { PhoningCampaign } from '@/core/entities/PhoningCampaign' -import { - PhoningCharterNotAccepted, - PhoningCharterState, -} from '@/core/entities/PhoningCharterState' +import { PhoningCharterNotAccepted, PhoningCharterState } from '@/core/entities/PhoningCharterState' import PhoningCampaignRepository from '@/data/PhoningCampaignRepository' -import { ActionsNavigatorScreenProps } from '@/navigation/actions/ActionsNavigatorScreenProps' -import { Colors, Spacing, Typography } from '@/styles' -import i18n from '@/utils/i18n' -import { StatefulView } from '@/screens/shared/StatefulView' -import { ViewState } from '@/screens/shared/ViewState' -import { ViewStateUtils } from '@/screens/shared/ViewStateUtils' +import { useCampaignStore, useCharterStore } from '@/data/store/phoning' import PhoningCallContactRow from '@/screens/phoning/callContact/CallContactRow' import PhoningCampaignRow from '@/screens/phoning/campaign/PhoningCampaignRow' import { PhoningRowViewModel } from '@/screens/phoning/PhoningRowViewModel' import { PhoningViewModel } from '@/screens/phoning/PhoningViewModel' import { PhoningViewModelMapper } from '@/screens/phoning/PhoningViewModelMapper' import PhoningTutorialRow from '@/screens/phoning/tutorial/PhoningTutorialRow' +import { StatefulView } from '@/screens/shared/StatefulView' +import { ViewState } from '@/screens/shared/ViewState' +import { ViewStateUtils } from '@/screens/shared/ViewStateUtils' +import { Colors, Spacing, Typography } from '@/styles' +import i18n from '@/utils/i18n' +import { useFocusEffect } from '@react-navigation/native' import { router } from 'expo-router' -import { useCampaignStore, useCharterStore } from '@/data/store/phoning' - -type PhoningScreenProps = ActionsNavigatorScreenProps<'Phoning'> - export interface PhoningResources { campaigns: PhoningCampaign[] } -const PhoningScreen: FunctionComponent = () => { +const PhoningScreen = () => { const [isRefreshing, setRefreshing] = useState(false) const [currentResources, setResources] = useState({ campaigns: [], }) const { setCampaign } = useCampaignStore() const { setCharter } = useCharterStore() - const [charterState, setCharterState] = useState< - PhoningCharterState | undefined - >() - const [statefulState, setStatefulState] = useState< - ViewState - >(ViewState.Loading()) + const [charterState, setCharterState] = useState() + const [statefulState, setStatefulState] = useState>(ViewState.Loading()) const fetchData = useCallback(() => { setRefreshing(true) @@ -117,9 +100,7 @@ const PhoningScreen: FunctionComponent = () => { const campaign = findCampaignInCurrentResources(item.value.id) if (campaign?.permanent) { setCampaign(campaign) - router.push( - '/(tabs)/actions/phoning/session/loader-permanent-campaign', - ) + router.push('/(tabs)/actions/phoning/session/loader-permanent-campaign') } }} /> @@ -129,17 +110,13 @@ const PhoningScreen: FunctionComponent = () => { { - const selectedCampaign = findCampaignInCurrentResources( - item.value.id, - ) + const selectedCampaign = findCampaignInCurrentResources(item.value.id) if (selectedCampaign) { navigateToCampaign(selectedCampaign) } }} onRankButtonPressed={() => { - const selectedCampaign = findCampaignInCurrentResources( - item.value.id, - ) + const selectedCampaign = findCampaignInCurrentResources(item.value.id) if (selectedCampaign) { setCampaign(selectedCampaign) router.push('/(tabs)/actions/phoning/campaign/scoreboard') @@ -166,25 +143,17 @@ const PhoningScreen: FunctionComponent = () => { keyExtractor={(item) => item.value.id} refreshing={isRefreshing} onRefresh={fetchData} - ListHeaderComponent={ - {phoningViewModel.title} - } + ListHeaderComponent={{phoningViewModel.title}} ListEmptyComponent={ - - {i18n.t('phoning.subtitle_no_campaigns')} - + {i18n.t('phoning.subtitle_no_campaigns')} } contentContainerStyle={styles.contentContainer} /> ) } - return ( - - {} - - ) + return {} } const styles = StyleSheet.create({ diff --git a/app/(tabs)/actions/phoning/session/[device]/call/status-picker.tsx b/app/(tabs)/actions/phoning/session/[device]/call/status-picker.tsx index e03fdaf9c..e62e5740a 100644 --- a/app/(tabs)/actions/phoning/session/[device]/call/status-picker.tsx +++ b/app/(tabs)/actions/phoning/session/[device]/call/status-picker.tsx @@ -1,21 +1,9 @@ -import React, { - FunctionComponent, - useCallback, - useEffect, - useState, -} from 'react' -import { - FlatList, - ListRenderItemInfo, - StyleSheet, - Text, - View, -} from 'react-native' +import React, { useCallback, useEffect, useState } from 'react' +import { FlatList, ListRenderItemInfo, StyleSheet, Text, View } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' import { PhoningSessionCallStatus } from '@/core/entities/PhoningSessionConfiguration' import PhoningCampaignRepository from '@/data/PhoningCampaignRepository' -import { Colors, Spacing, Styles, Typography } from '@/styles' -import i18n from '@/utils/i18n' +import { useCampaignStore, useSessionStore } from '@/data/store/phoning' import { PhonePollDetailCallStatusViewModelMapper } from '@/screens/phonePollDetail/PhonePollDetailCallStatusViewModelMapper' import QuestionChoiceRow from '@/screens/pollDetail/QuestionChoiceRow' import { QuestionChoiceRowViewModel } from '@/screens/pollDetail/QuestionChoiceRowViewModel' @@ -27,144 +15,127 @@ import { StatefulView } from '@/screens/shared/StatefulView' import { usePreventGoingBack } from '@/screens/shared/usePreventGoingBack.hook' import { ViewState } from '@/screens/shared/ViewState' import { ViewStateUtils } from '@/screens/shared/ViewStateUtils' +import { Colors, Spacing, Styles, Typography } from '@/styles' +import i18n from '@/utils/i18n' +import { router, Stack, useLocalSearchParams } from 'expo-router' -import { useSessionStore, useCampaignStore } from '@/data/store/phoning' -import { Stack, router, useLocalSearchParams } from 'expo-router' +const PhoneCallStatusPickerScreen = () => { + const [statefulState, setStatefulState] = useState>>(ViewState.Loading()) + const [selectedStatusCode, setSelectedStatusCode] = useState() + const [isLoading, setLoading] = useState(false) + const { session } = useSessionStore() + const { campaign } = useCampaignStore() + const { device } = useLocalSearchParams<{ device: 'current' | 'external' }>() -const PhoneCallStatusPickerScreen= () => { - const [statefulState, setStatefulState] = useState< - ViewState> - >(ViewState.Loading()) + const fetchCallStatuses = useCallback(() => { + PhoningCampaignRepository.getInstance() + .getPhoningSessionConfiguration(session.id) + .then((configuration) => configuration.callStatus.finished) + .then((callStatuses) => setStatefulState(ViewState.Content(callStatuses))) + .catch((error) => { + setStatefulState(ViewStateUtils.networkError(error, fetchCallStatuses)) + }) + }, [session.id]) - const [selectedStatusCode, setSelectedStatusCode] = useState() - const [isLoading, setLoading] = useState(false) - const { session } = useSessionStore() - const { campaign } = useCampaignStore(); - const { device } = useLocalSearchParams<{ device: 'current' | 'external' }>() + useEffect(() => { + fetchCallStatuses() + }, [fetchCallStatuses]) - const fetchCallStatuses = useCallback(() => { - PhoningCampaignRepository.getInstance() - .getPhoningSessionConfiguration(session.id) - .then((configuration) => configuration.callStatus.finished) - .then((callStatuses) => setStatefulState(ViewState.Content(callStatuses))) - .catch((error) => { - setStatefulState(ViewStateUtils.networkError(error, fetchCallStatuses)) - }) - }, [session.id]) + usePreventGoingBack() - useEffect(() => { - fetchCallStatuses() - }, [fetchCallStatuses]) + const renderItem = ({ item }: ListRenderItemInfo) => { + return setSelectedStatusCode(item.id)} /> + } - usePreventGoingBack() + const sendStatusCodeAndLeave = (statusCode: string) => { + setLoading(true) + PhoningCampaignRepository.getInstance() + .updatePhoningSessionStatus(session.id, statusCode) + .then(() => { + router.replace({ + pathname: '/(tabs)/actions/phoning/session/[device]/call/failure', + params: { device }, + }) + }) + .catch((error) => { + AlertUtils.showNetworkAlert(error, () => sendStatusCodeAndLeave(statusCode)) + }) + .finally(() => setLoading(true)) + } - const renderItem = ({ - item, - }: ListRenderItemInfo) => { - return ( - setSelectedStatusCode(item.id)} - /> - ) + const onAction = (statusCode: string) => { + if (statusCode === 'answered') { + router.replace({ + pathname: '/(tabs)/actions/phoning/session/[device]/poll/detail', + params: { device }, + }) + } else { + sendStatusCodeAndLeave(statusCode) } + } - const sendStatusCodeAndLeave = (statusCode: string) => { - setLoading(true) - PhoningCampaignRepository.getInstance() - .updatePhoningSessionStatus(session.id, statusCode) - .then(() => { - router.replace({ - pathname:'/(tabs)/actions/phoning/session/[device]/call/failure', - params: { device } - }) - }) - .catch((error) => { - AlertUtils.showNetworkAlert(error, () => - sendStatusCodeAndLeave(statusCode), - ) - }) - .finally(() => setLoading(true)) - } - - const onAction = (statusCode: string) => { - if (statusCode === 'answered') { - router.replace({ - pathname:'/(tabs)/actions/phoning/session/[device]/poll/detail', - params: { device } - }) - } else { - sendStatusCodeAndLeave(statusCode) - } - } - - const Content = (callStatuses: Array) => { - const viewModel = PhonePollDetailCallStatusViewModelMapper.map( - callStatuses, - selectedStatusCode, - ) - - return ( - - - item.id.toString()} - renderItem={renderItem} - ListHeaderComponent={() => { - return ( - <> - - {session.adherent.info} - - - - ) - }} - /> - - selectedStatusCode && onAction(selectedStatusCode)} - title={i18n.t('phoningsession.status_picker.action')} - /> - - - ) - } + const Content = (callStatuses: Array) => { + const viewModel = PhonePollDetailCallStatusViewModelMapper.map(callStatuses, selectedStatusCode) return ( - - - - + + + item.id.toString()} + renderItem={renderItem} + ListHeaderComponent={() => { + return ( + <> + {session.adherent.info} + + + ) + }} + /> + + selectedStatusCode && onAction(selectedStatusCode)} + title={i18n.t('phoningsession.status_picker.action')} + /> + + ) + } + + return ( + + + + + ) } const styles = StyleSheet.create({ - bottomContainer: { - ...Styles.elevatedContainerStyle, - flexDirection: 'row', - justifyContent: 'center', - paddingVertical: Spacing.margin, - }, - container: { - backgroundColor: Colors.defaultBackground, - flex: 1, - }, - content: { - flex: 1, - overflow: 'hidden', // hide the shadow on the bottom - }, - listContainer: { - paddingHorizontal: Spacing.margin, - }, - title: { - ...Typography.title, - }, + bottomContainer: { + ...Styles.elevatedContainerStyle, + flexDirection: 'row', + justifyContent: 'center', + paddingVertical: Spacing.margin, + }, + container: { + backgroundColor: Colors.defaultBackground, + flex: 1, + }, + content: { + flex: 1, + overflow: 'hidden', // hide the shadow on the bottom + }, + listContainer: { + paddingHorizontal: Spacing.margin, + }, + title: { + ...Typography.title, + }, }) export default PhoneCallStatusPickerScreen diff --git a/app/(tabs)/actions/phoning/tutorial.tsx b/app/(tabs)/actions/phoning/tutorial.tsx index 3dc749439..f33b1ba93 100644 --- a/app/(tabs)/actions/phoning/tutorial.tsx +++ b/app/(tabs)/actions/phoning/tutorial.tsx @@ -1,28 +1,21 @@ import React, { FunctionComponent, useCallback, useState } from 'react' import { ScrollView, StyleSheet, View } from 'react-native' -import { useFocusEffect } from '@react-navigation/native' -import Markdown from '@ronradtke/react-native-markdown-display' import PhoningCampaignRepository from '@/data/PhoningCampaignRepository' -import { ActionsNavigatorScreenProps } from '@/navigation/actions/ActionsNavigatorScreenProps' -import { Colors, Spacing, Typography } from '@/styles' -import i18n from '@/utils/i18n' import { StatefulView } from '@/screens/shared/StatefulView' import { ViewState } from '@/screens/shared/ViewState' import { ViewStateUtils } from '@/screens/shared/ViewStateUtils' +import { Colors, Spacing, Typography } from '@/styles' +import i18n from '@/utils/i18n' +import { useFocusEffect } from '@react-navigation/native' +import Markdown from '@ronradtke/react-native-markdown-display' import { Stack } from 'expo-router' -type PhoningTutorialScreenProps = ActionsNavigatorScreenProps<'PhoningTutorial'> - export interface TutorialResources { content: string } -const PhoningTutorialScreen: FunctionComponent< - PhoningTutorialScreenProps -> = () => { - const [statefulState, setStatefulState] = useState< - ViewState - >(ViewState.Loading()) +const PhoningTutorialScreen = () => { + const [statefulState, setStatefulState] = useState>(ViewState.Loading()) const fetchData = useCallback(() => { setStatefulState(ViewState.Loading()) diff --git a/scripts/prepare-action-markers.ts b/scripts/prepare-action-markers.ts index c6f2d93d2..009e6212d 100644 --- a/scripts/prepare-action-markers.ts +++ b/scripts/prepare-action-markers.ts @@ -1,7 +1,7 @@ import fs from 'fs' import path from 'path' import { flow } from 'fp-ts/lib/function' -import { ActionType } from '../src/data/restObjects/RestActions' +import { ActionType } from '../src/services/actions/schema' type MarkerSuffix = 'passed' | 'cancelled' type MarkerState = ActionType | `${ActionType}Active` diff --git a/src/core/entities/Profile.ts b/src/core/entities/Profile.ts deleted file mode 100644 index 9f05375d8..000000000 --- a/src/core/entities/Profile.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Profile { - firstName: string - lastName: string - uuid: string - email: string - zipCode: string - totalSurveys: number - totalSurveysLastMonth: number -} diff --git a/src/core/entities/UserScope.ts b/src/core/entities/UserScope.ts deleted file mode 100644 index af7f6321e..000000000 --- a/src/core/entities/UserScope.ts +++ /dev/null @@ -1,10 +0,0 @@ -export enum UserScopeCode { - DOOR_TO_DOOR, - PHONING, - NATIONAL, - DEPUTY, -} - -export interface UserScope { - code: UserScopeCode -} diff --git a/src/core/interactor/IdentifyUserOnErrorMonitorInteractor.ts b/src/core/interactor/IdentifyUserOnErrorMonitorInteractor.ts deleted file mode 100644 index a383b458b..000000000 --- a/src/core/interactor/IdentifyUserOnErrorMonitorInteractor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import ProfileRepository from '../../data/ProfileRepository' -import { ErrorMonitor } from '../../utils/ErrorMonitor' - -export class IdentifyUserOnErrorMonitorInteractor { - private profileRepository = ProfileRepository.getInstance() - - public async execute() { - try { - const profile = await this.profileRepository.getProfile('remote') - ErrorMonitor.setUser({ id: profile.uuid, email: profile.email }) - } catch { - // no op - } - } -} diff --git a/src/data/LocalNotificationCenter.ts b/src/data/LocalNotificationCenter.ts new file mode 100644 index 000000000..c4f4135ef --- /dev/null +++ b/src/data/LocalNotificationCenter.ts @@ -0,0 +1,12 @@ +export interface LocalNotification { + title?: string + body: string + deeplinkUrl?: string +} + +export const LocalNotificationCenter = { + post: (_: LocalNotification) => {}, + observeDeeplinkUrl: (_: (url: string) => void): (() => void) => { + return + }, +} diff --git a/src/data/ProfileRepository.ts b/src/data/ProfileRepository.ts index 95d2a54b0..03d81450f 100644 --- a/src/data/ProfileRepository.ts +++ b/src/data/ProfileRepository.ts @@ -46,14 +46,8 @@ class ProfileRepository { return profile } - public async updateDetailedProfile( - profileUuid: string, - newProfile: PersonalInformationsForm, - ): Promise { - await this.apiService.updateProfile( - profileUuid, - ProfileUpdateMapper.mapPersonalInformationForm(newProfile), - ) + public async updateDetailedProfile(profileUuid: string, newProfile: PersonalInformationsForm): Promise { + await this.apiService.updateProfile(profileUuid, ProfileUpdateMapper.mapPersonalInformationForm(newProfile)) } public async getZipCode(): Promise { @@ -65,9 +59,7 @@ class ProfileRepository { } } - public async getCityFromPostalCode( - postalCode: string, - ): Promise { + public async getCityFromPostalCode(postalCode: string): Promise { return this.apiService.getCityFromPostalCode(postalCode) } diff --git a/src/data/mapper/ProfileMapper.ts b/src/data/mapper/ProfileMapper.ts deleted file mode 100644 index e12568248..000000000 --- a/src/data/mapper/ProfileMapper.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - Address, - DetailedProfile, - PhoneNumber, -} from '../../core/entities/DetailedProfile' -import { Profile } from '../../core/entities/Profile' -import i18n from '../../utils/i18n' -import { - RestDetailedProfileResponse, - RestPhoneNumber, - RestPostAddress, -} from '../restObjects/RestDetailedProfileResponse' -import { RestProfileResponse } from '../restObjects/RestProfileResponse' -import { GenderMapper } from './GenderMapper' - -export const ProfileMapper = { - map: (result: RestProfileResponse): Profile => { - return { - firstName: result.first_name, - lastName: result.last_name, - email: result.email_address, - uuid: result.uuid, - zipCode: result.postal_code, - totalSurveys: result.surveys.total, - totalSurveysLastMonth: result.surveys.last_month, - } - }, - mapDetailedProfile: ( - result: RestDetailedProfileResponse, - ): DetailedProfile => { - return { - uuid: result.uuid, - firstName: result.first_name, - lastName: result.last_name, - gender: GenderMapper.mapToGender(result.gender), - customGender: result.custom_gender ?? undefined, - nationality: - result.nationality !== null && result.nationality.length > 0 - ? result.nationality - : i18n.t('personalinformation.default_country_code'), - birthDate: new Date(result.birthdate), - address: postAddress(result.post_address), - email: result.email_address ?? undefined, - facebook: result.facebook_page_url ?? undefined, - linkedin: result.linkedin_page_url ?? undefined, - twitter: result.twitter_page_url ?? undefined, - telegram: result.telegram_page_url ?? undefined, - phone: phoneNumber(result.phone), - interests: result.interests.map((interest) => interest.code), - subscriptions: result.subscription_types.map( - (subscription) => subscription.code, - ), - } - }, -} - -const postAddress = (restPostAddress: RestPostAddress | null): Address => { - return { - address: restPostAddress?.address ?? undefined, - postalCode: restPostAddress?.postal_code ?? undefined, - city: restPostAddress?.city_name ?? undefined, - country: restPostAddress?.country ?? undefined, - } -} - -const phoneNumber = ( - restPhoneNumber: RestPhoneNumber | null, -): PhoneNumber | undefined => { - if (restPhoneNumber == null) return undefined - return { - countryCode: - restPhoneNumber.country.length > 0 - ? restPhoneNumber.country - : i18n.t('personalinformation.default_country_code'), - number: restPhoneNumber.number, - } -} diff --git a/src/data/mapper/ProfileUpdateMapper.ts b/src/data/mapper/ProfileUpdateMapper.ts deleted file mode 100644 index f5e10f6e7..000000000 --- a/src/data/mapper/ProfileUpdateMapper.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { format } from 'date-fns' -import { PersonalInformationsForm } from '../../screens/personalInformation/PersonalInformationsForm' -import { - RestUpdatePhoneNumber, - RestUpdatePostAddress, - RestUpdateProfileRequest, -} from '../restObjects/RestUpdateProfileRequest' -import { GenderMapper } from './GenderMapper' - -export const ProfileUpdateMapper = { - mapPersonalInformationForm: ( - profile: PersonalInformationsForm, - ): RestUpdateProfileRequest => { - let phone: RestUpdatePhoneNumber | null - if (profile.phoneNumber.length > 0 && profile.phoneCountryCode.length > 0) { - phone = { - country: profile.phoneCountryCode, - number: profile.phoneNumber, - } - } else { - phone = null - } - let address: RestUpdatePostAddress | null - if (profile.address) { - address = { - address: profile.address.address ?? '', - postal_code: profile.address.postalCode ?? '', - city_name: profile.address.city ?? '', - country: profile.address.country ?? '', - } - } else { - address = null - } - const birthDate = profile.birthdate - ? format(profile.birthdate, 'yyyy-MM-dd') - : null - return { - first_name: profile.firstName, - last_name: profile.lastName, - gender: GenderMapper.mapFromGender(profile.gender), - custom_gender: profile.customGender ?? null, - birthdate: birthDate, - nationality: profile.countryCode, - address: address, - email_address: profile.email, - phone: phone, - facebook_page_url: profile.facebook ?? '', - linkedin_page_url: profile.linkedin ?? '', - twitter_page_url: profile.twitter ?? '', - telegram_page_url: profile.telegram ?? '', - } - }, -} diff --git a/src/data/mapper/UserScopeMapper.ts b/src/data/mapper/UserScopeMapper.ts deleted file mode 100644 index 23b2b887e..000000000 --- a/src/data/mapper/UserScopeMapper.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { UserScope, UserScopeCode } from '../../core/entities/UserScope' -import { RestUserScope } from '../restObjects/RestUserScope' - -export const UserScopeMapper = { - map: (scopes: Array): Array => { - return scopes - .filter((scope) => { - switch (scope.code) { - case 'phoning': - case 'national': - case 'deputy': - case 'pap': - return true - default: - return false - } - }) - .map((scope) => { - switch (scope.code) { - case 'phoning': - return { code: UserScopeCode.PHONING } - case 'national': - return { code: UserScopeCode.NATIONAL } - case 'deputy': - return { code: UserScopeCode.DEPUTY } - case 'pap': - return { code: UserScopeCode.DOOR_TO_DOOR } - } - }) - }, -} diff --git a/src/data/restObjects/RestUserScope.ts b/src/data/restObjects/RestUserScope.ts deleted file mode 100644 index 20f0df37d..000000000 --- a/src/data/restObjects/RestUserScope.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface RestUserScope { - code: string // cf https://github.com/EnMarche/en-marche.fr/blob/master/features/api/scopes.feature#L53-L60 - name: string - zones: Array - apps: Array - features: Array -} - -export interface RestUserScopeZone { - uuid: string - code: string - name: string -} diff --git a/src/hooks/useInit.ts b/src/hooks/useInit.ts index 575a9a992..99426ffba 100644 --- a/src/hooks/useInit.ts +++ b/src/hooks/useInit.ts @@ -1,6 +1,5 @@ import { useEffect } from 'react' import { ROUTES } from '@/config/routes' -import { IdentifyUserOnErrorMonitorInteractor } from '@/core/interactor/IdentifyUserOnErrorMonitorInteractor' import { useSession } from '@/ctx/SessionProvider' import PushRepository from '@/data/PushRepository' import { Analytics, AnalyticsScreens } from '@/utils/Analytics' @@ -31,7 +30,6 @@ export default function useInitPushNotification() { useEffect(() => { if (session) { Analytics.enable() - new IdentifyUserOnErrorMonitorInteractor().execute() SendDoorToDoorPollAnswersJobWorker.getInstance().then((worker) => { worker.start() }) diff --git a/src/navigation/actions/ActionsNavigatorParamList.ts b/src/navigation/actions/ActionsNavigatorParamList.ts deleted file mode 100644 index 92a15caf0..000000000 --- a/src/navigation/actions/ActionsNavigatorParamList.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DoorToDoorAddress } from '../../core/entities/DoorToDoor' -import { PhoningCampaignBriefNavigationData } from '../../screens/phoningCampaignBrief/PhoningCampaignBriefNavigationData' -import { PhoningCampaignScoreboardNavigationData } from '../../screens/phoningCampaignScoreboard/PhoningCampaignScoreboardNavigationData' -import { PhoningCharterNavigationData } from '../../screens/phoningCharter/PhoningCharterNavigationData' - -export type ActionsNavigatorParamList = { - Actions: undefined - Polls: undefined - Phoning: undefined - PhoningCharter: { data: PhoningCharterNavigationData } - PhoningTutorial: undefined - PhoningCampaignBrief: { data: PhoningCampaignBriefNavigationData } - PhoningCampaignScoreboard: { data: PhoningCampaignScoreboardNavigationData } - DoorToDoor: undefined - BuildingDetail: { address: DoorToDoorAddress } - Retaliations: undefined - RetaliationDetail: { retaliationId: string } -} diff --git a/src/navigation/actions/ActionsNavigatorScreenProps.ts b/src/navigation/actions/ActionsNavigatorScreenProps.ts deleted file mode 100644 index 96d9ec86c..000000000 --- a/src/navigation/actions/ActionsNavigatorScreenProps.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CompositeScreenProps } from '@react-navigation/native' -import { StackScreenProps } from '@react-navigation/stack' -import { TabBarNavigatorScreenProps } from '../tabBar/TabBarNavigatorScreenProps' -import { ActionsNavigatorParamList } from './ActionsNavigatorParamList' - -export type ActionsNavigatorScreenProps< - T extends keyof ActionsNavigatorParamList, -> = CompositeScreenProps< - StackScreenProps, - TabBarNavigatorScreenProps -> diff --git a/src/navigation/authenticatedRoot/AuthenticatedRootNavigatorParamList.ts b/src/navigation/authenticatedRoot/AuthenticatedRootNavigatorParamList.ts index a1a9c0447..2ccb2af6e 100644 --- a/src/navigation/authenticatedRoot/AuthenticatedRootNavigatorParamList.ts +++ b/src/navigation/authenticatedRoot/AuthenticatedRootNavigatorParamList.ts @@ -1,17 +1,14 @@ import { NavigatorScreenParams } from '@react-navigation/native' import { DoorToDoorTunnelModalNavigatorParamList } from '../doorToDoorTunnelModal/DoorToDoorTunnelModalNavigatorParamList' import { EventsFilterModalNavigatorParamList } from '../eventsFilterModal/EventsFilterModalNavigatorParamList' -import { ListPickerModalNavigatorParamList } from '../listPickerModal/ListPickerModalNavigatorParamList' import { LocationPickerModalNavigatorParamList } from '../locationPickerModal/LocationPickerModalNavigatorParamList' import { NewsDetailModalNavigatorParamList } from '../newsDetailModal/NewsDetailModalNavigatorParamList' import { PersonalInformationModalNavigatorParamList } from '../personalInformationModal/PersonalInformationModalNavigatorParamList' import { PhoningSessionModalNavigatorParamList } from '../phoningSessionModal/PhoningSessionModalNavigatorParamList' import { PollDetailModalNavigatorParamList } from '../pollDetailModal/PollDetailModalNavigatorParamList' import { ProfileModalNavigatorParamList } from '../profileModal/ProfileModalNavigatorParamList' -import { TabBarNavigatorParamList } from '../tabBar/TabBarNavigatorParamList' export type AuthenticatedRootNavigatorParamList = { - TabBarNavigator: NavigatorScreenParams PollDetailModal: NavigatorScreenParams PhoningSessionModal: NavigatorScreenParams ProfileModal: NavigatorScreenParams @@ -20,5 +17,4 @@ export type AuthenticatedRootNavigatorParamList = { EventsFilterModal: NavigatorScreenParams LocationPickerModal: NavigatorScreenParams PersonalInformationModal: NavigatorScreenParams - ListPickerModal: NavigatorScreenParams } diff --git a/src/navigation/home/HomeNavigatorParamList.ts b/src/navigation/home/HomeNavigatorParamList.ts deleted file mode 100644 index 1ebe32ee0..000000000 --- a/src/navigation/home/HomeNavigatorParamList.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DoorToDoorAddress } from '../../core/entities/DoorToDoor' - -export type HomeNavigatorParamList = { - Home: undefined - Region: { zipCode: string } - News: undefined - EventDetails: { eventId: string } - RetaliationDetail: { retaliationId: string } - DoorToDoor: undefined - BuildingDetail: { address: DoorToDoorAddress } -} diff --git a/src/navigation/home/HomeNavigatorScreenProps.ts b/src/navigation/home/HomeNavigatorScreenProps.ts deleted file mode 100644 index ee63ade61..000000000 --- a/src/navigation/home/HomeNavigatorScreenProps.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { CompositeScreenProps } from '@react-navigation/native' -import { StackScreenProps } from '@react-navigation/stack' -import { TabBarNavigatorScreenProps } from '../tabBar/TabBarNavigatorScreenProps' -import { HomeNavigatorParamList } from './HomeNavigatorParamList' - -export type HomeNavigatorScreenProps = - CompositeScreenProps< - StackScreenProps, - TabBarNavigatorScreenProps - > diff --git a/src/navigation/listPickerModal/ListPickerModalNavigatorParamList.ts b/src/navigation/listPickerModal/ListPickerModalNavigatorParamList.ts deleted file mode 100644 index e85393c8a..000000000 --- a/src/navigation/listPickerModal/ListPickerModalNavigatorParamList.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ListPickerItem } from '../../screens/listPicker/ListPickerItem' - -export type ListPickerModalNavigatorParamList = { - ListPicker: { - title: string - items: ListPickerItem[] - selectedItemId?: string - onItemSelected?: (id: string) => void - displaySearch?: boolean - presentationType?: 'push' | 'modal' - } -} diff --git a/src/navigation/tabBar/TabBarNavigatorParamList.ts b/src/navigation/tabBar/TabBarNavigatorParamList.ts deleted file mode 100644 index f444bf020..000000000 --- a/src/navigation/tabBar/TabBarNavigatorParamList.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NavigatorScreenParams } from '@react-navigation/native' -import { ActionsNavigatorParamList } from '../actions/ActionsNavigatorParamList' -import { EventNavigatorParamList } from '../event/EventNavigatorParamList' -import { HomeNavigatorParamList } from '../home/HomeNavigatorParamList' -import { NewsNavigatorParamList } from '../news/NewsNavigatorParamList' - -export type TabBarNavigatorParamList = { - HomeNavigator: NavigatorScreenParams - NewsNavigator: NavigatorScreenParams - ActionsNavigator: NavigatorScreenParams - Tools: undefined - EventNavigator: NavigatorScreenParams -} diff --git a/src/navigation/tabBar/TabBarNavigatorScreenProps.ts b/src/navigation/tabBar/TabBarNavigatorScreenProps.ts deleted file mode 100644 index 06df93cd3..000000000 --- a/src/navigation/tabBar/TabBarNavigatorScreenProps.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BottomTabScreenProps } from '@react-navigation/bottom-tabs' -import { CompositeScreenProps } from '@react-navigation/native' -import { AuthenticatedRootNavigatorScreenProps } from '../authenticatedRoot/AuthenticatedRootNavigatorScreenProps' -import { TabBarNavigatorParamList } from './TabBarNavigatorParamList' - -export type TabBarNavigatorScreenProps = CompositeScreenProps< - BottomTabScreenProps, - AuthenticatedRootNavigatorScreenProps -> diff --git a/src/screens/doorToDoor/DoorToDoorScreen.tsx b/src/screens/doorToDoor/DoorToDoorScreen.tsx index e467437cc..20e0d817b 100644 --- a/src/screens/doorToDoor/DoorToDoorScreen.tsx +++ b/src/screens/doorToDoor/DoorToDoorScreen.tsx @@ -1,21 +1,12 @@ -import React, { - FunctionComponent, - useCallback, - useEffect, - useState, -} from 'react' +import React, { useCallback, useEffect, useState } from 'react' import { Modal, SafeAreaView, StyleSheet, Text, View } from 'react-native' import { LatLng, Region } from '@/components/Maps/Maps' import { useFocusEffect } from '@react-navigation/native' import * as Geolocation from 'expo-location' import { DoorToDoorAddress } from '../../core/entities/DoorToDoor' -import { - DoorToDoorCharterNotAccepted, - DoorToDoorCharterState, -} from '../../core/entities/DoorToDoorCharterState' +import { DoorToDoorCharterNotAccepted, DoorToDoorCharterState } from '../../core/entities/DoorToDoorCharterState' import { GetDoorToDoorAddressesInteractor } from '../../core/interactor/GetDoorToDoorAddressesInteractor' import DoorToDoorRepository from '../../data/DoorToDoorRepository' -import { ActionsNavigatorScreenProps } from '../../navigation/actions/ActionsNavigatorScreenProps' import { Colors, Spacing, Typography } from '../../styles' import i18n from '../../utils/i18n' import { LocationManager } from '../../utils/LocationManager' @@ -29,33 +20,21 @@ import LocationAuthorization from './LocationAuthorization' import MapListSwitch from './MapListSwitch' import RankingModal from './rankings/RankingModal' -type DoorToDoorScreenProps = ActionsNavigatorScreenProps<'DoorToDoor'> - export type RankingModalState = Readonly<{ visible: boolean campaignId?: string }> -const DoorToDoorScreen: FunctionComponent = ({ - navigation, -}) => { +const DoorToDoorScreen = ({ navigation }) => { const [loading, setLoading] = useState(false) - const [rankingModalState, setRankingModalState] = useState( - { visible: false }, - ) + const [rankingModalState, setRankingModalState] = useState({ visible: false }) const [currentSearchRegion, setCurrentSearchRegion] = useState() const [addresses, setAddresses] = useState([]) - const [filteredAddresses, setFilteredAddresses] = useState< - DoorToDoorAddress[] - >([]) - const [locationAuthorized, setLocationAuthorized] = useState< - boolean | undefined - >() + const [filteredAddresses, setFilteredAddresses] = useState([]) + const [locationAuthorized, setLocationAuthorized] = useState() const [displayMode, setDisplayMode] = useState('map') const [filter, setFilter] = useState('all') - const [charterState, setCharterState] = useState< - DoorToDoorCharterState | undefined - >() + const [charterState, setCharterState] = useState() const fetchCharterState = useCallback(() => { DoorToDoorRepository.getInstance() @@ -67,12 +46,7 @@ const DoorToDoorScreen: FunctionComponent = ({ const fetchAddresses = (region: Region) => { setLoading(true) new GetDoorToDoorAddressesInteractor() - .execute( - region.latitude, - region.longitude, - region.latitudeDelta, - region.longitudeDelta, - ) + .execute(region.latitude, region.longitude, region.latitudeDelta, region.longitudeDelta) .then((newAddresses) => { setAddresses(newAddresses) }) @@ -121,27 +95,19 @@ const DoorToDoorScreen: FunctionComponent = ({ useEffect(() => { let result: Array = addresses if (filter !== 'all') { - result = addresses.filter( - (address) => - address.building.campaignStatistics && - address.building.campaignStatistics.status === filter, - ) + result = addresses.filter((address) => address.building.campaignStatistics && address.building.campaignStatistics.status === filter) } setFilteredAddresses(result) }, [addresses, filter]) const getPermissionStatus = async () => { // Fix LocationManager returning [0;1] instead of boolean - setLocationAuthorized( - Boolean(await LocationManager.permissionStatus()).valueOf(), - ) + setLocationAuthorized(Boolean(await LocationManager.permissionStatus()).valueOf()) } const requestPermission = async () => { // Fix LocationManager returning [0;1] instead of boolean - setLocationAuthorized( - Boolean(await LocationManager.requestPermission()).valueOf(), - ) + setLocationAuthorized(Boolean(await LocationManager.requestPermission()).valueOf()) } const onFilterChange = (mode: DoorToDoorFilterDisplay) => { @@ -159,9 +125,7 @@ const DoorToDoorScreen: FunctionComponent = ({ const renderLoading = () => - const renderAskPersmission = () => ( - - ) + const renderAskPersmission = () => const renderMap = (initalLocation: LatLng) => ( <> @@ -182,10 +146,7 @@ const DoorToDoorScreen: FunctionComponent = ({ }} /> ) : ( - + )} ) @@ -208,20 +169,13 @@ const DoorToDoorScreen: FunctionComponent = ({ {rankingModalState.campaignId ? ( - setRankingModalState({ visible: false })} - campaignId={rankingModalState.campaignId} - /> + setRankingModalState({ visible: false })} campaignId={rankingModalState.campaignId} /> ) : null} {charterState instanceof DoorToDoorCharterNotAccepted && ( - navigation.goBack()} - /> + navigation.goBack()} /> )} @@ -229,9 +183,7 @@ const DoorToDoorScreen: FunctionComponent = ({ {i18n.t('doorToDoor.title')} - {locationAuthorized && ( - - )} + {locationAuthorized && } {renderContent()} diff --git a/src/screens/phoningCampaignBrief/PhoningCampaignBriefNavigationData.ts b/src/screens/phoningCampaignBrief/PhoningCampaignBriefNavigationData.ts deleted file mode 100644 index 8ee6580bc..000000000 --- a/src/screens/phoningCampaignBrief/PhoningCampaignBriefNavigationData.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface PhoningCampaignBriefNavigationData { - id: string - title: string - brief: string -} diff --git a/src/screens/phoningCampaignScoreboard/PhoningCampaignScoreboardNavigationData.tsx b/src/screens/phoningCampaignScoreboard/PhoningCampaignScoreboardNavigationData.tsx deleted file mode 100644 index b81739d2b..000000000 --- a/src/screens/phoningCampaignScoreboard/PhoningCampaignScoreboardNavigationData.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { PhoningCampaignScore } from '../../core/entities/PhoningCampaign' - -export interface PhoningCampaignScoreboardNavigationData { - scoreboard: Array -} diff --git a/src/screens/polls/PollsScreen.tsx b/src/screens/polls/PollsScreen.tsx index 3f160be6f..74c481ae6 100644 --- a/src/screens/polls/PollsScreen.tsx +++ b/src/screens/polls/PollsScreen.tsx @@ -1,13 +1,5 @@ -import React, { FC } from 'react' -import { - FlatList, - ListRenderItemInfo, - RefreshControl, - StyleSheet, - Text, - View, -} from 'react-native' -import { ActionsNavigatorScreenProps } from '../../navigation/actions/ActionsNavigatorScreenProps' +import React from 'react' +import { FlatList, ListRenderItemInfo, RefreshControl, StyleSheet, Text, View } from 'react-native' import { Colors, Spacing, Typography } from '../../styles' import i18n from '../../utils/i18n' import CircularIcon from '../shared/CircularIcon' @@ -19,27 +11,14 @@ import PollsHeader from './PollsHeader' import { PollsScreenViewModel } from './PollsScreenViewModel' import { usePollsScreen } from './usePollsScreen.hook' -type PollsScreenProps = ActionsNavigatorScreenProps<'Polls'> +const PollsScreen = () => { + const { statefulState, isRefreshing, onPollSelected, onRefresh } = usePollsScreen() -const PollsScreen: FC = () => { - const { statefulState, isRefreshing, onPollSelected, onRefresh } = - usePollsScreen() - - const renderItem = ({ - item, - index, - }: ListRenderItemInfo) => { + const renderItem = ({ item, index }: ListRenderItemInfo) => { if (index === 0) { - return ( - onPollSelected(item.id)} - /> - ) + return onPollSelected(item.id)} /> } else { - return ( - onPollSelected(item.id)} /> - ) + return onPollSelected(item.id)} /> } } @@ -49,28 +28,15 @@ const PollsScreen: FC = () => { data={viewModel.rows} renderItem={renderItem} keyExtractor={(item) => item.id} - ListHeaderComponent={ - - } + ListHeaderComponent={} ListEmptyComponent={ - - - {i18n.t('polls.subtitle_no_polls')} - + + {i18n.t('polls.subtitle_no_polls')} } contentContainerStyle={styles.contentContainer} - refreshControl={ - - } + refreshControl={} /> ) } diff --git a/src/screens/polls/usePollsScreen.hook.ts b/src/screens/polls/usePollsScreen.hook.ts index 2de7649c2..580b451ea 100644 --- a/src/screens/polls/usePollsScreen.hook.ts +++ b/src/screens/polls/usePollsScreen.hook.ts @@ -1,14 +1,13 @@ import { useCallback, useState } from 'react' -import { useFocusEffect, useNavigation } from '@react-navigation/native' +import { useFocusEffect } from '@react-navigation/native' +import { router } from 'expo-router' import { Poll } from '../../core/entities/Poll' import { ServerTimeoutError } from '../../core/errors' import { GetPollsInteractor } from '../../core/interactor/GetPollsInteractor' -import { ActionsNavigatorScreenProps } from '../../navigation/actions/ActionsNavigatorScreenProps' import { ViewState } from '../shared/ViewState' import { ViewStateUtils } from '../shared/ViewStateUtils' import { PollsScreenViewModel } from './PollsScreenViewModel' import { PollsScreenViewModelMapper } from './PollsScreenViewModelMapper' -import { router } from 'expo-router' export const usePollsScreen = (): { statefulState: ViewState @@ -16,13 +15,9 @@ export const usePollsScreen = (): { onPollSelected: (pollId: string) => void onRefresh: () => void } => { - const [statefulState, setStatefulState] = useState>>( - ViewState.Loading(), - ) + const [statefulState, setStatefulState] = useState>>(ViewState.Loading()) const [isRefreshing, setRefreshing] = useState(true) const [initialFetchDone, setInitialFetchDone] = useState(false) - const navigation = - useNavigation['navigation']>() const fetchData = useCallback((cacheJustLoaded: boolean = false) => { setRefreshing(true) diff --git a/src/screens/regions/RegionScreen.tsx b/src/screens/regions/RegionScreen.tsx index 9c71a2705..d6b07d64e 100644 --- a/src/screens/regions/RegionScreen.tsx +++ b/src/screens/regions/RegionScreen.tsx @@ -1,8 +1,7 @@ import React, { FC, useEffect, useState } from 'react' import { Image, ScrollView, StyleSheet, Text, View } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' +import { useLocalSearchParams } from 'expo-router' import RegionsRepository from '../../data/RegionsRepository' -import { HomeNavigatorScreenProps } from '../../navigation/home/HomeNavigatorScreenProps' import { Colors, Spacing, Styles, Typography } from '../../styles' import { Analytics } from '../../utils/Analytics' import i18n from '../../utils/i18n' @@ -13,31 +12,21 @@ import { ViewState } from '../shared/ViewState' import { ViewStateUtils } from '../shared/ViewStateUtils' import { RegionViewModel } from './RegionViewModel' import { RegionViewModelMapper } from './RegionViewModelMapper' -import { useLocalSearchParams } from 'expo-router' - -type RegionScreenProps = HomeNavigatorScreenProps<'Region'> -const RegionScreen: FC = ({ route }) => { - const { zipCode } = useLocalSearchParams<{zipCode : string}>() - const [statefulState, setStatefulState] = useState< - ViewState - >(ViewState.Loading()) +const RegionScreen = () => { + const { zipCode } = useLocalSearchParams<{ zipCode: string }>() + const [statefulState, setStatefulState] = useState>(ViewState.Loading()) const fetchData = () => { RegionsRepository.getInstance() .getRegion(zipCode) .then((result) => { if (result.campaign) { - const viewModel = RegionViewModelMapper.map( - result.name, - result.campaign, - ) + const viewModel = RegionViewModelMapper.map(result.name, result.campaign) setStatefulState(ViewState.Content(viewModel)) } else { // This is a fatal error, should not happen - setStatefulState( - ViewStateUtils.networkError(new Error('No campaign for region.')), - ) + setStatefulState(ViewStateUtils.networkError(new Error('No campaign for region.'))) } }) .catch((error) => { diff --git a/src/screens/retaliation/RetaliationDetailScreen.tsx b/src/screens/retaliation/RetaliationDetailScreen.tsx index 68263c98a..1c21aea85 100644 --- a/src/screens/retaliation/RetaliationDetailScreen.tsx +++ b/src/screens/retaliation/RetaliationDetailScreen.tsx @@ -1,7 +1,6 @@ -import React, { FunctionComponent } from 'react' -import { SafeAreaView, StyleSheet, Text, View } from 'react-native' -import { ScrollView } from 'react-native' -import { HomeNavigatorScreenProps } from '../../navigation/home/HomeNavigatorScreenProps' +import React from 'react' +import { SafeAreaView, ScrollView, StyleSheet, Text, View } from 'react-native' +import { useLocalSearchParams } from 'expo-router' import { Colors, Spacing, Styles, Typography } from '../../styles' import i18n from '../../utils/i18n' import { PrimaryButton } from '../shared/Buttons' @@ -9,15 +8,9 @@ import { VerticalSpacer } from '../shared/Spacer' import { StatefulView } from '../shared/StatefulView' import RetaliationPostCard from './RetaliationPostCard' import { useRetaliationDetailScreen } from './useRetaliationDetailScreen.hook' -import { useLocalSearchParams } from 'expo-router' - -type RetaliationDetailScreenProps = - HomeNavigatorScreenProps<'RetaliationDetail'> -const RetaliationDetailScreen: FunctionComponent< - RetaliationDetailScreenProps -> = () => { - const { id } = useLocalSearchParams<{id: string}>() +const RetaliationDetailScreen = () => { + const { id } = useLocalSearchParams<{ id: string }>() const { statefulState, onRetaliate } = useRetaliationDetailScreen(id) return ( @@ -31,16 +24,11 @@ const RetaliationDetailScreen: FunctionComponent< {viewModel.title} - - {i18n.t('retaliation.title')} - + {i18n.t('retaliation.title')} {viewModel.body} - + ) diff --git a/src/screens/retaliations/RetaliationsScreen.tsx b/src/screens/retaliations/RetaliationsScreen.tsx index 47dbb279b..d7500323e 100644 --- a/src/screens/retaliations/RetaliationsScreen.tsx +++ b/src/screens/retaliations/RetaliationsScreen.tsx @@ -1,13 +1,5 @@ import React, { FC } from 'react' -import { - FlatList, - ListRenderItemInfo, - RefreshControl, - StyleSheet, - Text, - View -} from 'react-native' -import { ActionsNavigatorScreenProps } from '../../navigation/actions/ActionsNavigatorScreenProps' +import { FlatList, ListRenderItemInfo, RefreshControl, StyleSheet, Text, View } from 'react-native' import { Colors, Spacing, Typography } from '../../styles' import i18n from '../../utils/i18n' import { StatefulView } from '../shared/StatefulView' @@ -15,61 +7,30 @@ import HomeRetaliationCard from './RetaliationListCard' import { RetaliationListCardViewModel } from './RetaliationListCardViewModel' import { useRetaliationsScreen } from './useRetaliationsScreen.hook' -type RetaliationsScreenProps = ActionsNavigatorScreenProps<'Retaliations'> +export const RetaliationsScreen = () => { + const { statefulState, isRefreshing, onRefresh, onRetaliateSelected, onRetaliationSelected } = useRetaliationsScreen() -export const RetaliationsScreen: FC = () => { - const { - statefulState, - isRefreshing, - onRefresh, - onRetaliateSelected, - onRetaliationSelected, - } = useRetaliationsScreen() - - const renderItem = ({ - item, - }: ListRenderItemInfo) => { - return ( - - ) + const renderItem = ({ item }: ListRenderItemInfo) => { + return } - const RetaliationsContent = ( - content: Array, - ) => { + const RetaliationsContent = (content: Array) => { return ( item.title} - ListHeaderComponent={ - {i18n.t('retaliations.title')} - } - ListEmptyComponent={ - {i18n.t('retaliations.empty')} - } + ListHeaderComponent={{i18n.t('retaliations.title')}} + ListEmptyComponent={{i18n.t('retaliations.empty')}} renderItem={renderItem} - refreshControl={ - - } + refreshControl={} /> ) } return ( - + ) } diff --git a/src/screens/retaliations/useRetaliationsScreen.hook.ts b/src/screens/retaliations/useRetaliationsScreen.hook.ts index 4108e221d..854522f85 100644 --- a/src/screens/retaliations/useRetaliationsScreen.hook.ts +++ b/src/screens/retaliations/useRetaliationsScreen.hook.ts @@ -1,14 +1,12 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import { useNavigation } from '@react-navigation/native' +import { router } from 'expo-router' import { Retaliation } from '../../core/entities/Retaliation' import RetaliationRepository from '../../data/RetaliationRepository' import { RetaliationService } from '../../data/RetaliationService' -import { ActionsNavigatorScreenProps } from '../../navigation/actions/ActionsNavigatorScreenProps' import { ViewState } from '../shared/ViewState' import { ViewStateUtils } from '../shared/ViewStateUtils' import { RetaliationListCardViewModel } from './RetaliationListCardViewModel' import { RetaliationListCardViewModelMapper } from './RetaliationListCardViewModelMapper' -import { router } from 'expo-router' export const useRetaliationsScreen = (): { statefulState: ViewState> @@ -17,11 +15,7 @@ export const useRetaliationsScreen = (): { onRetaliationSelected: (id: string) => void onRetaliateSelected: (id: string) => void } => { - const navigation = - useNavigation['navigation']>() - const [statefulState, setStatefulState] = useState< - ViewState> - >(ViewState.Loading()) + const [statefulState, setStatefulState] = useState>>(ViewState.Loading()) const stateRef = useRef(statefulState) const [isRefreshing, setIsRefreshing] = useState(false) @@ -67,9 +61,7 @@ export const useRetaliationsScreen = (): { } return { - statefulState: ViewState.map(statefulState, (retaliations) => - retaliations.map(RetaliationListCardViewModelMapper.map), - ), + statefulState: ViewState.map(statefulState, (retaliations) => retaliations.map(RetaliationListCardViewModelMapper.map)), isRefreshing, onRefresh: fetchRetaliations, onRetaliationSelected,