feat(MED-100): add partner locations list for cart

This commit is contained in:
2025-08-25 11:50:55 +03:00
parent 1d1b10d094
commit 4e6f12a9a0
2 changed files with 155 additions and 16 deletions

View File

@@ -19,17 +19,13 @@ import {
} from '@kit/ui/select'; } from '@kit/ui/select';
import { updateCartPartnerLocation } from '../../_lib/server/update-cart-partner-location'; import { updateCartPartnerLocation } from '../../_lib/server/update-cart-partner-location';
import partnerLocations from './partner-locations.json';
const AnalysisLocationSchema = z.object({ const AnalysisLocationSchema = z.object({
locationId: z.string().min(1), locationId: z.string().min(1),
}); });
const MOCK_LOCATIONS: { id: string, name: string }[] = [ export default function AnalysisLocation({ cart, synlabAnalyses }: { cart: StoreCart, synlabAnalyses: StoreCartLineItem[] }) {
{ id: "synlab-tallinn-1", name: "SYNLAB - Tallinn" },
{ id: "synlab-tartu-1", name: "SYNLAB - Tartu" },
{ id: "synlab-parnu-1", name: "SYNLAB - Pärnu" },
]
export default function AnalysisLocation({ cart, analysisPackages }: { cart: StoreCart, analysisPackages: StoreCartLineItem[] }) {
const { t } = useTranslation('cart'); const { t } = useTranslation('cart');
const form = useForm<z.infer<typeof AnalysisLocationSchema>>({ const form = useForm<z.infer<typeof AnalysisLocationSchema>>({
@@ -39,12 +35,16 @@ export default function AnalysisLocation({ cart, analysisPackages }: { cart: Sto
resolver: zodResolver(AnalysisLocationSchema), resolver: zodResolver(AnalysisLocationSchema),
}); });
const getLocation = (locationId: string) => partnerLocations.find(({ name }) => name === locationId);
const selectedLocation = getLocation(form.watch('locationId'));
const onSubmit = async ({ locationId }: z.infer<typeof AnalysisLocationSchema>) => { const onSubmit = async ({ locationId }: z.infer<typeof AnalysisLocationSchema>) => {
const promise = updateCartPartnerLocation({ const promise = updateCartPartnerLocation({
cartId: cart.id, cartId: cart.id,
lineIds: analysisPackages.map(({ id }) => id), lineIds: synlabAnalyses.map(({ id }) => id),
partnerLocationId: locationId, partnerLocationId: locationId,
partnerLocationName: MOCK_LOCATIONS.find((location) => location.id === locationId)?.name ?? '', partnerLocationName: getLocation(locationId)?.name ?? '',
}); });
toast.promise(promise, { toast.promise(promise, {
@@ -55,7 +55,7 @@ export default function AnalysisLocation({ cart, analysisPackages }: { cart: Sto
} }
return ( return (
<div className="w-full bg-white flex flex-col txt-medium"> <div className="w-full bg-white flex flex-col txt-medium gap-y-2">
<Form {...form}> <Form {...form}>
<form <form
onSubmit={form.handleSubmit((data) => onSubmit(data))} onSubmit={form.handleSubmit((data) => onSubmit(data))}
@@ -78,18 +78,35 @@ export default function AnalysisLocation({ cart, analysisPackages }: { cart: Sto
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectGroup> {Object.entries(partnerLocations
<SelectLabel>{t('cart:locations.locationSelect')}</SelectLabel> .reduce((acc, curr) => ({
...acc,
{MOCK_LOCATIONS.map((location) => ( [curr.city]: [...((acc[curr.city] as typeof partnerLocations) ?? []), curr],
<SelectItem key={location.id} value={location.id}>{location.name}</SelectItem> }), {} as Record<string, typeof partnerLocations>))
.map(([city, locations]) => (
<SelectGroup key={city}>
<SelectLabel>{city}</SelectLabel>
{locations.map((location) => (
<SelectItem key={location.name} value={location.name}>{location.name}</SelectItem>
))}
</SelectGroup>
))} ))}
</SelectGroup>
</SelectContent> </SelectContent>
</Select> </Select>
</form> </form>
</Form> </Form>
{selectedLocation && (
<div className="flex flex-col gap-y-2 mb-4">
<p className="text-sm">
{selectedLocation.address}
</p>
<p className="text-sm">
{selectedLocation.hours}
</p>
</div>
)}
<p className="text-sm text-muted-foreground"> <p className="text-sm text-muted-foreground">
<Trans i18nKey={'cart:locations.description'} /> <Trans i18nKey={'cart:locations.description'} />
</p> </p>

View File

@@ -0,0 +1,122 @@
[
{
"name": "SYNLAB Eesti Veerenni verevõtupunkt",
"address": "Veerenni 53a, VI korrus Tel: 17123",
"hours": "Verevõtt E-R 7.30-15.30 ja L 8.00-16.00 (lõunapaus 13.00-13.30)",
"city": "Tallinn"
},
{
"name": "SYNLAB Eesti kesklinna verevõtupunkt",
"address": "Pärnu mnt 15 (Kawe Plaza), I korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-16.00 (lõunapaus 12.00-12.30)",
"city": "Tallinn"
},
{
"name": "SYNLAB Eesti Lasnamäe verevõtupunkt",
"address": "Linnamäe tee 3 (Lasnamäe Tervisemaja), II korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-16.00 (lõunapaus 12.00-12.30)",
"city": "Tallinn"
},
{
"name": "SYNLAB Eesti Ülemiste verevõtupunkt",
"address": "Valukoja 7 (Ülemiste Tervisemaja), II korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-16.00 (lõunapaus 12.00-12.30)",
"city": "Tallinn"
},
{
"name": "SYNLAB Eesti Sepapaja verevõtupunkt",
"address": "Sepapaja 12/1 (Ülemiste Tervisemaja 2, Karl Ernst von Baeri maja), III korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-16.00 (lõunapaus 12.30-13.00)",
"city": "Tallinn"
},
{
"name": "SYNLAB Eesti Viimsi verevõtupunkt",
"address": "Ravi tee 4 (Viimsi Fertilitas) Tel: 17123",
"hours": "Verevõtt tööpäeviti 7.30-15.30 (lõunapaus 12.30-13.00)",
"city": "Viimsi"
},
{
"name": "SYNLAB Eesti Maardu verevõtupunkt",
"address": "Kallasmaa 4 (Maardu Tervisekeskus) Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-15.00 (lõunapaus 12.00-12.30)",
"city": "Maardu"
},
{
"name": "SYNLAB Eesti Tartu kliiniline labor",
"address": "Raatuse 21, II korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-16.30",
"city": "Tartu"
},
{
"name": "SYNLAB Eesti Tasku verevõtupunkt",
"address": "Turu 2, IV korrus (Tasku Meditsiinikeskus) Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-15.30",
"city": "Tartu"
},
{
"name": "SYNLAB Eesti Tartu Tervisekeskuse verevõtupunkt",
"address": "Mõisavahe 34b, I korrus Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-15.00 (lõunapaus 12:30-13:00)",
"city": "Tartu"
},
{
"name": "SYNLAB Eesti Pärnu Tervis SPA verevõtupunkt",
"address": "Seedri 6 (Tervis SPA), kabinet 202 Tel: 17123",
"hours": "Verevõtt tööpäeviti E-N 8.00-15.00 R 8.00-13.00",
"city": "Pärnu"
},
{
"name": "SYNLAB Eesti Suur-Sepa verevõtupunkt",
"address": "Suur-Sepa 14, kabinet 102 Tel: 17123",
"hours": "Verevõtt tööpäeviti E-N 8.00-16.00 (lõunapaus 12.30-13.00) ja R 8.00-14.00 (lõunapaus 12.30-13.00)",
"city": "Pärnu"
},
{
"name": "SYNLAB Eesti Narva verevõtupunkt",
"address": "Fama 10/2, kabinet 14 Tel: 17123",
"hours": "Verevõtt tööpäeviti 7.30-12.00",
"city": "Narva"
},
{
"name": "SYNLAB Eesti Sillamäe verevõtupunkt",
"address": "Kajaka 9, IV korrus, kabinet 404 Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-11.30",
"city": "Sillamäe"
},
{
"name": "SYNLAB Eesti Jõhvi verevõtupunkt",
"address": "Jaama 34, I korrus, kabinet 15 Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-13.00",
"city": "Jõhvi"
},
{
"name": "SYNLAB Eesti Viljandi verevõtupunkt",
"address": "Tallinna 19, II korrus, kabinet 210 Tel: 17123",
"hours": "Verevõtt tööpäeviti E-N 8.00-15.00 ja R 8.00-12.00",
"city": "Viljandi"
},
{
"name": "SYNLAB Eesti Võru labor",
"address": "Tartu tn 9 Tel: 17123",
"hours": "Verevõtt tööpäeviti E-N 8.00-15.30 R 8.00-13.00",
"city": "Võru"
},
{
"name": "SYNLAB Eesti Elva labor",
"address": "Supelranna 21, kabinet 133 Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-14.00",
"city": "Elva"
},
{
"name": "SYNLAB Eesti Põltsamaa labor",
"address": "Lossi 49 Tel: 17123",
"hours": "Verevõtt tööpäeviti E-N 8.00-15.00 (lõunapaus 12:00-12:30) ja R 8.00-12.00",
"city": "Põltsamaa"
},
{
"name": "SYNLAB Eesti Otepää labor",
"address": "Tartu mnt 2 Tel: 17123",
"hours": "Verevõtt tööpäeviti 8.00-12.00",
"city": "Otepää"
}
]