a tool for shared writing and social publishing

add language and time-zone to provider

+39 -21
+7 -4
app/layout.tsx
··· 7 7 import { PopUpProvider } from "components/Toast"; 8 8 import { IdentityProviderServer } from "components/IdentityProviderServer"; 9 9 import { headers } from "next/headers"; 10 - import { IPLocationProvider } from "components/Providers/IPLocationProvider"; 10 + import { RequestHeadersProvider } from "components/Providers/RequestHeadersProvider"; 11 11 import { RouteUIStateManager } from "components/RouteUIStateManger"; 12 12 13 13 export const metadata = { ··· 55 55 children: React.ReactNode; 56 56 } 57 57 ) { 58 - let ipLocation = (await headers()).get("X-Vercel-IP-Country"); 58 + let headersList = await headers(); 59 + let ipLocation = headersList.get("X-Vercel-IP-Country"); 60 + let acceptLanguage = headersList.get("accept-language"); 61 + let ipTimezone = headersList.get("X-Vercel-IP-Timezone"); 59 62 return ( 60 63 <html suppressHydrationWarning lang="en" className={`${quattro.variable}`}> 61 64 <body> ··· 77 80 <InitialPageLoad> 78 81 <PopUpProvider> 79 82 <IdentityProviderServer> 80 - <IPLocationProvider country={ipLocation}> 83 + <RequestHeadersProvider country={ipLocation} language={acceptLanguage} timezone={ipTimezone}> 81 84 <ViewportSizeLayout>{children}</ViewportSizeLayout> 82 85 <RouteUIStateManager /> 83 - </IPLocationProvider> 86 + </RequestHeadersProvider> 84 87 </IdentityProviderServer> 85 88 </PopUpProvider> 86 89 </InitialPageLoad>
+3 -3
components/Blocks/RSVPBlock/ContactDetailsForm.tsx
··· 12 12 import { Separator } from "components/Layout"; 13 13 import { createPhoneAuthToken } from "actions/phone_auth/request_phone_auth_token"; 14 14 import { Input, InputWithLabel } from "components/Input"; 15 - import { IPLocationContext } from "components/Providers/IPLocationProvider"; 15 + import { RequestHeadersContext } from "components/Providers/RequestHeadersProvider"; 16 16 import { Popover } from "components/Popover"; 17 17 import { theme } from "tailwind.config"; 18 18 import { InfoSmall } from "components/Icons/InfoSmall"; ··· 41 41 data.authToken.phone_number === rsvp.phone_number, 42 42 )?.plus_ones || 0, 43 43 ); 44 - let ipLocation = useContext(IPLocationContext) || "US"; 44 + let requestHeaders = useContext(RequestHeadersContext); 45 45 const [formState, setFormState] = useState({ 46 46 country_code: 47 - countryCodes.find((c) => c[1].toUpperCase() === ipLocation)?.[2] || "1", 47 + countryCodes.find((c) => c[1].toUpperCase() === (requestHeaders.country || "US"))?.[2] || "1", 48 48 phone_number: "", 49 49 confirmationCode: "", 50 50 });
-14
components/Providers/IPLocationProvider.tsx
··· 1 - "use client"; 2 - import { createContext } from "react"; 3 - 4 - export const IPLocationContext = createContext<string | null>(null); 5 - export const IPLocationProvider = (props: { 6 - country: string | null; 7 - children: React.ReactNode; 8 - }) => { 9 - return ( 10 - <IPLocationContext.Provider value={props.country}> 11 - {props.children} 12 - </IPLocationContext.Provider> 13 - ); 14 - };
+29
components/Providers/RequestHeadersProvider.tsx
··· 1 + "use client"; 2 + import { createContext } from "react"; 3 + 4 + export type RequestHeaders = { 5 + country: string | null; 6 + language: string | null; 7 + timezone: string | null; 8 + }; 9 + 10 + export const RequestHeadersContext = createContext<RequestHeaders>({ 11 + country: null, 12 + language: null, 13 + timezone: null, 14 + }); 15 + 16 + export const RequestHeadersProvider = (props: { 17 + country: string | null; 18 + language: string | null; 19 + timezone: string | null; 20 + children: React.ReactNode; 21 + }) => { 22 + return ( 23 + <RequestHeadersContext.Provider 24 + value={{ country: props.country, language: props.language, timezone: props.timezone }} 25 + > 26 + {props.children} 27 + </RequestHeadersContext.Provider> 28 + ); 29 + };