import React, { useState, useEffect } from 'react' const ActionPerformer = ({ actionHook, LoadingButton, SuccessButton, ErrorButton, errorCallback, completeCallback }) => { // Call our useFetch() hook to start performing our action (i.e. importing a template) const { loading, data, error } = actionHook() // Check if we've successfully completed out action: if (!loading && !error) { // We've successfully imported the template, bubble up a success call after a short timeout // so we can show an "imported" state on the button briefly: setTimeout(() => { completeCallback(data) }, 500) return SuccessButton } // Check if we had an error performing the action: if (error) { setTimeout(() => { errorCallback(data) }, 100) return ErrorButton } // The default state of this component is loading, so we show that loading button here.. return LoadingButton } /** * Generic user action provider. * Used for things like "Import Template" and "Import Photo" buttons * * @param DefaultButton * @param CompletedButton * @param ProcessingButton * @param isAlreadyCompleted * @param completedCallback * @param actionConfirmationMessage * * @returns {*} * @constructor */ const ButtonActionProvider = ({ DefaultButton, CompletedButton, LoadingButton, ErrorButton, SuccessButton, actionHook, isAlreadyCompleted = false, completedCallback = null, errorCallback = null, actionConfirmationMessage = null }) => { const [isProcessing, setIsProcessing] = useState(false) const [isCompleted, setIsCompleted] = useState(isAlreadyCompleted) const [error, setError] = useState(null) useEffect(() => { if (isCompleted && completedCallback && !isAlreadyCompleted) { // We fire off an optional completed callback, if the component didn't start in the completed state. completedCallback(isCompleted) } }, [isCompleted]) useEffect(() => { if (error && errorCallback) { // We fire off an optional error callback, with the error data set below errorCallback(error) } }, [error]) useEffect(() => { // If our parent component resets our completed status prop, we update our local state to reflect this: setIsCompleted(isAlreadyCompleted) }, [isAlreadyCompleted]) // Check if this action has been completed: if (isCompleted) { return CompletedButton } // Check if we're currently performing the action: if (isProcessing) { // As soon as this "Processing" component renders we expect the ajax action to start running. // We provide a "completeCallback" that this "Processing" component can call once it's done it's thing. return ( { // If our action returns an error, we swap back to our default state so the user can try again setTimeout(() => { setIsProcessing(false) }, 500) setError(data) }} completeCallback={(data) => { setIsProcessing(false) setIsCompleted(data) }} /> ) } // Default state is not processing/completed, so we show a default button return React.cloneElement(DefaultButton, { onClick: (event) => { if (actionConfirmationMessage) { if (!confirm(actionConfirmationMessage)) { // user has denied the confirmation dialog, prevent calling our processing action. event.preventDefault() return false } } setIsProcessing(true) } }) } export default ButtonActionProvider INÍCIO - TranslationSUB
TranslationSUB

Nossos Serviços

Idiomas

INGLÊS
JAPONÊS
PORTUGUÊS

Como Funciona?

PASSO

Contact Us

FALE CONOSCO

Alguma pergunta? Estamos à disposição para esclarecer qualquer dúvida.

PASSO

Get a Quote

REQUERER ORÇAMENTO

Preencha o formulário e o nosso time retornará o contato dentro de 24 horas com um orçamento personalizado.

PASSO

Confirm Order

CONFIRMAR PEDIDO

Caso você concorde com o valor e data de entrega propostos, realize o pedido via e-mail.

PASSO

Payment

PAGAMENTO

Formas de pagamento: transferência/depósito bancário, cartão de crédito/débito, PayPal, Wise.

※A depender do país, as formas de pagamento podem ser limitadas.

PASSO

Work

PRODUÇÃO

Nosso time dará início aos trabalhos no seu projeto.

PASSO

ENTREGA

Entregaremos o seu pedido via e-mail (arquivo baixável).

PASSO

Contact Us

FALE CONOSCO

Alguma pergunta? Estamos à disposição para esclarecer qualquer dúvida.

PASSO

Get a Quote

REQUERER ORÇAMENTO

Preencha o formulário e o nosso time retornará o contato dentro de 24 horas com um orçamento personalizado.

PASSO

Confirm Order

CONFIRMAR PEDIDO

Caso você concorde com o valor e data de entrega propostos, realize o pedido via e-mail.

PASSO

Payment

PAGAMENTO

Formas de pagamento: transferência/depósito bancário, cartão de crédito/débito, PayPal, Wise.

※A depender do país, as formas de pagamento podem ser limitadas.

PASSO

Work

PRODUÇÃO

Nosso time dará início aos trabalhos no seu projeto.

PASSO

ENTREGA

Entregaremos o seu pedido via e-mail (arquivo baixável).

Nossos Preços

INGLÊS → JAPONÊS

A partir de
¥ 6,600
1 PÁGINA 【300 palavras】
INGLÊS → PORTUGUÊS

A partir de
¥ 10,500
1 PÁGINA【300 palavras】
JAPONÊS → INGLÊS

A partir de
¥ 8,400
1 PÁGINA 【400 caracteres】
JAPONÊS → PORTUGUÊS

A partir de
¥ 14,000
1 PÁGINA【400 caracteres】
PORTUGUÊS → INGLÊS

A partir de
¥ 9,600
1 PÁGINA【300 palavras】
PORTUGUÊS → JAPONÊS

A partir de
¥ 9,900
1 PÁGINA【300 palavras】

Avaliação dos Nossos Clientes

"I will definitely come back again!"

I needed flyers and a business card. Not only they wrote and designed everything, I also had everything delivered to my door. I’m a foreigner in Japan and didn’t even know from where to start. Super recommended!!

Karina’Services

Business owner

“Super recomendado”

Eu já precisei de traduções para algumas trocas de e-mail de trabalho, tradução para dar entrada em papéis pra visto e até revisão do meu TCC. Sempre respondem em tempo hábil e o tratamento ao cliente é impecável.

hajimeme.edit

Editor de vídeo

“いつもお世話になっています!”

字幕で視聴者を増やす作戦に!動画に英語、日本語、ポルトガル語の字幕をいつも作ってもらっています。個人からの依頼を受け付ける会社が中々珍しくて、トラサブさんを見つけて助かりました(笑)。いつも丁度な対応もしてもらって、おすすめです。

Gaijin Honne - Burahon Channel

YouTuber

Entre em contato para que possamos ajudá-lo a atrair mais pessoas para os seus produtos ou serviços através do nosso suporte multilíngue

Entre em contato para que possamos ajudá-lo a atrair mais pessoas para os seus produtos ou serviços através do nosso suporte multilíngue