'use client'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import React, { FC, Ref, useCallback, useEffect, useMemo, useState, } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { showMediaBox } from '@gitroom/frontend/components/media/media.component'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { UserDetailDto } from '@gitroom/nestjs-libraries/dtos/users/user.details.dto'; import { useToaster } from '@gitroom/react/toaster/toaster'; import { useSWRConfig } from 'swr'; import clsx from 'clsx'; import { TeamsComponent } from '@gitroom/frontend/components/settings/teams.component'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; import { useSearchParams } from 'next/navigation'; import { useVariables } from '@gitroom/react/helpers/variable.context'; import { PublicComponent } from '@gitroom/frontend/components/public-api/public.component'; import Link from 'next/link'; import { Webhooks } from '@gitroom/frontend/components/webhooks/webhooks'; import { Sets } from '@gitroom/frontend/components/sets/sets'; import { SignaturesComponent } from '@gitroom/frontend/components/settings/signatures.component'; import { Autopost } from '@gitroom/frontend/components/autopost/autopost'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { SVGLine } from '@gitroom/frontend/components/launches/launches.component'; import { GlobalSettings } from '@gitroom/frontend/components/settings/global.settings'; import { ApprovedAppsComponent } from '@gitroom/frontend/components/approved-apps/approved-apps.component'; export const SettingsPopup: FC<{ getRef?: Ref; }> = (props) => { const { isGeneral } = useVariables(); const { getRef } = props; const fetch = useFetch(); const toast = useToaster(); const swr = useSWRConfig(); const user = useUser(); const resolver = useMemo(() => { return classValidatorResolver(UserDetailDto); }, []); const form = useForm({ resolver, }); const picture = form.watch('picture'); const modal = useModals(); const close = useCallback(() => { return modal.closeAll(); }, []); const url = useSearchParams(); const showLogout = !url.get('onboarding') || user?.tier?.current === 'FREE'; const loadProfile = useCallback(async () => { const personal = await (await fetch('/user/personal')).json(); form.setValue('fullname', personal.name || ''); form.setValue('bio', personal.bio || ''); form.setValue('picture', personal.picture); }, []); const openMedia = useCallback(() => { showMediaBox((values) => { form.setValue('picture', values); }); }, []); const remove = useCallback(() => { form.setValue('picture', null); }, []); const submit = useCallback(async (val: any) => { await fetch('/user/personal', { method: 'POST', body: JSON.stringify(val), }); if (getRef) { return; } toast.show(t('profile_updated', 'Profile updated')); close(); }, []); const [tab, setTab] = useState('global_settings'); const t = useT(); const list = useMemo(() => { const arr = []; arr.push({ tab: 'global_settings', label: t('global_settings', 'Global Settings') }); // Populate tabs based on user permissions if (user?.tier?.team_members && isGeneral) { arr.push({ tab: 'teams', label: t('teams', 'Teams') }); } if (user?.tier?.webhooks) { arr.push({ tab: 'webhooks', label: t('webhooks_1', 'Webhooks') }); } if (user?.tier?.autoPost) { arr.push({ tab: 'autopost', label: t('auto_post', 'Auto Post') }); } if (user?.tier.current !== 'FREE') { arr.push({ tab: 'sets', label: t('sets', 'Sets') }); } if (user?.tier.current !== 'FREE') { arr.push({ tab: 'signatures', label: t('signatures', 'Signatures') }); } if (user?.tier?.public_api && isGeneral && showLogout) { arr.push({ tab: 'api', label: t('developers', 'Developers') }); } arr.push({ tab: 'approved_apps', label: t('approved_apps', 'Approved Apps') }); return arr; }, [user, isGeneral, showLogout, t]); useEffect(() => { loadProfile(); }, []); return ( <>
{list.map(({ tab: tabKey, label }) => (
setTab(tabKey)} >
{label}
))}
{showLogout && (
)}
{!!getRef && ( )}
{tab === 'global_settings' && (
)} {tab === 'teams' && !!user?.tier?.team_members && isGeneral && (
)} {tab === 'webhooks' && !!user?.tier?.webhooks && (
)} {tab === 'autopost' && !!user?.tier?.autoPost && (
)} {tab === 'sets' && user?.tier.current !== 'FREE' && (
)} {tab === 'signatures' && user?.tier.current !== 'FREE' && (
)} {tab === 'api' && !!user?.tier?.public_api && isGeneral && showLogout && (
)} {tab === 'approved_apps' && (
)}
); }; export const SettingsComponent = () => { const settings = useModals(); const user = useUser(); const openModal = useCallback(() => { if (user?.tier.current !== 'FREE') { return; } settings.openModal({ children: (
), classNames: { modal: 'bg-transparent text-textColor', }, withCloseButton: false, size: '100%', }); }, [user]); return ( ); };