packages/sdk/src/components/expand-record/ExpandRecorder.tsx
import type { IRecord } from '@teable/core';
import { deleteRecord } from '@teable/openapi';
import { useToast } from '@teable/ui-lib';
import { useEffect, type FC, type PropsWithChildren } from 'react';
import { useLocalStorage } from 'react-use';
import { LocalStorageKeys } from '../../config/local-storage-keys';
import { StandaloneViewProvider, ViewProvider } from '../../context';
import { useTranslation } from '../../context/app/i18n';
import { useBaseId, useTableId, useTablePermission } from '../../hooks';
import { ExpandRecord } from './ExpandRecord';
import type { ExpandRecordModel } from './type';
const Wrap: FC<PropsWithChildren<{ tableId: string }>> = (props) => {
const { tableId, children } = props;
const currentTableId = useTableId();
const baseId = useBaseId();
if (tableId !== currentTableId) {
return (
<StandaloneViewProvider baseId={baseId} tableId={tableId}>
<ViewProvider>{children}</ViewProvider>
</StandaloneViewProvider>
);
}
return <>{children}</>;
};
interface IExpandRecorderProps {
tableId: string;
viewId?: string;
recordId?: string;
commentId?: string;
recordIds?: string[];
model?: ExpandRecordModel;
serverData?: IRecord;
onClose?: () => void;
onUpdateRecordIdCallback?: (recordId: string) => void;
}
export const ExpandRecorder = (props: IExpandRecorderProps) => {
const {
model,
tableId,
recordId,
recordIds,
serverData,
onClose,
onUpdateRecordIdCallback,
commentId,
} = props;
const { toast } = useToast();
const { t } = useTranslation();
const permission = useTablePermission();
const editable = Boolean(permission['record|update']);
const canRead = Boolean(permission['record|read']);
const canDelete = Boolean(permission['record|delete']);
const [recordHistoryVisible, setRecordHistoryVisible] = useLocalStorage<boolean>(
LocalStorageKeys.RecordHistoryVisible,
false
);
const [commentVisible, setCommentVisible] = useLocalStorage<boolean>(
LocalStorageKeys.CommentVisible,
!!commentId || false
);
useEffect(() => {
commentId && setCommentVisible(true);
}, [commentId, setCommentVisible]);
if (!recordId) {
return <></>;
}
const updateCurrentRecordId = (recordId: string) => {
onUpdateRecordIdCallback?.(recordId);
};
const onCopyUrl = () => {
const url = window.location.href;
navigator.clipboard.writeText(url);
toast({ description: t('expandRecord.copy') });
};
const onRecordHistoryToggle = () => {
setCommentVisible(false);
setRecordHistoryVisible(!recordHistoryVisible);
};
const onCommentToggle = () => {
setRecordHistoryVisible(false);
setCommentVisible(!commentVisible);
};
return (
<div id={`${tableId}-${recordId}`}>
<Wrap tableId={tableId}>
<ExpandRecord
visible
model={model}
recordId={recordId}
recordIds={recordIds}
commentId={commentId}
serverData={serverData?.id === recordId ? serverData : undefined}
recordHistoryVisible={editable && recordHistoryVisible}
commentVisible={canRead && commentVisible}
onClose={onClose}
onPrev={updateCurrentRecordId}
onNext={updateCurrentRecordId}
onCopyUrl={onCopyUrl}
onRecordHistoryToggle={onRecordHistoryToggle}
onCommentToggle={onCommentToggle}
onDelete={async () => {
if (canDelete) await deleteRecord(tableId, recordId);
}}
/>
</Wrap>
</div>
);
};