From 1aaaeb64e31531185c0ef75bff61c97f0cf942c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sarstr=C3=B6m?= Date: Fri, 12 Nov 2021 17:06:11 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Started=20on=20provider?= =?UTF-8?q?=20for=20selecting=20platform=20+=20feature=20to?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/skolplattformen-sthlm/App.js | 59 +++++++++++-------- .../components/login.component.tsx | 17 +++--- .../schoolPlatform/schoolPlatformContext.tsx | 37 ++++++++++++ .../hooks/useSettingsStorage.tsx | 2 +- libs/api-hjarntorget/lib/features.ts | 5 ++ libs/api/lib/features.ts | 4 ++ libs/api/lib/index.ts | 3 +- libs/api/package.json | 3 +- libs/hooks/src/feature.tsx | 27 +++++++++ 9 files changed, 122 insertions(+), 35 deletions(-) create mode 100644 apps/skolplattformen-sthlm/context/schoolPlatform/schoolPlatformContext.tsx create mode 100644 libs/api-hjarntorget/lib/features.ts create mode 100644 libs/api/lib/features.ts create mode 100644 libs/hooks/src/feature.tsx diff --git a/apps/skolplattformen-sthlm/App.js b/apps/skolplattformen-sthlm/App.js index 65e4be52..faae0b0b 100644 --- a/apps/skolplattformen-sthlm/App.js +++ b/apps/skolplattformen-sthlm/App.js @@ -1,20 +1,28 @@ import * as eva from '@eva-design/eva' import AsyncStorage from '@react-native-async-storage/async-storage' import CookieManager from '@react-native-cookies/cookies' -import init from '@skolplattformen/api-hjarntorget' +import initSkolplattformen from '@skolplattformen/api-skolplattformen' +import initHjarntorget from '@skolplattformen/api-hjarntorget' + import { ApiProvider } from '@skolplattformen/hooks' import { ApplicationProvider, IconRegistry } from '@ui-kitten/components' import { EvaIconsPack } from '@ui-kitten/eva-icons' -import React, { useState } from 'react' +import React, { useContext } from 'react' import { StatusBar, useColorScheme } from 'react-native' import { SafeAreaProvider } from 'react-native-safe-area-context' import { AppNavigator } from './components/navigation.component' import { LanguageProvider } from './context/language/languageContext' +import { + SchoolPlatformProvider, + SchoolPlatformContext, +} from './context/schoolPlatform/schoolPlatformContext' import { default as customMapping } from './design/mapping.json' import { darkTheme, lightTheme } from './design/themes' import useSettingsStorage from './hooks/useSettingsStorage' import { translations } from './utils/translation' -const api = init(fetch, CookieManager) + +const apiSkolplattformen = initSkolplattformen(fetch, CookieManager) +const apiHjarntorget = initHjarntorget(fetch, CookieManager) const reporter = __DEV__ ? { @@ -59,26 +67,31 @@ export default () => { const systemTheme = useColorScheme() const colorScheme = usingSystemTheme ? systemTheme : theme - return ( - - - - - - - - - - - + + + + + + + + + + + + + ) } diff --git a/apps/skolplattformen-sthlm/components/login.component.tsx b/apps/skolplattformen-sthlm/components/login.component.tsx index df1139ff..2118d769 100644 --- a/apps/skolplattformen-sthlm/components/login.component.tsx +++ b/apps/skolplattformen-sthlm/components/login.component.tsx @@ -13,7 +13,7 @@ import { useStyleSheet, } from '@ui-kitten/components' import Personnummer from 'personnummer' -import React, { useEffect, useState } from 'react' +import React, { useContext, useEffect, useState } from 'react' import { Image, Linking, @@ -22,6 +22,7 @@ import { View, } from 'react-native' import { schema } from '../app.json' +import { SchoolPlatformContext } from '../context/schoolPlatform/schoolPlatformContext' import useSettingsStorage from '../hooks/useSettingsStorage' import { useTranslation } from '../hooks/useTranslation' import { Layout as LayoutStyle, Sizing, Typography } from '../styles' @@ -56,8 +57,8 @@ export const Login = () => { const [loginMethodIndex, setLoginMethodIndex] = useSettingsStorage('loginMethodIndex') - const [schoolPlatform, setSchoolPlatform] = useSettingsStorage( - 'currentSchoolPlatform' + const { currentSchoolPlatform, changeSchoolPlatform } = useContext( + SchoolPlatformContext ) const { t } = useTranslation() @@ -73,11 +74,11 @@ export const Login = () => { const schoolPlatforms = [ { id: 'stockholm-skolplattformen', - displayName: 'Stockholm stad', + displayName: 'Stockholm stad (Skolplattformen)', }, { id: 'goteborg-hjarnkontoret', - displayName: 'Göteborg stad', + displayName: 'Göteborg stad (Hjärntorget)', }, ] @@ -98,7 +99,7 @@ export const Login = () => { } const getSchoolPlatformName = () => { - return schoolPlatforms.find((item) => item.id === schoolPlatform) + return schoolPlatforms.find((item) => item.id === currentSchoolPlatform) ?.displayName } @@ -296,10 +297,10 @@ export const Login = () => { title={item.displayName} accessible={true} accessoryRight={ - schoolPlatform === item.id ? CheckIcon : undefined + currentSchoolPlatform === item.id ? CheckIcon : undefined } onPress={() => { - setSchoolPlatform(item.id) + changeSchoolPlatform(item.id) setShowSchoolPlatformPicker(false) }} /> diff --git a/apps/skolplattformen-sthlm/context/schoolPlatform/schoolPlatformContext.tsx b/apps/skolplattformen-sthlm/context/schoolPlatform/schoolPlatformContext.tsx new file mode 100644 index 00000000..e95b9493 --- /dev/null +++ b/apps/skolplattformen-sthlm/context/schoolPlatform/schoolPlatformContext.tsx @@ -0,0 +1,37 @@ +import useSettingsStorage from '../../hooks/useSettingsStorage' +import React, { createContext } from 'react' + +interface SchoolPlatformProps { + currentSchoolPlatform: string + changeSchoolPlatform: (platform: string) => void +} + +const defaultState: SchoolPlatformProps = { + currentSchoolPlatform: 'stockholm-skolplattformen', + changeSchoolPlatform: (platform: string) => + console.log('DEBUG ONLY: changing to', platform), +} + +export const SchoolPlatformProvider: React.FC = ({ children }) => { + const [currentSchoolPlatform, setCurrentSchoolPlatform] = useSettingsStorage( + 'currentSchoolPlatform' + ) + + const changeSchoolPlatform = (platform: string) => { + setCurrentSchoolPlatform(platform) + } + + return ( + + {children} + + ) +} + +export const SchoolPlatformContext = + createContext(defaultState) diff --git a/apps/skolplattformen-sthlm/hooks/useSettingsStorage.tsx b/apps/skolplattformen-sthlm/hooks/useSettingsStorage.tsx index a21eba98..607276ad 100644 --- a/apps/skolplattformen-sthlm/hooks/useSettingsStorage.tsx +++ b/apps/skolplattformen-sthlm/hooks/useSettingsStorage.tsx @@ -9,7 +9,7 @@ export const settingsState = proxy({ usingSystemTheme: true, theme: 'light', cachedPersonalIdentityNumber: '', - currentSchoolPlatform: 'stockholm-skolplattformen' + currentSchoolPlatform: 'stockholm-skolplattformen', }, }) diff --git a/libs/api-hjarntorget/lib/features.ts b/libs/api-hjarntorget/lib/features.ts new file mode 100644 index 00000000..b5067cd7 --- /dev/null +++ b/libs/api-hjarntorget/lib/features.ts @@ -0,0 +1,5 @@ +import { Feature } from '@skolplattformen/api' + +export const features: Feature[] = [ + { name: 'login', enabled: true }, +] \ No newline at end of file diff --git a/libs/api/lib/features.ts b/libs/api/lib/features.ts new file mode 100644 index 00000000..600de8b9 --- /dev/null +++ b/libs/api/lib/features.ts @@ -0,0 +1,4 @@ +export interface Feature { + name: string; + enabled: boolean; +} \ No newline at end of file diff --git a/libs/api/lib/index.ts b/libs/api/lib/index.ts index eef1c057..00aa57dd 100644 --- a/libs/api/lib/index.ts +++ b/libs/api/lib/index.ts @@ -13,4 +13,5 @@ export { } from './cookies' export { URLSearchParams } from './URLSearchParams' -export { wrap }; \ No newline at end of file +export { wrap }; +export { Feature } from './features' \ No newline at end of file diff --git a/libs/api/package.json b/libs/api/package.json index 83ec8632..4c542504 100644 --- a/libs/api/package.json +++ b/libs/api/package.json @@ -2,8 +2,7 @@ "name": "@skolplattformen/api", "version": "0.15.0", "description": "", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "lib/index.ts", "files": [ "dist/**/*" ], diff --git a/libs/hooks/src/feature.tsx b/libs/hooks/src/feature.tsx new file mode 100644 index 00000000..30bc8de6 --- /dev/null +++ b/libs/hooks/src/feature.tsx @@ -0,0 +1,27 @@ +import { Feature } from '@skolplattformen/api' +import React from 'react' + +const FeatureFlagsContext = React.createContext([]) + +interface Props { + features: Feature[] +} + +export const FeatureProvider: React.FC = (props) => { + return ( + + {props.children} + + ) +} + +export const useFeature = (name: string) => { + const features = React.useContext(FeatureFlagsContext) + if (features === null) { + throw new Error('You must wrap your components in a FeatureProvider.') + } + + const feature = features.find((f) => f.name === name) + + return feature && feature.enabled +}