mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-15 01:01:43 +10:00
Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume
This commit is contained in:
@ -15,11 +15,13 @@ import {
|
||||
import { Button, Separator, Toggle, Tooltip } from "@reactive-resume/ui";
|
||||
import { motion } from "framer-motion";
|
||||
|
||||
import { useToast } from "@/client/hooks/use-toast";
|
||||
import { usePrintResume } from "@/client/services/resume";
|
||||
import { useBuilderStore } from "@/client/stores/builder";
|
||||
import { useResumeStore, useTemporalResumeStore } from "@/client/stores/resume";
|
||||
|
||||
export const BuilderToolbar = () => {
|
||||
const { toast } = useToast();
|
||||
const setValue = useResumeStore((state) => state.setValue);
|
||||
const undo = useTemporalResumeStore((state) => state.undo);
|
||||
const redo = useTemporalResumeStore((state) => state.redo);
|
||||
@ -42,6 +44,17 @@ export const BuilderToolbar = () => {
|
||||
openInNewTab(url);
|
||||
};
|
||||
|
||||
const onCopy = async () => {
|
||||
const { url } = await printResume({ id });
|
||||
await navigator.clipboard.writeText(url);
|
||||
|
||||
toast({
|
||||
variant: "success",
|
||||
title: t`A link has been copied to your clipboard.`,
|
||||
description: t`Anyone with this link can view and download the resume. Share it on your profile or with recruiters.`,
|
||||
});
|
||||
};
|
||||
|
||||
const onZoomIn = () => frameRef?.contentWindow?.postMessage({ type: "ZOOM_IN" }, "*");
|
||||
const onZoomOut = () => frameRef?.contentWindow?.postMessage({ type: "ZOOM_OUT" }, "*");
|
||||
const onResetView = () => frameRef?.contentWindow?.postMessage({ type: "RESET_VIEW" }, "*");
|
||||
@ -117,7 +130,13 @@ export const BuilderToolbar = () => {
|
||||
<Separator orientation="vertical" className="h-9" />
|
||||
|
||||
<Tooltip content={t`Copy Link to Resume`}>
|
||||
<Button size="icon" variant="ghost" className="rounded-none" disabled={!isPublic}>
|
||||
<Button
|
||||
size="icon"
|
||||
variant="ghost"
|
||||
className="rounded-none"
|
||||
onClick={onCopy}
|
||||
disabled={!isPublic}
|
||||
>
|
||||
<LinkSimple />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
|
||||
@ -3,6 +3,8 @@ import {
|
||||
CopySimple,
|
||||
DotsThreeVertical,
|
||||
FolderOpen,
|
||||
Lock,
|
||||
LockOpen,
|
||||
PencilSimple,
|
||||
TrashSimple,
|
||||
} from "@phosphor-icons/react";
|
||||
@ -38,6 +40,7 @@ type Props = {
|
||||
export const ResumeListItem = ({ resume }: Props) => {
|
||||
const navigate = useNavigate();
|
||||
const { open } = useDialog<ResumeDto>("resume");
|
||||
const { open: lockOpen } = useDialog<ResumeDto>("lock");
|
||||
|
||||
const { url } = useResumePreview(resume.id);
|
||||
|
||||
@ -55,6 +58,10 @@ export const ResumeListItem = ({ resume }: Props) => {
|
||||
open("duplicate", { id: "resume", item: resume });
|
||||
};
|
||||
|
||||
const onLockChange = () => {
|
||||
lockOpen(resume.locked ? "update" : "create", { id: "lock", item: resume });
|
||||
};
|
||||
|
||||
const onDelete = () => {
|
||||
open("delete", { id: "resume", item: resume });
|
||||
};
|
||||
@ -94,6 +101,27 @@ export const ResumeListItem = ({ resume }: Props) => {
|
||||
<CopySimple size={14} className="mr-2" />
|
||||
{t`Duplicate`}
|
||||
</DropdownMenuItem>
|
||||
{resume.locked ? (
|
||||
<DropdownMenuItem
|
||||
onClick={(event) => {
|
||||
event.stopPropagation();
|
||||
onLockChange();
|
||||
}}
|
||||
>
|
||||
<LockOpen size={14} className="mr-2" />
|
||||
{t`Unlock`}
|
||||
</DropdownMenuItem>
|
||||
) : (
|
||||
<DropdownMenuItem
|
||||
onClick={(event) => {
|
||||
event.stopPropagation();
|
||||
onLockChange();
|
||||
}}
|
||||
>
|
||||
<Lock size={14} className="mr-2" />
|
||||
{t`Lock`}
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
<ContextMenuSeparator />
|
||||
<DropdownMenuItem
|
||||
className="text-error"
|
||||
@ -153,6 +181,17 @@ export const ResumeListItem = ({ resume }: Props) => {
|
||||
<CopySimple size={14} className="mr-2" />
|
||||
{t`Duplicate`}
|
||||
</ContextMenuItem>
|
||||
{resume.locked ? (
|
||||
<ContextMenuItem onClick={onLockChange}>
|
||||
<LockOpen size={14} className="mr-2" />
|
||||
{t`Unlock`}
|
||||
</ContextMenuItem>
|
||||
) : (
|
||||
<ContextMenuItem onClick={onLockChange}>
|
||||
<Lock size={14} className="mr-2" />
|
||||
{t`Lock`}
|
||||
</ContextMenuItem>
|
||||
)}
|
||||
<ContextMenuSeparator />
|
||||
<ContextMenuItem onClick={onDelete} className="text-error">
|
||||
<TrashSimple size={14} className="mr-2" />
|
||||
|
||||
@ -147,7 +147,7 @@ export class JsonResumeParser implements Parser<Json, JsonResume> {
|
||||
result.sections.certifications.items.push({
|
||||
...defaultCertification,
|
||||
id: createId(),
|
||||
name: certificate.title ?? "",
|
||||
name: certificate.name ?? "",
|
||||
date: certificate.date ?? "",
|
||||
issuer: certificate.issuer ?? "",
|
||||
summary: certificate.summary ?? "",
|
||||
|
||||
@ -63,7 +63,7 @@ const awardsSchema = z.object({
|
||||
});
|
||||
|
||||
const certificatesSchema = z.object({
|
||||
title: z.string().optional(),
|
||||
name: z.string().optional(),
|
||||
date: iso8601.optional(),
|
||||
issuer: z.string().optional(),
|
||||
summary: z.string().optional(),
|
||||
|
||||
Reference in New Issue
Block a user