From 21659046ec5257ccdd2dc4c53b83d2e39bedc870 Mon Sep 17 00:00:00 2001 From: Lio Date: Mon, 27 May 2024 18:11:38 +0200 Subject: [PATCH] refactor error, success and trashed messages --- resources/js/Components/Alert/Alert.tsx | 50 ++++++++++++++ .../js/Components/Button/CloseButton.tsx | 23 +++++++ .../js/Components/Messages/FlashMessages.tsx | 66 +++++++------------ .../js/Components/Messages/TrashedMessage.tsx | 37 ++++++----- resources/js/Pages/Contacts/Edit.tsx | 7 +- resources/js/Pages/Organizations/Edit.tsx | 7 +- resources/js/Pages/Users/Edit.tsx | 8 +-- 7 files changed, 130 insertions(+), 68 deletions(-) create mode 100644 resources/js/Components/Alert/Alert.tsx create mode 100644 resources/js/Components/Button/CloseButton.tsx diff --git a/resources/js/Components/Alert/Alert.tsx b/resources/js/Components/Alert/Alert.tsx new file mode 100644 index 0000000..e40f7fa --- /dev/null +++ b/resources/js/Components/Alert/Alert.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { Check, CircleX, TriangleAlert } from 'lucide-react'; +import CloseButton from '@/Components/Button/CloseButton'; + +interface Alert { + message: string; + icon?: React.ReactNode; + action?: React.ReactNode; + onClose?: () => void; + variant?: 'success' | 'error' | 'warning'; +} + +export default function Alert({ + icon, + action, + message, + variant, + onClose +}: Alert) { + const color = { + success: 'green', + error: 'red', + warning: 'yellow' + }[variant || 'success']; + + const backGroundColor = { + success: 'bg-green-500 text-white', + error: 'bg-red-500 text-white', + warning: 'bg-yellow-500 text-yellow-800' + }[variant || 'success']; + + const iconComponent = { + success: , + error: , + warning: + }[variant || 'success']; + + return ( +
+
+ {icon || iconComponent} +
{message}
+
+ {action} + {onClose && } +
+ ); +} diff --git a/resources/js/Components/Button/CloseButton.tsx b/resources/js/Components/Button/CloseButton.tsx new file mode 100644 index 0000000..d07d320 --- /dev/null +++ b/resources/js/Components/Button/CloseButton.tsx @@ -0,0 +1,23 @@ +import { ComponentProps } from 'react'; +import classNames from 'classnames'; +import { X } from 'lucide-react'; + +interface CloseButtonProps extends ComponentProps<'button'> { + color: string | 'red' | 'green'; +} + +export default function CloseButton({ color, onClick }: CloseButtonProps) { + const className = classNames('block -mr-2 fill-current', { + 'text-red-700 group-hover:text-red-800': color === 'red', + 'text-green-700 group-hover:text-green-800': color === 'green' + }); + return ( + + ); +} diff --git a/resources/js/Components/Messages/FlashMessages.tsx b/resources/js/Components/Messages/FlashMessages.tsx index 299c08a..65e6e5c 100644 --- a/resources/js/Components/Messages/FlashMessages.tsx +++ b/resources/js/Components/Messages/FlashMessages.tsx @@ -1,60 +1,40 @@ -import React, { useState, useEffect } from 'react'; +import { useState, useEffect } from 'react'; import { usePage } from '@inertiajs/react'; -import classNames from 'classnames'; import { PageProps } from '@/types'; -import { Check, CircleX, X } from 'lucide-react'; - -const ButtonClose = ({ color, onClick }) => { - const className = classNames('block fill-current', { - 'text-red-700 group-hover:text-red-800': color === 'red', - 'text-green-700 group-hover:text-green-800': color === 'green' - }); - return ( - - ); -}; +import Alert from '@/Components/Alert/Alert'; export default function FlashedMessages() { const [visible, setVisible] = useState(true); const { flash, errors } = usePage().props; - const numOfErrors = Object.keys(errors).length; + const formErrors = Object.keys(errors).length; useEffect(() => { setVisible(true); }, [flash, errors]); return ( -
+ <> {flash.success && visible && ( -
-
- -
- {flash.success} -
-
- setVisible(false)} color="green" /> -
+ setVisible(false)} + /> + )} + {flash.error && visible && ( + setVisible(false)} + /> )} - {(flash.error || numOfErrors > 0) && visible && ( -
-
- -
- {flash.error && flash.error} - {numOfErrors === 1 && 'There is one form error'} - {numOfErrors > 1 && `There are ${numOfErrors} form errors.`} -
-
- setVisible(false)} color="red" /> -
+ {formErrors > 0 && visible && ( + setVisible(false)} + /> )} -
+ ); } diff --git a/resources/js/Components/Messages/TrashedMessage.tsx b/resources/js/Components/Messages/TrashedMessage.tsx index 67051dd..9039a39 100644 --- a/resources/js/Components/Messages/TrashedMessage.tsx +++ b/resources/js/Components/Messages/TrashedMessage.tsx @@ -1,20 +1,27 @@ import { Trash2 } from 'lucide-react'; +import Alert from '@/Components/Alert/Alert'; -export default function TrashedMessage({ onRestore, children }) { +interface TrashedMessageProps { + message: string; + onRestore: () => void; +} + +export default function TrashedMessage({ + message, + onRestore +}: TrashedMessageProps) { return ( -
-
- -
{children}
-
- -
+ } + action={ +