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..3660d8e7 --- /dev/null +++ b/src/icons/packs/default.tsx @@ -0,0 +1,252 @@ +import { + FiAtSign, + FiBell, + FiClock, + FiCoffee, + FiGift, + FiInbox, + FiKey, + FiLoader, + FiLock, + FiLogOut, + FiMail, + FiMaximize, + FiMinimize, + FiPhone, + FiPlay, + FiRefreshCw, + FiRotateCcw, + FiSave, + FiSettings, + FiShoppingBag, + FiShoppingCart, + FiTarget, + FiTrash2, + FiUser, + FiUserCheck, + FiUsers, + FiUserX, +} from 'react-icons/fi' +import type { IconMap } from '../types' +import { TfiAlert, TfiBackRight, TfiCheck, TfiCup } from 'react-icons/tfi' +import { + LuBriefcase, + LuCalendarDays, + LuChevronDown, + LuChevronLeft, + LuChevronRight, + LuChevronUp, + LuDownload, + LuHeart, + LuHistory, + LuLayers, + LuLayoutTemplate, + LuPen, + LuPlus, + LuX, +} from 'react-icons/lu' +import { + FaCoins, + FaCrown, + FaExternalLinkAlt, + FaGithub, + FaGlobe, + FaGlobeAsia, + FaImage, + FaMoon, + FaPaintBrush, + FaSortAmountDown, + FaSpinner, + FaTelegramPlane, + FaUpload, +} from 'react-icons/fa' +import { + TbCloudOff, + TbUsersPlus, + TbBookmarkPlus, + TbCameraPlus, + TbWind, + TbEdit, + TbArrowsUpDown, + TbCalendarUser, + TbApps, + TbNotebook, + TbArrowsRightLeft, +} from 'react-icons/tb' +import { + MdDragIndicator, + MdFolderSpecial, + MdLink, + MdMic, + MdOutlineFilterList, + MdOutlineFilterListOff, + MdOutlineNetworkWifi, + MdOutlinePrivacyTip, + MdOutlineVerifiedUser, + MdOutlineWallpaper, + MdPets, + MdSearch, +} from 'react-icons/md' +import { + HiHome, + HiOutlineBookmark, + HiOutlineCurrencyBangladeshi, + HiOutlineEye, + HiOutlineEyeSlash, + HiOutlineFire, + HiOutlineFolder, + HiOutlineGlobeAlt, + HiOutlineHome, + HiOutlineInbox, + HiOutlineInformationCircle, + HiOutlineNewspaper, + HiOutlineShoppingBag, + HiOutlineSquares2X2, + HiOutlineUserGroup, + HiOutlineVideoCamera, + HiSquares2X2, +} from 'react-icons/hi2' +import { FaFolder, FaFolderOpen } from 'react-icons/fa' +import { GoArchive, GoKebabHorizontal, GoTasklist } from 'react-icons/go' +import { IoMdAddCircle, IoMdHelp } from 'react-icons/io' +import { FaArrowDownLong, FaArrowUpLong, FaPhotoFilm, FaTreeCity } from 'react-icons/fa6' +import { BiCalendar, BiLogoGoogle, BiRss } from 'react-icons/bi' +import { FcGoogle } from 'react-icons/fc' +import { CiLocationOn, CiPause1 } from 'react-icons/ci' +import { WiCloudy, WiHumidity } from 'react-icons/wi' +import { RiApps2AiLine, RiQuillPenAiLine } from 'react-icons/ri' +import { AiOutlineDrag } from 'react-icons/ai' +import { HiOutlineViewGridAdd } from 'react-icons/hi' +import { BsFilterLeft, BsGenderAmbiguous } from 'react-icons/bs' +import { IoPricetagOutline } from 'react-icons/io5' +import { VscColorMode, VscMegaphone, VscRecordKeys } from 'react-icons/vsc' + +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, + gender: BsGenderAmbiguous, + phone: FiPhone, + atSign: FiAtSign, + outlineHeart: LuHeart, + outlineAddCircle: IoMdAddCircle, + treeCity: FaTreeCity, + edit: TbEdit, + target: FiTarget, + logOut: FiLogOut, + play: FiPlay, + globeAsia: FaGlobeAsia, + moon: FaMoon, + outlineNewspaper: HiOutlineNewspaper, + currency: HiOutlineCurrencyBangladeshi, + rss: BiRss, + tags: IoPricetagOutline, + save: FiSave, + sortDown: FaSortAmountDown, + outlineFilterListOff: MdOutlineFilterListOff, + outlineFilterList: MdOutlineFilterList, + crown: FaCrown, + filterLeft: BsFilterLeft, + upDown: TbArrowsUpDown, + coffee: FiCoffee, + refresh: FiRefreshCw, + cup: TfiCup, + pause: CiPause1, + dragIndicator: MdDragIndicator, + upLong: FaArrowUpLong, + downLong: FaArrowDownLong, + pets: MdPets, + wigiPad: TbCalendarUser, + appsPlus: TbApps, + taskList: GoTasklist, + strike: HiOutlineFire, + notebook: TbNotebook, + gift: FiGift, + platforms: RiApps2AiLine, + wallpapers: MdOutlineWallpaper, + lastUpdate: VscMegaphone, + shortcuts: VscRecordKeys, + theme: VscColorMode, + network: MdOutlineNetworkWifi, + videoCamera: HiOutlineVideoCamera, + advanced_ui: LuLayers, + simple_ui: LuLayoutTemplate, + arrowRightLeft: TbArrowsRightLeft, +} satisfies IconMap diff --git a/src/icons/types.ts b/src/icons/types.ts new file mode 100644 index 00000000..2d2a34cf --- /dev/null +++ b/src/icons/types.ts @@ -0,0 +1,132 @@ +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' + | 'gender' + | 'phone' + | 'atSign' + | 'outlineHeart' + | 'outlineAddCircle' + | 'treeCity' + | 'edit' + | 'target' + | 'logOut' + | 'play' + | 'globeAsia' + | 'moon' + | 'outlineNewspaper' + | 'currency' + | 'rss' + | 'tags' + | 'save' + | 'sortDown' + | 'outlineFilterList' + | 'outlineFilterListOff' + | 'crown' + | 'filterLeft' + | 'upDown' + | 'coffee' + | 'refresh' + | 'cup' + | 'pause' + | 'dragIndicator' + | 'upLong' + | 'downLong' + | 'pets' + | 'wigiPad' + | 'appsPlus' + | 'taskList' + | 'strike' + | 'notebook' + | 'gift' + | 'platforms' + | 'wallpapers' + | 'lastUpdate' + | 'shortcuts' + | 'theme' + | 'network' + | 'videoCamera' + | 'advanced_ui' + | 'simple_ui' + | 'arrowRightLeft' +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..9b4ef2e5 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..4ab82590 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 { addOpacityToColor, getContrastingTextColor } 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 @@ -51,11 +51,16 @@ export function BookmarkItem({ e.stopPropagation() onMenuClick(e) }} + style={{ + color: bookmark.customBackground + ? getContrastingTextColor(bookmark.customBackground) + : undefined, + }} className={ '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) => (
  • - + @@ -189,12 +193,12 @@ export function AdvancedModal({ title, onClose, isOpen, bookmark }: AdvancedModa -
    +
    @@ -204,8 +208,13 @@ export function AdvancedModal({ title, onClose, isOpen, bookmark }: AdvancedModa onChange={setTextColor} />
    -
    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..f4831413 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..6950ca10 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/navbar/profile/profile.tsx b/src/layouts/navbar/profile/profile.tsx index cec8bc31..66206e7d 100644 --- a/src/layouts/navbar/profile/profile.tsx +++ b/src/layouts/navbar/profile/profile.tsx @@ -1,11 +1,11 @@ import { useState, useEffect } from 'react' -import { LuCircleUser } from 'react-icons/lu' import { listenEvent } from '@/common/utils/call-event' import { AvatarComponent } from '@/components/avatar.component' import Tooltip from '@/components/toolTip' import { useAuth } from '@/context/auth.context' import { UserAccountModal } from '../../setting/tabs/account/user-account.modal' import { WelcomeWizard } from '@/components/welcome-wizard' +import { Icon } from '@/src/icons' const renderUserAvatar = (user: any) => { if (user?.avatar) { @@ -69,7 +69,7 @@ export function ProfileNav() { id="profile-and-friends-list" onClick={() => handleProfileClick()} > - +
    ) : ( 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..64c2b0e5 100644 --- a/src/layouts/setting/setting-modal.tsx +++ b/src/layouts/setting/setting-modal.tsx @@ -1,13 +1,3 @@ -import { MdApps, MdOutlinePrivacyTip } from 'react-icons/md' -import { TbApps } from 'react-icons/tb' -import { - VscColorMode, - VscInfo, - VscMegaphone, - VscPaintcan, - VscRecordKeys, - VscSettingsGear, -} from 'react-icons/vsc' import Analytics from '@/analytics' import { callEvent } from '@/common/utils/call-event' import Modal from '@/components/modal' @@ -19,13 +9,10 @@ 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,25 +27,25 @@ const tabs: TabItem[] = [ { label: 'پروفایل من', value: 'profile', - icon: , + icon: , element: , }, { label: 'پلتفرم‌ها', value: 'platforms', - icon: , + icon: , element: , }, { label: 'ماموریت‌ها و پاداش', value: 'tasks', - icon: , + icon: , element: , }, { label: 'دوستان', value: 'friends', - icon: , + icon: , element: , }, ], @@ -69,32 +56,32 @@ const tabs: TabItem[] = [ { label: 'عمومی', value: 'general', - icon: , + icon: , element: , }, { label: 'حریم خصوصی', value: 'access', - icon: , + icon: , element: , }, { label: 'ظاهری', value: 'appearance', - icon: , + icon: , element: , }, { - label: 'تصویر زمینه ها', + label: 'تصویر زمینه‌ها', value: 'wallpapers', - icon: , + icon: , element: , }, { label: 'میانبرها', value: 'shortcuts', - icon: , + icon: , element: , }, ], @@ -105,7 +92,7 @@ const tabs: TabItem[] = [ { label: 'درباره ما', value: 'about', - icon: , + icon: , element: , }, ], @@ -148,14 +135,14 @@ export const SettingModal = ({ isOpen, onClose, selectedTab }: SettingModalProps className={`relative items-center flex gap-3 px-4 py-3 rounded-full transition-all duration-200 ease-in-out justify-start cursor-pointer whitespace-nowrap active:scale-[0.98] text-muted hover:bg-base-300 w-42`} onClick={() => openWidgetSettings()} > - + مدیریت ویجت ها
    diff --git a/src/layouts/setting/tabs/about-us/about-us.tsx b/src/layouts/setting/tabs/about-us/about-us.tsx index 8bfbf413..64f2c905 100644 --- a/src/layouts/setting/tabs/about-us/about-us.tsx +++ b/src/layouts/setting/tabs/about-us/about-us.tsx @@ -1,7 +1,6 @@ -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 +37,7 @@ export function AboutUsTab() { >
    - +

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

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

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

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

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

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

    - @@ -149,9 +152,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..636e8793 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..5cf3e8c3 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 = ({
    - +

    ⚠️ حساب شما تایید نشده است @@ -40,7 +40,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`} > - + تایید{' '} {showEditBadge('avatar') && ( @@ -120,7 +115,7 @@ export const ProfileDisplay = () => {
    } + icon={} label="نام و نام خانوادگی" value={user?.name} editable @@ -130,7 +125,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="نام کاربری (یوزرنیم)" value={user?.username} editable @@ -141,7 +136,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="ایمیل" value={user?.email} isLtr @@ -152,7 +147,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="شماره موبایل" value={ user?.phone ? ( @@ -164,7 +159,7 @@ export const ProfileDisplay = () => { onClick={() => clickToShow()} >
    - + افزودن شماره موبایل
    @@ -177,7 +172,7 @@ export const ProfileDisplay = () => { - +
    } label="جنسیت" @@ -190,7 +185,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="تاریخ تولد" value={formatJalaliDate(user?.birthDate)} showBadge={showEditBadge('birthDate')} @@ -201,7 +196,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="شغل" value={user?.occupation?.label} showBadge={showEditBadge('occupation')} @@ -212,7 +207,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="علایق" editable value={ @@ -236,7 +231,7 @@ export const ProfileDisplay = () => { /> } + icon={} label="شهر" value={user?.city?.name || '-'} showBadge={showEditBadge('city')} @@ -321,7 +316,7 @@ const DisplayRow = ({ className="absolute p-1 -translate-y-1/2 cursor-pointer text-muted -right-4 top-1/2 active:scale-95" onClick={onClickEdit} > - +
    )}
    diff --git a/src/layouts/setting/tabs/account/components/remove-button.tsx b/src/layouts/setting/tabs/account/components/remove-button.tsx deleted file mode 100644 index 7eaffbdb..00000000 --- a/src/layouts/setting/tabs/account/components/remove-button.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Tooltip from '@/components/toolTip' -import type { Friend } from '@/services/hooks/friends/friendService.hook' -import { FiUserX } from 'react-icons/fi' - -type Props = { - type: 'REMOVE' | 'REJECT' - friend: Friend - onClick: (friendId: string) => void - disabled?: boolean -} -export function RemoveFriendButton({ type, friend, onClick, disabled }: Props) { - return ( - - - - ) -} diff --git a/src/layouts/setting/tabs/account/tabs/connection/connectionsTab.tsx b/src/layouts/setting/tabs/account/tabs/connection/connectionsTab.tsx index 87c62b2c..d87cddeb 100644 --- a/src/layouts/setting/tabs/account/tabs/connection/connectionsTab.tsx +++ b/src/layouts/setting/tabs/account/tabs/connection/connectionsTab.tsx @@ -1,6 +1,6 @@ -import { FiInfo } from 'react-icons/fi' import { SectionPanel } from '@/components/section-panel' import { Connections } from '../user-profile/connections/connections' +import { Icon } from '@/src/icons' export const ConnectionPlatformsTab = () => { return ( @@ -9,7 +9,7 @@ export const ConnectionPlatformsTab = () => {
    - +

    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..c1514ef5 100644 --- a/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx +++ b/src/layouts/setting/tabs/account/tabs/rewards/components/tasks.tsx @@ -1,27 +1,13 @@ -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' interface Prop { tasks: Task[] isLoading: boolean } -const getTaskIcon = (iconName: string) => { - const iconMap: Record = { - 'user-plus': FiUserPlus, - user: FiUser, - bookmark: FiBookmark, - star: FiStar, - target: FiTarget, - } - - return iconMap[iconName] || FiTarget -} - export function RewardTasks({ tasks, isLoading }: Prop) { return ( @@ -33,7 +19,6 @@ export function RewardTasks({ tasks, isLoading }: Prop) {

    ) : tasks.length > 0 ? ( tasks.map((taskItem, index) => { - const IconComponent = getTaskIcon(taskItem.icon) return (
    {taskItem.isDone ? (
    - +
    ) : ( - + )}
    @@ -80,7 +71,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 +111,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/account/tabs/user-profile/user-profile.tsx b/src/layouts/setting/tabs/account/tabs/user-profile/user-profile.tsx index 2f1b2640..ff9607bf 100644 --- a/src/layouts/setting/tabs/account/tabs/user-profile/user-profile.tsx +++ b/src/layouts/setting/tabs/account/tabs/user-profile/user-profile.tsx @@ -1,5 +1,4 @@ import { useEffect } from 'react' -import { FiLogOut } from 'react-icons/fi' import { Button } from '@/components/button/button' import { SectionPanel } from '@/components/section-panel' import { useAuth } from '@/context/auth.context' @@ -14,6 +13,7 @@ import { ReferralCodeSection } from '../rewards/components/ReferralCodeSection' import { showToast } from '@/common/toast' import { translateError } from '@/utils/translate-error' import { ConfirmationModal } from '@/components/modal/confirmation-modal' +import { Icon } from '@/src/icons' export const UserProfile = () => { const { logout } = useAuth() @@ -74,7 +74,7 @@ export const UserProfile = () => { className="text-white/90 btn-error" size="md" > - + خروج از حساب کاربری

    @@ -108,7 +108,7 @@ export const UserProfile = () => { className="text-white/90 btn-error rounded-2xl" size="md" > - + خروج از حساب کاربری {' '}
    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/appearance/components/ui-selector.tsx b/src/layouts/setting/tabs/appearance/components/ui-selector.tsx index 0df31271..e701eeeb 100644 --- a/src/layouts/setting/tabs/appearance/components/ui-selector.tsx +++ b/src/layouts/setting/tabs/appearance/components/ui-selector.tsx @@ -1,7 +1,7 @@ import { ItemSelector } from '@/components/item-selector' import { SectionPanel } from '@/components/section-panel' -import { LuLayers, LuLayoutTemplate } from 'react-icons/lu' import { useAppearanceSetting } from '@/context/appearance.context' +import { Icon } from '@/src/icons' export function UISelector() { const { setUI, ui } = useAppearanceSetting() @@ -34,7 +34,11 @@ export function UISelector() { onClick={() => onClick('ADVANCED')} label={
    - + پیشفرض
    } @@ -45,7 +49,11 @@ export function UISelector() { onClick={() => onClick('SIMPLE')} label={
    - + ساده و خلوت
    } 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/components/upload-area.component.tsx b/src/layouts/setting/tabs/wallpapers/components/upload-area.component.tsx index 51d33088..0ddf24d9 100644 --- a/src/layouts/setting/tabs/wallpapers/components/upload-area.component.tsx +++ b/src/layouts/setting/tabs/wallpapers/components/upload-area.component.tsx @@ -1,9 +1,9 @@ import { useRef } from 'react' -import { FiEdit, FiUploadCloud } from 'react-icons/fi' import type { Wallpaper } from '@/common/wallpaper.interface' import { Button } from '@/components/button/button' import { useWallpaperUpload } from '../hooks/use-wallpaper-upload' import { MediaPreview } from './media-preview.component' +import { Icon } from '@/src/icons' interface UploadAreaProps { customWallpaper: Wallpaper | null @@ -39,7 +39,7 @@ export function UploadArea({ customWallpaper, onWallpaperChange }: UploadAreaPro className="flex items-center justify-center w-full gap-2 p-4 cursor-pointer" onClick={handleFileSelect} > - +

    برای آپلود از سیستم کلیک کنید

    @@ -80,7 +80,7 @@ export function UploadArea({ customWallpaper, onWallpaperChange }: UploadAreaPro
    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..c342a326 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,12 +1,11 @@ import React, { useEffect, useRef, useState } from 'react' -import { FiCheck, FiEye, FiHeart, FiPlay, FiShoppingBag } 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' 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 @@ -96,7 +95,7 @@ function WallpaperItemFu({ )} {error && (
    - +

    خطا در بارگذاری

    )} @@ -164,12 +163,17 @@ function WallpaperItemFu({ } > {wallpaper.extensionUI === 'SIMPLE' ? ( - ) : ( - + )}
    @@ -177,20 +181,20 @@ function WallpaperItemFu({ {isSelected && (
    - +
    )} {!isSelected && wallpaper.isOwned && (
    - + باز شده
    )} {isAnimated && (
    - + متحرک
    )} @@ -205,7 +209,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..a6e71e4d 100644 --- a/src/layouts/simplify/tools-simplify.tsx +++ b/src/layouts/simplify/tools-simplify.tsx @@ -1,17 +1,11 @@ import Analytics from '@/analytics' import { WidgetContainer } from '../widgets/widget-container' import { TabNavigation } from '@/components/tab-navigation' -import { - HiOutlineCheckCircle, - HiOutlineDocumentText, - HiOutlineNewspaper, -} from 'react-icons/hi2' -import { MdOutlineCalendarMonth, MdOutlineNetworkWifi, MdPets } from 'react-icons/md' -import { HiOutlineCurrencyBangladeshi } from 'react-icons/hi' import React, { useState, Suspense } from 'react' import { DateProvider } from '@/context/date.context' import { getFromStorage, setToStorage } from '@/common/storage' import { TodosLayout } from '../widgets/todos/todos' +import { Icon } from '@/src/icons' const Calendar = React.lazy(() => import('./widgets/calendar-simplify').then((module) => ({ @@ -47,38 +41,38 @@ const tabs = [ { id: 'todos', label: 'تسک ها', - icon: , + icon: , element: TodosLayout, }, { id: 'notes', label: 'یادداشت', - icon: , + icon: , element: NotesLayout, }, { id: 'calendar', label: 'تقویم', - icon: , + icon: , element: Calendar, }, { id: 'currency', label: 'ارزها', - icon: , + icon: , element: ArzSimplify, }, { id: 'news', label: 'اخبار', - icon: , + icon: , element: NewsSimplify, }, { id: 'network', label: 'شبکه', - icon: , + icon: , element: NetworkSimplify, }, ] 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 e3ddab49..b8586c0e 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..833e13a7 100644 --- a/src/layouts/widgets-settings/widget-settings-modal.tsx +++ b/src/layouts/widgets-settings/widget-settings-modal.tsx @@ -1,12 +1,7 @@ -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 +9,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 @@ -28,36 +24,36 @@ const tabs: TabItem[] = [ label: 'مدیریت ویجت ها', element: , value: WidgetTabKeys.widget_management, - icon: , + icon: , }, { label: 'ویجی پد', element: , value: WidgetTabKeys.wigiPad, - icon: , + icon: , }, { label: 'ویجی ارز', element: , value: WidgetTabKeys.wigiArz, - icon: , + icon: , }, { label: 'ویجی نیوز', element: , value: WidgetTabKeys.news_settings, - icon: , + icon: , }, { label: 'ویجت آب و هوا', element: , value: WidgetTabKeys.weather_settings, - icon: , + icon: , }, { label: 'حیوان خانگی', value: WidgetTabKeys.Pet, - icon: , + icon: , element: , }, ], @@ -96,7 +92,7 @@ export function WidgetSettingsModal({ onClickSettings() }} > - + تنظیمات 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/calendar/components/day/toolTipContent.tsx b/src/layouts/widgets/calendar/components/day/toolTipContent.tsx index 1df0618a..931e6a76 100644 --- a/src/layouts/widgets/calendar/components/day/toolTipContent.tsx +++ b/src/layouts/widgets/calendar/components/day/toolTipContent.tsx @@ -1,5 +1,3 @@ -import { FaGlobeAsia } from 'react-icons/fa' -import { FaMoon } from 'react-icons/fa6' import { useState } from 'react' import type { FetchedAllEvents } from '@/services/hooks/date/getEvents.hook' import { @@ -22,7 +20,7 @@ import { autoFormatErrorToast, showToast } from '@/common/toast' import type { MoodEntry } from '@/services/hooks/moodLog/get-moods.hook' import Analytics from '@/analytics' import { moodOptions } from '@/common/constant/moods' -import { TbMoodHappy } from 'react-icons/tb' +import { Icon } from '@/src/icons' interface CalendarDayDetailsProps { events: FetchedAllEvents @@ -150,13 +148,13 @@ export const CalendarDayDetails: React.FC = ({
    - + {hijriDate} {hijriMonthName}
    - + {gregorian}
    @@ -164,7 +162,6 @@ export const CalendarDayDetails: React.FC = ({ {selectedDate.isBefore() && (
    - حس و حال{' '} {jalaliDay === today.format('dddd') ? 'امروز' : 'روز'} diff --git a/src/layouts/widgets/calendar/components/google-calendar/google-calendar-view.tsx b/src/layouts/widgets/calendar/components/google-calendar/google-calendar-view.tsx index a14eecff..350b4440 100644 --- a/src/layouts/widgets/calendar/components/google-calendar/google-calendar-view.tsx +++ b/src/layouts/widgets/calendar/components/google-calendar/google-calendar-view.tsx @@ -1,7 +1,6 @@ import type React from 'react' import { useState, useEffect } from 'react' import Analytics from '@/analytics' -import { HiChevronLeft, HiChevronRight, HiOutlineCalendar } from 'react-icons/hi2' import { useGetGoogleCalendarEvents } from '@/services/hooks/date/getGoogleCalendarEvents.hook' import { useDate } from '@/context/date.context' import { CalendarEvent } from './google-event.item' @@ -10,6 +9,7 @@ import { Button } from '@/components/button/button' import { callEvent } from '@/common/utils/call-event' import type { WidgetifyDate } from '../../utils' import { GoogleEventItemSkeleton } from './google-event.item-skeleton' +import { Icon } from '@/src/icons' export const GoogleCalendarView: React.FC = () => { const { user, isAuthenticated } = useAuth() @@ -86,7 +86,7 @@ export const GoogleCalendarView: React.FC = () => { return (
    - +

    {isAuthenticated @@ -125,7 +125,7 @@ export const GoogleCalendarView: React.FC = () => { onClick={() => handlePrevDay()} className="flex items-center justify-center transition-colors rounded-lg cursor-pointer w-7 h-7 hover:bg-base-200 text-base-content/40 hover:text-base-content" > - +

    @@ -162,7 +162,7 @@ export const GoogleCalendarView: React.FC = () => { {!isLoading && classified.length === 0 && (
    - +

    رویدادی وجود ندارد

    diff --git a/src/layouts/widgets/calendar/components/google-calendar/google-event.item.tsx b/src/layouts/widgets/calendar/components/google-calendar/google-event.item.tsx index 34a63586..70fbb477 100644 --- a/src/layouts/widgets/calendar/components/google-calendar/google-event.item.tsx +++ b/src/layouts/widgets/calendar/components/google-calendar/google-event.item.tsx @@ -1,5 +1,5 @@ import Tooltip from '@/components/toolTip' -import { HiOutlineMapPin, HiOutlineVideoCamera } from 'react-icons/hi2' +import { Icon } from '@/src/icons' interface CalendarEventProps { event: any @@ -58,7 +58,7 @@ export const CalendarEvent = ({ }} className="flex items-center gap-1 px-2 py-0.5 mb-1 rounded-lg bg-primary text-white text-[9px] cursor-pointer transition-all hover:brightness-110 active:scale-95 shrink-0 font-medium" > - + ورود به جلسه ) : event.location ? ( @@ -129,13 +129,15 @@ export const CalendarEvent = ({ {event.summary || 'بدون عنوان'} {event.hangoutLink && ( - )} {!event.hangoutLink && event.location && ( - diff --git a/src/layouts/widgets/comboWidget/combo-widget.layout.tsx b/src/layouts/widgets/comboWidget/combo-widget.layout.tsx index 03f512f5..4056d3f0 100644 --- a/src/layouts/widgets/comboWidget/combo-widget.layout.tsx +++ b/src/layouts/widgets/comboWidget/combo-widget.layout.tsx @@ -8,8 +8,7 @@ import { NewsLayout } from '../news/news.layout' import { WidgetContainer } from '../widget-container' import { WigiArzLayout } from '../wigiArz/wigi_arz.layout' import { TabNavigation } from '@/components/tab-navigation' -import { HiOutlineCurrencyBangladeshi, HiOutlineNewspaper } from 'react-icons/hi2' -import { CgOptions } from 'react-icons/cg' +import { Icon } from '@/src/icons' export type ComboTabType = 'news' | 'currency' @@ -58,12 +57,12 @@ export function ComboWidget() { { id: 'currency', label: 'ارزها', - icon: , + icon: , }, { id: 'news', label: 'اخبار', - icon: , + icon: , }, ]} size="small" @@ -86,7 +85,7 @@ export function ComboWidget() { onClick={handleSettingsClick} className={`px-2 py-0! border-none! rounded-lg text-base-content/40 shrink-0 active:scale-95 h-7!`} > - + ) 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..a6c14b96 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..f71f2abb 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..49dac729 100644 --- a/src/layouts/widgets/news/components/news-header.tsx +++ b/src/layouts/widgets/news/components/news-header.tsx @@ -1,5 +1,5 @@ -import { FaGear, FaRss } from 'react-icons/fa6' import { Button } from '@/components/button/button' +import { Icon } from '@/src/icons' interface NewsHeaderProps { title: string @@ -11,7 +11,7 @@ export const NewsHeader = ({ title, onSettingsClick }: NewsHeaderProps) => {
    - +

    {title}

    @@ -22,7 +22,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/news/rss-feed-setting.tsx b/src/layouts/widgets/news/rss-feed-setting.tsx index cb904562..6c975f5d 100644 --- a/src/layouts/widgets/news/rss-feed-setting.tsx +++ b/src/layouts/widgets/news/rss-feed-setting.tsx @@ -1,6 +1,4 @@ import { useState } from 'react' -import { BiRss } from 'react-icons/bi' -import { VscAdd, VscTrash } from 'react-icons/vsc' import Analytics from '@/analytics' import { getFromStorage, setToStorage } from '@/common/storage' import { callEvent } from '@/common/utils/call-event' @@ -11,6 +9,7 @@ import { TextInput } from '@/components/text-input' import { ToggleSwitch } from '@/components/toggle-switch.component' import { WidgetSettingWrapper } from '@/layouts/widgets-settings/widget-settings-wrapper' import type { WigiNewsSetting } from './rss.interface' +import { Icon } from '@/src/icons' const SUGGESTED_FEEDS = [ { @@ -224,7 +223,7 @@ export const RssFeedSetting = () => { className="text-white rounded-xl btn-primary" onClick={addNewFeed} > - + افزودن فید جدید
    @@ -282,7 +281,11 @@ const FeedsList = ({ feeds, onToggleFeed, onRemoveFeed }: FeedsListProps) => { 'flex flex-col items-center justify-center p-2 text-center border border-dashed rounded-lg border-content' } > - +

    هیچ فید RSS اضافه نشده است

    @@ -351,7 +354,7 @@ const FeedItem = ({ feed, disabled = false, onToggle, onRemove }: FeedItemProps) onClick={onRemove} disabled={disabled} > - +
    ) diff --git a/src/layouts/widgets/notes/components/note-editor.tsx b/src/layouts/widgets/notes/components/note-editor.tsx index 7360e8e6..df4076f5 100644 --- a/src/layouts/widgets/notes/components/note-editor.tsx +++ b/src/layouts/widgets/notes/components/note-editor.tsx @@ -4,8 +4,8 @@ import { IconLoading } from '@/components/loading/icon-loading' import Tooltip from '@/components/toolTip' import { useNotes } from '@/context/notes.context' import type { FetchedNote } from '@/services/hooks/note/note.interface' +import { Icon } from '@/src/icons' import { useEffect, useRef, useState } from 'react' -import { FiFlag } from 'react-icons/fi' interface NoteEditorProps { note: FetchedNote @@ -149,7 +149,7 @@ const PriorityButton = ({ ${isSelected ? 'ring-2 ring-offset-0 ring-primary' : ''} `} > - {isSelected && } + {isSelected && } ) 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/friend-item.todo.tsx b/src/layouts/widgets/todos/components/friend-item.todo.tsx index ef3e8c5a..c4a3c242 100644 --- a/src/layouts/widgets/todos/components/friend-item.todo.tsx +++ b/src/layouts/widgets/todos/components/friend-item.todo.tsx @@ -1,6 +1,6 @@ import { AvatarComponent } from '@/components/avatar.component' import Tooltip from '@/components/toolTip' -import { FaCheck, FaCrown } from 'react-icons/fa' +import { Icon } from '@/src/icons' interface UserItemProp { avatar: string @@ -28,13 +28,13 @@ export function UserItem({ avatar, completed, isOwner, name }: UserItemProp) { {completed && (
    - +
    )} {isOwner && (
    - +
    )}
    diff --git a/src/layouts/widgets/todos/components/priority.dropdown.tsx b/src/layouts/widgets/todos/components/priority.dropdown.tsx index c8cea9c7..3dd2b480 100644 --- a/src/layouts/widgets/todos/components/priority.dropdown.tsx +++ b/src/layouts/widgets/todos/components/priority.dropdown.tsx @@ -1,7 +1,7 @@ -import { BsFilterLeft } from 'react-icons/bs' import { Dropdown } from '@/components/dropdown' import { Button } from '@/components/button/button' import { TodoPriority } from '@/services/hooks/todo/todo.interface' +import { Icon } from '@/src/icons' const priorityOptions = [ { @@ -46,7 +46,7 @@ export function PriorityDropdown({ priority, setPriority }: PriorityDropdownProp : 'text-base-content/40 hover:text-primary/60' }`} > - + } dropdownClassName="p-1.5" 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..b026ce10 100644 --- a/src/layouts/widgets/todos/expandable-todo-input.tsx +++ b/src/layouts/widgets/todos/expandable-todo-input.tsx @@ -10,12 +10,9 @@ import { Chip } from '@/components/chip.component' import { useGetTags } from '@/services/hooks/todo/get-tags.hook' import { useAuth } from '@/context/auth.context' 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 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 +21,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 +258,7 @@ export function ExpandableTodoInput({ size="sm" className="rounded-full px-0! w-8 btn-ghost" > - + )} @@ -319,7 +321,7 @@ export function ExpandableTodoInput({ onClick={() => setShowDatePicker(true)} ref={dateButtonRef} > - +

    {selectedDate ? formatJalaliDateForDisplay( @@ -334,7 +336,7 @@ export function ExpandableTodoInput({ ref={categoryInputRef} onClick={() => setIsTagTooltipOpen(true)} > - +

    {category || 'دسته‌بندی'}

    @@ -363,7 +365,7 @@ export function ExpandableTodoInput({ setIsTagTooltipOpen(false) } > - +
    @@ -378,7 +380,8 @@ export function ExpandableTodoInput({ } className="flex gap-1 text-xs px-2! py-1!e" > - diff --git a/src/layouts/widgets/todos/todo.item.tsx b/src/layouts/widgets/todos/todo.item.tsx index 3c0f05a0..de42364b 100644 --- a/src/layouts/widgets/todos/todo.item.tsx +++ b/src/layouts/widgets/todos/todo.item.tsx @@ -1,6 +1,5 @@ import type React from 'react' import { useState } from 'react' -import { FiChevronDown, FiTrash2, FiEdit3, FiTag, FiUsers } from 'react-icons/fi' import CustomCheckbox from '@/components/checkbox' import type { FetchedTodo, Todo } from '@/services/hooks/todo/todo.interface' import { ConfirmationModal } from '@/components/modal/confirmation-modal' @@ -13,11 +12,11 @@ import { validate } from 'uuid' import Analytics from '@/analytics' import { IconLoading } from '@/components/loading/icon-loading' import { parseTodoDate } from './tools/parse-date' -import { IoCalendarOutline } from 'react-icons/io5' import { useUpdateTodo } from '@/services/hooks/todo/update-todo.hook' import { playAlarm } from '@/common/playAlarm' import Tooltip from '@/components/toolTip' import { TodoFriends } from './components/friends.todo' +import { Icon } from '@/src/icons' interface Prop { todo: Todo @@ -152,7 +151,7 @@ export function TodoItem({ todo, blurMode = false, onEdit, onUpdated }: Prop) { {isPending && } {hasFriends && ( - + )}
    @@ -162,14 +161,14 @@ export function TodoItem({ todo, blurMode = false, onEdit, onUpdated }: Prop) { onClick={handleEdit} className="p-1 rounded-lg cursor-pointer text-blue-500/60 hover:bg-blue-500/10 hover:text-blue-500" > - + )}
    @@ -180,7 +179,7 @@ export function TodoItem({ todo, blurMode = false, onEdit, onUpdated }: Prop) { expanded ? 'rotate-180' : '' } hover:scale-110`} > - + @@ -202,7 +201,7 @@ export function TodoItem({ todo, blurMode = false, onEdit, onUpdated }: Prop) {
    {currentTodo.category && ( - + {currentTodo.category} )} @@ -215,8 +214,8 @@ export function TodoItem({ todo, blurMode = false, onEdit, onUpdated }: Prop) { )} - - + + {parseTodoDate(currentTodo.date) .locale('fa') .format('jD jMMMM')} diff --git a/src/layouts/widgets/todos/todos.tsx b/src/layouts/widgets/todos/todos.tsx index 092da2e9..5d86a844 100644 --- a/src/layouts/widgets/todos/todos.tsx +++ b/src/layouts/widgets/todos/todos.tsx @@ -4,16 +4,15 @@ import { useAuth } from '@/context/auth.context' import Analytics from '@/analytics' import { IconLoading } from '@/components/loading/icon-loading' import { FilterTooltip } from '@/components/filter-tooltip' -import { FaSortAmountDown, FaTags } from 'react-icons/fa' import { useGetTags } from '@/services/hooks/todo/get-tags.hook' import type { Todo } from '@/services/hooks/todo/todo.interface' import { getFromStorage, setToStorage } from '@/common/storage' -import { MdOutlineFilterList, MdOutlineFilterListOff, MdRefresh } from 'react-icons/md' import { useGeneralSetting } from '@/context/general-setting.context' import { Button } from '@/components/button/button' import Tooltip from '@/components/toolTip' import { useGetTodos } from '@/services/hooks/todo/get-todos.hook' import { TodoItem } from './todo.item' +import { Icon } from '@/src/icons' const filterOptions = [ { value: 'all', label: 'همه' }, @@ -186,12 +185,14 @@ export function TodosLayout() { value={dateFilter} icon={ dateFilter !== 'all' ? ( - ) : ( - @@ -203,7 +204,8 @@ export function TodosLayout() { /> - diff --git a/src/layouts/widgets/tools/currency/currency-converter.tsx b/src/layouts/widgets/tools/currency/currency-converter.tsx index d739b469..b1477eca 100644 --- a/src/layouts/widgets/tools/currency/currency-converter.tsx +++ b/src/layouts/widgets/tools/currency/currency-converter.tsx @@ -1,11 +1,11 @@ import { motion } from 'framer-motion' import type React from 'react' import { useEffect, useState } from 'react' -import { TbArrowsUpDown, TbInfoCircle } from 'react-icons/tb' import { SelectBox } from '@/components/selectbox/selectbox' import { TextInput } from '@/components/text-input' import { useGetCurrencyByCode } from '@/services/hooks/currency/getCurrencyByCode.hook' import { useGetSupportCurrencies } from '@/services/hooks/currency/getSupportCurrencies.hook' +import { Icon } from '@/src/icons' export const CurrencyConverter: React.FC = () => { const [fromCurrency, setFromCurrency] = useState('EUR') @@ -66,7 +66,7 @@ export const CurrencyConverter: React.FC = () => { }))} value={fromCurrency} onChange={setFromCurrency} - className="!w-24 !h-11 !rounded-2xl !bg-base-100 border border-base-300 shadow-sm font-bold text-xs" + className="!w-24 !h-11 rounded-2xl! !bg-base-100 border border-base-300 shadow-sm font-bold text-xs" />
    @@ -76,7 +76,7 @@ export const CurrencyConverter: React.FC = () => { className="flex items-center justify-center transition-all border rounded-full shadow-lg cursor-pointer bg-base-300 w-11 h-11 border-primary/10 text-content hover:text-primary active:scale-90 hover:scale-105 backdrop-blur-md" > - + @@ -132,7 +132,7 @@ export const CurrencyConverter: React.FC = () => {
    - ۱ ={' '} + ۱ ={' '} {fromCurrencyData && toCurrencyData ? formatNumber( fromCurrencyData.rialPrice / toCurrencyData.rialPrice diff --git a/src/layouts/widgets/tools/pomodoro/pomodoro-timer.tsx b/src/layouts/widgets/tools/pomodoro/pomodoro-timer.tsx index 01b0c769..68e43b01 100644 --- a/src/layouts/widgets/tools/pomodoro/pomodoro-timer.tsx +++ b/src/layouts/widgets/tools/pomodoro/pomodoro-timer.tsx @@ -1,6 +1,5 @@ import type React from 'react' import { useEffect, useMemo, useState } from 'react' -import { FiCheckCircle, FiCoffee, FiRefreshCw } from 'react-icons/fi' import Analytics from '@/analytics' import { getFromStorage, removeFromStorage, setToStorage } from '@/common/storage' import { SelectBox } from '@/components/selectbox/selectbox' @@ -15,10 +14,8 @@ import { TimerDisplay } from './components/timer-display' import { TopUsersTab } from './topUsers/top-users' import type { PomodoroSettings, TimerMode } from './types' import { TabNavigation } from '@/components/tab-navigation' -import { GoGear } from 'react-icons/go' -import { TfiCup } from 'react-icons/tfi' -import { CiPause1, CiPlay1 } from 'react-icons/ci' import { Button } from '@/components/button/button' +import { Icon } from '@/src/icons' interface PomodoroTimerProps { onComplete?: () => void @@ -337,7 +334,7 @@ export const PomodoroTimer: React.FC = ({ onComplete }) => { } className={`px-2 py-0! border-none! rounded-xl text-base-content/40 shrink-0 active:scale-95 h-7!`} > - + @@ -346,7 +343,7 @@ export const PomodoroTimer: React.FC = ({ onComplete }) => { onClick={() => setShowSettings(!showSettings)} className={`px-2 py-0! border-none! rounded-xl text-base-content/40 shrink-0 active:scale-95 h-7!`} > - +
    @@ -359,20 +356,20 @@ export const PomodoroTimer: React.FC = ({ onComplete }) => {
    } + icon={} onClick={handleReset} /> {isRunning ? ( } + icon={} onClick={handlePause} /> ) : ( } + icon={} onClick={handleStart} /> )} @@ -380,7 +377,7 @@ export const PomodoroTimer: React.FC = ({ onComplete }) => { {mode.includes('break') && ( } + icon={} onClick={() => handleModeChange('work')} /> )} @@ -388,7 +385,7 @@ export const PomodoroTimer: React.FC = ({ onComplete }) => { {mode === 'work' && ( } + icon={} onClick={() => handleModeChange('short-break')} /> )} diff --git a/src/layouts/widgets/tools/pomodoro/topUsers/top-user-item.tsx b/src/layouts/widgets/tools/pomodoro/topUsers/top-user-item.tsx index c9476012..4eda4bc9 100644 --- a/src/layouts/widgets/tools/pomodoro/topUsers/top-user-item.tsx +++ b/src/layouts/widgets/tools/pomodoro/topUsers/top-user-item.tsx @@ -1,7 +1,7 @@ -import { FaCrown } from 'react-icons/fa' import { AvatarComponent } from '@/components/avatar.component' import { UserCardPortal } from '@/components/user/user-card-portal' import type { TopUser } from '@/services/hooks/pomodoro/getTopUsers.hook' +import { Icon } from '@/src/icons' interface TopUserItemProps { user: TopUser @@ -42,7 +42,8 @@ export function TopUserItem({ ref={containerRef} > {rank <= 3 && ( - )} 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 ( -
    -