* Remove icons folder * Create folders for badge, button, and dropdown components * Remove Bootstrap 5 from test * Rename `getBootstrap5Breakpoint` to `getBootstrapBreakpoint` * Cleanup and update BS 5 comments * Move components to the shared folder * Rename `tooltips-bs5` to `tooltip` * Remove `-bs5` suffix * Fix path * Delete BS3 version file * Rename `_form_marketing-bootstrap-5` to `_form_marketing` * Delete BS3 version file * Rename `_contact_general_modal-marketing-bootstrap-5` to `_contact_general_modal-marketing` * Delete BS3 version file * Rename `_contact_modal-marketing-bootstrap-5` to `_contact_modal-marketing` * Delete BS3 version file * Rename `thin-footer-bootstrap-5` to `thin-footer` * Delete BS3 version file * Rename `language-picker-bootstrap-5` to `language-picker` * Rename `fat-footer-react-bootstrap-5` to `fat-footer-react` * Delete BS3 version file * Rename `navbar-marketing-bootstrap-5` to `navbar-marketing` * Rename `navbar-marketing-react-bootstrap-5` to `navbar-marketing-react` * Delete BS3 version file * Rename `layout-website-redesign-cms-bootstrap-5` to `layout-website-redesign-cms` * Source format * Fix path GitOrigin-RevId: cf0f5db7c84cf545c69213dcc271d9ff17fe5db7
75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import { Dispatch, SetStateAction, useCallback } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { InviteViewTypes } from './group-invite'
|
|
import getMeta from '@/utils/meta'
|
|
import { FetchError, putJSON } from '@/infrastructure/fetch-json'
|
|
import useAsync from '@/shared/hooks/use-async'
|
|
import classNames from 'classnames'
|
|
import { debugConsole } from '@/utils/debugging'
|
|
import Notification from '@/shared/components/notification'
|
|
import OLButton from '@/shared/components/ol/ol-button'
|
|
|
|
export default function JoinGroup({
|
|
setView,
|
|
}: {
|
|
setView: Dispatch<SetStateAction<InviteViewTypes>>
|
|
}) {
|
|
const { t } = useTranslation()
|
|
const expired = getMeta('ol-expired')
|
|
const inviteToken = getMeta('ol-inviteToken')
|
|
const {
|
|
runAsync,
|
|
isLoading: isJoining,
|
|
isError,
|
|
} = useAsync<never, FetchError>()
|
|
|
|
const notNowBtnClasses = classNames(
|
|
'btn',
|
|
'btn-secondary',
|
|
isJoining ? 'disabled' : ''
|
|
)
|
|
|
|
const joinTeam = useCallback(() => {
|
|
runAsync(putJSON(`/subscription/invites/${inviteToken}`))
|
|
.then(() => {
|
|
setView('invite-accepted')
|
|
})
|
|
.catch(debugConsole.error)
|
|
}, [inviteToken, runAsync, setView])
|
|
|
|
if (!inviteToken) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{isError && (
|
|
<Notification
|
|
type="error"
|
|
content={t('generic_something_went_wrong')}
|
|
className="my-3"
|
|
/>
|
|
)}
|
|
|
|
<div className="text-center">
|
|
<p>{t('join_team_explanation')}</p>
|
|
{!expired && (
|
|
<p>
|
|
<a className={notNowBtnClasses} href="/project">
|
|
{t('not_now')}
|
|
</a>
|
|
|
|
<OLButton
|
|
variant="primary"
|
|
onClick={() => joinTeam()}
|
|
disabled={isJoining}
|
|
>
|
|
{t('accept_invitation')}
|
|
</OLButton>
|
|
</p>
|
|
)}
|
|
</div>
|
|
</>
|
|
)
|
|
}
|