@@ -5,102 +5,116 @@ import { getTesterSettings } from '../utils/fetch/data';
55import AccessDenied from './AccessDenied' ;
66
77interface ProtectedRouteProps {
8- children : React . ReactNode ;
9- requireAdmin ?: boolean ;
10- requireTester ?: boolean ;
11- requireAuth ?: boolean ;
12- requirePermission ?: string ;
13- accessDeniedMessage ?: string ;
8+ children : React . ReactNode ;
9+ requireAdmin ?: boolean ;
10+ requireTester ?: boolean ;
11+ requireAuth ?: boolean ;
12+ requirePermission ?: string ;
13+ accessDeniedMessage ?: string ;
1414}
1515
1616export default function ProtectedRoute ( {
17- children,
18- requireAdmin = false ,
19- requireTester = true ,
20- requireAuth = true ,
21- requirePermission,
17+ children,
18+ requireAdmin = false ,
19+ requireTester = true ,
20+ requireAuth = true ,
21+ requirePermission,
2222} : ProtectedRouteProps ) {
23- const { user, isLoading } = useAuth ( ) ;
24- const [ testerGateEnabled , setTesterGateEnabled ] = useState < boolean | null > (
25- null
26- ) ;
23+ const { user, isLoading } = useAuth ( ) ;
24+ const [ testerGateEnabled , setTesterGateEnabled ] = useState < boolean | null > (
25+ null
26+ ) ;
27+
28+ const shouldBypassTesterGate = ( ) => {
29+ return window . location . hostname === 'control.pfconnect.online' ;
30+ } ;
31+
32+ useEffect ( ( ) => {
33+ if ( ! requireTester || ( user && user . isAdmin ) ) {
34+ setTesterGateEnabled ( false ) ;
35+ return ;
36+ }
2737
28- useEffect ( ( ) => {
29- if ( ! requireTester || ( user && user . isAdmin ) ) {
30- setTesterGateEnabled ( false ) ;
31- return ;
38+ const checkGateStatus = async ( ) => {
39+ try {
40+ if ( shouldBypassTesterGate ( ) ) {
41+ setTesterGateEnabled ( false ) ;
42+ return ;
3243 }
3344
34- const checkGateStatus = async ( ) => {
35- try {
36- const settings = await getTesterSettings ( ) ;
45+ const settings = await getTesterSettings ( ) ;
3746
38- if (
39- settings &&
40- typeof settings . tester_gate_enabled === 'boolean'
41- ) {
42- setTesterGateEnabled ( settings . tester_gate_enabled ) ;
43- } else {
44- console . error (
45- 'Failed to fetch tester settings or invalid response:' ,
46- settings
47- ) ;
48- setTesterGateEnabled ( true ) ;
49- }
50- } catch ( error ) {
51- console . error ( 'Error fetching tester settings:' , error ) ;
52- setTesterGateEnabled ( true ) ;
53- }
54- } ;
47+ if ( settings && typeof settings . tester_gate_enabled === 'boolean' ) {
48+ setTesterGateEnabled ( settings . tester_gate_enabled ) ;
49+ } else {
50+ console . error (
51+ 'Failed to fetch tester settings or invalid response:' ,
52+ settings
53+ ) ;
54+ setTesterGateEnabled ( true ) ;
55+ }
56+ } catch ( error ) {
57+ console . error ( 'Error fetching tester settings:' , error ) ;
58+ setTesterGateEnabled ( true ) ;
59+ }
60+ } ;
5561
56- checkGateStatus ( ) ;
57- } , [ requireTester , user ] ) ;
62+ checkGateStatus ( ) ;
63+ } , [ requireTester , user ] ) ;
5864
59- if ( isLoading || ( requireTester && testerGateEnabled === null ) ) {
60- return null ;
61- }
65+ if ( isLoading || ( requireTester && testerGateEnabled === null ) ) {
66+ return null ;
67+ }
6268
63- if ( requireAuth && ! user ) {
64- return < Navigate to = "/login" replace /> ;
65- }
66- if ( user && user . isBanned ) {
67- return < AccessDenied errorType = "banned" /> ;
68- }
69- if ( requireAdmin && user && ! user . isAdmin ) {
70- return < AccessDenied message = "Administrator Access Required" /> ;
71- }
69+ if ( requireAuth && ! user ) {
70+ return < Navigate to = "/login" replace /> ;
71+ }
72+ if ( user && user . isBanned ) {
73+ return < AccessDenied errorType = "banned" /> ;
74+ }
75+ if ( requireAdmin && user && ! user . isAdmin ) {
76+ return < AccessDenied message = "Administrator Access Required" /> ;
77+ }
7278
73- if ( requirePermission && user && ! user . isAdmin ) {
74- const hasPermission =
75- user . rolePermissions && user . rolePermissions [ requirePermission ] ;
76- if ( ! hasPermission ) {
77- return (
78- < AccessDenied
79- message = "Insufficient Permissions"
80- description = { `You need '${ requirePermission } ' permission to access this page.` }
81- />
82- ) ;
83- }
84- }
85- if (
86- requireTester &&
87- testerGateEnabled &&
88- user &&
89- ! user . isAdmin &&
90- ! user . isTester
91- ) {
92- return (
93- < AccessDenied
94- message = "Tester Access Required"
95- description = "This application is currently in testing. Please contact an administrator if you believe you should have access."
96- errorType = "tester-required"
97- />
98- ) ;
79+ if ( requirePermission && user && ! user . isAdmin ) {
80+ const hasPermission =
81+ user . rolePermissions && user . rolePermissions [ requirePermission ] ;
82+ if ( ! hasPermission ) {
83+ return (
84+ < AccessDenied
85+ message = "Insufficient Permissions"
86+ description = { `You need '${ requirePermission } ' permission to access this page.` }
87+ />
88+ ) ;
9989 }
90+ }
10091
101- if ( ! requireAuth && requireTester && testerGateEnabled && ! user ) {
102- return < Navigate to = "/login" replace /> ;
103- }
92+ if (
93+ requireTester &&
94+ testerGateEnabled &&
95+ ! shouldBypassTesterGate ( ) &&
96+ user &&
97+ ! user . isAdmin &&
98+ ! user . isTester
99+ ) {
100+ return (
101+ < AccessDenied
102+ message = "Tester Access Required"
103+ description = "This application is currently in testing. Please contact an administrator if you believe you should have access."
104+ errorType = "tester-required"
105+ />
106+ ) ;
107+ }
108+
109+ if (
110+ ! requireAuth &&
111+ requireTester &&
112+ testerGateEnabled &&
113+ ! shouldBypassTesterGate ( ) &&
114+ ! user
115+ ) {
116+ return < Navigate to = "/login" replace /> ;
117+ }
104118
105- return < > { children } </ > ;
119+ return < > { children } </ > ;
106120}
0 commit comments