Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ type FormValues = z.infer<typeof formSchema>;
export function AddAttestationDialog({
recipient,
children,
preselectedBadge,
}: {
recipient: string;
children: React.ReactElement;
preselectedBadge?: string;
}) {
const [open, setOpen] = useState(false);
const [errorDisplayText, setErrorDisplayText] = useState<string | null>(null);
Expand All @@ -63,7 +65,7 @@ export function AddAttestationDialog({

const form = useForm<FormValues>({
resolver: zodResolver(formSchema),
defaultValues: { badgeName: "", justification: "" },
defaultValues: { badgeName: preselectedBadge || "", justification: "" },
});

const onSubmit = async (values: FormValues) => {
Expand Down Expand Up @@ -107,6 +109,12 @@ export function AddAttestationDialog({
reset,
]);

useEffect(() => {
if (open && preselectedBadge) {
form.setValue("badgeName", preselectedBadge);
}
}, [open, preselectedBadge, form]);

return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>{children}</DialogTrigger>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Award, Badge } from "lucide-react";
import { Award, Badge, Plus } from "lucide-react";
import { useGetAttestations } from "@/hooks/attestations/use-get-attestations";
import { useMemo } from "react";
import {
Expand All @@ -9,10 +9,18 @@ import {
} from "@/components/ui/accordion";
import { useGetProfiles } from "@/hooks/profiles/use-get-profiles";
import CopyAddressToClipboard from "@/components/CopyAddressToClipboard";
import { AddAttestationDialog } from "@/components/profiles/action-buttons/AddAttestationDialog";
import { Button } from "@/components/ui/button";
import { useAccount } from "wagmi";

export function ProfileAttestations({ address }: { address: string }) {
const attestationsQuery = useGetAttestations();
const profilesQuery = useGetProfiles();
const { address: connectedAddress } = useAccount();
const isOwner =
!!connectedAddress &&
!!address &&
connectedAddress.toLowerCase() === address.toLowerCase();

const attestations = useMemo(() => {
const list = attestationsQuery.data ?? [];
Expand Down Expand Up @@ -74,6 +82,24 @@ export function ProfileAttestations({ address }: { address: string }) {
<span className="text-sm text-gray-600">
({items.length})
</span>
{!isOwner && connectedAddress && badgeName && (
<AddAttestationDialog
recipient={address}
preselectedBadge={badgeName}
>
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 ml-2"
onClick={(e) => {
e.stopPropagation();
}}
aria-label="Add attestation for this badge"
>
<Plus className="h-3 w-3" />
</Button>
</AddAttestationDialog>
)}
</div>
</AccordionTrigger>
<AccordionContent>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Send, Badge } from "lucide-react";
import { Send, Badge, Plus } from "lucide-react";
import { useGetAttestations } from "@/hooks/attestations/use-get-attestations";
import { useMemo } from "react";
import {
Expand All @@ -8,10 +8,18 @@ import {
AccordionTrigger,
} from "@/components/ui/accordion";
import { useGetProfiles } from "@/hooks/profiles/use-get-profiles";
import { AddAttestationDialog } from "@/components/profiles/action-buttons/AddAttestationDialog";
import { Button } from "@/components/ui/button";
import { useAccount } from "wagmi";

export function ProfileIssuedAttestations({ address }: { address: string }) {
const attestationsQuery = useGetAttestations();
const profilesQuery = useGetProfiles();
const { address: connectedAddress } = useAccount();
const isOwner =
!!connectedAddress &&
!!address &&
connectedAddress.toLowerCase() === address.toLowerCase();

const issuedAttestations = useMemo(() => {
const list = attestationsQuery.data ?? [];
Expand Down Expand Up @@ -74,6 +82,24 @@ export function ProfileIssuedAttestations({ address }: { address: string }) {
<span className="text-sm text-gray-600">
({items.length})
</span>
{!isOwner && connectedAddress && badgeName && (
<AddAttestationDialog
recipient={address}
preselectedBadge={badgeName}
>
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 ml-2"
onClick={(e) => {
e.stopPropagation();
}}
aria-label="Add attestation for this badge"
>
<Plus className="h-3 w-3" />
</Button>
</AddAttestationDialog>
)}
</div>
</AccordionTrigger>
<AccordionContent>
Expand Down
Loading