tangled
alpha
login
or
join now
leaflet.pub
/
leaflet
289
fork
atom
a tool for shared writing and social publishing
289
fork
atom
overview
issues
27
pulls
pipelines
add language and time-zone to provider
awarm.space
4 months ago
70803e89
2d5fafe1
+39
-21
4 changed files
expand all
collapse all
unified
split
app
layout.tsx
components
Blocks
RSVPBlock
ContactDetailsForm.tsx
Providers
IPLocationProvider.tsx
RequestHeadersProvider.tsx
+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
10
-
import { IPLocationProvider } from "components/Providers/IPLocationProvider";
10
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
58
-
let ipLocation = (await headers()).get("X-Vercel-IP-Country");
58
58
+
let headersList = await headers();
59
59
+
let ipLocation = headersList.get("X-Vercel-IP-Country");
60
60
+
let acceptLanguage = headersList.get("accept-language");
61
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
80
-
<IPLocationProvider country={ipLocation}>
83
83
+
<RequestHeadersProvider country={ipLocation} language={acceptLanguage} timezone={ipTimezone}>
81
84
<ViewportSizeLayout>{children}</ViewportSizeLayout>
82
85
<RouteUIStateManager />
83
83
-
</IPLocationProvider>
86
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
15
-
import { IPLocationContext } from "components/Providers/IPLocationProvider";
15
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
44
-
let ipLocation = useContext(IPLocationContext) || "US";
44
44
+
let requestHeaders = useContext(RequestHeadersContext);
45
45
const [formState, setFormState] = useState({
46
46
country_code:
47
47
-
countryCodes.find((c) => c[1].toUpperCase() === ipLocation)?.[2] || "1",
47
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
1
-
"use client";
2
2
-
import { createContext } from "react";
3
3
-
4
4
-
export const IPLocationContext = createContext<string | null>(null);
5
5
-
export const IPLocationProvider = (props: {
6
6
-
country: string | null;
7
7
-
children: React.ReactNode;
8
8
-
}) => {
9
9
-
return (
10
10
-
<IPLocationContext.Provider value={props.country}>
11
11
-
{props.children}
12
12
-
</IPLocationContext.Provider>
13
13
-
);
14
14
-
};
+29
components/Providers/RequestHeadersProvider.tsx
···
1
1
+
"use client";
2
2
+
import { createContext } from "react";
3
3
+
4
4
+
export type RequestHeaders = {
5
5
+
country: string | null;
6
6
+
language: string | null;
7
7
+
timezone: string | null;
8
8
+
};
9
9
+
10
10
+
export const RequestHeadersContext = createContext<RequestHeaders>({
11
11
+
country: null,
12
12
+
language: null,
13
13
+
timezone: null,
14
14
+
});
15
15
+
16
16
+
export const RequestHeadersProvider = (props: {
17
17
+
country: string | null;
18
18
+
language: string | null;
19
19
+
timezone: string | null;
20
20
+
children: React.ReactNode;
21
21
+
}) => {
22
22
+
return (
23
23
+
<RequestHeadersContext.Provider
24
24
+
value={{ country: props.country, language: props.language, timezone: props.timezone }}
25
25
+
>
26
26
+
{props.children}
27
27
+
</RequestHeadersContext.Provider>
28
28
+
);
29
29
+
};