@gftdcojp/weblate-nextjs-sdk
Version:
A Next.js SDK for integrating with Weblate translation management system
80 lines (79 loc) • 2.66 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useTranslation = useTranslation;
exports.useT = useT;
exports.useUpdateTranslation = useUpdateTranslation;
const react_1 = require("react");
const swr_1 = __importDefault(require("swr"));
function useTranslation({ componentSlug, languageCode, client, }) {
const [translations, setTranslations] = (0, react_1.useState)({});
const { data: units, error, isLoading, mutate, } = (0, swr_1.default)(`translations/${componentSlug}/${languageCode}/units`, async () => {
const translation = await client.getTranslation(componentSlug, languageCode);
return client.getUnits(translation.id);
}, {
revalidateOnFocus: false,
revalidateOnReconnect: false,
});
(0, react_1.useEffect)(() => {
if (units) {
const translationMap = units.reduce((acc, unit) => {
acc[unit.source] = unit.target || unit.source;
return acc;
}, {});
setTranslations(translationMap);
}
}, [units]);
const translationError = error
? {
error: 'Translation Error',
message: error.message,
code: error.code,
}
: null;
return {
translations,
isLoading,
error: translationError,
mutate,
};
}
// Hook for getting a single translation
function useT(key, defaultValue, options) {
const { translations } = options
? useTranslation(options)
: { translations: {} };
return translations[key] || defaultValue || key;
}
// Hook for updating translations
function useUpdateTranslation(client) {
const [isUpdating, setIsUpdating] = (0, react_1.useState)(false);
const [error, setError] = (0, react_1.useState)(null);
const updateTranslation = (0, react_1.useCallback)(async (unitId, target) => {
setIsUpdating(true);
setError(null);
try {
const updatedUnit = await client.updateUnit(unitId, target);
return updatedUnit;
}
catch (err) {
const translationError = {
error: 'Update Error',
message: err.message,
code: err.code,
};
setError(translationError);
throw translationError;
}
finally {
setIsUpdating(false);
}
}, [client]);
return {
updateTranslation,
isUpdating,
error,
};
}