Commit 3b190467 authored by JzoNg's avatar JzoNg

update i18n and style of creatioin from app template

parent 804a0904
...@@ -17,7 +17,7 @@ const CreateAppCard = forwardRef<HTMLAnchorElement, CreateAppCardProps>(({ onSuc ...@@ -17,7 +17,7 @@ const CreateAppCard = forwardRef<HTMLAnchorElement, CreateAppCardProps>(({ onSuc
const { t } = useTranslation() const { t } = useTranslation()
const { onPlanInfoChanged } = useProviderContext() const { onPlanInfoChanged } = useProviderContext()
const [showNewAppDialog, setShowNewAppDialog] = useState(true) const [showNewAppDialog, setShowNewAppDialog] = useState(false)
const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false) const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false)
return ( return (
<a <a
......
...@@ -2,15 +2,12 @@ ...@@ -2,15 +2,12 @@
import type { MouseEventHandler } from 'react' import type { MouseEventHandler } from 'react'
import { useCallback, useEffect, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
// import useSWR from 'swr'
import cn from 'classnames' import cn from 'classnames'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
// import Dialog from '@/app/components/base/dialog'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
// import Input from '@/app/components/base/input'
// import type { AppMode } from '@/types/app' // import type { AppMode } from '@/types/app'
import { ToastContext } from '@/app/components/base/toast' import { ToastContext } from '@/app/components/base/toast'
// import { createApp, fetchAppTemplates } from '@/service/apps' // import { createApp, fetchAppTemplates } from '@/service/apps'
......
...@@ -60,7 +60,7 @@ const Apps = ({ ...@@ -60,7 +60,7 @@ const Apps = ({
const [currApp, setCurrApp] = React.useState<App | null>(null) const [currApp, setCurrApp] = React.useState<App | null>(null)
const [isShowCreateModal, setIsShowCreateModal] = React.useState(false) const [isShowCreateModal, setIsShowCreateModal] = React.useState(false)
const onCreate: CreateAppModalProps['onConfirm'] = async ({ name, icon, icon_background }) => { const onCreate: CreateAppModalProps['onConfirm'] = async ({ name, icon, icon_background, description }) => {
const { app_model_config: model_config } = await fetchAppDetail(currApp?.app.id as string) const { app_model_config: model_config } = await fetchAppDetail(currApp?.app.id as string)
try { try {
...@@ -69,6 +69,7 @@ const Apps = ({ ...@@ -69,6 +69,7 @@ const Apps = ({
icon, icon,
icon_background, icon_background,
mode: currApp?.app.mode as AppMode, mode: currApp?.app.mode as AppMode,
description,
config: model_config, config: model_config,
}) })
setIsShowCreateModal(false) setIsShowCreateModal(false)
......
'use client' 'use client'
import React, { useState } from 'react' import React, { useState } from 'react'
import cn from 'classnames'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import s from './style.module.css'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
...@@ -10,6 +8,8 @@ import AppIcon from '@/app/components/base/app-icon' ...@@ -10,6 +8,8 @@ import AppIcon from '@/app/components/base/app-icon'
import EmojiPicker from '@/app/components/base/emoji-picker' import EmojiPicker from '@/app/components/base/emoji-picker'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import AppsFull from '@/app/components/billing/apps-full-in-dialog' import AppsFull from '@/app/components/billing/apps-full-in-dialog'
import { XClose } from '@/app/components/base/icons/src/vender/line/general'
export type CreateAppModalProps = { export type CreateAppModalProps = {
appName: string appName: string
show: boolean show: boolean
...@@ -17,6 +17,7 @@ export type CreateAppModalProps = { ...@@ -17,6 +17,7 @@ export type CreateAppModalProps = {
name: string name: string
icon: string icon: string
icon_background: string icon_background: string
description: string
}) => Promise<void> }) => Promise<void>
onHide: () => void onHide: () => void
} }
...@@ -30,9 +31,9 @@ const CreateAppModal = ({ ...@@ -30,9 +31,9 @@ const CreateAppModal = ({
const { t } = useTranslation() const { t } = useTranslation()
const [name, setName] = React.useState(appName) const [name, setName] = React.useState(appName)
const [showEmojiPicker, setShowEmojiPicker] = useState(false) const [showEmojiPicker, setShowEmojiPicker] = useState(false)
const [emoji, setEmoji] = useState({ icon: '🤖', icon_background: '#FFEAD5' }) const [emoji, setEmoji] = useState({ icon: '🤖', icon_background: '#FFEAD5' })
const [description, setDescription] = useState('')
const { plan, enableBilling } = useProviderContext() const { plan, enableBilling } = useProviderContext()
const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps) const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
...@@ -45,6 +46,7 @@ const CreateAppModal = ({ ...@@ -45,6 +46,7 @@ const CreateAppModal = ({
onConfirm({ onConfirm({
name, name,
...emoji, ...emoji,
description,
}) })
onHide() onHide()
} }
...@@ -53,20 +55,46 @@ const CreateAppModal = ({ ...@@ -53,20 +55,46 @@ const CreateAppModal = ({
<> <>
<Modal <Modal
isShow={show} isShow={show}
onClose={() => { }} onClose={() => {}}
wrapperClassName='z-40' wrapperClassName='z-40'
className={cn(s.modal, '!max-w-[480px]', 'px-8')} className='relative !max-w-[480px] px-8'
> >
<span className={s.close} onClick={onHide} /> <div className='absolute right-4 top-4 p-2 cursor-pointer' onClick={onHide}>
<div className={s.title}>{t('explore.appCustomize.title', { name: appName })}</div> <XClose className='w-4 h-4 text-gray-500' />
<div className={s.content}> </div>
<div className={s.subTitle}>{t('explore.appCustomize.subTitle')}</div> <div className='mb-9 font-semibold text-xl leading-[30px] text-gray-900'>{t('explore.appCustomize.title', { name: appName })}</div>
<div className='flex items-center justify-between space-x-3'> <div className='mb-9'>
<AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.icon} background={emoji.icon_background} /> {/* icon & name */}
<input <div className='pt-2'>
value={name} <div className='py-2 text-sm font-medium leading-[20px] text-gray-900'>{t('app.newApp.captionName')}</div>
onChange={e => setName(e.target.value)} <div className='flex items-center justify-between space-x-3'>
className='h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg grow' <AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.icon} background={emoji.icon_background} />
<input
value={name}
onChange={e => setName(e.target.value)}
placeholder={t('app.newApp.appNamePlaceholder') || ''}
className='grow h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg border border-transparent outline-none appearance-none caret-primary-600 placeholder:text-gray-400 hover:bg-gray-50 hover:border hover:border-gray-300 focus:bg-gray-50 focus:border focus:border-gray-300 focus:shadow-xs'
/>
</div>
{showEmojiPicker && <EmojiPicker
onSelect={(icon, icon_background) => {
setEmoji({ icon, icon_background })
setShowEmojiPicker(false)
}}
onClose={() => {
setEmoji({ icon: '🤖', icon_background: '#FFEAD5' })
setShowEmojiPicker(false)
}}
/>}
</div>
{/* description */}
<div className='pt-2'>
<div className='py-2 text-sm font-medium leading-[20px] text-gray-900'>{t('app.newApp.captionDescription')}</div>
<textarea
className='w-full h-10 px-3 py-2 text-sm font-normal bg-gray-100 rounded-lg border border-transparent outline-none appearance-none caret-primary-600 placeholder:text-gray-400 hover:bg-gray-50 hover:border hover:border-gray-300 focus:bg-gray-50 focus:border focus:border-gray-300 focus:shadow-xs h-[80px] resize-none'
placeholder={t('app.newApp.appDescriptionPlaceholder') || ''}
value={description}
onChange={e => setDescription(e.target.value)}
/> />
</div> </div>
{isAppsFull && <AppsFull loc='app-explore-create' />} {isAppsFull && <AppsFull loc='app-explore-create' />}
......
.modal {
position: relative;
}
.modal .close {
position: absolute;
right: 16px;
top: 25px;
width: 32px;
height: 32px;
border-radius: 8px;
background: center no-repeat url(~@/app/components/datasets/create/assets/close.svg);
background-size: 16px;
cursor: pointer;
}
.modal .title {
@apply mb-9;
font-weight: 600;
font-size: 20px;
line-height: 30px;
color: #101828;
}
.modal .content {
@apply mb-9;
font-weight: 400;
font-size: 14px;
line-height: 20px;
color: #101828;
}
.subTitle {
margin-bottom: 8px;
font-weight: 500;
}
\ No newline at end of file
...@@ -6,10 +6,6 @@ const translation = { ...@@ -6,10 +6,6 @@ const translation = {
agent: 'Agente', agent: 'Agente',
workflow: 'Fluxo de trabalho', workflow: 'Fluxo de trabalho',
}, },
modes: {
completion: 'Gerador de Texto',
chat: 'Aplicativo de Chat',
},
duplicate: 'Duplicar', duplicate: 'Duplicar',
duplicateTitle: 'Duplicate aplicativo', duplicateTitle: 'Duplicate aplicativo',
export: 'Exportar DSL', export: 'Exportar DSL',
...@@ -23,13 +19,20 @@ const translation = { ...@@ -23,13 +19,20 @@ const translation = {
communityIntro: communityIntro:
'Discuta com membros da equipe, colaboradores e desenvolvedores em diferentes canais.', 'Discuta com membros da equipe, colaboradores e desenvolvedores em diferentes canais.',
roadmap: 'Veja nosso roteiro', roadmap: 'Veja nosso roteiro',
appNamePlaceholder: 'Por favor, digite o nome do aplicativo',
newApp: { newApp: {
startToCreate: 'Vamos começar com o seu novo aplicativo', startFromBlank: 'Começar de um aplicativo em branco',
captionName: 'Dê um nome ao seu aplicativo', startFromTemplate: 'Começar a partir de um modelo',
captionAppType: 'Que tipo de aplicativo você deseja?', captionAppType: 'Que tipo de aplicativo você deseja?',
chatbotDescription: 'Construir um assistente baseado em chat usando um Modelo de Linguagem de Grande Escala',
agentDescription: 'Construir um Agente inteligente que pode escolher autonomamente ferramentas para completar as tarefas',
workflowDescription: 'Description text here',
captionName: 'Dê um nome ao seu aplicativo',
appNamePlaceholder: 'Dê um nome ao seu aplicativo',
captionDescription: 'Descrição',
appDescriptionPlaceholder: 'Enter the description of the app',
useTemplate: 'Insira a descrição do aplicativo',
previewDemo: 'Visualizar demonstração', previewDemo: 'Visualizar demonstração',
chatApp: 'Aplicativo de Chat', chatApp: 'Usar este modelo',
chatAppIntro: chatAppIntro:
'Quero construir um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo várias rodadas de conversa contínua.', 'Quero construir um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo várias rodadas de conversa contínua.',
agentAssistant: 'Assistente de novo agente', agentAssistant: 'Assistente de novo agente',
......
...@@ -6,10 +6,6 @@ const translation = { // Add the Ukrainian translation object ...@@ -6,10 +6,6 @@ const translation = { // Add the Ukrainian translation object
agent: 'Агент', agent: 'Агент',
workflow: 'Робочий Процес', workflow: 'Робочий Процес',
}, },
modes: {
completion: 'Генератор тексту',
chat: 'Базовий асистент',
},
duplicate: 'Дублювати', duplicate: 'Дублювати',
duplicateTitle: 'Дублювати додаток', duplicateTitle: 'Дублювати додаток',
export: 'Експортувати DSL', export: 'Експортувати DSL',
...@@ -23,11 +19,18 @@ const translation = { // Add the Ukrainian translation object ...@@ -23,11 +19,18 @@ const translation = { // Add the Ukrainian translation object
communityIntro: communityIntro:
'Обговорюйте різні питання з членами команди, учасниками та розробниками на різних каналах.', 'Обговорюйте різні питання з членами команди, учасниками та розробниками на різних каналах.',
roadmap: 'Ознайомтеся з нашою дорожньою картою', roadmap: 'Ознайомтеся з нашою дорожньою картою',
appNamePlaceholder: 'Будь ласка, введіть назву додатка',
newApp: { newApp: {
startToCreate: 'Давайте створимо Ваш новий додаток', startFromBlank: 'Розпочати з порожнього додатку',
captionName: 'Значок та назва додатка', startFromTemplate: 'Розпочати з шаблону',
captionAppType: 'Який тип додатка Ви бажаєте створити?', captionAppType: 'Який тип додатка Ви бажаєте створити?',
chatbotDescription: 'Побудувати чат-асистента, використовуючи Модель Великої Мови',
agentDescription: 'Побудувати розумного Агента, який може автономно обирати інструменти для виконання завдань',
workflowDescription: 'Description text here',
captionName: 'Значок та назва додатка',
appNamePlaceholder: 'Назвіть свій додаток',
captionDescription: 'Опис',
appDescriptionPlaceholder: 'Введіть опис додатку',
useTemplate: 'Використати цей шаблон',
previewDemo: 'Попередній перегляд демо', previewDemo: 'Попередній перегляд демо',
chatApp: 'Асистент', chatApp: 'Асистент',
chatAppIntro: chatAppIntro:
......
...@@ -18,7 +18,6 @@ const translation = { ...@@ -18,7 +18,6 @@ const translation = {
join: '参与社区', join: '参与社区',
communityIntro: '与团队成员、贡献者和开发者在不同频道中交流', communityIntro: '与团队成员、贡献者和开发者在不同频道中交流',
roadmap: '产品路线图', roadmap: '产品路线图',
appNamePlaceholder: '请输入应用名称',
newApp: { newApp: {
startFromBlank: '开始创建新应用', startFromBlank: '开始创建新应用',
startFromTemplate: '从应用模版创建', startFromTemplate: '从应用模版创建',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment