Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: TicketCard component #2198

Closed
wants to merge 13 commits into from
Prev Previous commit
Next Next commit
fix build and add FullDateRange object
  • Loading branch information
rrrliu committed Jan 31, 2025
commit b60920890001391317c5fee2c5586b389a9f0956
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
EdDSATicketPCDTypeName,
isEdDSATicketPCD
} from "@pcd/eddsa-ticket-pcd";
import { parseDateRange } from "@pcd/passport-interface";
import { PCD } from "@pcd/pcd-types";
import { isPODTicketPCD } from "@pcd/pod-ticket-pcd";
import uniqWith from "lodash/uniqWith";
Expand All @@ -17,28 +18,6 @@ export const isEventTicketPCD = (
);
};

interface DateRange {
start: Date;
end?: Date;
}

function serializeTimeRange(range: DateRange): string {
// Produces something like "2023-01-01T09:00:00.000Z/2023-01-01T17:00:00.000Z"
const { start, end } = range;
if (end) {
return `${start.toISOString()}/${end.toISOString()}`;
}
return start.toISOString();
}

function parseTimeRange(serialized: string): DateRange {
const [startStr, endStr] = serialized.split("/");
return {
start: new Date(startStr),
end: endStr ? new Date(endStr) : undefined
};
}

export const useTickets = (): Array<[string, TicketPack[]]> => {
const allPCDs = usePCDs();
const tickets = allPCDs.filter(isEventTicketPCD).reverse();
Expand All @@ -54,8 +33,8 @@ export const useTickets = (): Array<[string, TicketPack[]]> => {
// Filter out tickets that have already passed
const { eventStartDate } = t.claim.ticket;
if (!eventStartDate) return false;
const range = parseTimeRange(eventStartDate);
if (range.end && range.end.getTime() < Date.now()) return false;
const range = parseDateRange(eventStartDate);
if (range.date_to && new Date(range.date_to) < new Date()) return false;
return true;
})
.sort((t1, t2) => {
Expand All @@ -64,12 +43,12 @@ export const useTickets = (): Array<[string, TicketPack[]]> => {
if (!t2.claim.ticket.eventStartDate) return -1;

// parse the date
const range1 = parseTimeRange(t1.claim.ticket.eventStartDate);
const range2 = parseTimeRange(t2.claim.ticket.eventStartDate);
const range1 = parseDateRange(t1.claim.ticket.eventStartDate);
const range2 = parseDateRange(t2.claim.ticket.eventStartDate);
const now = Date.now();

const timeToDate1 = range1.start.getTime() - now;
const timeToDate2 = range2.start.getTime() - now;
const timeToDate1 = new Date(range1.date_from).getTime() - now;
const timeToDate2 = new Date(range2.date_from).getTime() - now;

// 1. both events are upcoming
// the smaller timeToDate should be first - ordering by nearest upcoming event first.
Expand Down
4 changes: 2 additions & 2 deletions apps/passport-server/src/database/models.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
DateRange,
KnownPublicKeyType,
KnownTicketGroup,
MaybeDateRange,
ZuzaluUserRole
} from "@pcd/passport-interface";

Expand All @@ -13,7 +13,7 @@ export interface ZuzaluPretixTicket {
name: string;
role: ZuzaluUserRole;
order_id: string;
visitor_date_ranges?: DateRange[] | null;
visitor_date_ranges?: MaybeDateRange[] | null;
}

export interface TelegramReactionCount {
Expand Down
6 changes: 3 additions & 3 deletions apps/passport-server/src/services/zuzaluPretixSyncService.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DateRange, ZuzaluUserRole } from "@pcd/passport-interface";
import { MaybeDateRange, ZuzaluUserRole } from "@pcd/passport-interface";
import { RollbarService } from "@pcd/server-shared";
import { PoolClient } from "postgres-pool";
import {
Expand Down Expand Up @@ -330,9 +330,9 @@ export class ZuzaluPretixSyncService {
const visitorDateRanges = orderSubevents.map(
(subEvent) =>
({
date_from: subEvent?.date_from,
date_from: subEvent?.date_from ?? "",
date_to: subEvent?.date_to
}) satisfies DateRange
}) satisfies MaybeDateRange
);

return {
Expand Down
26 changes: 26 additions & 0 deletions packages/lib/passport-interface/src/daterange.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export interface MaybeDateRange {
date_from?: string | null;
date_to?: string | null;
}

export interface FullDateRange {
date_from: string;
date_to: string;
}

export function serializeDateRange(range: FullDateRange): string {
// Produces something like "2023-01-01T09:00:00.000Z/2023-01-01T17:00:00.000Z"
const { date_from, date_to } = range;
if (date_to) {
return `${date_from}/${date_to}`;
}
return date_from;
}

export function parseDateRange(serialized: string): FullDateRange {
const [date_from, date_to] = serialized.split("/");
return {
date_from,
date_to
};
}
41 changes: 21 additions & 20 deletions packages/lib/passport-interface/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
export * from "./Credential";
export * from "./CredentialManager";
export * from "./EncryptedStorage";
export * from "./FeedAPI";
export * from "./FeedHost";
export * from "./FrogCrypto";
export * from "./PassportInterface";
export * from "./PassportPopup/core";
export * from "./PassportPopup/react";
export * from "./PendingPCDIntegration";
export * from "./PendingPCDUtils";
export * from "./RequestTypes";
export * from "./SemaphoreGroupIntegration";
export * from "./SemaphoreSignatureIntegration";
export * from "./SerializedPCDIntegration";
export * from "./SubscriptionManager";
export * from "./Terms";
export * from "./TicketAction";
export * from "./User";
export * from "./ZupassDefaultSubscriptions";
export * from "./api/apiResult";
export * from "./api/constants";
export * from "./api/makeRequest";
Expand Down Expand Up @@ -56,33 +76,14 @@ export * from "./api/requestUploadEncryptedStorage";
export * from "./api/requestUser";
export * from "./api/requestVerifyTicket";
export * from "./api/requestVerifyToken";
export * from "./Credential";
export * from "./CredentialManager";
export * from "./daterange";
export * from "./devcon";
export * from "./edgecity";
export * from "./EncryptedStorage";
export * from "./ethlatam";
export * from "./FeedAPI";
export * from "./FeedHost";
export * from "./FrogCrypto";
export * from "./genericIssuanceTypes";
export * from "./genericPretixTypes";
export * from "./PassportInterface";
export * from "./PassportPopup/core";
export * from "./PassportPopup/react";
export * from "./PendingPCDIntegration";
export * from "./PendingPCDUtils";
export * from "./protocolworlds";
export * from "./RequestTypes";
export * from "./SemaphoreGroupIntegration";
export * from "./SemaphoreSignatureIntegration";
export * from "./SerializedPCDIntegration";
export * from "./SubscriptionManager";
export * from "./Terms";
export * from "./TicketAction";
export * from "./User";
export * from "./util/util";
export * from "./vitalia";
export * from "./zuconnect";
export * from "./ZupassDefaultSubscriptions";
export * from "./zuzalu";
10 changes: 0 additions & 10 deletions packages/lib/passport-interface/src/zuzalu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,6 @@ import { ZupassUserJson } from "./RequestTypes";

export type User = ZupassUserJson;

export interface DateRange {
date_from?: string | null;
date_to?: string | null;
}

export interface FullDateRange {
date_from: string;
date_to: string;
}

export const enum ZuzaluUserRole {
Visitor = "visitor",
Resident = "resident",
Expand Down