| import { useHover } from 'ahooks' | import { useHover } from 'ahooks' | ||||
| import { RiFileTextFill, RiMoreFill, RiRobot2Fill } from '@remixicon/react' | import { RiFileTextFill, RiMoreFill, RiRobot2Fill } from '@remixicon/react' | ||||
| import Tooltip from '@/app/components/base/tooltip' | import Tooltip from '@/app/components/base/tooltip' | ||||
| import { useGetLanguage } from '@/context/i18n' | |||||
| import dayjs from 'dayjs' | |||||
| import relativeTime from 'dayjs/plugin/relativeTime' | |||||
| import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' | import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' | ||||
| import RenameDatasetModal from '../../rename-modal' | import RenameDatasetModal from '../../rename-modal' | ||||
| import Confirm from '@/app/components/base/confirm' | import Confirm from '@/app/components/base/confirm' | ||||
| import CornerLabel from '@/app/components/base/corner-label' | import CornerLabel from '@/app/components/base/corner-label' | ||||
| import { DOC_FORM_ICON_WITH_BG, DOC_FORM_TEXT } from '@/models/datasets' | import { DOC_FORM_ICON_WITH_BG, DOC_FORM_TEXT } from '@/models/datasets' | ||||
| import { useExportPipelineDSL } from '@/service/use-pipeline' | import { useExportPipelineDSL } from '@/service/use-pipeline' | ||||
| dayjs.extend(relativeTime) | |||||
| import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' | |||||
| const EXTERNAL_PROVIDER = 'external' | const EXTERNAL_PROVIDER = 'external' | ||||
| return t('dataset.partialEnabled', { count: dataset.document_count, num: availableDocCount }) | return t('dataset.partialEnabled', { count: dataset.document_count, num: availableDocCount }) | ||||
| }, [t, dataset.document_count, dataset.total_available_documents]) | }, [t, dataset.document_count, dataset.total_available_documents]) | ||||
| const language = useGetLanguage() | |||||
| const formatTimeFromNow = useCallback((time: number) => { | |||||
| return dayjs(time * 1_000).locale(language === 'zh_Hans' ? 'zh-cn' : language.replace('_', '-')).fromNow() | |||||
| }, [language]) | |||||
| const { formatTimeFromNow } = useFormatTimeFromNow() | |||||
| const openRenameModal = useCallback(() => { | const openRenameModal = useCallback(() => { | ||||
| setShowRenameModal(true) | setShowRenameModal(true) | ||||
| </Tooltip> | </Tooltip> | ||||
| )} | )} | ||||
| <span className='system-xs-regular text-divider-deep'>/</span> | <span className='system-xs-regular text-divider-deep'>/</span> | ||||
| <span className='system-xs-regular'>{`${t('dataset.updated')} ${formatTimeFromNow(dataset.updated_at)}`}</span> | |||||
| <span className='system-xs-regular'>{`${t('dataset.updated')} ${formatTimeFromNow(dataset.updated_at * 1000)}`}</span> | |||||
| </div> | </div> | ||||
| <div className='absolute right-2 top-2 z-[5] hidden group-hover:block'> | <div className='absolute right-2 top-2 z-[5] hidden group-hover:block'> | ||||
| <CustomPopover | <CustomPopover |
| import Button from '@/app/components/base/button' | import Button from '@/app/components/base/button' | ||||
| import { | import { | ||||
| useChecklistBeforePublish, | useChecklistBeforePublish, | ||||
| useFormatTimeFromNow, | |||||
| } from '@/app/components/workflow/hooks' | } from '@/app/components/workflow/hooks' | ||||
| import Divider from '@/app/components/base/divider' | import Divider from '@/app/components/base/divider' | ||||
| import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils' | import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils' | ||||
| import { useModalContextSelector } from '@/context/modal-context' | import { useModalContextSelector } from '@/context/modal-context' | ||||
| import Link from 'next/link' | import Link from 'next/link' | ||||
| import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' | import { useDatasetApiAccessUrl } from '@/hooks/use-api-access-url' | ||||
| import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' | |||||
| const PUBLISH_SHORTCUT = ['ctrl', '⇧', 'P'] | const PUBLISH_SHORTCUT = ['ctrl', '⇧', 'P'] | ||||
| export * from './use-inspect-vars-crud' | export * from './use-inspect-vars-crud' | ||||
| export * from './use-set-workflow-vars-with-value' | export * from './use-set-workflow-vars-with-value' | ||||
| export * from './use-workflow-search' | export * from './use-workflow-search' | ||||
| export * from './use-format-time-from-now' |
| import dayjs from 'dayjs' | |||||
| import { useCallback } from 'react' | |||||
| import { useI18N } from '@/context/i18n' | |||||
| export const useFormatTimeFromNow = () => { | |||||
| const { locale } = useI18N() | |||||
| const formatTimeFromNow = useCallback((time: number) => { | |||||
| return dayjs(time).locale(locale === 'zh-Hans' ? 'zh-cn' : locale).fromNow() | |||||
| }, [locale]) | |||||
| return { formatTimeFromNow } | |||||
| } |
| import relativeTime from 'dayjs/plugin/relativeTime' | import relativeTime from 'dayjs/plugin/relativeTime' | ||||
| import { useCallback } from 'react' | import { useCallback } from 'react' | ||||
| import { useI18N } from '@/context/i18n' | import { useI18N } from '@/context/i18n' | ||||
| import type { Locale } from '@/i18n-config' | |||||
| import 'dayjs/locale/de' | |||||
| import 'dayjs/locale/es' | |||||
| import 'dayjs/locale/fa' | |||||
| import 'dayjs/locale/fr' | |||||
| import 'dayjs/locale/hi' | |||||
| import 'dayjs/locale/id' | |||||
| import 'dayjs/locale/it' | |||||
| import 'dayjs/locale/ja' | |||||
| import 'dayjs/locale/ko' | |||||
| import 'dayjs/locale/pl' | |||||
| import 'dayjs/locale/pt-br' | |||||
| import 'dayjs/locale/ro' | |||||
| import 'dayjs/locale/ru' | |||||
| import 'dayjs/locale/sl' | |||||
| import 'dayjs/locale/th' | |||||
| import 'dayjs/locale/tr' | |||||
| import 'dayjs/locale/uk' | |||||
| import 'dayjs/locale/vi' | |||||
| import 'dayjs/locale/zh-cn' | import 'dayjs/locale/zh-cn' | ||||
| import 'dayjs/locale/zh-tw' | |||||
| dayjs.extend(relativeTime) | dayjs.extend(relativeTime) | ||||
| const localeMap: Record<Locale, string> = { | |||||
| 'en-US': 'en', | |||||
| 'zh-Hans': 'zh-cn', | |||||
| 'zh-Hant': 'zh-tw', | |||||
| 'pt-BR': 'pt-br', | |||||
| 'es-ES': 'es', | |||||
| 'fr-FR': 'fr', | |||||
| 'de-DE': 'de', | |||||
| 'ja-JP': 'ja', | |||||
| 'ko-KR': 'ko', | |||||
| 'ru-RU': 'ru', | |||||
| 'it-IT': 'it', | |||||
| 'th-TH': 'th', | |||||
| 'id-ID': 'id', | |||||
| 'uk-UA': 'uk', | |||||
| 'vi-VN': 'vi', | |||||
| 'ro-RO': 'ro', | |||||
| 'pl-PL': 'pl', | |||||
| 'hi-IN': 'hi', | |||||
| 'tr-TR': 'tr', | |||||
| 'fa-IR': 'fa', | |||||
| 'sl-SI': 'sl', | |||||
| } | |||||
| export const useFormatTimeFromNow = () => { | export const useFormatTimeFromNow = () => { | ||||
| const { locale } = useI18N() | const { locale } = useI18N() | ||||
| const formatTimeFromNow = useCallback((time: number) => { | const formatTimeFromNow = useCallback((time: number) => { | ||||
| return dayjs(time).locale(locale === 'zh-Hans' ? 'zh-cn' : locale).fromNow() | |||||
| const dayjsLocale = localeMap[locale] ?? 'en' | |||||
| return dayjs(time).locale(dayjsLocale).fromNow() | |||||
| }, [locale]) | }, [locale]) | ||||
| return { formatTimeFromNow } | return { formatTimeFromNow } |