266 lines
6.3 KiB
JavaScript
266 lines
6.3 KiB
JavaScript
import React from 'react';
|
|
|
|
import requestElement from './styles/requestElementStyle.jsx'
|
|
|
|
import { getCookie } from './Cookie.jsx';
|
|
|
|
class DropdownList extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
filter: ['all', 'requested', 'downloading', 'downloaded'],
|
|
sort: ['requested_date', 'name', 'status', 'requested_by', 'ip', 'user_agent'],
|
|
status: ['requested', 'downloading', 'downloaded'],
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const {elementType, elementId, elementStatus, elementCallback, props} = this.props;
|
|
|
|
console.log(elementCallback('downloaded'))
|
|
|
|
switch (elementType) {
|
|
case 'status':
|
|
return (
|
|
<div>HERE</div>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<div {...props}>
|
|
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
class RequestElement extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
dropDownState: undefined,
|
|
}
|
|
}
|
|
|
|
filterRequestList(requestList, filter) {
|
|
if (filter === 'all')
|
|
return requestList
|
|
|
|
if (filter === 'movie' || filter === 'show')
|
|
return requestList.filter(item => item.type === filter)
|
|
return requestList.filter(item => item.status === filter)
|
|
}
|
|
|
|
sortRequestList(requestList, sort_type, reversed) {
|
|
requestList.sort(function(a,b) {
|
|
if(a[sort_type] < b[sort_type]) return -1;
|
|
if(a[sort_type] > b[sort_type]) return 1;
|
|
return 0;
|
|
});
|
|
|
|
if (reversed)
|
|
requestList.reverse();
|
|
}
|
|
|
|
userAgent(agent) {
|
|
if (agent) {
|
|
try {
|
|
return agent.split(" ")[1].replace(/[\(\;]/g, '');
|
|
}
|
|
catch(e) {
|
|
return agent;
|
|
}
|
|
}
|
|
return '';
|
|
}
|
|
|
|
updateDropDownState(status) {
|
|
if (status !== this.dropDownState) {
|
|
this.dropDownState = status;
|
|
}
|
|
}
|
|
|
|
|
|
ItemsStatusDropdown(id, type, status) {
|
|
return (
|
|
<div>
|
|
<select id="lang"
|
|
defaultValue={status}
|
|
onChange={event => this.updateDropDownState(event.target.value)}
|
|
>
|
|
<option value='requested'>Requested</option>
|
|
<option value='downloading'>Downloading</option>
|
|
<option value='downloaded'>Downloaded</option>
|
|
</select>
|
|
|
|
<button onClick={() => { this.updateRequestedItem(id, type)}}>Update Status</button>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
updateRequestedItem(id, type) {
|
|
console.log(id, type, this.dropDownState);
|
|
Promise.resolve()
|
|
fetch('https://apollo.kevinmidboe.com/api/v1/plex/request/' + id, {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Content-type': 'application/json',
|
|
'authorization': getCookie('token')
|
|
},
|
|
body: JSON.stringify({
|
|
type: type,
|
|
status: this.dropDownState,
|
|
})
|
|
})
|
|
.then(response => {
|
|
if (response.status !== 200) {
|
|
console.log('error');
|
|
}
|
|
|
|
response.json()
|
|
.then(data => {
|
|
if (data.success === true) {
|
|
console.log('UPDATED :', id, ' with ', this.dropDownState)
|
|
}
|
|
})
|
|
})
|
|
.catch(error => {
|
|
new Error(error);
|
|
})
|
|
}
|
|
|
|
createHTMLElement(data, index) {
|
|
var posterPath = 'https://image.tmdb.org/t/p/w300' + data.image_path;
|
|
|
|
return (
|
|
<div style={requestElement.wrappingDiv} key={index}>
|
|
<img style={requestElement.requestPoster} src={posterPath}></img>
|
|
<div style={requestElement.infoDiv}>
|
|
<span><b>Name</b>: {data.name} </span><br></br>
|
|
<span><b>Year</b>: {data.year}</span><br></br>
|
|
<span><b>Type</b>: {data.type}</span><br></br>
|
|
<span><b>Status</b>: {data.status}</span><br></br>
|
|
<span><b>Address</b>: {data.ip}</span><br></br>
|
|
<span><b>Requested Data:</b> {data.requested_date}</span><br></br>
|
|
<span><b>Requested By:</b> {data.requested_by}</span><br></br>
|
|
<span><b>Agent</b>: { this.userAgent(data.user_agent) }</span><br></br>
|
|
</div>
|
|
|
|
{ this.ItemsStatusDropdown(data.id, data.type, data.status) }
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render() {
|
|
const {requestedElementsList, requestedElementsFilter, requestedElementsSort, props} = this.props;
|
|
|
|
var filteredRequestedList = this.filterRequestList(requestedElementsList, requestedElementsFilter)
|
|
|
|
this.sortRequestList(filteredRequestedList, requestedElementsSort.value, requestedElementsSort.reversed)
|
|
|
|
return (
|
|
<div {...props} style={requestElement.bodyDiv}>
|
|
{filteredRequestedList.map((requestItem, index) => this.createHTMLElement(requestItem, index))}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
class FetchRequested extends React.Component {
|
|
constructor(props){
|
|
super(props)
|
|
this.state = {
|
|
requested_objects: [],
|
|
filter: 'all',
|
|
sort: {
|
|
value: 'requested_date',
|
|
reversed: false
|
|
},
|
|
}
|
|
}
|
|
|
|
componentDidMount(){
|
|
Promise.resolve()
|
|
fetch('https://apollo.kevinmidboe.com/api/v1/plex/requests/all', {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-type': 'application/json',
|
|
'authorization': getCookie('token')
|
|
}
|
|
})
|
|
.then(response => {
|
|
if (response.status !== 200) {
|
|
console.log('error');
|
|
}
|
|
|
|
response.json()
|
|
.then(data => {
|
|
if (data.success === true) {
|
|
this.setState({
|
|
requested_objects: data.requestedItems
|
|
})
|
|
}
|
|
})
|
|
})
|
|
.catch(error => {
|
|
new Error(error);
|
|
})
|
|
}
|
|
|
|
changeFilter(filter) {
|
|
this.setState({
|
|
filter: filter
|
|
})
|
|
}
|
|
|
|
updateSort(sort=null, reverse=false) {
|
|
if (sort) {
|
|
this.setState({
|
|
sort: { value: sort, reversed: reverse }
|
|
})
|
|
}
|
|
else {
|
|
this.setState({
|
|
sort: { value: this.state.sort.value, reversed: reverse }
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
|
|
render(){
|
|
return(
|
|
<div>
|
|
<select id="lang" onChange={event => this.changeFilter(event.target.value)} value={this.state.value}>
|
|
<option value="all">All</option>
|
|
<option value="requested">Requested</option>
|
|
<option value="downloading">Downloading</option>
|
|
<option value="downloaded">Downloaded</option>
|
|
<option value='movie'>Movies</option>
|
|
<option value='show'>Shows</option>
|
|
</select>
|
|
|
|
<select id="lang" onChange={event => this.updateSort(event.target.value)} value={this.state.value}>
|
|
<option value='requested_date'>Date</option>
|
|
<option value='name'>Title</option>
|
|
<option value='status'>Status</option>
|
|
<option value='requested_by'>Requested By</option>
|
|
<option value='ip'>Address</option>
|
|
<option value='user_agent'>Agent</option>
|
|
</select>
|
|
|
|
<button onClick={() => {this.updateSort(null, !this.state.sort.reversed)}}>Reverse</button>
|
|
|
|
<RequestElement
|
|
requestedElementsList={this.state.requested_objects}
|
|
requestedElementsFilter={this.state.filter}
|
|
requestedElementsSort={this.state.sort}
|
|
/>
|
|
|
|
</div>
|
|
)
|
|
}
|
|
}
|
|
|
|
export default FetchRequested; |