One Calendar is a privacy-first calendar web app built with Next.js. It has modern security features, including e2ee, password-protected sharing, and self-destructing share links ๐Ÿ“… calendar.xyehr.cn

Merge pull request #174 from EvanTechDev/feature/add-help-button-with-dropdown-menu

Add top-bar help dropdown and move status/legal links from profile menu

authored by

Evan Huang and committed by
GitHub
d0ed5768 f11f912c

+43 -20
+43
components/app/calendar.tsx
··· 22 22 CheckCircle2, 23 23 AlertCircle, 24 24 Loader2, 25 + CircleHelp, 26 + ShieldCheck, 27 + MessageSquare, 28 + FileText, 29 + ScrollText, 25 30 } from "lucide-react"; 26 31 import dynamic from "next/dynamic"; 27 32 import { ··· 46 51 import { Input } from "@/components/ui/input"; 47 52 import { cn } from "@/lib/utils"; 48 53 import { toast } from "sonner"; 54 + import { 55 + DropdownMenu, 56 + DropdownMenuContent, 57 + DropdownMenuItem, 58 + DropdownMenuTrigger, 59 + } from "@/components/ui/dropdown-menu"; 49 60 import { 50 61 AlertDialog, 51 62 AlertDialogAction, ··· 762 773 {backupStatusIcon ?? <CloudUpload className="h-4 w-4" />} 763 774 </div> 764 775 ) : null} 776 + <DropdownMenu> 777 + <DropdownMenuTrigger asChild> 778 + <Button 779 + variant="outline" 780 + size="icon" 781 + className="rounded-full h-8 w-8" 782 + aria-label="Help" 783 + > 784 + <CircleHelp className="h-4 w-4" /> 785 + </Button> 786 + </DropdownMenuTrigger> 787 + <DropdownMenuContent align="end"> 788 + <DropdownMenuItem onClick={() => window.open("https://calendarstatus.xyehr.cn", "_blank", "noopener,noreferrer")}> 789 + <ShieldCheck className="mr-2 h-4 w-4" /> 790 + {t.status} 791 + </DropdownMenuItem> 792 + <DropdownMenuItem onClick={() => { 793 + window.location.href = "mailto:evan.huang000@proton.me"; 794 + }}> 795 + <MessageSquare className="mr-2 h-4 w-4" /> 796 + {t.feedback} 797 + </DropdownMenuItem> 798 + <DropdownMenuItem onClick={() => router.push("/privacy")}> 799 + <FileText className="mr-2 h-4 w-4" /> 800 + {t.privacy} 801 + </DropdownMenuItem> 802 + <DropdownMenuItem onClick={() => router.push("/terms")}> 803 + <ScrollText className="mr-2 h-4 w-4" /> 804 + {t.tos} 805 + </DropdownMenuItem> 806 + </DropdownMenuContent> 807 + </DropdownMenu> 765 808 <UserProfileButton 766 809 variant="outline" 767 810 className="rounded-full h-8 w-8"
-20
components/app/profile/user-profile-button.tsx
··· 14 14 Camera, 15 15 BarChart2, 16 16 Settings, 17 - ShieldCheck, 18 - MessageSquare, 19 - FileText, 20 - ScrollText, 21 17 } from "lucide-react" 22 18 import { Button } from "@/components/ui/button" 23 19 import { ··· 557 553 <DropdownMenuItem onClick={() => onNavigateToView?.("analytics")}> 558 554 <BarChart2 className="mr-2 h-4 w-4" /> 559 555 {t.analytics} 560 - </DropdownMenuItem> 561 - <DropdownMenuItem onClick={() => window.open("https://calendarstatus.xyehr.cn", "_blank", "noopener,noreferrer")}> 562 - <ShieldCheck className="mr-2 h-4 w-4" /> 563 - {t.status} 564 - </DropdownMenuItem> 565 - <DropdownMenuItem onClick={() => window.location.href = "mailto:evan.huang000@proton.me"}> 566 - <MessageSquare className="mr-2 h-4 w-4" /> 567 - {t.feedback} 568 - </DropdownMenuItem> 569 - <DropdownMenuItem onClick={() => router.push("/privacy")}> 570 - <FileText className="mr-2 h-4 w-4" /> 571 - {t.privacy} 572 - </DropdownMenuItem> 573 - <DropdownMenuItem onClick={() => router.push("/terms")}> 574 - <ScrollText className="mr-2 h-4 w-4" /> 575 - {t.tos} 576 556 </DropdownMenuItem> 577 557 </DropdownMenuContent> 578 558 </DropdownMenu>