habitica-sync/src/view/App.tsx

176 lines
5.7 KiB
TypeScript
Raw Normal View History

import * as React from "react";
2021-10-23 16:41:11 +05:30
import { Notice } from "obsidian";
2021-10-30 22:34:41 +05:30
import { getStats, scoreTask, makeCronReq } from "./habiticaAPI"
import Statsview from "./Components/Statsview"
import Taskview from "./Components/Taskview"
class App extends React.Component<any,any> {
private _username = "";
public get username() {
return this._username;
}
public set username(value) {
this._username = value;
}
private _credentials = "";
public get credentials() {
return this._credentials;
}
public set credentials(value) {
this._credentials = value;
}
constructor(props: any) {
super(props)
this.username = this.props.plugin.settings.userID
this.credentials = this.props.plugin.settings.apiToken
this.state = {
2021-10-30 22:34:41 +05:30
needCron: false,
isLoaded: false,
user_data: {
profile: {
name: "",
},
stats: {
hp: 0,
lvl: 0,
2021-10-30 22:34:41 +05:30
},
lastCron: "",
},
2021-10-17 21:58:59 -07:00
todos: [],
dailys: [],
habits: [],
}
2021-10-31 16:33:58 +05:30
this.handleChangeTodos = this.handleChangeTodos.bind(this);
this.handleChangeDailys = this.handleChangeDailys.bind(this);
this.handleChangeHabits = this.handleChangeHabits.bind(this);
this.runCron = this.runCron.bind(this);
2021-10-19 10:54:06 +05:30
}
2021-10-31 16:33:58 +05:30
CheckCron(lastCron: string) {
2021-11-16 18:29:31 +05:30
let cronDate = new Date(lastCron);
let now = new Date();
if (cronDate.getDate() != now.getDate() || (cronDate.getMonth() != now.getMonth() || cronDate.getFullYear() != now.getFullYear())) {
2021-10-30 22:34:41 +05:30
return(
<div className="cron">
<div id="cronMessage"> Welcome back! Please check your tasks for the last day and hit continue to get your daily rewards. </div>
2021-10-31 16:39:47 +05:30
<button onClick={this.runCron}>Continue</button>
2021-10-30 22:34:41 +05:30
</div>
);
}
else {
return null
};
}
2021-11-01 11:41:31 +05:30
async runCron() {
2021-10-31 16:33:58 +05:30
console.log("running cron");
2021-11-01 11:41:31 +05:30
try {
let response = await makeCronReq(this.username, this.credentials);
2021-10-30 22:34:41 +05:30
this.setState({
2021-10-31 16:39:47 +05:30
needCron: false,
2021-10-30 22:34:41 +05:30
})
2021-11-01 11:41:31 +05:30
} catch (error) {
console.log(error);
new Notice("There was an error running the cron. Please try again later.");
}
2021-10-30 22:34:41 +05:30
this.reloadData();
}
async reloadData() {
try {
let response = await getStats(this.username, this.credentials);
let result = await response.json();
if (result.success === false) {
new Notice('Login Failed, Please check credentials and try again!');
}
else {
this.setState({
isLoaded: true,
user_data: result,
tasks: result.tasks,
});
}
} catch (e) {
console.log(e);
new Notice("API Error: Please check credentials")
}
}
componentDidMount() {
this.reloadData()
}
async sendScore(id:string , score: string, message: string){
try {
let response = await scoreTask(this.username, this.credentials, id, score);
let result = await response.json();
if(result.success === true){
new Notice(message);
this.reloadData();
} else {
new Notice("Resyncing, please try again");
this.reloadData();
}
} catch (e) {
console.log(e);
new Notice("API Error: Please check credentials")
}
}
2021-10-19 10:54:06 +05:30
handleChangeTodos(event: any){
this.state.tasks.todos.forEach((element: any) => {
if(element.id == event.target.id){
if(!element.completed){
this.sendScore(event.target.id,"up", "Checked!")
} else {
this.sendScore(event.target.id,"down", "Un-Checked!")
}
}
})
2021-10-19 10:54:06 +05:30
}
handleChangeDailys(event: any){
this.state.tasks.dailys.forEach((element: any) => {
2021-10-17 21:58:59 -07:00
if(element.id == event.target.id){
if(element.id == event.target.id){
if(!element.completed){
this.sendScore(event.target.id,"up", "Checked!")
} else {
this.sendScore(event.target.id,"down", "Un-Checked!")
}
2021-10-17 21:58:59 -07:00
}
}
})
2021-10-19 10:54:06 +05:30
}
handleChangeHabits(event: any){
const target_id = event.target.id.slice(4)
if(event.target.id.slice(0,4) == "plus"){
this.state.tasks.habits.forEach((element: any) => {
if(element.id == target_id){
this.sendScore(target_id,"up", "Plus!")
2021-10-19 10:54:06 +05:30
}
})
}
else {
this.state.tasks.habits.forEach((element: any) => {
if(element.id == target_id){
this.sendScore(target_id,"down", "Minus :(")
2021-10-17 21:58:59 -07:00
}
2021-10-19 10:54:06 +05:30
})
}
}
render(){
2021-10-31 16:33:58 +05:30
let content = this.CheckCron(this.state.user_data.lastCron);
if(this.state.error)
return(<div className="loading">Loading....</div>)
else if(!this.state.isLoaded)
return <div className="loading">Loading....</div>
else {
return (<div className="plugin-root">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
<Statsview user_data={this.state.user_data} />
2021-10-19 10:54:06 +05:30
<Taskview data={this.state.tasks} handleChangeTodos={this.handleChangeTodos} handleChangeDailys={this.handleChangeDailys} handleChangeHabits={this.handleChangeHabits}/>
2021-10-31 16:33:58 +05:30
{content}
</div>
);
}
}
}
export default App