diff --git a/src/app/auth/github/content.tsx b/src/app/auth/github/content.tsx index c11e3e12..e0f411a0 100644 --- a/src/app/auth/github/content.tsx +++ b/src/app/auth/github/content.tsx @@ -16,8 +16,6 @@ function GithubOAuthContent(props: GithubOAuthContentProps) { useAuthSuccessed(resp.called, resp.loading, resp.error, resp.data?.githubAuth) useEffect(() => { if (!code) { - console.log('no code') - // TODO: redirect return } diff --git a/src/app/dash/[userid]/home/page.tsx b/src/app/dash/[userid]/home/page.tsx index 4c0fed0a..93fef1f5 100644 --- a/src/app/dash/[userid]/home/page.tsx +++ b/src/app/dash/[userid]/home/page.tsx @@ -62,8 +62,7 @@ export async function generateMetadata(props: PageProps): Promise { return profileGenerateMetadata({ profile: profileResponse.data!.me, }) - } catch (e) { - console.error(e) + } catch { return profileGenerateMetadata({}) } } diff --git a/src/app/dash/[userid]/profile/page.tsx b/src/app/dash/[userid]/profile/page.tsx index 9aafa314..75e73eff 100644 --- a/src/app/dash/[userid]/profile/page.tsx +++ b/src/app/dash/[userid]/profile/page.tsx @@ -42,13 +42,12 @@ export async function generateMetadata(props: PageProps): Promise { } async function Page(props: PageProps) { - const [params, searchParams, ck, { t }] = await Promise.all([ + const [params, , ck, { t }] = await Promise.all([ props.params, props.searchParams, cookies(), getTranslation(), ]) - const withProfileEditor = searchParams.with_profile_editor const pathUid: string = params.userid const myUidStr = ck.get(USER_ID_KEY)?.value const myUid = myUidStr ? parseInt(myUidStr, 10) : undefined @@ -75,7 +74,6 @@ async function Page(props: PageProps) { }, }) - console.log('withProfileEditor', withProfileEditor) return (
{/* Main profile section */} diff --git a/src/components/RichTextEditor/markdown-components.tsx b/src/components/RichTextEditor/markdown-components.tsx index 94821b0e..0027a961 100644 --- a/src/components/RichTextEditor/markdown-components.tsx +++ b/src/components/RichTextEditor/markdown-components.tsx @@ -20,11 +20,11 @@ const Heading = ({ level, children }: HeadingProps) => { level === 6 && 'mb-4 text-base text-gray-800 dark:text-gray-200' ) - const Tag = `h${level}` as any + const Tag = `h${level}` as React.ElementType return {children} } -export const MarkdownComponents: any = { +export const MarkdownComponents: Record>>> = { h1: ({ children, ...props diff --git a/src/components/auth.metamask.tsx b/src/components/auth.metamask.tsx index d003fd57..eb05b259 100644 --- a/src/components/auth.metamask.tsx +++ b/src/components/auth.metamask.tsx @@ -1,70 +1,5 @@ 'use client' -/* METAMASK DISABLED - Package removed to prevent hydration errors -import { useSDK } from '@metamask/sdk-react' -// import MetamaskLogo from './icons/metamask.logo.svg' -import { useRouter } from 'next/navigation' -import { useCallback } from 'react' -import { toast } from 'react-hot-toast' -import { useAuthBy3rdPartSuccessed } from '../hooks/hooks' -import { useAuthByWeb3LazyQuery } from '../schema/generated' -import { signDataByWeb3 } from '../utils/wallet' -import MetamaskButtonView from './auth/metamask' - -function AuthByMetamask() { - const router = useRouter() - const [doAuth, doAuthData] = useAuthByWeb3LazyQuery() - const { sdk: metamaskSDK } = useSDK() - // const err = hooks.useError() - const onMetamaskLogin = useCallback(async () => { - if (!metamaskSDK) { - return - } - try { - const res = await signDataByWeb3(metamaskSDK) - const r = await doAuth({ - variables: { - payload: { - address: res.address!, - signature: res.signature!, - text: res.text, - }, - }, - }) - if (r.data?.loginByWeb3.noAccountFrom3rdPart) { - router.push( - `/auth/callback/metamask?a=${res.address}&s=${res.signature}&t=${encodeURIComponent(res.text)}` - ) - return - } - - } catch (err: any) { - toast.error(err.message) - } - }, [doAuth, router, metamaskSDK]) - - useAuthBy3rdPartSuccessed( - doAuthData.called, - doAuthData.loading, - doAuthData.error, - doAuthData.data?.loginByWeb3 - ) - - const disabled = doAuthData.loading - - return ( - - ) -} - -export default AuthByMetamask -*/ - -// Disabled MetaMask component - returns null function AuthByMetamask() { return null } diff --git a/src/components/auth/apple-standalone.tsx b/src/components/auth/apple-standalone.tsx index f618b7f9..a180ad04 100644 --- a/src/components/auth/apple-standalone.tsx +++ b/src/components/auth/apple-standalone.tsx @@ -101,7 +101,6 @@ export default function AppleStandaloneLoginButton({ onSuccess?.() } catch (error) { - console.error('Apple login error:', error) const errorMessage = error instanceof Error ? error.message : 'Login failed' toast.error(`Apple login failed: ${errorMessage}`, { id: authToast }) @@ -111,9 +110,9 @@ export default function AppleStandaloneLoginButton({ } } - const handleAppleError = (error: any) => { - console.error('Apple Sign-In error:', error) - toast.error(`Apple Sign-In failed: ${error?.error || 'Unknown error'}`) + const handleAppleError = (error: unknown) => { + const errorObj = error as Record | null + toast.error(`Apple Sign-In failed: ${errorObj?.error || 'Unknown error'}`) setIsLoading(false) } diff --git a/src/components/auth/apple.tsx b/src/components/auth/apple.tsx index da8f2bbd..f0cb41ec 100644 --- a/src/components/auth/apple.tsx +++ b/src/components/auth/apple.tsx @@ -10,7 +10,7 @@ type AppleLoginButtonViewProps = { disabled?: boolean onSuccess: (resp: AppleAuthResponse) => void - onError: (error: any) => void + onError: (error: unknown) => void version?: 'v2' | 'v4' } const authOptions = { diff --git a/src/components/auth/metamask-standalone.tsx b/src/components/auth/metamask-standalone.tsx index 22a93818..e0b6a710 100644 --- a/src/components/auth/metamask-standalone.tsx +++ b/src/components/auth/metamask-standalone.tsx @@ -1,140 +1,10 @@ 'use client' -/* METAMASK DISABLED - Package removed to prevent hydration errors -import { useSDK } from '@metamask/sdk-react' -import * as sentry from '@sentry/react' -import { useRouter } from 'next/navigation' -import { useState } from 'react' -import toast from 'react-hot-toast' -import { syncLoginStateToServer } from '@/actions/login' -import { COOKIE_TOKEN_KEY, USER_ID_KEY } from '@/constants/storage' -import { useAuthByWeb3LazyQuery } from '@/schema/generated' -import { updateToken } from '@/services/ajax' -import profile from '@/utils/profile' -import { signDataByWeb3 } from '@/utils/wallet' -import MetamaskButtonView from './metamask' - -interface MetaMaskStandaloneLoginButtonProps { - className?: string - onSuccess?: () => void -} - -export default function MetaMaskStandaloneLoginButton({ - className, - onSuccess, -}: MetaMaskStandaloneLoginButtonProps) { - const router = useRouter() - const [isLoading, setIsLoading] = useState(false) - const { sdk: metamaskSDK } = useSDK() - const [doWeb3Auth] = useAuthByWeb3LazyQuery() - - const handleMetaMaskLogin = async () => { - if (!metamaskSDK) { - toast.error('MetaMask SDK not initialized') - return - } - - setIsLoading(true) - - try { - // Step 1: Connect wallet and sign message - const connectToast = toast.loading('Connecting to MetaMask...') - const walletData = await signDataByWeb3(metamaskSDK) - toast.success('Connected to MetaMask', { id: connectToast }) - - // Step 2: Authenticate with backend - const authToast = toast.loading('Authenticating...') - const authResponse = await doWeb3Auth({ - variables: { - payload: { - address: walletData.address, - signature: walletData.signature, - text: walletData.text, - }, - }, - }) - - const loginData = authResponse.data?.loginByWeb3 - - if (!loginData) { - throw new Error('Authentication failed') - } - - // Step 3: Handle new user flow - if (loginData.noAccountFrom3rdPart) { - toast.dismiss(authToast) - const { address, signature, text } = walletData - router.push( - `/auth/callback/metamask?a=${address}&s=${signature}&t=${encodeURIComponent(text)}` - ) - return - } - - // Step 4: Store authentication data - const { user, token } = loginData - - await syncLoginStateToServer({ uid: user.id, token }) - - localStorage.setItem( - COOKIE_TOKEN_KEY, - JSON.stringify({ - profile: user, - token, - createdAt: Date.now(), - }) - ) - sessionStorage.setItem(COOKIE_TOKEN_KEY, token) - sessionStorage.setItem(USER_ID_KEY, user.id.toString()) - - profile.token = token - profile.uid = user.id - - sentry.setUser({ - email: user.email, - id: user.id.toString(), - username: user.name, - }) - - updateToken(token) - - toast.success('Successfully logged in!', { id: authToast }) - - // Step 5: Navigate to dashboard - setTimeout(() => { - const domain = user.domain.length > 2 ? user.domain : user.id - router.push(`/dash/${domain}/home?from_auth=1`) - }, 100) - - onSuccess?.() - } catch (error) { - console.error('MetaMask login error:', error) - const errorMessage = - error instanceof Error ? error.message : 'Login failed' - toast.error(`MetaMask login failed: ${errorMessage}`) - } finally { - setIsLoading(false) - } - } - - return ( -
- -
- ) -} -*/ - interface MetaMaskStandaloneLoginButtonProps { className?: string onSuccess?: () => void } -// Disabled MetaMask component - returns null -// eslint-disable-next-line @typescript-eslint/no-unused-vars export default function MetaMaskStandaloneLoginButton( _props: MetaMaskStandaloneLoginButtonProps ) { diff --git a/src/components/auth/otp-box.tsx b/src/components/auth/otp-box.tsx index 6f34cd39..daa4e376 100644 --- a/src/components/auth/otp-box.tsx +++ b/src/components/auth/otp-box.tsx @@ -9,7 +9,7 @@ type OTPBoxProps = { autoValidate?: boolean loading: boolean - onSubmit(val: string): Promise + onSubmit(val: string): Promise } // TODO: resend case @@ -25,8 +25,8 @@ function OTPBox(props: OTPBoxProps) { } try { await props.onSubmit(otp) - } catch (e: any) { - setHasErrorMsg(e.message) + } catch (e: unknown) { + setHasErrorMsg(e instanceof Error ? e.message : 'Unknown error') } }, [otp, props]) diff --git a/src/components/avatar/avatar.tsx b/src/components/avatar/avatar.tsx index f2c389bd..ecafb5ea 100644 --- a/src/components/avatar/avatar.tsx +++ b/src/components/avatar/avatar.tsx @@ -32,10 +32,15 @@ function Avatar(props: AvatarProps) { const { ref, isHovering } = useHover() if (props.img === '') { - return ( + return props.onClick ? ( + {isOpen && ( (() => { - // if (!bg) { - // return undefined - // } - // return { - // // backgroundImage: `url(https://picsum.photos/${width}/${height}/?blur=10)` - // backgroundImage: `url(${bg})`, - // } - // }, []) - // TODO: 预处理 - // https://lokeshdhakar.com/projects/color-thief/#getting-started - // + dark theme or light theme return (
(null) - - // useEffect(() => { - // import('emoji-mart').then((EmojiMart) => { - // new EmojiMart.Picker({ - // ...props, - // // data: data as any, - // // ref - // }) - // }) - // }, []) - - // return
- return + return {}} /> } export default EmojiPicker diff --git a/src/components/input.tsx b/src/components/input.tsx index 3593418f..fe4ab644 100644 --- a/src/components/input.tsx +++ b/src/components/input.tsx @@ -38,7 +38,7 @@ function FieldInput(props: FieldInputProps) { (() => { try { return JSON.parse(props.data.metadata) - } catch (e) { - console.error(e) + } catch { return null } }, [props.data.metadata]) @@ -58,8 +57,9 @@ function NFTGallaryItem(props: NFTGallaryItemProps) { return
} return ( -
{ if (props.onClick) { props.onClick(props.data, realImageUrl) @@ -69,9 +69,6 @@ function NFTGallaryItem(props: NFTGallaryItemProps) {
{props.data.name} @@ -80,7 +77,7 @@ function NFTGallaryItem(props: NFTGallaryItemProps) { {metadata?.name ?? ''}
-
+ ) } diff --git a/src/components/nfts/nft-gallary.tsx b/src/components/nfts/nft-gallary.tsx index dc6c45fb..6f779a98 100644 --- a/src/components/nfts/nft-gallary.tsx +++ b/src/components/nfts/nft-gallary.tsx @@ -23,7 +23,19 @@ function NFTGallary(props: NFTGallaryProps) { }, [data?.me.nfts.edges]) if (loading) { - return loading NFTs... + return ( +
+ {Array.from({ length: 4 }).map((_, i) => ( +
+
+
+
+
+
+
+ ))} +
+ ) } if (!loading && nftList.length === 0) { diff --git a/src/components/preview/preview4.tsx b/src/components/preview/preview4.tsx index f63a6577..b84a20f9 100644 --- a/src/components/preview/preview4.tsx +++ b/src/components/preview/preview4.tsx @@ -54,8 +54,7 @@ function Preview(props: PreviewProps) { toast.success(t('app.clipping.preview.success')) }, - onError: (err: any) => { - console.log(err) + onError: (err: Error) => { toast.error(err.toString()) }, }) diff --git a/src/components/sign-in-with-apple/sign-in-with-apple.tsx b/src/components/sign-in-with-apple/sign-in-with-apple.tsx deleted file mode 100644 index 7c57a27c..00000000 --- a/src/components/sign-in-with-apple/sign-in-with-apple.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useCallback, useEffect } from 'react' - -import { SignInWithAppleOptions } from '../../constants/config' - -const scriptURL = - 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js' - -const scriptDomId = 'sign-in-with-app-script' -function SignInWithApple() { - useEffect(() => { - const has = document.querySelector(`#${scriptDomId}`) - if (has) { - return - } - const dom = document.createElement('script') - dom.src = scriptURL - document.body.appendChild(dom) - - function onScriptLoad() { - if (!window.AppleID) { - return - } - window.AppleID.auth.init(SignInWithAppleOptions) - } - - function onAppleSignInSuccess(data: any) { - console.log(data) - } - - function onAppleSignInFail(err: any) { - console.log(err) - } - - dom.addEventListener('load', onScriptLoad) - - //Listen for authorization success - document.addEventListener('AppleIDSignInOnSuccess', onAppleSignInSuccess) - //Listen for authorization failures - document.addEventListener('AppleIDSignInOnFailure', onAppleSignInFail) - - return () => { - document.removeEventListener( - 'AppleIDSignInOnSuccess', - onAppleSignInSuccess - ) - document.removeEventListener('AppleIDSignInOnFailure', onAppleSignInFail) - document.removeChild(dom) - } - }, []) - - const onSignin = useCallback(async () => { - const response = await window.AppleID?.auth.signIn() - return response - }, []) - - return ( -
- -
- ) -} - -export default SignInWithApple diff --git a/src/hooks/my-file.tsx b/src/hooks/my-file.tsx index ff575359..607c7709 100644 --- a/src/hooks/my-file.tsx +++ b/src/hooks/my-file.tsx @@ -56,10 +56,9 @@ export function useUploadData(_: boolean, willSyncServer: boolean) { try { send({ type: 'Next' }) str = await extraFile(file) - } catch (e: any) { - console.error(e, e.toString()) + } catch (e: unknown) { send({ type: 'Error' }) - setMessages((m) => m.concat(e.toString())) + setMessages((m) => m.concat(e instanceof Error ? e.message : String(e))) return } @@ -83,8 +82,8 @@ export function useUploadData(_: boolean, willSyncServer: boolean) { try { const v = JSON.parse(uploadedClippingValue) as string[] uploadedClippings = new Set(v) - } catch (e) { - console.error(e) + } catch { + // ignore invalid cached data } } const allDigests = await Promise.all( @@ -131,8 +130,8 @@ export function useUploadData(_: boolean, willSyncServer: boolean) { if (resp.count > 0) { i.bookId = resp.books[0].doubanId.toString() } - } catch (e: any) { - setMessages((m) => m.concat(e.toString())) + } catch (e: unknown) { + setMessages((m) => m.concat(e instanceof Error ? e.message : String(e))) } finally { wenquSearchResult.current.set(i.title, i.bookId ? ~~i.bookId : 0) } @@ -199,9 +198,9 @@ export function useUploadData(_: boolean, willSyncServer: boolean) { setAt(chunkedData.length) toast.success(t('app.upload.tips.done')) send({ type: 'Next' }) - } catch (e: any) { + } catch (e: unknown) { send({ type: 'Error' }) - setMessages((m) => m.concat(e.toString())) + setMessages((m) => m.concat(e instanceof Error ? e.message : String(e))) } finally { client.resetStore() }