feat: implement address component and models
parent
e11c8449b9
commit
c669e7fd0c
@ -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<typeof addressSchema>;
|
||||
|
||||
export const createAddress = (data: Partial<AddressData> = {}): 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) => (
|
||||
<>
|
||||
<div>{props.address.name}</div>
|
||||
<div>{getLine1(props.address)}</div>
|
||||
<div>{getLine2(props.address)}</div>
|
||||
</>
|
||||
);
|
||||
|
||||
export default Address;
|
Loading…
Reference in New Issue