refactor: replace SubmitButton component with inline button implementation and enhance styling
This commit is contained in:
parent
4e5dc53741
commit
e95db8e321
|
|
@ -1,58 +0,0 @@
|
||||||
/* 提交区域 */
|
|
||||||
.submit-section {
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
padding: 20px 14px;
|
|
||||||
padding-bottom: calc(20px + env(safe-area-inset-bottom));
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 提交按钮 */
|
|
||||||
.submit-button {
|
|
||||||
width: 100%;
|
|
||||||
height: 96px;
|
|
||||||
background: #000;
|
|
||||||
border-radius: 24px;
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 8px;
|
|
||||||
transition: all 0.2s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submit-text {
|
|
||||||
color: white;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submit-button.disabled {
|
|
||||||
background-color: #ccc;
|
|
||||||
cursor: not-allowed;
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 加载动画 */
|
|
||||||
.loading-spinner {
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
border: 2px solid rgb(255 255 255 / 30%);
|
|
||||||
border-top: 2px solid white;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
import { View, Button } from '@tarojs/components';
|
|
||||||
import { useI18n } from '../../../../hooks/useI18n';
|
|
||||||
import './index.css';
|
|
||||||
|
|
||||||
interface SubmitButtonProps {
|
|
||||||
disabled: boolean;
|
|
||||||
loading: boolean;
|
|
||||||
onSubmit: () => void;
|
|
||||||
className?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function SubmitButton({ disabled, loading, onSubmit, className = '' }: SubmitButtonProps) {
|
|
||||||
const { t } = useI18n();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<View className={`submit-section ${className}`}>
|
|
||||||
<Button className={`submit-button ${disabled || loading ? 'disabled' : ''}`} disabled={disabled || loading} onClick={onSubmit}>
|
|
||||||
{loading ? (
|
|
||||||
<>
|
|
||||||
<View className="loading-spinner" />
|
|
||||||
<View className="submit-text">{t('friendsPhoto.generating')}</View>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<View className="submit-text">{t('friendsPhoto.startGenerating')}</View>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
export { default as UploadCard } from './UploadCard';
|
|
||||||
export { default as SubmitButton } from './SubmitButton';
|
|
||||||
|
|
@ -18,3 +18,62 @@
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 提交区域 */
|
||||||
|
.submit-section {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
padding: 20px 14px;
|
||||||
|
padding-bottom: calc(20px + env(safe-area-inset-bottom));
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 提交按钮 */
|
||||||
|
.submit-button {
|
||||||
|
width: 100%;
|
||||||
|
height: 96px;
|
||||||
|
background: #000;
|
||||||
|
border-radius: 24px;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-text {
|
||||||
|
color: white;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit-button.disabled {
|
||||||
|
background-color: #ccc;
|
||||||
|
cursor: not-allowed;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 加载动画 */
|
||||||
|
.loading-spinner {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
border: 2px solid rgb(255 255 255 / 30%);
|
||||||
|
border-top: 2px solid white;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
import { View } from '@tarojs/components';
|
import { Template } from '@/sdk/sdk-server';
|
||||||
import { useState, useEffect } from 'react';
|
import { Button, View } from '@tarojs/components';
|
||||||
import Taro, { navigateTo, useRouter } from '@tarojs/taro';
|
import Taro, { navigateTo, useRouter } from '@tarojs/taro';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
import { useServerSdk } from '../../hooks/index';
|
import { useServerSdk } from '../../hooks/index';
|
||||||
import { useI18n } from '../../hooks/useI18n';
|
import { useI18n } from '../../hooks/useI18n';
|
||||||
import { i18nManager } from '../../i18n/manager';
|
import { i18nManager } from '../../i18n/manager';
|
||||||
|
|
||||||
// 导入组件
|
// 导入组件
|
||||||
import { UploadCard, SubmitButton } from './components';
|
import UploadCard from './components/UploadCard';
|
||||||
|
|
||||||
// 导入hooks
|
// 导入hooks
|
||||||
import { useImageUpload } from './hooks';
|
import { useImageUpload } from './hooks';
|
||||||
|
|
@ -15,6 +16,10 @@ import './index.css';
|
||||||
|
|
||||||
export default function FriendsPhoto() {
|
export default function FriendsPhoto() {
|
||||||
const { templateCode } = useRouter().params;
|
const { templateCode } = useRouter().params;
|
||||||
|
const [template, setTemplate] = useState<Template | null>(null);
|
||||||
|
|
||||||
|
console.log(template);
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const serverSdk = useServerSdk();
|
const serverSdk = useServerSdk();
|
||||||
|
|
||||||
|
|
@ -27,6 +32,15 @@ export default function FriendsPhoto() {
|
||||||
i18nManager.updateNavigationBarTitle('friends-photo');
|
i18nManager.updateNavigationBarTitle('friends-photo');
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchTemplate = async () => {
|
||||||
|
if (!templateCode) return;
|
||||||
|
const template = await serverSdk.getTemplate(templateCode);
|
||||||
|
setTemplate(template);
|
||||||
|
};
|
||||||
|
fetchTemplate();
|
||||||
|
}, [templateCode]);
|
||||||
|
|
||||||
// 提交处理
|
// 提交处理
|
||||||
const handleSubmit = async () => {
|
const handleSubmit = async () => {
|
||||||
if (!templateCode) {
|
if (!templateCode) {
|
||||||
|
|
@ -89,20 +103,29 @@ export default function FriendsPhoto() {
|
||||||
<View className="friends-photo">
|
<View className="friends-photo">
|
||||||
{/* 上传区域 */}
|
{/* 上传区域 */}
|
||||||
<View className="upload-section">
|
<View className="upload-section">
|
||||||
<UploadCard
|
<UploadCard imageUrl={image1} title={t('friendsPhoto.selectYourPhoto')} onUpload={() => uploadSingleImage(1)} />
|
||||||
imageUrl={image1}
|
<UploadCard imageUrl={image2} title={t('friendsPhoto.selectFriendPhoto')} onUpload={() => uploadSingleImage(2)} />
|
||||||
title={t('friendsPhoto.selectYourPhoto')}
|
|
||||||
onUpload={() => uploadSingleImage(1)}
|
|
||||||
/>
|
|
||||||
<UploadCard
|
|
||||||
imageUrl={image2}
|
|
||||||
title={t('friendsPhoto.selectFriendPhoto')}
|
|
||||||
onUpload={() => uploadSingleImage(2)}
|
|
||||||
/>
|
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* 固定底部按钮 */}
|
{/* 固定底部按钮 */}
|
||||||
<SubmitButton disabled={!image1 || !image2} loading={loading} onSubmit={handleSubmit} />
|
<View className="submit-section">
|
||||||
|
<Button
|
||||||
|
className={`submit-button ${!image1 || !image2 || loading ? 'disabled' : ''}`}
|
||||||
|
disabled={!image1 || !image2 || loading}
|
||||||
|
onClick={handleSubmit}
|
||||||
|
>
|
||||||
|
{loading ? (
|
||||||
|
<>
|
||||||
|
<View className="loading-spinner" />
|
||||||
|
<View className="submit-text">{t('friendsPhoto.generating')}</View>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<View className="submit-text">
|
||||||
|
${template?.creditCost} {t('friendsPhoto.startGenerating')}
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue