feat: users can select timezone during onboarding (#2148)

feat: using Intl timezone will be automatically selected but they have the option to change it
This commit is contained in:
Dakshesh Jain 2023-09-12 13:35:15 +05:30 committed by GitHub
parent 9bff10de6d
commit 2186db8bba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 1 deletions

View File

@ -9,13 +9,16 @@ import useToast from "hooks/use-toast";
// services // services
import userService from "services/user.service"; import userService from "services/user.service";
// ui // ui
import { CustomSelect, Input, PrimaryButton } from "components/ui"; import { CustomSearchSelect, CustomSelect, Input, PrimaryButton } from "components/ui";
// types // types
import { ICurrentUserResponse, IUser } from "types"; import { ICurrentUserResponse, IUser } from "types";
// fetch-keys // fetch-keys
import { CURRENT_USER } from "constants/fetch-keys"; import { CURRENT_USER } from "constants/fetch-keys";
// helpers
import { getUserTimeZoneFromWindow } from "helpers/date-time.helper";
// constants // constants
import { USER_ROLES } from "constants/workspace"; import { USER_ROLES } from "constants/workspace";
import { TIME_ZONES } from "constants/timezones";
const defaultValues: Partial<IUser> = { const defaultValues: Partial<IUser> = {
first_name: "", first_name: "",
@ -27,6 +30,12 @@ type Props = {
user?: IUser; user?: IUser;
}; };
const timeZoneOptions = TIME_ZONES.map((timeZone) => ({
value: timeZone.value,
query: timeZone.label + " " + timeZone.value,
content: timeZone.label,
}));
export const UserDetails: React.FC<Props> = ({ user }) => { export const UserDetails: React.FC<Props> = ({ user }) => {
const { setToastAlert } = useToast(); const { setToastAlert } = useToast();
@ -84,6 +93,7 @@ export const UserDetails: React.FC<Props> = ({ user }) => {
first_name: user.first_name, first_name: user.first_name,
last_name: user.last_name, last_name: user.last_name,
role: user.role, role: user.role,
user_timezone: getUserTimeZoneFromWindow(),
}); });
} }
}, [user, reset]); }, [user, reset]);
@ -162,6 +172,34 @@ export const UserDetails: React.FC<Props> = ({ user }) => {
{errors.role && <span className="text-sm text-red-500">{errors.role.message}</span>} {errors.role && <span className="text-sm text-red-500">{errors.role.message}</span>}
</div> </div>
</div> </div>
<div className="space-y-1 text-sm">
<span>What time zone are you in? </span>
<div className="w-full">
<Controller
name="user_timezone"
control={control}
rules={{ required: "This field is required" }}
render={({ field: { value, onChange } }) => (
<CustomSearchSelect
value={value}
label={
value
? TIME_ZONES.find((t) => t.value === value)?.label ?? value
: "Select a timezone"
}
options={timeZoneOptions}
onChange={onChange}
verticalPosition="top"
optionsClassName="w-full"
input
/>
)}
/>
{errors?.user_timezone && (
<span className="text-sm text-red-500">{errors.user_timezone.message}</span>
)}
</div>
</div>
</div> </div>
<PrimaryButton type="submit" size="md" disabled={!isValid} loading={isSubmitting}> <PrimaryButton type="submit" size="md" disabled={!isValid} loading={isSubmitting}>

View File

@ -403,3 +403,5 @@ export const findTotalDaysInRange = (
return diffInDays; return diffInDays;
}; };
export const getUserTimeZoneFromWindow = () => Intl.DateTimeFormat().resolvedOptions().timeZone;