diff --git a/src/components/Address.tsx b/src/components/Address.tsx new file mode 100644 index 0000000..b311cb0 --- /dev/null +++ b/src/components/Address.tsx @@ -0,0 +1,60 @@ +import { Component } from "solid-js"; +import z, { Infer } from "myzod"; + +export const addressSchema = z.object({ + type: z.literals("S", "K").optional(), + name: z.string(), + line1: z.string().optional(), + line2: z.string().optional(), + city: z.string().optional(), + zip: z.number().optional(), + country: z.string(), +}); + +export type AddressData = Infer; + +export const createAddress = (data: Partial = {}): AddressData => { + return { + name: "", + line1: "", + line2: "", + city: "", + zip: undefined, + country: "CH", + ...data, + }; +}; + +export const isStructuredAddress = (address: AddressData) => { + if (address.type) { + return address.type === "S"; + } + + return address.city || address.zip != null; +}; + +export const getLine1 = (address: AddressData) => { + if (isStructuredAddress(address)) { + return `${address.line1 || ""} ${address.line2 || ""}`; + } + + return address.line1; +}; + +export const getLine2 = (address: AddressData) => { + if (isStructuredAddress(address)) { + return `${address.zip || ""} ${address.city || ""}`; + } + + return address.line2; +}; + +const Address: Component<{ address: AddressData }> = (props) => ( + <> +
{props.address.name}
+
{getLine1(props.address)}
+
{getLine2(props.address)}
+ +); + +export default Address;