From a430284aa21e3ae1f0d5654e55b2ad2852519cc2 Mon Sep 17 00:00:00 2001
From: wwf <yearningwang@iqtogether.com>
Date: 星期三, 04 六月 2025 15:17:49 +0800
Subject: [PATCH] 初始化

---
 app/components/app/overview/settings/index.tsx |  128 +++++++++++++++++++-----------------------
 1 files changed, 57 insertions(+), 71 deletions(-)

diff --git a/app/components/app/overview/settings/index.tsx b/app/components/app/overview/settings/index.tsx
index c0a5fdf..f9d13b9 100644
--- a/app/components/app/overview/settings/index.tsx
+++ b/app/components/app/overview/settings/index.tsx
@@ -162,20 +162,9 @@
       return check
     }
 
-    const validatePrivacyPolicy = (privacyPolicy: string | null) => {
-      if (privacyPolicy === null || privacyPolicy?.length === 0)
-        return true
-
-      return privacyPolicy.startsWith('http://') || privacyPolicy.startsWith('https://')
-    }
-
     if (inputInfo !== null) {
       if (!validateColorHex(inputInfo.chatColorTheme)) {
         notify({ type: 'error', message: t(`${prefixSettings}.invalidHexMessage`) })
-        return
-      }
-      if (!validatePrivacyPolicy(inputInfo.privacyPolicy)) {
-        notify({ type: 'error', message: t(`${prefixSettings}.invalidPrivacyPolicy`) })
         return
       }
     }
@@ -232,24 +221,24 @@
         className='max-w-[520px] p-0'
       >
         {/* header */}
-        <div className='pb-3 pl-6 pr-5 pt-5'>
+        <div className='pl-6 pt-5 pr-5 pb-3'>
           <div className='flex items-center gap-1'>
-            <div className='title-2xl-semi-bold grow text-text-primary'>{t(`${prefixSettings}.title`)}</div>
+            <div className='grow text-text-primary title-2xl-semi-bold'>{t(`${prefixSettings}.title`)}</div>
             <ActionButton className='shrink-0' onClick={onHide}>
-              <RiCloseLine className='h-4 w-4' />
+              <RiCloseLine className='w-4 h-4' />
             </ActionButton>
           </div>
-          <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+          <div className='mt-0.5 text-text-tertiary system-xs-regular'>
             <span>{t(`${prefixSettings}.modalTip`)}</span>
-            <Link href={`${locale === LanguagesSupported[1] ? 'https://docs.dify.ai/zh-hans/guides/application-publishing/launch-your-webapp-quickly#she-zhi-ni-de-ai-zhan-dian' : 'https://docs.dify.ai/en/guides/application-publishing/launch-your-webapp-quickly/README'}`} target='_blank' rel='noopener noreferrer' className='text-text-accent'>{t('common.operation.learnMore')}</Link>
+            <Link href={`${locale === LanguagesSupported[1] ? 'https://docs.dify.ai/zh-hans/guides/application-publishing/launch-your-webapp-quickly#she-zhi-ni-de-ai-zhan-dian' : 'https://docs.dify.ai/guides/application-publishing/launch-your-webapp-quickly#setting-up-your-ai-site'}`} target='_blank' rel='noopener noreferrer' className='text-text-accent'>{t('common.operation.learnMore')}</Link>
           </div>
         </div>
         {/* form body */}
-        <div className='space-y-5 px-6 py-3'>
+        <div className='px-6 py-3 space-y-5'>
           {/* name & icon */}
           <div className='flex gap-4'>
             <div className='grow'>
-              <div className={cn('system-sm-semibold mb-1 py-1 text-text-secondary')}>{t(`${prefixSettings}.webName`)}</div>
+              <div className={cn('mb-1 py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.webName`)}</div>
               <Input
                 className='w-full'
                 value={inputInfo.title}
@@ -269,46 +258,45 @@
           </div>
           {/* description */}
           <div className='relative'>
-            <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.webDesc`)}</div>
+            <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.webDesc`)}</div>
             <Textarea
               className='mt-1'
               value={inputInfo.desc}
               onChange={e => onDesChange(e.target.value)}
               placeholder={t(`${prefixSettings}.webDescPlaceholder`) as string}
             />
-            <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.webDescTip`)}</p>
+            <p className={cn('pb-0.5 text-text-tertiary body-xs-regular')}>{t(`${prefixSettings}.webDescTip`)}</p>
           </div>
-          <Divider className="my-0 h-px" />
+          <Divider className="h-px my-0" />
           {/* answer icon */}
           {isChat && (
             <div className='w-full'>
-              <div className='flex items-center justify-between'>
-                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t('app.answerIcon.title')}</div>
+              <div className='flex justify-between items-center'>
+                <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t('app.answerIcon.title')}</div>
                 <Switch
                   defaultValue={inputInfo.use_icon_as_answer_icon}
                   onChange={v => setInputInfo({ ...inputInfo, use_icon_as_answer_icon: v })}
                 />
               </div>
-              <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t('app.answerIcon.description')}</p>
+              <p className='pb-0.5 text-text-tertiary body-xs-regular'>{t('app.answerIcon.description')}</p>
             </div>
           )}
           {/* language */}
           <div className='flex items-center'>
-            <div className={cn('system-sm-semibold grow py-1 text-text-secondary')}>{t(`${prefixSettings}.language`)}</div>
+            <div className={cn('grow py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.language`)}</div>
             <SimpleSelect
               wrapperClassName='w-[200px]'
               items={languages.filter(item => item.supported)}
               defaultValue={language}
               onSelect={item => setLanguage(item.value as Language)}
-              notClearable
             />
           </div>
           {/* theme color */}
           {isChat && (
             <div className='flex items-center'>
               <div className='grow'>
-                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.chatColorTheme`)}</div>
-                <div className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.chatColorThemeDesc`)}</div>
+                <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.chatColorTheme`)}</div>
+                <div className='pb-0.5 body-xs-regular text-text-tertiary'>{t(`${prefixSettings}.chatColorThemeDesc`)}</div>
               </div>
               <div className='shrink-0'>
                 <Input
@@ -317,7 +305,7 @@
                   onChange={onChange('chatColorTheme')}
                   placeholder='E.g #A020F0'
                 />
-                <div className='flex items-center justify-between'>
+                <div className='flex justify-between items-center'>
                   <p className={cn('body-xs-regular text-text-tertiary')}>{t(`${prefixSettings}.chatColorThemeInverted`)}</p>
                   <Switch defaultValue={inputInfo.chatColorThemeInverted} onChange={v => setInputInfo({ ...inputInfo, chatColorThemeInverted: v })}></Switch>
                 </div>
@@ -326,24 +314,24 @@
           )}
           {/* workflow detail */}
           <div className='w-full'>
-            <div className='flex items-center justify-between'>
-              <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.workflow.subTitle`)}</div>
+            <div className='flex justify-between items-center'>
+              <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.workflow.subTitle`)}</div>
               <Switch
                 disabled={!(appInfo.mode === 'workflow' || appInfo.mode === 'advanced-chat')}
                 defaultValue={inputInfo.show_workflow_steps}
                 onChange={v => setInputInfo({ ...inputInfo, show_workflow_steps: v })}
               />
             </div>
-            <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.workflow.showDesc`)}</p>
+            <p className='pb-0.5 text-text-tertiary body-xs-regular'>{t(`${prefixSettings}.workflow.showDesc`)}</p>
           </div>
           {/* SSO */}
           {systemFeatures.enable_web_sso_switch_component && (
             <>
-              <Divider className="my-0 h-px" />
+              <Divider className="h-px my-0" />
               <div className='w-full'>
-                <p className='system-xs-medium-uppercase mb-1 text-text-tertiary'>{t(`${prefixSettings}.sso.label`)}</p>
-                <div className='flex items-center justify-between'>
-                  <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.sso.title`)}</div>
+                <p className='mb-1 system-xs-medium-uppercase text-text-tertiary'>{t(`${prefixSettings}.sso.label`)}</p>
+                <div className='flex justify-between items-center'>
+                  <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.sso.title`)}</div>
                   <Tooltip
                     disabled={systemFeatures.sso_enforced_for_web}
                     popupContent={
@@ -354,19 +342,19 @@
                     <Switch disabled={!systemFeatures.sso_enforced_for_web || !isCurrentWorkspaceEditor} defaultValue={systemFeatures.sso_enforced_for_web && inputInfo.enable_sso} onChange={v => setInputInfo({ ...inputInfo, enable_sso: v })}></Switch>
                   </Tooltip>
                 </div>
-                <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.sso.description`)}</p>
+                <p className='pb-0.5 body-xs-regular text-text-tertiary'>{t(`${prefixSettings}.sso.description`)}</p>
               </div>
             </>
           )}
           {/* more settings switch */}
-          <Divider className="my-0 h-px" />
+          <Divider className="h-px my-0" />
           {!isShowMore && (
-            <div className='flex cursor-pointer items-center' onClick={() => setIsShowMore(true)}>
+            <div className='flex items-center cursor-pointer' onClick={() => setIsShowMore(true)}>
               <div className='grow'>
-                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.entry`)}</div>
-                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.more.copyRightPlaceholder`)} & {t(`${prefixSettings}.more.privacyPolicyPlaceholder`)}</p>
+                <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.more.entry`)}</div>
+                <p className={cn('pb-0.5 text-text-tertiary body-xs-regular')}>{t(`${prefixSettings}.more.copyRightPlaceholder`)} & {t(`${prefixSettings}.more.privacyPolicyPlaceholder`)}</p>
               </div>
-              <RiArrowRightSLine className='ml-1 h-4 w-4 shrink-0 text-text-secondary' />
+              <RiArrowRightSLine className='shrink-0 ml-1 w-4 h-4 text-text-secondary'/>
             </div>
           )}
           {/* more settings */}
@@ -375,13 +363,13 @@
               {/* copyright */}
               <div className='w-full'>
                 <div className='flex items-center'>
-                  <div className='flex grow items-center'>
-                    <div className={cn('system-sm-semibold mr-1 py-1 text-text-secondary')}>{t(`${prefixSettings}.more.copyright`)}</div>
+                  <div className='grow flex items-center'>
+                    <div className={cn('mr-1 py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.more.copyright`)}</div>
                     {/* upgrade button */}
                     {enableBilling && isFreePlan && (
-                      <div className='h-[18px] select-none'>
+                      <div className='select-none h-[18px]'>
                         <PremiumBadge size='s' color='blue' allowHover={true} onClick={handlePlanClick}>
-                          <SparklesSoft className='flex h-3.5 w-3.5 items-center py-[1px] pl-[3px] text-components-premium-badge-indigo-text-stop-0' />
+                          <SparklesSoft className='flex items-center py-[1px] pl-[3px] w-3.5 h-3.5 text-components-premium-badge-indigo-text-stop-0' />
                           <div className='system-xs-medium'>
                             <span className='p-1'>
                               {t('billing.upgradeBtn.encourageShort')}
@@ -405,7 +393,7 @@
                     />
                   </Tooltip>
                 </div>
-                <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.more.copyrightTip`)}</p>
+                <p className='pb-0.5 text-text-tertiary body-xs-regular'>{t(`${prefixSettings}.more.copyrightTip`)}</p>
                 {inputInfo.copyrightSwitchValue && (
                   <Input
                     className='mt-2 h-10'
@@ -417,11 +405,11 @@
               </div>
               {/* privacy policy */}
               <div className='w-full'>
-                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.privacyPolicy`)}</div>
-                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>
+                <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.more.privacyPolicy`)}</div>
+                <p className={cn('pb-0.5 body-xs-regular text-text-tertiary')}>
                   <Trans
                     i18nKey={`${prefixSettings}.more.privacyPolicyTip`}
-                    components={{ privacyPolicyLink: <Link href={'https://dify.ai/privacy'} target='_blank' rel='noopener noreferrer' className='text-text-accent' /> }}
+                    components={{ privacyPolicyLink: <Link href={'https://docs.dify.ai/user-agreement/privacy-policy'} target='_blank' rel='noopener noreferrer' className='text-text-accent' /> }}
                   />
                 </p>
                 <Input
@@ -433,8 +421,8 @@
               </div>
               {/* custom disclaimer */}
               <div className='w-full'>
-                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.customDisclaimer`)}</div>
-                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.more.customDisclaimerTip`)}</p>
+                <div className={cn('py-1 text-text-secondary system-sm-semibold')}>{t(`${prefixSettings}.more.customDisclaimer`)}</div>
+                <p className={cn('pb-0.5 body-xs-regular text-text-tertiary')}>{t(`${prefixSettings}.more.customDisclaimerTip`)}</p>
                 <Textarea
                   className='mt-1'
                   value={inputInfo.customDisclaimer}
@@ -446,29 +434,27 @@
           )}
         </div>
         {/* footer */}
-        <div className='flex justify-end p-6 pt-5'>
+        <div className='p-6 pt-5 flex justify-end'>
           <Button className='mr-2' onClick={onHide}>{t('common.operation.cancel')}</Button>
           <Button variant='primary' onClick={onClickSave} loading={saveLoading}>{t('common.operation.save')}</Button>
         </div>
-
-        {showAppIconPicker && (
-          <div onClick={e => e.stopPropagation()}>
-            <AppIconPicker
-              onSelect={(payload) => {
-                setAppIcon(payload)
-                setShowAppIconPicker(false)
-              }}
-              onClose={() => {
-                setAppIcon(icon_type === 'image'
-                  ? { type: 'image', url: icon_url!, fileId: icon }
-                  : { type: 'emoji', icon, background: icon_background! })
-                setShowAppIconPicker(false)
-              }}
-            />
-          </div>
-        )}
-      </Modal>
+      </Modal >
+      {showAppIconPicker && (
+        <AppIconPicker
+          onSelect={(payload) => {
+            setAppIcon(payload)
+            setShowAppIconPicker(false)
+          }}
+          onClose={() => {
+            setAppIcon(icon_type === 'image'
+              ? { type: 'image', url: icon_url!, fileId: icon }
+              : { type: 'emoji', icon, background: icon_background! })
+            setShowAppIconPicker(false)
+          }}
+        />
+      )}
     </>
+
   )
 }
 export default React.memo(SettingsModal)

--
Gitblit v1.8.0