@sotnak/react-wakatime-global-stats 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import 'bootstrap/dist/css/bootstrap.css';
3
+ declare const _default: {
4
+ sum: JSX.Element;
5
+ average: JSX.Element;
6
+ median: JSX.Element;
7
+ editors: JSX.Element;
8
+ operating_systems: JSX.Element;
9
+ };
10
+ export default _default;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import 'bootstrap/dist/css/bootstrap.css';
3
+ declare const _default: JSX.Element;
4
+ export default _default;
@@ -9,10 +9,14 @@ export declare enum Category {
9
9
  editors = 1,
10
10
  operating_systems = 2
11
11
  }
12
- export interface WakaProps {
13
- aggregateFunction: AggregateFunction;
14
- category: Category;
15
- year: number;
12
+ export type UrlGetter = (year: number) => string;
13
+ interface WakaProps {
14
+ aggregateFunction?: AggregateFunction;
15
+ category?: Category;
16
+ year?: number;
17
+ urlGetter: UrlGetter;
18
+ fetcher?: ((url: string) => Promise<any>);
16
19
  limit: number | undefined;
17
20
  }
18
- export declare const Waka: ({ aggregateFunction, category, year, ...props }: WakaProps) => JSX.Element;
21
+ export declare const Waka: ({ aggregateFunction, category, year, urlGetter, fetcher, ...props }: WakaProps) => JSX.Element;
22
+ export {};
@@ -1,3 +1,8 @@
1
1
  /// <reference types="react" />
2
+ import { UrlGetter } from "./waka";
2
3
  import "./wakaInteractive.css";
3
- export declare const WakaInteractive: () => JSX.Element;
4
+ export declare const WakaInteractive: ({ limit, urlGetter, fetcher }: {
5
+ limit: number;
6
+ urlGetter: UrlGetter;
7
+ fetcher?: ((url: string) => Promise<any>) | undefined;
8
+ }) => JSX.Element;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"bootstrap/dist/css/bootstrap.css";import React,{useState,useEffect}from"react";import Spinner from"react-bootstrap/Spinner";import{ListGroup,Stack,ProgressBar,Pagination,ToggleButtonGroup,ToggleButton}from"react-bootstrap";function __rest(e,t){var a={};for(r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(a[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var n=0,r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(a[r[n]]=e[r[n]]);return a}function __awaiter(e,c,g,s){return new(g=g||Promise)(function(a,t){function n(e){try{o(s.next(e))}catch(e){t(e)}}function r(e){try{o(s.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?a(e.value):((t=e.value)instanceof g?t:new g(function(e){e(t)})).then(n,r)}o((s=s.apply(e,c||[])).next())})}const readJsonStats=e=>__awaiter(void 0,void 0,void 0,function*(){return yield import(`../assets/waka${e}.json`).then(e=>e.data)});var AggregateFunction,Category;!function(e){e[e.sum=0]="sum",e[e.average=1]="average",e[e.median=2]="median"}(AggregateFunction=AggregateFunction||{}),function(e){e[e.languages=0]="languages",e[e.editors=1]="editors",e[e.operating_systems=2]="operating_systems"}(Category=Category||{});const Waka=e=>{var{aggregateFunction:t=AggregateFunction.sum,category:a=Category.languages,year:n=2023}=e,e=__rest(e,["aggregateFunction","category","year"]);const[r,o]=useState(void 0);if(useEffect(()=>{o(void 0),readJsonStats(n).then(e=>o(e)).catch(()=>{console.error("unable to load year "+n)})},[n]),!r)return React.createElement("div",null,React.createElement(Spinner,{animation:"border",role:"status"}),React.createElement("span",null," Loading..."));let c,g=(c=e.limit||1e6,[]);switch(a){case Category.languages:g=r.languages;break;case Category.editors:g=r.editors;break;case Category.operating_systems:g=r.operating_systems;break;default:throw Error("unknown category: "+a)}var s=g.filter(e=>"Other"!=e.name);let i=[];switch(t){case AggregateFunction.average:i=s.map(e=>({name:e.name,value:e.average}));break;case AggregateFunction.median:i=s.map(e=>({name:e.name,value:e.median}));break;case AggregateFunction.sum:i=s.map(e=>({name:e.name,value:e.sum}));break;default:throw Error("unknown aggregate function: "+t)}e=i.sort((e,t)=>t.value.seconds-e.value.seconds).slice(0,c);let l;e[0]&&(l=e[0].value.seconds);e=e.map(e=>React.createElement(ListGroup.Item,{key:e.name},React.createElement(Stack,{direction:"horizontal",gap:3},React.createElement("div",null,e.name),React.createElement("div",{className:"ms-auto"},e.value.text)),React.createElement(ProgressBar,{max:l,now:e.value.seconds})));return React.createElement(React.Fragment,null,React.createElement(ListGroup,null,e))};function styleInject(e,t){var a,n,t=(t=void 0===t?{}:t).insertAt;e&&"undefined"!=typeof document&&(a=document.head||document.getElementsByTagName("head")[0],(n=document.createElement("style")).type="text/css","top"===t&&a.firstChild?a.insertBefore(n,a.firstChild):a.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)))}var css_248z="#wakaContainer {\n overflow-y: scroll;\n height: 100%;\n}\n\n#full {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n}\n\n.center {\n margin-left: auto;\n margin-right: auto;\n}";styleInject(css_248z);const firstYear=2013,latestYear=2023,itemLimit=50,WakaInteractive=()=>{const[e,t]=useState(AggregateFunction.sum),[a,n]=useState(Category.languages),[r,o]=useState(latestYear);var c=[];for(let t=firstYear;t<=latestYear;t++)c.push(React.createElement(Pagination.Item,{key:t,active:t===r,onClick:()=>{var e;e=t,o(e)}},t));return React.createElement(Stack,{id:"full"},React.createElement(Stack,{direction:"horizontal",gap:3},React.createElement(ToggleButtonGroup,{type:"radio",name:"agg options",defaultValue:AggregateFunction.sum,onChange:e=>{t(e)}},React.createElement(ToggleButton,{id:"tbg-agg-1",value:AggregateFunction.sum},"Sum"),React.createElement(ToggleButton,{id:"tbg-agg-2",value:AggregateFunction.average},"Average"),React.createElement(ToggleButton,{id:"tbg-agg-3",value:AggregateFunction.median},"Median")),React.createElement(ToggleButtonGroup,{className:"ms-auto",type:"radio",name:"category options",defaultValue:Category.languages,onChange:e=>{n(e)}},React.createElement(ToggleButton,{id:"tbg-category-1",variant:"success",value:Category.languages},"Languages"),React.createElement(ToggleButton,{id:"tbg-category-2",variant:"success",value:Category.editors},"Editors"),React.createElement(ToggleButton,{id:"tbg-category-3",variant:"success",value:Category.operating_systems},"Operating Systems"))),React.createElement("div",{id:"wakaContainer"},React.createElement(Waka,{aggregateFunction:e,limit:itemLimit,category:a,year:r})),React.createElement(Pagination,{className:"center"},c))};export{AggregateFunction,Category,Waka,WakaInteractive};
1
+ import"bootstrap/dist/css/bootstrap.css";import React,{useState}from"react";import Spinner from"react-bootstrap/Spinner";import{ListGroup,Stack,ProgressBar,Pagination,ToggleButtonGroup,ToggleButton}from"react-bootstrap";import useSWR from"swr";import axios from"axios";function __rest(e,t){var a={};for(n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(a[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(a[n[r]]=e[n[r]]);return a}const defaultFetcher=e=>axios.get(e).then(e=>e.data);var AggregateFunction,Category;!function(e){e[e.sum=0]="sum",e[e.average=1]="average",e[e.median=2]="median"}(AggregateFunction=AggregateFunction||{}),function(e){e[e.languages=0]="languages",e[e.editors=1]="editors",e[e.operating_systems=2]="operating_systems"}(Category=Category||{});const Waka=e=>{var{aggregateFunction:t=AggregateFunction.sum,category:a=Category.languages,year:r=2023,urlGetter:n,fetcher:o=defaultFetcher}=e,e=__rest(e,["aggregateFunction","category","year","urlGetter","fetcher"]),{data:n,error:r,isLoading:o}=useSWR(n(r),o);if(o)return React.createElement("div",null,React.createElement(Spinner,{animation:"border",role:"status"}),React.createElement("span",null," Loading..."));if(r)return React.createElement("div",null,React.createElement("span",null,r.message));var g=n.data;let c,s=(c=e.limit||1e6,[]);switch(a){case Category.languages:s=g.languages;break;case Category.editors:s=g.editors;break;case Category.operating_systems:s=g.operating_systems;break;default:throw Error("unknown category: "+a)}var i=s.filter(e=>"Other"!=e.name);let l=[];switch(t){case AggregateFunction.average:l=i.map(e=>({name:e.name,value:e.average}));break;case AggregateFunction.median:l=i.map(e=>({name:e.name,value:e.median}));break;case AggregateFunction.sum:l=i.map(e=>({name:e.name,value:e.sum}));break;default:throw Error("unknown aggregate function: "+t)}o=l.sort((e,t)=>t.value.seconds-e.value.seconds).slice(0,c);let u;o[0]&&(u=o[0].value.seconds);r=o.map(e=>React.createElement(ListGroup.Item,{key:e.name},React.createElement(Stack,{direction:"horizontal",gap:3},React.createElement("div",null,e.name),React.createElement("div",{className:"ms-auto"},e.value.text)),React.createElement(ProgressBar,{max:u,now:e.value.seconds})));return React.createElement(React.Fragment,null,React.createElement(ListGroup,null,r))};function styleInject(e,t){var a,r,t=(t=void 0===t?{}:t).insertAt;e&&"undefined"!=typeof document&&(a=document.head||document.getElementsByTagName("head")[0],(r=document.createElement("style")).type="text/css","top"===t&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e)))}var css_248z="#wakaContainer {\n overflow-y: scroll;\n height: 100%;\n}\n\n#full {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 100%;\n}\n\n.center {\n margin-left: auto;\n margin-right: auto;\n}";styleInject(css_248z);const firstYear=2013,itemLimit=100,latestYear=Math.max(firstYear,(new Date).getFullYear()-1),WakaInteractive=({limit:e=itemLimit,urlGetter:t,fetcher:a})=>{const[r,n]=useState(AggregateFunction.sum),[o,g]=useState(Category.languages),[c,s]=useState(latestYear);var i=[];for(let t=firstYear;t<=latestYear;t++)i.push(React.createElement(Pagination.Item,{key:t,active:t===c,onClick:()=>{var e;e=t,s(e)}},t));return React.createElement(Stack,{id:"full"},React.createElement(Stack,{direction:"horizontal",gap:3},React.createElement(ToggleButtonGroup,{type:"radio",name:"agg options",defaultValue:AggregateFunction.sum,onChange:e=>{n(e)}},React.createElement(ToggleButton,{id:"tbg-agg-1",value:AggregateFunction.sum},"Sum"),React.createElement(ToggleButton,{id:"tbg-agg-2",value:AggregateFunction.average},"Average"),React.createElement(ToggleButton,{id:"tbg-agg-3",value:AggregateFunction.median},"Median")),React.createElement(ToggleButtonGroup,{className:"ms-auto",type:"radio",name:"category options",defaultValue:Category.languages,onChange:e=>{g(e)}},React.createElement(ToggleButton,{id:"tbg-category-1",variant:"success",value:Category.languages},"Languages"),React.createElement(ToggleButton,{id:"tbg-category-2",variant:"success",value:Category.editors},"Editors"),React.createElement(ToggleButton,{id:"tbg-category-3",variant:"success",value:Category.operating_systems},"Operating Systems"))),React.createElement("div",{id:"wakaContainer"},React.createElement(Waka,{aggregateFunction:r,limit:e,category:o,year:c,urlGetter:t,fetcher:a})),React.createElement(Pagination,{className:"center"},i))};export{AggregateFunction,Category,Waka,WakaInteractive};
@@ -1,3 +1,3 @@
1
1
  export declare const firstYear = 2013;
2
- export declare const latestYear = 2023;
3
- export declare const itemLimit = 50;
2
+ export declare const latestYear = 2024;
3
+ export declare const itemLimit = 100;
@@ -0,0 +1,10 @@
1
+ declare namespace _default {
2
+ const input: string;
3
+ const output: {
4
+ file: string;
5
+ format: string;
6
+ }[];
7
+ const external: string[];
8
+ const plugins: any[];
9
+ }
10
+ export default _default;
@@ -0,0 +1,22 @@
1
+ export const entry: string;
2
+ export const mode: string;
3
+ export namespace module {
4
+ const rules: ({
5
+ test: RegExp;
6
+ exclude: RegExp[];
7
+ use: {
8
+ loader: string;
9
+ };
10
+ } | {
11
+ test: RegExp;
12
+ use: string[];
13
+ exclude?: undefined;
14
+ })[];
15
+ }
16
+ export namespace resolve {
17
+ const extensions: string[];
18
+ }
19
+ export namespace output {
20
+ const filename: string;
21
+ const path: string;
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sotnak/react-wakatime-global-stats",
3
- "version": "0.1.9",
3
+ "version": "0.2.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -10,7 +10,11 @@
10
10
  "buildLib": "rollup -c",
11
11
  "publishLib": "npm publish --access=public"
12
12
  },
13
- "keywords": ["wakatime", "react component", "global stats"],
13
+ "keywords": [
14
+ "wakatime",
15
+ "react component",
16
+ "global stats"
17
+ ],
14
18
  "author": "",
15
19
  "license": "ISC",
16
20
  "files": [
@@ -29,6 +33,7 @@
29
33
  "bootstrap": "^5.2.3",
30
34
  "css-loader": "^6.7.3",
31
35
  "html-webpack-plugin": "^4.5.2",
36
+ "ignore-loader": "^0.1.2",
32
37
  "postcss": "^8.4.21",
33
38
  "react": "^18.2.0",
34
39
  "react-bootstrap": "^2.7.0",
@@ -45,15 +50,17 @@
45
50
  "webpack": "^5.75.0"
46
51
  },
47
52
  "peerDependencies": {
53
+ "bootstrap": "^5.2.3",
48
54
  "react": "^18.2.0",
49
55
  "react-bootstrap": "^2.7.0",
50
- "react-dom": "^18.2.0",
51
- "bootstrap": "^5.2.3"
56
+ "react-dom": "^18.2.0"
52
57
  },
53
58
  "dependencies": {
59
+ "axios": "^1.13.2",
60
+ "bootstrap": "^5.2.3",
54
61
  "react": "^18.2.0",
55
62
  "react-bootstrap": "^2.7.0",
56
63
  "react-dom": "^18.2.0",
57
- "bootstrap": "^5.2.3"
64
+ "swr": "^2.3.8"
58
65
  }
59
66
  }