feat: replace error state handling with toast in login, register, and subscribe dialogs

This commit is contained in:
Ardeman 2025-03-15 17:25:08 +08:00
parent 4c3a143338
commit e7ef7177ca
4 changed files with 12 additions and 31 deletions

View File

@ -1,5 +1,6 @@
import { zodResolver } from '@hookform/resolvers/zod' import { zodResolver } from '@hookform/resolvers/zod'
import { useEffect, useState } from 'react' import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { useFetcher } from 'react-router' import { useFetcher } from 'react-router'
import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { RemixFormProvider, useRemixForm } from 'remix-hook-form'
import { z } from 'zod' import { z } from 'zod'
@ -25,7 +26,6 @@ export const DialogLogin = () => {
isLoginOpen, isLoginOpen,
} = useNewsContext() } = useNewsContext()
const fetcher = useFetcher() const fetcher = useFetcher()
const [error, setError] = useState<string>()
const formMethods = useRemixForm<TLoginSchema>({ const formMethods = useRemixForm<TLoginSchema>({
mode: 'onSubmit', mode: 'onSubmit',
@ -37,11 +37,10 @@ export const DialogLogin = () => {
useEffect(() => { useEffect(() => {
if (!fetcher.data?.success) { if (!fetcher.data?.success) {
setError(fetcher.data?.message) toast.error(fetcher.data?.message)
return return
} }
setError(undefined)
setIsLoginOpen(false) setIsLoginOpen(false)
if (fetcher.data?.user.subscribe?.subscribe_plan?.code === 'basic') { if (fetcher.data?.user.subscribe?.subscribe_plan?.code === 'basic') {
@ -84,10 +83,6 @@ export const DialogLogin = () => {
type="password" type="password"
/> />
{error && (
<div className="text-sm text-red-500 capitalize">{error}</div>
)}
<div className="flex items-center justify-between text-sm"> <div className="flex items-center justify-between text-sm">
<span className="text-gray-600">Lupa Kata Sandi?</span> <span className="text-gray-600">Lupa Kata Sandi?</span>
<Button <Button

View File

@ -1,6 +1,7 @@
import { DevTool } from '@hookform/devtools' import { DevTool } from '@hookform/devtools'
import { zodResolver } from '@hookform/resolvers/zod' import { zodResolver } from '@hookform/resolvers/zod'
import { useEffect, useState } from 'react' import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { useFetcher, useRouteLoaderData } from 'react-router' import { useFetcher, useRouteLoaderData } from 'react-router'
import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { RemixFormProvider, useRemixForm } from 'remix-hook-form'
import { z } from 'zod' import { z } from 'zod'
@ -44,7 +45,6 @@ export const DialogRegister = () => {
setIsSuccessOpen, setIsSuccessOpen,
isRegisterOpen, isRegisterOpen,
} = useNewsContext() } = useNewsContext()
const [error, setError] = useState<string>()
const fetcher = useFetcher() const fetcher = useFetcher()
const loaderData = useRouteLoaderData<typeof loader>('routes/_news') const loaderData = useRouteLoaderData<typeof loader>('routes/_news')
const { subscribePlanData: subscribePlan } = loaderData || {} const { subscribePlanData: subscribePlan } = loaderData || {}
@ -59,11 +59,10 @@ export const DialogRegister = () => {
useEffect(() => { useEffect(() => {
if (!fetcher.data?.success) { if (!fetcher.data?.success) {
setError(fetcher.data?.message) toast.error(fetcher.data?.message)
return return
} }
setError(undefined)
setIsRegisterOpen(false) setIsRegisterOpen(false)
setIsSuccessOpen('register') setIsSuccessOpen('register')
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
@ -126,10 +125,6 @@ export const DialogRegister = () => {
options={subscribePlan} options={subscribePlan}
/> />
{error && (
<div className="text-sm text-red-500 capitalize">{error}</div>
)}
<Button <Button
isLoading={fetcher.state !== 'idle'} isLoading={fetcher.state !== 'idle'}
disabled={fetcher.state !== 'idle'} disabled={fetcher.state !== 'idle'}

View File

@ -1,5 +1,6 @@
import { zodResolver } from '@hookform/resolvers/zod' import { zodResolver } from '@hookform/resolvers/zod'
import { useEffect, useState } from 'react' import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { useFetcher, useRouteLoaderData } from 'react-router' import { useFetcher, useRouteLoaderData } from 'react-router'
import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { RemixFormProvider, useRemixForm } from 'remix-hook-form'
import { z } from 'zod' import { z } from 'zod'
@ -30,7 +31,6 @@ export const DialogSubscribePlan = () => {
const { setIsSubscribeOpen, setIsSuccessOpen, isSubscribeOpen } = const { setIsSubscribeOpen, setIsSuccessOpen, isSubscribeOpen } =
useNewsContext() useNewsContext()
const fetcher = useFetcher() const fetcher = useFetcher()
const [error, setError] = useState<string>()
const loaderData = useRouteLoaderData<typeof loader>('routes/_news') const loaderData = useRouteLoaderData<typeof loader>('routes/_news')
const { subscribePlanData: subscribePlan } = loaderData || {} const { subscribePlanData: subscribePlan } = loaderData || {}
@ -44,11 +44,10 @@ export const DialogSubscribePlan = () => {
useEffect(() => { useEffect(() => {
if (!fetcher.data?.success) { if (!fetcher.data?.success) {
setError(fetcher.data?.message) toast.error(fetcher.data?.message)
return return
} }
setError(undefined)
setIsSubscribeOpen(false) setIsSubscribeOpen(false)
setIsSuccessOpen('payment') setIsSuccessOpen('payment')
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
@ -80,10 +79,6 @@ export const DialogSubscribePlan = () => {
options={subscribePlan} options={subscribePlan}
/> />
{error && (
<div className="text-sm text-red-500 capitalize">{error}</div>
)}
<Button <Button
isLoading={fetcher.state !== 'idle'} isLoading={fetcher.state !== 'idle'}
disabled={fetcher.state !== 'idle'} disabled={fetcher.state !== 'idle'}

View File

@ -1,5 +1,6 @@
import { zodResolver } from '@hookform/resolvers/zod' import { zodResolver } from '@hookform/resolvers/zod'
import { useEffect, useState } from 'react' import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { Link, useFetcher } from 'react-router' import { Link, useFetcher } from 'react-router'
import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { RemixFormProvider, useRemixForm } from 'remix-hook-form'
import { z } from 'zod' import { z } from 'zod'
@ -22,13 +23,12 @@ export const AdminLoginPage = () => {
fetcher, fetcher,
resolver: zodResolver(loginSchema), resolver: zodResolver(loginSchema),
}) })
const [error, setError] = useState<string>()
const { handleSubmit } = formMethods const { handleSubmit } = formMethods
useEffect(() => { useEffect(() => {
if (!fetcher.data?.success) { if (!fetcher.data?.success) {
setError(fetcher.data?.message) toast.error(fetcher.data?.message)
return return
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
@ -72,10 +72,6 @@ export const AdminLoginPage = () => {
type="password" type="password"
/> />
{error && (
<div className="text-sm text-red-500 capitalize">{error}</div>
)}
{/* Lupa Kata Sandi */} {/* Lupa Kata Sandi */}
<div className="mb-4 flex justify-between"> <div className="mb-4 flex justify-between">
<span className="text-gray-600">Lupa Kata Sandi?</span> <span className="text-gray-600">Lupa Kata Sandi?</span>