disable auto language detection;
disable languuage switch for now; Tweak some error logs and messages
This commit is contained in:
@ -39,7 +39,7 @@ const LanguageSwitcher = () => {
|
|||||||
open={Boolean(anchorEl)}
|
open={Boolean(anchorEl)}
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
>
|
>
|
||||||
{locales.map((lng) => {
|
{locales?.map((lng) => {
|
||||||
if (lng === locale) return null;
|
if (lng === locale) return null;
|
||||||
return (
|
return (
|
||||||
<MenuItem key={lng} onClick={() => changeLanguage(lng)}>
|
<MenuItem key={lng} onClick={() => changeLanguage(lng)}>
|
||||||
|
@ -10,9 +10,10 @@ interface ProtectedRouteProps {
|
|||||||
allowedRoles: UserRole[];
|
allowedRoles: UserRole[];
|
||||||
deniedMessage?: string;
|
deniedMessage?: string;
|
||||||
bypass?: boolean;
|
bypass?: boolean;
|
||||||
|
autoRedirect?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ProtectedRoute = ({ children, allowedRoles, deniedMessage, bypass = false }: ProtectedRouteProps) => {
|
const ProtectedRoute = ({ children, allowedRoles, deniedMessage, bypass = false, autoRedirect = false }: ProtectedRouteProps) => {
|
||||||
const { data: session, status } = useSession()
|
const { data: session, status } = useSession()
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
@ -20,10 +21,9 @@ const ProtectedRoute = ({ children, allowedRoles, deniedMessage, bypass = false
|
|||||||
console.log("session.role:" + session?.user?.role);
|
console.log("session.role:" + session?.user?.role);
|
||||||
if (!status || status === "unauthenticated") {
|
if (!status || status === "unauthenticated") {
|
||||||
// Redirect to the sign-in page
|
// Redirect to the sign-in page
|
||||||
if (!bypass) {
|
if (autoRedirect) {
|
||||||
signIn();
|
signIn();
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.log("session.role:" + session?.user?.role);
|
console.log("session.role:" + session?.user?.role);
|
||||||
@ -41,14 +41,27 @@ const ProtectedRoute = ({ children, allowedRoles, deniedMessage, bypass = false
|
|||||||
if (deniedMessage !== undefined) {
|
if (deniedMessage !== undefined) {
|
||||||
return <div>{deniedMessage}</div>;
|
return <div>{deniedMessage}</div>;
|
||||||
}
|
}
|
||||||
return <div>Нямате достъп до тази страница. Ако мислите, че това е грешка, моля, свържете се с администраторите</div>;
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex items-center justify-center min-h-screen">
|
||||||
|
<div className="text-center">
|
||||||
|
<h1 className="text-2xl font-bold mb-4 text-blue-500">{session?.user?.email},</h1>
|
||||||
|
<p className="mb-6">{`Нямате достъп до тази страница. Ако мислите, че това е грешка, моля, свържете се с администраторите`}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status === "loading") {
|
if (status === "loading") {
|
||||||
return <div>Зареждане...</div>;
|
return <div>Зареждане...</div>;
|
||||||
}
|
}
|
||||||
if (!session) return <a href="/api/auth/signin">Защитено съдържание. Впишете се.. </a>
|
if (!session) {
|
||||||
return children;
|
if (deniedMessage !== undefined) {
|
||||||
|
return <div>{deniedMessage}</div>;
|
||||||
|
}
|
||||||
|
return <a href="/api/auth/signin">Защитено съдържание. Впишете се.. </a>
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ProtectedRoute;
|
export default ProtectedRoute;
|
||||||
|
@ -105,19 +105,22 @@ export default function Sidebar({ isSidebarOpen, toggleSidebar }) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchLocations = async () => {
|
const fetchLocations = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await axiosInstance.get('/api/data/locations'); // Adjust the API endpoint as needed
|
if (session) { // Don't fetch locations if the user is not authenticated
|
||||||
const locationsData = response.data
|
|
||||||
.filter(location => location.isActive === true)
|
const response = await axiosInstance.get('/api/data/locations'); // Adjust the API endpoint as needed
|
||||||
.map(location => ({
|
const locationsData = response.data
|
||||||
text: location.name,
|
.filter(location => location.isActive === true)
|
||||||
url: `/cart/locations/${location.id}`,
|
.map(location => ({
|
||||||
}));
|
text: location.name,
|
||||||
// Find the "Locations" menu item and populate its children with locationsData
|
url: `/cart/locations/${location.id}`,
|
||||||
const menuIndex = sidemenu.findIndex(item => item.id === "locations");
|
}));
|
||||||
if (menuIndex !== -1) {
|
// Find the "Locations" menu item and populate its children with locationsData
|
||||||
sidemenu[menuIndex].children = locationsData;
|
const menuIndex = sidemenu.findIndex(item => item.id === "locations");
|
||||||
|
if (menuIndex !== -1) {
|
||||||
|
sidemenu[menuIndex].children = locationsData;
|
||||||
|
}
|
||||||
|
//setLocations(locationsData); // Optional, if you need to use locations elsewhere
|
||||||
}
|
}
|
||||||
//setLocations(locationsData); // Optional, if you need to use locations elsewhere
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching locations:", error);
|
console.error("Error fetching locations:", error);
|
||||||
}
|
}
|
||||||
@ -174,16 +177,17 @@ function UserSection({ session }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function SignInButton() {
|
function SignInButton() {
|
||||||
const t = useTranslations('common');
|
// const t = useTranslations('common');
|
||||||
return (
|
return (
|
||||||
<div className="items-center py-2 font-bold" onClick={() => signIn()}>
|
<div className="items-center py-2 font-bold" onClick={() => signIn()}>
|
||||||
<button>{t('login')}</button>
|
<button>вход</button>
|
||||||
|
{/* <button>{t('login')}</button> */}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function UserDetails({ session }) {
|
function UserDetails({ session }) {
|
||||||
const t = useTranslations('common');
|
// const t = useTranslations('common');
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<hr className="m-0" />
|
<hr className="m-0" />
|
||||||
@ -194,7 +198,10 @@ function UserDetails({ session }) {
|
|||||||
<div className="ml-3 overflow-hidden">
|
<div className="ml-3 overflow-hidden">
|
||||||
<p className="mx-1 mt-1 text-sm font-medium text-gray-800 dark:text-gray-200">{session.user.name}</p>
|
<p className="mx-1 mt-1 text-sm font-medium text-gray-800 dark:text-gray-200">{session.user.name}</p>
|
||||||
<p className="mx-1 mt-1 text-sm font-medium text-gray-600 dark:text-gray-400">{session.user.role}</p>
|
<p className="mx-1 mt-1 text-sm font-medium text-gray-600 dark:text-gray-400">{session.user.role}</p>
|
||||||
<a href="/api/auth/signout" className={styles.button} onClick={(e) => { e.preventDefault(); signOut(); }}>{t('logout')}</a>
|
<a href="/api/auth/signout" className={styles.button} onClick={(e) => { e.preventDefault(); signOut(); }}>
|
||||||
|
{/* {t('logout')} */}
|
||||||
|
изход
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
@ -56,6 +56,6 @@ module.exports = withPWA({
|
|||||||
// using https://next-intl-docs.vercel.app/docs/getting-started/pages-router
|
// using https://next-intl-docs.vercel.app/docs/getting-started/pages-router
|
||||||
locales: ['bg', 'en', 'ru'],
|
locales: ['bg', 'en', 'ru'],
|
||||||
defaultLocale: 'bg',
|
defaultLocale: 'bg',
|
||||||
autoDetect: false,
|
localeDetection: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
@ -28,26 +28,27 @@ import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'
|
|||||||
export default function App({ Component, pageProps: { session, ...pageProps }, }: AppProps<{ session: Session }>) {
|
export default function App({ Component, pageProps: { session, ...pageProps }, }: AppProps<{ session: Session }>) {
|
||||||
// console.log(pageProps);
|
// console.log(pageProps);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const [locale, setLocale] = useState(router.locale || 'bg');
|
||||||
const [messages, setMessages] = useState({});
|
const [messages, setMessages] = useState({});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("Current locale:", router.locale);
|
console.log("Current locale:", router.locale);
|
||||||
async function loadLocaleData() {
|
async function loadLocaleData() {
|
||||||
// Replace the static import with a fetch request
|
// Replace the static import with a fetch request
|
||||||
const res = await fetch(`/api/translations/${router.locale}`);
|
const res = await fetch(`/api/translations/${locale}`);
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
const localeMessages = await res.json();
|
const localeMessages = await res.json();
|
||||||
console.log("Loaded messages for locale:", router.locale, localeMessages);
|
console.log("Loaded messages for locale:", locale, localeMessages);
|
||||||
setMessages(localeMessages);
|
setMessages(localeMessages);
|
||||||
} else {
|
} else {
|
||||||
const localeMessages = await import(`../content/i18n/${router.locale}.json`); setMessages(localeMessages.default);
|
const localeMessages = await import(`../content/i18n/${locale}.json`); setMessages(localeMessages.default);
|
||||||
}
|
}
|
||||||
console.log("Loaded locale '", router.locale, "' ",);
|
console.log("Loaded locale '", locale, "' ",);
|
||||||
//console.log("Loaded messages for locale:", router.locale, localeMessages.default);
|
//console.log("Loaded messages for locale:", router.locale, localeMessages.default);
|
||||||
|
|
||||||
}
|
}
|
||||||
loadLocaleData();
|
loadLocaleData();
|
||||||
}, [router.locale]);
|
}, [locale]);
|
||||||
|
|
||||||
// useEffect(() => {
|
// useEffect(() => {
|
||||||
// async function loadLocaleData() {
|
// async function loadLocaleData() {
|
||||||
@ -101,7 +102,7 @@ export default function App({ Component, pageProps: { session, ...pageProps }, }
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<NextIntlClientProvider
|
<NextIntlClientProvider
|
||||||
locale={router.locale}
|
locale={'bg'}
|
||||||
timeZone="Europe/Sofia"
|
timeZone="Europe/Sofia"
|
||||||
messages={messages}
|
messages={messages}
|
||||||
>
|
>
|
||||||
@ -110,7 +111,7 @@ export default function App({ Component, pageProps: { session, ...pageProps }, }
|
|||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
</LocalizationProvider>
|
</LocalizationProvider>
|
||||||
</SessionProvider>
|
</SessionProvider>
|
||||||
</NextIntlClientProvider>
|
</NextIntlClientProvider >
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
if (req.method === 'DELETE') {
|
if (req.method === 'DELETE') {
|
||||||
switch (targetTable) {
|
switch (targetTable) {
|
||||||
case 'publishers':
|
case 'publishers':
|
||||||
|
case 'availabilities':
|
||||||
const targetId = req.query.nextcrud[1];
|
const targetId = req.query.nextcrud[1];
|
||||||
logger.info('[nextCrud] ' + targetTable + ': ' + targetId + ' DELETED by ' + session.user.email);
|
logger.info('[nextCrud] ' + targetTable + ': ' + targetId + ' DELETED by ' + session.user.email);
|
||||||
break;
|
break;
|
||||||
|
@ -49,7 +49,19 @@ export const getServerSideProps = async (context) => {
|
|||||||
}
|
}
|
||||||
var url = process.env.NEXT_PUBLIC_PUBLIC_URL + "/api/data/publishers/" + context.query.id + "?include=availabilities,assignments,assignments.shift";
|
var url = process.env.NEXT_PUBLIC_PUBLIC_URL + "/api/data/publishers/" + context.query.id + "?include=availabilities,assignments,assignments.shift";
|
||||||
console.log("GET PUBLISHER FROM:" + url)
|
console.log("GET PUBLISHER FROM:" + url)
|
||||||
const { data: item } = await axios.get(url);
|
try {
|
||||||
|
const { data: item } = await axios.get(url);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("error fetching publisher: " + error);
|
||||||
|
//redirect to message page with message "no account found". get user from session
|
||||||
|
const user = context.req.session.user;
|
||||||
|
return {
|
||||||
|
redirect: {
|
||||||
|
destination: '/message?message=Този имейл (' + user.email + ') не е регистриран. Моля свържете се с администратора.',
|
||||||
|
permanent: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// item.allShifts = item.assignments.map((a: Assignment[]) => a.shift);
|
// item.allShifts = item.assignments.map((a: Assignment[]) => a.shift);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user