Skip to content

Commit cd18d19

Browse files
committed
auto detect browser
1 parent 32e7a82 commit cd18d19

File tree

5 files changed

+89
-37
lines changed

5 files changed

+89
-37
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@
6161
"@jupyterlab/apputils": "^4.5.3",
6262
"@jupyterlab/coreutils": "^6.0.0",
6363
"@jupyterlab/services": "^7.0.0",
64-
"@jupyterlab/settingregistry": "^4.0.0"
64+
"@jupyterlab/settingregistry": "^4.0.0",
65+
"bowser": "^2.11.0"
6566
},
6667
"devDependencies": {
6768
"@jupyterlab/builder": "^4.0.0",

src/components/BrowserCookie.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import React, { useState } from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import { getCookie } from '../services/cookie';
3+
import Bowser from 'bowser';
34

4-
const BrowserCookie = () => {
5+
const BrowserCookie = ({ onSuccess }: { onSuccess: () => void }) => {
56
const browsers = [
67
'Chrome',
78
'Firefox',
@@ -16,10 +17,35 @@ const BrowserCookie = () => {
1617
'Opera GX'
1718
];
1819

20+
const normalizeBrowserName = (name: string) =>
21+
name.toLowerCase().replace(/\s+/g, '_');
22+
1923
const [browser, setBrowser] = useState('');
2024
const [checked, setChecked] = useState(false);
2125

26+
// set browser value by detecting current browser
27+
useEffect(() => {
28+
const browserName = Bowser.getParser(
29+
window.navigator.userAgent
30+
).getBrowserName(true);
31+
if (browserName) {
32+
const firstMatch = browsers.find(b =>
33+
new RegExp(b, 'i').test(browserName)
34+
);
35+
if (firstMatch) {
36+
setBrowser(normalizeBrowserName(firstMatch));
37+
}
38+
}
39+
}, []);
40+
41+
useEffect(() => {
42+
if (checked) {
43+
onSuccess();
44+
}
45+
}, [checked, onSuccess]);
46+
2247
const loadCookies = () => {
48+
// TODO: change alert
2349
if (!browser) {
2450
alert('Please select a browser.');
2551
return;
@@ -55,7 +81,7 @@ const BrowserCookie = () => {
5581
{browsers.map(browser => (
5682
<option
5783
key={browser.toLowerCase()}
58-
value={browser.toLowerCase().replace(/\s+/g, '_')}
84+
value={normalizeBrowserName(browser)}
5985
>
6086
{browser}
6187
</option>

src/components/LandingPage.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from 'react';
2+
import BrowserCookie from './BrowserCookie';
3+
4+
const LandingPage = ({ onLoginSuccess }: { onLoginSuccess: () => void }) => {
5+
const options: JSX.Element[] = [<BrowserCookie onSuccess={onLoginSuccess} />];
6+
return (
7+
<div>
8+
<p>Welcome to JupyterLab LeetCode Widget.</p>
9+
<p>
10+
For this plugin to work, you may choose one of these {options.length}{' '}
11+
methods to allow this plugin to log into LeetCode.
12+
</p>
13+
{...options}
14+
</div>
15+
);
16+
};
17+
18+
export default LandingPage;

src/widget.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import { ReactWidget } from '@jupyterlab/ui-components';
2-
import React from 'react';
3-
import BrowserCookie from './components/BrowserCookie';
2+
import React, { StrictMode, useState } from 'react';
3+
import LandingPage from './components/LandingPage';
44

55
const LeetCodeComponent = (): JSX.Element => {
6-
const options: JSX.Element[] = [<BrowserCookie />];
7-
return (
8-
<div>
9-
<p>Welcome to JupyterLab LeetCode Widget.</p>
10-
<p>
11-
For this plugin to work, you may choose one of these {options.length}{' '}
12-
methods to allow this plugin to log into LeetCode.
13-
</p>
14-
{...options}
15-
</div>
6+
const [isLoggedIn, setIsLoggedIn] = useState(false);
7+
return isLoggedIn ? (
8+
<div></div>
9+
) : (
10+
<LandingPage onLoginSuccess={() => setIsLoggedIn(true)} />
1611
);
1712
};
1813

@@ -24,7 +19,11 @@ class LeetCodeWidget extends ReactWidget {
2419
}
2520

2621
protected render(): JSX.Element {
27-
return <LeetCodeComponent />;
22+
return (
23+
<StrictMode>
24+
<LeetCodeComponent />
25+
</StrictMode>
26+
);
2827
}
2928
}
3029

yarn.lock

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,12 @@ __metadata:
254254
linkType: hard
255255

256256
"@babel/helpers@npm:^7.27.4":
257-
version: 7.27.4
258-
resolution: "@babel/helpers@npm:7.27.4"
257+
version: 7.27.6
258+
resolution: "@babel/helpers@npm:7.27.6"
259259
dependencies:
260260
"@babel/template": ^7.27.2
261-
"@babel/types": ^7.27.3
262-
checksum: a50ce7ff92d9a7235f68e72274c1c3aaa57e53439d8656fce5119e7d75fe383377634b2ebddf2e8b795af2b010a32808fe34834ba7e2f7fc49bf031a239c83a7
261+
"@babel/types": ^7.27.6
262+
checksum: 12f96a5800ff677481dbc0a022c617303e945210cac4821ad5377a31201ffd8d9c4d00f039ed1487cf2a3d15868fb2d6cabecdb1aba334bd40a846f1938053a2
263263
languageName: node
264264
linkType: hard
265265

@@ -1257,13 +1257,13 @@ __metadata:
12571257
languageName: node
12581258
linkType: hard
12591259

1260-
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
1261-
version: 7.27.3
1262-
resolution: "@babel/types@npm:7.27.3"
1260+
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4":
1261+
version: 7.27.6
1262+
resolution: "@babel/types@npm:7.27.6"
12631263
dependencies:
12641264
"@babel/helper-string-parser": ^7.27.1
12651265
"@babel/helper-validator-identifier": ^7.27.1
1266-
checksum: f0d43c0231f3ebc118480e149292dcd92ea128e2650285ced99ff2e5610db2171305f59aa07406ba0cb36af8e4331a53a69576d6b0c3f3176144dd3ad514b9ae
1266+
checksum: c3bd0984d892b0edec38fd12cf63f620bb52fba8187ec7cbe2d1aff5bee5e185e0fd86a3fb90b4d8f18b072113d07901476d0e39f58d5c988db14b231a6ea735
12671267
languageName: node
12681268
linkType: hard
12691269

@@ -3051,8 +3051,8 @@ __metadata:
30513051
linkType: hard
30523052

30533053
"@rjsf/core@npm:^5.13.4":
3054-
version: 5.24.10
3055-
resolution: "@rjsf/core@npm:5.24.10"
3054+
version: 5.24.11
3055+
resolution: "@rjsf/core@npm:5.24.11"
30563056
dependencies:
30573057
lodash: ^4.17.21
30583058
lodash-es: ^4.17.21
@@ -3062,13 +3062,13 @@ __metadata:
30623062
peerDependencies:
30633063
"@rjsf/utils": ^5.24.x
30643064
react: ^16.14.0 || >=17
3065-
checksum: 90316d9dd90ae58805fc4f6fa2bb14dfd9a361abebb75bd3b1b7ed55b554e9a7d5145fc09ee5906bc91d362fc8f8c24619d4d4c432bae782da5cebb0a5b9cddf
3065+
checksum: 7bceac697e7a289fb88c6e88e78a6fc50628ebb3064d63fa7e3244a1189c6a42c582a779c52b828e8b60fdc9ff81b5468c5e60a28392061fa2eab022e6a3c2d4
30663066
languageName: node
30673067
linkType: hard
30683068

30693069
"@rjsf/utils@npm:^5.13.4":
3070-
version: 5.24.10
3071-
resolution: "@rjsf/utils@npm:5.24.10"
3070+
version: 5.24.11
3071+
resolution: "@rjsf/utils@npm:5.24.11"
30723072
dependencies:
30733073
json-schema-merge-allof: ^0.8.1
30743074
jsonpointer: ^5.0.1
@@ -3077,7 +3077,7 @@ __metadata:
30773077
react-is: ^18.2.0
30783078
peerDependencies:
30793079
react: ^16.14.0 || >=17
3080-
checksum: 64d9bcfea100c4b89128c20473982d316e960c01f9887fb3613bc0ecdaa9fdf8804f96ff99b0b415c2cbc7b4f7d5de941328a1a1a5d53148489d395a1f07a78e
3080+
checksum: 81e716c5e34b5f194a384c75059aff2cb7c7f639f7998179c7648c280bf9c76b6e97ef22e3a99d4afaf8228f48acc499e39eca8574872ed75a97337c0e6072f6
30813081
languageName: node
30823082
linkType: hard
30833083

@@ -4071,6 +4071,13 @@ __metadata:
40714071
languageName: node
40724072
linkType: hard
40734073

4074+
"bowser@npm:^2.11.0":
4075+
version: 2.11.0
4076+
resolution: "bowser@npm:2.11.0"
4077+
checksum: 29c3f01f22e703fa6644fc3b684307442df4240b6e10f6cfe1b61c6ca5721073189ca97cdeedb376081148c8518e33b1d818a57f781d70b0b70e1f31fb48814f
4078+
languageName: node
4079+
linkType: hard
4080+
40744081
"brace-expansion@npm:^1.1.7":
40754082
version: 1.1.11
40764083
resolution: "brace-expansion@npm:1.1.11"
@@ -4202,9 +4209,9 @@ __metadata:
42024209
linkType: hard
42034210

42044211
"caniuse-lite@npm:^1.0.30001718":
4205-
version: 1.0.30001720
4206-
resolution: "caniuse-lite@npm:1.0.30001720"
4207-
checksum: 97b9f9de842595ff9674001abb9c5bc093c03bb985d481ed97617ea48fc248bfb2cc1f1afe19da2bf20016f28793e495fa2f339e22080d8da3c9714fb7950926
4212+
version: 1.0.30001721
4213+
resolution: "caniuse-lite@npm:1.0.30001721"
4214+
checksum: 1f1e1f5f070f97ee83a08601709413300957be624790a8f7b3aebd5746d648e8d50be4ef9572a50281198b2f7acc63fdfc1a0bc04c23bbffba0ab4b3c69d4b76
42084215
languageName: node
42094216
linkType: hard
42104217

@@ -4780,9 +4787,9 @@ __metadata:
47804787
linkType: hard
47814788

47824789
"electron-to-chromium@npm:^1.5.160":
4783-
version: 1.5.162
4784-
resolution: "electron-to-chromium@npm:1.5.162"
4785-
checksum: 777bd278da53730a280166237a9458d6e00bb5c55014146d44fceb74d75fab2149b5484be6f857e3943ba0f6162618c1a028c362950730eeced6921e5c158f6a
4790+
version: 1.5.165
4791+
resolution: "electron-to-chromium@npm:1.5.165"
4792+
checksum: 49725e9c02fcc2b1a89aa2624603d151b1da1ac7a9c017d9ab91f894f463466fea210785b46dea184bbaf3871893b2dac8e062fe05b94348d8e2853e91737e63
47864793
languageName: node
47874794
linkType: hard
47884795

@@ -6823,6 +6830,7 @@ __metadata:
68236830
"@types/react-addons-linked-state-mixin": ^0.14.22
68246831
"@typescript-eslint/eslint-plugin": ^6.1.0
68256832
"@typescript-eslint/parser": ^6.1.0
6833+
bowser: ^2.11.0
68266834
css-loader: ^6.7.1
68276835
eslint: ^8.36.0
68286836
eslint-config-prettier: ^8.8.0

0 commit comments

Comments
 (0)