chore: 统一使用 import from xxx.ts 导入, 删去无用依赖引用
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { Chat, User, UserMySelf } from "lingchair-client-protocol"
|
import { Chat, User, UserMySelf } from "lingchair-client-protocol"
|
||||||
import getClient from "./getClient"
|
import getClient from "./getClient.ts"
|
||||||
|
|
||||||
type CouldCached = User | Chat | null
|
type CouldCached = User | Chat | null
|
||||||
export default class ClientCache {
|
export default class ClientCache {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { LingChairClient } from 'lingchair-client-protocol'
|
|||||||
import data from "./data.ts"
|
import data from "./data.ts"
|
||||||
import { UAParser } from 'ua-parser-js'
|
import { UAParser } from 'ua-parser-js'
|
||||||
import { randomUUID } from 'lingchair-internal-shared'
|
import { randomUUID } from 'lingchair-internal-shared'
|
||||||
import performAuth from './performAuth.ts'
|
|
||||||
|
|
||||||
if (!data.device_id) {
|
if (!data.device_id) {
|
||||||
const ua = new UAParser(navigator.userAgent)
|
const ua = new UAParser(navigator.userAgent)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Chat, UserMySelf } from "lingchair-client-protocol"
|
import { Chat } from "lingchair-client-protocol"
|
||||||
import { createContext } from "use-context-selector"
|
import { createContext } from "use-context-selector"
|
||||||
import { SharedState } from "./MainSharedReducer"
|
import { SharedState } from "./MainSharedReducer.ts"
|
||||||
|
|
||||||
type Shared = {
|
type Shared = {
|
||||||
functions_lazy: React.MutableRefObject<{
|
functions_lazy: React.MutableRefObject<{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Chat, UserMySelf } from "lingchair-client-protocol"
|
import { Chat } from "lingchair-client-protocol"
|
||||||
|
|
||||||
export interface SharedState {
|
export interface SharedState {
|
||||||
favouriteChats: Chat[]
|
favouriteChats: Chat[]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import EffectOnly from "./EffectOnly"
|
import EffectOnly from "./EffectOnly.tsx"
|
||||||
import showCircleProgressDialog from "./showCircleProgressDialog"
|
import showCircleProgressDialog from "./showCircleProgressDialog.ts"
|
||||||
|
|
||||||
export default function ProgressDialogFallback({ text }: { text: string }) {
|
export default function ProgressDialogFallback({ text }: { text: string }) {
|
||||||
return <EffectOnly effect={() => {
|
return <EffectOnly effect={() => {
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import { Button, Dialog, snackbar, TextField } from "mdui"
|
import { Dialog, TextField } from "mdui"
|
||||||
import { data, useNavigate } from 'react-router'
|
import showSnackbar from '../../utils/showSnackbar.ts'
|
||||||
import { useContextSelector } from 'use-context-selector'
|
|
||||||
import MainSharedContext, { Shared } from '../MainSharedContext'
|
|
||||||
import showSnackbar from '../../utils/showSnackbar'
|
|
||||||
import { CallbackError } from 'lingchair-client-protocol'
|
import { CallbackError } from 'lingchair-client-protocol'
|
||||||
import useEventListener from '../../utils/useEventListener'
|
import useEventListener from '../../utils/useEventListener.ts'
|
||||||
import ClientCache from '../../ClientCache'
|
import ClientCache from '../../ClientCache.ts'
|
||||||
import AppStateContext from './AppStateContext'
|
|
||||||
|
|
||||||
export default function AddFavourtieChatDialog({ useRef }: { useRef: React.MutableRefObject<Dialog | undefined> }) {
|
export default function AddFavourtieChatDialog({ useRef }: { useRef: React.MutableRefObject<Dialog | undefined> }) {
|
||||||
const inputTargetRef = React.useRef<TextField>(null)
|
const inputTargetRef = React.useRef<TextField>(null)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Chat, User } from 'lingchair-client-protocol'
|
import { Chat, User } from 'lingchair-client-protocol'
|
||||||
import { Dialog } from 'mdui'
|
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
|
|
||||||
type AppState = {
|
type AppState = {
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
import { $, Dialog } from "mdui"
|
import { $, Dialog } from "mdui"
|
||||||
import AppStateContext, { AppState } from "./AppStateContext"
|
import AppStateContext, { AppState } from "./AppStateContext.ts"
|
||||||
import { Chat, User } from "lingchair-client-protocol"
|
import { Chat, User } from "lingchair-client-protocol"
|
||||||
import getClient from "../../getClient"
|
import getClient from "../../getClient.ts"
|
||||||
import UserOrChatInfoDialog from "./UserOrChatInfoDialog"
|
import UserOrChatInfoDialog from "./UserOrChatInfoDialog.tsx"
|
||||||
import useEffectRef from "../../utils/useEffectRef"
|
import useEffectRef from "../../utils/useEffectRef.ts"
|
||||||
import EditMyProfileDialog from "./EditMyProfileDialog"
|
import EditMyProfileDialog from "./EditMyProfileDialog.tsx"
|
||||||
import AddFavourtieChatDialog from "./AddFavourtieChatDialog"
|
import AddFavourtieChatDialog from "./AddFavourtieChatDialog.tsx"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import { useContextSelector } from "use-context-selector"
|
import { useContextSelector } from "use-context-selector"
|
||||||
import MainSharedContext, { Shared } from "../MainSharedContext"
|
import MainSharedContext, { Shared } from "../MainSharedContext.ts"
|
||||||
import ChatFragmentDialog from "./ChatFragmentDialog"
|
import ChatFragmentDialog from "./ChatFragmentDialog.tsx"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import ClientCache from "../../ClientCache"
|
import ClientCache from "../../ClientCache.ts"
|
||||||
import isMobileUI from "../../utils/isMobileUI"
|
|
||||||
|
|
||||||
const config = await fetch('/config.json').then((re) => re.json())
|
const config = await fetch('/config.json').then((re) => re.json())
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Dialog } from "mdui"
|
import { Dialog } from "mdui"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import LazyChatFragment from "../chat-fragment/LazyChatFragment"
|
import LazyChatFragment from "../chat-fragment/LazyChatFragment.tsx"
|
||||||
import useEventListener from "../../utils/useEventListener"
|
import useEventListener from "../../utils/useEventListener.ts"
|
||||||
|
|
||||||
export default function ChatFragmentDialog({ chatId, useRef }: { chatId: string, useRef: React.MutableRefObject<Dialog | undefined> }) {
|
export default function ChatFragmentDialog({ chatId, useRef }: { chatId: string, useRef: React.MutableRefObject<Dialog | undefined> }) {
|
||||||
useEventListener(useRef, 'open', () => {
|
useEventListener(useRef, 'open', () => {
|
||||||
|
|||||||
40
client/ui/app-state/CreateGroupDialog.tsx
Normal file
40
client/ui/app-state/CreateGroupDialog.tsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import * as React from 'react'
|
||||||
|
import { Dialog, TextField } from "mdui"
|
||||||
|
import showSnackbar from '../../utils/showSnackbar'
|
||||||
|
import { CallbackError } from 'lingchair-client-protocol'
|
||||||
|
import useEventListener from '../../utils/useEventListener.ts'
|
||||||
|
import ClientCache from '../../ClientCache.ts'
|
||||||
|
|
||||||
|
export default function CreateGroupDialog({ useRef }: { useRef: React.MutableRefObject<Dialog | undefined> }) {
|
||||||
|
const inputTargetRef = React.useRef<TextField>(null)
|
||||||
|
|
||||||
|
useEventListener(useRef, 'closed', () => {
|
||||||
|
inputTargetRef.current!.value = ''
|
||||||
|
})
|
||||||
|
|
||||||
|
async function addFavouriteChat() {
|
||||||
|
try {
|
||||||
|
await (await ClientCache.getMySelf())!.addFavouriteChatsOrThrow([inputTargetRef.current!.value])
|
||||||
|
inputTargetRef.current!.value = ''
|
||||||
|
showSnackbar({
|
||||||
|
message: '添加成功!'
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof CallbackError)
|
||||||
|
showSnackbar({
|
||||||
|
message: '添加收藏对话失败: ' + e.message
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<mdui-dialog close-on-overlay-click close-on-esc headline="添加收藏对话" ref={useRef}>
|
||||||
|
<mdui-text-field clearable label="对话 / 用户 (ID 或 别名)" ref={inputTargetRef} onKeyDown={(event: KeyboardEvent) => {
|
||||||
|
if (event.key == 'Enter')
|
||||||
|
addFavouriteChat()
|
||||||
|
}}></mdui-text-field>
|
||||||
|
<mdui-button slot="action" variant="text" onClick={() => useRef.current!.open = false}>取消</mdui-button>
|
||||||
|
<mdui-button slot="action" variant="text" onClick={() => addFavouriteChat()}>添加</mdui-button>
|
||||||
|
</mdui-dialog>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
import { CallbackError, UserMySelf } from "lingchair-client-protocol"
|
import { CallbackError, UserMySelf } from "lingchair-client-protocol"
|
||||||
import ClientCache from "../../ClientCache"
|
import ClientCache from "../../ClientCache.ts"
|
||||||
import AvatarMySelf from "../AvatarMySelf"
|
import AvatarMySelf from "../AvatarMySelf.tsx"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import getClient from "../../getClient"
|
import getClient from "../../getClient.ts"
|
||||||
import { useNavigate } from "react-router"
|
import showSnackbar from "../../utils/showSnackbar.ts"
|
||||||
import showSnackbar from "../../utils/showSnackbar"
|
import useEventListener from "../../utils/useEventListener.ts"
|
||||||
import useEventListener from "../../utils/useEventListener"
|
|
||||||
import { Dialog, TextField } from "mdui"
|
import { Dialog, TextField } from "mdui"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,21 @@
|
|||||||
import { Dialog, dialog } from "mdui"
|
import { Dialog, dialog } from "mdui"
|
||||||
import { useLoaderData, useNavigate } from "react-router"
|
|
||||||
import { CallbackError, Chat } from "lingchair-client-protocol"
|
import { CallbackError, Chat } from "lingchair-client-protocol"
|
||||||
import showSnackbar from "../../utils/showSnackbar"
|
import showSnackbar from "../../utils/showSnackbar.ts"
|
||||||
import Avatar from "../Avatar"
|
import Avatar from "../Avatar.tsx"
|
||||||
import { useContextSelector } from "use-context-selector"
|
import { useContextSelector } from "use-context-selector"
|
||||||
import MainSharedContext, { Shared } from "../MainSharedContext"
|
import MainSharedContext, { Shared } from "../MainSharedContext.ts"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import ClientCache from "../../ClientCache"
|
import ClientCache from "../../ClientCache.ts"
|
||||||
import getClient from "../../getClient"
|
import getClient from "../../getClient.ts"
|
||||||
import isMobileUI from "../../utils/isMobileUI"
|
import isMobileUI from "../../utils/isMobileUI.ts"
|
||||||
import useEffectRef from "../../utils/useEffectRef"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import AppStateContext from "./AppStateContext.ts"
|
||||||
import AppStateContext from "./AppStateContext"
|
|
||||||
|
|
||||||
export default function UserOrChatInfoDialog({ chat, useRef }: { chat?: Chat, useRef: React.MutableRefObject<Dialog | undefined> }) {
|
export default function UserOrChatInfoDialog({ chat, useRef }: { chat?: Chat, useRef: React.MutableRefObject<Dialog | undefined> }) {
|
||||||
const favouriteChats = useContextSelector(
|
const favouriteChats = useContextSelector(
|
||||||
MainSharedContext,
|
MainSharedContext,
|
||||||
(context: Shared) => context.state.favouriteChats
|
(context: Shared) => context.state.favouriteChats
|
||||||
)
|
)
|
||||||
const setCurrentSelectedChatId = useContextSelector(
|
|
||||||
MainSharedContext,
|
|
||||||
(context: Shared) => context.setCurrentSelectedChatId
|
|
||||||
)
|
|
||||||
|
|
||||||
const AppState = React.useContext(AppStateContext)
|
const AppState = React.useContext(AppStateContext)
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
import { $, Tab, TextField } from "mdui"
|
import { $, Tab, TextField } from "mdui"
|
||||||
import useEventListener from "../../utils/useEventListener"
|
import useEventListener from "../../utils/useEventListener.ts"
|
||||||
import useEffectRef from "../../utils/useEffectRef"
|
import useEffectRef from "../../utils/useEffectRef.ts"
|
||||||
import isMobileUI from "../../utils/isMobileUI"
|
import isMobileUI from "../../utils/isMobileUI.ts"
|
||||||
import { Chat } from "lingchair-client-protocol"
|
import { Chat } from "lingchair-client-protocol"
|
||||||
import Preference from "../preference/Preference"
|
import Preference from "../preference/Preference.tsx"
|
||||||
import PreferenceHeader from "../preference/PreferenceHeader"
|
import PreferenceHeader from "../preference/PreferenceHeader.tsx"
|
||||||
import PreferenceLayout from "../preference/PreferenceLayout"
|
import PreferenceLayout from "../preference/PreferenceLayout.tsx"
|
||||||
import PreferenceUpdater from "../preference/PreferenceUpdater"
|
import PreferenceUpdater from "../preference/PreferenceUpdater.tsx"
|
||||||
import SwitchPreference from "../preference/SwitchPreference"
|
import SwitchPreference from "../preference/SwitchPreference.tsx"
|
||||||
import TextFieldPreference from "../preference/TextFieldPreference"
|
import TextFieldPreference from "../preference/TextFieldPreference.tsx"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import ChatMessageContainer from "./ChatMessageContainer"
|
import ChatMessageContainer from "./ChatMessageContainer"
|
||||||
import AppStateContext from "../app-state/AppStateContext"
|
import AppStateContext from "../app-state/AppStateContext.ts"
|
||||||
import ChatPanel, { ChatPanelRef } from "./ChatPanel"
|
import ChatPanel, { ChatPanelRef } from "./ChatPanel.tsx"
|
||||||
|
|
||||||
interface MduiTabFitSizeArgs extends React.HTMLAttributes<HTMLElement & Tab> {
|
interface MduiTabFitSizeArgs extends React.HTMLAttributes<HTMLElement & Tab> {
|
||||||
value: string
|
value: string
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { ChatParserTransformers, Message } from "lingchair-client-protocol"
|
import { ChatParserTransformers, Message } from "lingchair-client-protocol"
|
||||||
import isMobileUI from "../../utils/isMobileUI"
|
import isMobileUI from "../../utils/isMobileUI.ts"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import ClientCache from "../../ClientCache"
|
import ClientCache from "../../ClientCache.ts"
|
||||||
import getClient from "../../getClient"
|
import getClient from "../../getClient.ts"
|
||||||
import Avatar from "../Avatar"
|
import Avatar from "../Avatar.tsx"
|
||||||
import AppStateContext from "../app-state/AppStateContext"
|
import AppStateContext from "../app-state/AppStateContext.ts"
|
||||||
import { $, dialog, Dropdown } from "mdui"
|
import { Dropdown } from "mdui"
|
||||||
import useEventListener from "../../utils/useEventListener"
|
import useEventListener from "../../utils/useEventListener.ts"
|
||||||
import DOMPurify from 'dompurify'
|
import DOMPurify from 'dompurify'
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import ChatMentionElement from "../chat-elements/chat-mention"
|
import ChatMentionElement from "../chat-elements/chat-mention.ts"
|
||||||
|
|
||||||
function escapeHTML(str: string) {
|
function escapeHTML(str: string) {
|
||||||
const div = document.createElement('div')
|
const div = document.createElement('div')
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Chat, Message } from 'lingchair-client-protocol'
|
import { Message } from 'lingchair-client-protocol'
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import ChatMessage from './ChatMessage'
|
import ChatMessage from './ChatMessage.tsx'
|
||||||
|
|
||||||
export default function ChatMessageContainer({ messages }: { messages: Message[] }) {
|
export default function ChatMessageContainer({ messages }: { messages: Message[] }) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Chat, Message } from "lingchair-client-protocol"
|
import { Chat, Message } from "lingchair-client-protocol"
|
||||||
import ChatMessageContainer from "./ChatMessageContainer"
|
import ChatMessageContainer from "./ChatMessageContainer.tsx"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
|
|
||||||
function ChatPanelInner({ chat }: { chat: Chat }, ref: React.ForwardedRef<any>) {
|
function ChatPanelInner({ chat }: { chat: Chat }, ref: React.ForwardedRef<any>) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Chat } from "lingchair-client-protocol"
|
import { Chat } from "lingchair-client-protocol"
|
||||||
import getClient from "../../getClient"
|
import getClient from "../../getClient.ts"
|
||||||
import ChatFragment from "./ChatFragment"
|
import ChatFragment from "./ChatFragment.tsx"
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
|
|
||||||
export default function LazyChatFragment({ chatId, openedInDialog }: { chatId: string, openedInDialog: boolean }) {
|
export default function LazyChatFragment({ chatId, openedInDialog }: { chatId: string, openedInDialog: boolean }) {
|
||||||
const [child, setChild] = React.useState<React.ReactNode>()
|
const [child, setChild] = React.useState<React.ReactNode>()
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { useContextSelector } from "use-context-selector"
|
|||||||
import MainSharedContext, { Shared } from "../MainSharedContext.ts"
|
import MainSharedContext, { Shared } from "../MainSharedContext.ts"
|
||||||
import isMobileUI from "../../utils/isMobileUI.ts"
|
import isMobileUI from "../../utils/isMobileUI.ts"
|
||||||
import ClientCache from "../../ClientCache.ts"
|
import ClientCache from "../../ClientCache.ts"
|
||||||
import { useNavigate } from "react-router"
|
|
||||||
import AppStateContext from "../app-state/AppStateContext.ts"
|
import AppStateContext from "../app-state/AppStateContext.ts"
|
||||||
|
|
||||||
export default function FavouriteChatsList({ ...props }: React.HTMLAttributes<HTMLElement>) {
|
export default function FavouriteChatsList({ ...props }: React.HTMLAttributes<HTMLElement>) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { TextField } from "mdui"
|
|||||||
import RecentsListItem from "./RecentsListItem.tsx"
|
import RecentsListItem from "./RecentsListItem.tsx"
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import RecentChat from "lingchair-client-protocol/RecentChat.ts"
|
import RecentChat from "lingchair-client-protocol/RecentChat.ts"
|
||||||
import { data } from "react-router"
|
|
||||||
import isMobileUI from "../../utils/isMobileUI.ts"
|
import isMobileUI from "../../utils/isMobileUI.ts"
|
||||||
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
import useAsyncEffect from "../../utils/useAsyncEffect.ts"
|
||||||
import useEventListener from "../../utils/useEventListener.ts"
|
import useEventListener from "../../utils/useEventListener.ts"
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
import { Button, Dialog, TextField } from "mdui"
|
import { Dialog, TextField } from "mdui"
|
||||||
import MainSharedContext, { Shared } from '../MainSharedContext'
|
import MainSharedContext, { Shared } from '../MainSharedContext.ts'
|
||||||
import showSnackbar from '../../utils/showSnackbar'
|
import showSnackbar from '../../utils/showSnackbar.ts'
|
||||||
import showCircleProgressDialog from '../showCircleProgressDialog'
|
import showCircleProgressDialog from '../showCircleProgressDialog.ts'
|
||||||
import getClient from '../../getClient'
|
import getClient from '../../getClient.ts'
|
||||||
import performAuth from '../../performAuth'
|
import performAuth from '../../performAuth.ts'
|
||||||
import { useContextSelector } from 'use-context-selector'
|
import { useContextSelector } from 'use-context-selector'
|
||||||
import useEventListener from '../../utils/useEventListener'
|
import useEventListener from '../../utils/useEventListener.ts'
|
||||||
|
|
||||||
export default function RegisterDialog({ ...props }: { open: boolean } & React.HTMLAttributes<Dialog>) {
|
export default function RegisterDialog({ ...props }: { open: boolean } & React.HTMLAttributes<Dialog>) {
|
||||||
const shared = useContextSelector(MainSharedContext, (context: Shared) => ({
|
const shared = useContextSelector(MainSharedContext, (context: Shared) => ({
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import data from "../data"
|
import data from "../data.ts"
|
||||||
|
|
||||||
const searchParams = new URL(location.href).searchParams
|
const searchParams = new URL(location.href).searchParams
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { Dialog } from "mdui"
|
|
||||||
import { BlockerFunction, useBlocker, useNavigate } from "react-router"
|
|
||||||
import * as React from 'react'
|
import * as React from 'react'
|
||||||
|
|
||||||
export default function useEffectRef<T = undefined>(effect: (ref: React.MutableRefObject<T | undefined>) => void | (() => void), deps?: React.DependencyList) {
|
export default function useEffectRef<T = undefined>(effect: (ref: React.MutableRefObject<T | undefined>) => void | (() => void), deps?: React.DependencyList) {
|
||||||
|
|||||||
Reference in New Issue
Block a user