'use client'; import 'reflect-metadata'; import React, { FC, Fragment, useCallback, useMemo, useState } from 'react'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import useSWR from 'swr'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { Button } from '@gitroom/react/form/button'; import { Input } from '@gitroom/react/form/input'; import { useToaster } from '@gitroom/react/toaster/toaster'; import clsx from 'clsx'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { AddEditModal } from '@gitroom/frontend/components/new-launch/add.edit.modal'; import { newDayjs } from '@gitroom/frontend/components/layout/set.timezone'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; const SaveSetModal: FC<{ postData: any; initialValue?: string; onSave: (name: string) => void; onCancel: () => void; }> = ({ postData, onSave, onCancel, initialValue }) => { const [name, setName] = useState(initialValue); const t = useT(); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (name.trim()) { onSave(name.trim()); } }; return (
setName(e.target.value)} placeholder="Enter a name for this set" autoFocus />
); }; export const Sets: FC = () => { const fetch = useFetch(); const user = useUser(); const modal = useModals(); const toaster = useToaster(); const load = useCallback(async (path: string) => { return (await (await fetch(path)).json()).integrations; }, []); const { isLoading, data: integrations } = useSWR('/integrations/list', load, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, revalidateOnMount: true, refreshWhenHidden: false, refreshWhenOffline: false, fallbackData: [], }); const list = useCallback(async () => { return (await fetch('/sets')).json(); }, []); const { data, mutate } = useSWR('sets', list, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, revalidateOnMount: true, refreshWhenHidden: false, refreshWhenOffline: false, }); const addSet = useCallback( (params?: { id?: string; name?: string; content?: string }) => () => { modal.openModal({ id: 'add-edit-modal', closeOnClickOutside: false, removeLayout: true, closeOnEscape: false, withCloseButton: false, askClose: true, fullScreen: true, classNames: { modal: 'w-[100%] max-w-[1400px] text-textColor', }, children: ( ({ ...p, }))} {...(params?.id ? { set: JSON.parse(params.content) } : {})} addEditSets={(data) => { modal.openModal({ title: 'Save as Set', children: ( { try { await fetch('/sets', { method: 'POST', body: JSON.stringify({ ...(params?.id ? { id: params.id } : {}), name, content: JSON.stringify(data), }), }); modal.closeAll(); mutate(); toaster.show('Set saved successfully', 'success'); } catch (error) { toaster.show('Failed to save set', 'warning'); } }} onCancel={() => modal.closeAll()} /> ), }); }} reopenModal={() => {}} mutate={() => {}} integrations={integrations} date={newDayjs()} /> ), title: ``, }); }, [integrations] ); const deleteSet = useCallback( (data: any) => async () => { if (await deleteDialog(`Are you sure you want to delete ${data.name}?`)) { await fetch(`/sets/${data.id}`, { method: 'DELETE', }); mutate(); toaster.show('Set deleted successfully', 'success'); } }, [] ); const t = useT(); return (

Sets ({data?.length || 0})

Manage your content sets for easy reuse across posts.
{!!data?.length && (
{t('name', 'Name')}
{t('edit', 'Edit')}
{t('delete', 'Delete')}
{data?.map((p: any) => (
{p.name}
))}
)}
); };