mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
feat: add faq, help, privacy policy and tos
This commit is contained in:
@@ -3,6 +3,7 @@ import { useDisclosure } from "@mantine/hooks";
|
||||
import {
|
||||
Home,
|
||||
Layers,
|
||||
LifeBuoy,
|
||||
Loader2,
|
||||
// MapPin,
|
||||
Package,
|
||||
@@ -58,6 +59,10 @@ import CheckPaymentPage from "./pages/payments/CheckPaymentPage";
|
||||
import PaymentFailurePage from "./pages/payments/PaymentFailurePage";
|
||||
import FaydaCallbackPage from "./pages/FaydaCallbackPage";
|
||||
import PaymentSuccessPage from "./pages/payments/PaymentSuccessPage";
|
||||
import FaqPage from "./pages/support/FaqPage";
|
||||
import HelpPage from "./pages/support/HelpPage";
|
||||
import PrivacyPolicyPage from "./pages/support/PrivacyPolicyPage";
|
||||
import TermsPage from "./pages/support/TermsPage";
|
||||
import TrackingPage from "./pages/tracking/TrackingPage";
|
||||
|
||||
function FullScreenSpinner() {
|
||||
@@ -217,6 +222,12 @@ const sidebarItems: SidebarItem[] = [
|
||||
href: "/settings",
|
||||
icon: <Settings size={18} />,
|
||||
},
|
||||
{
|
||||
section: "Account",
|
||||
label: "Help & Support",
|
||||
href: "/help",
|
||||
icon: <LifeBuoy size={18} />,
|
||||
},
|
||||
];
|
||||
|
||||
const App = () => {
|
||||
@@ -273,6 +284,14 @@ const App = () => {
|
||||
<Route path="/payment/success" element={<PaymentSuccessPage />} />
|
||||
<Route path="/payment/failure" element={<PaymentFailurePage />} />
|
||||
|
||||
{/* Help and legal pages. Public on purpose: the auth screens link to
|
||||
them before a session exists, so they carry their own chrome rather
|
||||
than sitting inside the authenticated app layout. */}
|
||||
<Route path="/help" element={<HelpPage />} />
|
||||
<Route path="/faq" element={<FaqPage />} />
|
||||
<Route path="/privacy" element={<PrivacyPolicyPage />} />
|
||||
<Route path="/terms" element={<TermsPage />} />
|
||||
|
||||
{/* Auth pages — inaccessible once logged in */}
|
||||
<Route element={<RedirectIfAuthed />}>
|
||||
<Route path="/login" element={<LoginPage />} />
|
||||
|
||||
@@ -129,19 +129,19 @@ const FormFooter = () => (
|
||||
<span className="shrink-0">© 2026 EDR Freight</span>
|
||||
<div className="flex flex-wrap items-center justify-center gap-3 sm:justify-end sm:gap-6">
|
||||
<Link
|
||||
to="#"
|
||||
to="/terms"
|
||||
className="font-semibold text-gray-700 transition-colors hover:text-primary"
|
||||
>
|
||||
Terms & Conditions
|
||||
</Link>
|
||||
<Link
|
||||
to="#"
|
||||
to="/privacy"
|
||||
className="font-semibold text-gray-700 transition-colors hover:text-primary"
|
||||
>
|
||||
Privacy Policy
|
||||
</Link>
|
||||
<Link
|
||||
to="#"
|
||||
to="/help"
|
||||
className="font-semibold text-gray-700 transition-colors hover:text-primary"
|
||||
>
|
||||
Help & Support
|
||||
|
||||
@@ -584,7 +584,35 @@ export default function EDRFreightLandingPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>© 2026 EDR Freight. All rights reserved.</div>
|
||||
<div className="flex flex-col items-center gap-4 md:items-end">
|
||||
<nav className="flex flex-wrap items-center justify-center gap-x-6 gap-y-2">
|
||||
<Link
|
||||
to="/help"
|
||||
className="font-semibold text-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
Help & Support
|
||||
</Link>
|
||||
<Link
|
||||
to="/faq"
|
||||
className="font-semibold text-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
FAQ
|
||||
</Link>
|
||||
<Link
|
||||
to="/privacy"
|
||||
className="font-semibold text-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
Privacy Policy
|
||||
</Link>
|
||||
<Link
|
||||
to="/terms"
|
||||
className="font-semibold text-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
Terms of Service
|
||||
</Link>
|
||||
</nav>
|
||||
<div>© 2026 EDR Freight. All rights reserved.</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
122
apps/edr-freight-web/portal/src/pages/support/DocShell.tsx
Normal file
122
apps/edr-freight-web/portal/src/pages/support/DocShell.tsx
Normal file
@@ -0,0 +1,122 @@
|
||||
import { ArrowLeft, Train } from "lucide-react";
|
||||
import type { ReactNode } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import type { Section } from "./content";
|
||||
|
||||
/** Public pages reachable from every doc page's header and footer. */
|
||||
const DOC_LINKS = [
|
||||
{ to: "/help", label: "Help & Support" },
|
||||
{ to: "/faq", label: "FAQ" },
|
||||
{ to: "/privacy", label: "Privacy Policy" },
|
||||
{ to: "/terms", label: "Terms of Service" },
|
||||
];
|
||||
|
||||
interface DocShellProps {
|
||||
title: string;
|
||||
subtitle: string;
|
||||
/** Rendered under the title, e.g. "Last updated 6 August 2026". */
|
||||
meta?: string;
|
||||
/** Path of the current page, so it is not linked to itself. */
|
||||
current: string;
|
||||
children: ReactNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chrome shared by the help, FAQ and legal pages. These routes are public —
|
||||
* the auth screens link to them before a session exists — so the shell carries
|
||||
* its own header instead of relying on the authenticated app layout.
|
||||
*/
|
||||
export function DocShell({
|
||||
title,
|
||||
subtitle,
|
||||
meta,
|
||||
current,
|
||||
children,
|
||||
}: DocShellProps) {
|
||||
return (
|
||||
<div className="min-h-screen bg-background text-foreground">
|
||||
<header className="sticky top-0 z-50 border-b border-border bg-background/80 backdrop-blur-xl">
|
||||
<div className="mx-auto flex max-w-4xl items-center justify-between gap-4 px-6 py-4">
|
||||
<Link to="/" className="flex items-center gap-3">
|
||||
<div className="flex size-10 items-center justify-center rounded-2xl bg-primary text-primary-foreground">
|
||||
<Train className="size-5" />
|
||||
</div>
|
||||
<span className="font-bold">EDR Freight</span>
|
||||
</Link>
|
||||
|
||||
<Link
|
||||
to="/portal"
|
||||
className="inline-flex items-center gap-2 rounded-2xl border border-border px-4 py-2 text-sm font-semibold transition hover:bg-accent"
|
||||
>
|
||||
<ArrowLeft className="size-4" />
|
||||
Back to portal
|
||||
</Link>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main className="mx-auto max-w-4xl px-6 py-12">
|
||||
<h1 className="text-4xl font-black tracking-tight">{title}</h1>
|
||||
<p className="mt-4 text-lg leading-8 text-muted-foreground">
|
||||
{subtitle}
|
||||
</p>
|
||||
{meta && (
|
||||
<p className="mt-2 text-sm text-muted-foreground">{meta}</p>
|
||||
)}
|
||||
|
||||
<div className="mt-10">{children}</div>
|
||||
</main>
|
||||
|
||||
<footer className="border-t border-border py-8">
|
||||
<div className="mx-auto flex max-w-4xl flex-col items-center justify-between gap-4 px-6 text-sm text-muted-foreground md:flex-row">
|
||||
<span>© 2026 EDR Freight. All rights reserved.</span>
|
||||
<nav className="flex flex-wrap items-center justify-center gap-x-6 gap-y-2">
|
||||
{DOC_LINKS.filter((l) => l.to !== current).map((link) => (
|
||||
<Link
|
||||
key={link.to}
|
||||
to={link.to}
|
||||
className="font-semibold text-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
{link.label}
|
||||
</Link>
|
||||
))}
|
||||
</nav>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/** Renders a legal document's numbered sections. */
|
||||
export function DocSections({ sections }: { sections: Section[] }) {
|
||||
return (
|
||||
<div className="space-y-10">
|
||||
{sections.map((section) => (
|
||||
<section key={section.heading}>
|
||||
<h2 className="text-xl font-bold tracking-tight">
|
||||
{section.heading}
|
||||
</h2>
|
||||
|
||||
{section.body?.map((paragraph) => (
|
||||
<p
|
||||
key={paragraph}
|
||||
className="mt-4 leading-7 text-muted-foreground"
|
||||
>
|
||||
{paragraph}
|
||||
</p>
|
||||
))}
|
||||
|
||||
{section.bullets && (
|
||||
<ul className="mt-4 list-disc space-y-2 pl-5 leading-7 text-muted-foreground">
|
||||
{section.bullets.map((bullet) => (
|
||||
<li key={bullet}>{bullet}</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default DocShell;
|
||||
59
apps/edr-freight-web/portal/src/pages/support/FaqPage.tsx
Normal file
59
apps/edr-freight-web/portal/src/pages/support/FaqPage.tsx
Normal file
@@ -0,0 +1,59 @@
|
||||
import { ChevronDown } from "lucide-react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import { DocShell } from "./DocShell";
|
||||
import { FAQ_GROUPS, SUPPORT_CONTACT } from "./content";
|
||||
|
||||
export default function FaqPage() {
|
||||
return (
|
||||
<DocShell
|
||||
current="/faq"
|
||||
title="Frequently Asked Questions"
|
||||
subtitle="Answers to the questions customers ask most about registering, booking cargo and settling invoices on EDR Freight."
|
||||
>
|
||||
<div className="space-y-10">
|
||||
{FAQ_GROUPS.map((group) => (
|
||||
<section key={group.title}>
|
||||
<h2 className="text-xl font-bold tracking-tight">{group.title}</h2>
|
||||
|
||||
<div className="mt-4 space-y-3">
|
||||
{group.items.map((item) => (
|
||||
// Native disclosure: keyboard- and screen-reader-accessible
|
||||
// without any state of our own.
|
||||
<details
|
||||
key={item.question}
|
||||
className="group rounded-2xl border border-border bg-card px-5 py-4 transition hover:border-primary/40"
|
||||
>
|
||||
<summary className="flex cursor-pointer list-none items-center justify-between gap-4 font-semibold">
|
||||
{item.question}
|
||||
<ChevronDown className="size-5 shrink-0 text-muted-foreground transition-transform group-open:rotate-180" />
|
||||
</summary>
|
||||
|
||||
<p className="mt-3 leading-7 text-muted-foreground">
|
||||
{item.answer}
|
||||
</p>
|
||||
</details>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mt-12 rounded-[32px] border border-border bg-card p-8">
|
||||
<h2 className="text-xl font-bold tracking-tight">
|
||||
Still need a hand?
|
||||
</h2>
|
||||
<p className="mt-2 leading-7 text-muted-foreground">
|
||||
Our team is on {SUPPORT_CONTACT.email} and {SUPPORT_CONTACT.phone}, or
|
||||
you can start a chat from the support button inside the portal.
|
||||
</p>
|
||||
<Link
|
||||
to="/help"
|
||||
className="mt-6 inline-flex rounded-2xl bg-primary px-6 py-3 font-semibold text-primary-foreground transition hover:opacity-90"
|
||||
>
|
||||
Go to Help & Support
|
||||
</Link>
|
||||
</div>
|
||||
</DocShell>
|
||||
);
|
||||
}
|
||||
183
apps/edr-freight-web/portal/src/pages/support/HelpPage.tsx
Normal file
183
apps/edr-freight-web/portal/src/pages/support/HelpPage.tsx
Normal file
@@ -0,0 +1,183 @@
|
||||
import {
|
||||
Clock3,
|
||||
FileText,
|
||||
HelpCircle,
|
||||
Mail,
|
||||
MapPin,
|
||||
MessageSquare,
|
||||
Package,
|
||||
Phone,
|
||||
Receipt,
|
||||
ShieldCheck,
|
||||
} from "lucide-react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import { DocShell } from "./DocShell";
|
||||
import { SUPPORT_CONTACT } from "./content";
|
||||
|
||||
const channels = [
|
||||
{
|
||||
icon: Mail,
|
||||
title: "Email",
|
||||
value: SUPPORT_CONTACT.email,
|
||||
href: `mailto:${SUPPORT_CONTACT.email}`,
|
||||
note: "Best for document issues and anything needing an attachment.",
|
||||
},
|
||||
{
|
||||
icon: Phone,
|
||||
title: "Phone",
|
||||
value: SUPPORT_CONTACT.phone,
|
||||
href: `tel:${SUPPORT_CONTACT.phone.replace(/\s/g, "")}`,
|
||||
note: "Best for urgent problems with cargo already in transit.",
|
||||
},
|
||||
{
|
||||
icon: MapPin,
|
||||
title: "Head office",
|
||||
value: SUPPORT_CONTACT.office,
|
||||
note: "Walk-in support during working hours.",
|
||||
},
|
||||
{
|
||||
icon: Clock3,
|
||||
title: "Support hours",
|
||||
value: SUPPORT_CONTACT.hours,
|
||||
note: "Outside these hours, email us and we reply the next working day.",
|
||||
},
|
||||
];
|
||||
|
||||
const topics = [
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Account & onboarding",
|
||||
body: "Registering your company, uploading your trade licence and TIN, and getting an operational profile approved.",
|
||||
},
|
||||
{
|
||||
icon: FileText,
|
||||
title: "Contracts",
|
||||
body: "Requesting a freight contract, reviewing its terms and signing it with your saved signature and stamp.",
|
||||
},
|
||||
{
|
||||
icon: Package,
|
||||
title: "Bookings & tracking",
|
||||
body: "Raising a booking against a contract, adding last-mile transport and following the consignment along the corridor.",
|
||||
},
|
||||
{
|
||||
icon: Receipt,
|
||||
title: "Invoices & payments",
|
||||
body: "Finding invoices, paying through the bank channels and confirming a payment that has not yet settled.",
|
||||
},
|
||||
];
|
||||
|
||||
export default function HelpPage() {
|
||||
return (
|
||||
<DocShell
|
||||
current="/help"
|
||||
title="Help & Support"
|
||||
subtitle="Get answers fast — browse the common topics, check the FAQ, or reach our team directly."
|
||||
>
|
||||
{/* Live chat is the fastest route, so lead with it. */}
|
||||
<div className="rounded-[32px] border border-border bg-card p-8">
|
||||
<div className="flex items-start gap-4">
|
||||
<div className="rounded-2xl bg-accent p-3 text-primary">
|
||||
<MessageSquare className="size-5" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-xl font-bold tracking-tight">
|
||||
Chat with our team
|
||||
</h2>
|
||||
<p className="mt-2 leading-7 text-muted-foreground">
|
||||
Signed-in customers can open a support conversation from the
|
||||
headset button at the bottom right of every portal page. You can
|
||||
send screenshots and documents in the chat, and replies appear
|
||||
there and as a notification.
|
||||
</p>
|
||||
<Link
|
||||
to="/portal"
|
||||
className="mt-6 inline-flex rounded-2xl bg-primary px-6 py-3 font-semibold text-primary-foreground transition hover:opacity-90"
|
||||
>
|
||||
Open the portal
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section className="mt-12">
|
||||
<h2 className="text-xl font-bold tracking-tight">Contact us</h2>
|
||||
|
||||
<div className="mt-4 grid gap-4 sm:grid-cols-2">
|
||||
{channels.map((channel) => (
|
||||
<div
|
||||
key={channel.title}
|
||||
className="flex items-start gap-4 rounded-2xl border border-border bg-background p-5"
|
||||
>
|
||||
<div className="rounded-2xl bg-accent p-3 text-primary">
|
||||
<channel.icon className="size-5" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p className="font-semibold">{channel.title}</p>
|
||||
{channel.href ? (
|
||||
<a
|
||||
href={channel.href}
|
||||
className="text-muted-foreground transition-colors hover:text-primary"
|
||||
>
|
||||
{channel.value}
|
||||
</a>
|
||||
) : (
|
||||
<p className="text-muted-foreground">{channel.value}</p>
|
||||
)}
|
||||
<p className="mt-1 text-sm text-muted-foreground">
|
||||
{channel.note}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="mt-12">
|
||||
<h2 className="text-xl font-bold tracking-tight">Common topics</h2>
|
||||
|
||||
<div className="mt-4 grid gap-4 sm:grid-cols-2">
|
||||
{topics.map((topic) => (
|
||||
<Link
|
||||
key={topic.title}
|
||||
to="/faq"
|
||||
className="rounded-2xl border border-border bg-background p-5 transition hover:border-primary/40"
|
||||
>
|
||||
<div className="inline-flex rounded-2xl bg-accent p-3 text-primary">
|
||||
<topic.icon className="size-5" />
|
||||
</div>
|
||||
<p className="mt-4 font-semibold">{topic.title}</p>
|
||||
<p className="mt-1 leading-7 text-muted-foreground">
|
||||
{topic.body}
|
||||
</p>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="mt-12 rounded-[32px] border border-border bg-card p-8">
|
||||
<div className="flex items-start gap-4">
|
||||
<div className="rounded-2xl bg-accent p-3 text-primary">
|
||||
<HelpCircle className="size-5" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 className="text-xl font-bold tracking-tight">
|
||||
What to include when you contact us
|
||||
</h2>
|
||||
<ul className="mt-3 list-disc space-y-2 pl-5 leading-7 text-muted-foreground">
|
||||
<li>Your company name and the email you sign in with.</li>
|
||||
<li>
|
||||
The reference of the contract, booking or invoice involved.
|
||||
</li>
|
||||
<li>What you expected to happen and what happened instead.</li>
|
||||
<li>A screenshot of any error message the portal showed.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</DocShell>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import { DocSections, DocShell } from "./DocShell";
|
||||
import { LEGAL_LAST_UPDATED, PRIVACY_SECTIONS } from "./content";
|
||||
|
||||
export default function PrivacyPolicyPage() {
|
||||
return (
|
||||
<DocShell
|
||||
current="/privacy"
|
||||
title="Privacy Policy"
|
||||
subtitle="How EDR Freight collects, uses, shares and protects the information you provide when you use the platform."
|
||||
meta={`Last updated ${LEGAL_LAST_UPDATED}`}
|
||||
>
|
||||
<DocSections sections={PRIVACY_SECTIONS} />
|
||||
</DocShell>
|
||||
);
|
||||
}
|
||||
15
apps/edr-freight-web/portal/src/pages/support/TermsPage.tsx
Normal file
15
apps/edr-freight-web/portal/src/pages/support/TermsPage.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import { DocSections, DocShell } from "./DocShell";
|
||||
import { LEGAL_LAST_UPDATED, TERMS_SECTIONS } from "./content";
|
||||
|
||||
export default function TermsPage() {
|
||||
return (
|
||||
<DocShell
|
||||
current="/terms"
|
||||
title="Terms of Service"
|
||||
subtitle="The terms on which EDR provides the EDR Freight platform and the freight services you request through it."
|
||||
meta={`Last updated ${LEGAL_LAST_UPDATED}`}
|
||||
>
|
||||
<DocSections sections={TERMS_SECTIONS} />
|
||||
</DocShell>
|
||||
);
|
||||
}
|
||||
358
apps/edr-freight-web/portal/src/pages/support/content.ts
Normal file
358
apps/edr-freight-web/portal/src/pages/support/content.ts
Normal file
@@ -0,0 +1,358 @@
|
||||
/**
|
||||
* Copy for the public help/FAQ/legal pages. Kept as data so the pages stay
|
||||
* thin — the shell in `DocShell.tsx` renders any `Section[]` the same way.
|
||||
*
|
||||
* The privacy and terms text is the platform's working draft; legal counsel
|
||||
* signs off on the final wording, and `LEGAL_LAST_UPDATED` is bumped with it.
|
||||
*/
|
||||
|
||||
export const SUPPORT_CONTACT = {
|
||||
email: "support@edrfreight.com",
|
||||
phone: "+251 11 000 0000",
|
||||
office: "Addis Ababa, Ethiopia",
|
||||
hours: "Monday – Saturday, 8:30 AM – 5:30 PM (EAT)",
|
||||
};
|
||||
|
||||
export const LEGAL_LAST_UPDATED = "6 August 2026";
|
||||
|
||||
export interface Section {
|
||||
heading: string;
|
||||
/** Paragraphs, rendered in order. */
|
||||
body?: string[];
|
||||
/** Optional bullet list, rendered after the paragraphs. */
|
||||
bullets?: string[];
|
||||
}
|
||||
|
||||
export interface FaqItem {
|
||||
question: string;
|
||||
answer: string;
|
||||
}
|
||||
|
||||
export interface FaqGroup {
|
||||
title: string;
|
||||
items: FaqItem[];
|
||||
}
|
||||
|
||||
export const FAQ_GROUPS: FaqGroup[] = [
|
||||
{
|
||||
title: "Getting started",
|
||||
items: [
|
||||
{
|
||||
question: "How do I open an account on EDR Freight?",
|
||||
answer:
|
||||
"Sign up with your work email and verify the one-time code we send you. After you set a password, the onboarding wizard collects your company details, trade licence, TIN certificate and the operational services you need (importer, exporter, freight forwarder or transporter). Submit the wizard and our team reviews the application.",
|
||||
},
|
||||
{
|
||||
question: "How long does account approval take?",
|
||||
answer:
|
||||
"Most complete applications are reviewed within two working days. You will see the status on your dashboard, and we email you when a profile is approved or when a document needs to be re-uploaded.",
|
||||
},
|
||||
{
|
||||
question: "My profile was rejected. What now?",
|
||||
answer:
|
||||
"The rejection notice states the reason. Open Settings, correct the details or replace the document that was flagged, and re-apply — you do not need to create a new account.",
|
||||
},
|
||||
{
|
||||
question: "Can one company hold several operational services?",
|
||||
answer:
|
||||
"Yes. A company can hold importer, exporter, freight forwarder and transporter profiles at the same time. Each is approved separately, and the header lets you switch between the ones you hold.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Contracts and bookings",
|
||||
items: [
|
||||
{
|
||||
question: "What is the difference between a contract and a booking?",
|
||||
answer:
|
||||
"A contract is the commercial agreement covering a cargo movement — route, commodity, volume and rates. A booking is a single shipment executed under that contract. You create the contract once, then raise bookings against it for each consignment.",
|
||||
},
|
||||
{
|
||||
question: "How do I create a booking?",
|
||||
answer:
|
||||
"Open the contract from the Contracts list and choose New Booking. Provide the consignment details, containers or tonnage, and the last-mile requirement if you need one. Bookings can also be started from the Bookings page, which routes you through contract selection first.",
|
||||
},
|
||||
{
|
||||
question: "Why do I have to sign a contract before shipping?",
|
||||
answer:
|
||||
"The contract document is the binding agreement for the movement. You must scroll to the end, accept the terms, and sign it with your saved signature and stamp before EDR schedules any wagon against it.",
|
||||
},
|
||||
{
|
||||
question: "Where do I set up my signature and stamp?",
|
||||
answer:
|
||||
"Under Signature & Stamp in the portal. It is saved once and reused for every contract you sign, so you do not have to upload it per document.",
|
||||
},
|
||||
{
|
||||
question: "Can I change a booking after submitting it?",
|
||||
answer:
|
||||
"You can edit a booking while it is still pending review. Once EDR has confirmed it and allocated capacity, changes go through our operations team — contact support with the booking reference.",
|
||||
},
|
||||
{
|
||||
question: "How do I track a consignment?",
|
||||
answer:
|
||||
"Open the booking and use the tracking panel, which shows the current milestone, the wagon or container assigned, and the timestamps recorded at each corridor point.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Invoices and payments",
|
||||
items: [
|
||||
{
|
||||
question: "Where do I find my invoices?",
|
||||
answer:
|
||||
"The Invoices page lists every invoice raised against your company, with its status, due date and outstanding balance. Open any invoice to see its line items and download a PDF copy.",
|
||||
},
|
||||
{
|
||||
question: "Which payment methods are supported?",
|
||||
answer:
|
||||
"Payments are made through the integrated bank channels shown at checkout. After you complete the payment on the bank's page you are returned to the portal, and the invoice status updates once the bank confirms the transaction.",
|
||||
},
|
||||
{
|
||||
question: "My payment was deducted but the invoice still shows unpaid.",
|
||||
answer:
|
||||
"Bank confirmations can lag by a few minutes. Use the Check Payment Status page linked from your receipt; if it still has not settled after an hour, email support with the invoice number and the bank reference and we will reconcile it.",
|
||||
},
|
||||
{
|
||||
question: "Why is my invoice amount rounded?",
|
||||
answer:
|
||||
"Some bank channels only accept whole-birr amounts, so invoices routed through them are rounded up to the nearest birr. The rounding is shown on the invoice detail page.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Account and security",
|
||||
items: [
|
||||
{
|
||||
question: "How do I reset my password?",
|
||||
answer:
|
||||
"Use Forgot Password on the sign-in page. We email you a reset link that is valid for a limited time. If a member of our staff issued the link, it works the same way even if you are already signed in.",
|
||||
},
|
||||
{
|
||||
question: "Can I add colleagues to my company account?",
|
||||
answer:
|
||||
"Yes. Company administrators can invite additional users from Settings. Each user signs in with their own credentials, and actions are recorded against the individual who performed them.",
|
||||
},
|
||||
{
|
||||
question: "How do I update company details after approval?",
|
||||
answer:
|
||||
"Edit them in Settings. Changes to regulated fields — trade licence, TIN, legal name — are re-verified by our team before they take effect.",
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const PRIVACY_SECTIONS: Section[] = [
|
||||
{
|
||||
heading: "1. Introduction",
|
||||
body: [
|
||||
"The Ethio-Djibouti Standard Gauge Rail Share Company (\"EDR\", \"we\", \"us\") operates the EDR Freight platform, which lets customers register their business, agree freight contracts, raise bookings, track consignments and settle invoices online.",
|
||||
"This policy explains what personal and business information we collect through the platform, why we collect it, how long we keep it and what rights you have over it. It applies to the EDR Freight customer portal and the services reached through it.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "2. Information we collect",
|
||||
body: [
|
||||
"We collect information you give us, information generated by your use of the platform, and information we receive from the regulators and financial institutions we work with.",
|
||||
],
|
||||
bullets: [
|
||||
"Account details — name, work email address, phone number and the credentials used to sign in.",
|
||||
"Company and compliance records — legal name, trade licence, TIN certificate, VAT registration, ownership and manager details, and the operational services you apply for.",
|
||||
"Identity verification data — where you verify through a national identity service, the verification result and the attributes that service returns to us.",
|
||||
"Operational data — contracts, bookings, consignment and cargo details, container and wagon assignments, tracking events and delivery confirmations.",
|
||||
"Financial data — invoices, payment references, transaction status and settlement confirmations received from banks. We do not store your card numbers or online banking credentials.",
|
||||
"Support data — the messages and files you send us through the in-app support chat or by email.",
|
||||
"Technical data — IP address, device and browser information, and event logs generated when you use the platform.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "3. How we use your information",
|
||||
bullets: [
|
||||
"To create and administer your account and verify that your company is entitled to the services it applies for.",
|
||||
"To perform the freight contracts and bookings you place, including allocating capacity and coordinating rail and last-mile movements.",
|
||||
"To issue invoices, process payments and keep the accounting records the law requires us to keep.",
|
||||
"To provide customer support and respond to the questions and complaints you raise.",
|
||||
"To keep the platform secure, detect misuse and investigate incidents.",
|
||||
"To meet our legal, tax, customs and regulatory obligations in Ethiopia and Djibouti.",
|
||||
"To improve the platform — measuring which features are used and where users encounter errors, using aggregated and pseudonymised data wherever that is sufficient.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "4. Legal basis for processing",
|
||||
body: [
|
||||
"We process your information because it is necessary to perform the contract between you and EDR, because we have a legal obligation to do so (customs, tax and transport regulation), or because we have a legitimate interest in operating and securing the platform. Where we rely on your consent — for example, optional marketing messages — you can withdraw it at any time.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "5. Sharing your information",
|
||||
body: [
|
||||
"We do not sell your information. We share it only where it is necessary to deliver the service or where the law requires it.",
|
||||
],
|
||||
bullets: [
|
||||
"Government and regulatory bodies — customs, revenue and transport authorities in Ethiopia and Djibouti, to the extent required for the movement of your cargo.",
|
||||
"Ports, terminals and last-mile transporters involved in executing your bookings.",
|
||||
"Banks and payment providers, to initiate and reconcile the payments you make.",
|
||||
"Technology suppliers who host and maintain the platform on our behalf, under contracts that restrict them to processing data on our instructions.",
|
||||
"Courts, law enforcement and other authorities where we are legally compelled to disclose.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "6. International transfers",
|
||||
body: [
|
||||
"Cross-border freight inherently involves parties in more than one country, so consignment and clearance information is shared with counterparties and authorities in Djibouti as well as Ethiopia. Where we transfer information outside Ethiopia, we do so only as far as the movement requires or the law permits, and we require recipients to protect it to a comparable standard.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "7. Data retention",
|
||||
body: [
|
||||
"We keep account and company records for as long as your account is active. Contract, booking, customs and financial records are kept for the period required by Ethiopian commercial, tax and customs law after the relevant transaction, because we are obliged to be able to produce them. Support conversations and technical logs are kept for a shorter period, sufficient to resolve disputes and investigate security incidents.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "8. Security",
|
||||
body: [
|
||||
"Access to the platform requires authentication, and staff access to customer records is limited to what each role needs. Data is transmitted over encrypted connections and stored on systems protected by access controls and logging. No system is perfectly secure, so please keep your credentials confidential and tell us immediately if you believe your account has been compromised.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "9. Your rights",
|
||||
body: [
|
||||
"Subject to Ethiopian law, you may ask us to give you a copy of the personal information we hold about you, correct it if it is inaccurate, restrict or object to certain processing, or delete it where we are not required to keep it. Requests are handled through the contact details below; we may need to verify your identity before acting.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "10. Cookies and similar technologies",
|
||||
body: [
|
||||
"The platform uses cookies and browser storage to keep you signed in, remember your interface preferences and measure how the product is used so we can fix problems. Essential cookies cannot be turned off without breaking sign-in. You can clear or block the rest through your browser settings.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "11. Children",
|
||||
body: [
|
||||
"The platform is a business service and is not directed at children. We do not knowingly collect information from anyone under 18.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "12. Changes to this policy",
|
||||
body: [
|
||||
"We may update this policy as the platform and the law change. Material changes are announced in the portal before they take effect, and the date at the top of this page always reflects the current version.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "13. Contact us",
|
||||
body: [
|
||||
`Questions about this policy or about how we handle your information can be sent to ${SUPPORT_CONTACT.email}, called in on ${SUPPORT_CONTACT.phone}, or addressed to our head office in ${SUPPORT_CONTACT.office}.`,
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const TERMS_SECTIONS: Section[] = [
|
||||
{
|
||||
heading: "1. These terms",
|
||||
body: [
|
||||
"These terms govern your use of the EDR Freight platform operated by the Ethio-Djibouti Standard Gauge Rail Share Company (\"EDR\"). By creating an account or using the platform, the company you represent agrees to them.",
|
||||
"The platform is the channel through which you register, request and manage freight services. The commercial terms of each movement — routes, rates, volumes and payment terms — are set out in the freight contract you sign in the platform. Where a signed contract and these terms conflict, the signed contract governs that movement.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "2. Eligibility and accounts",
|
||||
bullets: [
|
||||
"The platform is for registered businesses. You confirm that you are authorised to act for the company you register and to bind it to these terms.",
|
||||
"The information and documents you submit — trade licence, TIN, VAT registration, ownership details — must be accurate, current and genuine.",
|
||||
"Accounts and operational profiles are activated only after EDR has reviewed and approved them, and approval may be refused or withdrawn.",
|
||||
"You are responsible for keeping credentials confidential and for everything done under your account. Tell us at once if you suspect unauthorised use.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "3. Contracts and bookings",
|
||||
bullets: [
|
||||
"A freight contract takes effect when it is signed in the platform by you and countersigned by EDR.",
|
||||
"A booking is a request for a specific movement under a contract. It becomes binding when EDR confirms it and allocates capacity — submission alone does not reserve a wagon or container.",
|
||||
"You are responsible for the accuracy of consignment data: commodity description, weight, dimensions, container numbers, hazardous classification and consignee details.",
|
||||
"Capacity is finite. EDR may decline, defer or reschedule a booking where capacity, safety, operating conditions or regulatory direction require it.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "4. Cargo, documents and compliance",
|
||||
bullets: [
|
||||
"You must obtain and provide every permit, customs declaration and clearance document the movement requires, and you warrant that the cargo may lawfully be carried.",
|
||||
"Prohibited and restricted goods may not be tendered without EDR's prior written agreement and any licence the law requires.",
|
||||
"Cargo must be packed, secured and, where applicable, labelled to the standard the mode of carriage requires. EDR may inspect, refuse or offload cargo that is misdeclared or unsafe.",
|
||||
"You are liable for fines, demurrage, storage charges and losses arising from misdeclared cargo, missing documents or delays attributable to you.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "5. Rates, invoicing and payment",
|
||||
bullets: [
|
||||
"Charges are calculated from the rates in your contract, the tariffs published in the platform, and any accessorial services actually rendered.",
|
||||
"Invoices are issued in the platform and are payable by the due date shown on them, through the payment channels the platform offers.",
|
||||
"Payment is confirmed when the funds are confirmed by the bank, not when payment is initiated.",
|
||||
"Overdue amounts may attract interest and may result in suspension of new bookings or of the account until the balance is cleared.",
|
||||
"Taxes and statutory duties are your responsibility unless the contract expressly says otherwise.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "6. Delivery, delay and liability",
|
||||
body: [
|
||||
"Transit times shown in the platform are estimates based on planned schedules. They are not guarantees, and EDR is not liable for indirect or consequential loss, loss of profit or loss of market arising from delay.",
|
||||
"EDR's liability for loss of or damage to cargo is limited to the extent set out in the applicable freight contract and in the transport law governing the carriage. Claims must be notified in writing within the period the contract specifies; late claims may be rejected.",
|
||||
"Neither party is liable for failure to perform caused by events beyond its reasonable control, including natural disasters, industrial action, civil unrest, infrastructure failure, or acts of government and regulatory authorities.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "7. Acceptable use of the platform",
|
||||
bullets: [
|
||||
"Use the platform only for its intended purpose and in accordance with applicable law.",
|
||||
"Do not attempt to gain unauthorised access, probe or disrupt the service, or interfere with other customers' data.",
|
||||
"Do not scrape, resell or redistribute platform content, rates or data without written permission.",
|
||||
"Do not upload malware or content that infringes the rights of others.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "8. Electronic signatures and records",
|
||||
body: [
|
||||
"You agree that contracts signed in the platform using your stored signature and stamp are validly executed, that the records the platform keeps of those signatures are admissible evidence of them, and that they carry the same effect as signatures on paper.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "9. Availability and changes to the service",
|
||||
body: [
|
||||
"We aim to keep the platform available, but it may be interrupted for maintenance, upgrades or reasons outside our control. We may add, change or withdraw features. Where a change materially affects how you use the platform, we will give reasonable notice in the portal.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "10. Suspension and termination",
|
||||
body: [
|
||||
"We may suspend or terminate access where these terms are breached, where documents prove to be false, where amounts remain unpaid, or where the law or a regulator requires it. You may stop using the platform at any time. Termination does not affect obligations already incurred — cargo in transit, invoices outstanding, or records we are required to retain.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "11. Intellectual property",
|
||||
body: [
|
||||
"The platform, its software, design and content belong to EDR or its licensors. You are granted a non-exclusive, non-transferable right to use it for your own freight operations. Your commercial and consignment data remains yours; you grant us the right to process it as needed to deliver the service and as described in the Privacy Policy.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "12. Confidentiality and data protection",
|
||||
body: [
|
||||
"Each party will keep the other's non-public commercial information confidential and use it only for the purposes of the services. Our handling of personal information is described in the Privacy Policy, which forms part of these terms.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "13. Governing law and disputes",
|
||||
body: [
|
||||
"These terms are governed by the laws of the Federal Democratic Republic of Ethiopia. The parties will first attempt to resolve any dispute amicably; failing that, the dispute is subject to the jurisdiction of the competent courts of Ethiopia, without prejudice to any arbitration clause agreed in a specific freight contract.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "14. Changes to these terms",
|
||||
body: [
|
||||
"We may update these terms as the service and the law change. Updates are published here and announced in the portal. Continuing to use the platform after an update takes effect means you accept the revised terms.",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "15. Contact",
|
||||
body: [
|
||||
`For questions about these terms, write to ${SUPPORT_CONTACT.email} or call ${SUPPORT_CONTACT.phone}.`,
|
||||
],
|
||||
},
|
||||
];
|
||||
Reference in New Issue
Block a user