feat: add Husky hooks and fix provider tutorial UI/logic

- Add Husky pre-commit and pre-push hooks for linting, type checking, and build validation
- Fix visual hierarchy bug in the provider onboarding tutorial
- Remove feedback modal
- Move MinIO bucket creation logic to before app startup
- Wire MiniMax audio through voice generation pipeline
- Fix scene insertion issues
- Fix portal tutorial modal and harden panel variant task flow
This commit is contained in:
saturn
2026-03-09 02:42:35 +08:00
parent 881ed44996
commit fba480ae6e
34 changed files with 721 additions and 247 deletions

View File

@@ -15,7 +15,7 @@ export default function Navbar() {
const { data: session, status } = useSession()
const t = useTranslations('nav')
const tc = useTranslations('common')
const { currentVersion, update, shouldPulse, showModal, isChecking, openModal, dismissCurrentUpdate, checkNow } = useGithubReleaseUpdate()
const { currentVersion, update, shouldPulse, showModal, openModal, dismissCurrentUpdate, checkNow } = useGithubReleaseUpdate()
const [checkMsg, setCheckMsg] = useState<string | null>(null)
const [checkMsgFading, setCheckMsgFading] = useState(false)
const [manualChecking, setManualChecking] = useState(false)
@@ -101,15 +101,6 @@ export default function Navbar() {
</div>
) : session ? (
<>
<a
href="https://www.waoowaoo.com/community.html"
target="_blank"
rel="noopener noreferrer"
className="text-xs sm:text-sm text-[var(--glass-text-secondary)] hover:text-[var(--glass-text-primary)] font-medium transition-colors flex items-center gap-1"
>
<AppIcon name="usersRound" className="w-4 h-4" />
{t('feedback')}
</a>
<Link
href={{ pathname: '/workspace' }}
className="text-sm text-[var(--glass-text-secondary)] hover:text-[var(--glass-text-primary)] font-medium transition-colors flex items-center gap-1"
@@ -133,6 +124,15 @@ export default function Navbar() {
{t('profile')}
</Link>
<LanguageSwitcher />
<a
href="/api/admin/download-logs"
download
className="text-sm text-[var(--glass-text-secondary)] hover:text-[var(--glass-text-primary)] font-medium transition-colors flex items-center gap-1"
title={t('downloadLogs')}
>
<AppIcon name="download" className="w-4 h-4" />
{t('downloadLogs')}
</a>
</>
) : (

View File

@@ -1,9 +1,7 @@
'use client'
import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'
import { useTranslations, useLocale } from 'next-intl'
import { USER_FEEDBACK_FORM_URL } from '@/lib/feedback'
import { buildFeedbackLog, type FeedbackContextStage } from '@/lib/feedback-log'
import { useTranslations } from 'next-intl'
export type LLMStageViewStatus =
| 'pending'
@@ -41,9 +39,6 @@ export type LLMStageStreamCardProps = {
smoothStreaming?: boolean
errorMessage?: string
topRightAction?: ReactNode
feedbackStage?: FeedbackContextStage
projectId?: string
episodeId?: string | null
}
const PROGRESS_KEY_PREFIX = 'progress.'
@@ -187,13 +182,8 @@ export default function LLMStageStreamCard({
smoothStreaming = true,
errorMessage,
topRightAction,
feedbackStage,
projectId,
episodeId,
}: LLMStageStreamCardProps) {
const t = useTranslations('progress')
const locale = useLocale()
const feedbackLocale: 'zh' | 'en' = locale === 'en' ? 'en' : 'zh'
const resolveProgressText = useCallback((value: string | undefined, fallbackKey: string): string => {
const raw = typeof value === 'string' ? value.trim() : ''
@@ -398,34 +388,6 @@ export default function LLMStageStreamCard({
<span className="text-base"></span>
<span className="text-sm font-medium">{errorMessage}</span>
</div>
{feedbackStage && projectId && (
<div className="flex flex-wrap items-center gap-2 text-xs text-[var(--glass-text-secondary)]">
<button
type="button"
onClick={() => {
const log = buildFeedbackLog({
locale: feedbackLocale,
projectId,
episodeId: episodeId ?? undefined,
stage: feedbackStage,
errorMessage,
})
void navigator.clipboard.writeText(log)
}}
className="glass-btn-base glass-btn-secondary rounded-md px-2 py-1 text-[11px]"
>
{t('runConsole.copyErrorDetail')}
</button>
<a
href={USER_FEEDBACK_FORM_URL}
target="_blank"
rel="noopener noreferrer"
className="glass-btn-base glass-btn-primary rounded-md px-2 py-1 text-[11px]"
>
{t('runConsole.openFeedbackForm')}
</a>
</div>
)}
</div>
)}
</header>