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 ? (
-

{
- const target = e.target as HTMLImageElement
- target.style.display = 'none'
- target.nextElementSibling?.classList.remove(
- 'hidden'
- )
- }}
- />
- ) : (
-
})
{
- const target = e.target as HTMLImageElement
- target.style.display = 'none'
- target.nextElementSibling?.classList.remove(
- 'hidden'
- )
- }}
- />
- )}
-
+

{
+ 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) => (
-
+
)}
@@ -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()}
>
-
+
مدیریت ویجت ها
setUpdateModalOpen(true)}
>
-
+
تغییرات اخیر
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 */}
= ({ step, setStep }) => {
aria-label="بازگشت به صفحه ایمیل"
className="flex items-center mx-auto gap-1 md:gap-1.5 my-2.5 md:my-3 text-xs md:text-sm font-medium cursor-pointer group text-muted hover:text-primary hover:bg-base-200 px-3 py-1.5 rounded-lg duration-200 active:scale-95"
>
-
+
بازگشت
diff --git a/src/layouts/setting/tabs/account/auth-form/auth-password.tsx b/src/layouts/setting/tabs/account/auth-form/auth-password.tsx
index 562f77c1..3f95ee73 100644
--- a/src/layouts/setting/tabs/account/auth-form/auth-password.tsx
+++ b/src/layouts/setting/tabs/account/auth-form/auth-password.tsx
@@ -1,5 +1,4 @@
import { useState } from 'react'
-import { FiLock } from 'react-icons/fi'
import Analytics from '@/analytics'
import { Button } from '@/components/button/button'
import { TextInput } from '@/components/text-input'
@@ -8,6 +7,7 @@ import { useSignIn } from '@/services/hooks/auth/authService.hook'
import { translateError } from '@/utils/translate-error'
import InputTextError from './components/input-text-error'
import { isEmail, isEmpty, isLessThan } from '@/utils/validators'
+import { Icon } from '@/src/icons'
export default function AuthPassword() {
const [email, setEmail] = useState('')
@@ -99,7 +99,7 @@ export default function AuthPassword() {
aria-hidden="true"
className="flex items-center justify-center flex-shrink-0 rounded-lg w-9 h-9 md:w-10 md:h-10 md:rounded-xl bg-primary/10"
>
-
+
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`}
>
-
+
تایید{' '}
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
)
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) {
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- ذخیره
-
-
- انصراف
-
-
+
)
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) {
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
)
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) {
/>
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
)
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) {
/>
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
)
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) {
: 'انتخاب شغل'}
-
+
}
/>
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
+
)
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) {
/>
-
- onClickSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateUsernameMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
-
- انصراف
-
-
+
)
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"
/>
-
- onSave()}
- className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
- >
- {updateProfileMutation.isPending ? 'در حال ذخیره...' : 'ذخیره'}
-
- onClose()}
- className="flex-1 text-sm font-medium border-none rounded-2xl bg-content"
- >
- انصراف
-
-
+
+
)
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 (
+
+ handleConfirm()}
+ className="text-sm shadow-xs flex-2 rounded-xl shadow-primary/20"
+ >
+ {isPending ? 'در حال ذخیره...' : 'ذخیره'}
+
+ handleCancel()}
+ className="flex-1 text-sm font-medium border-none rounded-2xl bg-content"
+ >
+ انصراف
+
+
+ )
+}
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`}
>
-
+
تایید{' '}
-
+
{value || 'انتخاب تاریخ'}
-
+
@@ -158,7 +157,7 @@ export default function JalaliDatePicker({
size="sm"
className={`flex-1 rounded-2xl bg-primary hover:bg-primary/90 text-white`}
>
-
+
تایید{' '}
{
if (gender === 'MALE') return { label: 'آقا هستم' }
@@ -90,7 +85,7 @@ export const ProfileDisplay = () => {
onClick={() => onClick()}
className="absolute p-0.5 cursor-pointer text-white transition-all rounded-full shadow-xl -bottom-1 right-1 bg-primary hover:scale-110 active:scale-95"
>
-
+
{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 (
-
- onClick(friend.id)}
- disabled={disabled}
- className="p-2 mr-2 text-red-500 rounded-lg cursor-pointer hover:bg-red-50 dark:hover:bg-red-900/20"
- >
-
-
-
- )
-}
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
handleFileSelect()} size="sm">
-
+
تغییر
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"
>
@@ -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'
}
>
-
+
= ({
'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"
>
-
+
{
onClick={() => handleNextDay()}
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"
>
-
+
)}
changeMonth(-1)}
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"
>
-
+
changeMonth(1)}
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) => {
@@ -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"
>
-
+
)}
- {isEdit ? : }
+ {isEdit ? (
+
+ ) : (
+
+ )}
@@ -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 (
-
-
-
-
-
حریم خصوصی ترجمه
-
-
-
- ویجتیفای هیچگونه نقشی در ترجمه ندارد. ترجمه توسط{' '}
-
- {platform.name}
- {' '}
- انجام میشود.
-
-
- دادههای شما (فقط متن ورودی) مستقیماً به سرویس ترجمه ارسال میشود و
- ویجتیفای دسترسی به آن ندارد.
-
-
-
-
-
- متوجه شدم
-
-
-
-
- )
-}
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 (
-
- )
-}
diff --git a/src/layouts/widgets/tools/translate/components/translation-result.tsx b/src/layouts/widgets/tools/translate/components/translation-result.tsx
deleted file mode 100644
index 4d32701b..00000000
--- a/src/layouts/widgets/tools/translate/components/translation-result.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { TbCopy, TbVolume } from 'react-icons/tb'
-import Analytics from '@/analytics'
-import { Button } from '@/components/button/button'
-import Tooltip from '@/components/toolTip'
-import { speakTextInLanguage } from '../shared'
-
-interface TranslationResultProps {
- translatedText: string
- validationError: string
- translateMutation: any
- errorMessage: string
- toLanguage: string
-}
-
-const handleCopy = async (text: string) => {
- try {
- await navigator.clipboard.writeText(text)
- Analytics.event('translate_copy_text')
- } catch (err) {
- console.error('Failed to copy text:', err)
- }
-}
-
-export function TranslationResult({
- translatedText,
- validationError,
- translateMutation,
- errorMessage,
- toLanguage,
-}: TranslationResultProps) {
- return (
-
-
- {validationError || translateMutation.error ? (
-
- {errorMessage}
-
- ) : (
-
{translatedText}
- )}
- {translatedText &&
- !translateMutation.isPending &&
- !(validationError || translateMutation.error) && (
-
-
- handleCopy(translatedText)}
- className="!btn-xs !w-5 !h-5 !min-h-5 !p-0 btn-ghost"
- >
-
-
-
-
-
- speakTextInLanguage(translatedText, toLanguage)
- }
- className="!btn-xs !w-5 !h-5 !min-h-5 !p-0 btn-ghost"
- >
-
-
-
-
- )}
-
-
- )
-}
diff --git a/src/layouts/widgets/tools/translate/shared.ts b/src/layouts/widgets/tools/translate/shared.ts
deleted file mode 100644
index a530a03d..00000000
--- a/src/layouts/widgets/tools/translate/shared.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import Analytics from '@/analytics'
-import type {
- TranslateRequestInput,
- TranslateValidationResult,
-} from '@/services/hooks/translate'
-
-export function speakTextInLanguage(text: string, lang: string) {
- if ('speechSynthesis' in window) {
- const utterance = new SpeechSynthesisUtterance(text)
- utterance.lang = lang === 'fa' ? 'fa-IR' : lang === 'en' ? 'en-US' : lang
- speechSynthesis.speak(utterance)
- Analytics.event(`translate_speak_${lang}`)
- }
-}
-
-export function validateTranslateRequest(
- request: TranslateRequestInput
-): TranslateValidationResult {
- if (!request.text || request.text.trim().length === 0) {
- return {
- isValid: false,
- error: 'EMPTY_TEXT',
- }
- }
-
- if (request.text.length > 5000) {
- return {
- isValid: false,
- error: 'TEXT_TOO_LONG',
- }
- }
-
- if (request.from === request.to) {
- return {
- isValid: false,
- error: 'SOURCE_AND_TARGET_LANG_MUST_BE_DIFFERENT',
- }
- }
-
- if (request.to === 'auto') {
- return {
- isValid: false,
- error: 'TARGET_LANG_CANNOT_BE_AUTO',
- }
- }
-
- return { isValid: true }
-}
diff --git a/src/layouts/widgets/tools/translate/translate.tsx b/src/layouts/widgets/tools/translate/translate.tsx
deleted file mode 100644
index ffa24b21..00000000
--- a/src/layouts/widgets/tools/translate/translate.tsx
+++ /dev/null
@@ -1,255 +0,0 @@
-import type React from 'react'
-import { useCallback, useEffect, useMemo, useState } from 'react'
-import { GoArrowSwitch } from 'react-icons/go'
-import { MdOutlinePrivacyTip } from 'react-icons/md'
-import { TbLanguage } from 'react-icons/tb'
-import Analytics from '@/analytics'
-import { RequireAuth } from '@/components/auth/require-auth'
-import { RequireVerification } from '@/components/auth/require-verification'
-import { Button } from '@/components/button/button'
-import { SelectBox } from '@/components/selectbox/selectbox'
-import { useAuth } from '@/context/auth.context'
-import {
- getLanguageDisplayName,
- type TranslateRequestInput,
- useAvailableLanguages,
- useTranslate,
-} from '@/services/hooks/translate'
-import { translateError } from '@/utils/translate-error'
-import { PlatformModal } from './components/platform-modal'
-import { TranslationInput } from './components/translation-input'
-import { TranslationResult } from './components/translation-result'
-import { validateTranslateRequest } from './shared'
-import { showToast } from '@/common/toast'
-
-export const TranslateComponent: React.FC = () => {
- const { isAuthenticated, user } = useAuth()
- const [toLanguage, setToLanguage] = useState('fa')
- const [inputText, setInputText] = useState('')
- const [translatedText, setTranslatedText] = useState('')
- const [validationError, setValidationError] = useState('')
- const [rateLimitTimer, setRateLimitTimer] = useState(0)
- const [showPlatformModal, setShowPlatformModal] = useState(false)
-
- const isEnabled = (isAuthenticated && user?.verified) || false
-
- const { data: fetchedLanguages, isLoading: isLoadingLanguages } =
- useAvailableLanguages({ enabled: isEnabled })
-
- const translateMutation = useTranslate()
-
- const errorMessage = useMemo(() => {
- if (!validationError) return ''
- return translateError(validationError) as string
- }, [validationError])
-
- const handleTranslate = async () => {
- if (!isEnabled) {
- showToast('برای استفاده از مترجم لطفا وارد شوید', 'error')
- return
- }
-
- if (translateMutation.isPending) {
- return
- }
-
- if (!inputText.trim()) {
- setValidationError('EMPTY_TEXT')
- return
- }
-
- const request: TranslateRequestInput = {
- from: 'auto',
- to: toLanguage,
- text: inputText,
- }
-
- const validation = validateTranslateRequest(request)
- if (!validation.isValid) {
- setValidationError(validation.error || '')
- return
- }
-
- setValidationError('')
- setRateLimitTimer(0)
- translateMutation.mutate(request, {
- onSuccess: (data) => {
- setTranslatedText(data.translated)
- Analytics.event(`translate_success_auto_to_${toLanguage}`)
- },
- onError: (error: any) => {
- const errorData = error.response?.data
- const tryAfter = errorData?.tryAfter
- if (tryAfter && typeof tryAfter === 'number') {
- setRateLimitTimer(tryAfter)
- }
-
- setValidationError(errorData.message || 'TRANSLATE_ERROR')
- Analytics.event(`translate_error_auto_to_${toLanguage}`)
- },
- })
- }
-
- const onChangeInputText = (e: React.ChangeEvent) => {
- if (e.target.value === '') {
- setTranslatedText('')
- }
-
- setInputText(e.target.value)
- }
-
- useEffect(() => {
- if (validationError && rateLimitTimer === 0) {
- setValidationError('')
- }
- }, [toLanguage, inputText, validationError, rateLimitTimer])
-
- const decrementTimer = useCallback(() => {
- setRateLimitTimer((prev) => {
- if (prev <= 1) {
- setValidationError('')
- return 0
- }
- return prev - 1
- })
- }, [])
-
- useEffect(() => {
- let interval: NodeJS.Timeout
- if (rateLimitTimer > 0) {
- interval = setInterval(decrementTimer, 1000)
- }
-
- return () => {
- if (interval) clearInterval(interval)
- }
- }, [rateLimitTimer, decrementTimer])
-
- if (isLoadingLanguages) {
- return (
-
-
-
-
-
بارگذاری زبانها...
-
- )
- }
-
- const languageOptions =
- fetchedLanguages?.languages?.map((lang) => ({
- label: getLanguageDisplayName(lang),
- value: lang,
- })) || []
-
- return (
-
-
-
-
-
- {}}
- className="!w-full !h-6 !text-xs !bg-content hover:!bg-base-200"
- optionClassName="!bg-base-100"
- />
-
-
-
-
-
-
-
-
-
- lang.value !== 'auto'
- )}
- value={toLanguage}
- onChange={setToLanguage}
- className="!w-full !h-6 !text-xs !bg-content hover:!bg-base-200"
- optionClassName="!bg-base-100"
- />
-
-
-
-
-
-
-
-
-
0 ||
- fetchedLanguages?.isAvailableService === false
- }
- className="flex-1 !h-7 !min-h-7 !text-xs rounded-2xl"
- isPrimary={true}
- size="sm"
- >
- {fetchedLanguages?.isAvailableService === false ? (
-
-
- خدمات در دسترس نیست.
-
- ) : translateMutation.isPending ? (
- <>
-
- ترجمه...
- >
- ) : rateLimitTimer > 0 ? (
- <>
-
- {rateLimitTimer}ثانیه
- >
- ) : (
- <>
-
- ترجمه
- >
- )}
-
-
setShowPlatformModal(true)}
- >
-
-
-
-
setShowPlatformModal(false)}
- platform={{
- link: fetchedLanguages?.platform.link || '-',
- name: fetchedLanguages?.platform.name || '-',
- }}
- />
-
-
-
- )
-}
diff --git a/src/layouts/widgets/weather/current/current-box.weather.tsx b/src/layouts/widgets/weather/current/current-box.weather.tsx
index cffadac6..c5d99cf7 100644
--- a/src/layouts/widgets/weather/current/current-box.weather.tsx
+++ b/src/layouts/widgets/weather/current/current-box.weather.tsx
@@ -1,8 +1,7 @@
import type { FetchedWeather } from '@/layouts/widgets/weather/weather.interface'
import { unitsFlag } from '../unitSymbols'
import Tooltip from '@/components/toolTip'
-import { TbWind } from 'react-icons/tb'
-import { WiCloudy, WiHumidity } from 'react-icons/wi'
+import { Icon } from '@/src/icons'
interface CurrentWeatherBoxProps {
fetchedWeather: FetchedWeather | null
@@ -70,7 +69,7 @@ export function CurrentWeatherBox({
-
+
{Math.round(
fetchedWeather?.weather?.temperature?.wind_speed || 0
@@ -82,7 +81,7 @@ export function CurrentWeatherBox({
-
+
{fetchedWeather?.weather?.temperature?.humidity || 0}%
@@ -91,7 +90,7 @@ export function CurrentWeatherBox({
-
+
{fetchedWeather?.weather?.temperature?.clouds || 0}%
diff --git a/src/layouts/widgets/wigiArz/components/arz-header.tsx b/src/layouts/widgets/wigiArz/components/arz-header.tsx
index 936e666c..215b288b 100644
--- a/src/layouts/widgets/wigiArz/components/arz-header.tsx
+++ b/src/layouts/widgets/wigiArz/components/arz-header.tsx
@@ -1,6 +1,5 @@
-import { BsCurrencyExchange } from 'react-icons/bs'
-import { FaGear } from 'react-icons/fa6'
import { Button } from '@/components/button/button'
+import { Icon } from '@/src/icons'
interface ArzHeaderProps {
title: string
@@ -11,7 +10,6 @@ export const ArzHeader = ({ title, onSettingsClick }: ArzHeaderProps) => {
return (
@@ -21,7 +19,8 @@ export const ArzHeader = ({ title, onSettingsClick }: ArzHeaderProps) => {
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/wigiArz/components/currency-box.tsx b/src/layouts/widgets/wigiArz/components/currency-box.tsx
index b4d0cff1..29c73333 100644
--- a/src/layouts/widgets/wigiArz/components/currency-box.tsx
+++ b/src/layouts/widgets/wigiArz/components/currency-box.tsx
@@ -1,7 +1,5 @@
import { useEffect, useRef, useState } from 'react'
import toast from 'react-hot-toast'
-import { FaArrowDownLong, FaArrowUpLong } from 'react-icons/fa6'
-import { MdDragIndicator } from 'react-icons/md'
import Analytics from '@/analytics'
import { getFromStorage, setToStorage } from '@/common/storage'
import { CurrencyColorMode } from '@/context/currency.context'
@@ -13,6 +11,7 @@ import {
import { GetPrice } from '../utils/getPrice'
import { CurrencyModalComponent } from './currency-modal'
import { showToast } from '@/common/toast'
+import { Icon } from '@/src/icons'
interface CurrencyBoxProps {
code: string
@@ -108,7 +107,7 @@ export const CurrencyBox = ({
{...dragHandle}
className="flex items-center justify-center w-4 h-4 transition-colors cursor-grab active:cursor-grabbing text-muted hover:bg-primary/10"
>
-
+
)}
@@ -146,9 +145,9 @@ export const CurrencyBox = ({
{priceChange !== 0 && (
{priceChange > 0 ? (
-
+
) : (
-
+
)}
)}
diff --git a/src/layouts/widgets/wigiArz/components/currency-modal.tsx b/src/layouts/widgets/wigiArz/components/currency-modal.tsx
index 21577005..694b6bb1 100644
--- a/src/layouts/widgets/wigiArz/components/currency-modal.tsx
+++ b/src/layouts/widgets/wigiArz/components/currency-modal.tsx
@@ -1,11 +1,10 @@
import { useEffect, useState } from 'react'
-import { FaArrowDownLong, FaArrowUpLong } from 'react-icons/fa6'
-import { TbArrowsRightLeft } from 'react-icons/tb'
import Analytics from '@/analytics'
import Modal from '@/components/modal'
import { TextInput } from '@/components/text-input'
import { CurrencyColorMode } from '@/context/currency.context'
import { GetPrice } from '../utils/getPrice'
+import { Icon } from '@/src/icons'
interface CurrencyModalComponentProps {
code: string
@@ -116,7 +115,7 @@ export const CurrencyModalComponent = ({
className="cursor-pointer hover:text-primary"
onClick={() => onClickConverter()}
>
-
+
@@ -132,9 +131,9 @@ export const CurrencyModalComponent = ({
className={`flex items-center text-sm transition-all duration-300 ease-out ${priceChangeColor}`}
>
{priceChange > 0 ? (
-
+
) : (
-
+
)}
diff --git a/src/layouts/widgets/wigiArz/utils/getPrice.tsx b/src/layouts/widgets/wigiArz/utils/getPrice.tsx
index 54f1b800..50547827 100644
--- a/src/layouts/widgets/wigiArz/utils/getPrice.tsx
+++ b/src/layouts/widgets/wigiArz/utils/getPrice.tsx
@@ -1,5 +1,4 @@
import type React from 'react'
-import { FaDollarSign } from 'react-icons/fa'
import type { FetchedCurrency } from '@/services/hooks/currency/getCurrencyByCode.hook'
export interface GetPriceResult {
price: number
@@ -9,12 +8,7 @@ export function GetPrice(code: string, currency: FetchedCurrency): GetPriceResul
if (code.toLowerCase() === 'btc' || currency.useDollar) {
return {
price: currency.price,
- label: (
- <>
-
- {currency.price?.toLocaleString()}
- >
- ),
+ label: <>💲{currency.price?.toLocaleString()}>,
}
} else {
return {
diff --git a/src/layouts/widgets/wigiArz/wigi_arz.layout.tsx b/src/layouts/widgets/wigiArz/wigi_arz.layout.tsx
index a976952b..d190ffe3 100644
--- a/src/layouts/widgets/wigiArz/wigi_arz.layout.tsx
+++ b/src/layouts/widgets/wigiArz/wigi_arz.layout.tsx
@@ -11,7 +11,6 @@ import {
SortableContext,
verticalListSortingStrategy,
} from '@dnd-kit/sortable'
-import { FiDollarSign } from 'react-icons/fi'
import Analytics from '@/analytics'
import { callEvent } from '@/common/utils/call-event'
import { Button } from '@/components/button/button'
@@ -83,7 +82,7 @@ export function WigiArzLayout({
'flex items-center justify-center w-12 h-12 mx-auto rounded-full bg-base-300/70 border-base/70'
}
>
-
+ 💲
ارزهای مورد نظر خود را اضافه کنید
@@ -132,7 +131,7 @@ export function WigiArzLayout({
className={'flex flex-col gap-1'}
>
onSettingClick()}
/>
@@ -147,7 +146,7 @@ export function WigiArzLayout({
'mt-1 flex items-center justify-center w-12 h-12 mx-auto rounded-full bg-base-300'
}
>
-
+ 💲
ارزهای مورد نظر خود را اضافه کنید.
diff --git a/src/layouts/widgets/wigiPad/clock-display/clock-display.tsx b/src/layouts/widgets/wigiPad/clock-display/clock-display.tsx
index fecd2fdf..73f33047 100644
--- a/src/layouts/widgets/wigiPad/clock-display/clock-display.tsx
+++ b/src/layouts/widgets/wigiPad/clock-display/clock-display.tsx
@@ -1,5 +1,4 @@
import { useEffect, useState } from 'react'
-import { FaCog } from 'react-icons/fa'
import { getFromStorage } from '@/common/storage'
import { callEvent, listenEvent } from '@/common/utils/call-event'
import { Button } from '@/components/button/button'
@@ -8,6 +7,7 @@ import { WidgetTabKeys } from '@/layouts/widgets-settings/constant/tab-keys'
import { type ClockSettings, ClockType } from './clock-setting.interface'
import { AnalogClock } from './clocks/analog.clock'
import { DigitalClock } from './clocks/digital.clock'
+import { Icon } from '@/src/icons'
export function ClockDisplay() {
const [clockSettings, setClockSettings] = useState(null)
@@ -60,7 +60,7 @@ export function ClockDisplay() {
className="m-1.5 h-5 w-5 p-0 flex items-center justify-center rounded-full opacity-0 group-hover:opacity-100 !border-none !shadow-none transition-all duration-300 delay-200"
onClick={onClickSettings}
>
-
+
diff --git a/src/layouts/widgets/wigiPad/date-display/date.display.tsx b/src/layouts/widgets/wigiPad/date-display/date.display.tsx
index 89cf3156..e644c0f9 100644
--- a/src/layouts/widgets/wigiPad/date-display/date.display.tsx
+++ b/src/layouts/widgets/wigiPad/date-display/date.display.tsx
@@ -1,4 +1,3 @@
-import { FaCog } from 'react-icons/fa'
import { getFromStorage } from '@/common/storage'
import { callEvent, listenEvent } from '@/common/utils/call-event'
import { Button } from '@/components/button/button'
@@ -6,6 +5,7 @@ import { WidgetTabKeys } from '@/layouts/widgets-settings/constant/tab-keys'
import { type WigiPadDateSetting, WigiPadDateType } from './date-setting.interface'
import { GregorianDate } from './dates/gregorian.date'
import { JalaliDate } from './dates/jalali.date'
+import { Icon } from '@/src/icons'
export function DateDisplay() {
const [wigiPadDateSettings, setWigiPadDateSettings] =
@@ -53,7 +53,7 @@ export function DateDisplay() {
size="xs"
className="m-1.5 h-5 w-5 p-0 flex items-center justify-center rounded-full opacity-0 group-hover:opacity-100 !border-none !shadow-none transition-all duration-300 delay-200"
>
-
+
diff --git a/src/layouts/widgets/yadkar/yadkar.tsx b/src/layouts/widgets/yadkar/yadkar.tsx
index b397828a..d9124f13 100644
--- a/src/layouts/widgets/yadkar/yadkar.tsx
+++ b/src/layouts/widgets/yadkar/yadkar.tsx
@@ -3,15 +3,11 @@ import Analytics from '@/analytics'
import { NotesLayout } from '../notes/notes.layout'
import { TodosLayout } from '../todos/todos'
import { TabNavigation } from '@/components/tab-navigation'
-import {
- HiOutlineCheckCircle,
- HiOutlineDocumentText,
- HiOutlineFire,
-} from 'react-icons/hi2'
import { WidgetContainer } from '../widget-container'
import { HabitsContent } from '../habit/habits.layout'
import { getFromStorage, setToStorage } from '@/common/storage'
import { useEffect } from 'react'
+import { Icon } from '@/src/icons'
type Tab = 'todos' | 'notes' | 'rabbit'
export function YadkarWidget() {
@@ -47,17 +43,17 @@ export function YadkarWidget() {
{
id: 'todos',
label: 'تسکها',
- icon: ,
+ icon: ,
},
{
id: 'notes',
label: 'یادداشت',
- icon: ,
+ icon: ,
},
{
id: 'rabbit',
label: 'عادتها (بتا)',
- icon: ,
+ icon: ,
},
]}
size="small"
diff --git a/src/pages/root.tsx b/src/pages/root.tsx
index d4dbb307..953df47b 100644
--- a/src/pages/root.tsx
+++ b/src/pages/root.tsx
@@ -16,6 +16,7 @@ import { HomePage } from './home/home.page'
import { useEffect } from 'react'
import { useWallpaperApply } from '@/layouts/setting/tabs/wallpapers/hooks/use-wallpaper-apply'
import { WallpaperProvider } from '@/context/wallpaper.context'
+import { IconProvider } from '../icons/icons.context'
export function RootLayout() {
const [showWidgetSettings, setShowWidgetSettings] = useState(false)
@@ -48,69 +49,70 @@ export function RootLayout() {
return (
-
-
-
-
+
+
+
+
+
-
-
+
+ {page === Page.Home ? (
+
+ ) : page === Page.Explorer ? (
+
+ ) : (
+
+ )}
+
+
+ {
+ setShowWidgetSettings(false)
+ setTab(null)
}}
- className="flex w-full h-full"
- >
- {page === Page.Home ? (
-
- ) : page === Page.Explorer ? (
-
- ) : (
-
- )}
-
-
- {
- setShowWidgetSettings(false)
- setTab(null)
- }}
- selectedTab={tab}
- />
-
-
-
-
-
+
+
+
+
- {/*
*/}
-
- {showAuthRequired && (
-
setAuthRequired(false)}
+ duration: 5000,
+ }}
/>
- )}
+ {/* */}
+
+ {showAuthRequired && (
+ setAuthRequired(false)}
+ />
+ )}
+
)
}