From 42d25deba5d15760068bcb5c417d8d8026357111 Mon Sep 17 00:00:00 2001
From: Tore Brede <Tore.Brede@uib.no>
Date: Tue, 16 Nov 2021 16:15:23 +0100
Subject: [PATCH] Adding feature flag functionality

---
 frontend/src/contexts/featureContext.ts       | 12 +++++++
 frontend/src/contexts/index.ts                |  3 +-
 frontend/src/index.tsx                        | 17 ++++++----
 frontend/src/providers/featureProvider.tsx    | 32 ++++++++++++++++++
 .../sponsor/register/stepPersonForm.tsx       | 33 +++++++++++--------
 5 files changed, 76 insertions(+), 21 deletions(-)
 create mode 100644 frontend/src/contexts/featureContext.ts
 create mode 100644 frontend/src/providers/featureProvider.tsx

diff --git a/frontend/src/contexts/featureContext.ts b/frontend/src/contexts/featureContext.ts
new file mode 100644
index 00000000..c8c4220b
--- /dev/null
+++ b/frontend/src/contexts/featureContext.ts
@@ -0,0 +1,12 @@
+import { createContext, useContext } from 'react'
+
+export interface IFeatureContext {
+  // Controls whether the contact person and comment optional fields be shown in the register new guest wizard
+  displayContactAndComment: boolean
+}
+
+export const FeatureContext = createContext<IFeatureContext>({
+  displayContactAndComment: true,
+})
+
+export const useFeatureContext = () => useContext(FeatureContext)
diff --git a/frontend/src/contexts/index.ts b/frontend/src/contexts/index.ts
index d6231cb0..c7483440 100644
--- a/frontend/src/contexts/index.ts
+++ b/frontend/src/contexts/index.ts
@@ -1,3 +1,4 @@
 import { UserContext, useUserContext } from './userContext'
+import { FeatureContext } from './featureContext'
 
-export { UserContext, useUserContext }
+export { UserContext, useUserContext, FeatureContext }
diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx
index becf7b9f..6532d0cc 100644
--- a/frontend/src/index.tsx
+++ b/frontend/src/index.tsx
@@ -11,19 +11,22 @@ import getTheme from 'themes'
 import App from 'routes'
 import { UserProvider } from 'providers'
 import reportWebVitals from './reportWebVitals'
+import FeatureProvider from './providers/featureProvider'
 
 function appRoot() {
   return (
     <React.StrictMode>
       <Router>
         <LocalizationProvider dateAdapter={AdapterDateFns}>
-          <ThemeProvider theme={getTheme()}>
-            <UserProvider>
-              <Suspense fallback={<CircularProgress />}>
-                <App />
-              </Suspense>
-            </UserProvider>
-          </ThemeProvider>
+          <FeatureProvider>
+            <ThemeProvider theme={getTheme()}>
+              <UserProvider>
+                <Suspense fallback={<CircularProgress />}>
+                  <App />
+                </Suspense>
+              </UserProvider>
+            </ThemeProvider>
+          </FeatureProvider>
         </LocalizationProvider>
       </Router>
     </React.StrictMode>
diff --git a/frontend/src/providers/featureProvider.tsx b/frontend/src/providers/featureProvider.tsx
new file mode 100644
index 00000000..1e04f994
--- /dev/null
+++ b/frontend/src/providers/featureProvider.tsx
@@ -0,0 +1,32 @@
+import { FeatureContext } from 'contexts'
+import React from 'react'
+import { appInst } from '../appConfig'
+import { IFeatureContext } from '../contexts/featureContext'
+
+type FeatureProviderProps = {
+  children: React.ReactNode
+}
+
+function FeatureProvider(props: FeatureProviderProps) {
+  const { children } = props
+
+  let features: IFeatureContext
+  switch (appInst) {
+    case 'uib':
+      features = { displayContactAndComment: false }
+      break
+
+    case 'uio':
+    default:
+      features = { displayContactAndComment: true }
+      break
+  }
+
+  return (
+    <FeatureContext.Provider value={features}>
+      {children}
+    </FeatureContext.Provider>
+  )
+}
+
+export default FeatureProvider
diff --git a/frontend/src/routes/sponsor/register/stepPersonForm.tsx b/frontend/src/routes/sponsor/register/stepPersonForm.tsx
index c13e7b5e..6524108d 100644
--- a/frontend/src/routes/sponsor/register/stepPersonForm.tsx
+++ b/frontend/src/routes/sponsor/register/stepPersonForm.tsx
@@ -11,9 +11,10 @@ import {
 } from '@mui/material'
 import { Controller, SubmitHandler, useForm } from 'react-hook-form'
 import { DatePicker } from '@mui/lab'
-import {
+import React, {
   forwardRef,
   Ref,
+  useContext,
   useEffect,
   useImperativeHandle,
   useState,
@@ -24,6 +25,7 @@ import { PersonFormMethods } from './personFormMethods'
 import useOus, { enSort, nbSort } from '../../../hooks/useOus'
 import useRoleTypes, { RoleTypeData } from '../../../hooks/useRoleTypes'
 import { isValidEmail } from '../../../utils'
+import { FeatureContext } from '../../../contexts'
 
 interface StepPersonFormProperties {
   nextHandler(formState: RegisterFormData): void
@@ -43,6 +45,7 @@ const StepPersonForm = forwardRef(
       formData.role_type ? formData.role_type : ''
     )
     const roleTypes = useRoleTypes()
+    const { displayContactAndComment } = useContext(FeatureContext)
 
     const roleTypeSort = () => (a: RoleTypeData, b: RoleTypeData) => {
       if (i18n.language === 'en') {
@@ -239,19 +242,23 @@ const StepPersonForm = forwardRef(
                 )}
               />
 
-              <TextField
-                id="contact_person"
-                label={t('input.contactPersonUnit')}
-                {...register(`contact_person_unit`)}
-              />
+              {displayContactAndComment && (
+                <>
+                  <TextField
+                    id="contact_person"
+                    label={t('input.contactPersonUnit')}
+                    {...register(`contact_person_unit`)}
+                  />
 
-              <TextField
-                id="comment"
-                label={t('input.comment')}
-                multiline
-                rows={5}
-                {...register(`comment`)}
-              />
+                  <TextField
+                    id="comment"
+                    label={t('input.comment')}
+                    multiline
+                    rows={5}
+                    {...register(`comment`)}
+                  />
+                </>
+              )}
             </Stack>
           </form>
         </Box>
-- 
GitLab