Skip to content

Instantly share code, notes, and snippets.

@carlrip
carlrip / Counter.tsx
Last active September 20, 2019 03:22
Switch with never type
const reducer = (state: State, action: Actions): State => {
switch (action.type) {
case "increment":
return { count: state.count + action.incrementStep };
case "decrement":
return { count: state.count - action.decrementStep };
default:
neverReached(action);
}
};
@carlrip
carlrip / Counter.tsx
Last active September 20, 2019 03:21
What is the type of action in the default branch?
const reducer = (state: State, action: Actions): State => {
switch (action.type) {
case "increment":
return { count: state.count + action.incrementStep };
case "decrement":
return { count: state.count - action.decrementStep };
default:
action;
}
};
@carlrip
carlrip / Counter.tsx
Last active September 20, 2019 03:21
Type safe reducer
type Increment = {
type: 'increment';
incrementStep: number;
};
type Decrement = {
type: 'decrement';
decrementStep: number;
};
type Actions = Increment | Decrement;
@carlrip
carlrip / Startup.cs
Created September 9, 2019 09:48
SignalR endpoints
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<QuestionsHub>("/questionshub");
});
@carlrip
carlrip / QuestionsPage.tsx
Created September 9, 2019 09:47
Signal R automatic reconnect
const connection = new HubConnectionBuilder()
.withUrl(`${server}/questionshub`)
.withAutomaticReconnect()
.build();
@carlrip
carlrip / util.cs
Created September 9, 2019 09:36
C#8 switch expressions
public static string GetLevel(int level) =>
level switch
{
1 => "low",
2 => "medium",
3 => "high",
_ => throw new ArgumentException("invalid level"),
};
@carlrip
carlrip / App.csproj
Created September 9, 2019 09:24
Enabling nullable reference types
<PropertyGroup>
...
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
@carlrip
carlrip / ExampleAPIController.cs
Created September 9, 2019 08:07
Deserializing JSON in ASP.NET Core 3.0
var jsonContent = await response.Content.ReadAsStringAsync();
var user = JsonSerializer.Deserialize<User>(jsonContent, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
@carlrip
carlrip / package.json
Created September 9, 2019 07:51
React SPA template dependencies
"dependencies": {
"babel-eslint": "10.0.1",
"bootstrap": "^4.1.3",
"jquery": "^3.4.1",
"merge": "^1.2.1",
"oidc-client": "^1.9.0-beta.4",
"react": "^16.0.0",
"react-dom": "^16.0.0",
"react-router-bootstrap": "^0.24.4",
"react-router-dom": "^4.2.2",
@carlrip
carlrip / App.js
Created September 9, 2019 07:04
AuthorizeRoute example
<Layout>
<Route exact path='/' component={Home} />
<Route path='/counter' component={Counter} />
<AuthorizeRoute path='/fetch-data' component={FetchData} />
<Route path={ApplicationPaths.ApiAuthorizationPrefix} component={ApiAuthorizationRoutes} />
</Layout>