Replace react-native-ui-lib with homegrown components

This commit is contained in:
ponas committed 2026-07-26 19:43:04 +02:00
1 parent 300bb71985
commit d1a686caf6
16 files changed
+182 -247

No files matched your search

-10
View File
@@ -14,16 +14,6 @@ global.fetch = jest.fn(async () => ({
json: async () => ({ events: [] }),
}));
// react-native-ui-lib calls StatusBarManager.getHeight at import time,
// which the react-native jest mock does not provide.
const { NativeModules } = require('react-native');
NativeModules.StatusBarManager = {
HEIGHT: 42,
...NativeModules.StatusBarManager,
getHeight: (callback) => callback({ height: 42 }),
};
jest.mock('@react-native-async-storage/async-storage', () =>
require('@react-native-async-storage/async-storage/jest/async-storage-mock'),
);
+4 -213
View File
@@ -37,7 +37,6 @@
"react-native-simple-radio-button": "^2.7.4",
"react-native-svg": "15.15.3",
"react-native-svg-transformer": "^1.5.3",
"react-native-ui-lib": "^7.26.2",
"react-native-worklets": "0.7.4",
"react-redux": "^9.2.0",
"redux": "^5.0.1",
@@ -3354,12 +3353,6 @@
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/normalize-color": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz",
"integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==",
"license": "MIT"
},
"node_modules/@react-native/normalize-colors": {
"version": "0.83.6",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.6.tgz",
@@ -5011,12 +5004,6 @@
"node": ">=6.5"
}
},
"node_modules/abs-svg-path": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz",
"integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==",
"license": "MIT"
},
"node_modules/accepts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -5613,12 +5600,6 @@
"@babel/plugin-syntax-flow": "^7.12.1"
}
},
"node_modules/babel-plugin-transform-inline-environment-variables": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.0.2.tgz",
"integrity": "sha512-8gobU7uuTIjz62aXTEZOH5yhuIPojNVAgLK0xnepdGS19aqOEphy7FVWBsojPa14yrQGM/w63uDox4thYcHCnA==",
"license": "MIT"
},
"node_modules/babel-preset-current-node-syntax": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
@@ -6145,16 +6126,6 @@
"node": ">= 10"
}
},
"node_modules/commons-validator-js": {
"version": "1.0.1669",
"resolved": "https://registry.npmjs.org/commons-validator-js/-/commons-validator-js-1.0.1669.tgz",
"integrity": "sha512-T6rxAirPJuBpf9oPvn+ayNgGMAgaLcvDLfP1kzyMKpp+5AK2ARczHQK/r80SKRnR6fP6ElXOWGtH4zeAJ9DjmQ==",
"license": "Apache-2.0",
"dependencies": {
"lodash.includes": "^4.3.0",
"punycode": "^1.4.1"
}
},
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -6517,22 +6488,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/date-fns": {
"version": "2.30.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
"integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.21.0"
},
"engines": {
"node": ">=0.11"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/date-fns"
}
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -6673,17 +6628,6 @@
"node": ">= 0.8"
}
},
"node_modules/deprecated-react-native-prop-types": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz",
"integrity": "sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA==",
"license": "MIT",
"dependencies": {
"@react-native/normalize-color": "*",
"invariant": "*",
"prop-types": "*"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@@ -12295,6 +12239,7 @@
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.debounce": {
@@ -12303,12 +12248,6 @@
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -13186,15 +13125,6 @@
"node": ">=0.10.0"
}
},
"node_modules/normalize-svg-path": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz",
"integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==",
"license": "MIT",
"dependencies": {
"svg-arc-to-cubic-bezier": "^3.0.0"
}
},
"node_modules/npm-package-arg": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
@@ -13697,12 +13627,6 @@
"node": ">=10"
}
},
"node_modules/parse-svg-path": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
"integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==",
"license": "MIT"
},
"node_modules/parse5": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -14138,12 +14062,6 @@
"node": ">=6"
}
},
"node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
"license": "MIT"
},
"node_modules/pure-rand": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
@@ -14183,6 +14101,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"dev": true,
"license": "MIT"
},
"node_modules/queue": {
@@ -14440,33 +14359,6 @@
"node": ">=10"
}
},
"node_modules/react-native-redash": {
"version": "12.6.1",
"resolved": "https://registry.npmjs.org/react-native-redash/-/react-native-redash-12.6.1.tgz",
"integrity": "sha512-SChHzssVr512PfZxGCcVMmlAzQ20k5BkC8BiSfZls6bFohLiJT3ih6Of9mPmaTENCQWe7ywTx7gzr3tAnIu2mg==",
"license": "MIT",
"dependencies": {
"abs-svg-path": "^0.1.1",
"normalize-svg-path": "^1.0.1",
"parse-svg-path": "^0.1.2",
"use-memo-one": "^1.1.1"
},
"peerDependencies": {
"react": "*",
"react-native": "*",
"react-native-gesture-handler": "*",
"react-native-reanimated": "*"
}
},
"node_modules/react-native-redash/node_modules/use-memo-one": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz",
"integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-native-safe-area-context": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
@@ -14528,74 +14420,6 @@
"react-native-svg": ">=12.0.0"
}
},
"node_modules/react-native-ui-lib": {
"version": "7.46.3",
"resolved": "https://registry.npmjs.org/react-native-ui-lib/-/react-native-ui-lib-7.46.3.tgz",
"integrity": "sha512-oE564MpcQNTYLsGN/9YgTt2Cr6NlJUs8a71trZr2AyRTeSMN8OjGOAnos+SuKL65VW9BYwYNw5iKViwhjfcWLw==",
"license": "MIT",
"dependencies": {
"babel-plugin-transform-inline-environment-variables": "^0.0.2",
"color": "^3.1.0",
"commons-validator-js": "^1.0.237",
"date-fns": "^2.29.3",
"deprecated-react-native-prop-types": "^2.3.0",
"hoist-non-react-statics": "^3.0.0",
"lodash": "^4.17.21",
"memoize-one": "^5.0.5",
"prop-types": "^15.5.10",
"react-freeze": "^1.0.0",
"react-native-redash": "^12.0.3",
"semver": "^5.5.0",
"tinycolor2": "^1.4.2",
"uilib-native": "4.5.1",
"url-parse": "^1.2.0",
"wix-react-native-text-size": "1.0.9"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"react": ">=17.0.1",
"react-native": ">=0.64.1",
"react-native-gesture-handler": ">=2.5.0",
"react-native-reanimated": ">=2.0.0",
"react-native-ui-lib": "*"
}
},
"node_modules/react-native-ui-lib/node_modules/color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
"integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"license": "MIT",
"dependencies": {
"color-convert": "^1.9.3",
"color-string": "^1.6.0"
}
},
"node_modules/react-native-ui-lib/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"license": "MIT",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/react-native-ui-lib/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"license": "MIT"
},
"node_modules/react-native-ui-lib/node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"license": "ISC",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/react-native-worklets": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.7.4.tgz",
@@ -14990,6 +14814,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true,
"license": "MIT"
},
"node_modules/resolve": {
@@ -16107,12 +15932,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svg-arc-to-cubic-bezier": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
"integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==",
"license": "ISC"
},
"node_modules/svg-parser": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
@@ -16315,12 +16134,6 @@
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
"license": "MIT"
},
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
@@ -16668,20 +16481,6 @@
"node": ">=14.17"
}
},
"node_modules/uilib-native": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/uilib-native/-/uilib-native-4.5.1.tgz",
"integrity": "sha512-hcs4RSIqFqO9b2yLzvcVzj85XmC3WOR16dyUOh4RAcOoNpTMf0f2Tc4MazNLCeU8B/UO8WyVOcr2NvSHaiU6KQ==",
"license": "MIT",
"dependencies": {
"lodash": "^4.17.21",
"prop-types": "^15.5.10"
},
"peerDependencies": {
"react": ">=17.0.1",
"react-native": ">=0.64.1"
}
},
"node_modules/unbox-primitive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
@@ -16858,6 +16657,7 @@
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"querystringify": "^2.1.1",
@@ -17141,15 +16941,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/wix-react-native-text-size": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/wix-react-native-text-size/-/wix-react-native-text-size-1.0.9.tgz",
"integrity": "sha512-ymqEt4cfOQisFU/aTrDLvu5iVCcoSo+brlA4mwVHNtq8cpKGNRKBDsMMzFApGkUmQ6tJSDhzm5QHXv+3aE6tqw==",
"license": "BSD-2-Clause",
"peerDependencies": {
"react-native": ">=0.59.0"
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
-1
View File
@@ -44,7 +44,6 @@
"react-native-simple-radio-button": "^2.7.4",
"react-native-svg": "15.15.3",
"react-native-svg-transformer": "^1.5.3",
"react-native-ui-lib": "^7.26.2",
"react-native-worklets": "0.7.4",
"react-redux": "^9.2.0",
"redux": "^5.0.1",
-3
View File
@@ -12,7 +12,6 @@ import 'expo-dev-client';
import AppInner from './AppInner';
import { useDeepLinking } from './hooks';
import { store, persistor } from './reduxStore';
import { loadTheme } from './theme';
// Configure notifications
Notifications.setNotificationHandler({
@@ -28,8 +27,6 @@ const apolloClient = new ApolloClient({
cache: new InMemoryCache(),
});
loadTheme();
export default function App() {
useDeepLinking();
return (
+57
View File
@@ -0,0 +1,57 @@
import React from 'react';
import { Pressable, PressableProps, StyleProp, StyleSheet, ViewStyle } from 'react-native';
import theme from 'src/theme';
export type ButtonProps = Omit<PressableProps, 'style'> & {
style?: StyleProp<ViewStyle>;
fullWidth?: boolean;
small?: boolean;
children?: React.ReactNode;
};
const Button = ({ style, fullWidth, small, disabled, children, ...rest }: ButtonProps) => (
<Pressable
accessibilityRole="button"
disabled={disabled}
style={({ pressed }) => [
styles.base,
small && styles.small,
fullWidth && styles.fullWidth,
style,
pressed && styles.pressed,
disabled && styles.disabled,
]}
{...rest}
>
{children}
</Pressable>
);
const styles = StyleSheet.create({
base: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 20,
borderRadius: 24,
backgroundColor: theme.colors.neufBeige,
},
small: {
paddingVertical: 6,
paddingHorizontal: 14,
borderRadius: 20,
},
fullWidth: {
alignSelf: 'stretch',
},
pressed: {
opacity: 0.7,
},
disabled: {
opacity: 0.6,
},
});
export default Button;
+1 -1
View File
@@ -1,8 +1,8 @@
import React from 'react';
import { Controller, UseControllerProps } from 'react-hook-form';
import { ReturnKeyTypeOptions, Text, StyleSheet } from 'react-native';
import { TextField, TextFieldProps } from 'react-native-ui-lib';
import TextField, { TextFieldProps } from 'src/components/TextField';
import theme from 'src/theme';
type FormInputProps = {
+31
View File
@@ -0,0 +1,31 @@
import React from 'react';
import { StyleProp, StyleSheet, Text, TextInput, TextInputProps, TextStyle, View, ViewStyle } from 'react-native';
export type TextFieldProps = TextInputProps & {
label?: React.ReactNode;
fieldStyle?: StyleProp<ViewStyle | TextStyle>;
};
const TextField = React.forwardRef<TextInput, TextFieldProps>(({ label, fieldStyle, style, ...rest }, ref) => (
<View style={styles.container}>
{label != null &&
(typeof label === 'string' || typeof label === 'number' ? <Text style={styles.label}>{label}</Text> : label)}
<TextInput ref={ref} style={[styles.input, fieldStyle, style]} {...rest} />
</View>
));
TextField.displayName = 'TextField';
const styles = StyleSheet.create({
container: {
marginVertical: 4,
},
label: {
marginBottom: 2,
},
input: {
fontSize: 16,
},
});
export default TextField;
+78
View File
@@ -0,0 +1,78 @@
import React, { useEffect, useRef, useState } from 'react';
import { Animated, StyleSheet, Text } from 'react-native';
import theme from 'src/theme';
export type ToastProps = {
message?: string;
visible?: boolean;
position?: 'top' | 'bottom';
autoDismiss?: number;
onDismiss?: () => void;
};
const Toast = ({ message, visible, position = 'bottom', autoDismiss, onDismiss }: ToastProps) => {
const [mounted, setMounted] = useState(!!visible);
const opacity = useRef(new Animated.Value(0)).current;
useEffect(() => {
let timer: ReturnType<typeof setTimeout> | undefined;
if (visible) {
setMounted(true);
Animated.timing(opacity, { toValue: 1, duration: 200, useNativeDriver: true }).start();
if (autoDismiss && onDismiss) {
timer = setTimeout(onDismiss, autoDismiss);
}
} else {
Animated.timing(opacity, { toValue: 0, duration: 200, useNativeDriver: true }).start(({ finished }) => {
if (finished) {
setMounted(false);
}
});
}
return () => {
if (timer) {
clearTimeout(timer);
}
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible, autoDismiss]);
if (!mounted) {
return null;
}
return (
<Animated.View
pointerEvents="none"
style={[styles.container, position === 'top' ? styles.top : styles.bottom, { opacity }]}
>
<Text style={styles.message}>{message}</Text>
</Animated.View>
);
};
const styles = StyleSheet.create({
container: {
position: 'absolute',
left: 16,
right: 16,
backgroundColor: theme.colors.neufBlack,
borderRadius: 8,
paddingVertical: 12,
paddingHorizontal: 16,
},
top: {
top: 48,
},
bottom: {
bottom: 48,
},
message: {
color: theme.colors.neufWhite,
textAlign: 'center',
fontSize: 15,
},
});
export default Toast;
+1 -1
View File
@@ -10,7 +10,6 @@ import {
ScrollView,
Dimensions,
} from 'react-native';
import { Button } from 'react-native-ui-lib';
import logo from 'assets/DNS-logo-svart.png';
import IconClock from 'assets/icons/clock.svg';
@@ -20,6 +19,7 @@ import IconMail from 'assets/icons/mail.svg';
import IconMap from 'assets/icons/map.svg';
import IconPhone from 'assets/icons/phone.svg';
import IconTiktok from 'assets/icons/tiktok.svg';
import Button from 'src/components/Button';
import theme from 'src/theme';
const CHATEAU_NEUF_ADDRESS = 'Det Norske Studentersamfund, Slemdalsveien 15, 0369 Oslo';
+1 -1
View File
@@ -2,9 +2,9 @@ import { SimpleLineIcons as Icon } from '@expo/vector-icons';
import moment from 'moment';
import React from 'react';
import { StyleSheet, View, Platform, FlatList, TouchableOpacity, Text, Linking } from 'react-native';
import { Button } from 'react-native-ui-lib';
import 'moment/locale/nb';
import Button from 'src/components/Button';
import theme from 'src/theme';
import { EventType } from 'src/types/data';
+1 -2
View File
@@ -1,7 +1,7 @@
import React from 'react';
import { ActivityIndicator, Linking, StyleSheet, View, Text, ScrollView } from 'react-native';
import { Button } from 'react-native-ui-lib';
import Button from 'src/components/Button';
import FormErrors from 'src/components/FormErrors';
import FormInput from 'src/components/FormInput';
import theme from 'src/theme';
@@ -46,7 +46,6 @@ const Login = () => {
{isLoggingIn && <ActivityIndicator color={theme.colors.neufOrange} />}
<Button
small
light
onPress={() => {
Linking.openURL(process.env.EXPO_PUBLIC_DUSKEN_FORGOT_PASSWORD_URL || '');
}}
+1 -1
View File
@@ -1,7 +1,7 @@
import React from 'react';
import { ScrollView, Text, View, StyleSheet } from 'react-native';
import { Button } from 'react-native-ui-lib';
import Button from 'src/components/Button';
import theme from 'src/theme';
interface MembershipInfoProps {
+2 -3
View File
@@ -14,9 +14,10 @@ import {
Switch,
} from 'react-native';
import Confetti from 'react-native-confetti';
import { Button, Incubator } from 'react-native-ui-lib';
import Button from 'src/components/Button';
import RadioButton from 'src/components/RadioButton';
import Toast from 'src/components/Toast';
import { useNotifications } from 'src/hooks/useNotifications';
import theme from 'src/theme';
import type { UserType } from 'src/types/data';
@@ -24,8 +25,6 @@ import type { UserType } from 'src/types/data';
import useProof from './useProof';
import logo from '../../../assets/DNS-logo-svart.png';
const { Toast } = Incubator;
const MembershipValidTo = ({ user }: { user: UserType }) => {
if (!user.last_membership) {
return null;
+1 -1
View File
@@ -1,7 +1,7 @@
import React from 'react';
import { ActivityIndicator, ScrollView, Text, TextInput, View, StyleSheet } from 'react-native';
import { Button } from 'react-native-ui-lib';
import Button from 'src/components/Button';
import FormErrors from 'src/components/FormErrors';
import { useAppSelector } from 'src/hooks';
import theme from 'src/theme';
+2 -3
View File
@@ -1,17 +1,16 @@
import * as EmailValidator from 'email-validator';
import React from 'react';
import { ActivityIndicator, StyleSheet, Text, ScrollView } from 'react-native';
import { Button, Incubator } from 'react-native-ui-lib';
import Button from 'src/components/Button';
import FormErrors from 'src/components/FormErrors';
import FormInput from 'src/components/FormInput';
import PrivacyButton from 'src/components/PrivacyButton';
import Toast from 'src/components/Toast';
import theme from 'src/theme';
import useUserRegister from './useUserRegister';
const { Toast } = Incubator;
const UserRegister = () => {
const {
isRegisteringUser,
+2 -7
View File
@@ -1,5 +1,4 @@
import { Platform } from 'react-native';
import { Colors } from 'react-native-ui-lib';
const colors = {
danger: '#d9534f',
@@ -52,11 +51,7 @@ const button = {
const buttonText = {
color: colors.neufPurple,
fontWeight: 500,
};
export function loadTheme() {
Colors.loadDesignTokens({ primaryColor: colors.neufBeige });
}
fontWeight: '500',
} as const;
export default { card, colors, background, text, button, buttonText };