diff --git a/packages/web/components/templates/integrations/Readwise.tsx b/packages/web/components/templates/integrations/Readwise.tsx index b58e75baf..3a64b0f56 100644 --- a/packages/web/components/templates/integrations/Readwise.tsx +++ b/packages/web/components/templates/integrations/Readwise.tsx @@ -10,8 +10,9 @@ import { FormInput } from '../../elements/FormElements' import { setIntegrationMutation } from '../../../lib/networking/mutations/setIntegrationMutation' import { Integration, useGetIntegrationsQuery } from '../../../lib/networking/queries/useGetIntegrationsQuery' -import { Router, useRouter } from 'next/router' -import { showSuccessToast } from '../../../lib/toastHelpers' +import { useRouter } from 'next/router' +import { showErrorToast, showSuccessToast } from '../../../lib/toastHelpers' +import { deleteIntegrationMutation } from '../../../lib/networking/mutations/deleteIntegrationMutation' // Styles const Header = styled(Box, { @@ -21,24 +22,10 @@ const Header = styled(Box, { }) export function Readwise(): JSX.Element { - const router = useRouter() - const [token, setToken] = useState('') - const [errorMessage, setErrorMessage] = - useState(undefined) - - const setReadwiseToken = useCallback(async () => { - try { - const result = await setIntegrationMutation({ - token, - type: 'READWISE', - enabled: true, - }) - router.push(`/settings/integrations`) - showSuccessToast('Your Readwise API token has been set.') - } catch (err) { - setErrorMessage('Error: ' + err) - } - }, [token]) + const { integrations, isValidating, revalidate } = useGetIntegrationsQuery() + const readwiseIntegration = useMemo(() => { + return integrations.find((i) => i.type == 'READWISE') + }, [integrations]) return ( Readwise - - Enter your API key from Readwise below. You can get your token{' '} - - here - . - + {!isValidating && readwiseIntegration && ( + + )} + + {!isValidating && !readwiseIntegration && ( + + )} - { - e.preventDefault() - setToken(e.target.value) - }} - disabled={false} - hidden={false} - required={true} - css={{ - border: '1px solid $textNonessential', - borderRadius: '8px', - width: '80%', - bg: 'transparent', - fontSize: '16px', - textIndent: '8px', - margin: '20px', - height: '38px', - color: '$grayTextContrast', - '&:focus': { - outline: 'none', - boxShadow: '0px 0px 2px 2px rgba(255, 234, 159, 0.56)', - }, - }} - min={200} - /> - {errorMessage && {errorMessage}} - ) } + + +function AddReadwiseForm(): JSX.Element { + const router = useRouter() + + const [errorMessage, setErrorMessage] = + useState(undefined) + const [token, setToken] = useState('') + + const setReadwiseToken = useCallback(async () => { + try { + const result = await setIntegrationMutation({ + token, + type: 'READWISE', + enabled: true, + }) + if (result) { + router.push(`/settings/integrations`) + showSuccessToast('Your Readwise API token has been set.') + } else { + setErrorMessage('There was an error connecting to Readwise.') + } + } catch (err) { + setErrorMessage('Error: ' + err) + } + }, [token, router]) + + return (<> + + Enter your API key from Readwise below. You can get your token{' '} + + here + . + + + { + e.preventDefault() + setToken(e.target.value) + }} + disabled={false} + hidden={false} + required={true} + css={{ + border: '1px solid $textNonessential', + borderRadius: '8px', + width: '80%', + bg: 'transparent', + fontSize: '16px', + textIndent: '8px', + my: '20px', + height: '38px', + color: '$grayTextContrast', + '&:focus': { + outline: 'none', + boxShadow: '0px 0px 2px 2px rgba(255, 234, 159, 0.56)', + }, + }} + min={200} + /> + {errorMessage && {errorMessage}} + + + ) +} + +type RemoveReadwiseFormProps = { + integration: Integration + revalidate: () => void +} + +function RemoveReadwiseForm(props: RemoveReadwiseFormProps): JSX.Element { + const deleteIntegration = useCallback(async () => { + try { + if (props.integration.id) { + const result = await deleteIntegrationMutation(props.integration.id) + if (result) { + props.revalidate() + showSuccessToast('Integration Removed') + } else { + showErrorToast('Error removing Readwise integration.') + } + } + } catch (err) { + showErrorToast('Error: ' + err) + } + }, [props]) + + return ( + <> + + Omnivore is configured to send all your highlights to Readwise. + + + + + ) +} \ No newline at end of file