import type { PondView } from '@dorfteich/shared'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import { useAuth } from '../auth/auth-context'; import { SettingsLayout } from '../components/SettingsLayout'; import { ApiOptInSetting } from '../api-tokens/ApiOptInSetting'; import { CommentPolicySetting } from '../comments/CommentPolicySetting'; import { WatchToggle } from '../watches/WatchToggle'; import { FormError } from '../components/forms'; import { AppearanceManager } from '../fonts/AppearanceManager'; import { LabelManager } from '../labels/LabelManager'; import { PhantomPagesView } from '../links/PhantomPagesView'; import { AccessRulesManager } from '../access/AccessRulesManager'; import { EffectivePermissionsInspector } from '../access/EffectivePermissionsInspector'; import { PondFileManager } from '../files/PondFileManager'; import { apiGet } from '../lib/api'; import { VaultImportSection } from '../import/VaultImportSection'; import { SidebarViewSetting } from '../layout/SidebarViewSetting'; import { MemberManager } from '../members/MemberManager'; import { DeletePondSection } from '../ponds/DeletePondSection'; import { PondPluginSettings } from '../plugins/PondPluginSettings'; import { useDocumentTitle } from '../lib/use-document-title'; /** * Pond settings (issues #44/#54). Hosts the 'Members' and 'Labels' sections; * future pond-level configuration (fonts, etc.) joins it here. Member * management is Pond-Admin-gated in the api (the MemberManager shows the list * to any member and hides the controls otherwise); label management needs * modify rights. The sidebar links here for the pond owner (Site Admins and * other members can still navigate directly). */ export function PondSettingsPage(): React.JSX.Element { const { t } = useTranslation('labels'); const { t: tLinks } = useTranslation('links'); const { t: tMembers } = useTranslation('members'); const { t: tErrors } = useTranslation('errors'); const { t: tFiles } = useTranslation('files'); const { t: tExport } = useTranslation('export'); const { t: tComments } = useTranslation('comments'); const { t: tApiTokens } = useTranslation('apiTokens'); const { t: tFont } = useTranslation('font'); const { t: tCommon } = useTranslation(); const { t: tImport } = useTranslation('import'); const { pondSlug = '' } = useParams<{ pondSlug: string }>(); const { user } = useAuth(); const pond = useQuery({ queryKey: ['pond', pondSlug], queryFn: () => apiGet(`/ponds/${pondSlug}`), }); useDocumentTitle(tCommon('settings:title'), pond.data?.name); if (pond.error) return ; if (!pond.data) return <>; const canModify = Boolean(user && (user.isSiteAdmin || user.id === pond.data.ownerId)); return (

{pond.data.name}

{tMembers('title')}

{t('settings.title')}

{canModify ? ( ) : (

{tErrors('forbidden')}

)}
{canModify && (

{tLinks('missing.title')}

)} {canModify && (

{tImport('vault.title')}

)} {canModify && (

{tFiles('manager.title')}

)} {canModify && (

{tFont('heading')}

)} {canModify && } {canModify && (

{tCommon('layout.sidebar.view.defaultTitle')}

)} {canModify && (

{tComments('policy.title')}

)} {canModify && (

{tApiTokens('pond.title')}

)}

{tExport('pond.heading')}

{tExport('pond.hint')}

{tExport('pond.zip')}
{canModify && pond.data.type === 'shared' && ( )}
); }