added padding bottom

This commit is contained in:
zmeyer44 2023-10-22 16:56:34 -04:00
parent 69d96cdefc
commit ee9edc466e
6 changed files with 172 additions and 5 deletions

View File

@ -51,7 +51,7 @@ export default function LandingPage() {
}}
/>
</div>
<div className="overflow-hidden">
<div className="overflow-hidden pb-20">
<div className="mx-auto max-w-7xl px-6 pb-32 pt-16 sm:pt-40 lg:px-8 lg:pt-16">
<div className="mx-auto max-w-2xl gap-x-14 lg:mx-0 lg:flex lg:max-w-none lg:items-center">
<div className="w-full max-w-xl lg:shrink-0 xl:max-w-2xl">

BIN
bun.lockb

Binary file not shown.

View File

@ -9,7 +9,7 @@ import { useNDK } from "@/app/_providers/ndk";
import { RiArrowRightLine, RiLockLine } from "react-icons/ri";
import { HiOutlineLockOpen } from "react-icons/hi";
import { decryptMessage } from "@/lib/nostr";
import { NDKUser } from "@nostr-dev-kit/ndk";
import { NDKFilter, NDKUser } from "@nostr-dev-kit/ndk";
import { log } from "@/lib/utils";
import { EventSchema } from "@/types";
import KindCard from "@/components/KindCard";
@ -24,9 +24,10 @@ import {
import useCurrentUser from "@/lib/hooks/useCurrentUser";
import { unlockEvent } from "@/lib/actions/create";
import { type KindCardProps } from "./";
import { getTagValues } from "@/lib/nostr/utils";
export default function Kind3745(props: KindCardProps) {
const { pubkey, content, id } = props;
const { pubkey, content, id, tags } = props;
const { currentUser } = useCurrentUser();
const [error, setError] = useState("");
const [passphrase, setPassphrase] = useState("");
@ -44,11 +45,16 @@ export default function Kind3745(props: KindCardProps) {
log("func", `handleFetchEvent()`);
setFetchingEvent(true);
try {
const directMessageEvent = await ndk.fetchEvent({
const delegate = getTagValues("delegate", tags);
const filter: NDKFilter = {
kinds: [4],
["#e"]: [id],
["#p"]: [currentUser.pubkey],
});
};
if (delegate) {
filter.authors = [delegate];
}
const directMessageEvent = await ndk.fetchEvent(filter);
if (directMessageEvent) {
log("info", "direct msg decryption");
if (!signer) return;

View File

@ -0,0 +1,71 @@
"use client"
import * as React from "react"
import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons"
import { DayPicker } from "react-day-picker"
import { cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
export type CalendarProps = React.ComponentProps<typeof DayPicker>
function Calendar({
className,
classNames,
showOutsideDays = true,
...props
}: CalendarProps) {
return (
<DayPicker
showOutsideDays={showOutsideDays}
className={cn("p-3", className)}
classNames={{
months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
month: "space-y-4",
caption: "flex justify-center pt-1 relative items-center",
caption_label: "text-sm font-medium",
nav: "space-x-1 flex items-center",
nav_button: cn(
buttonVariants({ variant: "outline" }),
"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
),
nav_button_previous: "absolute left-1",
nav_button_next: "absolute right-1",
table: "w-full border-collapse space-y-1",
head_row: "flex",
head_cell:
"text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
row: "flex w-full mt-2",
cell: cn(
"relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent",
props.mode === "range"
? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md"
: "[&:has([aria-selected])]:rounded-md"
),
day: cn(
buttonVariants({ variant: "ghost" }),
"h-8 w-8 p-0 font-normal aria-selected:opacity-100"
),
day_range_start: "day-range-start",
day_range_end: "day-range-end",
day_selected:
"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
day_today: "bg-accent text-accent-foreground",
day_outside: "text-muted-foreground opacity-50",
day_disabled: "text-muted-foreground opacity-50",
day_range_middle:
"aria-selected:bg-accent aria-selected:text-accent-foreground",
day_hidden: "invisible",
...classNames,
}}
components={{
IconLeft: ({ ...props }) => <ChevronLeftIcon className="h-4 w-4" />,
IconRight: ({ ...props }) => <ChevronRightIcon className="h-4 w-4" />,
}}
{...props}
/>
)
}
Calendar.displayName = "Calendar"
export { Calendar }

View File

@ -309,3 +309,91 @@ export async function follow(
const newContacts = await createEvent(ndk, newEvent);
return newContacts;
}
export async function createCalendarEvent(
ndk: NDK,
event: {
content: string;
kind: number;
tags: string[][];
},
isPrivate?: boolean,
list?: NDKList,
delegateSigner?: NDKPrivateKeySigner,
) {
log("func", "createEventHandler");
const pubkey = await window.nostr?.getPublicKey();
if (!pubkey || !window.nostr) {
throw new Error("No public key provided!");
}
const eventToPublish = new NDKEvent(ndk, {
...event,
tags: [...event.tags, ["client", "flockstr"]],
pubkey,
created_at: unixTimeNowInSeconds(),
} as NostrEvent);
await eventToPublish.sign();
let publishedEvent: NDKEvent | null = null;
// Check if is private event
if (isPrivate) {
log("info", "isPrivate");
const rawEventString = JSON.stringify(eventToPublish.rawEvent());
const passphrase = generateRandomString();
const encryptedRawEventString = await encryptMessage(
rawEventString,
passphrase,
);
const newEvent = new NDKEvent(ndk, {
content: encryptedRawEventString,
kind: 3745,
tags: [
["kind", event.kind.toString()],
["client", "flockstr"],
],
pubkey,
} as NostrEvent);
await newEvent.sign();
await newEvent.publish();
const messenger = delegateSigner ?? ndk.signer!;
const user = await messenger.user();
log("info", "Signer", user.toString());
if (list) {
// Send DMs to subscribers
const subscribers = getTagsValues("p", list.tags);
for (const subscriber of subscribers) {
const messageEvent = new NDKEvent(ndk, {
content: passphrase,
kind: 4,
tags: [
["p", subscriber],
["e", newEvent.id],
["client", "flockstr"],
],
pubkey: user.pubkey,
} as NostrEvent);
await messageEvent.encrypt(
new NDKUser({ hexpubkey: subscriber }),
messenger,
);
await messageEvent.sign(messenger);
await messageEvent.publish();
}
}
publishedEvent = newEvent;
} else {
await eventToPublish.publish();
publishedEvent = eventToPublish;
}
if (list) {
const tag = publishedEvent.tagReference();
if (!tag) return;
// Add event to list
await list.addItem(tag, undefined, false);
await list.sign();
await list.publish();
}
return true;
}

View File

@ -37,6 +37,7 @@
"cmdk": "^0.2.0",
"crypto": "^1.0.1",
"crypto-js": "^4.1.1",
"date-fns": "^2.30.0",
"dayjs": "^1.11.10",
"dexie": "^3.2.4",
"dexie-react-hooks": "^1.1.6",
@ -49,6 +50,7 @@
"nostr-tools": "^1.16.0",
"ramda": "^0.29.1",
"react": "^18",
"react-day-picker": "^8.9.1",
"react-dom": "^18",
"react-hook-form": "^7.47.0",
"react-icons": "^4.11.0",