mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-02-16 13:25:12 -05:00
This is a squash merge of a bajillion messy small commits created while iterating on the UI component library and redesign.
110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import { ExternalLinkIcon } from '@chakra-ui/icons';
|
|
import {
|
|
Flex,
|
|
Link,
|
|
Tab,
|
|
TabList,
|
|
TabPanel,
|
|
TabPanels,
|
|
Tabs,
|
|
} from '@chakra-ui/react';
|
|
import { IAINoContentFallback } from 'common/components/IAIImageFallback';
|
|
import { InvText } from 'common/components/InvText/wrapper';
|
|
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
|
|
import { memo } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useDebouncedMetadata } from 'services/api/hooks/useDebouncedMetadata';
|
|
import type { ImageDTO } from 'services/api/types';
|
|
|
|
import DataViewer from './DataViewer';
|
|
import ImageMetadataActions from './ImageMetadataActions';
|
|
import ImageMetadataWorkflowTabContent from './ImageMetadataWorkflowTabContent';
|
|
|
|
type ImageMetadataViewerProps = {
|
|
image: ImageDTO;
|
|
};
|
|
|
|
const ImageMetadataViewer = ({ image }: ImageMetadataViewerProps) => {
|
|
// TODO: fix hotkeys
|
|
// const dispatch = useAppDispatch();
|
|
// useHotkeys('esc', () => {
|
|
// dispatch(setShouldShowImageDetails(false));
|
|
// });
|
|
const { t } = useTranslation();
|
|
|
|
const { metadata } = useDebouncedMetadata(image.image_name);
|
|
|
|
return (
|
|
<Flex
|
|
layerStyle="first"
|
|
sx={{
|
|
padding: 4,
|
|
gap: 1,
|
|
flexDirection: 'column',
|
|
width: 'full',
|
|
height: 'full',
|
|
borderRadius: 'base',
|
|
position: 'absolute',
|
|
overflow: 'hidden',
|
|
}}
|
|
>
|
|
<Flex gap={2}>
|
|
<InvText fontWeight="semibold">{t('common.file')}:</InvText>
|
|
<Link href={image.image_url} isExternal maxW="calc(100% - 3rem)">
|
|
{image.image_name}
|
|
<ExternalLinkIcon mx="2px" />
|
|
</Link>
|
|
</Flex>
|
|
|
|
<Tabs
|
|
variant="line"
|
|
sx={{
|
|
display: 'flex',
|
|
flexDir: 'column',
|
|
w: 'full',
|
|
h: 'full',
|
|
}}
|
|
isLazy={true}
|
|
>
|
|
<TabList>
|
|
<Tab>{t('metadata.recallParameters')}</Tab>
|
|
<Tab>{t('metadata.metadata')}</Tab>
|
|
<Tab>{t('metadata.imageDetails')}</Tab>
|
|
<Tab>{t('metadata.workflow')}</Tab>
|
|
</TabList>
|
|
|
|
<TabPanels>
|
|
<TabPanel>
|
|
{metadata ? (
|
|
<ScrollableContent>
|
|
<ImageMetadataActions metadata={metadata} />
|
|
</ScrollableContent>
|
|
) : (
|
|
<IAINoContentFallback label={t('metadata.noRecallParameters')} />
|
|
)}
|
|
</TabPanel>
|
|
<TabPanel>
|
|
{metadata ? (
|
|
<DataViewer data={metadata} label={t('metadata.metadata')} />
|
|
) : (
|
|
<IAINoContentFallback label={t('metadata.noMetaData')} />
|
|
)}
|
|
</TabPanel>
|
|
<TabPanel>
|
|
{image ? (
|
|
<DataViewer data={image} label={t('metadata.imageDetails')} />
|
|
) : (
|
|
<IAINoContentFallback label={t('metadata.noImageDetails')} />
|
|
)}
|
|
</TabPanel>
|
|
<TabPanel>
|
|
<ImageMetadataWorkflowTabContent image={image} />
|
|
</TabPanel>
|
|
</TabPanels>
|
|
</Tabs>
|
|
</Flex>
|
|
);
|
|
};
|
|
|
|
export default memo(ImageMetadataViewer);
|