From f6adee1af2a8146c6ba8c290df9961fcbb9b3a7e Mon Sep 17 00:00:00 2001 From: sajjad isvand Date: Sat, 4 Jul 2026 00:44:34 +0330 Subject: [PATCH 1/4] refactor react-icons --- src/common/toast.tsx | 18 +- src/components/UpdateReleaseNotesModal.tsx | 4 +- src/components/auth/AuthRequiredModal.tsx | 7 +- src/components/auth/require-verification.tsx | 4 +- src/components/blur-mode/blur-mode.button.tsx | 8 +- src/components/bottom-sheet/bottom-sheet.tsx | 10 +- .../bottom-sheet/confirmation-sheet.tsx | 130 --------- src/components/button/button.tsx | 4 +- src/components/date-picker/date-picker.tsx | 9 +- src/components/extension-installed-modal.tsx | 4 +- .../filter-tooltip/filter-tooltip.tsx | 1 - src/components/loading/icon-loading.tsx | 8 +- .../market/title/title-render-preview.tsx | 4 +- src/components/modal.tsx | 10 +- src/components/modal/confirmation-modal.tsx | 8 +- src/components/offline-indicator.tsx | 8 +- src/components/pagination/pagination.tsx | 7 +- .../priority-options/priority-options.tsx | 28 -- src/components/updater/updater.tsx | 16 +- src/components/user/user-card.tsx | 4 +- src/components/welcome-wizard.tsx | 4 +- src/icons/icon.tsx | 23 ++ src/icons/icons.context.tsx | 39 +++ src/icons/index.tsx | 1 + src/icons/packs/default.tsx | 173 ++++++++++++ src/icons/types.ts | 85 ++++++ .../components/bookmark-emptySlot.tsx | 4 +- .../bookmark/components/bookmark-folder.tsx | 9 +- .../components/bookmark-icon.picker.tsx | 9 +- .../bookmark/components/bookmark-item.tsx | 4 +- .../components/bookmark-suggestions.tsx | 42 +-- .../components/bookmark/bookmark-icon.tsx | 4 +- .../bookmark/components/folder-header.tsx | 7 +- .../bookmark/components/folder-path.tsx | 4 +- .../components/modal/advanced.modal.tsx | 7 +- .../modal/bookmark-context-menu.tsx | 8 +- src/layouts/bookmark/components/shared.tsx | 36 +-- .../activity-card/empty-activity-card.tsx | 4 +- .../manage-activity.bottomSheet.tsx | 10 +- .../components/add-friend.bottomSheet.tsx | 11 +- .../buttons/friend-requests.button.tsx | 10 +- .../friends/components/empty-list.friend.tsx | 4 +- .../friend-requests.bottomSheet.tsx | 5 +- .../friends/components/friends-List.tsx | 1 - .../friends/components/remove-button.tsx | 4 +- src/layouts/friends/friends.tsx | 4 +- .../components/coin-package-card.tsx | 34 ++- .../coin-package-purchase-modal.tsx | 15 +- src/layouts/market/market-coins/index.tsx | 4 +- src/layouts/market/market-container.tsx | 9 +- .../components/market-item-card.tsx | 15 +- .../components/market-item-purchase-modal.tsx | 9 +- src/layouts/market/other-items/index.tsx | 14 +- .../components/header/runner.header.tsx | 16 +- src/layouts/mini-apps/mini-apps.layout.tsx | 4 +- .../mini-apps/states/mini-app.auth.tsx | 4 +- .../navbar/components/settingsDropdown.tsx | 18 +- .../navbar/friends-list/friends.navbar.tsx | 7 +- src/layouts/navbar/market/market-button.tsx | 4 +- src/layouts/navbar/navbar.layout.tsx | 33 +-- .../browser-bookmark/bookmark-list-item.tsx | 45 ---- .../browser-bookmark/bookmark-popover.tsx | 16 +- .../browser-bookmark/browser-bookmark.tsx | 11 +- src/layouts/search/history.portal.tsx | 8 +- .../search/image/image-search.portal.tsx | 8 +- src/layouts/search/search.tsx | 6 +- .../search/select-engine/engine-selector.tsx | 10 +- src/layouts/search/suggestion/suggestions.tsx | 15 +- .../search/voice/voice-search.portal.tsx | 9 +- src/layouts/setting/setting-modal.tsx | 8 +- .../setting/tabs/about-us/about-us.tsx | 22 +- .../tabs/account/auth-form/auth-otp.tsx | 20 +- .../tabs/account/auth-form/auth-password.tsx | 4 +- .../auth-form/components/login-otp-button.tsx | 7 +- .../components/login-password.button.tsx | 7 +- .../account-verification-status.tsx | 4 +- .../account/components/interests-selector.tsx | 4 +- .../components/modals/edit-birthday.tsx | 27 +- .../account/components/modals/edit-city.tsx | 26 +- .../account/components/modals/edit-gender.tsx | 27 +- .../components/modals/edit-interests.tsx | 27 +- .../account/components/modals/edit-name.tsx | 27 +- .../components/modals/edit-occupation.tsx | 42 ++- .../components/modals/edit-username.tsx | 27 +- .../account/components/modals/edit.avatar.tsx | 33 +-- .../components/modals/footer-buttons.tsx | 31 +++ .../components/occupation-selector.tsx | 4 +- .../components/profile-date-picker.tsx | 9 +- .../tabs/account/components/remove-button.tsx | 23 -- .../account/tabs/rewards/components/tasks.tsx | 27 +- .../tabs/account/tabs/rewards/rewardsTab.tsx | 7 +- .../connections/components/platform-data.tsx | 11 - .../components/browserTitle-selector.tsx | 4 +- .../appearance/components/font-selector.tsx | 4 +- .../appearance/components/theme-selector.tsx | 15 +- .../tabs/general/components/select-city.tsx | 14 +- .../category/category-folder.component.tsx | 6 +- .../wallpaper-item/wallpaper-item.tsx | 9 +- src/layouts/simplify/tools-simplify.tsx | 2 +- .../simplify/widgets/calendar-simplify.tsx | 6 +- .../simplify/widgets/news-simplify.tsx | 4 +- src/layouts/widgetify-card/daily-mood.tsx | 5 +- .../components/notification-item.tsx | 7 +- .../widgetify-card/profile-progress.tsx | 4 +- .../widget-settings-modal.tsx | 7 +- src/layouts/widgets/calendar/calendar.tsx | 6 +- .../calendar/components/calendar-header.tsx | 9 +- .../components/habit-calendar-heatmap.tsx | 9 +- .../habit/components/habit-detail.modal.tsx | 12 +- .../habit/components/habit-form.modal.tsx | 24 +- .../habit/components/item/habit.item.tsx | 8 +- src/layouts/widgets/habit/habits.layout.tsx | 8 +- .../widgets/network/network.layout.tsx | 11 +- .../widgets/news/components/news-header.tsx | 6 +- .../widgets/notes/components/note-item.tsx | 10 +- .../notes/components/note-navigation.tsx | 12 +- .../todos/components/select-friends.todo.tsx | 8 +- .../widgets/todos/expandable-todo-input.tsx | 12 +- .../tools/religious/religious-time.tsx | 7 +- .../translate/components/platform-modal.tsx | 75 ------ .../components/translation-input.tsx | 43 --- .../components/translation-result.tsx | 70 ----- src/layouts/widgets/tools/translate/shared.ts | 48 ---- .../widgets/tools/translate/translate.tsx | 255 ------------------ .../weather/current/current-box.weather.tsx | 9 +- .../widgets/wigiArz/components/arz-header.tsx | 5 +- .../wigiPad/clock-display/clock-display.tsx | 4 +- .../wigiPad/date-display/date.display.tsx | 4 +- src/pages/root.tsx | 118 ++++---- 129 files changed, 973 insertions(+), 1429 deletions(-) delete mode 100644 src/components/bottom-sheet/confirmation-sheet.tsx delete mode 100644 src/components/priority-options/priority-options.tsx create mode 100644 src/icons/icon.tsx create mode 100644 src/icons/icons.context.tsx create mode 100644 src/icons/index.tsx create mode 100644 src/icons/packs/default.tsx create mode 100644 src/icons/types.ts delete mode 100644 src/layouts/search/browser-bookmark/bookmark-list-item.tsx create mode 100644 src/layouts/setting/tabs/account/components/modals/footer-buttons.tsx delete mode 100644 src/layouts/setting/tabs/account/components/remove-button.tsx delete mode 100644 src/layouts/widgets/tools/translate/components/platform-modal.tsx delete mode 100644 src/layouts/widgets/tools/translate/components/translation-input.tsx delete mode 100644 src/layouts/widgets/tools/translate/components/translation-result.tsx delete mode 100644 src/layouts/widgets/tools/translate/shared.ts delete mode 100644 src/layouts/widgets/tools/translate/translate.tsx diff --git a/src/common/toast.tsx b/src/common/toast.tsx index 3530911b..cb7668e6 100644 --- a/src/common/toast.tsx +++ b/src/common/toast.tsx @@ -2,9 +2,7 @@ import React, { ReactNode } from 'react' import toast from 'react-hot-toast' import { playAlarm } from './playAlarm' import { translateError } from '@/utils/translate-error' -import { TfiAlert, TfiCheck } from 'react-icons/tfi' -import { TiInfo } from 'react-icons/ti' -import { LuX } from 'react-icons/lu' +import { Icon } from '../icons' type ToastType = 'success' | 'error' | 'info' | 'warning' @@ -29,25 +27,25 @@ const TT: Record< borderColor: 'border-r-success border-br-success', iconBg: 'bg-success/10', iconColor: 'text-success', - icon: , + icon: , }, error: { borderColor: 'border-r-error', iconBg: 'bg-error/10', iconColor: 'text-error', - icon: , + icon: , }, info: { borderColor: 'border-r-info', iconBg: 'bg-info/10', iconColor: 'text-info', - icon: , + icon: , }, warning: { borderColor: 'border-r-warning', iconBg: 'bg-warning/10', iconColor: 'text-warning', - icon: , + icon: , }, } @@ -80,7 +78,7 @@ export function showToast(message: string, type: ToastType, options?: ToastOptio onClick={() => toast.remove(t.id, t.toasterId)} className="rounded-full btn text-base-content/80 btn-xs btn-ghost" > - + ), @@ -117,7 +115,7 @@ export function showPreviewToast(itemName: string, onCancel: () => void): string >
- + @@ -139,7 +137,7 @@ export function showPreviewToast(itemName: string, onCancel: () => void): string }} className="shrink-0 flex items-center gap-1.5 text-[11px] font-medium px-3 py-1.5 rounded-xl bg-base-200 hover:bg-error/10 hover:text-error text-base-content/60 transition-all duration-150 cursor-pointer border border-base-content/8 active:scale-95" > - + بازگشت
diff --git a/src/components/UpdateReleaseNotesModal.tsx b/src/components/UpdateReleaseNotesModal.tsx index f1bc59ce..aa8c129c 100644 --- a/src/components/UpdateReleaseNotesModal.tsx +++ b/src/components/UpdateReleaseNotesModal.tsx @@ -1,5 +1,4 @@ import { useEffect, useState } from 'react' -import { RiThumbUpLine } from 'react-icons/ri' import { Button } from './button/button' import Modal from './modal' @@ -92,8 +91,7 @@ export const UpdateReleaseNotesModal = ({
- - دمت گرم که همراه مایی + 💙دمت گرم که همراه مایی
diff --git a/src/components/auth/AuthRequiredModal.tsx b/src/components/auth/AuthRequiredModal.tsx index e8e813c5..495be0f8 100644 --- a/src/components/auth/AuthRequiredModal.tsx +++ b/src/components/auth/AuthRequiredModal.tsx @@ -1,7 +1,7 @@ import { callEvent } from '@/common/utils/call-event' import Modal from '@/components/modal' import { Button } from '../button/button' -import { FiLock } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface AuthRequiredModalProps { isOpen: boolean @@ -40,7 +40,10 @@ export function AuthRequiredModal({ className="absolute inset-0 rounded-full bg-primary/5 animate-ping" style={{ animationDuration: '2s' }} /> - + {title &&

{title}

}

{message}

diff --git a/src/components/auth/require-verification.tsx b/src/components/auth/require-verification.tsx index b0ea7494..e1f72a35 100644 --- a/src/components/auth/require-verification.tsx +++ b/src/components/auth/require-verification.tsx @@ -1,9 +1,9 @@ import { motion } from 'framer-motion' import type { ReactNode } from 'react' -import { MdOutlineVerifiedUser } from 'react-icons/md' import { callEvent } from '@/common/utils/call-event' import { useAuth } from '@/context/auth.context' import { Button } from '../button/button' +import { Icon } from '@/src/icons' interface RequireVerificationProps { children: ReactNode @@ -43,7 +43,7 @@ export const RequireVerification = ({ 'absolute inset-0 p-2 flex flex-col items-center justify-center gap-y-2 bg-base-300/5 backdrop-blur-xs rounded-xl' } > - +

نیاز به تأیید حساب

برای دسترسی به این بخش، لطفاً حساب کاربری خود را تأیید کنید. diff --git a/src/components/blur-mode/blur-mode.button.tsx b/src/components/blur-mode/blur-mode.button.tsx index d9d3fe4a..7da24c8b 100644 --- a/src/components/blur-mode/blur-mode.button.tsx +++ b/src/components/blur-mode/blur-mode.button.tsx @@ -1,6 +1,6 @@ import { useGeneralSetting } from '@/context/general-setting.context' import Tooltip from '../toolTip' -import { HiOutlineEye, HiOutlineEyeSlash } from 'react-icons/hi2' +import { Icon } from '@/src/icons' export function BlurModeButton() { const { blurMode, updateSetting } = useGeneralSetting() @@ -16,7 +16,11 @@ export function BlurModeButton() { onClick={handleBlurModeToggle} className="relative p-2 transition-all cursor-pointer nav-btn text-base-content/40 hover:text-base-content active:scale-90" > - {blurMode ? : } + {blurMode ? ( + + ) : ( + + )} ) diff --git a/src/components/bottom-sheet/bottom-sheet.tsx b/src/components/bottom-sheet/bottom-sheet.tsx index 1a3f530d..417b7389 100644 --- a/src/components/bottom-sheet/bottom-sheet.tsx +++ b/src/components/bottom-sheet/bottom-sheet.tsx @@ -1,8 +1,7 @@ -import { useState, useRef, type ReactNode } from 'react' -import { motion, AnimatePresence, PanInfo } from 'framer-motion' -import { MdClose } from 'react-icons/md' +import { useState, type ReactNode } from 'react' +import { motion, AnimatePresence, type PanInfo } from 'framer-motion' import { Portal } from '../portal/Portal' -import { HiChevronRight } from 'react-icons/hi2' +import { Icon } from '@/src/icons' type SheetSize = 'small' | 'medium' | 'large' | 'full' | 'screen' @@ -107,7 +106,8 @@ export function BottomSheet({ className="absolute p-2 transition-all duration-200 rounded-full right-6 active:scale-95" aria-label="بستن" > - diff --git a/src/components/bottom-sheet/confirmation-sheet.tsx b/src/components/bottom-sheet/confirmation-sheet.tsx deleted file mode 100644 index a9f27c84..00000000 --- a/src/components/bottom-sheet/confirmation-sheet.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import type { ReactNode } from 'react' - -import { FiAlertTriangle, FiCheck, FiInfo, FiTrash2 } from 'react-icons/fi' - -import { BottomSheet } from '../bottom-sheet/bottom-sheet' -import { Button } from '../button/button' - -interface ConfirmationSheetProps { - isOpen: boolean - onClose: () => void - onConfirm: () => void | Promise - title?: string - message?: string | ReactNode - confirmText?: ReactNode - cancelText?: string - variant?: 'danger' | 'warning' | 'info' | 'success' - isLoading?: boolean - icon?: ReactNode - loadingText?: string - disableCancelWhileLoading?: boolean - autoCloseOnConfirm?: boolean -} - -const variantConfig = { - danger: { - icon: , - iconBg: 'bg-error/10', - iconColor: 'text-error', - confirmBg: 'bg-error hover:bg-error/90 shadow-sm shadow-error/20', - }, - warning: { - icon: , - iconBg: 'bg-warning/10', - iconColor: 'text-warning', - confirmBg: 'bg-warning hover:bg-warning/90 shadow-sm shadow-warning/20', - }, - info: { - icon: , - iconBg: 'bg-info/10', - iconColor: 'text-info', - confirmBg: 'bg-info hover:bg-info/90 shadow-sm shadow-info/20', - }, - success: { - icon: , - iconBg: 'bg-success/10', - iconColor: 'text-success', - confirmBg: 'bg-success hover:bg-success/90 shadow-sm shadow-success/20', - }, -} as const - -export function ConfirmationSheet({ - isOpen, - onClose, - onConfirm, - title = 'تاییدیه', - message = 'آیا از انجام این عملیات اطمینان دارید؟', - confirmText = 'تأیید', - cancelText = 'انصراف', - variant = 'danger', - isLoading = false, - icon, - loadingText = 'در حال پردازش...', - disableCancelWhileLoading = true, - autoCloseOnConfirm = false, -}: ConfirmationSheetProps) { - const config = variantConfig[variant] - - const handleConfirm = async () => { - if (isLoading) return - try { - await onConfirm() - if (autoCloseOnConfirm) onClose() - } catch (error) { - console.error('Confirmation error:', error) - } - } - - const handleCancel = () => { - if (isLoading && disableCancelWhileLoading) return - onClose() - } - - return ( - -

-
-
-
- {title && ( -

{title}

- )} -
- -
- {typeof message === 'string' ?

{message}

: message} -
-
- -
- - - -
-
- - ) -} diff --git a/src/components/button/button.tsx b/src/components/button/button.tsx index 984e42b7..5ac12d5d 100644 --- a/src/components/button/button.tsx +++ b/src/components/button/button.tsx @@ -1,5 +1,5 @@ +import { Icon } from '@/src/icons' import type React from 'react' -import { FaSpinner } from 'react-icons/fa' interface ButtonProps { onClick?: () => void @@ -38,7 +38,7 @@ export function Button(prop: ButtonProps) { {prop.loading ? prop.loadingText || (
- + صبر کنید...
) diff --git a/src/components/date-picker/date-picker.tsx b/src/components/date-picker/date-picker.tsx index 2d67a1eb..ce556a90 100644 --- a/src/components/date-picker/date-picker.tsx +++ b/src/components/date-picker/date-picker.tsx @@ -1,7 +1,6 @@ +import { Icon } from '@/src/icons' import jalaliMoment from 'jalali-moment' import { useState } from 'react' -import { FaChevronLeft, FaChevronRight } from 'react-icons/fa6' -import { TfiBackRight } from 'react-icons/tfi' interface DatePickerProps { onDateSelect: (date: jalaliMoment.Moment) => void @@ -202,20 +201,20 @@ export function DatePicker({ onClick={goToToday} className="flex items-center justify-center transition-colors duration-300 rounded-full cursor-pointer h-7 w-7 text-muted opacity-70 hover:bg-base-300 hover:opacity-100" > - + )} diff --git a/src/components/extension-installed-modal.tsx b/src/components/extension-installed-modal.tsx index ac583819..9af84311 100644 --- a/src/components/extension-installed-modal.tsx +++ b/src/components/extension-installed-modal.tsx @@ -1,9 +1,9 @@ import { useState } from 'react' -import { FaExternalLinkAlt } from 'react-icons/fa' import keepItImage from '@/assets/keep-it.png' import { Button } from './button/button' import Checkbox from './checkbox' import Modal from './modal' +import { Icon } from '../icons' interface ExtensionInstalledModalProps { show: boolean @@ -149,7 +149,7 @@ const StepFirefoxConsent = ({ onGetStarted }: StepFirefoxConsentProps) => { rel="noopener noreferrer" className="flex items-center justify-center font-medium underline text-primary gap-0.5 mb-2" > - + سیاست کامل حریم خصوصی diff --git a/src/components/filter-tooltip/filter-tooltip.tsx b/src/components/filter-tooltip/filter-tooltip.tsx index dfc7a4b7..08f4839d 100644 --- a/src/components/filter-tooltip/filter-tooltip.tsx +++ b/src/components/filter-tooltip/filter-tooltip.tsx @@ -1,5 +1,4 @@ import { useState, useRef, ReactNode } from 'react' -import { FaFilter } from 'react-icons/fa' import { ClickableTooltip } from '@/components/clickableTooltip' import Tooltip from '../toolTip' import { Button } from '../button/button' diff --git a/src/components/loading/icon-loading.tsx b/src/components/loading/icon-loading.tsx index 7b1cc393..8eccd78f 100644 --- a/src/components/loading/icon-loading.tsx +++ b/src/components/loading/icon-loading.tsx @@ -1,4 +1,4 @@ -import { FiLoader } from 'react-icons/fi' +import { Icon } from '@/src/icons' import Tooltip from '../toolTip' interface IconLoadingProps { @@ -8,14 +8,16 @@ interface IconLoadingProps { export function IconLoading({ title, className }: IconLoadingProps) { if (!title) { return ( - ) } return ( - diff --git a/src/components/market/title/title-render-preview.tsx b/src/components/market/title/title-render-preview.tsx index a056b2c5..59a0fa7d 100644 --- a/src/components/market/title/title-render-preview.tsx +++ b/src/components/market/title/title-render-preview.tsx @@ -1,4 +1,4 @@ -import { IoMdClose } from 'react-icons/io' +import { Icon } from '@/src/icons' interface Prop { template: string @@ -11,7 +11,7 @@ export function renderBrowserTitlePreview(item: Prop) { className={`flex items-center justify-between w-40 p-1.5 text-xs font-medium border shadow-sm text-content bg-content border-content rounded-t-md max-w-40 ${item.className || ''} font-sans`} >
- + {isPersian && ( {item.template} )} diff --git a/src/components/modal.tsx b/src/components/modal.tsx index 5e32fe10..f328805b 100644 --- a/src/components/modal.tsx +++ b/src/components/modal.tsx @@ -1,6 +1,6 @@ import React, { type ReactNode, useEffect, useRef } from 'react' import { createPortal } from 'react-dom' -import { LuX } from 'react-icons/lu' +import { Icon } from '../icons' type ModalProps = { isOpen: boolean @@ -135,8 +135,12 @@ export default function Modal({ className="flex items-center justify-center transition-all rounded-full cursor-pointer w-7 h-7 md:w-8 md:h-8 bg-base-300 text-muted hover:bg-base-content/10 hover:scale-105 active:scale-95 shrink-0 outline-0! border-0!" aria-label="Close modal" > - - + + )}
diff --git a/src/components/modal/confirmation-modal.tsx b/src/components/modal/confirmation-modal.tsx index 9a2c02db..1244b141 100644 --- a/src/components/modal/confirmation-modal.tsx +++ b/src/components/modal/confirmation-modal.tsx @@ -1,8 +1,8 @@ import type { ReactNode } from 'react' -import { FiAlertTriangle, FiCheck, FiTrash2 } from 'react-icons/fi' import { Button } from '../button/button' import Modal from '../modal' import { IconLoading } from '../loading/icon-loading' +import { Icon } from '@/src/icons' interface ConfirmationModalProps { isOpen: boolean @@ -20,21 +20,21 @@ interface ConfirmationModalProps { const variantConfig = { danger: { - icon: , + icon: , iconBg: 'bg-error/10', iconColor: 'text-error', confirmBg: 'bg-error hover:bg-error/90', confirmText: 'text-white', }, warning: { - icon: , + icon: , iconBg: 'bg-warning/10', iconColor: 'text-warning', confirmBg: 'bg-warning hover:bg-warning/90', confirmText: 'text-white', }, info: { - icon: , + icon: , iconBg: 'bg-info/10', iconColor: 'text-info', confirmBg: 'bg-info/80 hover:bg-info/90', diff --git a/src/components/offline-indicator.tsx b/src/components/offline-indicator.tsx index 455ce664..663b2a54 100644 --- a/src/components/offline-indicator.tsx +++ b/src/components/offline-indicator.tsx @@ -1,4 +1,4 @@ -import { TbCloudOff } from 'react-icons/tb' +import { Icon } from '../icons' type OfflineIndicatorMode = 'badge' | 'status' | 'notification' @@ -11,7 +11,7 @@ export const OfflineIndicator = ({ mode, message }: OfflineIndicatorProps) => { if (mode === 'badge') { return (
- +
) } @@ -19,7 +19,7 @@ export const OfflineIndicator = ({ mode, message }: OfflineIndicatorProps) => { if (mode === 'status') { return (
- + {message || 'حالت آفلاین'}
) @@ -27,7 +27,7 @@ export const OfflineIndicator = ({ mode, message }: OfflineIndicatorProps) => { return (
- +

{message || 'اطلاعات کاربری از حافظه محلی بارگذاری شده‌اند. اتصال اینترنت خود را بررسی کنید.'} diff --git a/src/components/pagination/pagination.tsx b/src/components/pagination/pagination.tsx index 84db5529..c8a20e36 100644 --- a/src/components/pagination/pagination.tsx +++ b/src/components/pagination/pagination.tsx @@ -1,5 +1,5 @@ -import { FiChevronLeft, FiChevronRight } from 'react-icons/fi' import { Button } from '@/components/button/button' +import { Icon } from '@/src/icons' export interface PaginationProps { currentPage: number @@ -31,7 +31,8 @@ export function Pagination({ className="btn-soft rounded-2xl" isPrimary={currentPage !== 1} > - @@ -48,7 +49,7 @@ export function Pagination({ isPrimary={true} size="xs" > - +

) diff --git a/src/components/priority-options/priority-options.tsx b/src/components/priority-options/priority-options.tsx deleted file mode 100644 index 569324eb..00000000 --- a/src/components/priority-options/priority-options.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { PRIORITY_OPTIONS } from '@/common/constant/priority_options' -import Tooltip from '../toolTip' -import { FiFlag } from 'react-icons/fi' - -export const PriorityButton = ({ - option, - isSelected, - onClick, -}: { - option: (typeof PRIORITY_OPTIONS)[0] - isSelected: boolean - onClick: () => void -}) => ( - - - -) diff --git a/src/components/updater/updater.tsx b/src/components/updater/updater.tsx index 8acabdd7..db7456a1 100644 --- a/src/components/updater/updater.tsx +++ b/src/components/updater/updater.tsx @@ -1,8 +1,8 @@ import { useEffect, useState } from 'react' -import { LuDownload, LuX } from 'react-icons/lu' import Modal from '@/components/modal' import { Button } from '@/components/button/button' import { getMainClient } from '@/services/api' +import { Icon } from '@/src/icons' let updateInfo = null @@ -96,7 +96,10 @@ export function UpdateChecker() { className="absolute right-0 flex items-center justify-center gap-2 px-1 py-6 transition-all duration-300 shadow-2xl cursor-pointer bg-gradient-to-br from-primary to-primary/90 rounded-l-2xl group-hover:opacity-0" >
- +
نسخه جدید رسید!
@@ -113,12 +116,15 @@ export function UpdateChecker() { className="absolute top-2 left-2 p-1.5 rounded-lg hover:bg-white/20 transition-colors z-10" aria-label="بستن" > - +
- +

@@ -184,7 +190,7 @@ export function UpdateChecker() { isPrimary rounded="xl" > - + دانلود و نصب {!updateInfo.force && ( diff --git a/src/components/user/user-card.tsx b/src/components/user/user-card.tsx index ae5658b8..7485eabd 100644 --- a/src/components/user/user-card.tsx +++ b/src/components/user/user-card.tsx @@ -1,4 +1,3 @@ -import { TbUsersPlus } from 'react-icons/tb' import { useAuth } from '@/context/auth.context' import { useSendFriendRequest } from '@/services/hooks/friends/friendService.hook' import { translateError } from '@/utils/translate-error' @@ -6,6 +5,7 @@ import { AvatarComponent } from '../avatar.component' import { Button } from '../button/button' import type { UserCardUser } from './user-card-portal' import { showToast } from '@/common/toast' +import { Icon } from '@/src/icons' interface UserCardProps { user: UserCardUser @@ -70,7 +70,7 @@ export function UserCard({ user, className = '' }: UserCardProps) { loadingText="در حال ارسال..." onClick={() => onAddClick()} > - + درخواست )} diff --git a/src/components/welcome-wizard.tsx b/src/components/welcome-wizard.tsx index 205ad273..fb03c628 100644 --- a/src/components/welcome-wizard.tsx +++ b/src/components/welcome-wizard.tsx @@ -5,7 +5,6 @@ import { useGetOccupations, useGetInterests, } from '@/services/hooks/profile/getProfileMeta.hook' -import { LuChevronLeft } from 'react-icons/lu' import { TextInput } from '@/components/text-input' import { sleep } from '@/common/utils/timeout' import { Chip } from '@/components/chip.component' @@ -14,6 +13,7 @@ import { useSetupWizard } from '@/services/hooks/auth/authService.hook' import { showToast } from '@/common/toast' import { safeAwait } from '@/services/api' import Analytics from '@/analytics' +import { Icon } from '../icons' export enum ReferralSource { Social = 'social', @@ -381,7 +381,7 @@ export const WelcomeWizard = ({ isOpen, onClose }: WelcomeWizardProps) => { onClick={prevStep} className="absolute z-20 p-2 transition-colors rounded-full top-10 right-96 bg-base-200/50 text-content hover:bg-base-300" > - + )} {renderStepContent()} diff --git a/src/icons/icon.tsx b/src/icons/icon.tsx new file mode 100644 index 00000000..d5899f66 --- /dev/null +++ b/src/icons/icon.tsx @@ -0,0 +1,23 @@ +import { defaultIcons } from './packs/default' + +import type { IconBaseProps } from 'react-icons' +import type { IconName } from './types' +import { useIconPack } from './icons.context' + +const packs = { + default: defaultIcons, +} + +interface Props extends IconBaseProps { + name: IconName +} + +export function Icon({ name, ...props }: Props) { + const { pack } = useIconPack() + + const Component = packs[pack][name] ?? defaultIcons[name] + + if (!Component) return null + + return +} diff --git a/src/icons/icons.context.tsx b/src/icons/icons.context.tsx new file mode 100644 index 00000000..2dc9f2d4 --- /dev/null +++ b/src/icons/icons.context.tsx @@ -0,0 +1,39 @@ +import { createContext, useContext, useMemo, useState, type ReactNode } from 'react' + +export type IconPackName = 'default' //| 'pack_name' + +interface IconContextValue { + pack: IconPackName + setPack: (pack: IconPackName) => void +} + +const IconContext = createContext(null) + +interface IconProviderProps { + children: ReactNode + defaultTheme?: IconPackName +} + +export function IconProvider({ children, defaultTheme = 'default' }: IconProviderProps) { + const [pack, setPack] = useState(defaultTheme) + + const value = useMemo( + () => ({ + pack, + setPack, + }), + [pack] + ) + + return {children} +} + +export function useIconPack() { + const context = useContext(IconContext) + + if (!context) { + throw new Error('useIconPack must be used inside IconProvider') + } + + return context +} diff --git a/src/icons/index.tsx b/src/icons/index.tsx new file mode 100644 index 00000000..0af80388 --- /dev/null +++ b/src/icons/index.tsx @@ -0,0 +1 @@ +export * from './icon' diff --git a/src/icons/packs/default.tsx b/src/icons/packs/default.tsx new file mode 100644 index 00000000..7fa54519 --- /dev/null +++ b/src/icons/packs/default.tsx @@ -0,0 +1,173 @@ +import { + FiBell, + FiClock, + FiInbox, + FiKey, + FiLoader, + FiLock, + FiMail, + FiMaximize, + FiMinimize, + FiRotateCcw, + FiSettings, + FiShoppingBag, + FiShoppingCart, + FiTrash2, + FiUser, + FiUserCheck, + FiUsers, + FiUserX, +} from 'react-icons/fi' +import type { IconMap } from '../types' +import { TfiAlert, TfiBackRight, TfiCheck } from 'react-icons/tfi' +import { + LuBriefcase, + LuCalendarDays, + LuChevronDown, + LuChevronLeft, + LuChevronRight, + LuChevronUp, + LuDownload, + LuHistory, + LuPen, + LuPlus, + LuX, +} from 'react-icons/lu' +import { TiInfo } from 'react-icons/ti' +import { + FaBrush, + FaCoins, + FaExternalLinkAlt, + FaGithub, + FaGlobe, + FaImage, + FaPaintBrush, + FaSpinner, + FaTelegramPlane, + FaUpload, +} from 'react-icons/fa' +import { + TbCloudOff, + TbUsersPlus, + TbBookmarkPlus, + TbCameraPlus, + TbWind, +} from 'react-icons/tb' +import { + MdFolderSpecial, + MdLink, + MdMic, + MdOutlinePrivacyTip, + MdOutlineVerifiedUser, + MdSearch, +} from 'react-icons/md' +import { + HiHome, + HiInbox, + HiOutlineBookmark, + HiOutlineEye, + HiOutlineEyeSlash, + HiOutlineFolder, + HiOutlineGlobeAlt, + HiOutlineHome, + HiOutlineInbox, + HiOutlineInformationCircle, + HiOutlineShoppingBag, + HiOutlineSquares2X2, + HiOutlineUserGroup, + HiSquares2X2, +} from 'react-icons/hi2' +import { FaFolder, FaFolderOpen } from 'react-icons/fa' +import { GoArchive, GoKebabHorizontal } from 'react-icons/go' +import { IoMdHelp } from 'react-icons/io' +import { FaPhotoFilm } from 'react-icons/fa6' +import { BiCalendar, BiLogoGoogle } from 'react-icons/bi' +import { FcGoogle } from 'react-icons/fc' +import { CiLocationOn } from 'react-icons/ci' +import { WiCloudy, WiHumidity } from 'react-icons/wi' +import { RiQuillPenAiLine } from 'react-icons/ri' +import { AiOutlineDrag } from 'react-icons/ai' +import { HiOutlineViewGridAdd } from 'react-icons/hi' + +export const defaultIcons = { + home: HiHome, + calendar: BiCalendar, + settings: FiSettings, + search: MdSearch, + user: FiUser, + clock: FiClock, + notification: FiBell, + alert: TfiAlert, + check: TfiCheck, + close: LuX, + info: HiOutlineInformationCircle, + externalLink: FaExternalLinkAlt, + offline: TbCloudOff, + chevronUp: LuChevronUp, + chevronDown: LuChevronDown, + chevronLeft: LuChevronLeft, + chevronRight: LuChevronRight, + lock: FiLock, + verifyUser: MdOutlineVerifiedUser, + outlineEye: HiOutlineEye, + outlineEyeSlash: HiOutlineEyeSlash, + trash: FiTrash2, + spinner: FaSpinner, + backRight: TfiBackRight, + loader: FiLoader, + usersPlus: TbUsersPlus, + bookmarkPlus: TbBookmarkPlus, + folder: FaFolder, + folderOpen: FaFolderOpen, + menuOption: GoKebabHorizontal, + uploadImage: FaUpload, + image: FaImage, + help: IoMdHelp, + outlineBookmark: HiOutlineBookmark, + outlineFolder: HiOutlineFolder, + reload: FiRotateCcw, + plus: LuPlus, + pen: LuPen, + users: FiUsers, + userCheck: FiUserCheck, + userX: FiUserX, + outlineInbox: HiOutlineInbox, + inbox: FiInbox, + brush: FaPaintBrush, + photoFilm: FaPhotoFilm, + coin: FaCoins, + shoppingCart: FiShoppingCart, + shoppingBag: FiShoppingBag, + maximize: FiMaximize, + minimize: FiMinimize, + googleCalendar: BiLogoGoogle, + briefcase: LuBriefcase, + mail: FiMail, + key: FiKey, + friends: HiOutlineUserGroup, + outlineShoppingBag: HiOutlineShoppingBag, + outlinePrivacyTip: MdOutlinePrivacyTip, + link: MdLink, + googleLogo: FcGoogle, + telegramLogo: FaTelegramPlane, + globe: FaGlobe, + calendarDays: LuCalendarDays, + cameraPlus: TbCameraPlus, + githubLogo: FaGithub, + location: CiLocationOn, + archive: GoArchive, + wind: TbWind, + cloudy: WiCloudy, + humidity: WiHumidity, + download: LuDownload, + penAI: RiQuillPenAiLine, + outlineDrag: AiOutlineDrag, + outlineGlobe: HiOutlineGlobeAlt, + outlineHome: HiOutlineHome, + outlineSquares2X2: HiOutlineSquares2X2, + squares2X2: HiSquares2X2, + viewGridAdd: HiOutlineViewGridAdd, + folderSpecial: MdFolderSpecial, + history: LuHistory, + mic: MdMic, +} satisfies IconMap diff --git a/src/icons/types.ts b/src/icons/types.ts new file mode 100644 index 00000000..874e4557 --- /dev/null +++ b/src/icons/types.ts @@ -0,0 +1,85 @@ +import type { IconType } from 'react-icons' + +export type IconName = + | 'home' + | 'settings' + | 'search' + | 'user' + | 'clock' + | 'notification' + | 'alert' + | 'check' + | 'close' + | 'info' + | 'externalLink' + | 'offline' + | 'chevronLeft' + | 'chevronRight' + | 'chevronDown' + | 'chevronUp' + | 'lock' + | 'verifyUser' + | 'outlineEye' + | 'outlineEyeSlash' + | 'trash' + | 'spinner' + | 'backRight' + | 'loader' + | 'usersPlus' + | 'bookmarkPlus' + | 'folder' + | 'folderSpecial' + | 'folderOpen' + | 'menuOption' + | 'uploadImage' + | 'image' + | 'help' + | 'outlineBookmark' + | 'outlineFolder' + | 'reload' + | 'plus' + | 'pen' + | 'users' + | 'userCheck' + | 'userX' + | 'outlineInbox' + | 'inbox' + | 'brush' + | 'photoFilm' + | 'coin' + | 'shoppingCart' + | 'shoppingBag' + | 'outlineShoppingBag' + | 'maximize' + | 'minimize' + | 'googleCalendar' + | 'calendar' + | 'briefcase' + | 'mail' + | 'key' + | 'friends' + | 'outlinePrivacyTip' + | 'link' + | 'googleLogo' + | 'telegramLogo' + | 'githubLogo' + | 'globe' + | 'calendarDays' + | 'cameraPlus' + | 'location' + | 'archive' + | 'wind' + | 'cloudy' + | 'humidity' + | 'download' + | 'penAI' + | 'outlineDrag' + | 'outlineGlobe' + | 'outlineHome' + | 'squares2X2' + | 'outlineSquares2X2' + | 'viewGridAdd' + | 'search' + | 'history' + | 'mic' +export type IconMap = Record diff --git a/src/layouts/bookmark/components/bookmark-emptySlot.tsx b/src/layouts/bookmark/components/bookmark-emptySlot.tsx index bf507d50..5c2cfc0d 100644 --- a/src/layouts/bookmark/components/bookmark-emptySlot.tsx +++ b/src/layouts/bookmark/components/bookmark-emptySlot.tsx @@ -1,4 +1,4 @@ -import { TbBookmarkPlus } from 'react-icons/tb' +import { Icon } from '@/src/icons' export function EmptyBookmarkSlot({ onClick, @@ -28,7 +28,7 @@ export function EmptyBookmarkSlot({
{canAdd ? (
- +
) : (
diff --git a/src/layouts/bookmark/components/bookmark-folder.tsx b/src/layouts/bookmark/components/bookmark-folder.tsx index 2035fee9..2a2d1bb5 100644 --- a/src/layouts/bookmark/components/bookmark-folder.tsx +++ b/src/layouts/bookmark/components/bookmark-folder.tsx @@ -1,12 +1,11 @@ import { useState } from 'react' -import { FaFolder, FaFolderOpen } from 'react-icons/fa' -import { SlOptions } from 'react-icons/sl' import { addOpacityToColor } from '@/common/color' import type { Bookmark } from '../types/bookmark.types' import { RenderStickerPattern } from './bookmark/bookmark-sticker' import { BookmarkTitle } from './bookmark/bookmark-title' import { useBookmarkStore } from '../context/bookmark.context' import { BookmarkIcon } from './bookmark/bookmark-icon' +import { Icon } from '@/src/icons' export function FolderBookmarkItem({ bookmark, @@ -48,9 +47,9 @@ export function FolderBookmarkItem({ } return isHovered ? ( - + ) : ( - + ) } @@ -111,7 +110,7 @@ export function FolderBookmarkItem({ 'absolute cursor-pointer top-0.5 right-0.5 p-1 rounded-full opacity-0 group-hover:opacity-100 transition-all duration-200 hover:bg-base-content/10 z-10' } > - +
)} diff --git a/src/layouts/bookmark/components/bookmark-icon.picker.tsx b/src/layouts/bookmark/components/bookmark-icon.picker.tsx index 612e0fc3..a6b69aac 100644 --- a/src/layouts/bookmark/components/bookmark-icon.picker.tsx +++ b/src/layouts/bookmark/components/bookmark-icon.picker.tsx @@ -1,9 +1,8 @@ import { showToast } from '@/common/toast' import { getFaviconFromUrl } from '@/common/utils/icon' +import { Icon } from '@/src/icons' import type React from 'react' import { useRef, useState } from 'react' -import { FaUpload, FaImage } from 'react-icons/fa' -import { LuX } from 'react-icons/lu' type Props = { value: File | string | null @@ -85,11 +84,11 @@ export function BookmarkIconPicker({ value, url, onChange }: Props) { onError={() => setError(true)} /> ) : ( - + )}
- +
{isFile && ( @@ -97,7 +96,7 @@ export function BookmarkIconPicker({ value, url, onChange }: Props) { onClick={handleRemove} className="absolute top-0 right-0 flex items-center justify-center w-5 h-5 rounded-full bg-base-300" > - + )}

diff --git a/src/layouts/bookmark/components/bookmark-item.tsx b/src/layouts/bookmark/components/bookmark-item.tsx index 79b39014..bd1732b7 100644 --- a/src/layouts/bookmark/components/bookmark-item.tsx +++ b/src/layouts/bookmark/components/bookmark-item.tsx @@ -1,9 +1,9 @@ -import { SlOptions } from 'react-icons/sl' import { addOpacityToColor } from '@/common/color' import type { Bookmark } from '../types/bookmark.types' import { BookmarkIcon } from './bookmark/bookmark-icon' import { RenderStickerPattern } from './bookmark/bookmark-sticker' import { BookmarkTitle } from './bookmark/bookmark-title' +import { Icon } from '@/src/icons' interface BookmarkItemProps { bookmark: Bookmark @@ -55,7 +55,7 @@ export function BookmarkItem({ 'absolute cursor-pointer top-0.5 right-0.5 p-1 rounded-full opacity-0 group-hover:opacity-100 transition-all duration-200 hover:bg-base-content/10 z-10' } > - +
)} {RenderStickerPattern(bookmark)} diff --git a/src/layouts/bookmark/components/bookmark-suggestions.tsx b/src/layouts/bookmark/components/bookmark-suggestions.tsx index 5b2ba108..d56caa27 100644 --- a/src/layouts/bookmark/components/bookmark-suggestions.tsx +++ b/src/layouts/bookmark/components/bookmark-suggestions.tsx @@ -1,5 +1,3 @@ -import { FaGlobe } from 'react-icons/fa' -import { getFaviconFromUrl } from '@/common/utils/icon' import { SectionPanel } from '@/components/section-panel' import { type BookmarkSuggestion, @@ -28,34 +26,18 @@ export function BookmarkSuggestions({ onSelect }: BookmarkSuggestionsProps) { className="p-2 flex flex-col items-center gap-y-0.5 text-center transition-colors duration-200 bg-content hover:!bg-base-300/75 border border-base-300/40 rounded-xl cursor-pointer" >
- {suggestion.icon ? ( - {suggestion.title} { - const target = e.target as HTMLImageElement - target.style.display = 'none' - target.nextElementSibling?.classList.remove( - 'hidden' - ) - }} - /> - ) : ( - {suggestion.title} { - const target = e.target as HTMLImageElement - target.style.display = 'none' - target.nextElementSibling?.classList.remove( - 'hidden' - ) - }} - /> - )} - + {suggestion.title} { + const target = e.target as HTMLImageElement + target.style.display = 'none' + target.nextElementSibling?.classList.remove( + 'hidden' + ) + }} + />

{suggestion.title} diff --git a/src/layouts/bookmark/components/bookmark/bookmark-icon.tsx b/src/layouts/bookmark/components/bookmark/bookmark-icon.tsx index 71c9fb55..4c3f969c 100644 --- a/src/layouts/bookmark/components/bookmark/bookmark-icon.tsx +++ b/src/layouts/bookmark/components/bookmark/bookmark-icon.tsx @@ -1,7 +1,7 @@ -import { FaFolder } from 'react-icons/fa' import { getFaviconFromUrl } from '@/common/utils/icon' import type { Bookmark } from '../../types/bookmark.types' import { useState } from 'react' +import { Icon } from '@/src/icons' const colors = [ 'bg-blue-500/60', 'bg-purple-500/60', @@ -48,7 +48,7 @@ export function BookmarkIcon({ bookmark }: { bookmark: Bookmark }) { displayIcon = bookmark.icon } } else { - displayIcon = + displayIcon = } if (displayIcon === '') { diff --git a/src/layouts/bookmark/components/folder-header.tsx b/src/layouts/bookmark/components/folder-header.tsx index 9326153c..a2109f00 100644 --- a/src/layouts/bookmark/components/folder-header.tsx +++ b/src/layouts/bookmark/components/folder-header.tsx @@ -1,12 +1,11 @@ import { useState } from 'react' -import { IoMdHelp } from 'react-icons/io' import Analytics from '@/analytics' import { Button } from '@/components/button/button' import Modal from '@/components/modal' import Tooltip from '@/components/toolTip' import type { FolderPathItem } from '../types/bookmark.types' import { FolderPath } from './folder-path' -import { LuX } from 'react-icons/lu' +import { Icon } from '@/src/icons' interface FolderHeaderProps { folderPath: FolderPathItem[] @@ -34,7 +33,7 @@ export function FolderHeader({ folderPath, onNavigate }: FolderHeaderProps) { size="xs" className={`h-7 w-7 text-xs font-medium rounded-[0.55rem] transition-colors border-none shadow-none text-muted hover:bg-base-300`} > - + @@ -43,7 +42,7 @@ export function FolderHeader({ folderPath, onNavigate }: FolderHeaderProps) { size="xs" className={`h-7 w-7 mr-1 text-xs font-medium rounded-[0.55rem] transition-colors border-none shadow-none text-muted hover:bg-base-300`} > - +

diff --git a/src/layouts/bookmark/components/folder-path.tsx b/src/layouts/bookmark/components/folder-path.tsx index c8c77983..25fc08c3 100644 --- a/src/layouts/bookmark/components/folder-path.tsx +++ b/src/layouts/bookmark/components/folder-path.tsx @@ -1,4 +1,4 @@ -import { RiArrowLeftSLine } from 'react-icons/ri' +import { Icon } from '@/src/icons' import type { FolderPathItem } from '../types/bookmark.types' type FolderPathProps = { @@ -30,7 +30,7 @@ export function FolderPath({ folderPath, onNavigate, className }: FolderPathProp {folderPath.map((item, index) => (
  • - + @@ -205,7 +204,7 @@ export function AdvancedModal({ title, onClose, isOpen, bookmark }: AdvancedModa /> diff --git a/src/layouts/bookmark/components/modal/bookmark-context-menu.tsx b/src/layouts/bookmark/components/modal/bookmark-context-menu.tsx index ab16a847..cf7a4bc1 100644 --- a/src/layouts/bookmark/components/modal/bookmark-context-menu.tsx +++ b/src/layouts/bookmark/components/modal/bookmark-context-menu.tsx @@ -1,5 +1,5 @@ import { ContextMenu } from '@/components/contextMenu.component' -import { LuPen, LuPlus, LuTrash } from 'react-icons/lu' +import { Icon } from '@/src/icons' interface BookmarkContextMenuProps { position: { x: number; y: number } @@ -30,7 +30,7 @@ export function BookmarkContextMenu({ onClick={onOpenInNewTab} className={`w-full px-3 py-1 flex items-center gap-x-1.5 cursor-pointer rounded-lg transition-colors duration-200 ${getMenuItemStyle()}`} > - + در تب جدید )} @@ -39,7 +39,7 @@ export function BookmarkContextMenu({ onClick={onEdit} className={`w-full px-3 py-1 flex items-center gap-x-[9px] cursor-pointer rounded-lg transition-colors duration-200 ${getMenuItemStyle()}`} > - + ویرایش @@ -47,7 +47,7 @@ export function BookmarkContextMenu({ onClick={onDelete} className={`w-full px-3 py-1 flex items-center gap-x-2.5 cursor-pointer rounded-lg transition-colors duration-200 ${getMenuItemStyle(true)}`} > - + حذف diff --git a/src/layouts/bookmark/components/shared.tsx b/src/layouts/bookmark/components/shared.tsx index ccac5071..497183fd 100644 --- a/src/layouts/bookmark/components/shared.tsx +++ b/src/layouts/bookmark/components/shared.tsx @@ -1,32 +1,9 @@ -import { FiChevronUp } from 'react-icons/fi' import type { BookmarkType } from '../types/bookmark.types' -import { HiOutlineBookmark, HiOutlineFolder } from 'react-icons/hi2' import { TabNavigation } from '@/components/tab-navigation' +import { Icon } from '@/src/icons' export type IconSourceType = 'auto' | 'upload' | 'url' -export function IconSourceSelector({ - iconSource, - setIconSource, -}: { - iconSource: IconSourceType - setIconSource: (source: IconSourceType) => void - theme?: string -}) { - return ( - - size="small" - tabMode="simple" - tabs={[ - { id: 'auto', label: 'آیکون خودکار' }, - { id: 'upload', label: 'آپلود آیکون' }, - ]} - activeTab={iconSource} - onTabClick={(tab) => setIconSource(tab)} - /> - ) -} - export function TypeSelector({ type, setType, @@ -43,9 +20,13 @@ export function TypeSelector({ { id: 'BOOKMARK', label: 'بوکمارک', - icon: , + icon: , + }, + { + id: 'FOLDER', + label: 'پوشه', + icon: , }, - { id: 'FOLDER', label: 'پوشه', icon: }, ]} activeTab={type} onTabClick={(tab) => setType(tab)} @@ -70,7 +51,8 @@ export function ShowAdvancedButton({ } > {showAdvanced ? 'گزینه‌های کمتر' : 'گزینه‌های بیشتر'} - diff --git a/src/layouts/friends/components/activity-card/empty-activity-card.tsx b/src/layouts/friends/components/activity-card/empty-activity-card.tsx index 40d415c9..1c8d9e2c 100644 --- a/src/layouts/friends/components/activity-card/empty-activity-card.tsx +++ b/src/layouts/friends/components/activity-card/empty-activity-card.tsx @@ -1,5 +1,5 @@ import { AvatarComponent } from '@/components/avatar.component' -import { RiQuillPenAiLine } from 'react-icons/ri' +import { Icon } from '@/src/icons' interface EmptyActivityCardProps { avatar: string @@ -26,7 +26,7 @@ export const EmptyActivityCard = ({ avatar, name, onClick }: EmptyActivityCardPr `} >
    - +
    diff --git a/src/layouts/friends/components/activity-card/manage-activity.bottomSheet.tsx b/src/layouts/friends/components/activity-card/manage-activity.bottomSheet.tsx index 12311346..e63fdac1 100644 --- a/src/layouts/friends/components/activity-card/manage-activity.bottomSheet.tsx +++ b/src/layouts/friends/components/activity-card/manage-activity.bottomSheet.tsx @@ -1,7 +1,6 @@ import { useState } from 'react' import { Button } from '@/components/button/button' import { showToast } from '@/common/toast' -import { FiTrash2 } from 'react-icons/fi' import Modal from '@/components/modal' import { useRemoveActivity, useSetActivity } from '@/services/hooks/user/userService.hook' import { translateError } from '@/utils/translate-error' @@ -16,8 +15,8 @@ import { AvatarComponent } from '@/components/avatar.component' import { callEvent } from '@/common/utils/call-event' import { Chip } from '@/components/chip.component' import { SelectBox } from '@/components/selectbox/selectbox' -import { BsInfoCircle } from 'react-icons/bs' import Tooltip from '@/components/toolTip' +import { Icon } from '@/src/icons' interface ManageActivityBottomSheetProps { isOpen: boolean @@ -108,7 +107,7 @@ export function ManageActivityBottomSheet({ loading={isRemoving} >
    - + حذف نوشته
    @@ -188,7 +187,10 @@ export function ManageActivityBottomSheet({

    متن نوشته - +

    - +
    @@ -94,7 +94,10 @@ export function AddFriendBottomSheet({ isOpen, onClose }: AddFriendBottomSheetPr {!canSendRequest && (
    - +

    برای ارسال درخواست دوستی، ابتدا باید نام کاربری خود را در بخش پروفایل تنظیم کنید. @@ -125,7 +128,7 @@ export function AddFriendBottomSheet({ isOpen, onClose }: AddFriendBottomSheetPr {translatedError && (

    - + {translatedError}

    )} diff --git a/src/layouts/friends/components/buttons/friend-requests.button.tsx b/src/layouts/friends/components/buttons/friend-requests.button.tsx index 7f4794e3..3a822448 100644 --- a/src/layouts/friends/components/buttons/friend-requests.button.tsx +++ b/src/layouts/friends/components/buttons/friend-requests.button.tsx @@ -1,6 +1,5 @@ -import { FiInbox } from 'react-icons/fi' import { FriendRequestsBottomSheet } from '../friend-requests.bottomSheet' -import { HiOutlineInbox } from 'react-icons/hi2' +import { Icon } from '@/src/icons' interface Prop { size: 'small' | 'large' @@ -17,7 +16,7 @@ export function FriendRequestsButton({ size, pendingCount }: Prop) { className="flex items-center relative gap-2 px-3 py-1.5 transition-all border cursor-pointer rounded-xl bg-content text-content border-content active:scale-95" aria-label="درخواست‌های دوستی" > - + درخواست‌ها {pendingCount ? (
    @@ -32,7 +31,10 @@ export function FriendRequestsButton({ size, pendingCount }: Prop) { onClick={() => setIsRequestsOpen(true)} className="flex relative items-center gap-1 px-2 py-1.5 transition-all border cursor-pointer rounded-xl bg-content text-content border-content active:scale-95 group group-hover:opacity-85" > - + {pendingCount ? (
    {pendingCount} diff --git a/src/layouts/friends/components/empty-list.friend.tsx b/src/layouts/friends/components/empty-list.friend.tsx index 8c6e4441..497b41ea 100644 --- a/src/layouts/friends/components/empty-list.friend.tsx +++ b/src/layouts/friends/components/empty-list.friend.tsx @@ -1,4 +1,4 @@ -import { FiUsers } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface Prop { emptyMessage?: string @@ -8,7 +8,7 @@ export function FriendEmptyList({ emptyMessage }: Prop) {
    - +
    diff --git a/src/layouts/friends/components/friend-requests.bottomSheet.tsx b/src/layouts/friends/components/friend-requests.bottomSheet.tsx index 2cbfb193..4c17c558 100644 --- a/src/layouts/friends/components/friend-requests.bottomSheet.tsx +++ b/src/layouts/friends/components/friend-requests.bottomSheet.tsx @@ -1,5 +1,3 @@ -import { FiUserCheck } from 'react-icons/fi' - import { type Friend, useHandleFriendRequest, @@ -10,6 +8,7 @@ import { FriendsList } from './friends-List' import { Button } from '@/components/button/button' import { showToast } from '@/common/toast' import Modal from '@/components/modal' +import { Icon } from '@/src/icons' interface Prop { isOpen: boolean @@ -53,7 +52,7 @@ export const FriendRequestsBottomSheet = ({ isOpen, onClose }: Prop) => { rounded-lg transition-all active:scale-[0.97]" > - + دوست شیم - + {label || 'حذف'} ) diff --git a/src/layouts/friends/friends.tsx b/src/layouts/friends/friends.tsx index 0970690d..acfafa48 100644 --- a/src/layouts/friends/friends.tsx +++ b/src/layouts/friends/friends.tsx @@ -4,11 +4,11 @@ import { translateError } from '@/utils/translate-error' import { showToast } from '@/common/toast' import { RemoveFriendButton } from './components/remove-button' import { FriendsList } from './components/friends-List' -import { FiUserPlus } from 'react-icons/fi' import { AddFriendBottomSheet } from './components/add-friend.bottomSheet' import { ConfirmationModal } from '@/components/modal/confirmation-modal' import { FriendRequestsButton } from './components/buttons/friend-requests.button' import { useAuth } from '@/context/auth.context' +import { Icon } from '@/src/icons' export const FriendsLayout = () => { const { user } = useAuth() @@ -60,7 +60,7 @@ export const FriendsLayout = () => { aria-label="افزودن دوست جدید" type="button" > - + افزودن دوست diff --git a/src/layouts/market/market-coins/components/coin-package-card.tsx b/src/layouts/market/market-coins/components/coin-package-card.tsx index aff71f0f..971553c3 100644 --- a/src/layouts/market/market-coins/components/coin-package-card.tsx +++ b/src/layouts/market/market-coins/components/coin-package-card.tsx @@ -1,7 +1,7 @@ -import { FiShoppingCart } from 'react-icons/fi' import { Button } from '@/components/button/button' import { ConfigKey } from '@/common/constant/config.key' import { CoinPackage } from '@/services/hooks/market/market-coins.interface' +import { Icon } from '@/src/icons' interface CoinPackageCardProps { package: CoinPackage @@ -13,36 +13,48 @@ const fmt = (n: number) => new Intl.NumberFormat('fa-IR').format(n) export function CoinPackageCard({ package: pkg, onPurchase }: CoinPackageCardProps) { return ( -
    +
    {/* Coin visual area */}
    -
    +
    ویج‌کوین
    -

    {fmt(pkg.coin)}

    -

    ویج‌کوین

    +

    + {fmt(pkg.coin)} +

    +

    + ویج‌کوین +

    {/* Info */}
    -

    {pkg.title}

    +

    + {pkg.title} +

    {pkg.description && ( -

    {pkg.description}

    +

    + {pkg.description} +

    )}
    - {fmt(pkg.price)} - تومان + + {fmt(pkg.price)} + + + تومان +
    diff --git a/src/layouts/market/market-coins/components/coin-package-purchase-modal.tsx b/src/layouts/market/market-coins/components/coin-package-purchase-modal.tsx index a73aef10..3f974da6 100644 --- a/src/layouts/market/market-coins/components/coin-package-purchase-modal.tsx +++ b/src/layouts/market/market-coins/components/coin-package-purchase-modal.tsx @@ -1,4 +1,3 @@ -import { FiCheck } from 'react-icons/fi' import Analytics from '@/analytics' import { Button } from '@/components/button/button' import Modal from '@/components/modal' @@ -7,6 +6,7 @@ import { showToast } from '@/common/toast' import { ConfigKey } from '@/common/constant/config.key' import type { CoinPackage } from '@/services/hooks/market/market-coins.interface' import { usePurchaseCoinPackage } from '@/services/hooks/market/market-coints.hook' +import { Icon } from '@/src/icons' interface CoinPackagePurchaseModalProps { isOpen: boolean @@ -60,7 +60,7 @@ export function CoinPackagePurchaseModal({ showCloseButton={!isPending} >
    -
    +
    -

    {pkg.title}

    +

    + {pkg.title} +

    {pkg.description && (

    {pkg.description}

    )}
    -
    +
    مبلغ قابل پرداخت
    @@ -103,7 +105,8 @@ export function CoinPackagePurchaseModal({

    - 💡 سکه‌های خریداری شده بلافاصله پس از پرداخت موفق به حساب شما اضافه می‌شوند. + 💡 سکه‌های خریداری شده بلافاصله پس از پرداخت موفق به حساب شما اضافه + می‌شوند.

    @@ -124,7 +127,7 @@ export function CoinPackagePurchaseModal({ loadingText="در حال انتقال..." className="flex-1 text-white rounded-2xl bg-primary hover:bg-primary/90" > - + تایید و پرداخت
    diff --git a/src/layouts/market/market-coins/index.tsx b/src/layouts/market/market-coins/index.tsx index 9d15a98e..0d0ee409 100644 --- a/src/layouts/market/market-coins/index.tsx +++ b/src/layouts/market/market-coins/index.tsx @@ -5,9 +5,9 @@ import { useAuth } from '@/context/auth.context' import { CoinPackageCard } from './components/coin-package-card' import { CoinPackagePurchaseModal } from './components/coin-package-purchase-modal' import { showToast } from '@/common/toast' -import { FaCoins } from 'react-icons/fa' import type { CoinPackage } from '@/services/hooks/market/market-coins.interface' import { useGetCoinPackages } from '@/services/hooks/market/market-coints.hook' +import { Icon } from '@/src/icons' export function MarketCoins() { const { isAuthenticated, refetchUser } = useAuth() @@ -75,7 +75,7 @@ export function MarketCoins() { ) : (
    - +

    فعلا چیزی برای خرید نیست diff --git a/src/layouts/market/market-container.tsx b/src/layouts/market/market-container.tsx index 3f96857c..a72841ad 100644 --- a/src/layouts/market/market-container.tsx +++ b/src/layouts/market/market-container.tsx @@ -1,6 +1,4 @@ import { useState, useEffect } from 'react' -import { FaCoins, FaPaintBrush } from 'react-icons/fa' -import { FaPhotoFilm } from 'react-icons/fa6' import { useAuth } from '@/context/auth.context' import { MarketWallpaper } from './marketWallpaper' import { MarketOtherItems } from './other-items' @@ -9,24 +7,25 @@ import Analytics from '@/analytics' import { TabNavigation } from '@/components/tab-navigation' import { MarketCoins } from './market-coins' import { listenEvent } from '@/common/utils/call-event' +import { Icon } from '@/src/icons' const tabs = [ { id: 'other', label: 'شخصی‌سازی', - icon: , + icon: , element: , }, { id: 'wallpapers', label: 'تصویر زمینه‌ها', - icon: , + icon: , element: , }, { id: 'coins', label: 'خرید ویج‌‌کوین', - icon: , + icon: , element: , }, ] diff --git a/src/layouts/market/other-items/components/market-item-card.tsx b/src/layouts/market/other-items/components/market-item-card.tsx index 2ab10a5f..bc6c9bf9 100644 --- a/src/layouts/market/other-items/components/market-item-card.tsx +++ b/src/layouts/market/other-items/components/market-item-card.tsx @@ -1,10 +1,10 @@ -import { FiCheck, FiShoppingCart, FiEye } from 'react-icons/fi' import { Button } from '@/components/button/button' import { ItemPrice } from '@/components/item-price/item-price' import { getItemTypeEmoji } from '@/components/market/getItemTypeEmoji' import { type MarketItem, MarketItemType } from '@/services/hooks/market/market.interface' import { showToast } from '@/common/toast' import { RenderPreview } from './renderPreview' +import { Icon } from '@/src/icons' interface MarketItemCardProps { item: MarketItem @@ -61,19 +61,12 @@ export function MarketItemCard({

    - {isOwned && ( -
    - - دارید -
    - )} - {!canPreview && ( )} @@ -90,7 +83,7 @@ export function MarketItemCard({ {isOwned ? ( - + خریداری‌شده ) : ( @@ -100,7 +93,7 @@ export function MarketItemCard({ className="h-6 px-2.5 rounded-lg text-[11px] font-medium bg-primary/90 text-white hover:bg-primary active:scale-95 transition-all" >
    - + خرید
    diff --git a/src/layouts/market/other-items/components/market-item-purchase-modal.tsx b/src/layouts/market/other-items/components/market-item-purchase-modal.tsx index 0fdf754e..b5361d80 100644 --- a/src/layouts/market/other-items/components/market-item-purchase-modal.tsx +++ b/src/layouts/market/other-items/components/market-item-purchase-modal.tsx @@ -1,4 +1,3 @@ -import { FiCheck, FiAlertCircle } from 'react-icons/fi' import Analytics from '@/analytics' import { Button } from '@/components/button/button' import { ItemPrice } from '@/components/item-price/item-price' @@ -8,6 +7,7 @@ import { usePurchaseMarketItem } from '@/services/hooks/market/purchaseMarketIte import { translateError } from '@/utils/translate-error' import { showToast } from '@/common/toast' import { RenderPreview } from './renderPreview' +import { Icon } from '@/src/icons' interface MarketItemPurchaseModalProps { isOpen: boolean @@ -101,7 +101,10 @@ export function MarketItemPurchaseModal({ {!canAfford && (
    - +

    موجودی ناکافی @@ -135,7 +138,7 @@ export function MarketItemPurchaseModal({ : 'bg-base-300 text-muted cursor-not-allowed' }`} > - + تایید خرید

    diff --git a/src/layouts/market/other-items/index.tsx b/src/layouts/market/other-items/index.tsx index 0bebacd6..482a2293 100644 --- a/src/layouts/market/other-items/index.tsx +++ b/src/layouts/market/other-items/index.tsx @@ -10,9 +10,9 @@ import { MarketItemCard } from './components/market-item-card' import { MarketItemPurchaseModal } from './components/market-item-purchase-modal' import { showToast } from '@/common/toast' import { Chip } from '@/components/chip.component' -import { FiShoppingBag } from 'react-icons/fi' import { useAppearanceSetting } from '@/context/appearance.context' import { usePreviewHandler } from '@/hooks/usePreviewHandler' +import { Icon } from '@/src/icons' const FILTER_OPTIONS = [ { id: 'all', label: 'همه' }, @@ -124,7 +124,11 @@ export function MarketOtherItems() { {error ? (
    - +

    خطا در بارگذاری آیتم‌ها

    @@ -162,7 +166,11 @@ export function MarketOtherItems() { ) : (
    - +

    آیتمی در این دسته‌بندی وجود ندارد diff --git a/src/layouts/mini-apps/components/header/runner.header.tsx b/src/layouts/mini-apps/components/header/runner.header.tsx index 8b0a2c39..443662d2 100644 --- a/src/layouts/mini-apps/components/header/runner.header.tsx +++ b/src/layouts/mini-apps/components/header/runner.header.tsx @@ -1,8 +1,6 @@ import { callEvent } from '@/common/utils/call-event' import type { MiniApp } from '@/services/hooks/mini-apps/mini-apps-interface' -import { FiMaximize, FiMinimize } from 'react-icons/fi' -import { HiChevronRight } from 'react-icons/hi2' -import { TbRefresh } from 'react-icons/tb' +import { Icon } from '@/src/icons' interface Prop { onClickToBack: any @@ -35,7 +33,8 @@ export function MiniAppRunnerHeader({ aria-label="بازگشت" onClick={() => onClickToBack()} > - @@ -77,12 +76,14 @@ export function MiniAppRunnerHeader({ className="flex items-center justify-center w-8 h-8 transition-all duration-200 border rounded-lg cursor-pointer bg-base-200/50 active:scale-95 group border-base-content/5 disabled:opacity-40" > {isFullScreen ? ( - ) : ( - @@ -93,7 +94,8 @@ export function MiniAppRunnerHeader({ onClick={handleReload} className="flex items-center justify-center w-8 h-8 transition-all duration-200 border rounded-lg cursor-pointer bg-base-200/50 active:scale-95 group border-base-content/5 disabled:opacity-40" > - diff --git a/src/layouts/mini-apps/mini-apps.layout.tsx b/src/layouts/mini-apps/mini-apps.layout.tsx index 167efae9..5f20e916 100644 --- a/src/layouts/mini-apps/mini-apps.layout.tsx +++ b/src/layouts/mini-apps/mini-apps.layout.tsx @@ -5,9 +5,9 @@ import { useEffect, useRef } from 'react' import { MiniAppRunner } from './mini-app-runner' import { listenEvent } from '@/common/utils/call-event' import Analytics from '@/analytics' -import { HiOutlineInformationCircle } from 'react-icons/hi2' import Modal from '@/components/modal' import { Button } from '@/components/button/button' +import { Icon } from '@/src/icons' const EmptyMiniAppImage = 'https://cdn.widgetify.ir/extension/empty-mini-app.png' export function MiniAppsLayout() { const { data, isLoading, isFetchingNextPage, fetchNextPage, hasNextPage, isError } = @@ -78,7 +78,7 @@ export function MiniAppsLayout() { onClick={() => onClickToShowInfo()} className="p-1 text-lg font-bold cursor-pointer text-base-content/80 hover:text-base-content active:scale-95" > - +

    diff --git a/src/layouts/mini-apps/states/mini-app.auth.tsx b/src/layouts/mini-apps/states/mini-app.auth.tsx index 9309922d..667ff864 100644 --- a/src/layouts/mini-apps/states/mini-app.auth.tsx +++ b/src/layouts/mini-apps/states/mini-app.auth.tsx @@ -3,7 +3,7 @@ import { callEvent } from '@/common/utils/call-event' import { Button } from '@/components/button/button' import { useAuth } from '@/context/auth.context' import type { MiniAppScopeEnum } from '@/services/hooks/mini-apps/mini-apps-interface' -import { CiCircleAlert } from 'react-icons/ci' +import { Icon } from '@/src/icons' interface Prop { scopes: MiniAppScopeEnum[] @@ -27,7 +27,7 @@ export function WebAppAuthGate({ scopes, onConfirm }: Prop) {
    - +
    diff --git a/src/layouts/navbar/components/settingsDropdown.tsx b/src/layouts/navbar/components/settingsDropdown.tsx index 9888ecf1..f98f9aca 100644 --- a/src/layouts/navbar/components/settingsDropdown.tsx +++ b/src/layouts/navbar/components/settingsDropdown.tsx @@ -1,11 +1,9 @@ import { useCallback, useState, useRef } from 'react' -import { HiCog, HiViewGridAdd } from 'react-icons/hi' import { callEvent } from '@/common/utils/call-event' import { ClickableTooltip } from '@/components/clickableTooltip' import { useAppearanceSetting } from '@/context/appearance.context' -import { AiOutlineDrag } from 'react-icons/ai' import { showToast } from '@/common/toast' -import { HiOutlineCog6Tooth } from 'react-icons/hi2' +import { Icon } from '@/src/icons' interface SettingsProps { setShowSettings: (value: boolean) => void @@ -44,7 +42,11 @@ export const SettingsDropdown = ({ setShowSettings }: SettingsProps) => { }} className="flex items-center w-full gap-3 px-3 py-2 text-sm text-right transition-colors rounded-none cursor-pointer group hover:bg-primary/10 hover:text-primary" > - + تنظیمات @@ -55,7 +57,8 @@ export const SettingsDropdown = ({ setShowSettings }: SettingsProps) => { className="flex items-center justify-between w-full px-3 py-2 text-sm text-right transition-colors rounded-none cursor-pointer group hover:bg-primary/10 hover:text-primary" >
    - @@ -68,7 +71,8 @@ export const SettingsDropdown = ({ setShowSettings }: SettingsProps) => { onClick={() => onClick()} >
    - @@ -89,7 +93,7 @@ export const SettingsDropdown = ({ setShowSettings }: SettingsProps) => { className="relative p-2 transition-all cursor-pointer nav-btn text-base-content/40 hover:text-base-content active:scale-90" id="settings-button" > - +
    (
    @@ -57,7 +57,7 @@ export function FriendsListNavbar() { className="relative p-2 transition-all cursor-pointer nav-btn text-base-content/40 hover:text-base-content active:scale-90" onClick={() => clickToOpenSheet()} > - + {hasPendingRequests && renderPendingNotification(user?.friendshipStats?.pending || 0)}
    @@ -72,7 +72,8 @@ export function FriendsListNavbar() { }} className="flex items-center gap-1 px-2 py-1.5 transition-all border cursor-pointer rounded-xl bg-content text-content border-content active:scale-95 group group-hover:opacity-85" > - diff --git a/src/layouts/navbar/market/market-button.tsx b/src/layouts/navbar/market/market-button.tsx index 1cceffea..8a8e8d07 100644 --- a/src/layouts/navbar/market/market-button.tsx +++ b/src/layouts/navbar/market/market-button.tsx @@ -3,7 +3,7 @@ import Analytics from '@/analytics' import { listenEvent } from '@/common/utils/call-event' import Modal from '@/components/modal' import { MarketContainer } from '@/layouts/market/market-container' -import { HiOutlineShoppingBag } from 'react-icons/hi2' +import { Icon } from '@/src/icons' export function MarketButton() { const [showMarket, setShowMarket] = useState(false) @@ -26,7 +26,7 @@ export function MarketButton() { onClick={() => handleClick()} className="p-2 transition-all cursor-pointer nav-btn text-base-content/40 hover:text-base-content active:scale-90" > - + , - activeIcon: , + icon: , + activeIcon: , label: 'ویجتیفای', }, { id: Page.Explorer, - icon: , - activeIcon: , + icon: , + activeIcon: , label: 'کاوش', }, { id: Page.MiniApps, - icon: , - activeIcon: , + icon: , + activeIcon: , label: 'برنامک‌ها', }, ] @@ -136,10 +126,11 @@ export function NavbarLayout(): JSX.Element { return ( <> {canReOrderWidget && ( -
    +
    - @@ -148,7 +139,7 @@ export function NavbarLayout(): JSX.Element { onClick={() => toggleCanReOrderWidget()} className="transition-colors hover:text-red-400" > - +
    @@ -206,7 +197,7 @@ export function NavbarLayout(): JSX.Element { onClick={() => onToggleNavbar()} className="p-2 transition-all cursor-pointer nav-btn text-base-content/40 hover:text-base-content active:scale-90" > - + diff --git a/src/layouts/search/browser-bookmark/bookmark-list-item.tsx b/src/layouts/search/browser-bookmark/bookmark-list-item.tsx deleted file mode 100644 index bfa50eb8..00000000 --- a/src/layouts/search/browser-bookmark/bookmark-list-item.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { FiChevronRight, FiFolder, FiExternalLink } from 'react-icons/fi' -import { getFaviconFromUrl } from '@/common/utils/icon' -import type { FetchedBrowserBookmark } from '@/layouts/bookmark/utils/browser-bookmarks.util' - -interface Props { - item: FetchedBrowserBookmark - onClick: (item: FetchedBrowserBookmark) => void -} - -export function BookmarkListItem({ item, onClick }: Props) { - const isFolder = item.type === 'FOLDER' - - return ( -
    onClick(item)} - className="flex items-center gap-2.5 p-2 hover:bg-primary/5 rounded-xl cursor-pointer transition-all group" - > - {isFolder ? ( - - ) : ( - - )} - - - {item.title || (isFolder ? 'پوشه بدون نام' : 'بدون عنوان')} - - - {isFolder ? ( - - ) : ( - - )} -
    - ) -} diff --git a/src/layouts/search/browser-bookmark/bookmark-popover.tsx b/src/layouts/search/browser-bookmark/bookmark-popover.tsx index 62538173..f6cfc935 100644 --- a/src/layouts/search/browser-bookmark/bookmark-popover.tsx +++ b/src/layouts/search/browser-bookmark/bookmark-popover.tsx @@ -1,6 +1,5 @@ import { useEffect, useState } from 'react' import { createPortal } from 'react-dom' -import { FiChevronRight, FiFolder, FiExternalLink, FiLock } from 'react-icons/fi' import { getFaviconFromUrl } from '@/common/utils/icon' import { useGeneralSetting } from '@/context/general-setting.context' import { @@ -9,7 +8,7 @@ import { } from '@/layouts/bookmark/utils/browser-bookmarks.util' import Analytics from '@/analytics' import { Button } from '@/components/button/button' -import { HiChevronRight } from 'react-icons/hi2' +import { Icon } from '@/src/icons' interface BookmarkPopoverProps { isOpen: boolean @@ -87,7 +86,7 @@ export function BookmarkPopover({ isOpen, onClose, coords }: BookmarkPopoverProp {!browserBookmarksEnabled ? (
    - +

    دسترسی به بوکمارک‌ها

    @@ -113,7 +112,7 @@ export function BookmarkPopover({ isOpen, onClose, coords }: BookmarkPopoverProp onClick={handleGoBack} className="text-[10px] btn-ghost text-muted rounded-xl flex items-center gap-1!" > - + بازگشت )} @@ -128,7 +127,8 @@ export function BookmarkPopover({ isOpen, onClose, coords }: BookmarkPopoverProp className="flex items-center gap-2.5 p-2 hover:bg-primary/5 hover:text-primary/80 rounded-xl cursor-pointer transition-all group" > {item.type === 'FOLDER' ? ( - @@ -143,12 +143,14 @@ export function BookmarkPopover({ isOpen, onClose, coords }: BookmarkPopoverProp {item.title} {item.type === 'FOLDER' ? ( - ) : ( - diff --git a/src/layouts/search/browser-bookmark/browser-bookmark.tsx b/src/layouts/search/browser-bookmark/browser-bookmark.tsx index 6d35d2af..f60aa9df 100644 --- a/src/layouts/search/browser-bookmark/browser-bookmark.tsx +++ b/src/layouts/search/browser-bookmark/browser-bookmark.tsx @@ -2,12 +2,11 @@ import { useState, useRef, useEffect, useCallback } from 'react' import { useGetSearchboxData } from '@/services/hooks/trends/getTrends' import { getFaviconFromUrl } from '@/common/utils/icon' import Tooltip from '@/components/toolTip' -import { HiGlobeAlt } from 'react-icons/hi2' -import { MdFolderSpecial } from 'react-icons/md' import { BookmarkPopover } from './bookmark-popover' import { Page, usePage } from '@/context/page.context' import Analytics from '@/analytics' import { NewBadge } from '@/components/badges/new.badge' +import { Icon } from '@/src/icons' export function BrowserBookmark() { const { data } = useGetSearchboxData({ enabled: true }) @@ -71,7 +70,11 @@ export function BrowserBookmark() { onClick={() => onClickToExplorer()} >

    - +

    کاوش

    {fetchedSearchbox?.explorer?.newBadge && ( @@ -92,7 +95,7 @@ export function BrowserBookmark() { : 'bg-base-300 text-base-content/60' }`} > - +

    بوکمارک مرورگر

    diff --git a/src/layouts/search/history.portal.tsx b/src/layouts/search/history.portal.tsx index 0485160e..8f09d3e7 100644 --- a/src/layouts/search/history.portal.tsx +++ b/src/layouts/search/history.portal.tsx @@ -6,7 +6,7 @@ import { AutocompleteConsentModal } from './suggestion/autocomplete-consent.moda import { Portal } from '@/components/portal/Portal' import { useSearchHistory } from './hooks/useSearchHistory' import { Suggestions } from './suggestion/suggestions' -import { MdSearch } from 'react-icons/md' +import { Icon } from '@/src/icons' interface SearchHistoryPortalProps { onClose: () => void @@ -102,7 +102,11 @@ export function SearchHistoryPortal({ {showEnableButton && (
    - +

    diff --git a/src/layouts/search/image/image-search.portal.tsx b/src/layouts/search/image/image-search.portal.tsx index d4eddda0..0d7ff85a 100644 --- a/src/layouts/search/image/image-search.portal.tsx +++ b/src/layouts/search/image/image-search.portal.tsx @@ -1,5 +1,4 @@ import { useRef, useState } from 'react' -import { MdClose, MdLink, MdOutlinePrivacyTip } from 'react-icons/md' import { Button } from '@/components/button/button' import { showToast } from '@/common/toast' import { TextInput } from '@/components/text-input' @@ -8,6 +7,7 @@ import { RequireAuth } from '@/components/auth/require-auth' import { getMainClient } from '@/services/api' import { translateError } from '@/utils/translate-error' import { Portal } from '@/components/portal/Portal' +import { Icon } from '@/src/icons' interface ImageSearchPortalProps { onClose: () => void @@ -99,13 +99,13 @@ export function ImageSearchPortal({ target="_blank" rel="noreferrer" > - +

    @@ -202,7 +202,7 @@ export function ImageSearchPortal({
    - +
    - +
    onSearchButtonClick()} > - +
    {showNewBadge && } - @@ -161,7 +161,7 @@ interface EngineIconProps { function EngineIcon({ engineId, icon, label }: EngineIconProps) { if (engineId === 'google') { - return + return } return ( {item.isRecent ? ( - + ) : ( - + )} {item.text} diff --git a/src/layouts/search/voice/voice-search.portal.tsx b/src/layouts/search/voice/voice-search.portal.tsx index 600a8b39..b7e02eda 100644 --- a/src/layouts/search/voice/voice-search.portal.tsx +++ b/src/layouts/search/voice/voice-search.portal.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react' -import { MdClose, MdMic, MdSettings } from 'react-icons/md' import { useVoiceSearch } from './useVoiceSearch' import { Portal } from '@/components/portal/Portal' +import { Icon } from '@/src/icons' interface VoiceSearchPortalProps { onClose: () => void @@ -69,7 +69,7 @@ export function VoiceSearchPortal({ onClick={onClose} className="p-2 transition-colors rounded-full cursor-pointer hover:bg-base-200 text-base-content/60" > - +
    @@ -91,7 +91,7 @@ export function VoiceSearchPortal({ onClick={() => setIsLanguageMenuOpen(!isLanguageMenuOpen)} className="flex cursor-pointer items-center gap-2 px-3 py-1.5 hover:bg-base-200 rounded-xl transition-colors text-xs font-bold text-base-content/60" > - + {languages.find((l) => l.code === selectedLanguage)?.name} @@ -119,7 +119,8 @@ export function VoiceSearchPortal({ } className={`w-12 h-12 cursor-pointer flex items-center justify-center rounded-full transition-all ${isListening ? 'bg-error text-white shadow-lg shadow-error/20' : 'bg-primary text-white shadow-lg shadow-primary/20'}`} > - diff --git a/src/layouts/setting/setting-modal.tsx b/src/layouts/setting/setting-modal.tsx index 9ffa14c6..1668fbcf 100644 --- a/src/layouts/setting/setting-modal.tsx +++ b/src/layouts/setting/setting-modal.tsx @@ -1,4 +1,3 @@ -import { MdApps, MdOutlinePrivacyTip } from 'react-icons/md' import { TbApps } from 'react-icons/tb' import { VscColorMode, @@ -19,13 +18,12 @@ import { GeneralSettingTab } from './tabs/general/general' import { PrivacySettings } from './tabs/privacy/privacy-settings' import { ShortcutsTab } from './tabs/shortcuts/shortcuts' import { WallpaperSetting } from './tabs/wallpapers/wallpapers' -import { BiUserCircle } from 'react-icons/bi' import { AccountTab } from './tabs/account/account' import { FiGift, FiUsers } from 'react-icons/fi' import { AllFriendsTab, RewardsTab } from './tabs/account/tabs' import { RiApps2AiLine } from 'react-icons/ri' -import { Connections } from './tabs/account/tabs/user-profile/connections/connections' import { ConnectionPlatformsTab } from './tabs/account/tabs/connection/connectionsTab' +import { Icon } from '@/src/icons' interface SettingModalProps { isOpen: boolean @@ -40,7 +38,7 @@ const tabs: TabItem[] = [ { label: 'پروفایل من', value: 'profile', - icon: , + icon: , element: , }, { @@ -76,7 +74,7 @@ const tabs: TabItem[] = [ { label: 'حریم خصوصی', value: 'access', - icon: , + icon: , element: , }, { diff --git a/src/layouts/setting/tabs/about-us/about-us.tsx b/src/layouts/setting/tabs/about-us/about-us.tsx index 8bfbf413..26f08810 100644 --- a/src/layouts/setting/tabs/about-us/about-us.tsx +++ b/src/layouts/setting/tabs/about-us/about-us.tsx @@ -1,7 +1,7 @@ -import { FaExternalLinkAlt, FaGlobe, FaHeart, FaTelegramPlane } from 'react-icons/fa' import { SectionPanel } from '@/components/section-panel' import { ConfigKey } from '../../../../common/constant/config.key' import { RiArticleLine } from 'react-icons/ri' +import { Icon } from '@/src/icons' export function AboutUsTab() { return ( @@ -38,7 +38,7 @@ export function AboutUsTab() { >
    - +

    @@ -49,7 +49,8 @@ export function AboutUsTab() {

    - @@ -74,7 +75,8 @@ export function AboutUsTab() {

    - @@ -88,7 +90,7 @@ export function AboutUsTab() { >
    - +

    @@ -99,7 +101,8 @@ export function AboutUsTab() {

    - @@ -135,7 +138,8 @@ export function AboutUsTab() {

    - @@ -149,9 +153,7 @@ export function AboutUsTab() { 'flex items-center justify-center mt-8 space-x-1 space-x-reverse text-sm text-content opacity-75' } > - ساخته شده با - - در ایران + ساخته شده با💙در ایران
    diff --git a/src/layouts/setting/tabs/account/auth-form/auth-otp.tsx b/src/layouts/setting/tabs/account/auth-form/auth-otp.tsx index 3db9055a..ce86d294 100644 --- a/src/layouts/setting/tabs/account/auth-form/auth-otp.tsx +++ b/src/layouts/setting/tabs/account/auth-form/auth-otp.tsx @@ -1,5 +1,4 @@ import { useState } from 'react' -import { FiKey, FiArrowRight, FiRefreshCw } from 'react-icons/fi' import { TextInput } from '@/components/text-input' import { Button } from '@/components/button/button' import { @@ -14,8 +13,7 @@ import InputTextError from './components/input-text-error' import OtpInput from './components/otp-input' import { callEvent } from '@/common/utils/call-event' import { sleep } from '@/common/utils/timeout' -import { MdDoorSliding } from 'react-icons/md' -import { TiWarningOutline } from 'react-icons/ti' +import { Icon } from '@/src/icons' type AuthOtpProps = { step: 'enter-email' | 'enter-otp' @@ -136,7 +134,7 @@ const AuthOtp: React.FC = ({ step, setStep }) => {
    - +

    @@ -150,7 +148,7 @@ const AuthOtp: React.FC = ({ step, setStep }) => { {authStatus?.content && (
    - + {authStatus.content}
    )} @@ -204,7 +202,7 @@ const AuthOtp: React.FC = ({ step, setStep }) => { aria-hidden="true" className="flex items-center justify-center rounded-lg shrink-0 w-9 h-9 md:w-10 md:h-10 md:rounded-xl bg-primary/10" > - +

    @@ -245,7 +243,10 @@ const AuthOtp: React.FC = ({ step, setStep }) => { ارسال دوباره کد؟ - + {/* TODO: add timer component for resending */}

    diff --git a/src/layouts/setting/tabs/account/auth-form/components/login-otp-button.tsx b/src/layouts/setting/tabs/account/auth-form/components/login-otp-button.tsx index eba2c872..a5690c5b 100644 --- a/src/layouts/setting/tabs/account/auth-form/components/login-otp-button.tsx +++ b/src/layouts/setting/tabs/account/auth-form/components/login-otp-button.tsx @@ -1,5 +1,5 @@ import Analytics from '@/analytics' -import { FiMail } from 'react-icons/fi' +import { Icon } from '@/src/icons' type LoginOtpButtonProps = { setShowPasswordForm: (show: boolean) => void @@ -17,7 +17,10 @@ const LoginOtpButton: React.FC = ({ setShowPasswordForm }) onClick={handleShowOtpForm} className="group px-4 md:px-8 py-2.5 md:py-3 rounded-2xl text-sm md:text-base font-medium shadow-md hover:shadow-lg w-full flex items-center justify-center border-2 border-content bg-content hover:bg-base-200 transition-all duration-200 gap-1.5 md:gap-2 cursor-pointer active:scale-95 group" > - + ورود با کد موقت diff --git a/src/layouts/setting/tabs/account/auth-form/components/login-password.button.tsx b/src/layouts/setting/tabs/account/auth-form/components/login-password.button.tsx index a1069588..1d61b23c 100644 --- a/src/layouts/setting/tabs/account/auth-form/components/login-password.button.tsx +++ b/src/layouts/setting/tabs/account/auth-form/components/login-password.button.tsx @@ -1,5 +1,5 @@ import Analytics from '@/analytics' -import { FiLock } from 'react-icons/fi' +import { Icon } from '@/src/icons' type LoginPasswordButtonProps = { setShowPasswordForm: (show: boolean) => void @@ -19,7 +19,10 @@ const LoginPasswordButton: React.FC = ({ onClick={handleShowPasswordForm} className="group px-4 md:px-8 py-2.5 md:py-3 rounded-2xl text-sm md:text-base font-medium shadow-md hover:shadow-lg w-full flex items-center justify-center border-2 border-content bg-content hover:bg-base-200 transition-all duration-200 gap-1.5 md:gap-2 cursor-pointer active:scale-95 group" > - + ورود با رمز عبور diff --git a/src/layouts/setting/tabs/account/components/account-verification-status.tsx b/src/layouts/setting/tabs/account/components/account-verification-status.tsx index 46119bf1..0cbda4ab 100644 --- a/src/layouts/setting/tabs/account/components/account-verification-status.tsx +++ b/src/layouts/setting/tabs/account/components/account-verification-status.tsx @@ -1,6 +1,6 @@ -import { FiMail } from 'react-icons/fi' import { Button } from '@/components/button/button' import { SectionPanel } from '@/components/section-panel' +import { Icon } from '@/src/icons' interface AccountVerificationStatusProps { sendVerificationMutation: { @@ -17,7 +17,7 @@ export const AccountVerificationStatus = ({
    - +

    ⚠️ حساب شما تایید نشده است diff --git a/src/layouts/setting/tabs/account/components/interests-selector.tsx b/src/layouts/setting/tabs/account/components/interests-selector.tsx index c2e9d7ce..95279b37 100644 --- a/src/layouts/setting/tabs/account/components/interests-selector.tsx +++ b/src/layouts/setting/tabs/account/components/interests-selector.tsx @@ -2,7 +2,7 @@ import { useState, useRef } from 'react' import { ClickableTooltip } from '@/components/clickableTooltip' import type { ProfileMetaItem } from '@/services/hooks/profile/getProfileMeta.hook' import { Button } from '@/components/button/button' -import { FiCheck } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface InterestsSelectorProps { interests: ProfileMetaItem[] @@ -73,7 +73,7 @@ export const InterestsSelector = ({ size="sm" className={`flex-1 rounded-2xl bg-primary hover:bg-primary/90 text-white`} > - + تایید{' '} - -

    +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-city.tsx b/src/layouts/setting/tabs/account/components/modals/edit-city.tsx index f2919db9..2205b587 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-city.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-city.tsx @@ -1,6 +1,6 @@ -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { SelectCity } from '../../../general/components/select-city' +import { FooterButtons } from './footer-buttons' interface Prop { show: boolean @@ -32,25 +32,11 @@ export function ChangeCityModal({ show, onClose }: Prop) {
    -
    - - -
    +

    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-gender.tsx b/src/layouts/setting/tabs/account/components/modals/edit-gender.tsx index 837f2abd..0e3c1c19 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-gender.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-gender.tsx @@ -1,8 +1,8 @@ -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { SectionPanel } from '@/components/section-panel' import { useUpdateUserProfile } from '@/services/hooks/auth/authService.hook' import { useState } from 'react' +import { FooterButtons } from './footer-buttons' const options = { MALE: { @@ -83,26 +83,11 @@ export function ChangeGenderModal({ show, onClose, currentValue }: Prop) {
    -
    - - -
    +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-interests.tsx b/src/layouts/setting/tabs/account/components/modals/edit-interests.tsx index cef3a592..24e795ee 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-interests.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-interests.tsx @@ -1,10 +1,10 @@ -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { useUpdateUserProfile } from '@/services/hooks/auth/authService.hook' import { useEffect, useState } from 'react' import { InterestsSelector } from '../interests-selector' import { useGetInterests } from '@/services/hooks/profile/getProfileMeta.hook' import { SectionPanel } from '@/components/section-panel' +import { FooterButtons } from './footer-buttons' interface Prop { show: boolean @@ -76,26 +76,11 @@ export function ChangeInterestsModal({ show, onClose, currentValue }: Prop) { /> -
    - - -
    +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-name.tsx b/src/layouts/setting/tabs/account/components/modals/edit-name.tsx index 4d135407..efc7750c 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-name.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-name.tsx @@ -1,9 +1,9 @@ -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { SectionPanel } from '@/components/section-panel' import { TextInput } from '@/components/text-input' import { useUpdateUserProfile } from '@/services/hooks/auth/authService.hook' import { useState } from 'react' +import { FooterButtons } from './footer-buttons' interface Prop { show: boolean @@ -48,26 +48,11 @@ export function ChangeNameModal({ show, onClose, currentValue }: Prop) { /> -
    - - -
    +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-occupation.tsx b/src/layouts/setting/tabs/account/components/modals/edit-occupation.tsx index 75924989..656bf0c4 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-occupation.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-occupation.tsx @@ -1,11 +1,11 @@ -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { useUpdateUserProfile } from '@/services/hooks/auth/authService.hook' import { useState } from 'react' import { OccupationSelector } from '../occupation-selector' import { useGetOccupations } from '@/services/hooks/profile/getProfileMeta.hook' -import { LuBriefcase, LuChevronRight } from 'react-icons/lu' import { SectionPanel } from '@/components/section-panel' +import { Icon } from '@/src/icons' +import { FooterButtons } from './footer-buttons' interface Prop { show: boolean @@ -53,7 +53,11 @@ export function ChangeOccupationModal({ show, onClose, currentValue }: Prop) { triggerElement={
    - + @@ -64,31 +68,21 @@ export function ChangeOccupationModal({ show, onClose, currentValue }: Prop) { : 'انتخاب شغل'}
    - +
    } /> -
    - - -
    + +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit-username.tsx b/src/layouts/setting/tabs/account/components/modals/edit-username.tsx index 6f10f708..3a2cd2d7 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit-username.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit-username.tsx @@ -1,5 +1,4 @@ import { showToast } from '@/common/toast' -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { SectionPanel } from '@/components/section-panel' import { TextInput } from '@/components/text-input' @@ -9,6 +8,7 @@ import type { UserProfile } from '@/services/hooks/user/userService.hook' import { translateError } from '@/utils/translate-error' import type { AxiosError } from 'axios' import { useState } from 'react' +import { FooterButtons } from './footer-buttons' interface Prop { show: boolean @@ -66,26 +66,11 @@ export function ChangeUsernameModal({ show, onClose, currentValue }: Prop) { /> -
    - - -
    +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/edit.avatar.tsx b/src/layouts/setting/tabs/account/components/modals/edit.avatar.tsx index 00c18baa..a8e44ffc 100644 --- a/src/layouts/setting/tabs/account/components/modals/edit.avatar.tsx +++ b/src/layouts/setting/tabs/account/components/modals/edit.avatar.tsx @@ -1,13 +1,13 @@ import Analytics from '@/analytics' import { showToast } from '@/common/toast' import { AvatarComponent } from '@/components/avatar.component' -import { Button } from '@/components/button/button' import Modal from '@/components/modal' import { SectionPanel } from '@/components/section-panel' import { useAuth } from '@/context/auth.context' import { useUpdateUserProfile } from '@/services/hooks/auth/authService.hook' import { useRef, useState } from 'react' -import { TbCameraPlus } from 'react-icons/tb' +import { FooterButtons } from './footer-buttons' +import { Icon } from '@/src/icons' interface Prop { show: boolean @@ -66,7 +66,7 @@ export function EditAvatarModal({ show, onClose }: Prop) { className="transition-all cursor-pointer ring-4 ring-primary/5" /> ) : ( - + )}
    @@ -78,27 +78,12 @@ export function EditAvatarModal({ show, onClose }: Prop) { className="hidden" /> -
    - - -
    + +
    ) diff --git a/src/layouts/setting/tabs/account/components/modals/footer-buttons.tsx b/src/layouts/setting/tabs/account/components/modals/footer-buttons.tsx new file mode 100644 index 00000000..3b3ca329 --- /dev/null +++ b/src/layouts/setting/tabs/account/components/modals/footer-buttons.tsx @@ -0,0 +1,31 @@ +import { Button } from '@/components/button/button' + +interface Prop { + handleConfirm: any + handleCancel: any + isPending: boolean +} +export function FooterButtons({ handleCancel, handleConfirm, isPending }: Prop) { + return ( +
    + + +
    + ) +} diff --git a/src/layouts/setting/tabs/account/components/occupation-selector.tsx b/src/layouts/setting/tabs/account/components/occupation-selector.tsx index 8a9cb70e..ac8d8d3a 100644 --- a/src/layouts/setting/tabs/account/components/occupation-selector.tsx +++ b/src/layouts/setting/tabs/account/components/occupation-selector.tsx @@ -2,7 +2,7 @@ import { useState, useRef } from 'react' import { ClickableTooltip } from '@/components/clickableTooltip' import type { ProfileMetaItem } from '@/services/hooks/profile/getProfileMeta.hook' import { Button } from '@/components/button/button' -import { FiCheck } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface OccupationSelectorProps { occupations: ProfileMetaItem[] @@ -70,7 +70,7 @@ export const OccupationSelector = ({ size="sm" className={`flex-1 rounded-2xl bg-primary hover:bg-primary/90 text-white`} > - + تایید{' '}
    @@ -158,7 +157,7 @@ export default function JalaliDatePicker({ size="sm" className={`flex-1 rounded-2xl bg-primary hover:bg-primary/90 text-white`} > - + تایید{' '} - - ) -} diff --git a/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx b/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx index f258aa32..f22ac680 100644 --- a/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx +++ b/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx @@ -1,9 +1,8 @@ -import { BiLinkExternal } from 'react-icons/bi' -import { FaExternalLinkAlt } from 'react-icons/fa' -import { FiBookmark, FiCheck, FiStar, FiTarget, FiUser, FiUserPlus } from 'react-icons/fi' import { ConfigKey } from '@/common/constant/config.key' import { SectionPanel } from '@/components/section-panel' import type { Task } from '@/services/hooks/user/referralsService.hook' +import { Icon } from '@/src/icons' +import { FiTarget } from 'react-icons/fi' interface Prop { tasks: Task[] @@ -11,15 +10,7 @@ interface Prop { } const getTaskIcon = (iconName: string) => { - const iconMap: Record = { - 'user-plus': FiUserPlus, - user: FiUser, - bookmark: FiBookmark, - star: FiStar, - target: FiTarget, - } - - return iconMap[iconName] || FiTarget + return FiTarget } export function RewardTasks({ tasks, isLoading }: Prop) { @@ -54,7 +45,10 @@ export function RewardTasks({ tasks, isLoading }: Prop) { > {taskItem.isDone ? (
    - +
    ) : ( @@ -80,7 +74,10 @@ export function RewardTasks({ tasks, isLoading }: Prop) { rel="noopener noreferrer" className="inline-flex items-center px-3 py-1 text-xs font-medium transition-all duration-200 rounded-lg bg-primary/10 text-primary hover:bg-primary/20" > - + {taskItem.button.label} )} @@ -117,7 +114,7 @@ export function RewardTasks({ tasks, isLoading }: Prop) { ) : (
    - +

    diff --git a/src/layouts/setting/tabs/account/tabs/rewards/rewardsTab.tsx b/src/layouts/setting/tabs/account/tabs/rewards/rewardsTab.tsx index f73c9040..8c37102f 100644 --- a/src/layouts/setting/tabs/account/tabs/rewards/rewardsTab.tsx +++ b/src/layouts/setting/tabs/account/tabs/rewards/rewardsTab.tsx @@ -1,4 +1,3 @@ -import { FiInfo } from 'react-icons/fi' import { ConfigKey } from '@/common/constant/config.key' import { SectionPanel } from '@/components/section-panel' import { useGetReferrals } from '@/services/hooks/user/referralsService.hook' @@ -6,6 +5,7 @@ import { ReferralCodeSection } from './components/ReferralCodeSection' import { RewardTasks } from './components/tasks' import { RequireVerification } from '@/components/auth/require-verification' import { useAuth } from '@/context/auth.context' +import { Icon } from '@/src/icons' export const RewardsTab = () => { const { user } = useAuth() @@ -36,7 +36,10 @@ export const RewardsTab = () => { >

    - +

    ویج‌کوین، سکه ویژه ویجتیفای است که می‌توانید آن را diff --git a/src/layouts/setting/tabs/account/tabs/user-profile/connections/components/platform-data.tsx b/src/layouts/setting/tabs/account/tabs/user-profile/connections/components/platform-data.tsx index 36f0b86e..6f10c2f6 100644 --- a/src/layouts/setting/tabs/account/tabs/user-profile/connections/components/platform-data.tsx +++ b/src/layouts/setting/tabs/account/tabs/user-profile/connections/components/platform-data.tsx @@ -1,4 +1,3 @@ -import { FaGithub } from 'react-icons/fa' import type { Platform } from './platform-config' import GoogleCalendar from '@/assets/google-calendar.png' @@ -23,14 +22,4 @@ export const PLATFORM_CONFIGS: Omit[] = [ permissions: ['مشاهده تقویم (سرویس گوگل کلندر)'], isOptionalPermissions: true, }, - { - id: 'github', - name: 'گیت‌هاب', - description: 'اتصال به گیت‌هاب برای مشاهده مخازن، کامیت‌ها و فعالیت‌های پروژه', - bgColor: 'bg-gray-800', - isActive: false, - icon: , - features: [], - permissions: [], - }, ] diff --git a/src/layouts/setting/tabs/appearance/components/browserTitle-selector.tsx b/src/layouts/setting/tabs/appearance/components/browserTitle-selector.tsx index aa2b7916..95832dbc 100644 --- a/src/layouts/setting/tabs/appearance/components/browserTitle-selector.tsx +++ b/src/layouts/setting/tabs/appearance/components/browserTitle-selector.tsx @@ -1,6 +1,5 @@ import type { AxiosError } from 'axios' import { useEffect, useState } from 'react' -import { FiShoppingBag } from 'react-icons/fi' import Analytics from '@/analytics' import { getFromStorage, setToStorage } from '@/common/storage' import { callEvent } from '@/common/utils/call-event' @@ -12,6 +11,7 @@ import { useChangeBrowserTitle } from '@/services/hooks/extension/updateSetting. import type { UserInventoryItem } from '@/services/hooks/market/market.interface' import { translateError } from '@/utils/translate-error' import { showToast } from '@/common/toast' +import { Icon } from '@/src/icons' interface BrowserTitle { id: string @@ -116,7 +116,7 @@ export function BrowserTitleSelector({ fetched_browserTitles, isAuthenticated }: className="flex items-center justify-center w-full h-20 text-xs border border-content border-muted gap-0.5 text-muted hover:!text-primary cursor-pointer hover:!border-primary transition-all duration-200 rounded-xl" onClick={() => handleMoreClick()} > - + فروشگاه

    diff --git a/src/layouts/setting/tabs/appearance/components/font-selector.tsx b/src/layouts/setting/tabs/appearance/components/font-selector.tsx index 60e05590..f5e0bc1b 100644 --- a/src/layouts/setting/tabs/appearance/components/font-selector.tsx +++ b/src/layouts/setting/tabs/appearance/components/font-selector.tsx @@ -1,11 +1,11 @@ import { useEffect, useState } from 'react' -import { FiShoppingBag } from 'react-icons/fi' import Analytics from '@/analytics' import { callEvent } from '@/common/utils/call-event' import { ItemSelector } from '@/components/item-selector' import { SectionPanel } from '@/components/section-panel' import { useAppearanceSetting } from '@/context/appearance.context' import type { UserInventoryItem } from '@/services/hooks/market/market.interface' +import { Icon } from '@/src/icons' interface FontItem { label: string @@ -88,7 +88,7 @@ export function FontSelector({ fetched_fonts }: FontSelectorProps) { className="flex items-center justify-center w-full h-20 text-xs border border-content border-muted gap-0.5 text-muted hover:!text-primary cursor-pointer hover:!border-primary transition-all duration-200 rounded-xl" onClick={() => handleMoreClick()} > - + فروشگاه
    diff --git a/src/layouts/setting/tabs/appearance/components/theme-selector.tsx b/src/layouts/setting/tabs/appearance/components/theme-selector.tsx index 91ce2aa7..dde4cedb 100644 --- a/src/layouts/setting/tabs/appearance/components/theme-selector.tsx +++ b/src/layouts/setting/tabs/appearance/components/theme-selector.tsx @@ -1,19 +1,16 @@ import type React from 'react' import { useEffect, useState } from 'react' -import { FiShoppingBag } from 'react-icons/fi' -import { IoMdMoon, IoMdStar, IoMdSunny } from 'react-icons/io' -import { MdOutlineBlurOn } from 'react-icons/md' import Analytics from '@/analytics' import { callEvent } from '@/common/utils/call-event' import { ItemSelector } from '@/components/item-selector' import { SectionPanel } from '@/components/section-panel' import { useTheme } from '@/context/theme.context' import type { UserInventoryItem } from '@/services/hooks/market/market.interface' +import { Icon } from '@/src/icons' interface ThemeItem { id: string name: string - icon: React.ReactElement description?: string } @@ -21,31 +18,26 @@ const defaultThemes: ThemeItem[] = [ { id: 'light', name: 'روشن', - icon: , description: 'تم کلاسیک روشن', }, { id: 'dark', name: 'تیره', - icon: , description: 'تم کلاسیک تیره', }, { id: 'glass', name: 'شیشه‌ای', - icon: , description: 'تم شفاف با افکت شیشه‌ای', }, { id: 'icy', name: 'یخی', - icon: , description: 'تم سفید شفاف با حالت یخی', }, { id: 'zarna', name: 'زرنا', - icon: , description: 'تم زرنا با رنگ‌های گرم', }, ] @@ -77,7 +69,6 @@ export function ThemeSelector({ fetched_themes }: Props) { const mapped: ThemeItem[] = fetched_themes.map((item) => ({ id: item.value, name: item.name ?? 'بدون نام', - icon: , description: item?.description || 'تم خریداری شده', })) setThemes([...defaultThemes, ...mapped]) @@ -104,10 +95,10 @@ export function ThemeSelector({ fetched_themes }: Props) { /> ))}
    handleMoreClick()} > - + فروشگاه
    diff --git a/src/layouts/setting/tabs/general/components/select-city.tsx b/src/layouts/setting/tabs/general/components/select-city.tsx index b5be64aa..cddea537 100644 --- a/src/layouts/setting/tabs/general/components/select-city.tsx +++ b/src/layouts/setting/tabs/general/components/select-city.tsx @@ -1,5 +1,4 @@ import { useState, useMemo } from 'react' -import { CiLocationOn } from 'react-icons/ci' import Analytics from '@/analytics' import { IconLoading } from '@/components/loading/icon-loading' import Modal from '@/components/modal' @@ -11,6 +10,7 @@ import { useSetCity } from '@/services/hooks/user/userService.hook' import { TextInput } from '@/components/text-input' import { showToast } from '@/common/toast' import { translateError } from '@/utils/translate-error' +import { Icon } from '@/src/icons' interface SelectedCity { city: string @@ -98,7 +98,7 @@ export function SelectCity({ size }: Prop) { {isSettingCity ? ( ) : ( - + )} @@ -139,7 +139,10 @@ export function SelectCity({ size }: Prop) { ref={searchInputRef} onChange={(value) => setSearchTerm(value)} /> - +
    @@ -155,7 +158,10 @@ export function SelectCity({ size }: Prop) { onClick={() => handleSelectCity(city)} className="flex items-center w-full p-3 text-right transition-all duration-200 border-b cursor-pointer border-base-200/30 last:border-b-0 group rounded-2xl hover:bg-primary/20 hover:text-primary" > - + {city.city} diff --git a/src/layouts/setting/tabs/wallpapers/tab/gallery/components/category/category-folder.component.tsx b/src/layouts/setting/tabs/wallpapers/tab/gallery/components/category/category-folder.component.tsx index abc2fefa..86a6744b 100644 --- a/src/layouts/setting/tabs/wallpapers/tab/gallery/components/category/category-folder.component.tsx +++ b/src/layouts/setting/tabs/wallpapers/tab/gallery/components/category/category-folder.component.tsx @@ -1,4 +1,4 @@ -import { FiFolder } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface CategoryFolderProps { id: string @@ -19,7 +19,7 @@ export function CategoryFolder({ className="flex flex-col h-32 px-2 py-1 transition-all border cursor-pointer rounded-2xl bg-content border-content max-h-32 hover:border-primary/20! active:scale-98" >
    - +

    {name}

    @@ -42,7 +42,7 @@ export function CategoryFolder({
    ) : (
    - +

    بدون تصویر

    )} diff --git a/src/layouts/setting/tabs/wallpapers/tab/gallery/components/wallpaper-item/wallpaper-item.tsx b/src/layouts/setting/tabs/wallpapers/tab/gallery/components/wallpaper-item/wallpaper-item.tsx index 49082f7a..2565d929 100644 --- a/src/layouts/setting/tabs/wallpapers/tab/gallery/components/wallpaper-item/wallpaper-item.tsx +++ b/src/layouts/setting/tabs/wallpapers/tab/gallery/components/wallpaper-item/wallpaper-item.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from 'react' -import { FiCheck, FiEye, FiHeart, FiPlay, FiShoppingBag } from 'react-icons/fi' +import { FiHeart, FiPlay } from 'react-icons/fi' import type { Wallpaper } from '@/common/wallpaper.interface' import { UserCoin } from '@/layouts/setting/tabs/account/components/user-coin' import { CoinPurchaseModal } from '@/layouts/setting/tabs/wallpapers/components/coin-purchase-modal' @@ -7,6 +7,7 @@ import { useLazyLoad } from '../../../../hooks/use-lazy-load' import { LuLayers, LuLayoutTemplate } from 'react-icons/lu' import Tooltip from '@/components/toolTip' import { HoverPlayVideo } from '../hover-play-video' +import { Icon } from '@/src/icons' interface WallpaperItemProps { wallpaper: Wallpaper @@ -177,13 +178,13 @@ function WallpaperItemFu({ {isSelected && (
    - +
    )} {!isSelected && wallpaper.isOwned && (
    - + باز شده
    )} @@ -205,7 +206,7 @@ function WallpaperItemFu({ }} className="absolute bottom-1.5 right-1.5 flex items-center gap-1 px-2 py-1 rounded-lg bg-black/60 border border-white/10 text-white/80 hover:text-white transition-colors text-[10px] font-medium backdrop-blur-sm cursor-pointer opacity-0 group-hover:opacity-100" > - + پیش‌نمایش )} diff --git a/src/layouts/simplify/tools-simplify.tsx b/src/layouts/simplify/tools-simplify.tsx index 39b20b48..c52a4672 100644 --- a/src/layouts/simplify/tools-simplify.tsx +++ b/src/layouts/simplify/tools-simplify.tsx @@ -6,7 +6,7 @@ import { HiOutlineDocumentText, HiOutlineNewspaper, } from 'react-icons/hi2' -import { MdOutlineCalendarMonth, MdOutlineNetworkWifi, MdPets } from 'react-icons/md' +import { MdOutlineCalendarMonth, MdOutlineNetworkWifi } from 'react-icons/md' import { HiOutlineCurrencyBangladeshi } from 'react-icons/hi' import React, { useState, Suspense } from 'react' import { DateProvider } from '@/context/date.context' diff --git a/src/layouts/simplify/widgets/calendar-simplify.tsx b/src/layouts/simplify/widgets/calendar-simplify.tsx index 8f3354bf..24efe925 100644 --- a/src/layouts/simplify/widgets/calendar-simplify.tsx +++ b/src/layouts/simplify/widgets/calendar-simplify.tsx @@ -3,7 +3,7 @@ import { CalendarGrid } from '../../widgets/calendar/components/calendar-grid' import { useDate } from '@/context/date.context' import Analytics from '@/analytics' import { GoogleCalendarView } from '@/layouts/widgets/calendar/components/google-calendar/google-calendar-view' -import { BiCalendar, BiLogoGoogle } from 'react-icons/bi' +import { Icon } from '@/src/icons' export function SimplifyCalendar() { const { currentDate, selectedDate, setCurrentDate, setSelectedDate, goToToday } = @@ -68,7 +68,7 @@ const CalendarTabSelector: React.FC = ({ : 'text-base-content/60 hover:text-base-content' }`} > - + تقویم @@ -81,7 +81,7 @@ const CalendarTabSelector: React.FC = ({ : 'text-base-content/60 hover:text-base-content' }`} > - + گوگل‌کلندر
    diff --git a/src/layouts/simplify/widgets/news-simplify.tsx b/src/layouts/simplify/widgets/news-simplify.tsx index 0bd9921f..57b219c0 100644 --- a/src/layouts/simplify/widgets/news-simplify.tsx +++ b/src/layouts/simplify/widgets/news-simplify.tsx @@ -2,7 +2,7 @@ import { callEvent } from '@/common/utils/call-event' import { Button } from '@/components/button/button' import { WidgetTabKeys } from '@/layouts/widgets-settings/constant/tab-keys' import { NewsLayout } from '@/layouts/widgets/news/news.layout' -import { FaGear } from 'react-icons/fa6' +import { Icon } from '@/src/icons' export function NewsSimplify() { const onClick = () => { @@ -18,7 +18,7 @@ export function NewsSimplify() { size="xs" className="absolute left-0 flex items-center justify-center w-6 h-6 p-0 rounded-full" > - +
    diff --git a/src/layouts/widgetify-card/daily-mood.tsx b/src/layouts/widgetify-card/daily-mood.tsx index 64cf2227..e92a2b7e 100644 --- a/src/layouts/widgetify-card/daily-mood.tsx +++ b/src/layouts/widgetify-card/daily-mood.tsx @@ -9,10 +9,9 @@ import { type MoodType, useUpsertMoodLog, } from '@/services/hooks/moodLog/upsert-moodLog.hook' -import { translateError } from '@/utils/translate-error' +import { Icon } from '@/src/icons' import { useIsMutating, useQueryClient } from '@tanstack/react-query' import type { AxiosError } from 'axios' -import { HiXMark } from 'react-icons/hi2' export function DailyMoodNotification() { const queryClient = useQueryClient() @@ -90,7 +89,7 @@ export function DailyMoodNotification() { onRemoveNotif() }} > - +
    diff --git a/src/layouts/widgetify-card/notification-center/components/notification-item.tsx b/src/layouts/widgetify-card/notification-center/components/notification-item.tsx index e406b080..59439936 100644 --- a/src/layouts/widgetify-card/notification-center/components/notification-item.tsx +++ b/src/layouts/widgetify-card/notification-center/components/notification-item.tsx @@ -1,8 +1,8 @@ import { callEvent } from '@/common/utils/call-event' -import { HiChevronDown, HiXMark } from 'react-icons/hi2' import { useState } from 'react' import Analytics from '@/analytics' import type { NotificationItem } from '@/services/hooks/extension/getNotifications.hook' +import { Icon } from '@/src/icons' interface NotificationItemProps { onClose(e: any, id: string): any @@ -145,7 +145,8 @@ export function NotificationCardItem(prop: NotificationItemProps) { className="mt-1 flex items-center gap-1 border border-base-content/4 rounded-xl px-1 hover:border-base-content/10 text-[10px] font-light text-muted hover:underline cursor-pointer" > {isExpanded ? 'نمایش کمتر' : 'مشاهده بیشتر'} - @@ -173,7 +174,7 @@ export function NotificationCardItem(prop: NotificationItemProps) { prop?.onClose(e, id) }} > - + )} diff --git a/src/layouts/widgetify-card/profile-progress.tsx b/src/layouts/widgetify-card/profile-progress.tsx index a216ad3b..f9d690e2 100644 --- a/src/layouts/widgetify-card/profile-progress.tsx +++ b/src/layouts/widgetify-card/profile-progress.tsx @@ -1,7 +1,7 @@ import Analytics from '@/analytics' import { callEvent } from '@/common/utils/call-event' import { useAuth } from '@/context/auth.context' -import { HiXMark } from 'react-icons/hi2' +import { Icon } from '@/src/icons' export function ProfileProgressNotification() { const { profilePercentage } = useAuth() @@ -37,7 +37,7 @@ export function ProfileProgressNotification() { onRemoveNotif() }} > - +
    diff --git a/src/layouts/widgets-settings/widget-settings-modal.tsx b/src/layouts/widgets-settings/widget-settings-modal.tsx index ab6cecff..3dae09b3 100644 --- a/src/layouts/widgets-settings/widget-settings-modal.tsx +++ b/src/layouts/widgets-settings/widget-settings-modal.tsx @@ -1,12 +1,10 @@ -import type { JSX } from 'react' import { MdPets } from 'react-icons/md' import { TbApps, TbCalendarUser, TbCurrencyDollar, TbNews } from 'react-icons/tb' -import { TiWeatherCloudy } from 'react-icons/ti' import { VscSettings } from 'react-icons/vsc' import Analytics from '@/analytics' import { callEvent } from '@/common/utils/call-event' import Modal from '@/components/modal' -import { TabItem, TabManager } from '@/components/tab-manager' +import { type TabItem, TabManager } from '@/components/tab-manager' import { PetSettings } from '../widgetify-card/pets/setting/pet-setting' import { RssFeedSetting } from '../widgets/news/rss-feed-setting' import { WeatherSetting } from '../widgets/weather/weather-setting' @@ -14,6 +12,7 @@ import { WigiArzSetting } from '../widgets/wigiArz/wigiArz-setting' import { WigiPadSetting } from '../widgets/wigiPad/wigiPad-setting' import { WidgetTabKeys } from './constant/tab-keys' import { ManageWidgets } from './manage-widgets/manage-widgets' +import { Icon } from '@/src/icons' interface WidgetSettingsModalProps { isOpen: boolean @@ -52,7 +51,7 @@ const tabs: TabItem[] = [ label: 'ویجت آب و هوا', element: , value: WidgetTabKeys.weather_settings, - icon: , + icon: , }, { label: 'حیوان خانگی', diff --git a/src/layouts/widgets/calendar/calendar.tsx b/src/layouts/widgets/calendar/calendar.tsx index b9e39e43..bd022497 100644 --- a/src/layouts/widgets/calendar/calendar.tsx +++ b/src/layouts/widgets/calendar/calendar.tsx @@ -5,7 +5,7 @@ import { CalendarGrid } from './components/calendar-grid' import { CalendarHeader } from './components/calendar-header' import { GoogleCalendarView } from './components/google-calendar/google-calendar-view' import Analytics from '@/analytics' -import { BiCalendar, BiLogoGoogle } from 'react-icons/bi' +import { Icon } from '@/src/icons' interface CalendarTabSelectorProps { activeTab: string @@ -27,7 +27,7 @@ const CalendarTabSelector: React.FC = ({ : 'text-base-content/60 hover:text-base-content' }`} > - + تقویم @@ -40,7 +40,7 @@ const CalendarTabSelector: React.FC = ({ : 'text-base-content/60 hover:text-base-content' }`} > - + گوگل‌کلندر
    diff --git a/src/layouts/widgets/calendar/components/calendar-header.tsx b/src/layouts/widgets/calendar/components/calendar-header.tsx index bd71c757..ad59401e 100644 --- a/src/layouts/widgets/calendar/components/calendar-header.tsx +++ b/src/layouts/widgets/calendar/components/calendar-header.tsx @@ -1,8 +1,7 @@ import { useGeneralSetting } from '@/context/general-setting.context' import type React from 'react' -import { FaChevronLeft, FaChevronRight } from 'react-icons/fa6' -import { TfiBackRight } from 'react-icons/tfi' import { type WidgetifyDate, getCurrentDate } from '../utils' +import { Icon } from '@/src/icons' interface CalendarHeaderProps { currentDate: WidgetifyDate @@ -56,7 +55,7 @@ export const CalendarHeader: React.FC = ({ 'h-7 w-7 flex items-center justify-center rounded-full cursor-pointer transition-colors text-muted opacity-70 text-muted hover:bg-base-300 duration-300 hover:opacity-100 animate-in fade-in-0 zoom-in-95' } > - + )} @@ -66,7 +65,7 @@ export const CalendarHeader: React.FC = ({ 'h-7 w-7 flex items-center justify-center rounded-full cursor-pointer transition-colors text-muted opacity-70 hover:bg-base-300 hover:opacity-100 duration-300' } > - +
    diff --git a/src/layouts/widgets/habit/components/habit-calendar-heatmap.tsx b/src/layouts/widgets/habit/components/habit-calendar-heatmap.tsx index ab139e2b..0a87580e 100644 --- a/src/layouts/widgets/habit/components/habit-calendar-heatmap.tsx +++ b/src/layouts/widgets/habit/components/habit-calendar-heatmap.tsx @@ -1,6 +1,4 @@ import { useState } from 'react' -import { FaChevronLeft, FaChevronRight } from 'react-icons/fa6' -import { TfiBackRight } from 'react-icons/tfi' import jalaliMoment from 'jalali-moment' import moment from 'moment' import { HabitComparison, type Habit } from '@/services/hooks/habit/habit.interface' @@ -10,6 +8,7 @@ import { autoFormatErrorToast, showToast } from '@/common/toast' import { HABIT_UNIT_STEP } from '@/common/constant/habit-options' import { useQueryClient } from '@tanstack/react-query' import { IconLoading } from '@/components/loading/icon-loading' +import { Icon } from '@/src/icons' interface HabitCalendarProps { habit: Habit @@ -236,20 +235,20 @@ export function HabitCalendar({ habit, color }: HabitCalendarProps) { onClick={goToToday} className="flex items-center justify-center transition-colors duration-300 rounded-full cursor-pointer h-7 w-7 text-muted opacity-70 hover:bg-base-300 hover:opacity-100" > - + )}
    diff --git a/src/layouts/widgets/habit/components/habit-detail.modal.tsx b/src/layouts/widgets/habit/components/habit-detail.modal.tsx index ca1a741d..6bd9e05f 100644 --- a/src/layouts/widgets/habit/components/habit-detail.modal.tsx +++ b/src/layouts/widgets/habit/components/habit-detail.modal.tsx @@ -7,7 +7,7 @@ import { Button } from '@/components/button/button' import { Dropdown } from '@/components/dropdown' import type { Habit } from '@/services/hooks/habit/habit.interface' import { callEvent } from '@/common/utils/call-event' -import { GoArchive, GoKebabHorizontal, GoPencil } from 'react-icons/go' +import { Icon } from '@/src/icons' interface ModalProps { isOpen: boolean @@ -76,7 +76,11 @@ export function HabitDetailModal({ size="xs" className="text-xs border-none py-1! rounded-xl" > - + } dropdownClassName="p-2" @@ -85,7 +89,7 @@ export function HabitDetailModal({ className={`w-full px-3 py-1 flex items-center gap-x-2.25 cursor-pointer rounded-lg transition-colors duration-200 text-content hover:text-content/90 hover:bg-base-300/70! `} onClick={onClickEdit} > - + ویرایش @@ -93,7 +97,7 @@ export function HabitDetailModal({ className={`w-full px-3 py-1 flex items-center gap-x-2.5 cursor-pointer rounded-lg transition-colors duration-200 text-error hover:text-error/90 hover:bg-error/10!`} onClick={onClickArchive} > - + بایگانی diff --git a/src/layouts/widgets/habit/components/habit-form.modal.tsx b/src/layouts/widgets/habit/components/habit-form.modal.tsx index 6ad0dc65..0bcf9ad4 100644 --- a/src/layouts/widgets/habit/components/habit-form.modal.tsx +++ b/src/layouts/widgets/habit/components/habit-form.modal.tsx @@ -24,9 +24,9 @@ import { import { useUpdateHabit } from '@/services/hooks/habit/update-habit.hook' import { translateError } from '@/utils/translate-error' import Tooltip from '@/components/toolTip' -import { BiChevronDown, BiInfoCircle } from 'react-icons/bi' import type { HabitIcon } from '@/services/hooks/habit/get-habits.hook' import { AnimatePresence, motion } from 'framer-motion' +import { Icon } from '@/src/icons' interface HabitFormModalProps { isOpen: boolean @@ -195,7 +195,7 @@ export function HabitFormModal({ animate={{ rotate: showAdvanced ? 180 : 0 }} transition={{ duration: 0.2 }} > - + @@ -216,8 +216,8 @@ export function HabitFormModal({ واحد اندازه‌گیری - @@ -240,8 +240,8 @@ export function HabitFormModal({ نحوه رسیدن به هدف - @@ -281,8 +281,8 @@ export function HabitFormModal({ مقدار هدف - @@ -306,8 +306,8 @@ export function HabitFormModal({ تکرار برنامه - @@ -335,8 +335,8 @@ export function HabitFormModal({ - diff --git a/src/layouts/widgets/habit/components/item/habit.item.tsx b/src/layouts/widgets/habit/components/item/habit.item.tsx index a92940de..b9a7f88c 100644 --- a/src/layouts/widgets/habit/components/item/habit.item.tsx +++ b/src/layouts/widgets/habit/components/item/habit.item.tsx @@ -1,4 +1,3 @@ -import { FiCheck, FiPlus } from 'react-icons/fi' import Analytics from '@/analytics' import { getContrastingTextColor } from '@/common/color' import { HABIT_UNIT_STEP } from '@/common/constant/habit-options' @@ -12,6 +11,7 @@ import { translateError } from '@/utils/translate-error' import { formatHabitGoal } from '../../utils' import { SegmentedProgressRing } from './button.progress-ring' import { SimpleProgressRing } from './button.simple-progress-ring' +import { Icon } from '@/src/icons' interface HabitItemProps { habit: Habit @@ -109,11 +109,11 @@ export function HabitItem({ habit, today, onChanged, onViewDetails }: HabitItemP
    {habit.today.isDone ? ( - + ) : isSimpleHabit ? ( - + ) : ( - + )}
    diff --git a/src/layouts/widgets/habit/habits.layout.tsx b/src/layouts/widgets/habit/habits.layout.tsx index 42866c57..138332c4 100644 --- a/src/layouts/widgets/habit/habits.layout.tsx +++ b/src/layouts/widgets/habit/habits.layout.tsx @@ -1,5 +1,4 @@ import { useState } from 'react' -import { MdRefresh } from 'react-icons/md' import Analytics from '@/analytics' import { autoFormatErrorToast, showToast } from '@/common/toast' import { Button } from '@/components/button/button' @@ -16,9 +15,9 @@ import { WidgetContainer } from '../widget-container' import { HabitDetailModal } from './components/habit-detail.modal' import { HabitFormModal } from './components/habit-form.modal' import { HabitItem } from './components/item/habit.item' -import { BiPlus } from 'react-icons/bi' import { callEvent } from '@/common/utils/call-event' import { HabitItemSkeleton } from './components/item/habit-item.skeleton' +import { Icon } from '@/src/icons' export function HabitsContent() { const { isAuthenticated } = useAuth() @@ -110,7 +109,8 @@ export function HabitsContent() { onClick={onRefresh} disabled={isWaiting} > - - + افزودن diff --git a/src/layouts/widgets/network/network.layout.tsx b/src/layouts/widgets/network/network.layout.tsx index ec267d18..d836311c 100644 --- a/src/layouts/widgets/network/network.layout.tsx +++ b/src/layouts/widgets/network/network.layout.tsx @@ -1,6 +1,5 @@ import type { AxiosError } from 'axios' import { useEffect, useState } from 'react' -import { MdRefresh } from 'react-icons/md' import Analytics from '@/analytics' import { RequireAuth } from '@/components/auth/require-auth' import { AvatarComponent } from '@/components/avatar.component' @@ -10,8 +9,8 @@ import { useAuth } from '@/context/auth.context' import { useGeneralSetting } from '@/context/general-setting.context' import { getMainClient, safeAwait } from '@/services/api' import { WidgetContainer } from '../widget-container' -import { NetworkIPCard, NetworkLoadingSkeleton, NetworkPingCard } from './components' -import { IoRefreshOutline } from 'react-icons/io5' +import { NetworkIPCard, NetworkPingCard } from './components' +import { Icon } from '@/src/icons' interface NetworkInfo { status: 'online' | 'offline' @@ -129,7 +128,8 @@ export function NetworkLayout({ enableBackground, inComboWidget }: Prop) { size="xs" className="h-6 w-6 p-0 flex items-center justify-center rounded-full !border-none !shadow-none" > - @@ -198,7 +198,8 @@ export function NetworkLayout({ enableBackground, inComboWidget }: Prop) { className="w-full h-8 border border-content rounded-2xl" onClick={handleRefresh} > - diff --git a/src/layouts/widgets/news/components/news-header.tsx b/src/layouts/widgets/news/components/news-header.tsx index 1ad63973..a7ff646c 100644 --- a/src/layouts/widgets/news/components/news-header.tsx +++ b/src/layouts/widgets/news/components/news-header.tsx @@ -1,5 +1,6 @@ -import { FaGear, FaRss } from 'react-icons/fa6' +import { FaRss } from 'react-icons/fa6' import { Button } from '@/components/button/button' +import { Icon } from '@/src/icons' interface NewsHeaderProps { title: string @@ -22,7 +23,8 @@ export const NewsHeader = ({ title, onSettingsClick }: NewsHeaderProps) => { size="xs" className="h-6 w-6 p-0 flex items-center justify-center rounded-full !border-none !shadow-none" > - diff --git a/src/layouts/widgets/notes/components/note-item.tsx b/src/layouts/widgets/notes/components/note-item.tsx index f704208f..016b085b 100644 --- a/src/layouts/widgets/notes/components/note-item.tsx +++ b/src/layouts/widgets/notes/components/note-item.tsx @@ -1,10 +1,9 @@ -import { useState } from 'react' // اضافه شد +import { useState } from 'react' import { PRIORITY_OPTIONS } from '@/common/constant/priority_options' import type { FetchedNote } from '@/services/hooks/note/note.interface' import moment from 'jalali-moment' -import { FiCalendar } from 'react-icons/fi' -import { HiChevronDown } from 'react-icons/hi2' // آیکون برای dropdown import Analytics from '@/analytics' +import { Icon } from '@/src/icons' interface Prop { note: FetchedNote @@ -38,7 +37,7 @@ export function NoteItem({ note, handleNoteClick }: Prop) {
    - + {moment(note.createdAt).locale('fa').format('jD jMMM')} @@ -60,7 +59,8 @@ export function NoteItem({ note, handleNoteClick }: Prop) { onClick={toggleExpand} className="flex items-center gap-1 mt-1 text-xs font-medium cursor-pointer text-muted hover:bg-base-300 p-0.5 rounded-full" > - setShowDeleteConfirm(true)} className="h-7 w-7 p-0 text-muted !bg-transparent hover:!bg-error/20 hover:!text-error border-none rounded-full disabled:opacity-75 transition-all duration-300 shadow-none" > - + @@ -86,7 +85,7 @@ export function NoteNavigation() { className={`h-7 w-7 flex items-center justify-center rounded-full cursor-pointer transition-colors text-muted opacity-70 hover:bg-base-300 hover:opacity-100 ${activeNoteIndex > 0 ? 'opacity-100' : 'opacity-30 cursor-not-allowed'} duration-300`} onClick={() => onBackToList()} > - + @@ -101,7 +100,7 @@ export function NoteNavigation() { className={`h-6 w-fit px-2! text-xs font-medium hover:scale-95 rounded-xl`} isPrimary={true} > - + چیزی بنویس
    @@ -111,7 +110,8 @@ export function NoteNavigation() { className={`px-2 py-0! border-none! rounded-xl text-base-content/40 shrink-0 active:scale-95 h-7!`} onClick={onRefresh} > - diff --git a/src/layouts/widgets/todos/components/select-friends.todo.tsx b/src/layouts/widgets/todos/components/select-friends.todo.tsx index e5ea9ff8..b31de2ad 100644 --- a/src/layouts/widgets/todos/components/select-friends.todo.tsx +++ b/src/layouts/widgets/todos/components/select-friends.todo.tsx @@ -3,7 +3,7 @@ import { Button } from '@/components/button/button' import { Dropdown } from '@/components/dropdown' import { SelectFriendLayout } from '@/layouts/friends/components/select-friend.layout' import type { Friend } from '@/services/hooks/friends/friendService.hook' -import { FiUserPlus } from 'react-icons/fi' +import { Icon } from '@/src/icons' interface Prop { selectedFriends: Friend[] @@ -25,7 +25,11 @@ export function TodoSelectFriends({ selectedFriends, setSelectedFriends }: Prop)
    ) : (
    - + دوستان
    )} diff --git a/src/layouts/widgets/todos/expandable-todo-input.tsx b/src/layouts/widgets/todos/expandable-todo-input.tsx index a323d9e0..5c8a34e6 100644 --- a/src/layouts/widgets/todos/expandable-todo-input.tsx +++ b/src/layouts/widgets/todos/expandable-todo-input.tsx @@ -13,9 +13,8 @@ import { useDate } from '@/context/date.context' import { IoCalendarOutline, IoPricetagOutline, IoAddOutline } from 'react-icons/io5' import { DatePicker } from '@/components/date-picker/date-picker' import { PriorityDropdown } from './components/priority.dropdown' -import { FiPlus, FiSave } from 'react-icons/fi' +import { FiSave } from 'react-icons/fi' import type { FetchedTodo, TodoPriority } from '@/services/hooks/todo/todo.interface' -import { LuX } from 'react-icons/lu' import { type TodoCreationPayload, useAddTodo } from '@/services/hooks/todo/add-todo.hook' import { useUpdateTodo } from '@/services/hooks/todo/update-todo.hook' import { translateError } from '@/utils/translate-error' @@ -24,6 +23,7 @@ import type { Friend } from '@/services/hooks/friends/friendService.hook' import { TodoSelectFriends } from './components/select-friends.todo' import { callEvent } from '@/common/utils/call-event' import { twMerge } from 'tailwind-merge' +import { Icon } from '@/src/icons' interface ExpandableTodoInputProps { editTodo?: FetchedTodo onClose: any @@ -260,7 +260,7 @@ export function ExpandableTodoInput({ size="sm" className="rounded-full px-0! w-8 btn-ghost" > - + )}
    diff --git a/src/layouts/widgets/tools/religious/religious-time.tsx b/src/layouts/widgets/tools/religious/religious-time.tsx index c5338cce..71319a0e 100644 --- a/src/layouts/widgets/tools/religious/religious-time.tsx +++ b/src/layouts/widgets/tools/religious/religious-time.tsx @@ -2,11 +2,8 @@ import { useEffect } from 'react' import { FiClock, FiMoon, FiSun, FiSunrise, FiSunset } from 'react-icons/fi' import { useReligiousTime } from '@/services/hooks/date/getReligiousTime.hook' import { useAuth } from '@/context/auth.context' -import { Button } from '@/components/button/button' -import { callEvent } from '@/common/utils/call-event' -import Analytics from '@/analytics' -const DAILY_ZIKRS = [ +const DAILY_LIST = [ { day: 'شنبه', zikr: 'یا رَبَّ الْعَالَمِینَ', meaning: 'ای پروردگار جهانیان' }, { day: 'یک‌شنبه', @@ -54,7 +51,7 @@ export function ReligiousTime({ currentDate }: { currentDate: any }) { } }, [user?.city?.id, isAuthenticated, refetch]) - const dailyZikr = DAILY_ZIKRS.find((item) => item.day === weekDay) + const dailyZikr = DAILY_LIST.find((item) => item.day === weekDay) const prayerTimeBoxes = [ { title: 'اذان صبح', value: religiousTimeData?.azan_sobh, icon: FiClock }, diff --git a/src/layouts/widgets/tools/translate/components/platform-modal.tsx b/src/layouts/widgets/tools/translate/components/platform-modal.tsx deleted file mode 100644 index 2d1131fa..00000000 --- a/src/layouts/widgets/tools/translate/components/platform-modal.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { FiInfo } from 'react-icons/fi' -import Analytics from '@/analytics' -import { Button } from '@/components/button/button' -import Modal from '@/components/modal' - -interface PlatformModalProps { - isOpen: boolean - onClose: () => void - platform: { - name: string - link: string - } -} - -export function PlatformModal({ isOpen, onClose, platform }: PlatformModalProps) { - const handleOpenLink = () => { - window.open(platform.link, '_blank', 'noopener,noreferrer') - } - - useEffect(() => { - if (isOpen) { - Analytics.event('open_translate_platform_modal') - } - }, [isOpen]) - - return ( - -
    -
    -
    -
    - -
    -
    -
    - -

    حریم خصوصی ترجمه

    - -
    -

    - ویجتیفای هیچگونه نقشی در ترجمه ندارد. ترجمه توسط{' '} - {' '} - انجام می‌شود. -

    -

    - داده‌های شما (فقط متن ورودی) مستقیماً به سرویس ترجمه ارسال می‌شود و - ویجتیفای دسترسی به آن ندارد. -

    -
    - -
    - -
    -
    -
    - ) -} diff --git a/src/layouts/widgets/tools/translate/components/translation-input.tsx b/src/layouts/widgets/tools/translate/components/translation-input.tsx deleted file mode 100644 index 0d9f7cd3..00000000 --- a/src/layouts/widgets/tools/translate/components/translation-input.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { TbVolume } from 'react-icons/tb' -import { Button } from '@/components/button/button' -import Tooltip from '@/components/toolTip' -import { speakTextInLanguage } from '../shared' - -interface TranslationInputProp { - inputText: string - fromLanguage: string - onChangeInputText: (e: React.ChangeEvent) => void -} -export function TranslationInput({ - inputText, - fromLanguage, - onChangeInputText, -}: TranslationInputProp) { - return ( -
    -