142 lines
5.6 KiB
TypeScript
142 lines
5.6 KiB
TypeScript
|
|
import {
|
|||
|
|
Select,
|
|||
|
|
SelectContent,
|
|||
|
|
SelectGroup,
|
|||
|
|
SelectItem,
|
|||
|
|
SelectLabel,
|
|||
|
|
SelectTrigger,
|
|||
|
|
SelectValue,
|
|||
|
|
} from "~/components/ui/select";
|
|||
|
|
|
|||
|
|
export const TIMEZONE_OPTIONS: { region: string; zones: { value: string; label: string }[] }[] = [
|
|||
|
|
{
|
|||
|
|
region: "North America",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "America/New_York", label: "Eastern Time (ET)" },
|
|||
|
|
{ value: "America/Chicago", label: "Central Time (CT)" },
|
|||
|
|
{ value: "America/Denver", label: "Mountain Time (MT)" },
|
|||
|
|
{ value: "America/Phoenix", label: "Mountain Time – Arizona (no DST)" },
|
|||
|
|
{ value: "America/Los_Angeles", label: "Pacific Time (PT)" },
|
|||
|
|
{ value: "America/Anchorage", label: "Alaska Time (AKT)" },
|
|||
|
|
{ value: "Pacific/Honolulu", label: "Hawaii Time (HT)" },
|
|||
|
|
{ value: "America/Toronto", label: "Eastern Time – Toronto" },
|
|||
|
|
{ value: "America/Vancouver", label: "Pacific Time – Vancouver" },
|
|||
|
|
{ value: "America/Edmonton", label: "Mountain Time – Edmonton" },
|
|||
|
|
{ value: "America/Winnipeg", label: "Central Time – Winnipeg" },
|
|||
|
|
{ value: "America/Halifax", label: "Atlantic Time – Halifax" },
|
|||
|
|
{ value: "America/St_Johns", label: "Newfoundland Time" },
|
|||
|
|
{ value: "America/Mexico_City", label: "Central Time – Mexico City" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "South America",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "America/Sao_Paulo", label: "Brasília Time (BRT)" },
|
|||
|
|
{ value: "America/Argentina/Buenos_Aires", label: "Argentina Time (ART)" },
|
|||
|
|
{ value: "America/Bogota", label: "Colombia Time (COT)" },
|
|||
|
|
{ value: "America/Lima", label: "Peru Time (PET)" },
|
|||
|
|
{ value: "America/Santiago", label: "Chile Time (CLT)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "Europe",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "Europe/London", label: "GMT / British Time (GMT/BST)" },
|
|||
|
|
{ value: "Europe/Dublin", label: "Irish Time (GMT/IST)" },
|
|||
|
|
{ value: "Europe/Paris", label: "Central European Time (CET/CEST)" },
|
|||
|
|
{ value: "Europe/Berlin", label: "Central European Time – Berlin" },
|
|||
|
|
{ value: "Europe/Amsterdam", label: "Central European Time – Amsterdam" },
|
|||
|
|
{ value: "Europe/Madrid", label: "Central European Time – Madrid" },
|
|||
|
|
{ value: "Europe/Rome", label: "Central European Time – Rome" },
|
|||
|
|
{ value: "Europe/Warsaw", label: "Central European Time – Warsaw" },
|
|||
|
|
{ value: "Europe/Helsinki", label: "Eastern European Time (EET/EEST)" },
|
|||
|
|
{ value: "Europe/Athens", label: "Eastern European Time – Athens" },
|
|||
|
|
{ value: "Europe/Bucharest", label: "Eastern European Time – Bucharest" },
|
|||
|
|
{ value: "Europe/Kyiv", label: "Eastern European Time – Kyiv" },
|
|||
|
|
{ value: "Europe/Moscow", label: "Moscow Time (MSK)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "Africa",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "Africa/Johannesburg", label: "South Africa Time (SAST)" },
|
|||
|
|
{ value: "Africa/Cairo", label: "Eastern European Time – Cairo" },
|
|||
|
|
{ value: "Africa/Lagos", label: "West Africa Time (WAT)" },
|
|||
|
|
{ value: "Africa/Nairobi", label: "East Africa Time (EAT)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "Asia / Middle East",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "Asia/Dubai", label: "Gulf Standard Time (GST)" },
|
|||
|
|
{ value: "Asia/Riyadh", label: "Arabia Standard Time (AST)" },
|
|||
|
|
{ value: "Asia/Kolkata", label: "India Standard Time (IST)" },
|
|||
|
|
{ value: "Asia/Dhaka", label: "Bangladesh Standard Time (BST)" },
|
|||
|
|
{ value: "Asia/Bangkok", label: "Indochina Time (ICT)" },
|
|||
|
|
{ value: "Asia/Singapore", label: "Singapore Time (SGT)" },
|
|||
|
|
{ value: "Asia/Shanghai", label: "China Standard Time (CST)" },
|
|||
|
|
{ value: "Asia/Hong_Kong", label: "Hong Kong Time (HKT)" },
|
|||
|
|
{ value: "Asia/Tokyo", label: "Japan Standard Time (JST)" },
|
|||
|
|
{ value: "Asia/Seoul", label: "Korea Standard Time (KST)" },
|
|||
|
|
{ value: "Asia/Karachi", label: "Pakistan Standard Time (PKT)" },
|
|||
|
|
{ value: "Asia/Colombo", label: "Sri Lanka Time (SLST)" },
|
|||
|
|
{ value: "Asia/Tehran", label: "Iran Standard Time (IRST)" },
|
|||
|
|
{ value: "Asia/Jerusalem", label: "Israel Standard Time (IST/IDT)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "Oceania",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "Australia/Sydney", label: "Australian Eastern Time (AEST/AEDT)" },
|
|||
|
|
{ value: "Australia/Melbourne", label: "Australian Eastern Time – Melbourne" },
|
|||
|
|
{ value: "Australia/Brisbane", label: "Australian Eastern Time – Queensland" },
|
|||
|
|
{ value: "Australia/Adelaide", label: "Australian Central Time (ACST/ACDT)" },
|
|||
|
|
{ value: "Australia/Perth", label: "Australian Western Time (AWST)" },
|
|||
|
|
{ value: "Pacific/Auckland", label: "New Zealand Time (NZST/NZDT)" },
|
|||
|
|
{ value: "Pacific/Fiji", label: "Fiji Time (FJT)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
region: "UTC / Other",
|
|||
|
|
zones: [
|
|||
|
|
{ value: "UTC", label: "UTC (Coordinated Universal Time)" },
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
interface TimezoneSelectProps {
|
|||
|
|
value: string;
|
|||
|
|
onChange: (value: string) => void;
|
|||
|
|
disabled?: boolean;
|
|||
|
|
placeholder?: string;
|
|||
|
|
name?: string;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function TimezoneSelect({
|
|||
|
|
value,
|
|||
|
|
onChange,
|
|||
|
|
disabled,
|
|||
|
|
placeholder = "Select timezone…",
|
|||
|
|
name,
|
|||
|
|
}: TimezoneSelectProps) {
|
|||
|
|
return (
|
|||
|
|
<Select value={value} onValueChange={onChange} disabled={disabled} name={name}>
|
|||
|
|
<SelectTrigger className="w-full">
|
|||
|
|
<SelectValue placeholder={placeholder} />
|
|||
|
|
</SelectTrigger>
|
|||
|
|
<SelectContent className="max-h-80">
|
|||
|
|
{TIMEZONE_OPTIONS.map((group) => (
|
|||
|
|
<SelectGroup key={group.region}>
|
|||
|
|
<SelectLabel>{group.region}</SelectLabel>
|
|||
|
|
{group.zones.map((tz) => (
|
|||
|
|
<SelectItem key={tz.value} value={tz.value}>
|
|||
|
|
{tz.label}
|
|||
|
|
</SelectItem>
|
|||
|
|
))}
|
|||
|
|
</SelectGroup>
|
|||
|
|
))}
|
|||
|
|
</SelectContent>
|
|||
|
|
</Select>
|
|||
|
|
);
|
|||
|
|
}
|