import type { CidString, EntityID, IpnsString, IShare, ISubscription, PromiseType, Thread } from '@wovin/core' import type { Accessor, Component, JSXElement } from 'solid-js' import type { retrievePubDataWithExtras } from '../ipfs/store-sync' import type { DivProps } from './utils-ui' import { A } from '@solidjs/router' import { areCidsEqual, integratePub, isShare, lastWriteWins, querySingleAndMap, tryParseCID } from '@wovin/core' import { Logger } from 'besonders-logger' import classNames from 'classnames' import { createMemo, Show, splitProps, Suspense } from 'solid-js' import { Iconify, PubInfos, ShortID, Spinner } from '../components/mini-components' import { useAgent } from '../data/agent/AgentState' import { onlyFromCurrentAgent } from '../data/lazy-agent' import { upsertSubscription } from '../ipfs/share-sync' import { updateSubFromPullData } from '../ipfs/store-sync' import { doSync, syncState } from '../ipfs/sync-service' import { createAsyncButtonHandler, explorerUrl, notifyToast, useLocationNavigate } from './utils-ui' const { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.DEBUG) // eslint-disable-line unused-imports/no-unused-vars export const PreviewInfoPanel: Component<{ targetThread: Thread matchingSubOrShare: IShare | ISubscription | null previewData: Accessor>> subID?: string refetch: () => void label?: string // slots ExtraButtons?: JSXElement }> = (props) => { const agent = useAgent() // const location = useLocation() // const navigate = useNavigate() // DEBUG('', { subID: props.subID }) const subID = createMemo(() => props.matchingSubOrShare?.id ?? props.subID ?? props.previewData()?.id) const matchingIsShare = createMemo(() => !!props.matchingSubOrShare && isShare(props.matchingSubOrShare)) const matchingSubShareLastCid = createMemo(() => { if (!matchingIsShare()) { return subscriptionPulls(props.targetThread, subID()) } else { const matchingShare = agent.sharesMap.get(subID()) DEBUG({ matchingShare }) return matchingShare?.lastCID } }) const previewIsFullyIntegrated = () => { DEBUG('previewIsFullyIntegrated', { previewData: props.previewData(), matchingSubShareLastCid: matchingSubShareLastCid() }) return props.previewData() && matchingSubShareLastCid() && areCidsEqual(props.previewData().cid, matchingSubShareLastCid()) } const pullSub = async () => { await doSync({ sub: subID() }) props.refetch() } return (
{props.label ?? 'Previewing thread'}: {subID()}
}>
This is {' '} {matchingIsShare() ? 'your share' : 'a subscription in your list'} {' '} }> {/* */} (last {' '} {matchingIsShare() ? 'pushed' : 'integrated'} {' '} CID: {' '} )
{props.ExtraButtons} }> entry.sub?.id === props.matchingSubOrShare.id)} onClick={pullSub} > Pull subscription
) } function subscriptionPulls(targetThread: Thread, subID: EntityID): string { return querySingleAndMap( lastWriteWins(onlyFromCurrentAgent(targetThread)), { en: subID, at: 'subscription/cid' }, 'vl', ).get() as string | undefined } export const SubIntegrateDropdown: Component< DivProps & { subID: CidString previewData: PromiseType> targetThread: Thread isFullyIntegrated: boolean } > = (allProps) => { const [props, restProps] = splitProps(allProps, ['subID', 'targetThread', 'previewData', 'isFullyIntegrated']) const agent = useAgent() const { locnav, location, navigate } = useLocationNavigate() const parsedCID = createMemo(() => tryParseCID(props.subID)) function integrate() { return integratePub({ targetThread: props.targetThread, agentHash: agent.ag, subID: props.previewData.id, pubData: props.previewData }) } const integrateOnceHandlerProps = createAsyncButtonHandler(() => { const integratedLogs = integrate() // props.refetch() // ? why notifyToast(`Successfully integrated ${integratedLogs.length} applogs`, 'success') }) const integrateAndSubHandlerProps = createAsyncButtonHandler(async function integrateOnce() { // if (matchingIsShare()) throw ERROR("shouldn't integrate own share", props) if (parsedCID().errors) throw ERROR('subID has errors', { subID: props.subID, parsed: parsedCID() }) if (!parsedCID().isIpns) throw ERROR('subID is not IPNS', { subID: props.subID, parsed: parsedCID() }) const integratedLogs = integrate() const shareName = (querySingleAndMap(props.previewData.info.logs, { at: 'share/name' }, 'vl').get() || querySingleAndMap(props.previewData.info.logs, { at: 'pub/name' }, 'vl').get()) as string const sub = await upsertSubscription(props.subID as IpnsString, { name: shareName }) updateSubFromPullData(props.previewData, sub.id) notifyToast(`Successfully integrated ${integratedLogs.length} applogs & added subscription`, 'success') navigate(`/settings/subscriptions/${sub.id}`) }) return ( <> Integrate Integrate Once Integrate & Subscribe Add subscription ) }