@recruitnepal/shared-packages 1.8.8 → 1.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/JobCard/FallbackImage.d.ts +3 -1
- package/dist/components/JobCard/FallbackImage.d.ts.map +1 -1
- package/dist/components/JobCard/FallbackImage.js +12 -3
- package/dist/components/JobCard/JobCard.d.ts +3 -1
- package/dist/components/JobCard/JobCard.d.ts.map +1 -1
- package/dist/components/JobCard/JobCard.js +2 -2
- package/package.json +1 -1
|
@@ -6,7 +6,9 @@ type FallbackImageProps = {
|
|
|
6
6
|
className?: string;
|
|
7
7
|
fallbackText?: string;
|
|
8
8
|
fallbackClassName?: string;
|
|
9
|
+
/** When provided, relative src (no http/https or leading /) is resolved as imageBaseUrl + src. Required for API paths like "uploads/company/logo.png". */
|
|
10
|
+
imageBaseUrl?: string | null;
|
|
9
11
|
};
|
|
10
|
-
export declare function FallbackImage({ src, alt, width, height, className, fallbackText, fallbackClassName, }: FallbackImageProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function FallbackImage({ src, alt, width, height, className, fallbackText, fallbackClassName, imageBaseUrl, }: FallbackImageProps): import("react/jsx-runtime").JSX.Element;
|
|
11
13
|
export {};
|
|
12
14
|
//# sourceMappingURL=FallbackImage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FallbackImage.d.ts","sourceRoot":"","sources":["../../../src/components/JobCard/FallbackImage.tsx"],"names":[],"mappings":"AAKA,KAAK,kBAAkB,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"FallbackImage.d.ts","sourceRoot":"","sources":["../../../src/components/JobCard/FallbackImage.tsx"],"names":[],"mappings":"AAKA,KAAK,kBAAkB,GAAG;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0JAA0J;IAC1J,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAUF,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,GAAoB,EACpB,KAAU,EACV,MAAW,EACX,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,EAAE,kBAAkB,2CAkDpB"}
|
|
@@ -2,19 +2,28 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { cn } from '../../utils/cn';
|
|
5
|
-
|
|
5
|
+
function resolveSrc(src, imageBaseUrl) {
|
|
6
|
+
if (src.startsWith('http') || src.startsWith('/'))
|
|
7
|
+
return src;
|
|
8
|
+
if (!imageBaseUrl?.trim())
|
|
9
|
+
return src;
|
|
10
|
+
const base = imageBaseUrl.replace(/\/+$/, '');
|
|
11
|
+
const path = src.replace(/^\//, '');
|
|
12
|
+
return path ? `${base}/${path}` : base;
|
|
13
|
+
}
|
|
14
|
+
export function FallbackImage({ src, alt = 'Company Logo', width = 62, height = 62, className, fallbackText, fallbackClassName, imageBaseUrl, }) {
|
|
6
15
|
const [hasError, setHasError] = useState(false);
|
|
7
16
|
useEffect(() => {
|
|
8
17
|
setHasError(false);
|
|
9
18
|
}, [src]);
|
|
10
|
-
const resolvedSrc = hasError || !src ? null : src;
|
|
19
|
+
const resolvedSrc = hasError || !src ? null : resolveSrc(src, imageBaseUrl);
|
|
11
20
|
const isLeadingCompany = typeof src === 'string' && src.includes('leading-company');
|
|
12
21
|
const char = isLeadingCompany ? '?' : (fallbackText?.charAt(0)?.toUpperCase() || '?');
|
|
13
22
|
if (!resolvedSrc) {
|
|
14
23
|
return (_jsx("div", { className: cn('flex items-center justify-center font-bold bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 text-white', fallbackClassName, className), style: { width, height }, children: _jsx("span", { className: "select-none", children: char }) }));
|
|
15
24
|
}
|
|
16
25
|
if (isLeadingCompany && resolvedSrc) {
|
|
17
|
-
return (_jsx("img", { src:
|
|
26
|
+
return (_jsx("img", { src: resolvedSrc, alt: alt, width: width, height: height, className: cn('object-cover', className), onError: () => setHasError(true) }));
|
|
18
27
|
}
|
|
19
28
|
return (_jsx("img", { src: resolvedSrc, alt: alt, width: width, height: height, className: cn('w-full h-full object-contain max-w-full max-h-full', className), onError: () => setHasError(true) }));
|
|
20
29
|
}
|
|
@@ -8,6 +8,8 @@ export type JobCardProps = {
|
|
|
8
8
|
disableHover?: boolean;
|
|
9
9
|
logoClassName?: string;
|
|
10
10
|
logoWrapperClassName?: string;
|
|
11
|
+
/** Base URL for company logo when jobDetails.companyLogo is a relative path (e.g. from API). Pass e.g. env.IMAGE_BASE_URL so logos resolve correctly. */
|
|
12
|
+
imageBaseUrl?: string | null;
|
|
11
13
|
};
|
|
12
|
-
export declare function JobCard({ jobDetails, className, onClick, showDetails, hideSkills, disableHover, logoClassName, logoWrapperClassName, }: JobCardProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function JobCard({ jobDetails, className, onClick, showDetails, hideSkills, disableHover, logoClassName, logoWrapperClassName, imageBaseUrl, }: JobCardProps): import("react/jsx-runtime").JSX.Element;
|
|
13
15
|
//# sourceMappingURL=JobCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobCard.d.ts","sourceRoot":"","sources":["../../../src/components/JobCard/JobCard.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"JobCard.d.ts","sourceRoot":"","sources":["../../../src/components/JobCard/JobCard.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yJAAyJ;IACzJ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAkB,EAClB,UAAkB,EAClB,YAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,YAAY,GACb,EAAE,YAAY,2CAgGd"}
|
|
@@ -8,7 +8,7 @@ import { formatEmploymentTypes } from '../../utils/formatEmploymentType';
|
|
|
8
8
|
import { capitalize } from '../../utils/capitalize';
|
|
9
9
|
import { FallbackImage } from './FallbackImage';
|
|
10
10
|
import { Badge } from '../ui/Badge';
|
|
11
|
-
export function JobCard({ jobDetails, className, onClick, showDetails = true, hideSkills = false, disableHover = false, logoClassName, logoWrapperClassName, }) {
|
|
11
|
+
export function JobCard({ jobDetails, className, onClick, showDetails = true, hideSkills = false, disableHover = false, logoClassName, logoWrapperClassName, imageBaseUrl, }) {
|
|
12
12
|
const jobTypeRef = useRef(jobDetails.jobType);
|
|
13
13
|
if (jobTypeRef.current !== jobDetails.jobType) {
|
|
14
14
|
jobTypeRef.current = jobDetails.jobType;
|
|
@@ -23,5 +23,5 @@ export function JobCard({ jobDetails, className, onClick, showDetails = true, hi
|
|
|
23
23
|
: jobDetails.jobType
|
|
24
24
|
? [jobDetails.jobType]
|
|
25
25
|
: [];
|
|
26
|
-
return (_jsxs("div", { className: cn('rounded-xl sm:rounded-3xl cursor-pointer', !disableHover && 'hover:shadow-md', className), onClick: onClick, children: [_jsxs("div", { className: "flex gap-2 items-center", children: [_jsx("div", { className: cn('w-14 h-14 border bg-white rounded-xl overflow-hidden flex items-center justify-center shrink-0', logoWrapperClassName), children: _jsx(FallbackImage, { src: jobDetails.companyLogo || null, alt: "Company Logo", width: 62, height: 62, className: cn('w-full h-full object-contain max-w-full max-h-full', logoClassName), fallbackText: jobDetails.hideCompanyName ? undefined : jobDetails.companyName?.charAt(0)?.toUpperCase(), fallbackClassName: "w-full h-full rounded-xl text-xl" }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-md font-semibold text-text-primary", children: jobDetails.jobTitle }), _jsx("p", { className: "text-sm text-text-secondary", children: jobDetails.companyName })] })] }), showDetails && (_jsxs("div", { className: "mt-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary mb-2", children: [jobDetails.location && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(MapPin, { size: 14, className: "min-w-[14px]" }), capitalize(jobDetails.location)] })), normalizedJobTypeArray.length > 0 && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(BriefcaseBusiness, { size: 14, className: "min-w-[14px]" }), formatEmploymentTypes(normalizedJobTypeArray)] })), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Banknote, { size: 14, className: "min-w-[14px]" }), capitalize(salaryText)] })] }), !hideSkills && jobDetails.skills && jobDetails.skills.length > 0 && (_jsx("div", { className: "flex items-center gap-3 flex-wrap mb-1", children: jobDetails.skills.slice(0, 3).map((skill, index) => (_jsx(Badge, { className: "py-1 px-3 text-xs bg-secondary border border-black/10 shrink-0", children: skill }, index))) }))] }))] }));
|
|
26
|
+
return (_jsxs("div", { className: cn('rounded-xl sm:rounded-3xl cursor-pointer', !disableHover && 'hover:shadow-md', className), onClick: onClick, children: [_jsxs("div", { className: "flex gap-2 items-center", children: [_jsx("div", { className: cn('w-14 h-14 border bg-white rounded-xl overflow-hidden flex items-center justify-center shrink-0', logoWrapperClassName), children: _jsx(FallbackImage, { src: jobDetails.companyLogo || null, alt: "Company Logo", width: 62, height: 62, className: cn('w-full h-full object-contain max-w-full max-h-full', logoClassName), fallbackText: jobDetails.hideCompanyName ? undefined : jobDetails.companyName?.charAt(0)?.toUpperCase(), fallbackClassName: "w-full h-full rounded-xl text-xl", imageBaseUrl: imageBaseUrl }) }), _jsxs("div", { children: [_jsx("h2", { className: "text-md font-semibold text-text-primary", children: jobDetails.jobTitle }), _jsx("p", { className: "text-sm text-text-secondary", children: jobDetails.companyName })] })] }), showDetails && (_jsxs("div", { className: "mt-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary mb-2", children: [jobDetails.location && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(MapPin, { size: 14, className: "min-w-[14px]" }), capitalize(jobDetails.location)] })), normalizedJobTypeArray.length > 0 && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(BriefcaseBusiness, { size: 14, className: "min-w-[14px]" }), formatEmploymentTypes(normalizedJobTypeArray)] })), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Banknote, { size: 14, className: "min-w-[14px]" }), capitalize(salaryText)] })] }), !hideSkills && jobDetails.skills && jobDetails.skills.length > 0 && (_jsx("div", { className: "flex items-center gap-3 flex-wrap mb-1", children: jobDetails.skills.slice(0, 3).map((skill, index) => (_jsx(Badge, { className: "py-1 px-3 text-xs bg-secondary border border-black/10 shrink-0", children: skill }, index))) }))] }))] }));
|
|
27
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recruitnepal/shared-packages",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.9",
|
|
4
4
|
"description": "Shared hooks, API client, types and utils for Recruit Nepal (CV builder UI and preprocess stay in each repo)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|