Skip to content
Snippets Groups Projects
alerts.tsx 2.16 KiB
// @ts-strict-ignore
import React, { type ComponentType, type ReactNode } from 'react';

import { SvgExclamationOutline, SvgInformationOutline } from '../icons/v1';
import { styles, theme, type CSSProperties } from '../style';

import { Text } from './common/Text';
import { View } from './common/View';

type AlertProps = {
  icon?: ComponentType<{ width?: number; style?: CSSProperties }>;
  color?: string;
  backgroundColor?: string;
  style?: CSSProperties;
  children?: ReactNode;
};

const Alert = ({
  icon: Icon,
  color,
  backgroundColor,
  style,
  children,
}: AlertProps) => {
  return (
    <View
      style={{
        color,
        fontSize: 13,
        ...styles.shadow,
        borderRadius: 4,
        backgroundColor,
        padding: 10,
        flexDirection: 'row',
        '& a, & a:active, & a:visited': {
          color: theme.formLabelText,
        },
        ...style,
      }}
    >
      <View
        style={{
          paddingLeft: 2,
          paddingTop: '.11em',
          alignSelf: 'stretch',
          flexShrink: 0,
          marginRight: 5,
        }}
      >
        <Icon width={13} style={{ marginTop: 2 }} />
      </View>
      <Text style={{ zIndex: 1, lineHeight: 1.5 }}>{children}</Text>
    </View>
  );
};

type ScopedAlertProps = {
  style?: CSSProperties;
  children?: ReactNode;
};

export const Information = ({ style, children }: ScopedAlertProps) => {
  return (
    <Alert
      icon={SvgInformationOutline}
      color={theme.pageTextLight}
      backgroundColor="transparent"
      style={{
        ...style,
        boxShadow: 'none',
        padding: 5,
      }}
    >
      {children}
    </Alert>
  );
};

export const Warning = ({ style, children }: ScopedAlertProps) => {
  return (
    <Alert
      icon={SvgExclamationOutline}
      color={theme.warningText}
      backgroundColor={theme.warningBackground}
      style={style}
    >
      {children}
    </Alert>
  );
};

export const Error = ({ style, children }: ScopedAlertProps) => {
  return (
    <Alert
      icon={SvgExclamationOutline}
      color={theme.errorTextDarker}
      backgroundColor={theme.errorBackground}
      style={style}
    >
      {children}
    </Alert>
  );
};