@carbonorm/carbonreact 4.0.3 → 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbonorm/carbonreact",
3
3
  "license": "MIT",
4
- "version": "4.0.3",
4
+ "version": "4.0.5",
5
5
  "browser": "dist/index.umd.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "main": "dist/index.cjs.js",
@@ -48,27 +48,26 @@ export function isJsonString(str: string) {
48
48
  return true;
49
49
  }
50
50
 
51
- abstract class CarbonReact<P = {}, S extends { [key: string]: any; } = typeof initialCarbonReactState> extends Component<{
51
+ abstract class CarbonReact<P = {}, S extends iCarbonReactState = iCarbonReactState> extends Component<{
52
52
  children?: ReactNode | ReactNode[],
53
53
  instanceId?: string,
54
- websocket?: Omit<iCarbonWebSocketProps, "instance"> | boolean
54
+ websocket?: Omit<iCarbonWebSocketProps<P,S>, "instance"> | false
55
55
  } & P, S> {
56
56
 
57
57
  private static persistentStateMap = new Map<string, { [key: string]: any; }>();
58
58
 
59
59
  // Context is for functional components to access the state of this class efficiently
60
- context: Context<S> = createContext(this.state);
60
+ context: Context<S & iCarbonReactState> = createContext(this.state);
61
61
 
62
62
  protected target: typeof CarbonReact;
63
63
 
64
- protected static _instance: CarbonReact;
64
+ protected static _instance: typeof this;
65
65
 
66
- static get instance() {
67
- // Here `this` refers to the calling class in static context
68
- return this._instance;
66
+ static get instance() {
67
+ return this;
69
68
  }
70
69
 
71
- static set instance(instance: CarbonReact) {
70
+ static set instance(instance: typeof this) {
72
71
  this._instance = instance;
73
72
  }
74
73
 
@@ -95,7 +94,7 @@ abstract class CarbonReact<P = {}, S extends { [key: string]: any; } = typeof in
95
94
  protected constructor(props: {
96
95
  children?: ReactNode | ReactNode[];
97
96
  shouldStatePersist?: boolean | undefined;
98
- websocket?: boolean | iCarbonWebSocketProps | undefined;
97
+ websocket?: boolean | iCarbonWebSocketProps<P,S> | undefined;
99
98
  } & P) {
100
99
 
101
100
  super(props);
@@ -178,7 +177,7 @@ abstract class CarbonReact<P = {}, S extends { [key: string]: any; } = typeof in
178
177
 
179
178
  return <>
180
179
  {nest}
181
- <BackendThrowable instance={CarbonReact.instance}/>
180
+ <BackendThrowable instance={this}/>
182
181
  </>;
183
182
 
184
183
  }
@@ -188,8 +187,8 @@ abstract class CarbonReact<P = {}, S extends { [key: string]: any; } = typeof in
188
187
  return <>
189
188
  <GlobalHistory/>
190
189
  {this.props.websocket &&
191
- <CarbonWebSocket {...(true === this.props.websocket ? {} : this.props.websocket)}
192
- instance={CarbonReact.instance}/>}
190
+ <CarbonWebSocket<P,S> {...(false !== this.props.websocket ? this.props.websocket : {})}
191
+ instance={this}/>}
193
192
  <Context value={this.state}>
194
193
  {this.props.children}
195
194
  </Context>
@@ -1,5 +1,5 @@
1
1
  import classNames from "classnames";
2
- import CarbonReact from "CarbonReact";
2
+ import CarbonReact, {iCarbonReactState} from "CarbonReact";
3
3
  import {ReactNode} from "react";
4
4
  import Popup from "components/Popup/Popup";
5
5
  import getStyles from "hoc/getStyles";
@@ -18,10 +18,10 @@ export interface iAlertButtonOptions {
18
18
  color: "default" | "primary" | "secondary" | "inherit" | "danger" | "info" | "success" | "warning" | undefined,
19
19
  }
20
20
 
21
- export interface iAlert {
21
+ export interface iAlert<P,S> {
22
22
  title: string,
23
23
  text: string,
24
- instance: CarbonReact,
24
+ instance: CarbonReact<P,S>,
25
25
  component?: ReactNode,
26
26
  icon?: "warning" | "error" | "success" | "info" | "question" | null,
27
27
  buttons?: (iAlertButtonOptions)[] | undefined, //['No thanks!', 'Yes, Delete it'],
@@ -33,23 +33,21 @@ export interface iAlert {
33
33
  backendThrowable?: { [key: string]: any },
34
34
  }
35
35
 
36
- export function addAlert(props: iAlert) {
37
-
36
+ export function addAlert<P, S extends Partial<iCarbonReactState>>(props: iAlert<P, S>) {
38
37
  props.instance.setState(previousState => ({
39
38
  alertsWaiting: previousState.alertsWaiting.length === 0
40
39
  ? [props]
41
40
  : [...previousState.alertsWaiting, props]
42
- }))
43
-
41
+ }));
44
42
  }
45
43
 
46
- export default function Alert({
44
+ export default function Alert<P,S extends Partial<iCarbonReactState>>({
47
45
  instance
48
- }: { instance: CarbonReact }) {
46
+ }: { instance: CarbonReact<P,S> }) {
49
47
 
50
48
  const {alertsWaiting, backendThrowable} = instance.state
51
49
 
52
- let alert: iAlert | undefined = undefined;
50
+ let alert: iAlert<P,S> | undefined = undefined;
53
51
 
54
52
  const alertWaiting = alertsWaiting.length + backendThrowable.length
55
53
 
@@ -1,10 +1,10 @@
1
1
  import styles from './style.module.scss';
2
2
  import OutsideClickHandler from 'react-outside-click-handler';
3
- import CarbonReact from "../../CarbonReact";
3
+ import CarbonReact, {iCarbonReactState} from "../../CarbonReact";
4
4
  import {ReactElement} from "react";
5
5
 
6
- export default (props: {
7
- instance: CarbonReact,
6
+ export default <P,S extends Partial<iCarbonReactState>>(props: {
7
+ instance: CarbonReact<P,S>,
8
8
  }): ReactElement => {
9
9
 
10
10
  const {instance} = props;
@@ -1,14 +1,14 @@
1
- import CarbonReact, {isJsonString} from "CarbonReact";
1
+ import CarbonReact, {iCarbonReactState, isJsonString} from "CarbonReact";
2
2
  import {addAlert} from "../Alert/Alert";
3
3
  import {useEffectOnce} from "../../api/hoc/useEffectOnce";
4
4
  import {tC6Tables, tC6RestApi} from "@carbonorm/carbonnode";
5
5
 
6
6
 
7
- export interface iCarbonWebSocketProps {
7
+ export interface iCarbonWebSocketProps<P,S> {
8
8
  url?: string,
9
9
  timeoutSeconds?: number,
10
10
  heartbeatSeconds?: number,
11
- instance: CarbonReact,
11
+ instance: CarbonReact<P,S>,
12
12
  TABLES?: tC6Tables,
13
13
  WsLiveUpdates?: tC6RestApi,
14
14
  }
@@ -17,7 +17,7 @@ export interface iCarbonWebSocketProps {
17
17
  * @function connect
18
18
  * This function establishes a connection with the websocket and also ensures constant reconnection if connection closes
19
19
  **/
20
- export function initiateWebsocket(props: iCarbonWebSocketProps) {
20
+ export function initiateWebsocket<P,S extends Partial<iCarbonReactState>>(props: iCarbonWebSocketProps<P,S>) {
21
21
 
22
22
  let {
23
23
  instance,
@@ -34,7 +34,7 @@ export function initiateWebsocket(props: iCarbonWebSocketProps) {
34
34
  if (!("WebSocket" in window)) {
35
35
 
36
36
  // todo - store that this has been shown in the state
37
- addAlert({
37
+ addAlert<P,S>({
38
38
  title: 'Browser does not support websockets, live updates will fail. You may need to refresh the page to see the newest content.',
39
39
  text: 'Please use a modern browser.',
40
40
  icon: 'warning',
@@ -286,7 +286,7 @@ export function initiateWebsocket(props: iCarbonWebSocketProps) {
286
286
 
287
287
  }
288
288
 
289
- export default function (props: iCarbonWebSocketProps) {
289
+ export default function <P,S extends Partial<iCarbonReactState>>(props: iCarbonWebSocketProps<P,S>) {
290
290
 
291
291
  useEffectOnce(() => {
292
292
 
@@ -5,7 +5,7 @@ export interface iDeleteRestfulObjectArrays<
5
5
  ObjectType extends {
6
6
  [key: string]: any
7
7
  } = {},
8
- S extends { [key: string]: any; } = CarbonReact['state'],
8
+ S extends iCarbonReactState = CarbonReact['state'],
9
9
  P = CarbonReact['props']
10
10
  > {
11
11
  instance: CarbonReact<P, S>,
@@ -19,7 +19,7 @@ export default function deleteRestfulObjectArrays<
19
19
  ObjectType extends {
20
20
  [key: string]: any
21
21
  } = {},
22
- S extends { [key: string]: any; } = CarbonReact['state'],
22
+ S extends iCarbonReactState = CarbonReact['state'],
23
23
  P = CarbonReact['props']
24
24
  >({
25
25
  instance,
@@ -12,7 +12,7 @@ export interface iUpdateRestfulObjectArrays<
12
12
  ObjectType extends {
13
13
  [key: string]: any;
14
14
  } = {},
15
- S extends { [key: string]: any; } = CarbonReact['state'],
15
+ S extends CarbonReact['state'] = CarbonReact['state'],
16
16
  P = CarbonReact['props']
17
17
  > {
18
18
  instance: CarbonReact<P, S>;
@@ -36,7 +36,7 @@ export default function updateRestfulObjectArrays<
36
36
  ObjectType extends {
37
37
  [key: string]: any;
38
38
  } = {},
39
- S extends { [key: string]: any; } = CarbonReact['state'],
39
+ S extends iCarbonReactState = CarbonReact['state'],
40
40
  P = CarbonReact['props']
41
41
  >({
42
42
  instance,
@@ -52,7 +52,7 @@ export default function updateRestfulObjectArrays<
52
52
  type ValidObject = SubsetMatching<S & iCarbonReactState, tStatefulApiData<ObjectType>>;
53
53
 
54
54
  instance.setState((
55
- previousBootstrapState: Readonly<S & iCarbonReactState>,
55
+ previousBootstrapState: Readonly<S>,
56
56
  props: Readonly<P>
57
57
  ): Pick<S & iCarbonReactState, keyof S> | null => {
58
58
 
@@ -1,3 +1,4 @@
1
+ import { tStatefulApiData } from "CarbonReact";
1
2
 
2
3
  export interface stringMap {
3
4
  [key: string]: string;