feat: issues

This commit is contained in:
Loic Coenen
2025-11-01 16:01:57 +01:00
parent a0fb254846
commit 4013ae24b2
20 changed files with 409 additions and 115 deletions

View File

@@ -8,6 +8,10 @@ import {
loadNewsError,
loadNewsSuccess,
loadNews,
loadGiteaIssueError,
loadGiteaIssueSuccess,
loadGiteaIssue,
setSelectedLocation,
} from './consts'
import {
@@ -20,6 +24,10 @@ import {
type LoadNewsError,
type LoadNewsSuccess,
type LoadNews,
type LoadGiteaIssueError,
type LoadGiteaIssueSuccess,
type LoadGiteaIssue,
type SetSelectedLocation,
} from './types';
export const actions = {
@@ -59,4 +67,20 @@ export const actions = {
type: loadWeatherError,
...args
} as LoadWeatherError),
loadGiteaIssue: (args: Omit<LoadGiteaIssue, "type">) => ({
type: loadGiteaIssue,
...args
} as LoadGiteaIssue),
loadGiteaIssueSuccess: (args: Omit<LoadGiteaIssueSuccess, "type">) => ({
type: loadGiteaIssueSuccess,
...args
} as LoadGiteaIssueSuccess),
loadGiteaIssueError: (args: Omit<LoadGiteaIssueError, "type">) => ({
type: loadGiteaIssueError,
...args
} as LoadGiteaIssueError),
setSelectedLocation: (args: Omit<SetSelectedLocation, "type">) => ({
type: setSelectedLocation,
...args
} as SetSelectedLocation),
}

View File

@@ -11,3 +11,9 @@ export const loadNewsError: ActionType = 'loadNewsError';
export const loadWeather: ActionType = 'loadWeather';
export const loadWeatherSuccess: ActionType = 'loadWeatherSuccess';
export const loadWeatherError: ActionType = 'loadWeatherError';
export const loadGiteaIssue: ActionType = 'loadGiteaIssue';
export const loadGiteaIssueSuccess: ActionType = 'loadGiteaIssueSuccess';
export const loadGiteaIssueError: ActionType = 'loadGiteaIssueError';
export const setSelectedLocation: ActionType = 'setSelectedLocation';

View File

@@ -1,6 +1,8 @@
export type ActionType = string;
import type {Station} from '../../types';
import type {Article} from '../../types/article';
import type {IssuesResponse} from '../../types/issues';
import type { DepartureType } from '../../types/liveboard';
import type {WeatherData} from '../../types/weather';
import {
@@ -13,6 +15,10 @@ import {
loadWeather,
loadWeatherError,
loadWeatherSuccess,
loadGiteaIssueSuccess,
loadGiteaIssueError,
loadGiteaIssue,
setSelectedLocation,
} from './consts'
export type Action = {
@@ -25,7 +31,8 @@ export type LoadTrainSchedule = {
export type LoadTrainScheduleSuccess = {
type: typeof loadTrainScheduleSuccess,
departures: DepartureType[]
departures: DepartureType[],
stations: Station[]
}
export type LoadTrainScheduleError = {
@@ -62,3 +69,22 @@ export type LoadWeatherError = {
error: Error
}
export type LoadGiteaIssue = {
type: typeof loadGiteaIssue,
}
export type LoadGiteaIssueSuccess = {
type: typeof loadGiteaIssueSuccess,
data: IssuesResponse
}
export type LoadGiteaIssueError = {
type: typeof loadGiteaIssueError,
error: Error
}
export type SetSelectedLocation = {
type: typeof setSelectedLocation,
location: string,
}

View File

@@ -10,4 +10,9 @@ export const initialState: State = {
weather: undefined,
weatherError: undefined,
weatherLoading: false,
issues: undefined,
issuesError: undefined,
issuesLoading: false,
stations: undefined,
selectedLocation: 'Nivelles'
};

View File

@@ -17,6 +17,13 @@ import {
type LoadWeatherSuccess,
type LoadNewsError,
type LoadNewsSuccess,
loadGiteaIssueSuccess,
loadGiteaIssue,
type LoadGiteaIssueSuccess,
loadGiteaIssueError,
type LoadGiteaIssueError,
setSelectedLocation,
type SetSelectedLocation,
} from './actions';
@@ -34,6 +41,7 @@ export const reducerInner = (state: State, action: Action): State => {
return {
...state,
departures: (action as LoadTrainScheduleSuccess).departures,
stations: (action as LoadTrainScheduleSuccess).stations,
trainScheduleLoading: false,
}
}
@@ -85,6 +93,33 @@ export const reducerInner = (state: State, action: Action): State => {
weatherError: (action as LoadWeatherError).error,
weatherLoading: false,
}
}
else if(action.type === loadGiteaIssue) {
return {
...state,
issuesError: undefined,
issuesLoading: true,
}
}
else if(action.type === loadGiteaIssueSuccess) {
return {
...state,
issues: (action as LoadGiteaIssueSuccess).data,
issuesLoading: false,
}
}
else if(action.type === loadGiteaIssueError) {
return {
...state,
issuesLoading: false,
issuesError: (action as LoadGiteaIssueError).error,
}
}
else if(action.type === setSelectedLocation) {
return {
...state,
selectedLocation: (action as SetSelectedLocation).location,
}
}
return state;
}

View File

@@ -1,4 +1,6 @@
import type {Station} from "../types";
import type { Article } from "../types/article";
import type {IssuesResponse} from "../types/issues";
import type { DepartureType } from "../types/liveboard";
import type { WeatherData } from "../types/weather";
@@ -14,4 +16,11 @@ export type State = {
news: Article[] | undefined,
newsLoading: boolean,
newsError: Error | undefined,
issues: IssuesResponse | undefined,
issuesLoading: boolean,
issuesError: Error | undefined,
stations: undefined | Station[],
selectedLocation: string,
}