diff --git a/src/components/status-action-bar.tsx b/src/components/status-action-bar.tsx index 2d7628fd3..31136b4d9 100644 --- a/src/components/status-action-bar.tsx +++ b/src/components/status-action-bar.tsx @@ -401,7 +401,6 @@ const StatusActionBar: React.FC = ({ const ownAccount = status.account.id === me; const username = status.account.username; const account = status.account; - const domain = account.fqn.split('@')[1]; const menu: Menu = []; @@ -455,6 +454,7 @@ const StatusActionBar: React.FC = ({ } if (features.federating && !account.local) { + const { hostname: domain } = new URL(status.uri); menu.push({ text: intl.formatMessage(messages.external, { domain }), action: handleExternalClick, diff --git a/src/entity-store/hooks/useEntityLookup.ts b/src/entity-store/hooks/useEntityLookup.ts index a54882d6f..3ae97b704 100644 --- a/src/entity-store/hooks/useEntityLookup.ts +++ b/src/entity-store/hooks/useEntityLookup.ts @@ -25,10 +25,11 @@ function useEntityLookup( const { schema = z.custom() } = opts; const dispatch = useAppDispatch(); + const [fetchedEntity, setFetchedEntity] = useState(); const [isFetching, setPromise] = useLoading(true); const [error, setError] = useState(); - const entity = useAppSelector(state => findEntity(state, entityType, lookupFn)); + const entity = useAppSelector(state => findEntity(state, entityType, lookupFn) ?? fetchedEntity); const isEnabled = opts.enabled ?? true; const isLoading = isFetching && !entity; @@ -36,6 +37,7 @@ function useEntityLookup( try { const response = await setPromise(entityFn()); const entity = schema.parse(response.data); + setFetchedEntity(entity); dispatch(importEntities([entity], entityType)); } catch (e) { setError(e); diff --git a/src/features/nostr/Bech32Redirect.tsx b/src/features/nostr/Bech32Redirect.tsx new file mode 100644 index 000000000..4c9fdb16b --- /dev/null +++ b/src/features/nostr/Bech32Redirect.tsx @@ -0,0 +1,34 @@ +import { nip19 } from 'nostr-tools'; +import React from 'react'; +import { Redirect } from 'react-router-dom'; + +import MissingIndicator from 'soapbox/components/missing-indicator'; + +interface INIP19Redirect { + params: { + bech32: string; + }; +} + +const Bech32Redirect: React.FC = ({ params }) => { + try { + const result = nip19.decode(params.bech32); + + switch (result.type) { + case 'npub': + case 'nprofile': + return ; + case 'note': + return ; + case 'nevent': + return ; + default: + return ; + } + + } catch (e) { + return ; + } +}; + +export default Bech32Redirect; \ No newline at end of file diff --git a/src/features/ui/index.tsx b/src/features/ui/index.tsx index 5574196ab..dee1f3c56 100644 --- a/src/features/ui/index.tsx +++ b/src/features/ui/index.tsx @@ -140,6 +140,7 @@ import { EditIdentity, Domains, NostrRelays, + Bech32Redirect, } from './util/async-components'; import GlobalHotkeys from './util/global-hotkeys'; import { WrappedRoute } from './util/react-router-helpers'; @@ -284,6 +285,7 @@ const SwitchingColumnsArea: React.FC = ({ children }) => {features.events && } {features.events && } + {features.groups && } {features.groupsDiscovery && } @@ -361,6 +363,8 @@ const SwitchingColumnsArea: React.FC = ({ children }) => + + ); diff --git a/src/features/ui/util/async-components.ts b/src/features/ui/util/async-components.ts index c9fae695d..9d90afe95 100644 --- a/src/features/ui/util/async-components.ts +++ b/src/features/ui/util/async-components.ts @@ -170,4 +170,5 @@ export const SelectBookmarkFolderModal = lazy(() => import('soapbox/features/ui/ export const EditIdentity = lazy(() => import('soapbox/features/edit-identity')); export const Domains = lazy(() => import('soapbox/features/admin/domains')); export const EditDomainModal = lazy(() => import('soapbox/features/ui/components/modals/edit-domain-modal')); -export const NostrRelays = lazy(() => import('soapbox/features/nostr-relays')); \ No newline at end of file +export const NostrRelays = lazy(() => import('soapbox/features/nostr-relays')); +export const Bech32Redirect = lazy(() => import('soapbox/features/nostr/Bech32Redirect')); \ No newline at end of file