Files
noauth/src/pages/KeyPage/hooks/useTriggerConfirmModal.ts
2024-02-14 14:45:36 +06:00

120 lines
3.7 KiB
TypeScript

import { useModalSearchParams } from '@/hooks/useModalSearchParams'
import { DbPending, DbPerm } from '@/modules/db'
import { MODAL_PARAMS_KEYS } from '@/types/modal'
import { ACTION_TYPE } from '@/utils/consts'
import { useCallback, useEffect, useRef } from 'react'
import { useSearchParams } from 'react-router-dom'
export type IPendingsByAppNpub = {
[appNpub: string]: {
pending: DbPending[]
isConnected: boolean
}
}
type IShownConfirmModals = {
[reqId: string]: boolean
}
export const useTriggerConfirmModal = (npub: string, pending: DbPending[], perms: DbPerm[]) => {
const { handleOpen, getModalOpened } = useModalSearchParams()
const [searchParams] = useSearchParams()
const isPopup = searchParams.get('popup') === 'true'
const isConfirmConnectModalOpened = getModalOpened(MODAL_PARAMS_KEYS.CONFIRM_CONNECT)
const isConfirmEventModalOpened = getModalOpened(MODAL_PARAMS_KEYS.CONFIRM_EVENT)
const filteredPendingReqs = pending.filter((p) => p.npub === npub)
const filteredPerms = perms.filter((p) => p.npub === npub)
const npubConnectPerms = filteredPerms.filter((perm) => perm.perm === 'connect' || perm.perm === ACTION_TYPE.BASIC)
const excludeConnectPendings = filteredPendingReqs.filter((pr) => pr.method !== 'connect')
const connectPendings = filteredPendingReqs.filter((pr) => pr.method === 'connect')
const prepareEventPendings = excludeConnectPendings.reduce<IPendingsByAppNpub>((acc, current) => {
const isConnected = npubConnectPerms.some((cp) => cp.appNpub === current.appNpub)
if (!acc[current.appNpub]) {
acc[current.appNpub] = {
pending: [current],
isConnected,
}
return acc
}
acc[current.appNpub].pending.push(current)
acc[current.appNpub].isConnected = isConnected
return acc
}, {})
const shownConnectModals = useRef<IShownConfirmModals>({})
const shownConfirmEventModals = useRef<IShownConfirmModals>({})
useEffect(() => {
return () => {
shownConnectModals.current = {}
shownConfirmEventModals.current = {}
}
}, [npub, pending.length])
const handleOpenConfirmConnectModal = useCallback(() => {
if (!filteredPendingReqs.length || isConfirmEventModalOpened || isConfirmConnectModalOpened) return undefined
for (let i = 0; i < connectPendings.length; i++) {
const req = connectPendings[i]
if (shownConnectModals.current[req.id]) {
continue
}
shownConnectModals.current[req.id] = true
handleOpen(MODAL_PARAMS_KEYS.CONFIRM_CONNECT, {
search: {
appNpub: req.appNpub,
reqId: req.id,
popup: isPopup ? 'true' : '',
},
})
break
}
}, [
connectPendings,
filteredPendingReqs.length,
handleOpen,
isConfirmEventModalOpened,
isConfirmConnectModalOpened,
isPopup,
])
const handleOpenConfirmEventModal = useCallback(() => {
if (!filteredPendingReqs.length || connectPendings.length) return undefined
for (let i = 0; i < Object.keys(prepareEventPendings).length; i++) {
const appNpub = Object.keys(prepareEventPendings)[i]
if (shownConfirmEventModals.current[appNpub] || !prepareEventPendings[appNpub].isConnected) {
continue
}
shownConfirmEventModals.current[appNpub] = true
handleOpen(MODAL_PARAMS_KEYS.CONFIRM_EVENT, {
search: {
appNpub,
popup: isPopup ? 'true' : '',
},
})
break
}
}, [connectPendings.length, filteredPendingReqs.length, handleOpen, prepareEventPendings, isPopup])
useEffect(() => {
handleOpenConfirmEventModal()
}, [handleOpenConfirmEventModal])
useEffect(() => {
handleOpenConfirmConnectModal()
}, [handleOpenConfirmConnectModal])
return {
prepareEventPendings,
}
}