برنامه نویسی

افزایش تجربه کاربر: اجرای اعلان ها ، مدالها و لودرها در CMS مبتنی بر React

اگر برای این آموزش به کد منبع نیاز دارید می توانید آن را از اینجا دریافت کنید.

تقویت تجربه کاربر برای هر سیستم مدیریت محتوای مدرن بسیار مهم است. در این مقاله ، ما به اجرای سه مؤلفه ضروری UI خواهیم رسید که باعث بهبود چشمگیر و بازخورد CMS مبتنی بر واکنش ما می شود: اعلان ها برای بازخورد کاربر و لودر برای مدیریت حالت های بارگذاری. این مؤلفه ها نه تنها CMS ما را حرفه ای تر می کنند بلکه بازخورد بصری روشنی را در طول تعامل خود در اختیار کاربران قرار می دهند. بنابراین ، بیایید شروع کنیم:

1. اجرای سیستم اعلان

یکی از مهمترین مواردی که باید درک کنیم این است که تمام این قسمت های UX مؤلفه هایی هستند که ما باید در صفحات مختلف از آن استفاده کنیم ، بنابراین آنها باید در سطح جهان در دسترس باشند. این کار ذخیره “Redux” ما را که ما در مقاله قبلی خود اجرا کردیم ، حل می کند. همچنین ، ما یک سیستم اعلان ایجاد خواهیم کرد که در آن می توانیم پیام های زیادی را همزمان نشان دهیم ، به همین دلیل ما به عنوان یک کانتینر برای لیست پیام ها و خود مؤلفه پیام به یک آرایه نیاز داریم. نگران نباشید ، وقتی شروع به برنامه نویسی می کنیم ، همه چیز واضح خواهد بود.

  • یک پوشه جدید در “فروشگاه” ایجاد کنید ، ما آن را “پایه” خواهیم نامید.

  • در داخل پوشه “پایه” ما “base.reducer.js” ، “base.action.js” ، “base.selector.js” ، “base.types.js” را ایجاد خواهیم کرد.

  • در داخل پرونده “انواع” باید برای ایجاد و حذف پیام ها دو نوع اضافه کنیم.

const BASE_ACTION_TYPES = {
    PUSH_NEW_NOTIFICATION: 'base/PUSH_NEW_NOTIFICATION',
    REMOVE_NOTIFICATION: 'base/REMOVE_NOTIFICATION',
};

export default BASE_ACTION_TYPES;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • “ایالت” حاوی مجموعه ای خالی از اعلان های ما خواهد بود ، و “کاهش دهنده” دارای دو مورد خواهد بود (اعلان جدید را فشار دهید و فقط اعلان های فعال را فیلتر کنید).
import BASE_ACTION_TYPES from './base.types';

export const BASE_INITIAL_STATE = {
    notifications: [],
};
export const baseReducer = (state = BASE_INITIAL_STATE, action = {}) => {
    const { type, payload } = action;
    switch (type) {
        case BASE_ACTION_TYPES.PUSH_NEW_NOTIFICATION:
            return { ...state, notifications: [payload, ...state.notifications] };
        case BASE_ACTION_TYPES.REMOVE_NOTIFICATION:
            return { ...state, notifications: state.notifications.filter((n) => n.id !== payload) };
        default:
            return state;
    }
};
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • پرونده “عمل” همچنین شامل دو عمل خواهد بود ، اولین مورد یک اعلان جدید با شناسه منحصر به فرد ایجاد می کند و مقدار زمان بندی را تنظیم می کند که این اعلان را از لیست حذف می کند و مورد دوم یک اعلان را با شناسه حذف می کند.
import { v4 as uuid } from 'uuid';
import BASE_ACTION_TYPES from './base.types';
import { createAction } from '../../utils/reducer.utils';

export const aPushNewNotification = (notification) => {
  return (dispatch) => {
    notification.id = uuid();
    dispatch(createAction(BASE_ACTION_TYPES.PUSH_NEW_NOTIFICATION, notification));
    setTimeout(() => {
      dispatch(aRemoveNotification(notification.id));
    }, 5000);
  };
};

export const aRemoveNotification = (id) =>
  createAction(BASE_ACTION_TYPES.REMOVE_NOTIFICATION, id);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • “انتخاب کننده” به سادگی لیست اعلان ها را برمی گرداند.
export const sNotificationsList = (state) => state.base.notifications;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

به نظر می رسد عالی است ، ما ذخیره خود را برای اجرای قابلیت های اعلان ها در CM های React خود آماده کردیم ، اکنون می توانیم به اجزای “اعلان ها” برویم.

  • یک پوشه جدید “UI” را در داخل “مؤلفه ها” و یک پوشه جدید “اعلان” ایجاد کنید.

  • یک پرونده جدید “notification.component.jsx” اضافه کنید که قلاب “استفاده شده” را وارد می کند ، لیستی از نمادهای کتابخانه “MUI” و یک عمل اعلان “حذف”. این یک تابع اعلان حذف خواهد داشت که عمل ما را فراخوانی می کند ، و این مؤلفه سه نوع اعلان ها (موفقیت ، خطا ، هشدار) را برمی گرداند ، که به نوع اعلان بستگی دارد.

import React from 'react';
import { useDispatch } from 'react-redux';
import { aRemoveNotification } from '../../../store/base/base.action';
import CheckIcon from '@mui/icons-material/Check';
import CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';
import PriorityHighOutlinedIcon from '@mui/icons-material/PriorityHighOutlined';
import ReportProblemOutlinedIcon from '@mui/icons-material/ReportProblemOutlined';

const Notification = ({ notification }) => {
    const dispatch = useDispatch();
    const closeNotification = () => {
        dispatch(aRemoveNotification(notification.id));
    }

    if (notification.type === 'error') {
        return (
            <div className="notification">
                <div className="alert alert-error">
                    <div className="icon__wrapper">
                        <PriorityHighOutlinedIcon className="icon-style" />
                    </div>
                    <p>{notification.text}</p>
                    <CloseOutlinedIcon className="close" onClick={closeNotification} />
                </div>
            </div>
        );
    } else if (notification.type === 'success') {
        return (
            <div className="notification">
                <div className="alert alert-success">
                    <div className="icon__wrapper">
                        <CheckIcon className="icon-style" />
                    </div>
                    <p>{notification.text}</p>
                    <CloseOutlinedIcon className="close" onClick={closeNotification} />
                </div>
            </div>
        );
    } else if (notification.type === 'warning') {
        return (
            <div className="notification">
                <div className="alert alert-warning">
                    <div className="icon__wrapper">
                        <ReportProblemOutlinedIcon className="icon-style" />
                    </div>
                    <p>{notification.text}</p>
                    <CloseOutlinedIcon className="close" onClick={closeNotification} />
                </div>
            </div>
        );
    }
};
export default Notification;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • یک پرونده “notificationContainer.component.jsx” اضافه کنید که مؤلفه “اعلان” ما را وارد می کند و لیستی از اعلان ها را از ذخیره ما ارائه می دهد.
import React from 'react';
import { useSelector } from 'react-redux';
import { sNotificationsList } from '../../../store/base/base.selector';
import Notification from './Notification.component';
import './notification.styles.scss';

const NotificationContainer = () => {
    const notificationsList = useSelector(sNotificationsList);
    return (
        <div className="notification-container">
            {notificationsList.map((notification) => (
                <Notification key={notification.id} notification={notification} />
            ))}
        </div>
    );
};
export default NotificationContainer;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

عالی ما با توسعه اعلان به پایان رسیدیم ، اکنون می توانیم این ظرف را به چیدمان ها اضافه کنیم.

import React from 'react';
import { Outlet } from 'react-router-dom';
import NotificationContainer from '../../components/ui/notification/NotificationContainer.component';
import './emptyLayout.styles.scss';

const EmptyLayout = () => {
  return (
    <div className='emptyLayout'>
      <NotificationContainer />
      <Outlet />
    </div>
  );
};
export default EmptyLayout;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و در آخر ، ما می توانیم از آن در هر صفحه ای که به آن احتیاج داریم استفاده کنیم. به عنوان مثال ، بیایید یک اعلان را به عملکرد “ثبت نام” خود اضافه کنیم تا برنامه ما بتواند کاربران را در مورد موفقیت ها یا خطاها آگاه کند.

const handleSubmit = async (e) => {
    e.preventDefault();
    const result = await registerNewUser({name, email, password});
    if (result.status === 'success') {
        navigate('/auth/login');
        dispatch(aPushNewNotification({
            type: 'success',
            text: 'You have successfully registered. Please login.',
        }));
    } else {
        dispatch(aPushNewNotification({
            type: 'error',
            text: result.message,
        }));
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

قسمت جلوی CMS را مجدداً راه اندازی کنید و از ابتدا روند ثبت نام را امتحان کنید تا نتیجه را بررسی کنید.

واکنش سیستم اعلان

بله ، این کار می کند ، کار عالی است و بیایید حرکت کنیم.

2. سیستم معین قابل استفاده مجدد

یک معین یک مؤلفه UI است که به عنوان یک پوشش در بالای محتوای اصلی ظاهر می شود ، که معمولاً برای نمایش اطلاعات مهم ، فرم ها یا اقدامات کاربر بدون حرکت به دور از صفحه فعلی استفاده می شود. این اغلب نیاز به تعامل کاربر برای بستن یا ادامه دارد. ما یک مؤلفه “معین” قابل استفاده مجدد ایجاد خواهیم کرد تا بتوانیم هر زمان که نیاز داشته باشیم از آن استفاده کنیم ، به عنوان مثال تأیید تأیید ، بیایید شروع کنیم:

  • داده های جدید (وضعیت معین و نوع معین) را به حالت و کاهش دهنده های جدید اضافه کنید تا آن حالت ها را در پرونده “base.reducer.js” به روز کنید.
modalStatus: false,
modalType: '',

case BASE_ACTION_TYPES.UPDATE_MODAL_STATUS:
    return { ...state, modalStatus: payload };
case BASE_ACTION_TYPES.UPDATE_MODAL_TYPE:
    return { ...state, modalType: payload };
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • ما به دو انتخاب کننده جدید نیاز خواهیم داشت.
export const sModalStatus = (state) => state.base.modalStatus
export const sModalType = (state) => state.base.modalType
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • دو اقدام و نوع جدید ؛
export const aUpdateModalStatus = (status) =>
  createAction(BASE_ACTION_TYPES.UPDATE_MODAL_STATUS, status);
export const aUpdateModalType = (type) =>
  createAction(BASE_ACTION_TYPES.UPDATE_MODAL_TYPE, type);

UPDATE_MODAL_STATUS: 'base/UPDATE_MODAL_STATUS',
UPDATE_MODAL_TYPE: 'base/UPDATE_MODAL_TYPE',
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • یک پرونده جدید “modal.component.jsx” را در پوشه “مؤلفه” ایجاد کنید.

  • ما باید انتخاب کننده ، اقدامات و قلاب های اصلی را وارد کنیم.

import React from "react";
import { useDispatch, useSelector } from 'react-redux';

import { aUpdateModalStatus } from '../../../store/base/base.action';
import { sModalType } from '../../../store/base/base.selector';
import "./modal.styles.scss";
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • ما یک مؤلفه کاربردی “معین” ایجاد خواهیم کرد ، که “Div” را باز می گرداند که شامل تابعی خواهد بود که به طور پویا مؤلفه را به عنوان یک نوع خود معین بازگرداند.
const Modal = () => {
    const dispatch = useDispatch();
    const modalType = useSelector(sModalType);
    const renderModalType = (type) => {
        switch (type) {
            case 'removePost':
                return <RemovePost />;
            case 'filterModal':
                return <FilterModal />;
            default:
                return null;
        }
    }
    return (
        <div className="modal">
            <div className="modal__content">
                <div className="modal__close">
                    <CloseOutlinedIcon onClick={() => dispatch(aUpdateModalStatus(false))}/>
                </div>
                {renderModalType(modalType)}
            </div>
        </div>
    );
};
export default Modal;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

عالی ، اکنون ، هر زمان که به یک معین احتیاج داشته باشیم ، می توانیم خود یک مؤلفه ضروری ایجاد کنیم و معین قابل استفاده مجدد ما این مؤلفه را ارائه می دهد. ما عملکرد آن را در یکی از مقاله های بعدی خود بررسی خواهیم کرد.

3. اجرای اصلی لودر

یک لودر یک عنصر بصری است که هنگام پردازش محتوا یا داده ها ، بازخورد را برای کاربران فراهم می کند ، که به طور معمول در طول عملیات ناهمزمان مانند تماس های API یا انتقال صفحه نمایش داده می شود. این امر با نشان دادن اینكه برنامه به جای یخ زده كار می كند ، به بهبود تجربه کاربر كمك می كند و می تواند اشکال مختلفی از قبیل انیمیشن های چرخشی ، میله های پیشرفت یا صفحه های اسکلت داشته باشد.

من اسپینرها را دوست دارم و سرویس “لودرهای CSS” را با مقدار زیادی لودرهای زیبا دوست دارم. من یک اسپینر ساده را انتخاب کردم و بیایید شروع به اجرای آن کنیم.

  • یک پوشه جدید “لودر” را در داخل پوشه “UI” ایجاد کنید.

  • ایجاد پرونده های جدید و ساده “Loader.component.jsx” و “Loader.Styles.Scss” ؛

  • یک مؤلفه ساده اضافه کنید که یک برچسب “div” را برگرداند.

import React from "react";
import "./loader.styles.scss";

const Loader = () => {
    return (
        <div className="loader"></div>
    );
};
export default Loader;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • کپی و چسباندن سبک های CSS از سرویس “CSS Loaders” ؛

  • مؤلفه “ثبت نام” را باز کنید و مؤلفه “لودر” را وارد کنید.

  • یک حالت جدید “بارگیری” ایجاد کنید ، که ظاهر را کنترل می کند.

  • دکمه “ایجاد حساب” را به روز کنید (ما باید لودر یا متن را نشان دهیم) ؛

<button 
    className='ghost-round full-width loader-styles'
    onClick={handleSubmit}>
    {loading ? <Loader /> : 'Create Account'}
</button>
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • و ما باید عملکرد “ارسال” خود را به روز کنیم تا حالت “بارگیری” را تغییر دهد (در ابتدا درست و در پایان نادرست).
const handleSubmit = async (e) => {
    e.preventDefault();
    setLoading(true);
    const result = await registerNewUser({name, email, password});
    if (result.status === 'success') {
        setLoading(false);
        navigate('/auth/login');
        dispatch(aPushNewNotification({
            type: 'success',
            text: 'You have successfully registered. Please login.',
        }));
    } else {
        setLoading(false);
        dispatch(aPushNewNotification({
            type: 'error',
            text: result.message,
        }));
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

انجام شده ما با لودر و اعلان ها به پایان رسیدیم و می توانیم سرور DEV خود را مجدداً راه اندازی کنیم و نتیجه را بررسی کنیم.

سیستم لودر و اطلاع رسانی React

در این مقاله ، ما CMS مبتنی بر React را با دو مؤلفه ضروری UI که به طور قابل توجهی تجربه کاربر را بهبود می بخشد ، با موفقیت افزایش داده ایم. ما یک سیستم اعلان انعطاف پذیر را اجرا کردیم که بازخورد روشنی را از طریق موفقیت ، خطا و پیام های هشدار دهنده ارائه می دهد ، که در سطح جهان از طریق Redux اداره می شود. ما همچنین یک جزء لودر براق اضافه کردیم که در طی عملیات ناهمزمان ، بازخورد بصری را به کاربران می دهد.

این اضافات باعث می شود CMS ما حرفه ای تر و کاربر پسند تر شود. با وجود این مؤلفه ها ، CMS ما اکنون تجربه کاربر جلا و پاسخگوتر را ارائه می دهد. در مقالات بعدی ، ما به ساختن ویژگی های پیشرفته تر ادامه خواهیم داد تا CMS ما حتی قدرتمندتر و کاربر پسند تر شود.

اگر برای این آموزش به کد منبع نیاز دارید می توانید آن را از اینجا دریافت کنید.

این پست مفید است؟ ☕ مشارکت به اندازه قهوه در الهام بخشیدن به من بسیار طولانی است! متشکرم)
برای من قهوه بخرید

مرحله بعدی: “React and Node.js CMS Series: اجرای لیست پست ها با ویژگی های جدول پیشرفته”

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا