chore: implement new ts components

This commit is contained in:
Sebastian Velez
2023-01-13 11:02:14 -05:00
parent 306a615c4f
commit def9fe1243
11 changed files with 1476 additions and 1406 deletions

169
src/components/NavBar.tsx Normal file
View File

@@ -0,0 +1,169 @@
import React, { useEffect, useState } from 'react';
import config from '../config/config';
import apiKeyInvalid from '../utils/apiKey';
type Props = {
loggedIn: boolean;
user: any;
};
export default function NavBar({ loggedIn, user }: Props) {
const [state, setState] = useState({
apiKey: '',
apiKeyError: '',
loading: false,
});
useEffect(() => {
const fetch = async () => {
const { apiKey } = await browser.storage.sync.get({ apiKey: config.apiKey });
setState({ ...state, apiKey });
};
fetch();
}, []);
const signedInAs = () => {
if (loggedIn === true) {
return (
<p className="navbar-text">
Signed in as <b>{user.full_name}</b>
</p>
);
} else {
return <div />;
}
};
const customRules = () => {
if (loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/settings/rules" rel="noreferrer">
<i className="fa fa-fw fa-filter"></i>
Custom Rules
</a>
</li>
);
} else {
return <div />;
}
};
const dashboard = () => {
if (loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/dashboard" rel="noreferrer">
<i className="fa fa-fw fa-tachometer"></i>
Dashboard
</a>
</li>
);
} else {
return <div />;
}
};
return (
<nav className="navbar navbar-default" role="navigation">
<div className="container-fluid">
<div className="navbar-header">
<button
type="button"
className="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1"
>
<span className="sr-only">Toggle navigation</span>
<i className="fa fa-fw fa-cogs"></i>
</button>
<a target="_blank" className="navbar-brand" href="https://wakatime.com" rel="noreferrer">
WakaTime
<img src="graphics/wakatime-logo-48.png" />
</a>
</div>
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
{signedInAs()}
<ul className="nav navbar-nav">
{customRules()}
{dashboard()}
<li className="dropdown">
<a
href="#"
className="dropdown-toggle"
data-toggle="dropdown"
role="button"
aria-expanded="false"
>
<i className="fa fa-fw fa-info"></i>
About
<span className="caret"></span>
</a>
<ul className="dropdown-menu" role="menu">
<li>
<a
target="_blank"
href="https://github.com/wakatime/chrome-wakatime/issues"
rel="noreferrer"
>
<i className="fa fa-fw fa-bug"></i>
Report an Issue
</a>
</li>
<li>
<a
target="_blank"
href="https://github.com/wakatime/chrome-wakatime"
rel="noreferrer"
>
<i className="fa fa-fw fa-github"></i>
View on GitHub
</a>
</li>
</ul>
</li>
<li>
<div className="container-fluid">
{state.apiKeyError && (
<div className="alert alert-danger" role="alert">
{state.apiKeyError}
</div>
)}
<div className="input-group">
<input
type="text"
className="form-control"
placeholder="API key"
value={state.apiKey}
onChange={(e) => {
const key = e.target.value;
const isApiKeyInvalid = apiKeyInvalid(key);
setState({ ...state, apiKey: key, apiKeyError: isApiKeyInvalid });
}}
/>
<span className="input-group-btn">
<button
className={`btn btn-default ${state.loading ? 'disabled' : ''}`}
disabled={state.loading}
type="button"
data-loading-text="Loading..."
onClick={async () => {
if (state.apiKeyError === '' && state.apiKey !== '') {
setState({ ...state, loading: true });
await browser.storage.sync.set({ apiKey: state.apiKey });
setState({ ...state, loading: false });
}
}}
>
Save
</button>
</span>
</div>
</div>
</li>
</ul>
</div>
</div>
</nav>
);
}

126
src/components/WakaTime.tsx Normal file
View File

@@ -0,0 +1,126 @@
import React, { useEffect, useState } from 'react';
import WakaTimeCore from '../core/WakaTimeCore';
import config from '../config/config';
import changeExtensionState from '../utils/changeExtensionState';
import NavBar from './NavBar';
import MainList from './MainList';
const API_KEY = 'waka_3766d693-bff3-4c63-8bf5-b439f3e12301';
export default function WakaTime() {
const defaultState = {
apiKey: '',
loading: true,
loggedIn: false,
loggingEnabled: config.loggingEnabled,
totalTimeLoggedToday: '0 minutes',
user: {
email: '',
full_name: '',
photo: '',
},
};
const [state, setState] = useState(defaultState);
const fetchUserData = async () => {
// await browser.storage.sync.set({ apiKey: API_KEY });
const { apiKey } = await browser.storage.sync.get({ apiKey: config.apiKey });
if (!apiKey) {
changeExtensionState('notSignedIn');
}
try {
const data = await WakaTimeCore.checkAuth(apiKey as string);
const items = await browser.storage.sync.get({ loggingEnabled: config.loggingEnabled });
if (items.loggingEnabled === true) {
changeExtensionState('allGood');
} else {
changeExtensionState('notLogging');
}
const totalTimeLoggedToday = await WakaTimeCore.getTotalTimeLoggedToday(apiKey as string);
setState({
...state,
apiKey,
loading: false,
loggedIn: true,
loggingEnabled: items.loggingEnabled,
totalTimeLoggedToday: totalTimeLoggedToday.text,
user: {
email: data.email,
full_name: data.full_name,
photo: data.photo,
},
});
await WakaTimeCore.recordHeartbeat();
} catch (err) {
changeExtensionState('notSignedIn');
setState({ ...defaultState, loading: false });
}
};
useEffect(() => {
fetchUserData();
}, []);
const disableLogging = () => {
setState({
...state,
loggingEnabled: false,
});
changeExtensionState('notLogging');
browser.storage.sync.set({
loggingEnabled: false,
});
};
const enableLogging = () => {
setState({
...state,
loggingEnabled: true,
});
changeExtensionState('allGood');
browser.storage.sync.set({
loggingEnabled: true,
});
};
const logoutUser = async () => {
await browser.storage.sync.set({ apiKey: '' });
setState(defaultState);
changeExtensionState('notSignedIn');
};
// if (state.loading === true) {
// return <div>Loading</div>
// }
return (
<div>
<NavBar user={state.user} loggedIn={state.loggedIn} />
<div className="container">
<div className="row">
<div className="col-md-12">
<MainList
disableLogging={disableLogging}
enableLogging={enableLogging}
loggingEnabled={state.loggingEnabled}
totalTimeLoggedToday={state.totalTimeLoggedToday}
logoutUser={logoutUser}
loggedIn={state.loggedIn}
/>
</div>
</div>
</div>
</div>
);
}