Unofficial Dropbox API for Elm.
https://avh4.github.io/elm-dropbox/
The Dropbox API uses OAuth 2.0 for authentication.
To authenticate the user, you will need to send them to the approrpiate authentication URL,
which can be done with Dropbox.authorize
.
But to create the authorization URL, you will need to provide the Navigation.Location
of the current page.
First, set up your Model
to store the current page's location:
elm-package install elm-lang/navigation
import Navigation
type alias Model =
{ ...
, location : Navigation.Location
}
initialModel : Navigation.Location -> Model
initialModel location =
{ ...
, location = location
}
Dropbox authentication requires a "client id", also called the "app key". can be found on the Dropbox Developers page for your app. Links: your Dropbox apps, create a new Dropbox app You will need to get the client id/app key of your existing app, or create a new app.
Now, you can create a Msg
that will initiate Dropbox login:
elm-package install avh4/elm-dropbox
import Dropbox
type Msg
= ...
| LogInToDropbox
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
...
LogInToDropbox ->
( model
, Dropbox.authorize
{ clientId = "MY_CLIENT_ID"
, state = Nothing
, requireRole = Nothing
, forceReapprove = False
, disableSignup = False
, locale = Nothing
, forceReauthentication = False
}
model.location
)
view : Model -> Html Msg
view model =
...
Html.button
[ Html.Events.onClick LogInToDropbox ]
[ Html.text "Log in with Dropbox" ]
When authentication completes, Dropbox will redirect to the current page,
providing the authentication details in the URL's fragment identifier .
You can use Dropbox.program
to automatically parse the redirect response
(it also will help you get the Navigation.Location
to store in your model).
import Dropbox
type Msg
= ...
| AuthResponse Dropbox.AuthorizeResult
main : Program Never Model (Dropbox.Msg Msg)
main =
Dropbox.program
{ init = \location -> ( initialModel location, Cmd.none )
, update = update
, subscriptions = subscriptions
, view = view
, onAuth = AuthResponse
}
You can now handle the auth response and take the resulting Dropbox.UserAuth
and use it to make API requests.
See the documentation for the full list of supported API calls.
Typically you will take the Dropbox.UserAuth
and store it in your model for later use.
You may also want to persist it in local storage so that it can be used on future visits to your app.
import Dropbox
type alias Model =
{ ...
, dropboxAuth : Maybe Dropbox.UserAuth
}
type Msg
= ...
| FetchFileResponse (Result Dropbox.DownloadError Dropbox.DownloadResponse)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
...
AuthResponse (Dropbox.AuthorizeOk auth) ->
( { model | dropboxAuth = Just auth.userAuth }
, Dropbox.download auth.userAuth
{ path : "/data_file_to_load.json" }
|> Task.attempt FetchFileResponse
)