diff --git a/src/PKPass.ts b/src/PKPass.ts index 559ffb5..4f7fb7d 100644 --- a/src/PKPass.ts +++ b/src/PKPass.ts @@ -216,6 +216,44 @@ export default class PKPass extends Bundle { return Utils.cloneRecursive(this[propsSymbol]); } + /** + * Allows accessing to iOS 18 new Event Ticket + * property `preferredStyleSchemes`. + * + * @throws (automatically) if current type is not + * "eventTicket". + */ + + public get preferredStyleSchemes(): Schemas.PreferredStyleSchemes { + return this[propsSymbol].preferredStyleSchemes; + } + + /** + * Allows setting a preferredStyleSchemes property + * for a eventTicket. + * + * @throws if current type is not "eventTicket". + * @param value + */ + + public set preferredStyleSchemes(value: Schemas.PreferredStyleSchemes) { + Utils.assertUnfrozen(this); + + if (this.type !== "eventTicket") { + throw new TypeError( + Messages.PREFERRED_STYLE_SCHEMES.UNEXPECTED_PASS_TYPE, + ); + } + + Schemas.assertValidity( + Schemas.PreferredStyleSchemes, + value, + Messages.PREFERRED_STYLE_SCHEMES.INVALID, + ); + + this[propsSymbol].preferredStyleSchemes = value; + } + /** * Allows setting a transitType property * for a boardingPass. @@ -316,44 +354,6 @@ export default class PKPass extends Bundle { return this[propsSymbol][this.type].backFields; } - /** - * Allows accessing to iOS 18 new Event Ticket - * property `preferredStyleSchemes`. - * - * @throws (automatically) if current type is not - * "eventTicket". - */ - - public get preferredStyleSchemes(): Schemas.PreferredStyleSchemes { - return this[propsSymbol]["eventTicket"].preferredStyleSchemes; - } - - /** - * Allows setting a preferredStyleSchemes property - * for a eventTicket. - * - * @throws if current type is not "eventTicket". - * @param value - */ - - public set preferredStyleSchemes(value: Schemas.PreferredStyleSchemes) { - Utils.assertUnfrozen(this); - - if (this.type !== "eventTicket") { - throw new TypeError( - Messages.PREFERRED_STYLE_SCHEMES.UNEXPECTED_PASS_TYPE, - ); - } - - Schemas.assertValidity( - Schemas.PreferredStyleSchemes, - value, - Messages.PREFERRED_STYLE_SCHEMES.INVALID, - ); - - this[propsSymbol]["eventTicket"].preferredStyleSchemes = value; - } - /** * Allows setting a pass type. * @@ -383,6 +383,7 @@ export default class PKPass extends Bundle { */ this[propsSymbol][this.type] = undefined; + this[propsSymbol].preferredStyleSchemes = undefined; } const sharedKeysPool = new Set(); @@ -415,7 +416,6 @@ export default class PKPass extends Bundle { Schemas.Field, ), transitType: undefined, - preferredStyleSchemes: undefined, }; } @@ -584,7 +584,6 @@ export default class PKPass extends Bundle { auxiliaryFields = [], backFields = [], transitType, - preferredStyleSchemes = [], } = data[type] || {}; this.headerFields.push(...headerFields); @@ -596,10 +595,6 @@ export default class PKPass extends Bundle { if (this.type === "boardingPass") { this.transitType = transitType; } - - if (this.type === "eventTicket") { - this.preferredStyleSchemes = preferredStyleSchemes; - } } } diff --git a/src/schemas/PassFields.ts b/src/schemas/PassFields.ts index 249f145..41eef7d 100644 --- a/src/schemas/PassFields.ts +++ b/src/schemas/PassFields.ts @@ -12,13 +12,6 @@ export const TransitType = Joi.string().regex( /(PKTransitTypeAir|PKTransitTypeBoat|PKTransitTypeBus|PKTransitTypeGeneric|PKTransitTypeTrain)/, ); -export type PreferredStyleSchemes = ("posterEventTicket" | "eventTicket")[]; - -export const PreferredStyleSchemes = Joi.array().items( - "posterEventTicket", - "eventTicket", -) satisfies Joi.Schema; - export interface PassFields { auxiliaryFields: FieldWithRow[]; backFields: Field[]; @@ -26,7 +19,6 @@ export interface PassFields { primaryFields: Field[]; secondaryFields: Field[]; transitType?: TransitType; - preferredStyleSchemes?: PreferredStyleSchemes; } export const PassFields = Joi.object().keys({ diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 3fe25b7..0d53252 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -15,7 +15,7 @@ import { Barcode } from "./Barcode"; import { Location } from "./Location"; import { Beacon } from "./Beacon"; import { NFC } from "./NFC"; -import { PassFields, PreferredStyleSchemes, TransitType } from "./PassFields"; +import { PassFields, TransitType } from "./PassFields"; import { Semantics } from "./Semantics"; import { CertificatesSchema } from "./Certificates"; @@ -26,6 +26,13 @@ const RGB_COLOR_REGEX = const URL_REGEX = /https?:\/\/(?:[a-z0-9]+\.?)+(?::\d{2,})?(?:\/[\S]+)*/; +export type PreferredStyleSchemes = ("posterEventTicket" | "eventTicket")[]; + +export const PreferredStyleSchemes = Joi.array().items( + "posterEventTicket", + "eventTicket", +) satisfies Joi.Schema; + export interface FileBuffers { [key: string]: Buffer; } @@ -63,20 +70,7 @@ export interface PassProps { locations?: Location[]; boardingPass?: PassFields & { transitType: TransitType }; - eventTicket?: PassFields & { - /** - * New field coming in iOS 18 - * `"eventTicket"` is the legacy style. - * - * If used, passkit will try to render following the old style - * first. - * - * Which means that `primaryFields`, `secondaryFields` and - * so on, are not necessary anymore for the new style, - * as semantics are preferred. - */ - preferredStyleSchemes?: PreferredStyleSchemes; - }; + eventTicket?: PassFields; coupon?: PassFields; generic?: PassFields; storeCard?: PassFields; @@ -98,6 +92,12 @@ export interface PassProps { * Event Ticket */ parkingInformationURL?: string; + + /** + * New field for iOS 18 + * Event Ticket + */ + preferredStyleSchemes?: PreferredStyleSchemes; } /** @@ -145,22 +145,7 @@ export const PassKindsProps = Joi.object({ coupon: PassFields.disallow("transitType"), generic: PassFields.disallow("transitType"), storeCard: PassFields.disallow("transitType"), - eventTicket: PassFields.disallow("transitType").concat( - Joi.object().keys({ - /** - * New field coming in iOS 18 - * `"eventTicket"` is the legacy style. - * - * If used, passkit will try to render following the old style - * first. - * - * Which means that `primaryFields`, `secondaryFields` and - * so on, are not necessary anymore for the new style, - * as semantics are preferred. - */ - preferredStyleSchemes: PreferredStyleSchemes, - }), - ), + eventTicket: PassFields.disallow("transitType"), boardingPass: PassFields, }); @@ -206,6 +191,10 @@ export const OverridablePassProps = Joi.object({ /** * New field for iOS 18 * Event Ticket + * `"eventTicket"` is the legacy style. + * + * Passkit will try to render a style based on the order + * of the properties */ parkingInformationURL: Joi.string().regex(URL_REGEX), }).with("webServiceURL", "authenticationToken");