Skip to content

Commit 8a39407

Browse files
committed
Allow custom render function to create your own elements
1 parent 87191ae commit 8a39407

File tree

4 files changed

+98
-23
lines changed

4 files changed

+98
-23
lines changed

example/src/App.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,8 @@
4444
a.login {
4545
display: block;
4646
}
47+
48+
.login-button {
49+
display: block;
50+
margin: 10px;
51+
}

example/src/App.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ function App() {
4545
label={(name) => `Do sign in ${name}`}
4646
/>
4747

48+
<br />
49+
<p>Login with custom renderer.</p>
50+
<StaticWebAuthLogins
51+
customProviders={[{ id: "okta", name: "Okta" }]}
52+
customRenderer={({ href, className, name }) => (
53+
<button className="login-button">
54+
<a href={href} className={className}>
55+
Custom Login Renderer - {name}
56+
</a>
57+
</button>
58+
)}
59+
/>
60+
4861
<ClientPrincipalContextProvider>
4962
<UserDisplay />
5063
</ClientPrincipalContextProvider>

react-static-web-apps-auth/src/Login.tsx

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,38 @@ export type LoginProps = {
77
id: AuthProviders;
88
postLoginRedirect?: string;
99
label?: (name: string) => string;
10+
customRenderer?: (props: RenderLoginProps) => JSX.Element;
1011
};
1112

12-
const Login = ({
13-
name,
14-
id,
15-
postLoginRedirect,
16-
label = (name) => `Sign in using ${name}`,
17-
}: LoginProps) => {
18-
return (
19-
<a
20-
href={`/.auth/login/${id}${
21-
postLoginRedirect ? `?post_login_redirect_uri=${postLoginRedirect}` : ""
22-
}`}
23-
className={`${id} login ${StaticWebAppsClassName}`}
24-
>
25-
{label(name)}
26-
</a>
13+
export type RenderLoginProps = LoginProps & {
14+
href: string;
15+
className: string;
16+
};
17+
18+
const Login = (props: LoginProps) => {
19+
const href = `/.auth/login/${props.id}${
20+
props.postLoginRedirect
21+
? `?post_login_redirect_uri=${props.postLoginRedirect}`
22+
: ""
23+
}`;
24+
const className = `${props.id} login ${StaticWebAppsClassName}`;
25+
26+
return props.customRenderer ? (
27+
props.customRenderer({ ...props, href, className })
28+
) : (
29+
<DefaultRenderer {...props} href={href} className={className} />
2730
);
2831
};
2932

33+
const DefaultRenderer = ({
34+
name,
35+
label = (name) => `Sign in using ${name}`,
36+
href,
37+
className,
38+
}: RenderLoginProps) => (
39+
<a href={href} className={className}>
40+
{label(name)}
41+
</a>
42+
);
43+
3044
export default Login;

react-static-web-apps-auth/src/StaticWebAuthLogins.tsx

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from "react";
2-
import Login, { LoginProps } from "./Login";
2+
import Login, { LoginProps, RenderLoginProps } from "./Login";
33

44
export type CustomProvider = {
55
id: string;
@@ -16,62 +16,96 @@ export type LoginProviderProps = {
1616
postLoginRedirect?: string;
1717
customProviders?: CustomProvider[];
1818
label?: (name: string) => string;
19+
customRenderer?: (props: RenderLoginProps) => JSX.Element;
1920
};
2021

21-
type LoginWrapperProps = Pick<LoginProps, "postLoginRedirect" | "label">;
22+
type LoginWrapperProps = Pick<
23+
LoginProps,
24+
"postLoginRedirect" | "label" | "customRenderer"
25+
>;
2226

23-
const AzureADLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
27+
const AzureADLogin = ({
28+
postLoginRedirect,
29+
label,
30+
customRenderer,
31+
}: LoginWrapperProps) => (
2432
<Login
2533
name="Azure AD"
2634
id="aad"
2735
postLoginRedirect={postLoginRedirect}
2836
label={label}
2937
key="aad"
38+
customRenderer={customRenderer}
3039
/>
3140
);
32-
const FacebookLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
41+
const FacebookLogin = ({
42+
postLoginRedirect,
43+
label,
44+
customRenderer,
45+
}: LoginWrapperProps) => (
3346
<Login
3447
name="Facebook"
3548
id="facebook"
3649
postLoginRedirect={postLoginRedirect}
3750
label={label}
3851
key="facebook"
52+
customRenderer={customRenderer}
3953
/>
4054
);
41-
const TwitterLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
55+
const TwitterLogin = ({
56+
postLoginRedirect,
57+
label,
58+
customRenderer,
59+
}: LoginWrapperProps) => (
4260
<Login
4361
name="Twitter"
4462
id="twitter"
4563
postLoginRedirect={postLoginRedirect}
4664
label={label}
4765
key="twitter"
66+
customRenderer={customRenderer}
4867
/>
4968
);
50-
const GitHubLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
69+
const GitHubLogin = ({
70+
postLoginRedirect,
71+
label,
72+
customRenderer,
73+
}: LoginWrapperProps) => (
5174
<Login
5275
name="GitHub"
5376
id="github"
5477
postLoginRedirect={postLoginRedirect}
5578
label={label}
5679
key="github"
80+
customRenderer={customRenderer}
5781
/>
5882
);
59-
const GoogleLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
83+
const GoogleLogin = ({
84+
postLoginRedirect,
85+
label,
86+
customRenderer,
87+
}: LoginWrapperProps) => (
6088
<Login
6189
name="Google"
6290
id="google"
6391
postLoginRedirect={postLoginRedirect}
6492
label={label}
6593
key="google"
94+
customRenderer={customRenderer}
6695
/>
6796
);
68-
const AppleLogin = ({ postLoginRedirect, label }: LoginWrapperProps) => (
97+
const AppleLogin = ({
98+
postLoginRedirect,
99+
label,
100+
customRenderer,
101+
}: LoginWrapperProps) => (
69102
<Login
70103
name="Apple"
71104
id="apple"
72105
postLoginRedirect={postLoginRedirect}
73106
label={label}
74107
key="apple"
108+
customRenderer={customRenderer}
75109
/>
76110
);
77111

@@ -80,13 +114,15 @@ const CustomProviderLogin = ({
80114
id,
81115
name,
82116
label,
117+
customRenderer,
83118
}: LoginWrapperProps & CustomProvider) => (
84119
<Login
85120
name={name || id}
86121
id={id}
87122
postLoginRedirect={postLoginRedirect}
88123
label={label}
89124
key={id}
125+
customRenderer={customRenderer}
90126
/>
91127
);
92128

@@ -99,6 +135,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
99135
postLoginRedirect={props.postLoginRedirect}
100136
label={props.label}
101137
key="aad"
138+
customRenderer={props.customRenderer}
102139
/>
103140
);
104141
}
@@ -108,6 +145,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
108145
postLoginRedirect={props.postLoginRedirect}
109146
label={props.label}
110147
key="apple"
148+
customRenderer={props.customRenderer}
111149
/>
112150
);
113151
}
@@ -117,6 +155,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
117155
postLoginRedirect={props.postLoginRedirect}
118156
label={props.label}
119157
key="facebook"
158+
customRenderer={props.customRenderer}
120159
/>
121160
);
122161
}
@@ -126,6 +165,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
126165
postLoginRedirect={props.postLoginRedirect}
127166
label={props.label}
128167
key="twitter"
168+
customRenderer={props.customRenderer}
129169
/>
130170
);
131171
}
@@ -135,6 +175,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
135175
postLoginRedirect={props.postLoginRedirect}
136176
label={props.label}
137177
key="github"
178+
customRenderer={props.customRenderer}
138179
/>
139180
);
140181
}
@@ -144,6 +185,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
144185
postLoginRedirect={props.postLoginRedirect}
145186
label={props.label}
146187
key="google"
188+
customRenderer={props.customRenderer}
147189
/>
148190
);
149191
}
@@ -157,6 +199,7 @@ const StaticWebAuthLogins = (props: LoginProviderProps) => {
157199
postLoginRedirect={props.postLoginRedirect}
158200
label={props.label}
159201
key={provider.id}
202+
customRenderer={props.customRenderer}
160203
/>
161204
);
162205
}

0 commit comments

Comments
 (0)