-
Notifications
You must be signed in to change notification settings - Fork 0
/
the-netbank.ts
144 lines (130 loc) · 3.9 KB
/
the-netbank.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* Represents basic user information.
*/
interface UserInformation {
email: string;
name: string;
}
/**
* Defines error details for handling user and system errors.
* Includes an error type to distinguish between client and server errors.
*/
interface ErrorDetails {
code: string; // Unique error code.
message: string; // Human-readable error message.
errorType: 'client' | 'server'; // Error type.
timestamp?: Date; // Optional timestamp for when the error occurred.
}
/**
* Represents the state of a user within the application.
*/
type UserState =
| { status: 'loggedOut' }
| { status: 'loading' } // Indicates asynchronous user data fetching.
| { status: 'error'; error: ErrorDetails } // Captures detailed error information.
| { status: 'loggedIn'; user: UserInformation }; // User successfully logged in.
/**
* Supported currencies within the netbank app.
*/
enum Currency {
DKK = 'DKK',
SEK = 'SEK',
NOK = 'NOK',
USD = 'USD',
EUR = 'EUR',
}
/**
* Base interface for all account types, containing common properties.
*/
interface BaseAccount {
name: string;
iban: string;
}
/**
* Represents a regular account with a fixed currency (DKK).
*/
interface RegularAccount extends BaseAccount {
type: 'regular';
currency: Currency.DKK;
amount: number;
}
/**
* Represents a pocket within a pocket account, allowing for multiple currencies.
* Specifically excludes DKK to ensure pocket accounts can hold diverse currency options,
* while regular accounts are limited to DKK.
*/
interface Pocket {
amount: number;
currency: Exclude<Currency, Currency.DKK>; // Excludes DKK from the pocket currency options.
}
/**
* Represents a pocket account that can contain multiple pockets in different currencies.
*/
interface PocketAccount extends BaseAccount {
type: 'pocket';
pockets: Pocket[]; // Array of pockets, each in a different currency.
}
/**
* Union type for account, covering both regular and pocket accounts.
*/
type Account = RegularAccount | PocketAccount;
/**
* Enum representing each distinct page in the application, ensuring only one can be active.
*/
enum ActivePage {
Accounts = 'accounts',
Support = 'support',
}
/**
* Represents the application's current page state, including if it's loading or has encountered an error.
*/
type PageState = {
activePage: ActivePage;
isLoading: boolean;
isError: boolean;
};
/**
* Enum for chat window states, supporting minimized, open, and full-screen states.
*/
enum ChatWindowState {
Minimized = 'minimized',
Open = 'open',
FullScreen = 'full-screen',
}
/**
* Defines the structure of chat messages within the application.
*/
interface ChatMessage {
name: string; // Sender's name.
message: string; // Message content.
timeSent: Date; // Timestamp for when the message was sent.
}
/**
* Represents the status of the chat feature within the application.
*/
type ChatStatus =
| { status: 'idle' } // No active chat.
| { status: 'connecting' } // Attempting to connect to an agent.
| {
status: 'inQueue';
position: number;
busyInfo?: {
mostBusyTimes: string[]; // Describes periods with the highest chat volume.
leastBusyTimes: string[]; // Describes periods with the lowest chat volume.
};
} // Waiting in queue, with optional busy times info.
| { status: 'connected'; messages: ChatMessage[]; currentMessage: string } // Chat is active.
| { status: 'disconnected' }; // Chat has been closed.
/**
* Represents the overall state of the NetBank application, integrating user authentication status,
* current page state, account details, and chat functionality.
*/
interface NetBankState {
userState: UserState;
pageState: PageState;
accounts: Account[];
chat: {
windowState: ChatWindowState; // Reflects the visual state of the chat window across the application.
status: ChatStatus; // Captures the interaction and connection status of the chat feature.
};
}