diff --git a/app/src/app/[locale]/suspense/InstantLoadGreeting.tsx b/app/src/app/[locale]/suspense/InstantLoadGreeting.tsx
new file mode 100644
index 00000000..a0185371
--- /dev/null
+++ b/app/src/app/[locale]/suspense/InstantLoadGreeting.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+const InstantLoadGreeting = () => {
+ return
This should load instantly!
;
+};
+
+export default InstantLoadGreeting;
diff --git a/app/src/app/[locale]/suspense/Todos1SecLoad.tsx b/app/src/app/[locale]/suspense/Todos1SecLoad.tsx
new file mode 100644
index 00000000..f1842027
--- /dev/null
+++ b/app/src/app/[locale]/suspense/Todos1SecLoad.tsx
@@ -0,0 +1,23 @@
+import { getTodos } from "./Todos2SecLoad";
+
+interface Todo {
+ userId: number;
+ id: number;
+ title: string;
+ completed: boolean;
+}
+
+export default async function Todos1SecLoad() {
+ const todos: Todo[] = await getTodos(1000);
+
+ return (
+
+
Todos
+
+ {todos.slice(0, 10).map((todo) => (
+ - {todo.title}
+ ))}
+
+
+ );
+}
diff --git a/app/src/app/[locale]/suspense/Todos2SecLoad.tsx b/app/src/app/[locale]/suspense/Todos2SecLoad.tsx
new file mode 100644
index 00000000..84c90e1d
--- /dev/null
+++ b/app/src/app/[locale]/suspense/Todos2SecLoad.tsx
@@ -0,0 +1,27 @@
+interface Todo {
+ userId: number;
+ id: number;
+ title: string;
+ completed: boolean;
+}
+
+export async function getTodos(delay: number) {
+ await new Promise((resolve) => setTimeout(resolve, delay));
+ const response = await fetch("https://jsonplaceholder.typicode.com/todos");
+ const data = (await response.json()) as Todo[];
+ return data;
+}
+export default async function Todos2SecLoad() {
+ const todos: Todo[] = await getTodos(2000);
+
+ return (
+
+
Todos
+
+ {todos.slice(0, 10).map((todo) => (
+ - {todo.title}
+ ))}
+
+
+ );
+}
diff --git a/app/src/app/[locale]/suspense/loader.tsx b/app/src/app/[locale]/suspense/loader.tsx
new file mode 100644
index 00000000..852abf31
--- /dev/null
+++ b/app/src/app/[locale]/suspense/loader.tsx
@@ -0,0 +1,5 @@
+import React from "react";
+
+const Loader = ({ message }: { message: string }) => {message}
;
+
+export default Loader;
diff --git a/app/src/app/[locale]/suspense/page.tsx b/app/src/app/[locale]/suspense/page.tsx
new file mode 100644
index 00000000..f761ad4d
--- /dev/null
+++ b/app/src/app/[locale]/suspense/page.tsx
@@ -0,0 +1,33 @@
+import { useTranslations } from "next-intl";
+import React, { Suspense } from "react";
+
+import InstantLoadGreeting from "./InstantLoadGreeting";
+import Loader from "./loader";
+import Todos1SecLoad from "./Todos1SecLoad";
+import Todos2SecLoad from "./Todos2SecLoad";
+
+export default function Page() {
+ const t = useTranslations("suspense");
+ return (
+ <>
+ {t("title")}
+
+
+
+ }
+ >
+
+
+
+
+ }
+ >
+
+
+
+
+ >
+ );
+}
diff --git a/app/src/i18n/messages/en-US/index.ts b/app/src/i18n/messages/en-US/index.ts
index 5e856e07..a950d214 100644
--- a/app/src/i18n/messages/en-US/index.ts
+++ b/app/src/i18n/messages/en-US/index.ts
@@ -26,4 +26,7 @@ export const messages = {
formatting:
"The template includes an internationalization library with basic formatters built-in. Such as numbers: { amount, number, currency }, and dates: { isoDate, date, long}.",
},
+ suspense: {
+ title: "Suspense Example",
+ },
};