From fea2e82bdd195433ab71d04850255e58aaf7a633 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Sun, 18 Dec 2022 01:12:58 +0100 Subject: [PATCH] Fixed #568 --- src/@types/mastodon.d.ts | 2 + src/components/Relationship/Outgoing.tsx | 175 +++++++++++++---------- src/helpers/features.json | 4 + src/utils/queryHooks/relationship.ts | 45 +++--- 4 files changed, 129 insertions(+), 97 deletions(-) diff --git a/src/@types/mastodon.d.ts b/src/@types/mastodon.d.ts index 699cbd16..fc61ed10 100644 --- a/src/@types/mastodon.d.ts +++ b/src/@types/mastodon.d.ts @@ -406,6 +406,8 @@ declare namespace Mastodon { id: string following: boolean showing_reblogs: boolean + notifying?: boolean + languages?: string[] followed_by: boolean blocking: boolean blocked_by: boolean diff --git a/src/components/Relationship/Outgoing.tsx b/src/components/Relationship/Outgoing.tsx index 70a643e0..fc082097 100644 --- a/src/components/Relationship/Outgoing.tsx +++ b/src/components/Relationship/Outgoing.tsx @@ -6,120 +6,144 @@ import { useRelationshipMutation, useRelationshipQuery } from '@utils/queryHooks/relationship' -import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { useTheme } from '@utils/styles/ThemeManager' import React from 'react' import { useTranslation } from 'react-i18next' import { useQueryClient } from '@tanstack/react-query' +import { useSelector } from 'react-redux' +import { checkInstanceFeature } from '@utils/slices/instancesSlice' +import { StyleConstants } from '@utils/styles/constants' export interface Props { id: Mastodon.Account['id'] } -const RelationshipOutgoing = React.memo( - ({ id }: Props) => { - const { theme } = useTheme() - const { t } = useTranslation('componentRelationship') +const RelationshipOutgoing: React.FC = ({ id }: Props) => { + const { theme } = useTheme() + const { t } = useTranslation('componentRelationship') - const query = useRelationshipQuery({ id }) + const canFollowNotify = useSelector(checkInstanceFeature('account_follow_notify')) - const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id }] - const queryClient = useQueryClient() - const mutation = useRelationshipMutation({ - onSuccess: (res, { payload: { action } }) => { - haptics('Success') - queryClient.setQueryData(queryKeyRelationship, [res]) - if (action === 'block') { - const queryKey = ['Timeline', { page: 'Following' }] - queryClient.invalidateQueries({ queryKey, exact: false }) - } - }, - onError: (err: any, { payload: { action } }) => { - displayMessage({ - theme, - type: 'error', - message: t('common:message.error.message', { - function: t(`${action}.function`) - }), - ...(err.status && - typeof err.status === 'number' && - err.data && - err.data.error && - typeof err.data.error === 'string' && { - description: err.data.error - }) - }) + const query = useRelationshipQuery({ id }) + + const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id }] + const queryClient = useQueryClient() + const mutation = useRelationshipMutation({ + onSuccess: (res, { payload: { action } }) => { + haptics('Success') + queryClient.setQueryData(queryKeyRelationship, [res]) + if (action === 'block') { + const queryKey = ['Timeline', { page: 'Following' }] + queryClient.invalidateQueries({ queryKey, exact: false }) } - }) + }, + onError: (err: any, { payload: { action } }) => { + displayMessage({ + theme, + type: 'error', + message: t('common:message.error.message', { + function: t(`${action}.function`) + }), + ...(err.status && + typeof err.status === 'number' && + err.data && + err.data.error && + typeof err.data.error === 'string' && { + description: err.data.error + }) + }) + } + }) - let content: string - let onPress: () => void + let content: string + let onPress: () => void - if (query.isError) { - content = t('button.error') + if (query.isError) { + content = t('button.error') + onPress = () => {} + } else { + if (query.data?.blocked_by) { + content = t('button.blocked_by') onPress = () => {} } else { - if (query.data?.blocked_by) { - content = t('button.blocked_by') - onPress = () => {} + if (query.data?.blocking) { + content = t('button.blocking') + onPress = () => { + mutation.mutate({ + id, + type: 'outgoing', + payload: { + action: 'block', + state: query.data?.blocking + } + }) + } } else { - if (query.data?.blocking) { - content = t('button.blocking') + if (query.data?.following) { + content = t('button.following') onPress = () => { mutation.mutate({ id, type: 'outgoing', payload: { - action: 'block', - state: query.data?.blocking + action: 'follow', + state: query.data?.following } }) } } else { - if (query.data?.following) { - content = t('button.following') + if (query.data?.requested) { + content = t('button.requested') onPress = () => { mutation.mutate({ id, type: 'outgoing', payload: { action: 'follow', - state: query.data?.following + state: query.data?.requested } }) } } else { - if (query.data?.requested) { - content = t('button.requested') - onPress = () => { - mutation.mutate({ - id, - type: 'outgoing', - payload: { - action: 'follow', - state: query.data?.requested - } - }) - } - } else { - content = t('button.default') - onPress = () => { - mutation.mutate({ - id, - type: 'outgoing', - payload: { - action: 'follow', - state: false - } - }) - } + content = t('button.default') + onPress = () => { + mutation.mutate({ + id, + type: 'outgoing', + payload: { + action: 'follow', + state: false + } + }) } } } } } + } - return ( + return ( + <> + {canFollowNotify && query.data?.following ? ( +