mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2026-03-11 18:13:47 +00:00
Migrated create visit action to use payload
This commit is contained in:
@@ -56,13 +56,13 @@ export default buildReducer<ShortUrlsList, ListShortUrlsCombinedAction>({
|
|||||||
state,
|
state,
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => assocPath(
|
[CREATE_VISITS]: (state, { payload }) => assocPath(
|
||||||
['shortUrls', 'data'],
|
['shortUrls', 'data'],
|
||||||
state.shortUrls?.data?.map(
|
state.shortUrls?.data?.map(
|
||||||
(currentShortUrl) => {
|
(currentShortUrl) => {
|
||||||
// Find the last of the new visit for this short URL, and pick the amount of visits from it
|
// Find the last of the new visit for this short URL, and pick the amount of visits from it
|
||||||
const lastVisit = last(
|
const lastVisit = last(
|
||||||
createdVisits.filter(
|
payload.createdVisits.filter(
|
||||||
({ shortUrl }) => shortUrl && shortUrlMatches(currentShortUrl, shortUrl.shortCode, shortUrl.domain),
|
({ shortUrl }) => shortUrl && shortUrlMatches(currentShortUrl, shortUrl.shortCode, shortUrl.domain),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -99,9 +99,9 @@ export default buildReducer<TagsList, TagsCombinedAction>({
|
|||||||
...state,
|
...state,
|
||||||
filteredTags: state.tags.filter((tag) => tag.toLowerCase().match(searchTerm.toLowerCase())),
|
filteredTags: state.tags.filter((tag) => tag.toLowerCase().match(searchTerm.toLowerCase())),
|
||||||
}),
|
}),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => ({
|
[CREATE_VISITS]: (state, { payload }) => ({
|
||||||
...state,
|
...state,
|
||||||
stats: increaseVisitsForTags(calculateVisitsPerTag(createdVisits), state.stats),
|
stats: increaseVisitsForTags(calculateVisitsPerTag(payload.createdVisits), state.stats),
|
||||||
}),
|
}),
|
||||||
[CREATE_SHORT_URL]: ({ tags: stateTags, ...rest }, { result }) => ({
|
[CREATE_SHORT_URL]: ({ tags: stateTags, ...rest }, { result }) => ({
|
||||||
...rest,
|
...rest,
|
||||||
|
|||||||
@@ -56,10 +56,10 @@ export default buildReducer<DomainVisits, DomainVisitsCombinedAction>({
|
|||||||
[GET_DOMAIN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
[GET_DOMAIN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
||||||
[GET_DOMAIN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
[GET_DOMAIN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
||||||
[GET_DOMAIN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
[GET_DOMAIN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => {
|
[CREATE_VISITS]: (state, { payload }) => {
|
||||||
const { domain, visits, query = {} } = state;
|
const { domain, visits, query = {} } = state;
|
||||||
const { startDate, endDate } = query;
|
const { startDate, endDate } = query;
|
||||||
const newVisits = createdVisits
|
const newVisits = payload.createdVisits
|
||||||
.filter(({ shortUrl, visit }) =>
|
.filter(({ shortUrl, visit }) =>
|
||||||
shortUrl && domainMatches(shortUrl, domain) && isBetween(visit.date, startDate, endDate))
|
shortUrl && domainMatches(shortUrl, domain) && isBetween(visit.date, startDate, endDate))
|
||||||
.map(({ visit }) => visit);
|
.map(({ visit }) => visit);
|
||||||
|
|||||||
@@ -52,10 +52,10 @@ export default buildReducer<VisitsInfo, NonOrphanVisitsCombinedAction>({
|
|||||||
[GET_NON_ORPHAN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
[GET_NON_ORPHAN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
||||||
[GET_NON_ORPHAN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
[GET_NON_ORPHAN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
||||||
[GET_NON_ORPHAN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
[GET_NON_ORPHAN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => {
|
[CREATE_VISITS]: (state, { payload }) => {
|
||||||
const { visits, query = {} } = state;
|
const { visits, query = {} } = state;
|
||||||
const { startDate, endDate } = query;
|
const { startDate, endDate } = query;
|
||||||
const newVisits = createdVisits
|
const newVisits = payload.createdVisits
|
||||||
.filter(({ visit }) => isBetween(visit.date, startDate, endDate))
|
.filter(({ visit }) => isBetween(visit.date, startDate, endDate))
|
||||||
.map(({ visit }) => visit);
|
.map(({ visit }) => visit);
|
||||||
|
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ export default buildReducer<VisitsInfo, OrphanVisitsCombinedAction>({
|
|||||||
[GET_ORPHAN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
[GET_ORPHAN_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
||||||
[GET_ORPHAN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
[GET_ORPHAN_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
||||||
[GET_ORPHAN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
[GET_ORPHAN_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => {
|
[CREATE_VISITS]: (state, { payload }) => {
|
||||||
const { visits, query = {} } = state;
|
const { visits, query = {} } = state;
|
||||||
const { startDate, endDate } = query;
|
const { startDate, endDate } = query;
|
||||||
const newVisits = createdVisits
|
const newVisits = payload.createdVisits
|
||||||
.filter(({ visit, shortUrl }) => !shortUrl && isBetween(visit.date, startDate, endDate))
|
.filter(({ visit, shortUrl }) => !shortUrl && isBetween(visit.date, startDate, endDate))
|
||||||
.map(({ visit }) => visit);
|
.map(({ visit }) => visit);
|
||||||
|
|
||||||
|
|||||||
@@ -60,10 +60,10 @@ export default buildReducer<ShortUrlVisits, ShortUrlVisitsCombinedAction>({
|
|||||||
[GET_SHORT_URL_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
[GET_SHORT_URL_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
||||||
[GET_SHORT_URL_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
[GET_SHORT_URL_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
||||||
[GET_SHORT_URL_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
[GET_SHORT_URL_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => {
|
[CREATE_VISITS]: (state, { payload }) => {
|
||||||
const { shortCode, domain, visits, query = {} } = state;
|
const { shortCode, domain, visits, query = {} } = state;
|
||||||
const { startDate, endDate } = query;
|
const { startDate, endDate } = query;
|
||||||
const newVisits = createdVisits
|
const newVisits = payload.createdVisits
|
||||||
.filter(
|
.filter(
|
||||||
({ shortUrl, visit }) =>
|
({ shortUrl, visit }) =>
|
||||||
shortUrl && shortUrlMatches(shortUrl, shortCode, domain) && isBetween(visit.date, startDate, endDate),
|
shortUrl && shortUrlMatches(shortUrl, shortCode, domain) && isBetween(visit.date, startDate, endDate),
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ export default buildReducer<TagVisits, TagsVisitsCombinedAction>({
|
|||||||
[GET_TAG_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
[GET_TAG_VISITS_CANCEL]: (state) => ({ ...state, cancelLoad: true }),
|
||||||
[GET_TAG_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
[GET_TAG_VISITS_PROGRESS_CHANGED]: (state, { progress }) => ({ ...state, progress }),
|
||||||
[GET_TAG_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
[GET_TAG_VISITS_FALLBACK_TO_INTERVAL]: (state, { fallbackInterval }) => ({ ...state, fallbackInterval }),
|
||||||
[CREATE_VISITS]: (state, { createdVisits }) => {
|
[CREATE_VISITS]: (state, { payload }) => {
|
||||||
const { tag, visits, query = {} } = state;
|
const { tag, visits, query = {} } = state;
|
||||||
const { startDate, endDate } = query;
|
const { startDate, endDate } = query;
|
||||||
const newVisits = createdVisits
|
const newVisits = payload.createdVisits
|
||||||
.filter(({ shortUrl, visit }) => shortUrl?.tags.includes(tag) && isBetween(visit.date, startDate, endDate))
|
.filter(({ shortUrl, visit }) => shortUrl?.tags.includes(tag) && isBetween(visit.date, startDate, endDate))
|
||||||
.map(({ visit }) => visit);
|
.map(({ visit }) => visit);
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Action } from 'redux';
|
import { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { CreateVisit } from '../types';
|
import { CreateVisit } from '../types';
|
||||||
|
|
||||||
export const CREATE_VISITS = 'shlink/visitCreation/CREATE_VISITS';
|
export const CREATE_VISITS = 'shlink/visitCreation/CREATE_VISITS';
|
||||||
|
|
||||||
export interface CreateVisitsAction extends Action<typeof CREATE_VISITS> {
|
export type CreateVisitsAction = PayloadAction<{
|
||||||
createdVisits: CreateVisit[];
|
createdVisits: CreateVisit[];
|
||||||
}
|
}>;
|
||||||
|
|
||||||
export const createNewVisits = (createdVisits: CreateVisit[]): CreateVisitsAction => ({
|
export const createNewVisits = (createdVisits: CreateVisit[]): CreateVisitsAction => ({
|
||||||
type: CREATE_VISITS,
|
type: CREATE_VISITS,
|
||||||
createdVisits,
|
payload: { createdVisits },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ export default buildReducer<VisitsOverview, GetVisitsOverviewAction & CreateVisi
|
|||||||
[GET_OVERVIEW_START]: () => ({ ...initialState, loading: true }),
|
[GET_OVERVIEW_START]: () => ({ ...initialState, loading: true }),
|
||||||
[GET_OVERVIEW_ERROR]: () => ({ ...initialState, error: true }),
|
[GET_OVERVIEW_ERROR]: () => ({ ...initialState, error: true }),
|
||||||
[GET_OVERVIEW]: (_, { visitsCount, orphanVisitsCount }) => ({ ...initialState, visitsCount, orphanVisitsCount }),
|
[GET_OVERVIEW]: (_, { visitsCount, orphanVisitsCount }) => ({ ...initialState, visitsCount, orphanVisitsCount }),
|
||||||
[CREATE_VISITS]: ({ visitsCount, orphanVisitsCount = 0, ...rest }, { createdVisits }) => {
|
[CREATE_VISITS]: ({ visitsCount, orphanVisitsCount = 0, ...rest }, { payload }) => {
|
||||||
const { regularVisits, orphanVisits } = groupNewVisitsByType(createdVisits);
|
const { regularVisits, orphanVisits } = groupNewVisitsByType(payload.createdVisits);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...rest,
|
...rest,
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ describe('shortUrlsListReducer', () => {
|
|||||||
error: false,
|
error: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
expect(reducer(state, { type: CREATE_VISITS, createdVisits } as any)).toEqual({
|
expect(reducer(state, { type: CREATE_VISITS, payload: { createdVisits } } as any)).toEqual({
|
||||||
shortUrls: {
|
shortUrls: {
|
||||||
data: [
|
data: [
|
||||||
{ shortCode, domain: 'example.com', visitsCount: 5 },
|
{ shortCode, domain: 'example.com', visitsCount: 5 },
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ describe('domainVisitsReducer', () => {
|
|||||||
|
|
||||||
const { visits } = reducer(prevState, {
|
const { visits } = reducer(prevState, {
|
||||||
type: CREATE_VISITS,
|
type: CREATE_VISITS,
|
||||||
createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }],
|
payload: { createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }] },
|
||||||
} as any);
|
} as any);
|
||||||
|
|
||||||
expect(visits).toHaveLength(expectedVisits);
|
expect(visits).toHaveLength(expectedVisits);
|
||||||
|
|||||||
@@ -105,10 +105,10 @@ describe('nonOrphanVisitsReducer', () => {
|
|||||||
const prevState = buildState({ ...state, visits: visitsMocks });
|
const prevState = buildState({ ...state, visits: visitsMocks });
|
||||||
const visit = Mock.of<Visit>({ date: formatIsoDate(now) ?? undefined });
|
const visit = Mock.of<Visit>({ date: formatIsoDate(now) ?? undefined });
|
||||||
|
|
||||||
const { visits } = reducer(
|
const { visits } = reducer(prevState, {
|
||||||
prevState,
|
type: CREATE_VISITS,
|
||||||
{ type: CREATE_VISITS, createdVisits: [{ visit }, { visit }] } as any,
|
payload: { createdVisits: [{ visit }, { visit }] },
|
||||||
);
|
} as any);
|
||||||
|
|
||||||
expect(visits).toHaveLength(expectedVisits);
|
expect(visits).toHaveLength(expectedVisits);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -105,10 +105,10 @@ describe('orphanVisitsReducer', () => {
|
|||||||
const prevState = buildState({ ...state, visits: visitsMocks });
|
const prevState = buildState({ ...state, visits: visitsMocks });
|
||||||
const visit = Mock.of<Visit>({ date: formatIsoDate(now) ?? undefined });
|
const visit = Mock.of<Visit>({ date: formatIsoDate(now) ?? undefined });
|
||||||
|
|
||||||
const { visits } = reducer(
|
const { visits } = reducer(prevState, {
|
||||||
prevState,
|
type: CREATE_VISITS,
|
||||||
{ type: CREATE_VISITS, createdVisits: [{ visit }, { visit }] } as any,
|
payload: { createdVisits: [{ visit }, { visit }] },
|
||||||
);
|
} as any);
|
||||||
|
|
||||||
expect(visits).toHaveLength(expectedVisits);
|
expect(visits).toHaveLength(expectedVisits);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -126,10 +126,10 @@ describe('shortUrlVisitsReducer', () => {
|
|||||||
visits: visitsMocks,
|
visits: visitsMocks,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { visits } = reducer(
|
const { visits } = reducer(prevState, {
|
||||||
prevState,
|
type: CREATE_VISITS,
|
||||||
{ type: CREATE_VISITS, createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }] } as any,
|
payload: { createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }] },
|
||||||
);
|
} as any);
|
||||||
|
|
||||||
expect(visits).toHaveLength(expectedVisits);
|
expect(visits).toHaveLength(expectedVisits);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ describe('tagVisitsReducer', () => {
|
|||||||
|
|
||||||
const { visits } = reducer(prevState, {
|
const { visits } = reducer(prevState, {
|
||||||
type: CREATE_VISITS,
|
type: CREATE_VISITS,
|
||||||
createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }],
|
payload: { createdVisits: [{ shortUrl, visit: { date: formatIsoDate(now) ?? undefined } }] },
|
||||||
} as any);
|
} as any);
|
||||||
|
|
||||||
expect(visits).toHaveLength(expectedVisits);
|
expect(visits).toHaveLength(expectedVisits);
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ describe('visitCreationReducer', () => {
|
|||||||
const visit = Mock.all<Visit>();
|
const visit = Mock.all<Visit>();
|
||||||
|
|
||||||
it('just returns the action with proper type', () => {
|
it('just returns the action with proper type', () => {
|
||||||
expect(createNewVisits([{ shortUrl, visit }])).toEqual(
|
expect(createNewVisits([{ shortUrl, visit }])).toEqual({
|
||||||
{ type: CREATE_VISITS, createdVisits: [{ shortUrl, visit }] },
|
type: CREATE_VISITS,
|
||||||
);
|
payload: { createdVisits: [{ shortUrl, visit }] },
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -52,19 +52,21 @@ describe('visitsOverviewReducer', () => {
|
|||||||
state({ visitsCount: 100, orphanVisitsCount: providedOrphanVisitsCount }),
|
state({ visitsCount: 100, orphanVisitsCount: providedOrphanVisitsCount }),
|
||||||
{
|
{
|
||||||
type: CREATE_VISITS,
|
type: CREATE_VISITS,
|
||||||
createdVisits: [
|
payload: {
|
||||||
Mock.of<CreateVisit>({ visit: Mock.all<Visit>() }),
|
createdVisits: [
|
||||||
Mock.of<CreateVisit>({ visit: Mock.all<Visit>() }),
|
Mock.of<CreateVisit>({ visit: Mock.all<Visit>() }),
|
||||||
Mock.of<CreateVisit>({
|
Mock.of<CreateVisit>({ visit: Mock.all<Visit>() }),
|
||||||
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
Mock.of<CreateVisit>({
|
||||||
}),
|
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
||||||
Mock.of<CreateVisit>({
|
}),
|
||||||
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
Mock.of<CreateVisit>({
|
||||||
}),
|
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
||||||
Mock.of<CreateVisit>({
|
}),
|
||||||
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
Mock.of<CreateVisit>({
|
||||||
}),
|
visit: Mock.of<OrphanVisit>({ visitedUrl: '' }),
|
||||||
],
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
} as unknown as GetVisitsOverviewAction & CreateVisitsAction,
|
} as unknown as GetVisitsOverviewAction & CreateVisitsAction,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user