diff --git a/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/continue/page.tsx b/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/continue/page.tsx deleted file mode 100644 index 61edba7a..00000000 --- a/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/continue/page.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { HttpStatusCode } from 'axios'; -export const dynamic = 'force-dynamic'; -import { internalFetch } from '@gitroom/helpers/utils/internal.fetch'; -import { redirect } from 'next/navigation'; -import { Redirect } from '@gitroom/frontend/components/layout/redirect'; -import { getT } from '@gitroom/react/translation/get.translation.service.backend'; -export default async function Page({ - params: { provider }, - searchParams, -}: { - params: { - provider: string; - }; - searchParams: any; -}) { - const t = await getT(); - if (provider === 'x') { - searchParams = { - ...searchParams, - state: searchParams.oauth_token || '', - code: searchParams.oauth_verifier || '', - refresh: searchParams.refresh || '', - }; - } - if (provider === 'vk') { - searchParams = { - ...searchParams, - state: searchParams.state || '', - code: searchParams.code + '&&&&' + searchParams.device_id, - }; - } - const data = await internalFetch(`/integrations/social/${provider}/connect`, { - method: 'POST', - body: JSON.stringify(searchParams), - }); - if (data.status === HttpStatusCode.NotAcceptable) { - const { msg } = await data.json(); - return redirect(`/launches?msg=${msg}`); - } - if ( - data.status !== HttpStatusCode.Ok && - data.status !== HttpStatusCode.Created - ) { - return ( - <> -
- {t('could_not_add_provider', 'Could not add provider.')} -
- {t('you_are_being_redirected_back', 'You are being redirected back')} -
- - - ); - } - const { inBetweenSteps, id } = await data.json(); - if (inBetweenSteps && !searchParams.refresh) { - return redirect(`/launches?added=${provider}&continue=${id}`); - } - return redirect(`/launches?added=${provider}&msg=Channel Updated`); -} diff --git a/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/page.tsx b/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/page.tsx index 5882743c..473a0cf1 100644 --- a/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/page.tsx +++ b/apps/frontend/src/app/(app)/(site)/integrations/social/[provider]/page.tsx @@ -1,4 +1,4 @@ -import { IntegrationRedirectComponent } from '@gitroom/frontend/components/launches/integration.redirect.component'; +import { ContinueIntegration } from '@gitroom/frontend/components/launches/continue.integration'; export const dynamic = 'force-dynamic'; export default async function Page({ params: { provider }, @@ -9,5 +9,5 @@ export default async function Page({ }; searchParams: any; }) { - return ; + return ; } diff --git a/apps/frontend/src/components/launches/continue.integration.tsx b/apps/frontend/src/components/launches/continue.integration.tsx new file mode 100644 index 00000000..2201de51 --- /dev/null +++ b/apps/frontend/src/components/launches/continue.integration.tsx @@ -0,0 +1,79 @@ +'use client'; + +import { FC, useEffect, useState } from 'react'; +import { HttpStatusCode } from 'axios'; +import { useRouter } from 'next/navigation'; +import { Redirect } from '@gitroom/frontend/components/layout/redirect'; +import { useT } from '@gitroom/react/translation/get.transation.service.client'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import dayjs from 'dayjs'; + +export const ContinueIntegration: FC<{ + provider: string; + searchParams: any; +}> = (props) => { + const { provider, searchParams } = props; + const { push } = useRouter(); + const t = useT(); + const fetch = useFetch(); + const [error, setError] = useState(false); + + useEffect(() => { + (async () => { + const timezone = String(dayjs.tz().utcOffset()); + const modifiedParams = { ...searchParams }; + if (provider === 'x') { + Object.assign(modifiedParams, { + state: searchParams.oauth_token || '', + code: searchParams.oauth_verifier || '', + refresh: searchParams.refresh || '', + }); + } + + if (provider === 'vk') { + Object.assign(modifiedParams, { + ...searchParams, + state: searchParams.state || '', + code: searchParams.code + '&&&&' + searchParams.device_id, + }); + } + + const data = await fetch(`/integrations/social/${provider}/connect`, { + method: 'POST', + body: JSON.stringify({...modifiedParams, timezone}), + }); + + if (data.status === HttpStatusCode.NotAcceptable) { + const { msg } = await data.json(); + push(`/launches?msg=${msg}`); + return; + } + + if ( + data.status !== HttpStatusCode.Ok && + data.status !== HttpStatusCode.Created + ) { + setError(true); + return; + } + + const { inBetweenSteps, id } = await data.json(); + if (inBetweenSteps && !searchParams.refresh) { + push(`/launches?added=${provider}&continue=${id}`); + return; + } + push(`/launches?added=${provider}&msg=Channel Updated`); + })(); + }, [provider, searchParams]); + + return error ? ( + <> +
+ {t('could_not_add_provider', 'Could not add provider.')} +
+ {t('you_are_being_redirected_back', 'You are being redirected back')} +
+ + + ) : null; +};