2020-05-17 00:40:48 +00:00
import React , { useState , useEffect , useReducer } from 'react' ;
2023-05-30 21:10:05 +00:00
import { Link , useParams , useHistory } from 'react-router-dom' ;
2020-02-24 04:07:18 +00:00
import moment from 'moment-timezone' ;
2021-08-18 20:40:11 +00:00
import QRCode from 'react-qr-code' ;
2020-01-09 22:11:56 +00:00
import './light.css' ;
2023-05-30 21:10:05 +00:00
import { Button , Container , Divider , Grid , Header , Icon , Image , Message , Popup , Segment , Table } from 'semantic-ui-react' ;
2021-08-18 20:40:11 +00:00
import { statusColor , BasicTable , siteUrl , staticUrl , requester , isAdmin } from './utils.js' ;
2020-01-09 22:11:56 +00:00
import { LoginForm , SignupForm } from './LoginSignup.js' ;
2020-01-13 03:18:41 +00:00
import { AccountForm } from './Account.js' ;
2021-12-08 22:02:30 +00:00
import { SignForm } from './Sign.js' ;
2023-06-03 18:56:01 +00:00
import { StorageButton } from './Storage.js' ;
2020-02-21 06:10:52 +00:00
import { PayPalSubscribeDeal } from './PayPal.js' ;
2020-01-09 22:11:56 +00:00
function MemberInfo ( props ) {
const user = props . user ;
const member = user . member ;
2023-05-30 21:10:05 +00:00
const history = useHistory ( ) ;
2020-01-09 22:11:56 +00:00
2022-01-14 00:32:21 +00:00
const lastTrans = user . transactions ? . slice ( 0 , 3 ) ;
const lastTrain = user . training ? . sort ( ( a , b ) => a . session . datetime < b . session . datetime ? 1 : - 1 ) . slice ( 0 , 3 ) ;
const lastCard = user . cards ? . sort ( ( a , b ) => a . last _seen < b . last _seen ) [ 0 ] ;
2020-01-09 22:11:56 +00:00
2022-03-19 21:40:01 +00:00
const unpaidTraining = user . training ? . filter ( x => x . attendance _status === 'Waiting for payment' ) ;
2020-01-09 22:11:56 +00:00
return (
< div >
2023-02-13 23:24:37 +00:00
{ member . protocoin < 0 && < Message error >
< Message . Header > Your Protocoin balance is negative ! < / M e s s a g e . H e a d e r >
< p > Visit the < Link to = '/paymaster' > Paymaster < / L i n k > p a g e o r p a y a D i r e c t o r t o b u y P r o t o c o i n . < / p >
< / M e s s a g e > }
2020-01-09 22:11:56 +00:00
< Grid stackable >
2020-01-12 04:58:29 +00:00
< Grid . Column width = { 5 } >
< Image
size = 'small'
src = { member . photo _medium ? staticUrl + '/' + member . photo _medium : '/nophoto.png' }
2020-01-11 06:27:30 +00:00
/ >
2020-01-09 22:11:56 +00:00
< / G r i d . C o l u m n >
2020-01-12 04:58:29 +00:00
< Grid . Column width = { 11 } >
2020-01-20 02:54:44 +00:00
< Header size = 'large' > { member . preferred _name } { member . last _name } < / H e a d e r >
2020-01-09 22:11:56 +00:00
2021-09-22 07:29:24 +00:00
{ member . is _allowed _entry ?
2022-04-10 07:13:36 +00:00
< > < / >
2021-09-22 07:29:24 +00:00
:
2021-09-23 21:13:36 +00:00
< p > You are not allowed entry into Protospace ❌ < / p >
2021-09-22 07:29:24 +00:00
}
2020-01-12 04:58:29 +00:00
< BasicTable >
< Table . Body >
< Table . Row >
< Table . Cell > Status : < / T a b l e . C e l l >
2020-01-20 02:54:44 +00:00
< Table . Cell >
< Icon name = 'circle' color = { statusColor [ member . status ] } / >
{ member . status || 'Unknown' }
< / T a b l e . C e l l >
2020-01-12 04:58:29 +00:00
< / T a b l e . R o w >
2022-08-22 21:33:38 +00:00
< Table . Row >
< Table . Cell > Protocoin : < / T a b l e . C e l l >
2022-08-23 03:09:03 +00:00
< Table . Cell > ₱ & thinsp ; { member . protocoin . toFixed ( 2 ) } < Link to = '/paymaster' > [ buy ] < / L i n k > < / T a b l e . C e l l >
2022-08-22 21:33:38 +00:00
< / T a b l e . R o w >
2023-05-30 21:10:05 +00:00
< Table . Row >
< Table . Cell > Shelf : < / T a b l e . C e l l >
< Table . Cell >
{ user . storage . length ?
2023-07-30 23:59:16 +00:00
user . storage . sort ( ( a , b ) => a . location === 'member_shelves' ? - 1 : 1 ) . map ( ( x , i ) =>
2023-06-03 18:56:01 +00:00
< StorageButton storage = { x } / >
2023-05-30 21:10:05 +00:00
)
:
2023-05-30 23:44:05 +00:00
< > None < Link to = '/claimshelf' > [ claim ] < /Link></ >
2023-05-30 21:10:05 +00:00
}
< / T a b l e . C e l l >
< / T a b l e . R o w >
2020-01-12 04:58:29 +00:00
< Table . Row >
< Table . Cell > Expiry : < / T a b l e . C e l l >
2022-01-17 21:46:53 +00:00
< Table . Cell > { member . expire _date ? moment ( member . expire _date ) . format ( 'll' ) : 'Unknown' } < / T a b l e . C e l l >
2020-01-12 04:58:29 +00:00
< / T a b l e . R o w >
< / T a b l e . B o d y >
< / B a s i c T a b l e >
2020-01-09 22:11:56 +00:00
< / G r i d . C o l u m n >
< / G r i d >
2022-03-19 21:40:01 +00:00
{ ! lastTrans . length && < Message >
2020-01-26 10:39:59 +00:00
< Message . Header > Welcome , new member ! < / M e s s a g e . H e a d e r >
< p >
< a href = { staticUrl + '/' + member . member _forms } target = '_blank' >
2022-12-21 23:45:19 +00:00
View your application forms .
< / a >
2020-01-26 10:39:59 +00:00
< / p >
< / M e s s a g e > }
2020-02-21 06:10:52 +00:00
{ ! ! lastTrans . length && ! member . photo _medium && < Message warning >
2020-01-13 08:01:42 +00:00
< Message . Header > Please set a member photo ! < / M e s s a g e . H e a d e r >
< p > Visit the < Link to = '/account' > account settings < / L i n k > p a g e t o s e t o n e . < / p >
< / M e s s a g e > }
2020-05-01 03:55:13 +00:00
{ ! lastTrans . length && < React . Fragment >
2020-02-21 06:10:52 +00:00
< Header size = 'medium' > PayPal < / H e a d e r >
< p > Create a $ { user . member . monthly _fees } / month subscription , get your first three months for the price of two : < / p >
< PayPalSubscribeDeal
amount = { user . member . monthly _fees }
name = 'Protospace Membership'
custom = { JSON . stringify ( { deal : 3 , member : user . member . id } ) }
/ >
2021-08-18 20:40:11 +00:00
< p > Click "Checkout as Guest" if you don ' t have a PayPal account . < / p >
2022-04-28 20:52:51 +00:00
< QRCode value = { siteUrl + 'subscribe?monthly_fees=' + user . member . monthly _fees + '&id=' + user . member . id } / >
2020-05-01 03:55:13 +00:00
< / R e a c t . F r a g m e n t > }
2020-02-21 06:10:52 +00:00
2022-03-19 21:40:01 +00:00
{ unpaidTraining . map ( x =>
< Message warning >
< Message . Header > Please pay your course fee ! < / M e s s a g e . H e a d e r >
< p > Pay $ { x . session . cost } for < Link to = { '/classes/' + x . session . id } > { x . session . course _data . name } < / L i n k > t o a v o i d l o s i n g y o u r s p o t . < / p >
< / M e s s a g e >
) }
2023-05-06 23:21:25 +00:00
< Header size = 'medium' > Latest Training < / H e a d e r >
{ ! member . orientation _date && < p >
⚠ ️ You need to attend a < Link to = { '/courses/249/' } > New Member Orientation < / L i n k > t o u s e a n y t o o l l a r g e r t h a n a s c r e w d r i v e r .
< / p > }
2022-01-14 00:32:21 +00:00
< BasicTable >
< Table . Body >
{ lastTrain . length ?
lastTrain . map ( x =>
< Table . Row key = { x . id } >
< Table . Cell style = { { minWidth : '8rem' } } >
< Link to = { '/classes/' + x . session . id } > { moment ( x . session . datetime ) . tz ( 'America/Edmonton' ) . format ( 'll' ) } < / L i n k >
< / T a b l e . C e l l >
< Table . Cell > { x . session . course _data . name } < / T a b l e . C e l l >
< / T a b l e . R o w >
)
:
2023-05-06 23:21:25 +00:00
< Table . Row > < Table . Cell > None < / T a b l e . C e l l > < / T a b l e . R o w >
2022-01-14 00:32:21 +00:00
}
2022-05-07 06:28:33 +00:00
{ user . training . length > 3 &&
< Table . Row > < Table . Cell >
< Link to = '/training' > [ more ] < / L i n k >
< / T a b l e . C e l l > < / T a b l e . R o w >
}
2022-01-14 00:32:21 +00:00
< / T a b l e . B o d y >
< / B a s i c T a b l e >
< Header size = 'medium' > Latest Transactions < / H e a d e r >
< BasicTable >
< Table . Body >
{ lastTrans . length ?
lastTrans . map ( x =>
< Table . Row key = { x . id } >
< Table . Cell style = { { minWidth : '8rem' } } >
< Link to = { '/transactions/' + x . id } > { moment ( x . date ) . format ( 'll' ) } < / L i n k >
< / T a b l e . C e l l >
< Table . Cell > { x . account _type } < / T a b l e . C e l l >
2022-08-22 21:33:38 +00:00
< Table . Cell > { x . protocoin !== '0.00' ? '₱ ' + x . protocoin : '$ ' + x . amount } < / T a b l e . C e l l >
2022-01-14 00:32:21 +00:00
< / T a b l e . R o w >
)
:
< Table . Row > < Table . Cell > None < / T a b l e . C e l l > < / T a b l e . R o w >
}
2022-05-07 06:28:33 +00:00
{ user . transactions . length > 3 &&
< Table . Row > < Table . Cell >
< Link to = '/transactions' > [ more ] < / L i n k >
< / T a b l e . C e l l > < / T a b l e . R o w >
}
2022-01-14 00:32:21 +00:00
< / T a b l e . B o d y >
< / B a s i c T a b l e >
2020-01-09 22:11:56 +00:00
< Header size = 'medium' > Details < / H e a d e r >
2020-01-11 23:53:42 +00:00
< BasicTable >
2020-01-09 22:11:56 +00:00
< Table . Body >
< Table . Row >
< Table . Cell > Application : < / T a b l e . C e l l >
2022-01-17 21:46:53 +00:00
< Table . Cell > { member . application _date ? moment ( member . application _date ) . format ( 'll' ) : 'Unknown' } < / T a b l e . C e l l >
2020-01-09 22:11:56 +00:00
< / T a b l e . R o w >
< Table . Row >
< Table . Cell > Start : < / T a b l e . C e l l >
2022-01-17 21:46:53 +00:00
< Table . Cell > { member . current _start _date ? moment ( member . current _start _date ) . format ( 'll' ) : 'Unknown' } < / T a b l e . C e l l >
2020-01-09 22:11:56 +00:00
< / T a b l e . R o w >
< Table . Row >
< Table . Cell > Vetted : < / T a b l e . C e l l >
2022-01-17 21:46:53 +00:00
< Table . Cell > { member . vetted _date ? moment ( member . vetted _date ) . format ( 'll' ) : 'Not vetted' } < / T a b l e . C e l l >
2020-01-09 22:11:56 +00:00
< / T a b l e . R o w >
< Table . Row >
2022-01-14 00:32:21 +00:00
< Table . Cell > Monthly dues : < / T a b l e . C e l l >
< Table . Cell > $ { member . monthly _fees || 'Unknown' } . 00 < / T a b l e . C e l l >
2020-01-09 22:11:56 +00:00
< / T a b l e . R o w >
< Table . Row >
2022-01-14 00:32:21 +00:00
< Table . Cell > Last scan : < / T a b l e . C e l l >
2020-02-28 09:30:22 +00:00
< Table . Cell >
2022-01-14 00:32:21 +00:00
{ lastCard && lastCard . last _seen ?
lastCard . last _seen > '2021-11-14T02:01:35.415685Z' ?
moment . utc ( lastCard . last _seen ) . tz ( 'America/Edmonton' ) . format ( 'lll' )
:
moment . utc ( lastCard . last _seen ) . tz ( 'America/Edmonton' ) . format ( 'll' )
:
'Unknown'
}
2020-02-28 09:30:22 +00:00
{ user . cards . length > 1 && < Link to = '/cards' > [ more ] < / L i n k > }
< / T a b l e . C e l l >
2020-01-09 22:11:56 +00:00
< / T a b l e . R o w >
< / T a b l e . B o d y >
2020-01-11 23:53:42 +00:00
< / B a s i c T a b l e >
2020-01-09 22:11:56 +00:00
2022-03-19 21:40:01 +00:00
{ ! ! lastTrans . length && < p >
2020-01-26 10:39:59 +00:00
< a href = { staticUrl + '/' + member . member _forms } target = '_blank' >
View application forms
< / a >
< / p > }
2020-01-09 22:11:56 +00:00
< / d i v >
) ;
} ;
export function Home ( props ) {
2020-11-17 20:27:12 +00:00
const { user , token } = props ;
2020-02-10 08:02:45 +00:00
const [ stats , setStats ] = useState ( JSON . parse ( localStorage . getItem ( 'stats' , 'false' ) ) ) ;
2020-05-17 00:40:48 +00:00
const [ refreshCount , refreshStats ] = useReducer ( x => x + 1 , 0 ) ;
2020-08-27 19:39:51 +00:00
2020-02-10 08:02:45 +00:00
useEffect ( ( ) => {
2020-11-17 20:27:12 +00:00
requester ( '/stats/' , 'GET' , token )
2020-02-10 08:02:45 +00:00
. then ( res => {
setStats ( res ) ;
localStorage . setItem ( 'stats' , JSON . stringify ( res ) ) ;
} )
. catch ( err => {
console . log ( err ) ;
2020-02-10 09:15:14 +00:00
setStats ( false ) ;
2020-02-10 08:02:45 +00:00
} ) ;
2020-11-18 08:47:22 +00:00
} , [ refreshCount , token ] ) ;
2020-02-10 08:02:45 +00:00
2022-01-17 21:46:53 +00:00
const getStat = ( x ) => stats && stats [ x ] ? stats [ x ] : 'Unknown' ;
2020-06-22 20:51:04 +00:00
const getZeroStat = ( x ) => stats && stats [ x ] ? stats [ x ] : '0' ;
2022-02-16 05:35:38 +00:00
const getDateStat = ( x ) => stats && stats [ x ] ? moment . utc ( stats [ x ] ) . tz ( 'America/Edmonton' ) . format ( 'MMM Do @ LT' ) : 'Unknown' ;
2020-02-10 08:02:45 +00:00
2022-03-17 19:50:57 +00:00
const getNextStat = ( x ) => {
if ( stats && stats [ x ] ) {
const datetime = moment . utc ( stats [ x ] . datetime ) . tz ( 'America/Edmonton' ) ;
if ( datetime . isSame ( moment ( ) . tz ( 'America/Edmonton' ) , 'day' ) ) {
return < > { datetime . format ( 'LT' ) } | < Link to = { '/classes/' + stats [ x ] . id } > { stats [ x ] . name } < /Link></ > ;
} else {
return < > { datetime . format ( 'MMM Do' ) } | < Link to = { '/classes/' + stats [ x ] . id } > { stats [ x ] . name } < /Link></ > ;
}
} else {
return 'Unknown' ;
}
} ;
2020-04-21 00:14:53 +00:00
const mcPlayers = stats && stats [ 'minecraft_players' ] ? stats [ 'minecraft_players' ] : [ ] ;
2020-10-31 22:54:05 +00:00
const mumbleUsers = stats && stats [ 'mumble_users' ] ? stats [ 'mumble_users' ] : [ ] ;
2020-04-21 00:14:53 +00:00
2022-01-17 21:46:53 +00:00
const getTrackStat = ( x ) => stats && stats . track && stats . track [ x ] ? moment ( ) . unix ( ) - stats . track [ x ] [ 'time' ] > 60 ? 'Free' : 'In Use' : 'Unknown' ;
2020-09-20 00:23:27 +00:00
const getTrackLast = ( x ) => stats && stats . track && stats . track [ x ] ? moment . unix ( stats . track [ x ] [ 'time' ] ) . tz ( 'America/Edmonton' ) . format ( 'llll' ) : 'Unknown' ;
const getTrackAgo = ( x ) => stats && stats . track && stats . track [ x ] ? moment . unix ( stats . track [ x ] [ 'time' ] ) . tz ( 'America/Edmonton' ) . fromNow ( ) : '' ;
2022-02-04 22:13:07 +00:00
const getTrackName = ( x ) => stats && stats . track && stats . track [ x ] && stats . track [ x ] [ 'first_name' ] ? stats . track [ x ] [ 'first_name' ] : 'Unknown' ;
2020-07-26 00:04:58 +00:00
2023-06-20 22:14:46 +00:00
const alarmStat = ( ) => stats && stats . alarm ? stats . alarm . toString ( ) : 'Unknown' ; // toString prevents crash from cached alarm Object
2021-09-08 03:34:12 +00:00
2023-08-21 22:10:48 +00:00
const closedStat = ( x ) => stats && stats . closing ? moment ( ) . unix ( ) > stats . closing [ 'time' ] ? 'Closed' : 'Open until ' + stats . closing [ 'time_str' ] + ' with ' + stats . closing [ 'first_name' ] : 'Unknown' ;
2023-03-02 04:36:40 +00:00
2023-03-18 23:59:36 +00:00
const printer3dStat = ( x ) => stats && stats . printer3d && stats . printer3d [ x ] ? stats . printer3d [ x ] . state === 'Printing' ? 'Printing (' + stats . printer3d [ x ] . progress + '%)' : stats . printer3d [ x ] . state : 'Unknown' ;
2023-03-18 23:42:09 +00:00
2021-11-15 05:57:18 +00:00
const show _signup = stats ? . at _protospace ;
2021-09-04 20:27:16 +00:00
2020-01-09 22:11:56 +00:00
return (
< Container >
2023-07-11 17:42:50 +00:00
< Grid stackable columns = { 2 } >
2020-01-09 22:11:56 +00:00
< Grid . Column >
{ user ?
user . member . set _details ?
< MemberInfo user = { user } / >
:
2023-07-11 17:42:50 +00:00
< AccountForm { ... props } isSignup = { true } / >
2020-01-09 22:11:56 +00:00
:
< div >
2021-11-15 05:57:18 +00:00
< LoginForm { ... props } / >
2020-01-09 22:11:56 +00:00
2021-11-15 05:57:18 +00:00
< Divider section horizontal > Or < / D i v i d e r >
2020-01-09 22:11:56 +00:00
2021-09-04 20:27:16 +00:00
< SignupForm { ... props } show _signup = { show _signup } / >
2020-01-09 22:11:56 +00:00
< / d i v >
}
< / G r i d . C o l u m n >
2022-02-04 22:18:05 +00:00
< Grid . Column >
2022-02-05 21:15:03 +00:00
{ user ? . member ? . set _details !== false &&
2022-02-04 22:18:05 +00:00
< Segment >
< Header size = 'medium' > Quick Links < / H e a d e r >
2022-12-21 23:44:01 +00:00
< p > < a href = 'https://protospace.ca/' target = '_blank' rel = 'noopener noreferrer' > Main Website < / a > < / p >
< p > < a href = 'https://wiki.protospace.ca/Welcome_to_Protospace' target = '_blank' rel = 'noopener noreferrer' > Protospace Wiki < / a > — < L i n k t o = ' / a u t h / w i k i ' > [ r e g i s t e r ] < / L i n k > < / p >
2022-03-14 04:41:15 +00:00
< p > < a href = 'https://forum.protospace.ca' target = '_blank' rel = 'noopener noreferrer' > Forum ( Spacebar ) < / a > — < L i n k t o = ' / a u t h / d i s c o u r s e ' > [ r e g i s t e r ] < / L i n k > < / p >
2022-02-04 22:18:05 +00:00
{ ! ! user && < p > < a href = 'https://drive.google.com/drive/folders/0By-vvp6fxFekfmU1cmdxaVRlaldiYXVyTE9rRnNVNjhkc3FjdkFIbjBwQkZ3MVVQX2Ezc3M?resourcekey=0-qVLjcYr8ZCmLypdINk2svg' target = '_blank' rel = 'noopener noreferrer' > Google Drive < / a > < / p > }
{ ! ! user && isAdmin ( user ) && < p > < a href = 'https://estancia.hippocmms.ca/' target = '_blank' rel = 'noopener noreferrer' > Property Management Portal < / a > < / p > }
2020-02-10 06:29:13 +00:00
2022-02-04 22:18:05 +00:00
< img className = 'swordfish' src = '/swordfish.png' onClick = { ( ) => refreshStats ( ) } / >
2020-01-09 22:11:56 +00:00
2022-02-04 22:18:05 +00:00
< div >
< Header size = 'medium' > Protospace Stats < / H e a d e r >
2022-03-20 20:18:57 +00:00
< p > Next meeting : { getDateStat ( 'next_meeting' ) } < / p >
< p > Next clean : { getDateStat ( 'next_clean' ) } < / p >
2022-03-17 19:50:57 +00:00
< p className = 'nowrap-stat' > Next class : { getNextStat ( 'next_class' ) } < / p >
< p className = 'nowrap-stat' > Last class : { getNextStat ( 'prev_class' ) } < / p >
2023-08-15 01:34:14 +00:00
< p > Member count : { getStat ( 'member_count' ) } < Link to = '/charts' > [ charts ] < / L i n k > < / p >
2022-02-04 22:18:05 +00:00
< p > Card scans today : { getZeroStat ( 'card_scans' ) } < / p >
< p >
Minecraft players : { mcPlayers . length } { mcPlayers . length > 5 && '🔥' } < Popup content = {
< React . Fragment >
< p >
Server IP : < br / >
games . protospace . ca
< / p >
< p >
Players : < br / >
{ mcPlayers . length ? mcPlayers . map ( x => < React . Fragment > { x } < br / > < / R e a c t . F r a g m e n t > ) : ' N o n e ' }
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
{ ' ' } < a href = 'http://games.protospace.ca:8123/?worldname=world&mapname=flat&zoom=3&x=74&y=64&z=354' target = '_blank' > [ map ] < / a >
< / p >
{ stats && stats . hasOwnProperty ( 'mumble_users' ) && < p >
Mumble users : { mumbleUsers . length } < Popup content = {
< React . Fragment >
< p >
Server IP : < br / >
mumble . protospace . ca
< / p >
< p >
Users : < br / >
{ mumbleUsers . length ? mumbleUsers . map ( x => < React . Fragment > { x } < br / > < / R e a c t . F r a g m e n t > ) : ' N o n e ' }
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
< / p > }
< p >
2022-09-15 03:57:40 +00:00
Trotec availability : { getTrackStat ( 'TROTECS300' ) } < Popup content = {
2022-02-04 22:18:05 +00:00
< React . Fragment >
< p >
2022-09-15 03:57:40 +00:00
Last use : < br / >
{ getTrackLast ( 'TROTECS300' ) } < br / >
{ getTrackAgo ( 'TROTECS300' ) } < br / >
by { getTrackName ( 'TROTECS300' ) }
2022-02-04 22:18:05 +00:00
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
< / p >
< p >
Rabbit availability : { getTrackStat ( 'FRICKIN-LASER' ) } < Popup content = {
< React . Fragment >
< p >
Last use : < br / >
{ getTrackLast ( 'FRICKIN-LASER' ) } < br / >
{ getTrackAgo ( 'FRICKIN-LASER' ) } < br / >
by { getTrackName ( 'FRICKIN-LASER' ) }
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
< / p >
< p >
Precix availability : { getTrackStat ( 'CNC-PRECIX' ) } < Popup content = {
< React . Fragment >
< p >
Last use : < br / >
{ getTrackLast ( 'CNC-PRECIX' ) } < br / >
{ getTrackAgo ( 'CNC-PRECIX' ) } < br / >
by { getTrackName ( 'CNC-PRECIX' ) }
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
< / p >
2023-04-26 20:47:02 +00:00
< p >
Media computer : { getTrackStat ( 'PROTOGRAPH1' ) } < Popup content = {
< React . Fragment >
< p >
Last use : < br / >
{ getTrackLast ( 'PROTOGRAPH1' ) } < br / >
{ getTrackAgo ( 'PROTOGRAPH1' ) } < br / >
by { getTrackName ( 'PROTOGRAPH1' ) }
< / p >
< p >
Last print : < br / >
{ getTrackLast ( 'LASTLARGEPRINT' ) } < br / >
{ getTrackAgo ( 'LASTLARGEPRINT' ) } < br / >
by { getTrackName ( 'LASTLARGEPRINT' ) }
< / p >
< / R e a c t . F r a g m e n t >
} trigger = { < a > [ more ] < /a>} / >
< / p >
2023-03-18 23:42:09 +00:00
< p > ORD2 printer : { printer3dStat ( 'ord2' ) } < / p >
< p > ORD3 printer : { printer3dStat ( 'ord3' ) } < / p >
2023-10-12 06:49:54 +00:00
{ user ?
< p > Alarm status : { alarmStat ( ) } < / p >
:
< p > Alarm status : Unauthorized < / p >
}
2023-03-02 04:36:40 +00:00
{ user && < p > Hosting status : { closedStat ( ) } < / p > }
2022-02-04 22:18:05 +00:00
< / d i v >
2021-12-03 05:18:41 +00:00
2022-02-04 22:18:05 +00:00
< SignForm token = { token } / >
2021-12-03 05:18:41 +00:00
2022-05-17 02:38:20 +00:00
< p > Protogarden : < / p >
< Link to = '/garden' >
< Image src = { staticUrl + '/garden-medium.jpg' } / >
< / L i n k >
2022-02-04 22:18:05 +00:00
< / S e g m e n t >
}
2020-01-09 22:11:56 +00:00
< / G r i d . C o l u m n >
< / G r i d >
< / C o n t a i n e r >
) ;
} ;