Restore TrustCenter reference hooks in console
Keep GraphQL-aligned TrustCenterReferenceGraph naming, drop the unused domain redirect route, and tighten related compliance page UI review nits around magic-link navigation and links. Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
@@ -27,8 +27,6 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { graphql, useFragment } from "react-relay";
|
import { graphql, useFragment } from "react-relay";
|
||||||
import { Link as RouterLink, useLocation } from "react-router";
|
import { Link as RouterLink, useLocation } from "react-router";
|
||||||
|
|
||||||
import { buildRequestAllContinueUrl } from "#/lib/auth/continueUrl";
|
|
||||||
|
|
||||||
import type { TopBar_query$key } from "./__generated__/TopBar_query.graphql";
|
import type { TopBar_query$key } from "./__generated__/TopBar_query.graphql";
|
||||||
import { TOP_BAR_NAV_ITEMS } from "./navItems";
|
import { TOP_BAR_NAV_ITEMS } from "./navItems";
|
||||||
import { TopBarMobileNav } from "./TopBarMobileNav";
|
import { TopBarMobileNav } from "./TopBarMobileNav";
|
||||||
@@ -59,7 +57,9 @@ function isActive(pathname: string, to: string): boolean {
|
|||||||
export function TopBar({ queryKey }: TopBarProps) {
|
export function TopBar({ queryKey }: TopBarProps) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const data = useFragment(topBarFragment, queryKey);
|
const data = useFragment(topBarFragment, queryKey);
|
||||||
const { pathname } = useLocation();
|
const location = useLocation();
|
||||||
|
const { pathname } = location;
|
||||||
|
|
||||||
const { currentTrustCenter } = data;
|
const { currentTrustCenter } = data;
|
||||||
const title = currentTrustCenter.title;
|
const title = currentTrustCenter.title;
|
||||||
const logoUrl = currentTrustCenter.themedLogoUrl ?? undefined;
|
const logoUrl = currentTrustCenter.themedLogoUrl ?? undefined;
|
||||||
@@ -116,7 +116,7 @@ export function TopBar({ queryKey }: TopBarProps) {
|
|||||||
);
|
);
|
||||||
initiateURL.searchParams.set(
|
initiateURL.searchParams.set(
|
||||||
"continue",
|
"continue",
|
||||||
buildRequestAllContinueUrl(),
|
location.pathname + location.search + location.hash,
|
||||||
);
|
);
|
||||||
window.location.href = initiateURL.toString();
|
window.location.href = initiateURL.toString();
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ import { z } from "zod";
|
|||||||
|
|
||||||
import type { CompliancePageReferenceListItemFragment$data } from "#/__generated__/core/CompliancePageReferenceListItemFragment.graphql";
|
import type { CompliancePageReferenceListItemFragment$data } from "#/__generated__/core/CompliancePageReferenceListItemFragment.graphql";
|
||||||
import {
|
import {
|
||||||
useCreateCompliancePageReferenceMutation,
|
useCreateTrustCenterReferenceMutation,
|
||||||
useUpdateCompliancePageReferenceMutation,
|
useUpdateTrustCenterReferenceMutation,
|
||||||
} from "#/hooks/graph/CompliancePageReferenceGraph";
|
} from "#/hooks/graph/TrustCenterReferenceGraph";
|
||||||
import { useFormWithSchema } from "#/hooks/useFormWithSchema";
|
import { useFormWithSchema } from "#/hooks/useFormWithSchema";
|
||||||
|
|
||||||
const referenceSchema = z.object({
|
const referenceSchema = z.object({
|
||||||
@@ -65,8 +65,8 @@ export const CompliancePageReferenceDialog = forwardRef<CompliancePageReferenceD
|
|||||||
const [editReference, setEditReference] = useState<CompliancePageReferenceListItemFragment$data | null>(null);
|
const [editReference, setEditReference] = useState<CompliancePageReferenceListItemFragment$data | null>(null);
|
||||||
const [uploadedFile, setUploadedFile] = useState<File | null>(null);
|
const [uploadedFile, setUploadedFile] = useState<File | null>(null);
|
||||||
|
|
||||||
const [createReference, isCreating] = useCreateCompliancePageReferenceMutation();
|
const [createReference, isCreating] = useCreateTrustCenterReferenceMutation();
|
||||||
const [updateReference, isUpdating] = useUpdateCompliancePageReferenceMutation();
|
const [updateReference, isUpdating] = useUpdateTrustCenterReferenceMutation();
|
||||||
|
|
||||||
const { register, handleSubmit, formState: { errors }, reset } = useFormWithSchema(
|
const { register, handleSubmit, formState: { errors }, reset } = useFormWithSchema(
|
||||||
referenceSchema,
|
referenceSchema,
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ import {
|
|||||||
useDialogRef,
|
useDialogRef,
|
||||||
} from "@probo/ui";
|
} from "@probo/ui";
|
||||||
|
|
||||||
import type { CompliancePageReferenceGraphDeleteMutation } from "#/__generated__/core/CompliancePageReferenceGraphDeleteMutation.graphql";
|
import type { TrustCenterReferenceGraphDeleteMutation } from "#/__generated__/core/TrustCenterReferenceGraphDeleteMutation.graphql";
|
||||||
import { deleteCompliancePageReferenceMutation } from "#/hooks/graph/CompliancePageReferenceGraph";
|
import { deleteTrustCenterReferenceMutation } from "#/hooks/graph/TrustCenterReferenceGraph";
|
||||||
import { useMutation } from "#/lib/relay/useMutation";
|
import { useMutation } from "#/lib/relay/useMutation";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@@ -52,8 +52,8 @@ export function DeleteCompliancePageReferenceDialog({
|
|||||||
const { __ } = useTranslate();
|
const { __ } = useTranslate();
|
||||||
const ref = useDialogRef();
|
const ref = useDialogRef();
|
||||||
|
|
||||||
const [mutate, isDeleting] = useMutation<CompliancePageReferenceGraphDeleteMutation>(
|
const [mutate, isDeleting] = useMutation<TrustCenterReferenceGraphDeleteMutation>(
|
||||||
deleteCompliancePageReferenceMutation,
|
deleteTrustCenterReferenceMutation,
|
||||||
{
|
{
|
||||||
successMessage: __("Reference deleted successfully"),
|
successMessage: __("Reference deleted successfully"),
|
||||||
errorToast: __("Failed to delete reference"),
|
errorToast: __("Failed to delete reference"),
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
|
|
||||||
import { graphql } from "react-relay";
|
import { graphql } from "react-relay";
|
||||||
|
|
||||||
import type { CompliancePageReferenceGraphCreateMutation } from "#/__generated__/core/CompliancePageReferenceGraphCreateMutation.graphql";
|
import type { TrustCenterReferenceGraphCreateMutation } from "#/__generated__/core/TrustCenterReferenceGraphCreateMutation.graphql";
|
||||||
import type { CompliancePageReferenceGraphDeleteMutation } from "#/__generated__/core/CompliancePageReferenceGraphDeleteMutation.graphql";
|
import type { TrustCenterReferenceGraphDeleteMutation } from "#/__generated__/core/TrustCenterReferenceGraphDeleteMutation.graphql";
|
||||||
import type { CompliancePageReferenceGraphUpdateMutation } from "#/__generated__/core/CompliancePageReferenceGraphUpdateMutation.graphql";
|
import type { TrustCenterReferenceGraphUpdateMutation } from "#/__generated__/core/TrustCenterReferenceGraphUpdateMutation.graphql";
|
||||||
import type { CompliancePageReferenceGraphUpdateRankMutation } from "#/__generated__/core/CompliancePageReferenceGraphUpdateRankMutation.graphql";
|
import type { TrustCenterReferenceGraphUpdateRankMutation } from "#/__generated__/core/TrustCenterReferenceGraphUpdateRankMutation.graphql";
|
||||||
import { useMutation } from "#/lib/relay/useMutation";
|
import { useMutation } from "#/lib/relay/useMutation";
|
||||||
|
|
||||||
export const createCompliancePageReferenceMutation = graphql`
|
export const createTrustCenterReferenceMutation = graphql`
|
||||||
mutation CompliancePageReferenceGraphCreateMutation(
|
mutation TrustCenterReferenceGraphCreateMutation(
|
||||||
$input: CreateTrustCenterReferenceInput!
|
$input: CreateTrustCenterReferenceInput!
|
||||||
$connections: [ID!]!
|
$connections: [ID!]!
|
||||||
) {
|
) {
|
||||||
@@ -47,8 +47,8 @@ export const createCompliancePageReferenceMutation = graphql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const updateCompliancePageReferenceMutation = graphql`
|
export const updateTrustCenterReferenceMutation = graphql`
|
||||||
mutation CompliancePageReferenceGraphUpdateMutation(
|
mutation TrustCenterReferenceGraphUpdateMutation(
|
||||||
$input: UpdateTrustCenterReferenceInput!
|
$input: UpdateTrustCenterReferenceInput!
|
||||||
) {
|
) {
|
||||||
updateTrustCenterReference(input: $input) {
|
updateTrustCenterReference(input: $input) {
|
||||||
@@ -70,8 +70,8 @@ export const updateCompliancePageReferenceMutation = graphql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const deleteCompliancePageReferenceMutation = graphql`
|
export const deleteTrustCenterReferenceMutation = graphql`
|
||||||
mutation CompliancePageReferenceGraphDeleteMutation(
|
mutation TrustCenterReferenceGraphDeleteMutation(
|
||||||
$input: DeleteTrustCenterReferenceInput!
|
$input: DeleteTrustCenterReferenceInput!
|
||||||
$connections: [ID!]!
|
$connections: [ID!]!
|
||||||
) {
|
) {
|
||||||
@@ -81,9 +81,9 @@ export const deleteCompliancePageReferenceMutation = graphql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export function useCreateCompliancePageReferenceMutation() {
|
export function useCreateTrustCenterReferenceMutation() {
|
||||||
return useMutation<CompliancePageReferenceGraphCreateMutation>(
|
return useMutation<TrustCenterReferenceGraphCreateMutation>(
|
||||||
createCompliancePageReferenceMutation,
|
createTrustCenterReferenceMutation,
|
||||||
{
|
{
|
||||||
successMessage: "Reference created successfully",
|
successMessage: "Reference created successfully",
|
||||||
errorToast: "Failed to create reference",
|
errorToast: "Failed to create reference",
|
||||||
@@ -91,9 +91,9 @@ export function useCreateCompliancePageReferenceMutation() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useUpdateCompliancePageReferenceMutation() {
|
export function useUpdateTrustCenterReferenceMutation() {
|
||||||
return useMutation<CompliancePageReferenceGraphUpdateMutation>(
|
return useMutation<TrustCenterReferenceGraphUpdateMutation>(
|
||||||
updateCompliancePageReferenceMutation,
|
updateTrustCenterReferenceMutation,
|
||||||
{
|
{
|
||||||
successMessage: "Reference updated successfully",
|
successMessage: "Reference updated successfully",
|
||||||
errorToast: "Failed to update reference",
|
errorToast: "Failed to update reference",
|
||||||
@@ -101,8 +101,8 @@ export function useUpdateCompliancePageReferenceMutation() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const updateCompliancePageReferenceRankMutation = graphql`
|
export const updateTrustCenterReferenceRankMutation = graphql`
|
||||||
mutation CompliancePageReferenceGraphUpdateRankMutation(
|
mutation TrustCenterReferenceGraphUpdateRankMutation(
|
||||||
$input: UpdateTrustCenterReferenceInput!
|
$input: UpdateTrustCenterReferenceInput!
|
||||||
) {
|
) {
|
||||||
updateTrustCenterReference(input: $input) {
|
updateTrustCenterReference(input: $input) {
|
||||||
@@ -114,9 +114,9 @@ export const updateCompliancePageReferenceRankMutation = graphql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export function useUpdateCompliancePageReferenceRankMutation() {
|
export function useUpdateTrustCenterReferenceRankMutation() {
|
||||||
return useMutation<CompliancePageReferenceGraphUpdateRankMutation>(
|
return useMutation<TrustCenterReferenceGraphUpdateRankMutation>(
|
||||||
updateCompliancePageReferenceRankMutation,
|
updateTrustCenterReferenceRankMutation,
|
||||||
{
|
{
|
||||||
successMessage: "Order updated successfully",
|
successMessage: "Order updated successfully",
|
||||||
errorToast: "Failed to update order",
|
errorToast: "Failed to update order",
|
||||||
@@ -124,9 +124,9 @@ export function useUpdateCompliancePageReferenceRankMutation() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useDeleteCompliancePageReferenceMutation() {
|
export function useDeleteTrustCenterReferenceMutation() {
|
||||||
return useMutation<CompliancePageReferenceGraphDeleteMutation>(
|
return useMutation<TrustCenterReferenceGraphDeleteMutation>(
|
||||||
deleteCompliancePageReferenceMutation,
|
deleteTrustCenterReferenceMutation,
|
||||||
{
|
{
|
||||||
successMessage: "Reference deleted successfully",
|
successMessage: "Reference deleted successfully",
|
||||||
errorToast: "Failed to delete reference",
|
errorToast: "Failed to delete reference",
|
||||||
@@ -35,9 +35,9 @@ export default function MagicLinkAlreadyUsedPage() {
|
|||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
className="w-full h-10"
|
className="w-full h-10"
|
||||||
onClick={() => void navigate(-1)}
|
onClick={() => void navigate("/auth/login")}
|
||||||
>
|
>
|
||||||
{__("Go back")}
|
{__("Sign in")}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ export default function MagicLinkExpiredPage() {
|
|||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
className="w-full h-10"
|
className="w-full h-10"
|
||||||
onClick={() => void navigate(-1)}
|
onClick={() => void navigate("/auth/login")}
|
||||||
>
|
>
|
||||||
{__("Go back")}
|
{__("Sign in")}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ export const CompliancePageCustomLinkDialog = forwardRef<CompliancePageCustomLin
|
|||||||
error={errors.url?.message}
|
error={errors.url?.message}
|
||||||
/>
|
/>
|
||||||
<Field
|
<Field
|
||||||
{...register("name")}
|
{...register("name", { onChange: () => setNameAutoDetected(false) })}
|
||||||
label={__("Name")}
|
label={__("Name")}
|
||||||
type="text"
|
type="text"
|
||||||
required
|
required
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const compliancePageFragment = graphql`
|
|||||||
fragment CompliancePageCustomLinkList_compliancePageFragment on TrustCenter
|
fragment CompliancePageCustomLinkList_compliancePageFragment on TrustCenter
|
||||||
@refetchable(queryName: "CompliancePageCustomLinkList_compliancePageRefetchQuery")
|
@refetchable(queryName: "CompliancePageCustomLinkList_compliancePageRefetchQuery")
|
||||||
@argumentDefinitions(
|
@argumentDefinitions(
|
||||||
first: { type: Int, defaultValue: 100 }
|
first: { type: Int, defaultValue: 500 }
|
||||||
after: { type: CursorKey, defaultValue: null }
|
after: { type: CursorKey, defaultValue: null }
|
||||||
order: { type: ComplianceCustomLinkOrder, defaultValue: { field: RANK, direction: ASC } }
|
order: { type: ComplianceCustomLinkOrder, defaultValue: { field: RANK, direction: ASC } }
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -62,18 +62,12 @@ export function CompliancePageDomainsSection(props: {
|
|||||||
|
|
||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{defaultDomain && (
|
{defaultDomain && (
|
||||||
<CompliancePageDomainCard
|
<CompliancePageDomainCard fKey={defaultDomain} />
|
||||||
fKey={defaultDomain}
|
|
||||||
compliancePageId={compliancePageId}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{customDomain
|
{customDomain
|
||||||
? (
|
? (
|
||||||
<CompliancePageDomainCard
|
<CompliancePageDomainCard fKey={customDomain} />
|
||||||
fKey={customDomain}
|
|
||||||
compliancePageId={compliancePageId}
|
|
||||||
/>
|
|
||||||
)
|
)
|
||||||
: organization.canCreateCustomDomain && (
|
: organization.canCreateCustomDomain && (
|
||||||
<div className="flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border-solid px-4 py-8">
|
<div className="flex flex-col items-center justify-center gap-3 rounded-lg border border-dashed border-border-solid px-4 py-8">
|
||||||
|
|||||||
@@ -46,9 +46,8 @@ const fragment = graphql`
|
|||||||
|
|
||||||
export function CompliancePageDomainCard(props: {
|
export function CompliancePageDomainCard(props: {
|
||||||
fKey: CompliancePageDomainCardFragment$key;
|
fKey: CompliancePageDomainCardFragment$key;
|
||||||
compliancePageId: string;
|
|
||||||
}) {
|
}) {
|
||||||
const { fKey, compliancePageId } = props;
|
const { fKey } = props;
|
||||||
|
|
||||||
const { __ } = useTranslate();
|
const { __ } = useTranslate();
|
||||||
|
|
||||||
@@ -85,7 +84,6 @@ export function CompliancePageDomainCard(props: {
|
|||||||
<DeleteCompliancePageDomainDialog
|
<DeleteCompliancePageDomainDialog
|
||||||
domain={domain.domain}
|
domain={domain.domain}
|
||||||
customDomainId={domain.id}
|
customDomainId={domain.id}
|
||||||
compliancePageId={compliancePageId}
|
|
||||||
>
|
>
|
||||||
<Button variant="danger">{__("Delete")}</Button>
|
<Button variant="danger">{__("Delete")}</Button>
|
||||||
</DeleteCompliancePageDomainDialog>
|
</DeleteCompliancePageDomainDialog>
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ const deleteCustomDomainMutation = graphql`
|
|||||||
type DeleteCompliancePageDomainDialogProps = PropsWithChildren<{
|
type DeleteCompliancePageDomainDialogProps = PropsWithChildren<{
|
||||||
domain: string;
|
domain: string;
|
||||||
customDomainId: string;
|
customDomainId: string;
|
||||||
compliancePageId: string;
|
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export function DeleteCompliancePageDomainDialog(props: DeleteCompliancePageDomainDialogProps) {
|
export function DeleteCompliancePageDomainDialog(props: DeleteCompliancePageDomainDialogProps) {
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ const createCustomDomainMutation = graphql`
|
|||||||
customDomain {
|
customDomain {
|
||||||
id
|
id
|
||||||
domain
|
domain
|
||||||
managed
|
|
||||||
sslStatus
|
sslStatus
|
||||||
dnsRecords {
|
dnsRecords {
|
||||||
type
|
type
|
||||||
@@ -156,7 +155,7 @@ export function NewCompliancePageDomainDialog(props: PropsWithChildren<{ complia
|
|||||||
<strong>{__("Examples:")}</strong>
|
<strong>{__("Examples:")}</strong>
|
||||||
{" "}
|
{" "}
|
||||||
compliance.example.com,
|
compliance.example.com,
|
||||||
compliance.example.com
|
trust.example.com
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import { graphql } from "relay-runtime";
|
|||||||
import type { CompliancePageReferenceListFragment$key } from "#/__generated__/core/CompliancePageReferenceListFragment.graphql";
|
import type { CompliancePageReferenceListFragment$key } from "#/__generated__/core/CompliancePageReferenceListFragment.graphql";
|
||||||
import type { CompliancePageReferenceListItemFragment$data } from "#/__generated__/core/CompliancePageReferenceListItemFragment.graphql";
|
import type { CompliancePageReferenceListItemFragment$data } from "#/__generated__/core/CompliancePageReferenceListItemFragment.graphql";
|
||||||
import type { CompliancePageReferenceListQuery } from "#/__generated__/core/CompliancePageReferenceListQuery.graphql";
|
import type { CompliancePageReferenceListQuery } from "#/__generated__/core/CompliancePageReferenceListQuery.graphql";
|
||||||
import { useUpdateCompliancePageReferenceRankMutation } from "#/hooks/graph/CompliancePageReferenceGraph";
|
import { useUpdateTrustCenterReferenceRankMutation } from "#/hooks/graph/TrustCenterReferenceGraph";
|
||||||
|
|
||||||
import { CompliancePageReferenceListItem } from "./CompliancePageReferenceListItem";
|
import { CompliancePageReferenceListItem } from "./CompliancePageReferenceListItem";
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ export function CompliancePageReferenceList(props: {
|
|||||||
CompliancePageReferenceListQuery,
|
CompliancePageReferenceListQuery,
|
||||||
CompliancePageReferenceListFragment$key
|
CompliancePageReferenceListFragment$key
|
||||||
>(fragment, fragmentRef);
|
>(fragment, fragmentRef);
|
||||||
const [updateRank] = useUpdateCompliancePageReferenceRankMutation();
|
const [updateRank] = useUpdateTrustCenterReferenceRankMutation();
|
||||||
|
|
||||||
const [draggedIndex, setDraggedIndex] = useState<number | null>(null);
|
const [draggedIndex, setDraggedIndex] = useState<number | null>(null);
|
||||||
const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);
|
const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
|
|
||||||
import { lazy } from "@probo/react-lazy";
|
import { lazy } from "@probo/react-lazy";
|
||||||
import { redirect } from "react-router";
|
|
||||||
|
|
||||||
import { LinkCardSkeleton } from "#/components/skeletons/LinkCardSkeleton";
|
import { LinkCardSkeleton } from "#/components/skeletons/LinkCardSkeleton";
|
||||||
import { PageSkeleton } from "#/components/skeletons/PageSkeleton";
|
import { PageSkeleton } from "#/components/skeletons/PageSkeleton";
|
||||||
@@ -35,12 +34,6 @@ export const compliancePageRoutes = [
|
|||||||
Fallback: LinkCardSkeleton,
|
Fallback: LinkCardSkeleton,
|
||||||
Component: lazy(() => import("#/pages/organizations/compliance-page/overview/CompliancePageOverviewPageLoader")),
|
Component: lazy(() => import("#/pages/organizations/compliance-page/overview/CompliancePageOverviewPageLoader")),
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: "domain",
|
|
||||||
loader: () => {
|
|
||||||
throw redirect("brand");
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: "brand",
|
path: "brand",
|
||||||
Fallback: LinkCardSkeleton,
|
Fallback: LinkCardSkeleton,
|
||||||
|
|||||||
Reference in New Issue
Block a user