2021-10-17 18:18:25 +05:30
|
|
|
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"
|
2021-10-17 18:18:25 +05:30
|
|
|
import Statsview from "./Components/Statsview"
|
|
|
|
|
import Taskview from "./Components/Taskview"
|
|
|
|
|
|
|
|
|
|
class App extends React.Component<any,any> {
|
2021-10-28 21:53:15 -07:00
|
|
|
username = ""
|
|
|
|
|
credentials = ""
|
2021-10-17 18:18:25 +05:30
|
|
|
constructor(props: any) {
|
|
|
|
|
super(props)
|
2021-10-28 21:53:15 -07:00
|
|
|
this.username = this.props.plugin.settings.userID
|
|
|
|
|
this.credentials = this.props.plugin.settings.apiToken
|
2021-10-17 18:18:25 +05:30
|
|
|
this.state = {
|
2021-10-30 22:34:41 +05:30
|
|
|
needCron: false,
|
2021-10-17 18:18:25 +05:30
|
|
|
isLoaded: false,
|
|
|
|
|
user_data: {
|
|
|
|
|
profile: {
|
|
|
|
|
name: "",
|
|
|
|
|
},
|
|
|
|
|
stats: {
|
|
|
|
|
hp: 0,
|
|
|
|
|
lvl: 0,
|
2021-10-30 22:34:41 +05:30
|
|
|
},
|
|
|
|
|
lastCron: "",
|
2021-10-17 18:18:25 +05:30
|
|
|
},
|
2021-10-17 21:58:59 -07:00
|
|
|
todos: [],
|
|
|
|
|
dailys: [],
|
|
|
|
|
habits: [],
|
2021-10-17 18:18:25 +05:30
|
|
|
}
|
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-17 18:18:25 +05:30
|
|
|
}
|
2021-10-31 16:33:58 +05:30
|
|
|
CheckCron(lastCron: string) {
|
|
|
|
|
let cronDate = new Date(lastCron).getDate();
|
|
|
|
|
let now = new Date().getDate();
|
2021-11-01 11:41:31 +05:30
|
|
|
console.log(cronDate, now);
|
|
|
|
|
if (cronDate != now) {
|
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 {
|
|
|
|
|
console.log("Cron is up to date");
|
|
|
|
|
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();
|
|
|
|
|
}
|
2021-10-23 18:06:04 +05:30
|
|
|
async reloadData() {
|
2021-10-30 10:04:59 +05:30
|
|
|
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 {
|
2021-10-30 22:34:41 +05:30
|
|
|
console.log(result);
|
2021-10-30 10:04:59 +05:30
|
|
|
this.setState({
|
|
|
|
|
isLoaded: true,
|
|
|
|
|
user_data: result,
|
|
|
|
|
tasks: result.tasks,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.log(e);
|
|
|
|
|
new Notice("API Error: Please check credentials")
|
|
|
|
|
}
|
2021-10-17 18:18:25 +05:30
|
|
|
}
|
|
|
|
|
componentDidMount() {
|
|
|
|
|
this.reloadData()
|
|
|
|
|
}
|
2021-10-23 18:06:04 +05:30
|
|
|
|
|
|
|
|
async sendScore(id:string , score: string, message: string){
|
2021-10-30 10:04:59 +05:30
|
|
|
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();
|
2021-10-23 18:06:04 +05:30
|
|
|
}
|
2021-10-30 10:04:59 +05:30
|
|
|
} catch (e) {
|
|
|
|
|
console.log(e);
|
|
|
|
|
new Notice("API Error: Please check credentials")
|
|
|
|
|
}
|
2021-10-23 18:06:04 +05:30
|
|
|
}
|
|
|
|
|
|
2021-10-19 10:54:06 +05:30
|
|
|
handleChangeTodos(event: any){
|
|
|
|
|
this.state.tasks.todos.forEach((element: any) => {
|
2021-10-17 18:18:25 +05:30
|
|
|
if(element.id == event.target.id){
|
|
|
|
|
if(!element.completed){
|
2021-10-23 18:06:04 +05:30
|
|
|
this.sendScore(event.target.id,"up", "Checked!")
|
2021-10-17 18:18:25 +05:30
|
|
|
} else {
|
2021-10-23 18:06:04 +05:30
|
|
|
this.sendScore(event.target.id,"down", "Un-Checked!")
|
2021-10-17 18:18:25 +05:30
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
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){
|
2021-10-23 18:06:04 +05:30
|
|
|
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){
|
2021-10-23 18:06:04 +05:30
|
|
|
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){
|
2021-10-23 18:06:04 +05:30
|
|
|
this.sendScore(target_id,"down", "Minus :(")
|
2021-10-17 21:58:59 -07:00
|
|
|
}
|
2021-10-19 10:54:06 +05:30
|
|
|
})
|
|
|
|
|
}
|
2021-10-17 18:18:25 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
render(){
|
2021-10-31 16:33:58 +05:30
|
|
|
let content = this.CheckCron(this.state.user_data.lastCron);
|
2021-10-17 18:18:25 +05:30
|
|
|
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}
|
2021-10-17 18:18:25 +05:30
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
export default App
|