Skip to content

Commit fb71af3

Browse files
mateusz-kleszczmatuesz-kleszcz
andauthored
fix: update navigation when new locale is created (#575)
Co-authored-by: matuesz-kleszcz <[email protected]>
1 parent 69bfaac commit fb71af3

File tree

7 files changed

+93
-18
lines changed

7 files changed

+93
-18
lines changed

admin/src/pages/HomePage/components/ChangeLanguageDialog/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ export const ChangeLanguageDialog: FC<Props> = ({ onConfirm, onCancel }) => {
2626
<ConfirmationDialog
2727
isVisible
2828
header={formatMessage(getTrad('pages.view.actions.changeLanguage.confirmation.header'))}
29-
labelConfirm={formatMessage(getTrad('pages.view.actions.changeLanguage.confirmation.confirm'))}
29+
labelConfirm={formatMessage(
30+
getTrad('pages.view.actions.changeLanguage.confirmation.confirm')
31+
)}
3032
iconConfirm={refreshIcon}
3133
mainIcon={refreshIcon}
3234
onConfirm={onConfirm}

admin/src/pages/HomePage/hooks/index.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,28 @@ export const useResetContentTypes = () => {
7373
};
7474
};
7575

76+
export const useInvalidateNavigations = () => {
77+
const fetch = getFetchClient();
78+
const apiClient = getApiClient(fetch);
79+
80+
const queryClient = useQueryClient();
81+
82+
return () => {
83+
queryClient.invalidateQueries({
84+
queryKey: apiClient.readAllIndex(),
85+
});
86+
};
87+
};
88+
89+
export const useInvalidateLocale = () => {
90+
const fetch = getFetchClient();
91+
const apiClient = getApiClient(fetch);
92+
93+
const queryClient = useQueryClient();
94+
95+
return () => queryClient.invalidateQueries({ queryKey: apiClient.readLocaleIndex() });
96+
};
97+
7698
export const useNavigations = () => {
7799
const fetch = getFetchClient();
78100
const apiClient = getApiClient(fetch);

admin/src/pages/HomePage/index.tsx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from '@strapi/design-system';
1010
import { Data } from '@strapi/strapi';
1111
import { Layouts, Page, useRBAC } from '@strapi/strapi/admin';
12-
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
12+
import { QueryClient, QueryClientProvider, useQueryClient } from '@tanstack/react-query';
1313
import { first, isEmpty } from 'lodash';
1414
import { SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react';
1515
import { useIntl } from 'react-intl';
@@ -32,6 +32,8 @@ import {
3232
useConfig,
3333
useCopyNavigationI18n,
3434
useI18nCopyNavigationItemsModal,
35+
useInvalidateLocale,
36+
useInvalidateNavigations,
3537
useLocale,
3638
useNavigations,
3739
usePurgeNavigation,
@@ -92,15 +94,19 @@ const Inner = () => {
9294

9395
const [currentLocale, setCurrentLocale] = useState<string>();
9496
const [isChangeLanguageVisible, setIsChangeLanguageVisible] = useState(false);
95-
const changeCurrentLocaleAction = useMemo(() => makeAction<string>({
96-
perform: (next) => {
97-
setCurrentLocale(next);
98-
setIsChangeLanguageVisible(false);
99-
setStructureChanged(false);
100-
},
101-
trigger: () => setIsChangeLanguageVisible(true),
102-
cancel: () => setIsChangeLanguageVisible(false),
103-
}), [setCurrentLocale, setIsChangeLanguageVisible]);
97+
const changeCurrentLocaleAction = useMemo(
98+
() =>
99+
makeAction<string>({
100+
perform: (next) => {
101+
setCurrentLocale(next);
102+
setIsChangeLanguageVisible(false);
103+
setStructureChanged(false);
104+
},
105+
trigger: () => setIsChangeLanguageVisible(true),
106+
cancel: () => setIsChangeLanguageVisible(false),
107+
}),
108+
[setCurrentLocale, setIsChangeLanguageVisible]
109+
);
104110

105111
const viewPermissions = useMemo(
106112
() => ({
@@ -215,6 +221,9 @@ const Inner = () => {
215221
const resetContentTypes = useResetContentTypes();
216222
const resetNavigations = useResetNavigations();
217223

224+
const invalidateLocaleQuery = useInvalidateLocale();
225+
const invalidateNavigationsQuery = useInvalidateNavigations();
226+
218227
const {
219228
i18nCopyItemsModal,
220229
i18nCopySourceLocale,
@@ -441,7 +450,6 @@ const Inner = () => {
441450
}
442451
}, [navigationsQuery.data, currentNavigation]);
443452

444-
445453
useEffect(() => {
446454
if (currentNavigation && currentLocale !== currentNavigation.locale) {
447455
setRecentNavigation(undefined);
@@ -469,6 +477,11 @@ const Inner = () => {
469477
}
470478
}, [navigationsQuery.data]);
471479

480+
useEffect(() => {
481+
invalidateLocaleQuery();
482+
invalidateNavigationsQuery();
483+
}, []);
484+
472485
if (!navigationsQuery.data || !localeQuery.data || !!pending) {
473486
return <Page.Loading />;
474487
}

admin/src/translations/en.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -451,11 +451,11 @@ const en = {
451451
},
452452
changeLanguage: {
453453
confirmation: {
454-
header: "Confirmation",
455-
confirm: "Continue",
456-
content: "You have some unsaved changes. Do you want to continue?"
457-
}
458-
}
454+
header: 'Confirmation',
455+
confirm: 'Continue',
456+
content: 'You have some unsaved changes. Do you want to continue?',
457+
},
458+
},
459459
},
460460
},
461461
},

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "strapi-plugin-navigation",
3-
"version": "3.0.16",
3+
"version": "3.0.17",
44
"description": "Strapi - Navigation plugin",
55
"strapi": {
66
"name": "navigation",

server/src/bootstrap.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { configSetup } from './config';
44
import { navigationSetup } from './i18n';
55
import { setupPermissions } from './permissions';
66
import { graphQLSetup } from './graphql';
7+
import { getPluginService } from './utils';
78

89
const bootstrap = async (context: { strapi: Core.Strapi }) => {
910
await configSetup(context);
@@ -12,5 +13,13 @@ const bootstrap = async (context: { strapi: Core.Strapi }) => {
1213
await graphQLSetup(context);
1314

1415
await strapi.service('plugin::navigation.migrate').migrateRelatedIdToDocumentId();
16+
17+
strapi.db.lifecycles.subscribe({
18+
models: ['plugin::i18n.locale'],
19+
async afterCreate(event) {
20+
const adminService = getPluginService(context, 'admin');
21+
await adminService.refreshNavigationLocale(event.result?.code);
22+
},
23+
});
1524
};
1625
export default bootstrap;

server/src/services/admin/admin.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,35 @@ const adminService = (context: { strapi: Core.Strapi }) => ({
540540
await commonService.setDefaultConfig();
541541
},
542542

543+
async refreshNavigationLocale(newLocale?: string): Promise<void> {
544+
if (!newLocale) {
545+
return;
546+
}
547+
548+
const commonService = getPluginService(context, 'common');
549+
550+
const { defaultLocale } = await commonService.readLocale();
551+
552+
const repository = getNavigationRepository(context);
553+
554+
const navigations = await repository.find({
555+
limit: Number.MAX_SAFE_INTEGER,
556+
locale: defaultLocale,
557+
});
558+
559+
await Promise.all(
560+
navigations.map(({ name, visible, slug, documentId }) =>
561+
repository.save({
562+
name,
563+
visible,
564+
locale: newLocale,
565+
slug,
566+
documentId,
567+
})
568+
)
569+
);
570+
},
571+
543572
async updateConfig({ config: newConfig }: UpdateConfigInput): Promise<void> {
544573
const commonService = getPluginService(context, 'common');
545574

0 commit comments

Comments
 (0)